Start DB restructuring

vmware
Howard Chu 14 years ago
parent 194334b2f7
commit cb45191793
  1. 49
      libraries/libmdb/mdb.c
  2. 21
      libraries/libmdb/mdb.h

@ -188,9 +188,9 @@ SLIST_HEAD(page_stack, MDB_ppage);
#define CURSOR_PUSH(c,p) SLIST_INSERT_HEAD(&(c)->mc_stack, p, mp_entry) #define CURSOR_PUSH(c,p) SLIST_INSERT_HEAD(&(c)->mc_stack, p, mp_entry)
struct MDB_cursor { struct MDB_cursor {
MDB_db *mc_db;
MDB_txn *mc_txn; MDB_txn *mc_txn;
struct page_stack mc_stack; /* stack of parent pages */ struct page_stack mc_stack; /* stack of parent pages */
MDB_dbi mc_dbi;
short mc_initialized; /* 1 if initialized */ short mc_initialized; /* 1 if initialized */
short mc_eof; /* 1 if end is reached */ short mc_eof; /* 1 if end is reached */
}; };
@ -211,6 +211,24 @@ typedef struct MDB_node {
char mn_data[1]; char mn_data[1];
} MDB_node; } 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 { struct MDB_txn {
pgno_t mt_root; /* current / new root page */ pgno_t mt_root; /* current / new root page */
pgno_t mt_next_pgno; /* next unallocated page */ pgno_t mt_next_pgno; /* next unallocated page */
@ -222,29 +240,16 @@ struct MDB_txn {
struct dirty_queue *dirty_queue; /* modified pages */ struct dirty_queue *dirty_queue; /* modified pages */
MDB_reader *reader; MDB_reader *reader;
} mt_u; } 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_RDONLY 0x01 /* read-only transaction */
#define MDB_TXN_ERROR 0x02 /* an error has occurred */ #define MDB_TXN_ERROR 0x02 /* an error has occurred */
#define MDB_TXN_METOGGLE 0x04 /* used meta page 1 */ #define MDB_TXN_METOGGLE 0x04 /* used meta page 1 */
unsigned int mt_flags; 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 { struct MDB_env {
int me_fd; int me_fd;
int me_lfd; int me_lfd;
@ -253,7 +258,6 @@ struct MDB_env {
char *me_path; char *me_path;
char *me_map; char *me_map;
MDB_txninfo *me_txns; MDB_txninfo *me_txns;
MDB_db me_db; /* first DB */
MDB_meta me_meta; MDB_meta me_meta;
MDB_txn *me_txn; /* current write transaction */ MDB_txn *me_txn; /* current write transaction */
size_t me_mapsize; size_t me_mapsize;
@ -261,6 +265,9 @@ struct MDB_env {
pthread_key_t me_txkey; /* thread-key for readers */ pthread_key_t me_txkey; /* thread-key for readers */
MDB_oldpages *me_pghead; MDB_oldpages *me_pghead;
MDB_oldpages *me_pgtail; 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) #define NODESIZE offsetof(MDB_node, mn_data)
@ -2557,10 +2564,10 @@ mdbenv_stat(MDB_env *env, MDB_stat *arg)
return MDB_SUCCESS; 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) { if (!name) {
*db = (MDB_db *)&txn->mt_env->me_db; *dbi = 0;
return MDB_SUCCESS; return MDB_SUCCESS;
} }
return EINVAL; return EINVAL;

@ -5,14 +5,14 @@
struct MDB_cursor; struct MDB_cursor;
struct MDB_txn; struct MDB_txn;
struct MDB_db;
struct MDB_env; struct MDB_env;
typedef struct MDB_cursor MDB_cursor; typedef struct MDB_cursor MDB_cursor;
typedef struct MDB_txn MDB_txn; typedef struct MDB_txn MDB_txn;
typedef struct MDB_db MDB_db;
typedef struct MDB_env MDB_env; typedef struct MDB_env MDB_env;
typedef unsigned int MDB_dbi;
typedef struct MDB_val { typedef struct MDB_val {
void *mv_data; void *mv_data;
size_t mv_size; 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_set_maxreaders(MDB_env *env, int readers);
int mdbenv_get_maxreaders(MDB_env *env, int *readers); int mdbenv_get_maxreaders(MDB_env *env, int *readers);
int mdbenv_sync(MDB_env *env); 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_begin(MDB_env *env, int rdonly, MDB_txn **txn);
int mdb_txn_commit(MDB_txn *txn); int mdb_txn_commit(MDB_txn *txn);
void mdb_txn_abort(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_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi);
int mdb_stat(MDB_db *db, MDB_stat *stat); int mdb_stat(MDB_txn *txn, MDB_dbi dbi, MDB_stat *stat);
void mdb_close(MDB_db *db); 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_get(MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data);
int mdb_put(MDB_db *db, MDB_txn *txn, MDB_val *key, MDB_val *data, int mdb_put(MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data,
unsigned int flags); 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); void mdb_cursor_close(MDB_cursor *cursor);
int mdb_cursor_get(MDB_cursor *cursor, MDB_val *key, MDB_val *data, int mdb_cursor_get(MDB_cursor *cursor, MDB_val *key, MDB_val *data,
MDB_cursor_op op); 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_ */ #endif /* _MDB_H_ */

Loading…
Cancel
Save