]> git.sur5r.net Git - openldap/commitdiff
Use new Append support
authorHoward Chu <hyc@openldap.org>
Sat, 21 Jul 2012 13:21:56 +0000 (06:21 -0700)
committerHoward Chu <hyc@openldap.org>
Sat, 21 Jul 2012 13:21:56 +0000 (06:21 -0700)
servers/slapd/back-mdb/back-mdb.h
servers/slapd/back-mdb/dn2id.c
servers/slapd/back-mdb/id2entry.c
servers/slapd/back-mdb/idl.c
servers/slapd/back-mdb/index.c
servers/slapd/back-mdb/nextid.c
servers/slapd/back-mdb/proto-mdb.h

index e4b6d7e2a89f83aeb83034d6c9aca30579dcb8ad..5152142177b3a7f8955eaf948ce990ad4a60e8c6 100644 (file)
@@ -69,6 +69,7 @@ struct mdb_info {
        int                     mi_dbenv_mode;
 
        size_t          mi_mapsize;
+       ID                      mi_nextid;
 
        slap_mask_t     mi_defaultmask;
        int                     mi_nattrs;
index 3cb64c33aafd6f34822a967745650cb2b151976a..977f2d2d020bebe203cc9bc4e1d1e8c9f960887e 100644 (file)
@@ -137,7 +137,7 @@ mdb_dn2id_add(
                memcpy( ptr, &pid, sizeof( ID ));
                d->nrdnlen[0] ^= 0x80;
 
-               if (slapMode & SLAP_TOOL_MODE)
+               if ((slapMode & SLAP_TOOL_MODE) || (e->e_id == mdb->mi_nextid))
                        flag |= MDB_APPEND;
                rc = mdb_cursor_put( mcd, &key, &data, flag );
        }
index 863ccf6c1f0d58d57eb07d146c914fcf551b5de5..29ff9c80ed0203933c2757707746277b328c3ac5 100644 (file)
@@ -60,6 +60,9 @@ static int mdb_id2entry_put(
 
        flag |= MDB_RESERVE;
 
+       if (e->e_id < mdb->mi_nextid)
+               flag &= ~MDB_APPEND;
+
 again:
        data.mv_size = ec.len;
        if ( mc )
@@ -74,7 +77,7 @@ again:
        if (rc) {
                /* Was there a hole from slapadd? */
                if ( (flag & MDB_NOOVERWRITE) && data.mv_size == 0 ) {
-                       flag ^= ADD_FLAGS;
+                       flag &= ~ADD_FLAGS;
                        goto again;
                }
                Debug( LDAP_DEBUG_ANY,
index 227c9802f99433adc8c2a2f37805bc98b22d14f8..78ad09956b4571132f4f037456fa2be2fe27d002 100644 (file)
@@ -391,10 +391,12 @@ mdb_idl_fetch_key(
 
 int
 mdb_idl_insert_keys(
+       BackendDB       *be,
        MDB_cursor      *cursor,
        struct berval *keys,
        ID                      id )
 {
+       struct mdb_info *mdb = be->be_private;
        MDB_val key, data;
        ID lo, hi, *i;
        char *err;
@@ -490,8 +492,8 @@ mdb_idl_insert_keys(
                                }
                        } else {
                        /* There's room, just store it */
-                               if ( slapMode & SLAP_TOOL_QUICK )
-                                       flag |= MDB_APPEND;
+                               if (id == mdb->mi_nextid)
+                                       flag |= MDB_APPENDDUP;
                                goto put1;
                        }
                } else {
@@ -518,7 +520,7 @@ mdb_idl_insert_keys(
                        }
                }
        } else if ( rc == MDB_NOTFOUND ) {
-               flag &= ~MDB_APPEND;
+               flag &= ~MDB_APPENDDUP;
 put1:  data.mv_data = &id;
                data.mv_size = sizeof(ID);
                rc = mdb_cursor_put( cursor, &key, &data, flag );
@@ -542,6 +544,7 @@ fail:
 
 int
 mdb_idl_delete_keys(
+       BackendDB       *be,
        MDB_cursor      *cursor,
        struct berval *keys,
        ID                      id )
index 6acdfc09ee1a9037cf277d49f656d2d3975497fd..8306dbd691114510d5060d88d8526d3a91bc0a02 100644 (file)
@@ -200,7 +200,7 @@ static int indexer(
                keyfunc = mdb_idl_delete_keys;
 
        if( IS_SLAP_INDEX( mask, SLAP_INDEX_PRESENT ) ) {
-               rc = keyfunc( mc, presence_key, id );
+               rc = keyfunc( op->o_bd, mc, presence_key, id );
                if( rc ) {
                        err = "presence";
                        goto done;
@@ -216,7 +216,7 @@ static int indexer(
                        atname, vals, &keys, op->o_tmpmemctx );
 
                if( rc == LDAP_SUCCESS && keys != NULL ) {
-                       rc = keyfunc( mc, keys, id );
+                       rc = keyfunc( op->o_bd, mc, keys, id );
                        ber_bvarray_free_x( keys, op->o_tmpmemctx );
                        if ( rc ) {
                                err = "equality";
@@ -235,7 +235,7 @@ static int indexer(
                        atname, vals, &keys, op->o_tmpmemctx );
 
                if( rc == LDAP_SUCCESS && keys != NULL ) {
-                       rc = keyfunc( mc, keys, id );
+                       rc = keyfunc( op->o_bd, mc, keys, id );
                        ber_bvarray_free_x( keys, op->o_tmpmemctx );
                        if ( rc ) {
                                err = "approx";
@@ -255,7 +255,7 @@ static int indexer(
                        atname, vals, &keys, op->o_tmpmemctx );
 
                if( rc == LDAP_SUCCESS && keys != NULL ) {
-                       rc = keyfunc( mc, keys, id );
+                       rc = keyfunc( op->o_bd, mc, keys, id );
                        ber_bvarray_free_x( keys, op->o_tmpmemctx );
                        if( rc ) {
                                err = "substr";
index d4ce5e34a3276a34a996f510b766767e2b79fc35..8d39764664308e525a2264335bcc23aff2b1cd20 100644 (file)
@@ -23,6 +23,7 @@
 
 int mdb_next_id( BackendDB *be, MDB_cursor *mc, ID *out )
 {
+       struct mdb_info *mdb = (struct mdb_info *) be->be_private;
        int rc;
        ID id = 0;
        MDB_val key;
@@ -45,6 +46,7 @@ int mdb_next_id( BackendDB *be, MDB_cursor *mc, ID *out )
                        mdb_strerror(rc), rc, 0 );
                goto done;
        }
+       mdb->mi_nextid = *out;
 
 done:
        return rc;
index 27c27388b282c6b870ffeb656f55d5a4761bf9f3..799e8171700f277ceaa3d4946ab613add6d084b8 100644 (file)
@@ -202,6 +202,7 @@ int mdb_idl_fetch_key(
 int mdb_idl_insert( ID *ids, ID id );
 
 typedef int (mdb_idl_keyfunc)(
+       BackendDB *be,
        MDB_cursor *mc,
        struct berval *key,
        ID id );