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

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.  * $Id: db_cxx.in,v 11.113 2002/08/23 13:02:27 mjc 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 <stdarg.h>
  50. #ifdef HAVE_CXX_STDHEADERS
  51. #include <iostream>
  52. #define __DB_OSTREAMCLASS std::ostream
  53. #else
  54. #include <iostream.h>
  55. #define __DB_OSTREAMCLASS ostream
  56. #endif
  57. #include "db.h"
  58. #include "cxx_common.h"
  59. #include "cxx_except.h"
  60. class Db;                                        // forward
  61. class Dbc;                                       // forward
  62. class DbEnv;                                     // forward
  63. class DbInfo;                                    // forward
  64. class DbLock;                                    // forward
  65. class DbLogc;                                    // forward
  66. class DbLsn;                                     // forward
  67. class DbMpoolFile;                               // forward
  68. class DbPreplist;                                // forward
  69. class Dbt;                                       // forward
  70. class DbTxn;                                     // forward
  71. // These classes are not defined here and should be invisible
  72. // to the user, but some compilers require forward references.
  73. // There is one for each use of the DEFINE_DB_CLASS macro.
  74. class DbImp;
  75. class DbEnvImp;
  76. class DbMpoolFileImp;
  77. class DbTxnImp;
  78. // DEFINE_DB_CLASS defines an imp_ data member and imp() accessor.
  79. // The underlying type is a pointer to an opaque *Imp class, that
  80. // gets converted to the correct implementation class by the implementation.
  81. //
  82. // Since these defines use "private/public" labels, and leave the access
  83. // being "private", we always use these by convention before any data
  84. // members in the private section of a class.  Keeping them in the
  85. // private section also emphasizes that they are off limits to user code.
  86. //
  87. #define DEFINE_DB_CLASS(name) 
  88. public: class name##Imp* imp() { return (imp_); } 
  89. public: const class name##Imp* constimp() const { return (imp_); } 
  90. private: class name##Imp* imp_
  91. ////////////////////////////////////////////////////////////////
  92. ////////////////////////////////////////////////////////////////
  93. //
  94. // Turn off inappropriate compiler warnings
  95. //
  96. #ifdef _MSC_VER
  97. // These are level 4 warnings that are explicitly disabled.
  98. // With Visual C++, by default you do not see above level 3 unless
  99. // you use /W4.  But we like to compile with the highest level
  100. // warnings to catch other errors.
  101. //
  102. // 4201: nameless struct/union
  103. //       triggered by standard include file <winnt.h>
  104. //
  105. // 4514: unreferenced inline function has been removed
  106. //       certain include files in MSVC define methods that are not called
  107. //
  108. #pragma warning(disable: 4201 4514)
  109. #endif
  110. // Some interfaces can be customized by allowing users to define
  111. // callback functions.  For performance and logistical reasons, some
  112. // callback functions must be declared in extern "C" blocks.  For others,
  113. // we allow you to declare the callbacks in C++ or C (or an extern "C"
  114. // block) as you wish.  See the set methods for the callbacks for
  115. // the choices.
  116. //
  117. extern "C" {
  118. typedef void * (*db_malloc_fcn_type)
  119. (size_t);
  120. typedef void * (*db_realloc_fcn_type)
  121. (void *, size_t);
  122. typedef void (*db_free_fcn_type)
  123. (void *);
  124. typedef int (*bt_compare_fcn_type)          /*C++ version available*/
  125. (DB *, const DBT *, const DBT *);
  126. typedef size_t (*bt_prefix_fcn_type)        /*C++ version available*/
  127. (DB *, const DBT *, const DBT *);
  128. typedef int (*dup_compare_fcn_type)         /*C++ version available*/
  129. (DB *, const DBT *, const DBT *);
  130. typedef u_int32_t (*h_hash_fcn_type)        /*C++ version available*/
  131. (DB *, const void *, u_int32_t);
  132. typedef int (*pgin_fcn_type)
  133. (DB_ENV *dbenv, db_pgno_t pgno, void *pgaddr, DBT *pgcookie);
  134. typedef int (*pgout_fcn_type)
  135. (DB_ENV *dbenv, db_pgno_t pgno, void *pgaddr, DBT *pgcookie);
  136. };
  137. ////////////////////////////////////////////////////////////////
  138. ////////////////////////////////////////////////////////////////
  139. //
  140. // Lock classes
  141. //
  142. class _exported DbLock
  143. {
  144. friend class DbEnv;
  145. public:
  146. DbLock();
  147. DbLock(const DbLock &);
  148. DbLock &operator = (const DbLock &);
  149. protected:
  150. // We can add data to this class if needed
  151. // since its contained class is not allocated by db.
  152. // (see comment at top)
  153. DbLock(DB_LOCK);
  154. DB_LOCK lock_;
  155. };
  156. ////////////////////////////////////////////////////////////////
  157. ////////////////////////////////////////////////////////////////
  158. //
  159. // Log classes
  160. //
  161. class _exported DbLsn : protected DB_LSN
  162. {
  163. friend class DbEnv;          // friendship needed to cast to base class
  164. friend class DbLogc;         // friendship needed to cast to base class
  165. };
  166. ////////////////////////////////////////////////////////////////
  167. ////////////////////////////////////////////////////////////////
  168. //
  169. // Memory pool classes
  170. //
  171. class _exported DbMpoolFile
  172. {
  173. friend class DbEnv;
  174. private:
  175. // Put this first to allow inlining with some C++ compilers (g++-2.95)
  176. DEFINE_DB_CLASS(DbMpoolFile);
  177. public:
  178. int close(u_int32_t flags);
  179. int get(db_pgno_t *pgnoaddr, u_int32_t flags, void *pagep);
  180. void last_pgno(db_pgno_t *pgnoaddr);
  181. int open(const char *file, u_int32_t flags, int mode, size_t pagesize);
  182. int put(void *pgaddr, u_int32_t flags);
  183. void refcnt(db_pgno_t *pgnoaddr);
  184. int set(void *pgaddr, u_int32_t flags);
  185. int set_clear_len(u_int32_t len);
  186. int set_fileid(u_int8_t *fileid);
  187. int set_ftype(int ftype);
  188. int set_lsn_offset(int32_t offset);
  189. int set_pgcookie(DBT *dbt);
  190. void set_unlink(int);
  191. int sync();
  192. virtual DB_MPOOLFILE *get_DB_MPOOLFILE()
  193. {
  194. return (DB_MPOOLFILE *)imp();
  195. }
  196. virtual const DB_MPOOLFILE *get_const_DB_MPOOLFILE() const
  197. {
  198. return (const DB_MPOOLFILE *)constimp();
  199. }
  200. private:
  201. // We can add data to this class if needed
  202. // since it is implemented via a pointer.
  203. // (see comment at top)
  204. // Note: use DbEnv::memp_fcreate() to get pointers to a DbMpoolFile,
  205. // and call DbMpoolFile::close() rather than delete to release them.
  206. //
  207. DbMpoolFile();
  208. // Shut g++ up.
  209. protected:
  210. virtual ~DbMpoolFile();
  211. private:
  212. // no copying
  213. DbMpoolFile(const DbMpoolFile &);
  214. void operator = (const DbMpoolFile &);
  215. };
  216. ////////////////////////////////////////////////////////////////
  217. ////////////////////////////////////////////////////////////////
  218. //
  219. // This is filled in and returned by the DbEnv::txn_recover() method.
  220. //
  221. class _exported DbPreplist
  222. {
  223. public:
  224. DbTxn *txn;
  225. u_int8_t gid[DB_XIDDATASIZE];
  226. };
  227. ////////////////////////////////////////////////////////////////
  228. ////////////////////////////////////////////////////////////////
  229. //
  230. // Transaction classes
  231. //
  232. class _exported DbTxn
  233. {
  234. friend class DbEnv;
  235. private:
  236. // Put this first to allow inlining with some C++ compilers (g++-2.95)
  237. DEFINE_DB_CLASS(DbTxn);
  238. public:
  239. int abort();
  240. int commit(u_int32_t flags);
  241. int discard(u_int32_t flags);
  242. u_int32_t id();
  243. int prepare(u_int8_t *gid);
  244. int set_timeout(db_timeout_t timeout, u_int32_t flags);
  245. virtual DB_TXN *get_DB_TXN()
  246. {
  247. return (DB_TXN *)imp();
  248. }
  249. virtual const DB_TXN *get_const_DB_TXN() const
  250. {
  251. return (const DB_TXN *)constimp();
  252. }
  253. static DbTxn* get_DbTxn(DB_TXN *txn)
  254. {
  255. return (DbTxn *)txn->api_internal;
  256. }
  257. static const DbTxn* get_const_DbTxn(const DB_TXN *txn)
  258. {
  259. return (const DbTxn *)txn->api_internal;
  260. }
  261. // For internal use only.
  262. static DbTxn* wrap_DB_TXN(DB_TXN *txn);
  263. private:
  264. // We can add data to this class if needed
  265. // since it is implemented via a pointer.
  266. // (see comment at top)
  267. // Note: use DbEnv::txn_begin() to get pointers to a DbTxn,
  268. // and call DbTxn::abort() or DbTxn::commit rather than
  269. // delete to release them.
  270. //
  271. DbTxn();
  272. // For internal use only.
  273. DbTxn(DB_TXN *txn);
  274. virtual ~DbTxn();
  275. // no copying
  276. DbTxn(const DbTxn &);
  277. void operator = (const DbTxn &);
  278. };
  279. //
  280. // Berkeley DB environment class.  Provides functions for opening databases.
  281. // User of this library can use this class as a starting point for
  282. // developing a DB application - derive their application class from
  283. // this one, add application control logic.
  284. //
  285. // Note that if you use the default constructor, you must explicitly
  286. // call appinit() before any other db activity (e.g. opening files)
  287. //
  288. class _exported DbEnv
  289. {
  290. friend class Db;
  291. friend class DbLock;
  292. friend class DbMpoolFile;
  293. private:
  294. // Put this first to allow inlining with some C++ compilers (g++-2.95)
  295. DEFINE_DB_CLASS(DbEnv);
  296. public:
  297. // After using this constructor, you can set any needed
  298. // parameters for the environment using the set_* methods.
  299. // Then call open() to finish initializing the environment
  300. // and attaching it to underlying files.
  301. //
  302. DbEnv(u_int32_t flags);
  303. virtual ~DbEnv();
  304. // These methods match those in the C interface.
  305. //
  306. virtual int close(u_int32_t);
  307. virtual int dbremove(DbTxn *txn, const char *name, const char *subdb,
  308.     u_int32_t flags);
  309. virtual int dbrename(DbTxn *txn, const char *name, const char *subdb,
  310.     const char *newname, u_int32_t flags);
  311. virtual void err(int, const char *, ...);
  312. virtual void errx(const char *, ...);
  313. virtual void *get_app_private() const;
  314. virtual int open(const char *, u_int32_t, int);
  315. virtual int remove(const char *, u_int32_t);
  316. virtual int set_alloc(db_malloc_fcn_type, db_realloc_fcn_type,
  317.       db_free_fcn_type);
  318. virtual void set_app_private(void *);
  319. virtual int set_cachesize(u_int32_t, u_int32_t, int);
  320. virtual int set_data_dir(const char *);
  321. virtual int set_encrypt(const char *, int);
  322. virtual void set_errcall(void (*)(const char *, char *));
  323. virtual void set_errfile(FILE *);
  324. virtual void set_errpfx(const char *);
  325. virtual int set_flags(u_int32_t, int);
  326. virtual int set_feedback(void (*)(DbEnv *, int, int));
  327. virtual int set_lg_bsize(u_int32_t);
  328. virtual int set_lg_dir(const char *);
  329. virtual int set_lg_max(u_int32_t);
  330. virtual int set_lg_regionmax(u_int32_t);
  331. virtual int set_lk_conflicts(u_int8_t *, int);
  332. virtual int set_lk_detect(u_int32_t);
  333. virtual int set_lk_max(u_int32_t);
  334. virtual int set_lk_max_lockers(u_int32_t);
  335. virtual int set_lk_max_locks(u_int32_t);
  336. virtual int set_lk_max_objects(u_int32_t);
  337. virtual int set_mp_mmapsize(size_t);
  338. virtual int set_paniccall(void (*)(DbEnv *, int));
  339. virtual int set_rpc_server(void *, char *, long, long, u_int32_t);
  340. virtual int set_shm_key(long);
  341. virtual int set_timeout(db_timeout_t timeout, u_int32_t flags);
  342. virtual int set_tmp_dir(const char *);
  343. virtual int set_tas_spins(u_int32_t);
  344. virtual int set_tx_max(u_int32_t);
  345. virtual int set_app_dispatch(int (*)(DbEnv *,
  346.     Dbt *, DbLsn *, db_recops));
  347. virtual int set_tx_timestamp(time_t *);
  348. virtual int set_verbose(u_int32_t which, int onoff);
  349. // Version information.  A static method so it can be obtained anytime.
  350. //
  351. static char *version(int *major, int *minor, int *patch);
  352. // Convert DB errors to strings
  353. static char *strerror(int);
  354. // If an error is detected and the error call function
  355. // or stream is set, a message is dispatched or printed.
  356. // If a prefix is set, each message is prefixed.
  357. //
  358. // You can use set_errcall() or set_errfile() above to control
  359. // error functionality.  Alternatively, you can call
  360. // set_error_stream() to force all errors to a C++ stream.
  361. // It is unwise to mix these approaches.
  362. //
  363. virtual void set_error_stream(__DB_OSTREAMCLASS *);
  364. // used internally
  365. static void runtime_error(const char *caller, int err,
  366.   int error_policy);
  367. static void runtime_error_dbt(const char *caller, Dbt *dbt,
  368.   int error_policy);
  369. static void runtime_error_lock_get(const char *caller, int err,
  370.   db_lockop_t op, db_lockmode_t mode,
  371.   const Dbt *obj, DbLock lock, int index,
  372.   int error_policy);
  373. // Lock functions
  374. //
  375. virtual int lock_detect(u_int32_t flags, u_int32_t atype, int *aborted);
  376. virtual int lock_get(u_int32_t locker, u_int32_t flags, const Dbt *obj,
  377.      db_lockmode_t lock_mode, DbLock *lock);
  378. virtual int lock_id(u_int32_t *idp);
  379. virtual int lock_id_free(u_int32_t id);
  380. virtual int lock_put(DbLock *lock);
  381. virtual int lock_stat(DB_LOCK_STAT **statp, u_int32_t flags);
  382. virtual int lock_vec(u_int32_t locker, u_int32_t flags, DB_LOCKREQ list[],
  383.      int nlist, DB_LOCKREQ **elistp);
  384. // Log functions
  385. //
  386. virtual int log_archive(char **list[], u_int32_t flags);
  387. static int log_compare(const DbLsn *lsn0, const DbLsn *lsn1);
  388. virtual int log_cursor(DbLogc **cursorp, u_int32_t flags);
  389. virtual int log_file(DbLsn *lsn, char *namep, size_t len);
  390. virtual int log_flush(const DbLsn *lsn);
  391. virtual int log_put(DbLsn *lsn, const Dbt *data, u_int32_t flags);
  392. virtual int log_stat(DB_LOG_STAT **spp, u_int32_t flags);
  393. // Mpool functions
  394. //
  395. virtual int memp_fcreate(DbMpoolFile **dbmfp, u_int32_t flags);
  396. virtual int memp_register(int ftype,
  397.   pgin_fcn_type pgin_fcn,
  398.   pgout_fcn_type pgout_fcn);
  399. virtual int memp_stat(DB_MPOOL_STAT
  400.       **gsp, DB_MPOOL_FSTAT ***fsp, u_int32_t flags);
  401. virtual int memp_sync(DbLsn *lsn);
  402. virtual int memp_trickle(int pct, int *nwrotep);
  403. // Transaction functions
  404. //
  405. virtual int txn_begin(DbTxn *pid, DbTxn **tid, u_int32_t flags);
  406. virtual int txn_checkpoint(u_int32_t kbyte, u_int32_t min, u_int32_t flags);
  407. virtual int txn_recover(DbPreplist *preplist, long count,
  408. long *retp, u_int32_t flags);
  409. virtual int txn_stat(DB_TXN_STAT **statp, u_int32_t flags);
  410. // Replication functions
  411. //
  412. virtual int rep_elect(int, int, u_int32_t, int *);
  413. virtual int rep_process_message(Dbt *, Dbt *, int *);
  414. virtual int rep_start(Dbt *, u_int32_t);
  415. virtual int rep_stat(DB_REP_STAT **statp, u_int32_t flags);
  416. virtual int set_rep_limit(u_int32_t, u_int32_t);
  417. virtual int set_rep_transport(u_int32_t,
  418.     int (*)(DbEnv *, const Dbt *, const Dbt *, int, u_int32_t));
  419. // Conversion functions
  420. //
  421. virtual DB_ENV *get_DB_ENV()
  422. {
  423. return (DB_ENV *)imp();
  424. }
  425. virtual const DB_ENV *get_const_DB_ENV() const
  426. {
  427. return (const DB_ENV *)constimp();
  428. }
  429. static DbEnv* get_DbEnv(DB_ENV *dbenv)
  430. {
  431. return (DbEnv *)dbenv->api1_internal;
  432. }
  433. static const DbEnv* get_const_DbEnv(const DB_ENV *dbenv)
  434. {
  435. return (const DbEnv *)dbenv->api1_internal;
  436. }
  437. // For internal use only.
  438. static DbEnv* wrap_DB_ENV(DB_ENV *dbenv);
  439. // These are public only because they need to be called
  440. // via C functions.  They should never be called by users
  441. // of this class.
  442. //
  443. static void _stream_error_function(const char *, char *);
  444. static int _app_dispatch_intercept(DB_ENV *env, DBT *dbt, DB_LSN *lsn,
  445. db_recops op);
  446. static void _paniccall_intercept(DB_ENV *env, int errval);
  447. static void _feedback_intercept(DB_ENV *env, int opcode, int pct);
  448. static int _rep_send_intercept(DB_ENV *env,
  449.        const DBT *cntrl, const DBT *data,
  450.        int id, u_int32_t flags);
  451. private:
  452. void cleanup();
  453. int initialize(DB_ENV *env);
  454. int error_policy();
  455. // For internal use only.
  456. DbEnv(DB_ENV *, u_int32_t flags);
  457. // no copying
  458. DbEnv(const DbEnv &);
  459. void operator = (const DbEnv &);
  460. // instance data
  461. int construct_error_;
  462. u_int32_t construct_flags_;
  463. int (*app_dispatch_callback_)(DbEnv *, Dbt *, DbLsn *, db_recops);
  464. void (*feedback_callback_)(DbEnv *, int, int);
  465. void (*paniccall_callback_)(DbEnv *, int);
  466. int (*pgin_callback_)(DbEnv *dbenv, db_pgno_t pgno,
  467.       void *pgaddr, Dbt *pgcookie);
  468. int (*pgout_callback_)(DbEnv *dbenv, db_pgno_t pgno,
  469.        void *pgaddr, Dbt *pgcookie);
  470. int (*rep_send_callback_)(DbEnv *,
  471.     const Dbt *, const Dbt *, int, u_int32_t);
  472. // class data
  473. static __DB_OSTREAMCLASS *error_stream_;
  474. };
  475. ////////////////////////////////////////////////////////////////
  476. ////////////////////////////////////////////////////////////////
  477. //
  478. // Table access classes
  479. //
  480. //
  481. // Represents a database table = a set of keys with associated values.
  482. //
  483. class _exported Db
  484. {
  485. friend class DbEnv;
  486. private:
  487. // Put this first to allow inlining with some C++ compilers (g++-2.95)
  488. DEFINE_DB_CLASS(Db);
  489. public:
  490. Db(DbEnv*, u_int32_t);      // create a Db object, then call open()
  491. virtual ~Db();              // does *not* call close.
  492. // These methods exactly match those in the C interface.
  493. //
  494. virtual int associate(DbTxn *txn, Db *secondary,
  495.     int (*callback)(Db *, const Dbt *, const Dbt *, Dbt *),
  496.     u_int32_t flags);
  497. virtual int close(u_int32_t flags);
  498.         virtual int cursor(DbTxn *txnid, Dbc **cursorp, u_int32_t flags);
  499. virtual int del(DbTxn *txnid, Dbt *key, u_int32_t flags);
  500. virtual void err(int, const char *, ...);
  501. virtual void errx(const char *, ...);
  502. virtual int fd(int *fdp);
  503. virtual int get(DbTxn *txnid, Dbt *key, Dbt *data, u_int32_t flags);
  504. virtual void *get_app_private() const;
  505. virtual int get_byteswapped(int *);
  506. virtual int get_type(DBTYPE *);
  507. virtual int join(Dbc **curslist, Dbc **dbcp, u_int32_t flags);
  508. virtual int key_range(DbTxn *, Dbt *, DB_KEY_RANGE *, u_int32_t);
  509. virtual int open(DbTxn *txnid,
  510.     const char *, const char *subname, DBTYPE, u_int32_t, int);
  511. virtual int pget(DbTxn *txnid, Dbt *key, Dbt *pkey, Dbt *data,
  512.  u_int32_t flags);
  513. virtual int put(DbTxn *, Dbt *, Dbt *, u_int32_t);
  514. virtual int remove(const char *, const char *, u_int32_t);
  515. virtual int rename(const char *, const char *, const char *, u_int32_t);
  516. virtual int set_alloc(db_malloc_fcn_type, db_realloc_fcn_type,
  517.       db_free_fcn_type);
  518. virtual void set_app_private(void *);
  519. virtual int set_append_recno(int (*)(Db *, Dbt *, db_recno_t));
  520. virtual int set_bt_compare(bt_compare_fcn_type); /*deprecated*/
  521. virtual int set_bt_compare(int (*)(Db *, const Dbt *, const Dbt *));
  522. virtual int set_bt_maxkey(u_int32_t);
  523. virtual int set_bt_minkey(u_int32_t);
  524. virtual int set_bt_prefix(bt_prefix_fcn_type); /*deprecated*/
  525. virtual int set_bt_prefix(size_t (*)(Db *, const Dbt *, const Dbt *));
  526. virtual int set_cachesize(u_int32_t, u_int32_t, int);
  527. virtual int set_cache_priority(DB_CACHE_PRIORITY);
  528. virtual int set_dup_compare(dup_compare_fcn_type); /*deprecated*/
  529. virtual int set_dup_compare(int (*)(Db *, const Dbt *, const Dbt *));
  530. virtual int set_encrypt(const char *, int);
  531. virtual void set_errcall(void (*)(const char *, char *));
  532. virtual void set_errfile(FILE *);
  533. virtual void set_errpfx(const char *);
  534. virtual int set_feedback(void (*)(Db *, int, int));
  535. virtual int set_flags(u_int32_t);
  536. virtual int set_h_ffactor(u_int32_t);
  537. virtual int set_h_hash(h_hash_fcn_type); /*deprecated*/
  538. virtual int set_h_hash(u_int32_t (*)(Db *, const void *, u_int32_t));
  539. virtual int set_h_nelem(u_int32_t);
  540. virtual int set_lorder(int);
  541. virtual int set_pagesize(u_int32_t);
  542. virtual int set_paniccall(void (*)(DbEnv *, int));
  543. virtual int set_re_delim(int);
  544. virtual int set_re_len(u_int32_t);
  545. virtual int set_re_pad(int);
  546. virtual int set_re_source(char *);
  547. virtual int set_q_extentsize(u_int32_t);
  548. virtual int stat(void *sp, u_int32_t flags);
  549. virtual int sync(u_int32_t flags);
  550. virtual int truncate(DbTxn *, u_int32_t *, u_int32_t);
  551. virtual int upgrade(const char *name, u_int32_t flags);
  552. virtual int verify(const char *, const char *, __DB_OSTREAMCLASS *, u_int32_t);
  553. // These additional methods are not in the C interface, and
  554. // are only available for C++.
  555. //
  556. virtual void set_error_stream(__DB_OSTREAMCLASS *);
  557. virtual DB *get_DB()
  558. {
  559. return (DB *)imp();
  560. }
  561. virtual const DB *get_const_DB() const
  562. {
  563. return (const DB *)constimp();
  564. }
  565. static Db* get_Db(DB *db)
  566. {
  567. return (Db *)db->api_internal;
  568. }
  569. static const Db* get_const_Db(const DB *db)
  570. {
  571. return (const Db *)db->api_internal;
  572. }
  573. private:
  574. // no copying
  575. Db(const Db &);
  576. Db &operator = (const Db &);
  577. void cleanup();
  578. int initialize();
  579. int error_policy();
  580. // instance data
  581. DbEnv *env_;
  582. int construct_error_;
  583. u_int32_t flags_;
  584. u_int32_t construct_flags_;
  585. public:
  586. // These are public only because they need to be called
  587. // via C callback functions.  They should never be used by
  588. // external users of this class.
  589. //
  590. int (*append_recno_callback_)(Db *, Dbt *, db_recno_t);
  591. int (*associate_callback_)(Db *, const Dbt *, const Dbt *, Dbt *);
  592. int (*bt_compare_callback_)(Db *, const Dbt *, const Dbt *);
  593. size_t (*bt_prefix_callback_)(Db *, const Dbt *, const Dbt *);
  594. int (*dup_compare_callback_)(Db *, const Dbt *, const Dbt *);
  595. void (*feedback_callback_)(Db *, int, int);
  596. u_int32_t (*h_hash_callback_)(Db *, const void *, u_int32_t);
  597. };
  598. //
  599. // A chunk of data, maybe a key or value.
  600. //
  601. class _exported Dbt : private DBT
  602. {
  603. friend class Dbc;
  604. friend class Db;
  605. friend class DbEnv;
  606. friend class DbLogc;
  607. public:
  608. // key/data
  609. void *get_data() const                 { return data; }
  610. void set_data(void *value)             { data = value; }
  611. // key/data length
  612. u_int32_t get_size() const             { return size; }
  613. void set_size(u_int32_t value)         { size = value; }
  614. // RO: length of user buffer.
  615. u_int32_t get_ulen() const             { return ulen; }
  616. void set_ulen(u_int32_t value)         { ulen = value; }
  617. // RO: get/put record length.
  618. u_int32_t get_dlen() const             { return dlen; }
  619. void set_dlen(u_int32_t value)         { dlen = value; }
  620. // RO: get/put record offset.
  621. u_int32_t get_doff() const             { return doff; }
  622. void set_doff(u_int32_t value)         { doff = value; }
  623. // flags
  624. u_int32_t get_flags() const            { return flags; }
  625. void set_flags(u_int32_t value)        { flags = value; }
  626. // Conversion functions
  627. DBT *get_DBT()                         { return (DBT *)this; }
  628. const DBT *get_const_DBT() const       { return (const DBT *)this; }
  629. static Dbt* get_Dbt(DBT *dbt)          { return (Dbt *)dbt; }
  630. static const Dbt* get_const_Dbt(const DBT *dbt)
  631.        { return (const Dbt *)dbt; }
  632. Dbt(void *data, u_int32_t size);
  633. Dbt();
  634. ~Dbt();
  635. Dbt(const Dbt &);
  636. Dbt &operator = (const Dbt &);
  637. private:
  638. // Note: no extra data appears in this class (other than
  639. // inherited from DBT) since we need DBT and Dbt objects
  640. // to have interchangable pointers.
  641. //
  642. // When subclassing this class, remember that callback
  643. // methods like bt_compare, bt_prefix, dup_compare may
  644. // internally manufacture DBT objects (which later are
  645. // cast to Dbt), so such callbacks might receive objects
  646. // not of your subclassed type.
  647. };
  648. class _exported Dbc : protected DBC
  649. {
  650. friend class Db;
  651. public:
  652. int close();
  653. int count(db_recno_t *countp, u_int32_t flags);
  654. int del(u_int32_t flags);
  655. int dup(Dbc** cursorp, u_int32_t flags);
  656. int get(Dbt* key, Dbt *data, u_int32_t flags);
  657. int pget(Dbt* key, Dbt* pkey, Dbt *data, u_int32_t flags);
  658. int put(Dbt* key, Dbt *data, u_int32_t flags);
  659. private:
  660. // No data is permitted in this class (see comment at top)
  661. // Note: use Db::cursor() to get pointers to a Dbc,
  662. // and call Dbc::close() rather than delete to release them.
  663. //
  664. Dbc();
  665. ~Dbc();
  666. // no copying
  667. Dbc(const Dbc &);
  668. Dbc &operator = (const Dbc &);
  669. };
  670. class _exported DbLogc : protected DB_LOGC
  671. {
  672. friend class DbEnv;
  673. public:
  674. int close(u_int32_t _flags);
  675. int get(DbLsn *lsn, Dbt *data, u_int32_t _flags);
  676. private:
  677. // No data is permitted in this class (see comment at top)
  678. // Note: use Db::cursor() to get pointers to a Dbc,
  679. // and call Dbc::close() rather than delete to release them.
  680. //
  681. DbLogc();
  682. ~DbLogc();
  683. // no copying
  684. DbLogc(const Dbc &);
  685. DbLogc &operator = (const Dbc &);
  686. };
  687. #endif /* !_DB_CXX_H_ */