db_cxx.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:19k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  *
  7.  * $Id: db_cxx.h,v 11.44 2000/12/21 20:30:18 dda Exp $
  8.  */
  9. #ifndef _DB_CXX_H_
  10. #define _DB_CXX_H_
  11. //
  12. // C++ assumptions:
  13. //
  14. // To ensure portability to many platforms, both new and old, we make
  15. // few assumptions about the C++ compiler and library.  For example,
  16. // we do not expect STL, templates or namespaces to be available.  The
  17. // "newest" C++ feature used is exceptions, which are used liberally
  18. // to transmit error information.  Even the use of exceptions can be
  19. // disabled at runtime, to do so, use the DB_CXX_NO_EXCEPTIONS flags
  20. // with the DbEnv or Db constructor.
  21. //
  22. // C++ naming conventions:
  23. //
  24. //  - All top level class names start with Db.
  25. //  - All class members start with lower case letter.
  26. //  - All private data members are suffixed with underscore.
  27. //  - Use underscores to divide names into multiple words.
  28. //  - Simple data accessors are named with get_ or set_ prefix.
  29. //  - All method names are taken from names of functions in the C
  30. //    layer of db (usually by dropping a prefix like "db_").
  31. //    These methods have the same argument types and order,
  32. //    other than dropping the explicit arg that acts as "this".
  33. //
  34. // As a rule, each DbFoo object has exactly one underlying DB_FOO struct
  35. // (defined in db.h) associated with it.  In some cases, we inherit directly
  36. // from the DB_FOO structure to make this relationship explicit.  Often,
  37. // the underlying C layer allocates and deallocates these structures, so
  38. // there is no easy way to add any data to the DbFoo class.  When you see
  39. // a comment about whether data is permitted to be added, this is what
  40. // is going on.  Of course, if we need to add data to such C++ classes
  41. // in the future, we will arrange to have an indirect pointer to the
  42. // DB_FOO struct (as some of the classes already have).
  43. //
  44. ////////////////////////////////////////////////////////////////
  45. ////////////////////////////////////////////////////////////////
  46. //
  47. // Forward declarations
  48. //
  49. #include <iostream.h>
  50. #include <stdarg.h>
  51. #include "db.h"
  52. class Db;                                        // forward
  53. class Dbc;                                       // forward
  54. class DbEnv;                                     // forward
  55. class DbException;                               // forward
  56. class DbInfo;                                    // forward
  57. class DbLock;                                    // forward
  58. class DbLsn;                                     // forward
  59. class DbMpoolFile;                               // forward
  60. class Dbt;                                       // forward
  61. class DbTxn;                                     // forward
  62. // These classes are not defined here and should be invisible
  63. // to the user, but some compilers require forward references.
  64. // There is one for each use of the DEFINE_DB_CLASS macro.
  65. class DbImp;
  66. class DbEnvImp;
  67. class DbMpoolFileImp;
  68. class DbTxnImp;
  69. ////////////////////////////////////////////////////////////////
  70. ////////////////////////////////////////////////////////////////
  71. //
  72. // Mechanisms for declaring classes
  73. //
  74. //
  75. // Every class defined in this file has an _exported next to the class name.
  76. // This is needed for WinTel machines so that the class methods can
  77. // be exported or imported in a DLL as appropriate.  Users of the DLL
  78. // use the define DB_USE_DLL.  When the DLL is built, DB_CREATE_DLL
  79. // must be defined.
  80. //
  81. #if defined(_MSC_VER)
  82. #  if defined(DB_CREATE_DLL)
  83. #    define _exported __declspec(dllexport)      // creator of dll
  84. #  elif defined(DB_USE_DLL)
  85. #    define _exported __declspec(dllimport)      // user of dll
  86. #  else
  87. #    define _exported                            // static lib creator or user
  88. #  endif
  89. #else
  90. #  define _exported
  91. #endif
  92. // DEFINE_DB_CLASS defines an imp_ data member and imp() accessor.
  93. // The underlying type is a pointer to an opaque *Imp class, that
  94. // gets converted to the correct implementation class by the implementation.
  95. //
  96. // Since these defines use "private/public" labels, and leave the access
  97. // being "private", we always use these by convention before any data
  98. // members in the private section of a class.  Keeping them in the
  99. // private section also emphasizes that they are off limits to user code.
  100. //
  101. #define DEFINE_DB_CLASS(name) 
  102. public: class name##Imp* imp() { return (imp_); } 
  103. public: const class name##Imp* constimp() const { return (imp_); } 
  104. private: class name##Imp* imp_
  105. ////////////////////////////////////////////////////////////////
  106. ////////////////////////////////////////////////////////////////
  107. //
  108. // Turn off inappropriate compiler warnings
  109. //
  110. #ifdef _MSC_VER
  111. // These are level 4 warnings that are explicitly disabled.
  112. // With Visual C++, by default you do not see above level 3 unless
  113. // you use /W4.  But we like to compile with the highest level
  114. // warnings to catch other errors.
  115. //
  116. // 4201: nameless struct/union
  117. //       triggered by standard include file <winnt.h>
  118. //
  119. // 4514: unreferenced inline function has been removed
  120. //       certain include files in MSVC define methods that are not called
  121. //
  122. #pragma warning(disable: 4201 4514)
  123. #endif
  124. // Some interfaces can be customized by allowing users
  125. // to define callback functions.  For performance and
  126. // logistical reasons, some callbacks require you do
  127. // declare the functions in C, or in an extern "C" block.
  128. //
  129. extern "C" {
  130. typedef void * (*db_malloc_fcn_type)
  131. (size_t);
  132. typedef void * (*db_realloc_fcn_type)
  133. (void *, size_t);
  134. typedef int (*bt_compare_fcn_type)
  135. (DB *, const DBT *, const DBT *);
  136. typedef size_t (*bt_prefix_fcn_type)
  137. (DB *, const DBT *, const DBT *);
  138. typedef int (*dup_compare_fcn_type)
  139. (DB *, const DBT *, const DBT *);
  140. typedef u_int32_t (*h_hash_fcn_type)
  141. (DB *, const void *, u_int32_t);
  142. typedef int (*pgin_fcn_type)(DB_ENV *dbenv,
  143.  db_pgno_t pgno, void *pgaddr, DBT *pgcookie);
  144. typedef int (*pgout_fcn_type)(DB_ENV *dbenv,
  145.  db_pgno_t pgno, void *pgaddr, DBT *pgcookie);
  146. };
  147. ////////////////////////////////////////////////////////////////
  148. ////////////////////////////////////////////////////////////////
  149. //
  150. // Exception classes
  151. //
  152. // Almost any error in the DB library throws a DbException.
  153. // Every exception should be considered an abnormality
  154. // (e.g. bug, misuse of DB, file system error).
  155. //
  156. // NOTE: We would like to inherit from class exception and
  157. //       let it handle what(), but there are
  158. //       MSVC++ problems when <exception> is included.
  159. //
  160. class _exported DbException
  161. {
  162. public:
  163. virtual ~DbException();
  164. DbException(int err);
  165. DbException(const char *description);
  166. DbException(const char *prefix, int err);
  167. DbException(const char *prefix1, const char *prefix2, int err);
  168. int get_errno() const;
  169. virtual const char *what() const;
  170. DbException(const DbException &);
  171. DbException &operator = (const DbException &);
  172. private:
  173. char *what_;
  174. int err_;                   // errno
  175. };
  176. ////////////////////////////////////////////////////////////////
  177. ////////////////////////////////////////////////////////////////
  178. //
  179. // Lock classes
  180. //
  181. class _exported DbLock
  182. {
  183. friend class DbEnv;
  184. public:
  185. DbLock();
  186. int put(DbEnv *env);
  187. DbLock(const DbLock &);
  188. DbLock &operator = (const DbLock &);
  189. protected:
  190. // We can add data to this class if needed
  191. // since its contained class is not allocated by db.
  192. // (see comment at top)
  193. DbLock(DB_LOCK);
  194. DB_LOCK lock_;
  195. };
  196. ////////////////////////////////////////////////////////////////
  197. ////////////////////////////////////////////////////////////////
  198. //
  199. // Log classes
  200. //
  201. class _exported DbLsn : protected DB_LSN
  202. {
  203. friend class DbEnv;          // friendship needed to cast to base class
  204. };
  205. ////////////////////////////////////////////////////////////////
  206. ////////////////////////////////////////////////////////////////
  207. //
  208. // Memory pool classes
  209. //
  210. class _exported DbMpoolFile
  211. {
  212. friend class DbEnv;
  213. public:
  214. int close();
  215. int get(db_pgno_t *pgnoaddr, u_int32_t flags, void *pagep);
  216. int put(void *pgaddr, u_int32_t flags);
  217. int set(void *pgaddr, u_int32_t flags);
  218. int sync();
  219. static int open(DbEnv *envp, const char *file,
  220. u_int32_t flags, int mode, size_t pagesize,
  221. DB_MPOOL_FINFO *finfop, DbMpoolFile **mpf);
  222. private:
  223. // We can add data to this class if needed
  224. // since it is implemented via a pointer.
  225. // (see comment at top)
  226. // Note: use DbMpoolFile::open()
  227. // to get pointers to a DbMpoolFile,
  228. // and call DbMpoolFile::close() rather than delete to release them.
  229. //
  230. DbMpoolFile();
  231. // Shut g++ up.
  232. protected:
  233. ~DbMpoolFile();
  234. private:
  235. // no copying
  236. DbMpoolFile(const DbMpoolFile &);
  237. void operator = (const DbMpoolFile &);
  238. DEFINE_DB_CLASS(DbMpoolFile);
  239. };
  240. ////////////////////////////////////////////////////////////////
  241. ////////////////////////////////////////////////////////////////
  242. //
  243. // Transaction classes
  244. //
  245. class _exported DbTxn
  246. {
  247. friend class DbEnv;
  248. public:
  249. int abort();
  250. int commit(u_int32_t flags);
  251. u_int32_t id();
  252. int prepare();
  253. private:
  254. // We can add data to this class if needed
  255. // since it is implemented via a pointer.
  256. // (see comment at top)
  257. // Note: use DbEnv::txn_begin() to get pointers to a DbTxn,
  258. // and call DbTxn::abort() or DbTxn::commit rather than
  259. // delete to release them.
  260. //
  261. DbTxn();
  262. ~DbTxn();
  263. // no copying
  264. DbTxn(const DbTxn &);
  265. void operator = (const DbTxn &);
  266. DEFINE_DB_CLASS(DbTxn);
  267. };
  268. //
  269. // Berkeley DB environment class.  Provides functions for opening databases.
  270. // User of this library can use this class as a starting point for
  271. // developing a DB application - derive their application class from
  272. // this one, add application control logic.
  273. //
  274. // Note that if you use the default constructor, you must explicitly
  275. // call appinit() before any other db activity (e.g. opening files)
  276. //
  277. class _exported DbEnv
  278. {
  279. friend class Db;
  280. friend class DbLock;
  281. friend class DbMpoolFile;
  282. public:
  283. ~DbEnv();
  284. // After using this constructor, you can set any needed
  285. // parameters for the environment using the set_* methods.
  286. // Then call open() to finish initializing the environment
  287. // and attaching it to underlying files.
  288. //
  289. DbEnv(u_int32_t flags);
  290. // These methods match those in the C interface.
  291. //
  292. int close(u_int32_t);
  293. void err(int, const char *, ...);
  294. void errx(const char *, ...);
  295. int open(const char *, u_int32_t, int);
  296. int remove(const char *, u_int32_t);
  297. int set_cachesize(u_int32_t, u_int32_t, int);
  298. int set_data_dir(const char *);
  299. void set_errcall(void (*)(const char *, char *));
  300. void set_errfile(FILE *);
  301. void set_errpfx(const char *);
  302. int set_flags(u_int32_t, int);
  303. int set_feedback(void (*)(DbEnv *, int, int));
  304. int set_recovery_init(int (*)(DbEnv *));
  305. int set_lg_bsize(u_int32_t);
  306. int set_lg_dir(const char *);
  307. int set_lg_max(u_int32_t);
  308. int set_lk_conflicts(u_int8_t *, int);
  309. int set_lk_detect(u_int32_t);
  310. int set_lk_max(u_int32_t);
  311. int set_lk_max_lockers(u_int32_t);
  312. int set_lk_max_locks(u_int32_t);
  313. int set_lk_max_objects(u_int32_t);
  314. int set_mp_mmapsize(size_t);
  315. int set_mutexlocks(int);
  316. static int set_pageyield(int);
  317. int set_paniccall(void (*)(DbEnv *, int));
  318. static int set_panicstate(int);
  319. static int set_region_init(int);
  320. int set_server(char *, long, long, u_int32_t);
  321. int set_shm_key(long);
  322. int set_tmp_dir(const char *);
  323. static int set_tas_spins(u_int32_t);
  324. int set_tx_max(u_int32_t);
  325. int set_tx_recover(int (*)(DbEnv *, Dbt *, DbLsn *, db_recops));
  326. int set_tx_timestamp(time_t *);
  327. int set_verbose(u_int32_t which, int onoff);
  328. // Version information.  A static method so it can be obtained anytime.
  329. //
  330. static char *version(int *major, int *minor, int *patch);
  331. // Convert DB errors to strings
  332. static char *strerror(int);
  333. // If an error is detected and the error call function
  334. // or stream is set, a message is dispatched or printed.
  335. // If a prefix is set, each message is prefixed.
  336. //
  337. // You can use set_errcall() or set_errfile() above to control
  338. // error functionality.  Alternatively, you can call
  339. // set_error_stream() to force all errors to a C++ stream.
  340. // It is unwise to mix these approaches.
  341. //
  342. void set_error_stream(ostream *);
  343. // used internally
  344. static void runtime_error(const char *caller, int err,
  345.   int error_policy);
  346. // Lock functions
  347. //
  348. int lock_detect(u_int32_t flags, u_int32_t atype, int *aborted);
  349. int lock_get(u_int32_t locker, u_int32_t flags, const Dbt *obj,
  350.      db_lockmode_t lock_mode, DbLock *lock);
  351. int lock_id(u_int32_t *idp);
  352. int lock_stat(DB_LOCK_STAT **statp, db_malloc_fcn_type db_malloc_fcn);
  353. int lock_vec(u_int32_t locker, u_int32_t flags, DB_LOCKREQ list[],
  354.      int nlist, DB_LOCKREQ **elistp);
  355. // Log functions
  356. //
  357. int log_archive(char **list[], u_int32_t flags, db_malloc_fcn_type db_malloc_fcn);
  358. static int log_compare(const DbLsn *lsn0, const DbLsn *lsn1);
  359. int log_file(DbLsn *lsn, char *namep, size_t len);
  360. int log_flush(const DbLsn *lsn);
  361. int log_get(DbLsn *lsn, Dbt *data, u_int32_t flags);
  362. int log_put(DbLsn *lsn, const Dbt *data, u_int32_t flags);
  363. int log_register(Db *dbp, const char *name);
  364. int log_stat(DB_LOG_STAT **spp, db_malloc_fcn_type db_malloc_fcn);
  365. int log_unregister(Db *dbp);
  366. // Mpool functions
  367. //
  368. int memp_register(int ftype,
  369.   pgin_fcn_type pgin_fcn,
  370.   pgout_fcn_type pgout_fcn);
  371. int memp_stat(DB_MPOOL_STAT **gsp, DB_MPOOL_FSTAT ***fsp,
  372.       db_malloc_fcn_type db_malloc_fcn);
  373. int memp_sync(DbLsn *lsn);
  374. int memp_trickle(int pct, int *nwrotep);
  375. // Transaction functions
  376. //
  377. int txn_begin(DbTxn *pid, DbTxn **tid, u_int32_t flags);
  378. int txn_checkpoint(u_int32_t kbyte, u_int32_t min, u_int32_t flags);
  379. int txn_stat(DB_TXN_STAT **statp, db_malloc_fcn_type db_malloc_fcn);
  380. // These are public only because they need to be called
  381. // via C functions.  They should never be called by users
  382. // of this class.
  383. //
  384. static void _stream_error_function(const char *, char *);
  385. static int _tx_recover_intercept(DB_ENV *env, DBT *dbt, DB_LSN *lsn,
  386. db_recops op);
  387. static void _paniccall_intercept(DB_ENV *env, int errval);
  388. static int _recovery_init_intercept(DB_ENV *env);
  389. static void _feedback_intercept(DB_ENV *env, int opcode, int pct);
  390. static void _destroy_check(const char *str, int isDbEnv);
  391. private:
  392. void cleanup();
  393. int initialize(DB_ENV *env);
  394. int error_policy();
  395. // Used internally
  396. DbEnv(DB_ENV *, u_int32_t flags);
  397. // no copying
  398. DbEnv(const DbEnv &);
  399. void operator = (const DbEnv &);
  400. DEFINE_DB_CLASS(DbEnv);
  401. // instance data
  402. int construct_error_;
  403. u_int32_t construct_flags_;
  404. Db *headdb_;
  405. Db *taildb_;
  406. int (*tx_recover_callback_)(DbEnv *, Dbt *, DbLsn *, db_recops);
  407. int (*recovery_init_callback_)(DbEnv *);
  408. void (*paniccall_callback_)(DbEnv *, int);
  409. void (*feedback_callback_)(DbEnv *, int, int);
  410. // class data
  411. static ostream *error_stream_;
  412. };
  413. ////////////////////////////////////////////////////////////////
  414. ////////////////////////////////////////////////////////////////
  415. //
  416. // Table access classes
  417. //
  418. //
  419. // Represents a database table = a set of keys with associated values.
  420. //
  421. class _exported Db
  422. {
  423. friend class DbEnv;
  424. public:
  425. Db(DbEnv*, u_int32_t);      // create a Db object, then call open()
  426. ~Db();                      // does *not* call close.
  427. // These methods exactly match those in the C interface.
  428. //
  429. int close(u_int32_t flags);
  430. int cursor(DbTxn *txnid, Dbc **cursorp, u_int32_t flags);
  431. int del(DbTxn *txnid, Dbt *key, u_int32_t flags);
  432. void err(int, const char *, ...);
  433. void errx(const char *, ...);
  434. int fd(int *fdp);
  435. int get(DbTxn *txnid, Dbt *key, Dbt *data, u_int32_t flags);
  436. int get_byteswapped() const;
  437. DBTYPE get_type() const;
  438. int join(Dbc **curslist, Dbc **dbcp, u_int32_t flags);
  439. int key_range(DbTxn *, Dbt *, DB_KEY_RANGE *, u_int32_t);
  440. int open(const char *, const char *subname, DBTYPE, u_int32_t, int);
  441. int put(DbTxn *, Dbt *, Dbt *, u_int32_t);
  442. int remove(const char *, const char *, u_int32_t);
  443. int rename(const char *, const char *, const char *, u_int32_t);
  444. int set_bt_compare(bt_compare_fcn_type);
  445. int set_bt_maxkey(u_int32_t);
  446. int set_bt_minkey(u_int32_t);
  447. int set_bt_prefix(bt_prefix_fcn_type);
  448. int set_cachesize(u_int32_t, u_int32_t, int);
  449. int set_dup_compare(dup_compare_fcn_type);
  450. void set_errcall(void (*)(const char *, char *));
  451. void set_errfile(FILE *);
  452. void set_errpfx(const char *);
  453. int set_append_recno(int (*)(Db *, Dbt *, db_recno_t));
  454. int set_feedback(void (*)(Db *, int, int));
  455. int set_flags(u_int32_t);
  456. int set_h_ffactor(u_int32_t);
  457. int set_h_hash(h_hash_fcn_type);
  458. int set_h_nelem(u_int32_t);
  459. int set_lorder(int);
  460. int set_malloc(db_malloc_fcn_type);
  461. int set_pagesize(u_int32_t);
  462. int set_paniccall(void (*)(DbEnv *, int));
  463. int set_realloc(db_realloc_fcn_type);
  464. int set_re_delim(int);
  465. int set_re_len(u_int32_t);
  466. int set_re_pad(int);
  467. int set_re_source(char *);
  468. int set_q_extentsize(u_int32_t);
  469. int stat(void *sp, db_malloc_fcn_type db_malloc_fcn, u_int32_t flags);
  470. int sync(u_int32_t flags);
  471. int upgrade(const char *name, u_int32_t flags);
  472. int verify(const char *, const char *, ostream *, u_int32_t);
  473. // This additional method is available for C++
  474. //
  475. void set_error_stream(ostream *);
  476. // These are public only because it needs to be called
  477. // via C functions.  It should never be called by users
  478. // of this class.
  479. //
  480. static void _feedback_intercept(DB *db, int opcode, int pct);
  481. static int _append_recno_intercept(DB *db, DBT *data, db_recno_t recno);
  482. private:
  483. // no copying
  484. Db(const Db &);
  485. Db &operator = (const Db &);
  486. DEFINE_DB_CLASS(Db);
  487. void cleanup();
  488. int initialize();
  489. int error_policy();
  490. // instance data
  491. DbEnv *env_;
  492. Db *next_;
  493. Db *prev_;
  494. int construct_error_;
  495. u_int32_t flags_;
  496. u_int32_t construct_flags_;
  497. void (*feedback_callback_)(Db *, int, int);
  498. int (*append_recno_callback_)(Db *, Dbt *, db_recno_t);
  499. };
  500. //
  501. // A chunk of data, maybe a key or value.
  502. //
  503. class _exported Dbt : private DBT
  504. {
  505. friend class Dbc;
  506. friend class Db;
  507. friend class DbEnv;
  508. public:
  509. // key/data
  510. void *get_data() const;
  511. void set_data(void *);
  512. // key/data length
  513. u_int32_t get_size() const;
  514. void set_size(u_int32_t);
  515. // RO: length of user buffer.
  516. u_int32_t get_ulen() const;
  517. void set_ulen(u_int32_t);
  518. // RO: get/put record length.
  519. u_int32_t get_dlen() const;
  520. void set_dlen(u_int32_t);
  521. // RO: get/put record offset.
  522. u_int32_t get_doff() const;
  523. void set_doff(u_int32_t);
  524. // flags
  525. u_int32_t get_flags() const;
  526. void set_flags(u_int32_t);
  527. Dbt(void *data, size_t size);
  528. Dbt();
  529. ~Dbt();
  530. Dbt(const Dbt &);
  531. Dbt &operator = (const Dbt &);
  532. private:
  533. // We can add data to this class if needed
  534. // since parent class is not allocated by db.
  535. // (see comment at top)
  536. };
  537. class _exported Dbc : protected DBC
  538. {
  539. friend class Db;
  540. public:
  541. int close();
  542. int count(db_recno_t *countp, u_int32_t flags);
  543. int del(u_int32_t flags);
  544. int dup(Dbc** cursorp, u_int32_t flags);
  545. int get(Dbt* key, Dbt *data, u_int32_t flags);
  546. int put(Dbt* key, Dbt *data, u_int32_t flags);
  547. private:
  548. // No data is permitted in this class (see comment at top)
  549. // Note: use Db::cursor() to get pointers to a Dbc,
  550. // and call Dbc::close() rather than delete to release them.
  551. //
  552. Dbc();
  553. ~Dbc();
  554. // no copying
  555. Dbc(const Dbc &);
  556. Dbc &operator = (const Dbc &);
  557. };
  558. #endif /* !_DB_CXX_H_ */