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

MySQL数据库

开发平台:

Visual C++

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