Start DB restructuring
authorHoward Chu <hyc@symas.com>
Wed, 3 Aug 2011 00:59:37 +0000 (17:59 -0700)
committerHoward Chu <hyc@symas.com>
Thu, 1 Sep 2011 23:17:06 +0000 (16:17 -0700)
libraries/libmdb/mdb.c
libraries/libmdb/mdb.h

index 20be7ea..8a1f351 100644 (file)
@@ -188,9 +188,9 @@ SLIST_HEAD(page_stack, MDB_ppage);
 #define CURSOR_PUSH(c,p)        SLIST_INSERT_HEAD(&(c)->mc_stack, p, mp_entry)
 
 struct MDB_cursor {
-       MDB_db          *mc_db;
        MDB_txn         *mc_txn;
        struct page_stack        mc_stack;              /* stack of parent pages */
+       MDB_dbi         mc_dbi;
        short           mc_initialized; /* 1 if initialized */
        short           mc_eof;         /* 1 if end is reached */
 };
@@ -211,6 +211,24 @@ typedef struct MDB_node {
        char            mn_data[1];
 } MDB_node;
 
+typedef struct MDB_dbx {
+       char            *md_name;
+       MDB_cmp_func    *md_cmp;                /* user compare function */
+       MDB_rel_func    *md_rel;                /* user relocate function */
+       MDB_db                  *md_parent;             /* parent tree */
+} MDB_dbx;
+
+typedef struct MDB_db {
+       uint32_t        md_pad;
+       uint16_t        md_flags;
+       uint16_t        md_depth;
+       ULONG           md_branch_pages;
+       ULONG           md_leaf_pages;
+       ULONG           md_overflow_pages;
+       ULONG           md_entries;
+       pgno_t          md_root;
+} MDB_db;
+
 struct MDB_txn {
        pgno_t          mt_root;                /* current / new root page */
        pgno_t          mt_next_pgno;   /* next unallocated page */
@@ -222,29 +240,16 @@ struct MDB_txn {
                struct dirty_queue      *dirty_queue;   /* modified pages */
                MDB_reader      *reader;
        } mt_u;
+       MDB_dbx         *mt_dbxs;               /* array */
+       MDB_db          **mt_dbs;               /* array of ptrs */
+       unsigned int    mt_numdbs;
+
 #define MDB_TXN_RDONLY          0x01           /* read-only transaction */
 #define MDB_TXN_ERROR           0x02           /* an error has occurred */
 #define MDB_TXN_METOGGLE       0x04            /* used meta page 1 */
        unsigned int             mt_flags;
 };
 
-struct MDB_db {
-       MDB_db          *md_next;
-       char            *md_name;
-       MDB_cmp_func    *md_cmp;                /* user compare function */
-       MDB_rel_func    *md_rel;                /* user relocate function */
-       MDB_db                  *md_parent;             /* parent tree */
-       MDB_env                 *md_env;
-       uint32_t        md_pad;
-       uint16_t        md_flags;
-       uint16_t        md_depth;
-       ULONG           md_branch_pages;
-       ULONG           md_leaf_pages;
-       ULONG           md_overflow_pages;
-       ULONG           md_entries;
-       pgno_t          md_root;
-};
-
 struct MDB_env {
        int                     me_fd;
        int                     me_lfd;
@@ -253,7 +258,6 @@ struct MDB_env {
        char            *me_path;
        char            *me_map;
        MDB_txninfo     *me_txns;
-       MDB_db          me_db;          /* first DB */
        MDB_meta        me_meta;
        MDB_txn         *me_txn;                /* current write transaction */
        size_t          me_mapsize;
@@ -261,6 +265,9 @@ struct MDB_env {
        pthread_key_t   me_txkey;       /* thread-key for readers */
        MDB_oldpages *me_pghead;
        MDB_oldpages *me_pgtail;
+       MDB_dbx         *me_dbxs;               /* array */
+       MDB_db          **me_dbs;               /* array of ptrs */
+       unsigned int    me_numdbs;
 };
 
 #define NODESIZE        offsetof(MDB_node, mn_data)
@@ -2557,10 +2564,10 @@ mdbenv_stat(MDB_env *env, MDB_stat *arg)
        return MDB_SUCCESS;
 }
 
-int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_db **db)
+int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi)
 {
        if (!name) {
-               *db = (MDB_db *)&txn->mt_env->me_db;
+               *dbi = 0;
                return MDB_SUCCESS;
        }
        return EINVAL;
index 4a9403d..14ee901 100644 (file)
@@ -5,14 +5,14 @@
 
 struct MDB_cursor;
 struct MDB_txn;
-struct MDB_db;
 struct MDB_env;
 
 typedef struct MDB_cursor MDB_cursor;
 typedef struct MDB_txn MDB_txn;
-typedef struct MDB_db MDB_db;
 typedef struct MDB_env MDB_env;
 
+typedef unsigned int   MDB_dbi;
+
 typedef struct MDB_val {
        void            *mv_data;
        size_t           mv_size;
@@ -64,26 +64,25 @@ int  mdbenv_set_mapsize(MDB_env *env, size_t size);
 int  mdbenv_set_maxreaders(MDB_env *env, int readers);
 int  mdbenv_get_maxreaders(MDB_env *env, int *readers);
 int  mdbenv_sync(MDB_env *env);
-int  mdbenv_compact(MDB_env *env);
 
 int  mdb_txn_begin(MDB_env *env, int rdonly, MDB_txn **txn);
 int  mdb_txn_commit(MDB_txn *txn);
 void mdb_txn_abort(MDB_txn *txn);
 
-int  mdb_open(MDB_env *env, MDB_txn *txn, const char *name, unsigned int flags, MDB_db **db);
-int  mdb_stat(MDB_db *db, MDB_stat *stat);
-void mdb_close(MDB_db *db);
+int  mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi);
+int  mdb_stat(MDB_txn *txn, MDB_dbi dbi, MDB_stat *stat);
+void mdb_close(MDB_txn *txn, MDB_dbi dbi);
 
-int  mdb_get(MDB_db *db, MDB_txn *txn, MDB_val *key, MDB_val *data);
-int  mdb_put(MDB_db *db, MDB_txn *txn, MDB_val *key, MDB_val *data,
+int  mdb_get(MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data);
+int  mdb_put(MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data,
                            unsigned int flags);
-int  mdb_del(MDB_db *db, MDB_txn *txn, MDB_val *key, MDB_val *data);
+int  mdb_del(MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data);
 
-int  mdb_cursor_open(MDB_db *db, MDB_txn *txn, MDB_cursor **cursor);
+int  mdb_cursor_open(MDB_txn *txn, MDB_dbi dbi, MDB_cursor **cursor);
 void mdb_cursor_close(MDB_cursor *cursor);
 int  mdb_cursor_get(MDB_cursor *cursor, MDB_val *key, MDB_val *data,
                            MDB_cursor_op op);
 
-int  mdb_cmp(MDB_db *db, const MDB_val *a, const MDB_val *b);
+int  mdb_cmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b);
 
 #endif /* _MDB_H_ */