]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
slapcat partially working
authorHoward Chu <hyc@openldap.org>
Fri, 19 Aug 2011 04:46:52 +0000 (21:46 -0700)
committerHoward Chu <hyc@openldap.org>
Fri, 19 Aug 2011 04:46:52 +0000 (21:46 -0700)
servers/slapd/back-mdb/dn2id.c
servers/slapd/back-mdb/id2entry.c
servers/slapd/back-mdb/tools.c

index b18ab47a45be8881d624e9e9c494246888195aa2..29445d72ae2c5da4c86fdc8a4d7cce8b3479ca6c 100644 (file)
@@ -448,7 +448,57 @@ mdb_id2name(
        struct berval *name,
        struct berval *nname )
 {
-       return 0;
+       struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
+       MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi;
+       MDB_val         key, data;
+       MDB_cursor      *cursor;
+       int             rc, len, nlen;
+       char dn[SLAP_LDAPDN_MAXLEN], ndn[SLAP_LDAPDN_MAXLEN], *ptr;
+       char *dptr, *nptr;
+       diskNode *d;
+
+       key.mv_size = sizeof(ID);
+
+       rc = mdb_cursor_open( txn, dbi, &cursor );
+       if ( rc ) return rc;
+
+       len = 0;
+       nlen = 0;
+       dptr = dn;
+       nptr = ndn;
+       while (id) {
+               int nrlen, rlen;
+               key.mv_data = &id;
+               rc = mdb_cursor_get( cursor, &key, &data, MDB_SET );
+               if ( rc ) break;
+               ptr = data.mv_data;
+               ptr += data.mv_size - sizeof(ID);
+               memcpy( &id, ptr, sizeof(ID) );
+               d = data.mv_data;
+               nrlen = (d->nrdnlen[0] << 8) | d->nrdnlen[1];
+               if (nptr > ndn) {
+                       *nptr++ = ',';
+                       *dptr++ = ',';
+               }
+               /* copy name and trailing NUL */
+               memcpy( nptr, d->nrdn, nrlen+1 );
+               rlen = data.mv_size - sizeof(diskNode) - nrlen;
+               memcpy( dptr, d->nrdn+nrlen+1, rlen+1 );
+               nptr += nrlen;
+               dptr += rlen;
+       }
+       if ( rc == 0 ) {
+               name->bv_len = dptr - dn;
+               nname->bv_len = nptr - ndn;
+               name->bv_val = op->o_tmpalloc( name->bv_len + 1, op->o_tmpmemctx );
+               nname->bv_val = op->o_tmpalloc( nname->bv_len + 1, op->o_tmpmemctx );
+               memcpy( name->bv_val, dn, name->bv_len );
+               name->bv_val[name->bv_len] = '\0';
+               memcpy( nname->bv_val, ndn, nname->bv_len );
+               nname->bv_val[nname->bv_len] = '\0';
+       }
+       mdb_cursor_close( cursor );
+       return rc;
 }
 
 #if 0
index 1a028f39de4359238f85d02c335f7d1496921e9b..2b2e377fe7c285a4238dde790656dd9047a95c11 100644 (file)
@@ -109,10 +109,15 @@ int mdb_id2entry(
        rc = entry_header( &eh );
        if ( rc ) return rc;
 
+       eh.bv.bv_len = eh.nvals * sizeof( struct berval );
+       eh.bv.bv_val = ch_malloc( eh.bv.bv_len );
        rc = entry_decode(&eh, e);
 
        if( rc == 0 ) {
                (*e)->e_id = id;
+               (*e)->e_bv = eh.bv;
+       } else {
+               ch_free( eh.bv.bv_val );
        }
 
        return rc;
index 1d8a19379ef267ec1970e3f604eeb45e4a069050..cae1555db7f0b2f1c6265188711617b5c480b13b 100644 (file)
@@ -194,6 +194,7 @@ next:;
        }
 
        previd = *(ID *)key.mv_data;
+       id = previd;
 
        if ( tool_filter || tool_base ) {
                static Operation op = {0};
@@ -270,6 +271,8 @@ mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep )
        }
 
        if ( id != previd ) {
+               key.mv_size = sizeof(ID);
+               key.mv_data = &id;
                rc = mdb_cursor_get( cursor, &key, &data, MDB_SET );
                if ( rc ) {
                        rc = LDAP_OTHER;
@@ -311,12 +314,15 @@ mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep )
                rc = LDAP_OTHER;
                goto done;
        }
+       eh.bv.bv_len = eh.nvals * sizeof( struct berval );
+       eh.bv.bv_val = ch_malloc( eh.bv.bv_len );
        rc = entry_decode( &eh, &e );
        e->e_id = id;
        if ( !BER_BVISNULL( &dn )) {
                e->e_name = dn;
                e->e_nname = ndn;
        }
+       e->e_bv = eh.bv;
 
 done:
        if ( e != NULL ) {