]> git.sur5r.net Git - openldap/blobdiff - libraries/libmdb/mdb.c
Update DB tables on commit even if no dirty pages
[openldap] / libraries / libmdb / mdb.c
index 48e1ebbf6b5586ccb3131b3384fbba93656af750..70eac01bf06a035b0fcdf1ca17534d56c50154f9 100644 (file)
@@ -140,7 +140,7 @@ typedef struct MDB_page {           /* represents a page of storage */
 #define        mp_pgno         mp_p.p_pgno
        union padded {
                pgno_t          p_pgno;         /* page number */
-               void *          p_pad;
+               void *          p_align;        /* for IL32P64 */
        } mp_p;
 #define        P_BRANCH         0x01           /* branch page */
 #define        P_LEAF           0x02           /* leaf page */
@@ -460,6 +460,27 @@ mdb_version(int *maj, int *min, int *pat)
        return MDB_VERSION_STRING;
 }
 
+static const char *errstr[] = {
+       "MDB_KEYEXIST: Key/data pair already exists",
+       "MDB_NOTFOUND: No matching key/data pair found",
+       "MDB_PAGE_NOTFOUND: Requested page not found",
+       "MDB_CORRUPTED: Located page was wrong type",
+       "MDB_PANIC: Update of meta page failed",
+       "MDB_VERSION_MISMATCH: Database environment version mismatch"
+};
+
+char *
+mdb_strerror(int err)
+{
+       if (!err)
+               return ("Successful return: 0");
+
+       if (err >= MDB_KEYEXIST && err <= MDB_VERSION_MISMATCH)
+               return (char *)errstr[err - MDB_KEYEXIST];
+
+       return strerror(err);
+}
+
 int
 mdb_cmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b)
 {
@@ -778,9 +799,8 @@ mdb_txn_commit(MDB_txn *txn)
        env = txn->mt_env;
 
        if (F_ISSET(txn->mt_flags, MDB_TXN_RDONLY)) {
-               DPRINTF("attempt to commit read-only transaction");
                mdb_txn_abort(txn);
-               return EPERM;
+               return MDB_SUCCESS;
        }
 
        if (txn != env->me_txn) {
@@ -929,8 +949,9 @@ mdb_txn_commit(MDB_txn *txn)
                mdb_txn_abort(txn);
                return n;
        }
-       env->me_txn = NULL;
 
+done:
+       env->me_txn = NULL;
        /* update the DB tables */
        {
                int toggle = !env->me_db_toggle;
@@ -956,7 +977,6 @@ mdb_txn_commit(MDB_txn *txn)
        free(txn);
        txn = NULL;
 
-done:
        mdb_txn_abort(txn);
 
        return MDB_SUCCESS;
@@ -3161,6 +3181,19 @@ mdb_put(MDB_txn *txn, MDB_dbi dbi,
        return mdb_put0(txn, dbi, key, data, flags);
 }
 
+int
+mdb_env_set_flags(MDB_env *env, unsigned int flag, int onoff)
+{
+#define        CHANGEABLE      (MDB_NOSYNC)
+       if ((flag & CHANGEABLE) != flag)
+               return EINVAL;
+       if (onoff)
+               env->me_flags |= flag;
+       else
+               env->me_flags &= ~flag;
+       return MDB_SUCCESS;
+}
+
 int
 mdb_env_get_flags(MDB_env *env, unsigned int *arg)
 {