]> git.sur5r.net Git - openldap/commitdiff
Renumber MDB_NOSUBDIR. Check mdb_env_open() flags.
authorHallvard Furuseth <hallvard@openldap.org>
Tue, 27 Nov 2012 22:56:47 +0000 (23:56 +0100)
committerHallvard Furuseth <hallvard@openldap.org>
Tue, 27 Nov 2012 23:59:00 +0000 (00:59 +0100)
MDB_NOSUBDIR was == MDB_REVERSEKEY. That affected the freelist:
Env flags are stored in mm_flags alias mm_dbs[FREE_DBI].md_flags.

It stays a persistent flag, in case mdb_env_open someday wants
to pick/verify which lockfile to use with the datafile.

Catch bad flags so they will no longer make it into the data file.

libraries/libmdb/mdb.c
libraries/libmdb/mdb.h

index e1a8689efcbad0eeddf9399a69e17587ded3d471..6771829152e390188632675ee78e95d941a2713e 100644 (file)
@@ -3146,6 +3146,12 @@ fail:
 #define DATANAME       "/data.mdb"
        /** The suffix of the lock file when no subdir is used */
 #define LOCKSUFF       "-lock"
+       /** Only a subset of the @ref mdb_env flags can be changed
+        *      at runtime. Changing other flags requires closing the
+        *      environment and re-opening it with the new flags.
+        */
+#define        CHANGEABLE      (MDB_NOSYNC|MDB_NOMETASYNC|MDB_MAPASYNC)
+#define        CHANGELESS      (MDB_FIXEDMAP|MDB_NOSUBDIR|MDB_RDONLY|MDB_WRITEMAP)
 
 int
 mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mode_t mode)
@@ -3153,7 +3159,7 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mode_t mode)
        int             oflags, rc, len, excl;
        char *lpath, *dpath;
 
-       if (env->me_fd != INVALID_HANDLE_VALUE)
+       if (env->me_fd!=INVALID_HANDLE_VALUE || (flags & ~(CHANGEABLE|CHANGELESS)))
                return EINVAL;
 
        len = strlen(path);
@@ -6599,11 +6605,6 @@ mdb_put(MDB_txn *txn, MDB_dbi dbi,
        return mdb_cursor_put(&mc, key, data, flags);
 }
 
-/** Only a subset of the @ref mdb_env flags can be changed
- *     at runtime. Changing other flags requires closing the environment
- *     and re-opening it with the new flags.
- */
-#define        CHANGEABLE      (MDB_NOSYNC|MDB_NOMETASYNC|MDB_MAPASYNC)
 int
 mdb_env_set_flags(MDB_env *env, unsigned int flag, int onoff)
 {
index e3fc1298298ad31621efb69eb7cb782cd7ac2634..e31459563343bcdaa447bd1cae74d6f75d88cfe1 100644 (file)
@@ -213,12 +213,14 @@ typedef int  (MDB_cmp_func)(const MDB_val *a, const MDB_val *b);
 typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *relctx);
 
 /** @defgroup  mdb_env Environment Flags
+ *
+ *     Values do not overlap Database Flags.
  *     @{
  */
        /** mmap at a fixed address */
 #define MDB_FIXEDMAP   0x01
        /** no environment directory */
-#define MDB_NOSUBDIR   0x02
+#define MDB_NOSUBDIR   0x4000
        /** don't fsync after commit */
 #define MDB_NOSYNC             0x10000
        /** read only */
@@ -232,6 +234,8 @@ typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *rel
 /** @} */
 
 /**    @defgroup       mdb_open        Database Flags
+ *
+ *     Values do not overlap Environment Flags.
  *     @{
  */
        /** use reverse string keys */