about summary refs log tree commit diff
path: root/db2/include/db_cxx.h
diff options
context:
space:
mode:
Diffstat (limited to 'db2/include/db_cxx.h')
-rw-r--r--db2/include/db_cxx.h888
1 files changed, 888 insertions, 0 deletions
diff --git a/db2/include/db_cxx.h b/db2/include/db_cxx.h
new file mode 100644
index 0000000000..506aed845c
--- /dev/null
+++ b/db2/include/db_cxx.h
@@ -0,0 +1,888 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 1997
+ *	Sleepycat Software.  All rights reserved.
+ *
+ *	@(#)db_cxx.h	10.7 (Sleepycat) 8/22/97
+ */
+
+#ifndef _DB_CXX_H_
+#define _DB_CXX_H_
+
+//
+// C++ assumptions:
+//
+// To ensure portability to many platforms, both new and old, we make
+// few assumptions about the C++ compiler and library.  For example,
+// we do not expect STL, templates or namespaces to be available.  The
+// "newest" C++ feature used is exceptions, which are used liberally
+// to transmit error information.  Even the use of exceptions can be
+// disabled at runtime, see setErrorModel().
+//
+// C++ naming conventions:
+//
+//  - All top level class names start with Db.
+//  - All class members start with lower case letter.
+//  - All private data members are suffixed with underscore.
+//  - Use underscores to divide names into multiple words.
+//  - Simple data accessors are named with get_ or set_ prefix.
+//  - All method names are taken from names of functions in the C
+//    layer of db (usually by dropping a prefix like "db_").
+//    These methods have the same argument types and order,
+//    other than dropping the explicit arg that acts as "this".
+//
+// As a rule, each DbFoo object has exactly one underlying DB_FOO struct
+// (defined in db.h) associated with it.  In many cases, we inherit directly
+// from the DB_FOO structure to make this relationship explicit.  Often,
+// the underlying C layer allocates and deallocates these structures, so
+// there is no easy way to add any data to the DbFoo class.  When you see
+// a comment about whether data is permitted to be added, this is what
+// is going on.  Of course, if we need to add data to such C++ classes
+// in the future, we will arrange to have an indirect pointer to the
+// DB_FOO struct (as some of the classes already have).
+//
+
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//
+// Forward declarations
+//
+
+#include "db.h"
+
+class Db;                                        // forward
+class Dbc;                                       // forward
+class DbEnv;                                     // forward
+class DbException;                               // forward
+class DbInfo;                                    // forward
+class DbLock;                                    // forward
+class DbLockTab;                                 // forward
+class DbLog;                                     // forward
+class DbLsn;                                     // forward
+class DbMpool;                                   // forward
+class DbMpoolFile;                               // forward
+class Dbt;                                       // forward
+class DbTxn;                                     // forward
+class DbTxnMgr;                                  // forward
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//
+// Mechanisms for declaring classes
+//
+
+//
+// Every class defined in this file has an _exported next to the class name.
+// This is needed for WinTel machines so that the class methods can
+// be exported or imported in a DLL as appropriate.  Users of the DLL
+// use the define DB_USE_DLL.  When the DLL is built, DB_CREATE_DLL
+// must be defined.
+//
+#if defined(_MSC_VER)
+
+#  if defined(DB_CREATE_DLL)
+#    define _exported __declspec(dllexport)      // creator of dll
+#  elif defined(DB_USE_DLL)
+#    define _exported __declspec(dllimport)      // user of dll
+#  else
+#    define _exported                            // static lib creator or user
+#  endif
+
+#else
+
+#  define _exported
+
+#endif
+
+// DEFINE_DB_CLASS defines an imp_ data member and imp() accessor.
+// The underlying type is a pointer to an opaque *Imp class, that
+// gets converted to the correct implementation class by the implementation.
+//
+// Since these defines use "private/public" labels, and leave the access
+// being "private", we always use these by convention before any data
+// members in the private section of a class.  Keeping them in the
+// private section also emphasizes that they are off limits to user code.
+//
+#define DEFINE_DB_CLASS(name) \
+    public: class name##Imp* imp() { return imp_; } \
+    public: const class name##Imp* imp() const { return imp_; } \
+    private: class name##Imp* imp_
+
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//
+// Turn off inappropriate compiler warnings
+//
+
+#ifdef _MSC_VER
+
+// These are level 4 warnings that are explicitly disabled.
+// With Visual C++, by default you do not see above level 3 unless
+// you use /W4.  But we like to compile with the highest level
+// warnings to catch other errors.
+//
+// 4201: nameless struct/union
+//       triggered by standard include file <winnt.h>
+//
+// 4514: unreferenced inline function has been removed
+//       certain include files in MSVC define methods that are not called
+//
+#pragma warning(disable: 4201 4514)
+
+#endif
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//
+// Exception classes
+//
+
+// Almost any error in the DB library throws a DbException.
+// Every exception should be considered an abnormality
+// (e.g. bug, misuse of DB, file system error).
+//
+// NOTE: We would like to inherit from class exception and
+//       let it handle what(), but there are
+//       MSVC++ problems when <exception> is included.
+//
+class _exported DbException
+{
+public:
+    virtual ~DbException();
+    DbException(int err);
+    DbException(const char *description);
+    DbException(const char *prefix, int err);
+    DbException(const char *prefix1, const char *prefix2, int err);
+    const int get_errno();
+    virtual const char *what() const;
+
+    DbException(const DbException &);
+    DbException &operator = (const DbException &);
+
+private:
+    char *what_;
+    int err_;                   // errno
+};
+
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//
+// Lock classes
+//
+
+class _exported DbLock
+{
+    friend DbLockTab;
+
+public:
+    DbLock(unsigned int);
+    DbLock();
+
+    unsigned int get_lock_id();
+    void set_lock_id(unsigned int);
+
+    int put(DbLockTab *locktab);
+
+    DbLock(const DbLock &);
+    DbLock &operator = (const DbLock &);
+
+protected:
+    // We can add data to this class if needed
+    // since its contained class is not allocated by db.
+    // (see comment at top)
+
+    DB_LOCK lock_;
+};
+
+class _exported DbLockTab
+{
+friend DbEnv;
+public:
+    int close();
+    int detect(int atype, u_int32_t flags);
+    int get(u_int32_t locker, int flags, const Dbt *obj,
+            db_lockmode_t lock_mode, DbLock *lock);
+    int id(u_int32_t *idp);
+    int vec(u_int32_t locker, int flags, DB_LOCKREQ list[],
+	    int nlist, DB_LOCKREQ **elistp);
+
+    // Create or remove new locktab files
+    //
+    static int open(const char *dir, int flags, int mode,
+                    DbEnv* dbenv, DbLockTab **regionp);
+    static int unlink(const char *dir, int force, DbEnv* dbenv);
+
+private:
+    // We can add data to this class if needed
+    // since it is implemented via a pointer.
+    // (see comment at top)
+
+    // copying not allowed
+    //
+    DbLockTab(const DbLockTab &);
+    DbLockTab &operator = (const DbLockTab &);
+
+    // Note: use DbLockTab::open() or DbEnv::get_lk_info()
+    // to get pointers to a DbLockTab,
+    // and call DbLockTab::close() rather than delete to release them.
+    //
+    DbLockTab();
+    ~DbLockTab();
+
+    DEFINE_DB_CLASS(DbLockTab);
+};
+
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//
+// Log classes
+//
+
+class _exported DbLsn : protected DB_LSN
+{
+    friend DbLog;               // friendship needed to cast to base class
+    friend DbMpool;
+};
+
+class _exported DbLog
+{
+friend DbEnv;
+public:
+    int archive(char **list[], int flags, void *(*db_malloc)(size_t));
+    int close();
+    static int compare(const DbLsn *lsn0, const DbLsn *lsn1);
+    int file(DbLsn *lsn, char *namep, int len);
+    int flush(const DbLsn *lsn);
+    int get(DbLsn *lsn, Dbt *data, int flags);
+    int put(DbLsn *lsn, const Dbt *data, int flags);
+
+    // Normally these would be called register and unregister to
+    // parallel the C interface, but "register" is a reserved word.
+    //
+    int db_register(Db *dbp, const char *name, u_int32_t *fidp);
+    int db_unregister(u_int32_t fid);
+
+    // Create or remove new log files
+    //
+    static int open(const char *dir, int flags, int mode,
+                    DbEnv* dbenv, DbLog **regionp);
+    static int unlink(const char *dir, int force, DbEnv* dbenv);
+
+private:
+    // We can add data to this class if needed
+    // since it is implemented via a pointer.
+    // (see comment at top)
+
+    // Note: use DbLog::open() or DbEnv::get_lg_info()
+    // to get pointers to a DbLog,
+    // and call DbLog::close() rather than delete to release them.
+    //
+    DbLog();
+    ~DbLog();
+
+    // no copying
+    DbLog(const DbLog &);
+    operator = (const DbLog &);
+
+    DEFINE_DB_CLASS(DbLog);
+};
+
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//
+// Memory pool classes
+//
+
+class _exported DbMpoolFile
+{
+public:
+    int close();
+    int get(db_pgno_t *pgnoaddr, unsigned long flags, void *pagep);
+    int put(void *pgaddr, unsigned long flags);
+    int set(void *pgaddr, unsigned long flags);
+    int sync();
+
+    static int open(DbMpool *mp, const char *file,
+                    int ftype, int flags, int mode,
+                    size_t pagesize, int lsn_offset,
+                    Dbt *pgcookie, u_int8_t *uid, DbMpoolFile **mpf);
+
+private:
+    // We can add data to this class if needed
+    // since it is implemented via a pointer.
+    // (see comment at top)
+
+    // Note: use DbMpoolFile::open()
+    // to get pointers to a DbMpoolFile,
+    // and call DbMpoolFile::close() rather than delete to release them.
+    //
+    DbMpoolFile();
+
+    // Shut g++ up.
+protected:
+    ~DbMpoolFile();
+
+private:
+    // no copying
+    DbMpoolFile(const DbMpoolFile &);
+    operator = (const DbMpoolFile &);
+
+    DEFINE_DB_CLASS(DbMpoolFile);
+};
+
+class _exported DbMpool
+{
+friend DbEnv;
+public:
+    int close();
+
+    // access to low level interface
+    // Normally this would be called register to parallel
+    // the C interface, but "register" is a reserved word.
+    //
+    int db_register(int ftype,
+                    int (*pgin)(db_pgno_t pgno, void *pgaddr, DBT *pgcookie),
+                    int (*pgout)(db_pgno_t pgno, void *pgaddr, DBT *pgcookie));
+
+    int stat(DB_MPOOL_STAT **gsp, DB_MPOOL_FSTAT ***fsp,
+             void *(*db_malloc)(size_t));
+    int sync(DbLsn *lsn);
+
+    // Create or remove new mpool files
+    //
+    static int open(const char *dir, int flags, int mode,
+                    DbEnv* dbenv, DbMpool **regionp);
+    static int unlink(const char *dir, int force, DbEnv* dbenv);
+
+private:
+    // We can add data to this class if needed
+    // since it is implemented via a pointer.
+    // (see comment at top)
+
+    // Note: use DbMpool::open() or DbEnv::get_mp_info()
+    // to get pointers to a DbMpool,
+    // and call DbMpool::close() rather than delete to release them.
+    //
+    DbMpool();
+    ~DbMpool();
+
+    // no copying
+    DbMpool(const DbMpool &);
+    DbMpool &operator = (const DbMpool &);
+
+    DEFINE_DB_CLASS(DbMpool);
+};
+
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//
+// Transaction classes
+//
+
+class _exported DbTxnMgr
+{
+friend DbEnv;
+public:
+    int begin(DbTxn *pid, DbTxn **tid);
+    int checkpoint(long kbyte, long min) const;
+    int close();
+    int stat(DB_TXN_STAT **statp, void *(*db_malloc)(size_t));
+
+    // Create or remove new txnmgr files
+    //
+    static int open(const char *dir, int flags, int mode,
+                    DbEnv* dbenv, DbTxnMgr **regionp);
+    static int unlink(const char *dir, int force, DbEnv* dbenv);
+
+private:
+    // We can add data to this class if needed
+    // since it is implemented via a pointer.
+    // (see comment at top)
+
+    // Note: use DbTxnMgr::open() or DbEnv::get_tx_info()
+    // to get pointers to a DbTxnMgr,
+    // and call DbTxnMgr::close() rather than delete to release them.
+    //
+    DbTxnMgr();
+    ~DbTxnMgr();
+
+    // no copying
+    DbTxnMgr(const DbTxnMgr &);
+    operator = (const DbTxnMgr &);
+
+    DEFINE_DB_CLASS(DbTxnMgr);
+};
+
+class _exported DbTxn
+{
+friend DbTxnMgr;
+public:
+    int abort();
+    int commit();
+    u_int32_t id();
+    int prepare();
+
+private:
+    // We can add data to this class if needed
+    // since it is implemented via a pointer.
+    // (see comment at top)
+
+    // Note: use DbTxnMgr::begin() to get pointers to a DbTxn,
+    // and call DbTxn::abort() or DbTxn::commit rather than
+    // delete to release them.
+    //
+    DbTxn();
+    ~DbTxn();
+
+    // no copying
+    DbTxn(const DbTxn &);
+    operator = (const DbTxn &);
+
+    DEFINE_DB_CLASS(DbTxn);
+};
+
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//
+// Application classes
+//
+
+//
+// A set of application options - define how this application uses
+// the db library.
+//
+class _exported DbInfo : protected DB_INFO
+{
+    friend DbEnv;
+    friend Db;
+
+public:
+    DbInfo();
+    ~DbInfo();
+
+    // Byte order.
+    int	get_lorder() const;
+    void set_lorder(int);
+
+    // Underlying cache size.
+    size_t get_cachesize() const;
+    void set_cachesize(size_t);
+
+    // Underlying page size.
+    size_t get_pagesize() const;
+    void set_pagesize(size_t);
+
+    // Local heap allocation.
+    typedef void *(*db_malloc_fcn)(size_t);
+    db_malloc_fcn get_malloc() const;
+    void set_malloc(db_malloc_fcn);
+
+    ////////////////////////////////////////////////////////////////
+    // Btree access method.
+
+    // Maximum keys per page.
+    int	get_bt_maxkey() const;
+    void set_bt_maxkey(int);
+
+    // Minimum keys per page.
+    int	get_bt_minkey() const;
+    void set_bt_minkey(int);
+
+    // Comparison function.
+    typedef int (*bt_compare_fcn)(const DBT *, const DBT *);
+    bt_compare_fcn get_bt_compare() const;
+    void set_bt_compare(bt_compare_fcn);
+
+    // Prefix function.
+    typedef size_t (*bt_prefix_fcn)(const DBT *, const DBT *);
+    bt_prefix_fcn get_bt_prefix() const;
+    void set_bt_prefix(bt_prefix_fcn);
+
+    ////////////////////////////////////////////////////////////////
+    // Hash access method.
+
+    // Fill factor.
+    unsigned int get_h_ffactor() const;
+    void set_h_ffactor(unsigned int);
+
+    // Number of elements.
+    unsigned int get_h_nelem() const;
+    void set_h_nelem(unsigned int);
+
+    // Hash function.
+    typedef u_int32_t (*h_hash_fcn)(const void *, u_int32_t);
+    h_hash_fcn get_h_hash() const;
+    void set_h_hash(h_hash_fcn);
+
+    ////////////////////////////////////////////////////////////////
+    // Recno access method.
+
+    // Fixed-length padding byte.
+    int	get_re_pad() const;
+    void set_re_pad(int);
+
+    // Variable-length delimiting byte.
+    int	get_re_delim() const;
+    void set_re_delim(int);
+
+    // Length for fixed-length records.
+    u_int32_t get_re_len() const;
+    void set_re_len(u_int32_t);
+
+    // Source file name.
+    char *get_re_source() const;
+    void set_re_source(char *);
+
+    // Note: some flags are set as side effects of calling
+    // above "set" methods.
+    //
+    u_int32_t get_flags() const;
+    void set_flags(u_int32_t);
+
+
+    // (deep) copying of this object is allowed.
+    //
+    DbInfo(const DbInfo &);
+    DbInfo &operator = (const DbInfo &);
+
+private:
+    // We can add data to this class if needed
+    // since parent class is not allocated by db.
+    // (see comment at top)
+};
+
+//
+// Base application class.  Provides functions for opening a database.
+// User of this library can use this class as a starting point for
+// developing a DB application - derive their application class from
+// this one, add application control logic.
+//
+// Note that if you use the default constructor, you must explicitly
+// call appinit() before any other db activity (e.g. opening files)
+//
+class _exported DbEnv : protected DB_ENV
+{
+friend DbTxnMgr;
+friend DbLog;
+friend DbLockTab;
+friend DbMpool;
+friend Db;
+
+public:
+
+    ~DbEnv();
+
+    // This constructor can be used to immediately initialize the
+    // application with these arguments.  Do not use it if you
+    // need to set other parameters via the access methods.
+    //
+    DbEnv(const char *homeDir, char *const *db_config, int flags);
+
+    // Use this constructor if you wish to *delay* the initialization
+    // of the db library.  This is useful if you need to set
+    // any particular parameters via the access methods below.
+    // Then call appinit() to complete the initialization.
+    //
+    DbEnv();
+
+    // Used in conjunction with the default constructor to
+    // complete the initialization of the db library.
+    //
+    int appinit(const char *homeDir, char *const *db_config, int flags);
+
+    ////////////////////////////////////////////////////////////////
+    // simple get/set access methods
+    //
+    // If you are calling set_ methods, you need to
+    // use the default constructor along with appinit().
+
+    // Byte order.
+    int	get_lorder() const;
+    void set_lorder(int);
+
+    // Error message callback.
+    typedef void (*db_errcall_fcn)(const char *, char *);
+    db_errcall_fcn get_errcall() const;
+    void set_errcall(db_errcall_fcn);
+
+    // Error message file stream.
+    FILE *get_errfile() const;
+    void set_errfile(FILE *);
+
+    // Error message prefix.
+    const char *get_errpfx() const;
+    void set_errpfx(const char *);
+
+    // Generate debugging messages.
+    int get_verbose() const;
+    void set_verbose(int);
+
+    ////////////////////////////////////////////////////////////////
+    // User paths.
+
+    // Database home.
+    char *get_home() const;
+    void set_home(char *);
+
+    // Database log file directory.
+    char *get_log_dir() const;
+    void set_log_dir(char *);
+
+    // Database tmp file directory.
+    char *get_tmp_dir() const;
+    void set_tmp_dir(char *);
+
+    // Database data file directories.
+    char **get_data_dir() const;
+    void set_data_dir(char **);
+
+    // Database data file slots.
+    int get_data_cnt() const;
+    void set_data_cnt(int);
+
+    // Next Database data file slot.
+    int get_data_next() const;
+    void set_data_next(int);
+
+
+    ////////////////////////////////////////////////////////////////
+    // Locking.
+
+    // Return from lock_open().
+    DbLockTab *get_lk_info() const;
+
+    // Two dimensional conflict matrix.
+    u_int8_t *get_lk_conflicts() const;
+    void set_lk_conflicts(u_int8_t *);
+
+    // Number of lock modes in table.
+    int get_lk_modes() const;
+    void set_lk_modes(int);
+
+    // Maximum number of locks.
+    unsigned int get_lk_max() const;
+    void set_lk_max(unsigned int);
+
+    // Deadlock detect on every conflict.
+    u_int32_t get_lk_detect() const;
+    void set_lk_detect(u_int32_t);
+
+    // Yield function for threads.
+    typedef int (*db_yield_fcn) (void);
+    db_yield_fcn get_yield() const;
+    void set_yield(db_yield_fcn);
+
+
+    ////////////////////////////////////////////////////////////////
+    // Logging.
+
+    // Return from log_open().
+    DbLog *get_lg_info() const;
+
+    // Maximum file size.
+    u_int32_t get_lg_max() const;
+    void set_lg_max(u_int32_t);
+
+
+    ////////////////////////////////////////////////////////////////
+    // Memory pool.
+
+    // Return from memp_open().
+    DbMpool *get_mp_info() const;
+
+    // Maximum file size for mmap.
+    size_t get_mp_mmapsize() const;
+    void set_mp_mmapsize(size_t);
+
+    // Bytes in the mpool cache.
+    size_t get_mp_size() const;
+    void set_mp_size(size_t);
+
+
+    ////////////////////////////////////////////////////////////////
+    // Transactions.
+
+    // Return from txn_open().
+    DbTxnMgr *get_tx_info() const;
+
+    // Maximum number of transactions.
+    unsigned int get_tx_max() const;
+    void set_tx_max(unsigned int);
+
+    // Dispatch function for recovery.
+    typedef int (*tx_recover_fcn)(DB_LOG *, DBT *, DB_LSN *, int, void *);
+    tx_recover_fcn get_tx_recover() const;
+    void set_tx_recover(tx_recover_fcn);
+
+    // Flags.
+    u_int32_t get_flags() const;
+    void set_flags(u_int32_t);
+
+    ////////////////////////////////////////////////////////////////
+    // The default error model is to throw an exception whenever
+    // an error occurs.  This generally allows for cleaner logic
+    // for transaction processing, as a try block can surround a
+    // single transaction.  Alternatively, since almost every method
+    // returns an error code (errno), the error model can be set to
+    // not throw exceptions, and instead return the appropriate code.
+    //
+    enum ErrorModel { Exception, ErrorReturn };
+    void set_error_model(ErrorModel);
+    ErrorModel get_error_model() const;
+
+    // If an error is detected and the error call function
+    // or stream is set, a message is dispatched or printed.
+    // If a prefix is set, each message is prefixed.
+    //
+    // You can use set_errcall() or set_errfile() above to control
+    // error functionality using a C model.  Alternatively, you can
+    // call set_error_stream() to force all errors to a C++ stream.
+    // It is unwise to mix these approaches.
+    //
+    class ostream* get_error_stream() const;
+    void set_error_stream(class ostream*);
+
+    // used internally
+    static int runtime_error(const char *caller, int err, int in_destructor = 0);
+
+private:
+    // We can add data to this class if needed
+    // since parent class is not allocated by db.
+    // (see comment at top)
+
+    // no copying
+    DbEnv(const DbEnv &);
+    operator = (const DbEnv &);
+
+    ErrorModel error_model_;
+    static void stream_error_function(const char *, char *);
+    static ostream *error_stream_;
+};
+
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//
+// Table access classes
+//
+
+//
+// Represents a database table = a set of keys with associated values.
+//
+class _exported Db
+{
+    friend DbEnv;
+
+public:
+    int close(int flags);
+    int cursor(DbTxn *txnid, Dbc **cursorp);
+    int del(Dbt *key, DbTxn *txnid);
+    int fd(int *fdp);
+    int get(DbTxn *txnid, Dbt *key, Dbt *data, int flags);
+    int put(DbTxn *txnid, Dbt *key, Dbt *data, int flags);
+    int stat(void *sp, void *(*db_malloc)(size_t), int flags);
+    int sync(int flags);
+
+    DBTYPE get_type() const;
+
+    static int open(const char *fname, DBTYPE type, int flags,
+                    int mode, DbEnv *dbenv, DbInfo *info, Db **dbpp);
+
+private:
+    // We can add data to this class if needed
+    // since it is implemented via a pointer.
+    // (see comment at top)
+
+    // Note: use Db::open() to get initialize pointers to a Db,
+    // and call Db::close() rather than delete to release them.
+    Db();
+    ~Db();
+
+    // no copying
+    Db(const Db &);
+    Db &operator = (const Db &);
+
+    DEFINE_DB_CLASS(Db);
+};
+
+//
+// A chunk of data, maybe a key or value.
+//
+class _exported Dbt : private DBT
+{
+    friend Dbc;
+    friend Db;
+    friend DbLog;
+    friend DbMpoolFile;
+    friend DbLockTab;
+
+public:
+
+    // key/data
+    void *get_data() const;
+    void set_data(void *);
+
+    // key/data length
+    u_int32_t get_size() const;
+    void set_size(u_int32_t);
+
+    // RO: length of user buffer.
+    u_int32_t get_ulen() const;
+    void set_ulen(u_int32_t);
+
+    // RO: get/put record length.
+    u_int32_t get_dlen() const;
+    void set_dlen(u_int32_t);
+
+    // RO: get/put record offset.
+    u_int32_t get_doff() const;
+    void set_doff(u_int32_t);
+
+    // flags
+    u_int32_t get_flags() const;
+    void set_flags(u_int32_t);
+
+    Dbt(void *data, size_t size);
+    Dbt();
+    ~Dbt();
+    Dbt(const Dbt &);
+    Dbt &operator = (const Dbt &);
+
+private:
+    // We can add data to this class if needed
+    // since parent class is not allocated by db.
+    // (see comment at top)
+};
+
+class _exported Dbc : protected DBC
+{
+    friend Db;
+
+public:
+    int close();
+    int del(int flags);
+    int get(Dbt* key, Dbt *data, int flags);
+    int put(Dbt* key, Dbt *data, int flags);
+
+private:
+    // No data is permitted in this class (see comment at top)
+
+    // Note: use Db::cursor() to get pointers to a Dbc,
+    // and call Dbc::close() rather than delete to release them.
+    //
+    Dbc();
+    ~Dbc();
+
+    // no copying
+    Dbc(const Dbc &);
+    Dbc &operator = (const Dbc &);
+};
+
+#endif /* !_DB_CXX_H_ */