|
|
|
@ -6707,6 +6707,9 @@ mdb_default_cmp(MDB_txn *txn, MDB_dbi dbi) |
|
|
|
|
: ((f & MDB_REVERSEDUP) ? mdb_cmp_memnr : mdb_cmp_memn)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define PERSISTENT_FLAGS 0xffff |
|
|
|
|
#define VALID_FLAGS (MDB_REVERSEKEY|MDB_DUPSORT|MDB_INTEGERKEY|MDB_DUPFIXED|\ |
|
|
|
|
MDB_INTEGERDUP|MDB_REVERSEDUP|MDB_CREATE) |
|
|
|
|
int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi) |
|
|
|
|
{ |
|
|
|
|
MDB_val key, data; |
|
|
|
@ -6720,13 +6723,17 @@ int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi) |
|
|
|
|
mdb_default_cmp(txn, FREE_DBI); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((flags & VALID_FLAGS) != flags) |
|
|
|
|
return EINVAL; |
|
|
|
|
|
|
|
|
|
/* main DB? */ |
|
|
|
|
if (!name) { |
|
|
|
|
*dbi = MAIN_DBI; |
|
|
|
|
if (flags & (MDB_DUPSORT|MDB_REVERSEKEY|MDB_INTEGERKEY)) { |
|
|
|
|
if (flags & PERSISTENT_FLAGS) { |
|
|
|
|
uint16_t f2 = flags & PERSISTENT_FLAGS; |
|
|
|
|
/* make sure flag changes get committed */ |
|
|
|
|
if ((txn->mt_dbs[MAIN_DBI].md_flags | flags) != txn->mt_dbs[MAIN_DBI].md_flags) { |
|
|
|
|
txn->mt_dbs[MAIN_DBI].md_flags |= (flags & (MDB_DUPSORT|MDB_REVERSEKEY|MDB_INTEGERKEY)); |
|
|
|
|
if ((txn->mt_dbs[MAIN_DBI].md_flags | f2) != txn->mt_dbs[MAIN_DBI].md_flags) { |
|
|
|
|
txn->mt_dbs[MAIN_DBI].md_flags |= f2; |
|
|
|
|
txn->mt_flags |= MDB_TXN_DIRTY; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -6776,7 +6783,7 @@ int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi) |
|
|
|
|
data.mv_data = &dummy; |
|
|
|
|
memset(&dummy, 0, sizeof(dummy)); |
|
|
|
|
dummy.md_root = P_INVALID; |
|
|
|
|
dummy.md_flags = flags & 0xffff; |
|
|
|
|
dummy.md_flags = flags & PERSISTENT_FLAGS; |
|
|
|
|
rc = mdb_cursor_put(&mc, &key, &data, F_SUBDATA); |
|
|
|
|
dbflag = DB_DIRTY; |
|
|
|
|
} |
|
|
|
|