]> git.sur5r.net Git - openldap/blobdiff - libraries/libmdb/mdb.c
Cleanup, add mdb_cursor_count()
[openldap] / libraries / libmdb / mdb.c
index b77bd38f006a8af601bfb8b9162e1ae73b1a6a41..53e5dde8f86359780343a171edf88f21d2339c53 100644 (file)
@@ -1029,7 +1029,8 @@ mdbenv_write_meta(MDB_txn *txn)
        assert(txn != NULL);
        assert(txn->mt_env != NULL);
 
-       DPRINTF("writing meta page for root page %lu", txn->mt_dbs[MAIN_DBI].md_root);
+       DPRINTF("writing meta page %d for root page %lu",
+               !F_ISSET(txn->mt_flags, MDB_TXN_METOGGLE), txn->mt_dbs[MAIN_DBI].md_root);
 
        env = txn->mt_env;
 
@@ -1125,7 +1126,7 @@ mdbenv_get_maxreaders(MDB_env *env, int *readers)
        return MDB_SUCCESS;
 }
 
-int
+static int
 mdbenv_open2(MDB_env *env, unsigned int flags)
 {
        int i, newenv = 0;
@@ -1659,7 +1660,7 @@ mdb_get(MDB_txn *txn, MDB_dbi dbi,
        assert(data);
        DPRINTF("===> get key [%.*s]", (int)key->mv_size, (char *)key->mv_data);
 
-       if (txn == NULL || dbi >= txn->mt_numdbs)
+       if (txn == NULL || !dbi || dbi >= txn->mt_numdbs)
                return EINVAL;
 
        if (key->mv_size == 0 || key->mv_size > MAXKEYSIZE) {
@@ -2345,6 +2346,23 @@ mdb_cursor_open(MDB_txn *txn, MDB_dbi dbi, MDB_cursor **ret)
        return MDB_SUCCESS;
 }
 
+/* Return the count of duplicate data items for the current key */
+int
+mdb_cursor_count(MDB_cursor *mc, unsigned long *countp)
+{
+       if (mc == NULL || countp == NULL)
+               return EINVAL;
+
+       if (!(mc->mc_txn->mt_dbs[mc->mc_dbi].md_flags & MDB_DUPSORT))
+               return EINVAL;
+
+       if (!mc->mc_xcursor->mx_cursor.mc_initialized)
+               return EINVAL;
+
+       *countp = mc->mc_xcursor->mx_txn.mt_dbs[mc->mc_xcursor->mx_cursor.mc_dbi].md_entries;
+       return MDB_SUCCESS;
+}
+
 void
 mdb_cursor_close(MDB_cursor *cursor)
 {
@@ -2673,7 +2691,7 @@ mdb_del(MDB_txn *txn, MDB_dbi dbi,
 
        assert(key != NULL);
 
-       if (txn == NULL || dbi >= txn->mt_numdbs)
+       if (txn == NULL || !dbi || dbi >= txn->mt_numdbs)
                return EINVAL;
 
        if (F_ISSET(txn->mt_flags, MDB_TXN_RDONLY)) {
@@ -3035,7 +3053,7 @@ mdb_put(MDB_txn *txn, MDB_dbi dbi,
        assert(key != NULL);
        assert(data != NULL);
 
-       if (txn == NULL || dbi >= txn->mt_numdbs)
+       if (txn == NULL || !dbi || dbi >= txn->mt_numdbs)
                return EINVAL;
 
        if (F_ISSET(txn->mt_flags, MDB_TXN_RDONLY)) {
@@ -3072,20 +3090,25 @@ mdbenv_get_path(MDB_env *env, const char **arg)
        return MDB_SUCCESS;
 }
 
+static int
+mdb_stat0(MDB_env *env, MDB_db *db, MDB_stat *arg)
+{
+       arg->ms_psize = env->me_psize;
+       arg->ms_depth = db->md_depth;
+       arg->ms_branch_pages = db->md_branch_pages;
+       arg->ms_leaf_pages = db->md_leaf_pages;
+       arg->ms_overflow_pages = db->md_overflow_pages;
+       arg->ms_entries = db->md_entries;
+
+       return MDB_SUCCESS;
+}
 int
 mdbenv_stat(MDB_env *env, MDB_stat *arg)
 {
        if (env == NULL || arg == NULL)
                return EINVAL;
 
-       arg->ms_psize = env->me_psize;
-       arg->ms_depth = env->me_meta->mm_dbs[MAIN_DBI].md_depth;
-       arg->ms_branch_pages = env->me_meta->mm_dbs[MAIN_DBI].md_branch_pages;
-       arg->ms_leaf_pages = env->me_meta->mm_dbs[MAIN_DBI].md_leaf_pages;
-       arg->ms_overflow_pages = env->me_meta->mm_dbs[MAIN_DBI].md_overflow_pages;
-       arg->ms_entries = env->me_meta->mm_dbs[MAIN_DBI].md_entries;
-
-       return MDB_SUCCESS;
+       return mdb_stat0(env, &env->me_meta->mm_dbs[MAIN_DBI], arg);
 }
 
 int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi)
@@ -3150,17 +3173,10 @@ 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 *arg)
 {
-       if (txn == NULL || arg == NULL)
+       if (txn == NULL || arg == NULL || dbi >= txn->mt_numdbs)
                return EINVAL;
 
-       arg->ms_psize = txn->mt_env->me_psize;
-       arg->ms_depth = txn->mt_dbs[dbi].md_depth;
-       arg->ms_branch_pages = txn->mt_dbs[dbi].md_branch_pages;
-       arg->ms_leaf_pages = txn->mt_dbs[dbi].md_leaf_pages;
-       arg->ms_overflow_pages = txn->mt_dbs[dbi].md_overflow_pages;
-       arg->ms_entries = txn->mt_dbs[dbi].md_entries;
-
-       return MDB_SUCCESS;
+       return mdb_stat0(txn->mt_env, &txn->mt_dbs[dbi], arg);
 }
 
 void mdb_close(MDB_txn *txn, MDB_dbi dbi)
@@ -3173,3 +3189,30 @@ void mdb_close(MDB_txn *txn, MDB_dbi dbi)
        txn->mt_dbxs[dbi].md_name.mv_size = 0;
        free(ptr);
 }
+
+int mdb_set_compare(MDB_txn *txn, MDB_dbi dbi, MDB_cmp_func *cmp)
+{
+       if (txn == NULL || !dbi || dbi >= txn->mt_numdbs)
+               return EINVAL;
+
+       txn->mt_dbxs[dbi].md_cmp = cmp;
+       return MDB_SUCCESS;
+}
+
+int mdb_set_dupsort(MDB_txn *txn, MDB_dbi dbi, MDB_cmp_func *cmp)
+{
+       if (txn == NULL || !dbi || dbi >= txn->mt_numdbs)
+               return EINVAL;
+
+       txn->mt_dbxs[dbi].md_dcmp = cmp;
+       return MDB_SUCCESS;
+}
+
+int mdb_set_relfunc(MDB_txn *txn, MDB_dbi dbi, MDB_rel_func *rel)
+{
+       if (txn == NULL || !dbi || dbi >= txn->mt_numdbs)
+               return EINVAL;
+
+       txn->mt_dbxs[dbi].md_rel = rel;
+       return MDB_SUCCESS;
+}