#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 */
};
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 */
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;
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;
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)
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;
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;
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_ */