#ifndef BDB_HIER
int
bdb_dn2id_add(
- BackendDB *be,
+ Operation *op,
DB_TXN *txn,
EntryInfo *eip,
- Entry *e,
- void *ctx )
+ Entry *e )
{
- struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
DB *db = bdb->bi_dn2id->bdi_db;
int rc;
DBT key, data;
key.size = e->e_nname.bv_len + 2;
key.ulen = key.size;
key.flags = DB_DBT_USERMEM;
- buf = sl_malloc( key.size, ctx );
+ buf = op->o_tmpalloc( key.size, op->o_tmpmemctx );
key.data = buf;
buf[0] = DN_BASE_PREFIX;
ptr.bv_val = buf + 1;
}
#ifndef BDB_MULTIPLE_SUFFIXES
- if( !be_issuffix( be, &ptr )) {
+ if( !be_issuffix( op->o_bd, &ptr )) {
#endif
buf[0] = DN_SUBTREE_PREFIX;
rc = db->put( db, txn, &key, &data, DB_NOOVERWRITE );
}
#ifdef BDB_MULTIPLE_SUFFIXES
- if( !be_issuffix( be, &ptr )) {
+ if( !be_issuffix( op->o_bd, &ptr )) {
#endif
dnParent( &ptr, &pdn );
key.data = pdn.bv_val-1;
ptr = pdn;
- rc = bdb_idl_insert_key( be, db, txn, &key, e->e_id );
+ rc = bdb_idl_insert_key( op->o_bd, db, txn, &key, e->e_id );
if( rc != 0 ) {
#ifdef NEW_LOGGING
#ifndef BDB_MULTIPLE_SUFFIXES
}
- while( !be_issuffix( be, &ptr )) {
+ while( !be_issuffix( op->o_bd, &ptr )) {
#else
for (;;) {
#endif
ptr.bv_val[-1] = DN_SUBTREE_PREFIX;
- rc = bdb_idl_insert_key( be, db, txn, &key, e->e_id );
+ rc = bdb_idl_insert_key( op->o_bd, db, txn, &key, e->e_id );
if( rc != 0 ) {
#ifdef NEW_LOGGING
break;
}
#ifdef BDB_MULTIPLE_SUFFIXES
- if( be_issuffix( be, &ptr )) break;
+ if( be_issuffix( op->o_bd, &ptr )) break;
#endif
dnParent( &ptr, &pdn );
#endif
done:
- sl_free( buf, ctx );
+ op->o_tmpfree( buf, op->o_tmpmemctx );
#ifdef NEW_LOGGING
LDAP_LOG ( INDEX, RESULTS, "<= bdb_dn2id_add: %d\n", rc, 0, 0 );
#else
int
bdb_dn2id_delete(
- BackendDB *be,
+ Operation *op,
DB_TXN *txn,
EntryInfo *eip,
- Entry *e,
- void *ctx )
+ Entry *e )
{
- struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
DB *db = bdb->bi_dn2id->bdi_db;
int rc;
DBT key;
DBTzero( &key );
key.size = e->e_nname.bv_len + 2;
- buf = sl_malloc( key.size, ctx );
+ buf = op->o_tmpalloc( key.size, op->o_tmpmemctx );
key.data = buf;
key.flags = DB_DBT_USERMEM;
buf[0] = DN_BASE_PREFIX;
}
#ifndef BDB_MULTIPLE_SUFFIXES
- if( !be_issuffix( be, &ptr )) {
+ if( !be_issuffix( op->o_bd, &ptr )) {
#endif
buf[0] = DN_SUBTREE_PREFIX;
rc = db->del( db, txn, &key, 0 );
}
#ifdef BDB_MULTIPLE_SUFFIXES
- if( !be_issuffix( be, &ptr )) {
+ if( !be_issuffix( op->o_bd, &ptr )) {
#endif
dnParent( &ptr, &pdn );
key.data = pdn.bv_val - 1;
ptr = pdn;
- rc = bdb_idl_delete_key( be, db, txn, &key, e->e_id );
+ rc = bdb_idl_delete_key( op->o_bd, db, txn, &key, e->e_id );
if( rc != 0 ) {
#ifdef NEW_LOGGING
#ifndef BDB_MULTIPLE_SUFFIXES
}
- while( !be_issuffix( be, &ptr )) {
+ while( !be_issuffix( op->o_bd, &ptr )) {
#else
for (;;) {
#endif
ptr.bv_val[-1] = DN_SUBTREE_PREFIX;
- rc = bdb_idl_delete_key( be, db, txn, &key, e->e_id );
+ rc = bdb_idl_delete_key( op->o_bd, db, txn, &key, e->e_id );
if( rc != 0 ) {
#ifdef NEW_LOGGING
LDAP_LOG ( INDEX, ERR,
goto done;
}
#ifdef BDB_MULTIPLE_SUFFIXES
- if( be_issuffix( be, &ptr )) break;
+ if( be_issuffix( op->o_bd, &ptr )) break;
#endif
dnParent( &ptr, &pdn );
#endif
done:
- sl_free( buf, ctx );
+ op->o_tmpfree( buf, op->o_tmpmemctx );
#ifdef NEW_LOGGING
LDAP_LOG ( INDEX, RESULTS, "<= bdb_dn2id_delete %d\n", rc, 0, 0 );
#else
int
bdb_dn2id(
- BackendDB *be,
+ Operation *op,
DB_TXN *txn,
struct berval *dn,
- EntryInfo *ei,
- void *ctx )
+ EntryInfo *ei )
{
int rc;
DBT key, data;
- struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
DB *db = bdb->bi_dn2id->bdi_db;
#ifdef NEW_LOGGING
#endif
DBTzero( &key );
key.size = dn->bv_len + 2;
- key.data = sl_malloc( key.size, ctx );
+ key.data = op->o_tmpalloc( key.size, op->o_tmpmemctx );
((char *)key.data)[0] = DN_BASE_PREFIX;
AC_MEMCPY( &((char *)key.data)[1], dn->bv_val, key.size - 1 );
#endif
}
- sl_free( key.data, ctx );
+ op->o_tmpfree( key.data, op->o_tmpmemctx );
return rc;
}
#endif
DBTzero( &key );
key.size = e->e_nname.bv_len + 2;
- key.data = sl_malloc( key.size, op->o_tmpmemctx );
+ key.data = op->o_tmpalloc( key.size, op->o_tmpmemctx );
((char *)key.data)[0] = DN_ONE_PREFIX;
AC_MEMCPY( &((char *)key.data)[1], e->e_nname.bv_val, key.size - 1 );
if ( bdb->bi_idl_cache_size ) {
rc = bdb_idl_cache_get( bdb, db, &key, NULL );
if ( rc != LDAP_NO_SUCH_OBJECT ) {
- sl_free( key.data, op->o_tmpmemctx );
+ op->o_tmpfree( key.data, op->o_tmpmemctx );
return rc;
}
}
data.dlen = sizeof(id);
rc = db->get( db, txn, &key, &data, bdb->bi_db_opflags );
- sl_free( key.data, op->o_tmpmemctx );
+ op->o_tmpfree( key.data, op->o_tmpmemctx );
#ifdef NEW_LOGGING
LDAP_LOG ( INDEX, DETAIL1,
int
bdb_dn2idl(
- BackendDB *be,
- struct berval *dn,
- int prefix,
+ Operation *op,
+ Entry *e,
ID *ids,
- ID *stack,
- void *ctx )
+ ID *stack )
{
int rc;
DBT key;
- struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
DB *db = bdb->bi_dn2id->bdi_db;
+ int prefix = op->ors_scope == LDAP_SCOPE_SUBTREE ? DN_SUBTREE_PREFIX :
+ DN_ONE_PREFIX;
#ifdef NEW_LOGGING
LDAP_LOG ( INDEX, ARGS,
- "=> bdb_dn2ididl( \"%s\" )\n", dn->bv_val, 0, 0 );
+ "=> bdb_dn2ididl( \"%s\" )\n", e->e_nname.bv_val, 0, 0 );
#else
- Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2idl( \"%s\" )\n", dn->bv_val, 0, 0 );
+ Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2idl( \"%s\" )\n", e->e_nname.bv_val, 0, 0 );
#endif
#ifndef BDB_MULTIPLE_SUFFIXES
- if (prefix == DN_SUBTREE_PREFIX && be_issuffix(be, dn))
+ if (prefix == DN_SUBTREE_PREFIX && BEI(e)->bei_parent->bei_id == 0 )
{
BDB_IDL_ALL(bdb, ids);
return 0;
#endif
DBTzero( &key );
- key.size = dn->bv_len + 2;
+ key.size = e->e_nname.bv_len + 2;
key.ulen = key.size;
key.flags = DB_DBT_USERMEM;
- key.data = sl_malloc( key.size, ctx );
+ key.data = op->o_tmpalloc( key.size, op->o_tmpmemctx );
((char *)key.data)[0] = prefix;
- AC_MEMCPY( &((char *)key.data)[1], dn->bv_val, key.size - 1 );
+ AC_MEMCPY( &((char *)key.data)[1], e->e_nname.bv_val, key.size - 1 );
- rc = bdb_idl_fetch_key( be, db, NULL, &key, ids );
+ rc = bdb_idl_fetch_key( op->o_bd, db, NULL, &key, ids );
if( rc != 0 ) {
#ifdef NEW_LOGGING
#endif
}
- sl_free( key.data, ctx );
+ op->o_tmpfree( key.data, op->o_tmpmemctx );
return rc;
}
#else /* BDB_HIER */
* Sorts based on normalized RDN, in length order.
*/
int
-bdb_dup_compare(
+hdb_dup_compare(
DB *db,
const DBT *usrkey,
const DBT *curkey
/* This function constructs a full DN for a given entry.
*/
-int bdb_fix_dn(
+int hdb_fix_dn(
Entry *e,
int checkit
)
int rlen = 0, nrlen = 0;
char *ptr, *nptr;
int max = 0;
-
+
+ /* count length of all DN components */
for ( ei = BEI(e); ei && ei->bei_id; ei=ei->bei_parent ) {
rlen += ei->bei_rdn.bv_len + 1;
nrlen += ei->bei_nrdn.bv_len + 1;
}
/* checkit == 2. do the fix. */
free( e->e_name.bv_val );
+ free( e->e_nname.bv_val );
}
e->e_name.bv_len = rlen - 1;
e->e_nname.bv_len = nrlen - 1;
- e->e_name.bv_val = ch_malloc(rlen + nrlen);
- e->e_nname.bv_val = e->e_name.bv_val + rlen;
+ e->e_name.bv_val = ch_malloc(rlen);
+ e->e_nname.bv_val = ch_malloc(nrlen);
ptr = e->e_name.bv_val;
nptr = e->e_nname.bv_val;
for ( ei = BEI(e); ei && ei->bei_id; ei=ei->bei_parent ) {
* child's entryID containing the parent's entryID.
*/
int
-bdb_dn2id_add(
- BackendDB *be,
+hdb_dn2id_add(
+ Operation *op,
DB_TXN *txn,
EntryInfo *eip,
- Entry *e,
- void *ctx )
+ Entry *e )
{
- struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
DB *db = bdb->bi_dn2id->bdi_db;
DBT key, data;
int rc, rlen, nrlen;
diskNode *d;
char *ptr;
- nrlen = dn_rdnlen( be, &e->e_nname );
+ nrlen = dn_rdnlen( op->o_bd, &e->e_nname );
if (nrlen) {
- rlen = dn_rdnlen( be, &e->e_name );
+ rlen = dn_rdnlen( op->o_bd, &e->e_name );
} else {
nrlen = e->e_nname.bv_len;
rlen = e->e_name.bv_len;
}
- d = sl_malloc(sizeof(diskNode) + rlen + nrlen, ctx);
+ d = op->o_tmpalloc(sizeof(diskNode) + rlen + nrlen, op->o_tmpmemctx);
d->entryID = e->e_id;
d->nrdnlen = nrlen;
ptr = lutil_strncopy( d->nrdn, e->e_nname.bv_val, nrlen );
rc = db->put( db, txn, &key, &data, DB_NODUPDATA );
}
- sl_free( d, ctx );
+ op->o_tmpfree( d, op->o_tmpmemctx );
return rc;
}
int
-bdb_dn2id_delete(
- BackendDB *be,
+hdb_dn2id_delete(
+ Operation *op,
DB_TXN *txn,
EntryInfo *eip,
- Entry *e,
- void *ctx )
+ Entry *e )
{
- struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
DB *db = bdb->bi_dn2id->bdi_db;
DBT key, data;
DBC *cursor;
rc = db->cursor( db, txn, &cursor, bdb->bi_db_opflags );
if ( rc ) return rc;
- d = sl_malloc( data.size, ctx );
+ d = op->o_tmpalloc( data.size, op->o_tmpmemctx );
d->entryID = e->e_id;
d->nrdnlen = BEI(e)->bei_nrdn.bv_len;
strcpy( d->nrdn, BEI(e)->bei_nrdn.bv_val );
rc = cursor->c_del( cursor, 0 );
}
cursor->c_close( cursor );
- sl_free( d, ctx );
+ op->o_tmpfree( d, op->o_tmpmemctx );
return rc;
}
int
-bdb_dn2id(
- BackendDB *be,
+hdb_dn2id(
+ Operation *op,
DB_TXN *txn,
struct berval *in,
- EntryInfo *ei,
- void *ctx )
+ EntryInfo *ei )
{
- struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
DB *db = bdb->bi_dn2id->bdi_db;
DBT key, data;
DBC *cursor;
char *ptr;
ID idp = ei->bei_parent->bei_id;
- nrlen = dn_rdnlen( be, in );
+ nrlen = dn_rdnlen( op->o_bd, in );
if (!nrlen) nrlen = in->bv_len;
DBTzero(&key);
rc = db->cursor( db, txn, &cursor, bdb->bi_db_opflags );
if ( rc ) return rc;
- d = sl_malloc( data.size * 3, ctx );
+ d = op->o_tmpalloc( data.size * 3, op->o_tmpmemctx );
d->nrdnlen = nrlen;
ptr = lutil_strncopy( d->nrdn, in->bv_val, nrlen );
*ptr = '\0';
ei->bei_rdn.bv_val = ch_malloc( ei->bei_rdn.bv_len + 1 );
strcpy( ei->bei_rdn.bv_val, ptr );
}
- sl_free( d, ctx );
+ op->o_tmpfree( d, op->o_tmpmemctx );
return rc;
}
int
-bdb_dn2id_parent(
- Backend *be,
+hdb_dn2id_parent(
+ Operation *op,
DB_TXN *txn,
EntryInfo *ei,
- ID *idp,
- void *ctx )
+ ID *idp )
{
- struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
DB *db = bdb->bi_dn2id->bdi_db;
DBT key, data;
DBC *cursor;
if ( rc ) return rc;
data.ulen = sizeof(diskNode) + (SLAP_LDAPDN_MAXLEN * 2);
- d = sl_malloc( data.ulen, ctx );
+ d = op->o_tmpalloc( data.ulen, op->o_tmpmemctx );
data.data = d;
rc = cursor->c_get( cursor, &key, &data, DB_SET );
ptr = d->nrdn + ei->bei_nrdn.bv_len + 1;
ber_str2bv( ptr, ei->bei_rdn.bv_len, 1, &ei->bei_rdn );
}
- sl_free( d, ctx );
+ op->o_tmpfree( d, op->o_tmpmemctx );
return rc;
}
int
-bdb_dn2id_children(
+hdb_dn2id_children(
Operation *op,
DB_TXN *txn,
Entry *e )
DBT key;
DBT data;
DBC *dbc;
- void *ctx;
+ Operation *op;
};
static int
-bdb_dn2idl_internal(
+hdb_dn2idl_internal(
struct dn2id_cookie *cx
)
{
return cx->rc;
}
if ( cx->rc == LDAP_SUCCESS ) {
- goto saveit;
+ goto gotit;
}
}
#endif
bdb_idl_cache_put( cx->bdb, cx->db, &cx->key, cx->tmp, cx->rc );
}
#endif
+ ;
+gotit:
if ( cx->rc == 0 ) {
if ( cx->prefix == DN_SUBTREE_PREFIX ) {
ID *save, idcurs;
- save = sl_malloc( BDB_IDL_SIZEOF( cx->tmp ), cx->ctx );
+ save = cx->op->o_tmpalloc( BDB_IDL_SIZEOF( cx->tmp ),
+ cx->op->o_tmpmemctx );
BDB_IDL_CPY( save, cx->tmp );
bdb_idl_union( cx->ids, cx->tmp );
for ( cx->id = bdb_idl_first( save, &idcurs );
cx->id != NOID;
cx->id = bdb_idl_next( save, &idcurs )) {
- bdb_dn2idl_internal( cx );
+ hdb_dn2idl_internal( cx );
}
- sl_free( save, cx->ctx );
+ cx->op->o_tmpfree( save, cx->op->o_tmpmemctx );
cx->rc = 0;
} else {
BDB_IDL_CPY( cx->ids, cx->tmp );
}
int
-bdb_dn2idl(
- BackendDB *be,
- struct berval *dn,
- int prefix,
+hdb_dn2idl(
+ Operation *op,
+ Entry *e,
ID *ids,
- ID *stack,
- void *ctx )
+ ID *stack )
{
+ struct bdb_info *bdb = (struct bdb_info *)op->o_bd->be_private;
struct dn2id_cookie cx;
- EntryInfo *ei = (EntryInfo *)dn;
+
+#ifdef NEW_LOGGING
+ LDAP_LOG ( INDEX, ARGS,
+ "=> hdb_dn2ididl( \"%s\" )\n", e->e_nname.bv_val, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE, "=> hdb_dn2idl( \"%s\" )\n", e->e_nname.bv_val, 0, 0 );
+#endif
#ifndef BDB_MULTIPLE_SUFFIXES
- if ( ei->bei_parent->bei_id == 0 ) {
- struct bdb_info *bdb = (struct bdb_info *)be->be_private;
+ if ( op->ors_scope == LDAP_SCOPE_SUBTREE &&
+ BEI(e)->bei_parent->bei_id == 0 ) {
BDB_IDL_ALL( bdb, ids );
return 0;
}
#endif
- cx.id = ei->bei_id;
- cx.bdb = (struct bdb_info *)be->be_private;
+ cx.id = e->e_id;
+ cx.bdb = bdb;
cx.db = cx.bdb->bi_dn2id->bdi_db;
- cx.prefix = prefix;
+ cx.prefix = op->ors_scope == LDAP_SCOPE_SUBTREE ? DN_SUBTREE_PREFIX :
+ DN_ONE_PREFIX;
cx.ids = ids;
cx.buf = stack;
- cx.ctx = ctx;
+ cx.op = op;
BDB_IDL_ZERO( ids );
- if ( prefix == DN_SUBTREE_PREFIX ) {
+ if ( cx.prefix == DN_SUBTREE_PREFIX ) {
bdb_idl_insert( ids, cx.id );
}
DBTzero(&cx.data);
- return bdb_dn2idl_internal(&cx);
+ return hdb_dn2idl_internal(&cx);
}
#endif /* BDB_HIER */