/* Find the ad, return -1 if not found, * set point for insertion if ins is non-NULL */ int bdb_attr_slot( struct bdb_info *bdb, AttributeDescription *ad, int *ins ) { unsigned base = 0, cursor = 0; unsigned n = bdb->bi_nattrs; int val = 0; while ( 0 < n ) { unsigned pivot = n >> 1; cursor = base + pivot; val = SLAP_PTRCMP( ad, bdb->bi_attrs[cursor]->ai_desc ); if ( val < 0 ) { n = pivot; } else if ( val > 0 ) { base = cursor + 1; n -= pivot + 1; } else { return cursor; } } if ( ins ) { if ( val > 0 ) ++cursor; *ins = cursor; } return -1; }
static int vc_conn_cmp( const void *c1, const void *c2 ) { const vc_conn_t *vc1 = (const vc_conn_t *)c1; const vc_conn_t *vc2 = (const vc_conn_t *)c2; return SLAP_PTRCMP( vc1->conn, vc2->conn ); }
static int authzid_conn_cmp( const void *c1, const void *c2 ) { const authzid_conn_t *ac1 = (const authzid_conn_t *)c1; const authzid_conn_t *ac2 = (const authzid_conn_t *)c2; return SLAP_PTRCMP( ac1->conn, ac2->conn ); }
static int bdb_idl_entry_cmp( const void *v_idl1, const void *v_idl2 ) { const bdb_idl_cache_entry_t *idl1 = v_idl1, *idl2 = v_idl2; int rc; if ((rc = SLAP_PTRCMP( idl1->db, idl2->db ))) return rc; if ((rc = idl1->kstr.bv_len - idl2->kstr.bv_len )) return rc; return ( memcmp ( idl1->kstr.bv_val, idl2->kstr.bv_val , idl1->kstr.bv_len ) ); }
/* * meta_back_conn_cmp * * compares two struct metaconn based on the value of the conn pointer; * used by avl stuff */ int meta_back_conn_cmp( const void *c1, const void *c2 ) { struct metaconn *lc1 = ( struct metaconn * )c1; struct metaconn *lc2 = ( struct metaconn * )c2; return SLAP_PTRCMP( lc1->conn, lc2->conn ); }
int bdb_tool_entry_reindex( BackendDB *be, ID id, AttributeDescription **adv ) { struct bdb_info *bi = (struct bdb_info *) be->be_private; int rc; Entry *e; DB_TXN *tid = NULL; Operation op = {0}; Opheader ohdr = {0}; Debug( LDAP_DEBUG_ARGS, "=> " LDAP_XSTRING(bdb_tool_entry_reindex) "( %ld )\n", (long) id, 0, 0 ); assert( tool_base == NULL ); assert( tool_filter == NULL ); /* No indexes configured, nothing to do. Could return an * error here to shortcut things. */ if (!bi->bi_attrs) { return 0; } /* Check for explicit list of attrs to index */ if ( adv ) { int i, j, n; if ( bi->bi_attrs[0]->ai_desc != adv[0] ) { /* count */ for ( n = 0; adv[n]; n++ ) ; /* insertion sort */ for ( i = 0; i < n; i++ ) { AttributeDescription *ad = adv[i]; for ( j = i-1; j>=0; j--) { if ( SLAP_PTRCMP( adv[j], ad ) <= 0 ) break; adv[j+1] = adv[j]; } adv[j+1] = ad; } } for ( i = 0; adv[i]; i++ ) { if ( bi->bi_attrs[i]->ai_desc != adv[i] ) { for ( j = i+1; j < bi->bi_nattrs; j++ ) { if ( bi->bi_attrs[j]->ai_desc == adv[i] ) { AttrInfo *ai = bi->bi_attrs[i]; bi->bi_attrs[i] = bi->bi_attrs[j]; bi->bi_attrs[j] = ai; break; } } if ( j == bi->bi_nattrs ) { Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(bdb_tool_entry_reindex) ": no index configured for %s\n", adv[i]->ad_cname.bv_val, 0, 0 ); return -1; } } } bi->bi_nattrs = i; } /* Get the first attribute to index */ if (bi->bi_linear_index && !index_nattrs) { index_nattrs = bi->bi_nattrs - 1; bi->bi_nattrs = 1; } e = bdb_tool_entry_get( be, id ); if( e == NULL ) { Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(bdb_tool_entry_reindex) ": could not locate id=%ld\n", (long) id, 0, 0 ); return -1; } if (! (slapMode & SLAP_TOOL_QUICK)) { rc = TXN_BEGIN( bi->bi_dbenv, NULL, &tid, bi->bi_db_opflags ); if( rc != 0 ) { Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(bdb_tool_entry_reindex) ": " "txn_begin failed: %s (%d)\n", db_strerror(rc), rc, 0 ); goto done; } Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(bdb_tool_entry_reindex) ": txn id: %x\n", tid->id(tid), 0, 0 ); } /* * just (re)add them for now * assume that some other routine (not yet implemented) * will zap index databases * */ Debug( LDAP_DEBUG_TRACE, "=> " LDAP_XSTRING(bdb_tool_entry_reindex) "( %ld, \"%s\" )\n", (long) id, e->e_dn, 0 ); op.o_hdr = &ohdr; op.o_bd = be; op.o_tmpmemctx = NULL; op.o_tmpmfuncs = &ch_mfuncs; rc = bdb_tool_index_add( &op, tid, e ); done: if( rc == 0 ) { if (! (slapMode & SLAP_TOOL_QUICK)) { rc = TXN_COMMIT( tid, 0 ); if( rc != 0 ) { Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(bdb_tool_entry_reindex) ": txn_commit failed: %s (%d)\n", db_strerror(rc), rc, 0 ); e->e_id = NOID; } } } else { if (! (slapMode & SLAP_TOOL_QUICK)) { TXN_ABORT( tid ); Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(bdb_tool_entry_reindex) ": txn_aborted! %s (%d)\n", db_strerror(rc), rc, 0 ); } e->e_id = NOID; } bdb_entry_release( &op, e, 0 ); return rc; }
int entry_cmp( Entry *e1, Entry *e2 ) { return SLAP_PTRCMP( e1, e2 ); }
int wt_tool_entry_reindex( BackendDB *be, ID id, AttributeDescription **adv ) { struct wt_info *wi = (struct wt_info *) be->be_private; int rc; Entry *e; Operation op = {0}; Opheader ohdr = {0}; Debug( LDAP_DEBUG_ARGS, "=> " LDAP_XSTRING(wt_tool_entry_reindex) "( %ld )\n", (long) id, 0, 0 ); assert( tool_base == NULL ); assert( tool_filter == NULL ); /* No indexes configured, nothing to do. Could return an * error here to shortcut things. */ if (!wi->wi_attrs) { return 0; } /* Check for explicit list of attrs to index */ if ( adv ) { int i, j, n; if ( wi->wi_attrs[0]->ai_desc != adv[0] ) { /* count */ for ( n = 0; adv[n]; n++ ) ; /* insertion sort */ for ( i = 0; i < n; i++ ) { AttributeDescription *ad = adv[i]; for ( j = i-1; j>=0; j--) { if ( SLAP_PTRCMP( adv[j], ad ) <= 0 ) break; adv[j+1] = adv[j]; } adv[j+1] = ad; } } for ( i = 0; adv[i]; i++ ) { if ( wi->wi_attrs[i]->ai_desc != adv[i] ) { for ( j = i+1; j < wi->wi_nattrs; j++ ) { if ( wi->wi_attrs[j]->ai_desc == adv[i] ) { AttrInfo *ai = wi->wi_attrs[i]; wi->wi_attrs[i] = wi->wi_attrs[j]; wi->wi_attrs[j] = ai; break; } } if ( j == wi->wi_nattrs ) { Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(wt_tool_entry_reindex) ": no index configured for %s\n", adv[i]->ad_cname.bv_val, 0, 0 ); return -1; } } } wi->wi_nattrs = i; } e = wt_tool_entry_get( be, id ); if( e == NULL ) { Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(wt_tool_entry_reindex) ": could not locate id=%ld\n", (long) id, 0, 0 ); return -1; } op.o_hdr = &ohdr; op.o_bd = be; op.o_tmpmemctx = NULL; op.o_tmpmfuncs = &ch_mfuncs; rc = wc->session->begin_transaction(wc->session, NULL); if( rc ){ Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(wt_dn2id_add) ": begin_transaction failed: %s (%d)\n", wiredtiger_strerror(rc), rc, 0 ); goto done; } Debug( LDAP_DEBUG_TRACE, "=> " LDAP_XSTRING(wt_tool_entry_reindex) "( %ld, \"%s\" )\n", (long) id, e->e_dn, 0 ); rc = wt_tool_index_add( &op, wc, e ); done: if ( rc == 0 ){ rc = wc->session->commit_transaction(wc->session, NULL); if( rc ) { Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(wt_tool_entry_reindex) "commit_transaction failed: %s (%d)\n", wiredtiger_strerror(rc), rc, 0 ); } }else{ rc = wc->session->rollback_transaction(wc->session, NULL); Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(wt_tool_entry_reindex) ": rollback transaction %s\n", wiredtiger_strerror(rc), rc, 0 ); } wt_entry_release( &op, e, 0 ); return rc; }
int mdb_tool_entry_reindex( BackendDB *be, ID id, AttributeDescription **adv ) { struct mdb_info *mi = (struct mdb_info *) be->be_private; int rc; Entry *e; Operation op = {0}; Opheader ohdr = {0}; Debug( LDAP_DEBUG_ARGS, "=> " LDAP_XSTRING(mdb_tool_entry_reindex) "( %ld )\n", (long) id, 0, 0 ); assert( tool_base == NULL ); assert( tool_filter == NULL ); /* No indexes configured, nothing to do. Could return an * error here to shortcut things. */ if (!mi->mi_attrs) { return 0; } /* Check for explicit list of attrs to index */ if ( adv ) { int i, j, n; if ( mi->mi_attrs[0]->ai_desc != adv[0] ) { /* count */ for ( n = 0; adv[n]; n++ ) ; /* insertion sort */ for ( i = 0; i < n; i++ ) { AttributeDescription *ad = adv[i]; for ( j = i-1; j>=0; j--) { if ( SLAP_PTRCMP( adv[j], ad ) <= 0 ) break; adv[j+1] = adv[j]; } adv[j+1] = ad; } } for ( i = 0; adv[i]; i++ ) { if ( mi->mi_attrs[i]->ai_desc != adv[i] ) { for ( j = i+1; j < mi->mi_nattrs; j++ ) { if ( mi->mi_attrs[j]->ai_desc == adv[i] ) { AttrInfo *ai = mi->mi_attrs[i]; mi->mi_attrs[i] = mi->mi_attrs[j]; mi->mi_attrs[j] = ai; break; } } if ( j == mi->mi_nattrs ) { Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(mdb_tool_entry_reindex) ": no index configured for %s\n", adv[i]->ad_cname.bv_val, 0, 0 ); return -1; } } } mi->mi_nattrs = i; } e = mdb_tool_entry_get( be, id ); if( e == NULL ) { Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(mdb_tool_entry_reindex) ": could not locate id=%ld\n", (long) id, 0, 0 ); return -1; } if ( !txi ) { rc = mdb_txn_begin( mi->mi_dbenv, NULL, 0, &txi ); if( rc != 0 ) { Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(mdb_tool_entry_reindex) ": " "txn_begin failed: %s (%d)\n", mdb_strerror(rc), rc, 0 ); goto done; } } if ( slapMode & SLAP_TRUNCATE_MODE ) { int i; for ( i=0; i < mi->mi_nattrs; i++ ) { rc = mdb_drop( txi, mi->mi_attrs[i]->ai_dbi, 0 ); if ( rc ) { Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(mdb_tool_entry_reindex) ": (Truncate) mdb_drop(%s) failed: %s (%d)\n", mi->mi_attrs[i]->ai_desc->ad_type->sat_cname.bv_val, mdb_strerror(rc), rc ); return -1; } } slapMode ^= SLAP_TRUNCATE_MODE; } /* * just (re)add them for now * Use truncate mode to empty/reset index databases */ Debug( LDAP_DEBUG_TRACE, "=> " LDAP_XSTRING(mdb_tool_entry_reindex) "( %ld )\n", (long) id, 0, 0 ); op.o_hdr = &ohdr; op.o_bd = be; op.o_tmpmemctx = NULL; op.o_tmpmfuncs = &ch_mfuncs; rc = mdb_tool_index_add( &op, txi, e ); done: if( rc == 0 ) { mdb_writes++; if ( mdb_writes >= mdb_writes_per_commit ) { unsigned i; MDB_TOOL_IDL_FLUSH( be, txi ); rc = mdb_txn_commit( txi ); mdb_writes = 0; for ( i=0; i<mi->mi_nattrs; i++ ) mi->mi_attrs[i]->ai_cursor = NULL; if( rc != 0 ) { Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(mdb_tool_entry_reindex) ": txn_commit failed: %s (%d)\n", mdb_strerror(rc), rc, 0 ); e->e_id = NOID; } txi = NULL; } } else { unsigned i; mdb_writes = 0; mdb_txn_abort( txi ); for ( i=0; i<mi->mi_nattrs; i++ ) mi->mi_attrs[i]->ai_cursor = NULL; Debug( LDAP_DEBUG_ANY, "=> " LDAP_XSTRING(mdb_tool_entry_reindex) ": txn_aborted! err=%d\n", rc, 0, 0 ); e->e_id = NOID; txi = NULL; } mdb_entry_release( &op, e, 0 ); return rc; }