X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Fidl.c;h=99f6963a054f06dc4f3e0d867d607de5113ff769;hb=fb7ac08adae76c588fde2a5eccf70b879c555beb;hp=ec193efeece06c9cc48c22d26d2b7e4364785819;hpb=b0b8546f054f31b1a080defede171f833d20b124;p=openldap diff --git a/servers/slapd/back-bdb/idl.c b/servers/slapd/back-bdb/idl.c index ec193efeec..99f6963a05 100644 --- a/servers/slapd/back-bdb/idl.c +++ b/servers/slapd/back-bdb/idl.c @@ -36,9 +36,9 @@ static void idl_dump( ID *ids ) { if( BDB_IDL_IS_RANGE( ids ) ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_INFO, "IDL: range (%ld - %ld)\n", + LDAP_LOG( INDEX, INFO, "IDL: range (%ld - %ld)\n", (long) BDB_IDL_RANGE_FIRST( ids ), - (long) BDB_IDL_RANGE_LAST( ids ) )); + (long) BDB_IDL_RANGE_LAST( ids ), 0 ); #else Debug( LDAP_DEBUG_ANY, "IDL: range ( %ld - %ld )\n", @@ -49,8 +49,7 @@ static void idl_dump( ID *ids ) } else { ID i; #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_INFO, "IDL: size %ld", - (long) ids[0] )); + LDAP_LOG( INDEX, INFO, "IDL: size %ld", (long) ids[0], 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "IDL: size %ld", (long) ids[0], 0, 0 ); #endif @@ -60,7 +59,7 @@ static void idl_dump( ID *ids ) Debug( LDAP_DEBUG_ANY, "\n", 0, 0, 0 ); } #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_INFO, "%02lx",(long)ids[i] )); + LDAP_LOG( INDEX, INFO, "%02lx",(long)ids[i], 0, 0 ); #else Debug( LDAP_DEBUG_ANY, " %02lx", (long) ids[i], 0, 0 ); #endif @@ -139,8 +138,7 @@ int bdb_idl_insert( ID *ids, ID id ) #if IDL_DEBUG > 1 #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_DETAIL1, "insert: %04lx at %d\n", - (long) id, x )); + LDAP_LOG( INDEX, DETAIL1, "insert: %04lx at %d\n", (long) id, x, 0 ); #else Debug( LDAP_DEBUG_ANY, "insert: %04lx at %d\n", (long) id, x, 0 ); idl_dump( ids ); @@ -193,8 +191,7 @@ static int idl_delete( ID *ids, ID id ) #if IDL_DEBUG > 1 #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_DETAIL1, "delete: %04lx at %d\n", - (long) id, x )); + LDAP_LOG( INDEX, DETAIL1, "delete: %04lx at %d\n", (long) id, x, 0 ); #else Debug( LDAP_DEBUG_ANY, "delete: %04lx at %d\n", (long) id, x, 0 ); idl_dump( ids ); @@ -267,7 +264,9 @@ bdb_idl_fetch_key( rc = db->cursor( db, tid, &cursor, bdb->bi_db_opflags ); if( rc != 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_fetch_key: cursor failed: %s (%d)\n", db_strerror(rc), rc )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_fetch_key: cursor failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_fetch_key: " "cursor failed: %s (%d)\n", db_strerror(rc), rc, 0 ); @@ -296,7 +295,10 @@ bdb_idl_fetch_key( if (ids[1] == 0) { if (ids[0] != BDB_IDL_RANGE_SIZE) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "=> bdb_idl_fetch_key: range size mismatch: expected %ld, got %ld\n", BDB_IDL_RANGE_SIZE, ids[0] )); + LDAP_LOG( INDEX, ERR, + "=> bdb_idl_fetch_key: range size mismatch: " + "expected %ld, got %ld\n", + BDB_IDL_RANGE_SIZE, ids[0], 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_fetch_key: " "range size mismatch: expected %d, got %ld\n", @@ -312,7 +314,9 @@ bdb_idl_fetch_key( rc2 = cursor->c_close( cursor ); if (rc2) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_fetch_key: close failed: %s (%d)\n", db_strerror(rc2), rc2 )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_fetch_key: close failed: %s (%d)\n", + db_strerror(rc2), rc2, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_fetch_key: " "close failed: %s (%d)\n", db_strerror(rc2), rc2, 0 ); @@ -333,7 +337,9 @@ bdb_idl_fetch_key( } else if( rc != 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_fetch_key: get failed: %s (%d)\n", db_strerror(rc), rc )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_fetch_key: get failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_fetch_key: " "get failed: %s (%d)\n", @@ -344,7 +350,9 @@ bdb_idl_fetch_key( } else if ( data.size == 0 || data.size % sizeof( ID ) ) { /* size not multiple of ID size */ #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_fetch_key: odd size: expected %ld multiple, got %ld\n", (long) sizeof( ID ), (long) data.size )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_fetch_key: odd size: expected %ld multiple, got %ld\n", + (long) sizeof( ID ), (long) data.size, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_fetch_key: " "odd size: expected %ld multiple, got %ld\n", @@ -355,7 +363,9 @@ bdb_idl_fetch_key( } else if ( data.size != BDB_IDL_SIZEOF(ids) ) { /* size mismatch */ #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_fetch_key: get size mismatch: expected %ld, got %ld\n", (long) ((1 + ids[0]) * sizeof( ID )), (long) data.size )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_fetch_key: get size mismatch: expected %ld, got %ld\n", + (long) ((1 + ids[0]) * sizeof( ID )), (long) data.size, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_fetch_key: " "get size mismatch: expected %ld, got %ld\n", @@ -385,7 +395,8 @@ bdb_idl_insert_key( #if 0 /* for printable keys only */ #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ARGS, "bdb_idl_insert_key: %s %ld\n", (char *)key->data, (long) id )); + LDAP_LOG( INDEX, ARGS, "bdb_idl_insert_key: %s %ld\n", + (char *)key->data, (long) id, 0 ); #else Debug( LDAP_DEBUG_ARGS, "=> bdb_idl_insert_key: %s %ld\n", @@ -409,7 +420,9 @@ bdb_idl_insert_key( rc = db->cursor( db, tid, &cursor, bdb->bi_db_opflags ); if ( rc != 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_insert_key: cursor failed: %s (%d)\n", db_strerror(rc), rc )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_insert_key: cursor failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: " "cursor failed: %s (%d)\n", db_strerror(rc), rc, 0 ); @@ -433,13 +446,31 @@ bdb_idl_insert_key( } if ( count >= BDB_IDL_DB_SIZE ) { /* No room, convert to a range */ + DBT key2 = *key; + + key2.dlen = key2.ulen; + key2.flags |= DB_DBT_PARTIAL; + lo = tmp; data.data = &hi; - rc = cursor->c_get( cursor, key, &data, DB_LAST ); - if ( rc != 0 ) { - err = "c_get last"; + rc = cursor->c_get( cursor, &key2, &data, DB_NEXT_NODUP ); + if ( rc != 0 && rc != DB_NOTFOUND ) { + err = "c_get next_nodup"; goto fail; } + if ( rc == DB_NOTFOUND ) { + rc = cursor->c_get( cursor, key, &data, DB_LAST ); + if ( rc != 0 ) { + err = "c_get last"; + goto fail; + } + } else { + rc = cursor->c_get( cursor, key, &data, DB_PREV ); + if ( rc != 0 ) { + err = "c_get prev"; + goto fail; + } + } if ( id < lo ) lo = id; else if ( id > hi ) @@ -518,7 +549,9 @@ put1: data.data = &id; /* initial c_get failed, nothing was done */ fail: #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_insert_key: %s failed: %s (%d)\n", err, db_strerror(rc), rc )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_insert_key: %s failed: %s (%d)\n", + err, db_strerror(rc), rc ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: " "%s failed: %s (%d)\n", err, db_strerror(rc), rc ); @@ -543,7 +576,8 @@ fail: } else if ( rc != 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_insert_key: get failed: %s (%d)\n", db_strerror(rc), rc )); + LDAP_LOG( INDEX, ERR, "bdb_idl_insert_key: get failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: " "get failed: %s (%d)\n", @@ -554,7 +588,9 @@ fail: } else if ( data.size == 0 || data.size % sizeof( ID ) ) { /* size not multiple of ID size */ #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_insert_key: odd size: expected %ld multiple, got %ld\n", (long) sizeof( ID ), (long) data.size )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_insert_key: odd size: expected %ld multiple, got %ld\n", + (long) sizeof( ID ), (long) data.size, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: " "odd size: expected %ld multiple, got %ld\n", @@ -565,7 +601,9 @@ fail: } else if ( data.size != BDB_IDL_SIZEOF(ids) ) { /* size mismatch */ #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_insert_key: odd size: expected %ld multiple, got %ld\n", (long) ((1 + ids[0]) * sizeof( ID )), (long) data.size )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_insert_key: odd size: expected %ld multiple, got %ld\n", + (long) ((1 + ids[0]) * sizeof( ID )), (long) data.size, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: " "get size mismatch: expected %ld, got %ld\n", @@ -587,7 +625,7 @@ fail: if( rc == -1 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_DETAIL1, "bdb_idl_insert_key: dup\n" )); + LDAP_LOG( INDEX, DETAIL1, "bdb_idl_insert_key: dup\n", 0, 0, 0 ); #else Debug( LDAP_DEBUG_TRACE, "=> bdb_idl_insert_key: dup\n", 0, 0, 0 ); @@ -596,7 +634,8 @@ fail: } if( rc != 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_insert_key: insert failed: (%d)\n", rc )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_insert_key: insert failed: (%d)\n", rc, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: " "bdb_idl_insert failed (%d)\n", @@ -616,7 +655,9 @@ fail: if( rc != 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_insert_key: put failed: (%d)\n", db_strerror(rc), rc )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_insert_key: put failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: " "put failed: %s (%d)\n", @@ -644,7 +685,8 @@ bdb_idl_delete_key( #if 0 /* for printable keys only */ #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ARGS, "bdb_idl_delete_key: %s %ld\n", (char *)key->data, (long) id )); + LDAP_LOG( INDEX, ARGS, "bdb_idl_delete_key: %s %ld\n", + (char *)key->data, (long) id, 0 ); #else Debug( LDAP_DEBUG_ARGS, "=> bdb_idl_delete_key: %s %ld\n", @@ -669,7 +711,9 @@ bdb_idl_delete_key( rc = db->cursor( db, tid, &cursor, bdb->bi_db_opflags ); if ( rc != 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_delete_key: cursor failed: %s (%d)\n", db_strerror(rc), rc )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_delete_key: cursor failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: " "cursor failed: %s (%d)\n", db_strerror(rc), rc, 0 ); @@ -684,9 +728,12 @@ bdb_idl_delete_key( if ( rc == 0 ) { if ( tmp != 0 ) { /* Not a range, just delete it */ - data.data = &id; - rc = cursor->c_get( cursor, key, &data, - DB_GET_BOTH | DB_RMW ); + if (tmp != id) { + /* position to correct item */ + tmp = id; + rc = cursor->c_get( cursor, key, &data, + DB_GET_BOTH | DB_RMW ); + } if ( rc == 0 ) { rc = cursor->c_del( cursor, 0 ); if ( rc != 0 ) { @@ -749,7 +796,9 @@ bdb_idl_delete_key( /* initial c_get failed, nothing was done */ fail: #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_delete_key: %s failed: %s (%d)\n", err, db_strerror(rc), rc )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_delete_key: %s failed: %s (%d)\n", + err, db_strerror(rc), rc ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: " "%s failed: %s (%d)\n", err, db_strerror(rc), rc ); @@ -769,7 +818,8 @@ fail: if ( rc != 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_delete_key: get failed: %s (%d)\n", db_strerror(rc), rc )); + LDAP_LOG( INDEX, ERR, "bdb_idl_delete_key: get failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: " "get failed: %s (%d)\n", @@ -780,7 +830,9 @@ fail: } else if ( data.size == 0 || data.size % sizeof( ID ) ) { /* size not multiple of ID size */ #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_delete_key: odd size: expected: %ld multiple, got %ld\n", (long) sizeof( ID ), (long) data.size )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_delete_key: odd size: expected: %ld multiple, got %ld\n", + (long) sizeof( ID ), (long) data.size, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: " "odd size: expected %ld multiple, got %ld\n", @@ -794,7 +846,9 @@ fail: } else if ( data.size != (1 + ids[0]) * sizeof( ID ) ) { /* size mismatch */ #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_delete_key: get size mismatch: expected: %ld, got %ld\n", (long) ((1 + ids[0]) * sizeof( ID )), (long) data.size )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_delete_key: get size mismatch: expected: %ld, got %ld\n", + (long) ((1 + ids[0]) * sizeof( ID )), (long) data.size, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: " "get size mismatch: expected %ld, got %ld\n", @@ -807,7 +861,8 @@ fail: if( rc != 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_delete_key: delete failed: (%d)\n", rc )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_delete_key: delete failed: (%d)\n", rc, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: " "idl_delete failed (%d)\n", @@ -821,7 +876,9 @@ fail: rc = db->del( db, tid, key, 0 ); if( rc != 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_delete_key: delete failed: %s (%d)\n", db_strerror(rc), rc )); + LDAP_LOG( INDEX, ERR, + "bdb_idl_delete_key: delete failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: " "delete failed: %s (%d)\n", @@ -841,7 +898,8 @@ fail: if( rc != 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "idl", LDAP_LEVEL_ERR, "bdb_idl_delete_key: put failed: %s (%d)\n", db_strerror(rc), rc )); + LDAP_LOG( INDEX, ERR, "bdb_idl_delete_key: put failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); #else Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: put failed: %s (%d)\n", @@ -956,8 +1014,11 @@ bdb_idl_union( } if ( BDB_IDL_IS_RANGE( a ) || BDB_IDL_IS_RANGE(b) ) { -over: a[1] = IDL_MIN( BDB_IDL_FIRST(a), BDB_IDL_FIRST(b) ); - a[2] = IDL_MAX( BDB_IDL_LAST(a), BDB_IDL_LAST(b) ); +over: ida = IDL_MIN( BDB_IDL_FIRST(a), BDB_IDL_FIRST(b) ); + idb = IDL_MAX( BDB_IDL_LAST(a), BDB_IDL_LAST(b) ); + a[0] = NOID; + a[1] = ida; + a[2] = idb; return 0; } @@ -970,7 +1031,6 @@ over: a[1] = IDL_MIN( BDB_IDL_FIRST(a), BDB_IDL_FIRST(b) ); while( ida != NOID || idb != NOID ) { if ( ida < idb ) { if( ++cursorc > BDB_IDL_UM_MAX ) { - a[0] = NOID; goto over; } b[cursorc] = ida; @@ -993,7 +1053,7 @@ over: a[1] = IDL_MIN( BDB_IDL_FIRST(a), BDB_IDL_FIRST(b) ); idb = NOID; else idb = b[cursorc]; - if (b[cursorb] < idb) + if (cursorb <= b[0] && b[cursorb] < idb) a[cursora++] = b[cursorb++]; else { a[cursora++] = idb;