cxx_except.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: cxx_except.cpp,v 11.17 2002/08/23 01:07:27 mjc Exp $";
  10. #endif /* not lint */
  11. #include <string.h>
  12. #include <errno.h>
  13. #include "db_cxx.h"
  14. #include "dbinc/cxx_int.h"
  15. // tmpString is used to create strings on the stack
  16. //
  17. class tmpString
  18. {
  19. public:
  20. tmpString(const char *str1,
  21.   const char *str2 = 0,
  22.   const char *str3 = 0,
  23.   const char *str4 = 0,
  24.   const char *str5 = 0);
  25. ~tmpString()                      { delete [] s_; }
  26. operator const char *()           { return (s_); }
  27. private:
  28. char *s_;
  29. };
  30. tmpString::tmpString(const char *str1,
  31.      const char *str2,
  32.      const char *str3,
  33.      const char *str4,
  34.      const char *str5)
  35. {
  36. size_t len = strlen(str1);
  37. if (str2)
  38. len += strlen(str2);
  39. if (str3)
  40. len += strlen(str3);
  41. if (str4)
  42. len += strlen(str4);
  43. if (str5)
  44. len += strlen(str5);
  45. s_ = new char[len+1];
  46. strcpy(s_, str1);
  47. if (str2)
  48. strcat(s_, str2);
  49. if (str3)
  50. strcat(s_, str3);
  51. if (str4)
  52. strcat(s_, str4);
  53. if (str5)
  54. strcat(s_, str5);
  55. }
  56. // Note: would not be needed if we can inherit from exception
  57. // It does not appear to be possible to inherit from exception
  58. // with the current Microsoft library (VC5.0).
  59. //
  60. static char *dupString(const char *s)
  61. {
  62. char *r = new char[strlen(s)+1];
  63. strcpy(r, s);
  64. return (r);
  65. }
  66. ////////////////////////////////////////////////////////////////////////
  67. //                                                                    //
  68. //                            DbException                             //
  69. //                                                                    //
  70. ////////////////////////////////////////////////////////////////////////
  71. DbException::~DbException()
  72. {
  73. if (what_)
  74. delete [] what_;
  75. }
  76. DbException::DbException(int err)
  77. : err_(err)
  78. {
  79. what_ = dupString(db_strerror(err));
  80. }
  81. DbException::DbException(const char *description)
  82. : err_(0)
  83. {
  84. what_ = dupString(tmpString(description));
  85. }
  86. DbException::DbException(const char *prefix, int err)
  87. : err_(err)
  88. {
  89. what_ = dupString(tmpString(prefix, ": ", db_strerror(err)));
  90. }
  91. DbException::DbException(const char *prefix1, const char *prefix2, int err)
  92. : err_(err)
  93. {
  94. what_ = dupString(tmpString(prefix1, ": ", prefix2, ": ",
  95.     db_strerror(err)));
  96. }
  97. DbException::DbException(const DbException &that)
  98. : err_(that.err_)
  99. {
  100. what_ = dupString(that.what_);
  101. }
  102. DbException &DbException::operator = (const DbException &that)
  103. {
  104. if (this != &that) {
  105. err_ = that.err_;
  106. if (what_)
  107. delete [] what_;
  108. what_ = 0;           // in case new throws exception
  109. what_ = dupString(that.what_);
  110. }
  111. return (*this);
  112. }
  113. int DbException::get_errno() const
  114. {
  115. return (err_);
  116. }
  117. const char *DbException::what() const
  118. {
  119. return (what_);
  120. }
  121. ////////////////////////////////////////////////////////////////////////
  122. //                                                                    //
  123. //                            DbMemoryException                       //
  124. //                                                                    //
  125. ////////////////////////////////////////////////////////////////////////
  126. static const char *memory_err_desc = "Dbt not large enough for available data";
  127. DbMemoryException::~DbMemoryException()
  128. {
  129. }
  130. DbMemoryException::DbMemoryException(Dbt *dbt)
  131. : DbException(memory_err_desc, ENOMEM)
  132. , dbt_(dbt)
  133. {
  134. }
  135. DbMemoryException::DbMemoryException(const char *description)
  136. : DbException(description, ENOMEM)
  137. , dbt_(0)
  138. {
  139. }
  140. DbMemoryException::DbMemoryException(const char *prefix, Dbt *dbt)
  141. : DbException(prefix, memory_err_desc, ENOMEM)
  142. , dbt_(dbt)
  143. {
  144. }
  145. DbMemoryException::DbMemoryException(const char *prefix1, const char *prefix2,
  146.     Dbt *dbt)
  147. : DbException(prefix1, prefix2, ENOMEM)
  148. , dbt_(dbt)
  149. {
  150. }
  151. DbMemoryException::DbMemoryException(const DbMemoryException &that)
  152. : DbException(that)
  153. , dbt_(that.dbt_)
  154. {
  155. }
  156. DbMemoryException
  157. &DbMemoryException::operator =(const DbMemoryException &that)
  158. {
  159. if (this != &that) {
  160. DbException::operator=(that);
  161. dbt_ = that.dbt_;
  162. }
  163. return (*this);
  164. }
  165. Dbt *DbMemoryException::get_dbt() const
  166. {
  167. return (dbt_);
  168. }
  169. ////////////////////////////////////////////////////////////////////////
  170. //                                                                    //
  171. //                            DbDeadlockException                     //
  172. //                                                                    //
  173. ////////////////////////////////////////////////////////////////////////
  174. DbDeadlockException::~DbDeadlockException()
  175. {
  176. }
  177. DbDeadlockException::DbDeadlockException(const char *description)
  178. : DbException(description, DB_LOCK_DEADLOCK)
  179. {
  180. }
  181. DbDeadlockException::DbDeadlockException(const DbDeadlockException &that)
  182. : DbException(that)
  183. {
  184. }
  185. DbDeadlockException
  186. &DbDeadlockException::operator =(const DbDeadlockException &that)
  187. {
  188. if (this != &that)
  189. DbException::operator=(that);
  190. return (*this);
  191. }
  192. ////////////////////////////////////////////////////////////////////////
  193. //                                                                    //
  194. //                            DbLockNotGrantedException               //
  195. //                                                                    //
  196. ////////////////////////////////////////////////////////////////////////
  197. DbLockNotGrantedException::~DbLockNotGrantedException()
  198. {
  199. delete lock_;
  200. }
  201. DbLockNotGrantedException::DbLockNotGrantedException(const char *prefix,
  202.     db_lockop_t op, db_lockmode_t mode, const Dbt *obj, const DbLock lock,
  203.     int index)
  204. : DbException(prefix, DbEnv::strerror(DB_LOCK_NOTGRANTED),
  205.     DB_LOCK_NOTGRANTED)
  206. , op_(op)
  207. , mode_(mode)
  208. , obj_(obj)
  209. , index_(index)
  210. {
  211. lock_ = new DbLock(lock);
  212. }
  213. DbLockNotGrantedException::DbLockNotGrantedException
  214.     (const DbLockNotGrantedException &that)
  215. : DbException(that)
  216. {
  217. op_ = that.op_;
  218. mode_ = that.mode_;
  219. obj_ = that.obj_;
  220. lock_ = new DbLock(*that.lock_);
  221. index_ = that.index_;
  222. }
  223. DbLockNotGrantedException
  224. &DbLockNotGrantedException::operator =(const DbLockNotGrantedException &that)
  225. {
  226. if (this != &that) {
  227. DbException::operator=(that);
  228. op_ = that.op_;
  229. mode_ = that.mode_;
  230. obj_ = that.obj_;
  231. lock_ = new DbLock(*that.lock_);
  232. index_ = that.index_;
  233. }
  234. return (*this);
  235. }
  236. db_lockop_t DbLockNotGrantedException::get_op() const
  237. {
  238. return op_;
  239. }
  240. db_lockmode_t DbLockNotGrantedException::get_mode() const
  241. {
  242. return mode_;
  243. }
  244. const Dbt* DbLockNotGrantedException::get_obj() const
  245. {
  246. return obj_;
  247. }
  248. DbLock* DbLockNotGrantedException::get_lock() const
  249. {
  250. return lock_;
  251. }
  252. int DbLockNotGrantedException::get_index() const
  253. {
  254. return index_;
  255. }
  256. ////////////////////////////////////////////////////////////////////////
  257. //                                                                    //
  258. //                            DbRunRecoveryException                  //
  259. //                                                                    //
  260. ////////////////////////////////////////////////////////////////////////
  261. DbRunRecoveryException::~DbRunRecoveryException()
  262. {
  263. }
  264. DbRunRecoveryException::DbRunRecoveryException(const char *description)
  265. : DbException(description, DB_RUNRECOVERY)
  266. {
  267. }
  268. DbRunRecoveryException::DbRunRecoveryException
  269.     (const DbRunRecoveryException &that)
  270. : DbException(that)
  271. {
  272. }
  273. DbRunRecoveryException
  274. &DbRunRecoveryException::operator =(const DbRunRecoveryException &that)
  275. {
  276. if (this != &that)
  277. DbException::operator=(that);
  278. return (*this);
  279. }