]> git.sur5r.net Git - openldap/commitdiff
Add dn2entry.c
authorKurt Zeilenga <kurt@openldap.org>
Sun, 24 Sep 2000 22:48:13 +0000 (22:48 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Sun, 24 Sep 2000 22:48:13 +0000 (22:48 +0000)
servers/slapd/back-bdb/add.c
servers/slapd/back-bdb/backbdb.dsp
servers/slapd/back-bdb/compare.c
servers/slapd/back-bdb/delete.c
servers/slapd/back-bdb/dn2entry.c [new file with mode: 0644]
servers/slapd/back-bdb/dn2id.c
servers/slapd/back-bdb/external.h
servers/slapd/back-bdb/id2entry.c
servers/slapd/back-bdb/init.c
servers/slapd/back-bdb/proto-bdb.h

index c7c2a6ce77519010429f79312d2b87681709bfa0..059794e553bb27517139b2edffba60c07c4812a2 100644 (file)
@@ -11,6 +11,7 @@
 #include <ac/string.h>
 
 #include "back-bdb.h"
+#include "external.h"
 
 int
 bdb_add(
index 66395d7bb071d8694248b107928ba33591454459..3543e5e5a5b09f1ae0c03232fa089525daa2511a 100644 (file)
@@ -143,6 +143,10 @@ SOURCE=.\delete.c
 # End Source File
 # Begin Source File
 
+SOURCE=.\dn2entry.c
+# End Source File
+# Begin Source File
+
 SOURCE=.\dn2id.c
 # End Source File
 # Begin Source File
index ece33d08b91f0fafc82701b57a306e61f52780c5..3dc7e9fc61aa56b9ef1d56e3d494154e57935152 100644 (file)
@@ -11,6 +11,7 @@
 #include <ac/string.h>
 
 #include "back-bdb.h"
+#include "external.h"
 
 int
 bdb_compare(
index 887e05afdd45b077d192538df3a03bbe91c280d9..e3617f08d139a5555f72ca9e09b94ce7213060a3 100644 (file)
@@ -11,6 +11,7 @@
 #include <ac/string.h>
 
 #include "back-bdb.h"
+#include "external.h"
 
 int
 bdb_delete(
diff --git a/servers/slapd/back-bdb/dn2entry.c b/servers/slapd/back-bdb/dn2entry.c
new file mode 100644 (file)
index 0000000..77482ef
--- /dev/null
@@ -0,0 +1,53 @@
+/* dn2entry.c - routines to deal with the dn2id / id2entry glue */
+/* $OpenLDAP$ */
+/*
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
+
+#include "portable.h"
+
+#include <stdio.h>
+#include <ac/string.h>
+
+#include "back-bdb.h"
+
+/*
+ * dn2entry - look up dn in the cache/indexes and return the corresponding
+ * entry.
+ */
+
+int
+bdb_dn2entry(
+    Backend    *be,
+       DB_TXN *tid,
+    const char *dn,
+       Entry **e,
+    Entry **matched,
+       int flags )
+{
+       int rc;
+       ID              id;
+       char    *matchedDN = NULL;
+
+       Debug(LDAP_DEBUG_TRACE, "bdb_dn2entry: dn: \"%s\"\n",
+               dn, 0, 0 );
+
+       if( matched != NULL ) {
+               rc = bdb_dn2id_matched( be, tid, dn, &id, &matchedDN );
+       } else {
+               rc = bdb_dn2id( be, tid, dn, &id );
+       }
+
+       if( rc != 0 ) {
+               return rc;
+       }
+
+       if( matchedDN == NULL ) {
+               rc = bdb_id2entry( be, tid, id, e );
+       } else {
+               rc = bdb_id2entry( be, tid, id, matched );
+       }
+
+       return rc;
+}
\ No newline at end of file
index 4b5c46e9b2740c51a3605a7aec2a05ded7b8a1fb..007c18866fbc7c4a9e5fbaee816d9b0dc32d9214 100644 (file)
@@ -95,8 +95,7 @@ bdb_dn2id_delete(
     Backend    *be,
        DB_TXN *txn,
     const char *dn,
-    ID         id
-)
+    ID         id )
 {
        int             rc;
        DBT             key;
@@ -104,7 +103,6 @@ bdb_dn2id_delete(
        DB *db = bdb->bi_dn2id->bdi_db;
 
        Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_delete( \"%s\", %ld )\n", dn, id, 0 );
-       assert( id != NOID );
 
        DBTzero( &key );
        key.size = strlen( dn ) + 2;
@@ -165,188 +163,145 @@ done:
 }
 
 int
-bdb_dn2id_children(
+bdb_dn2id(
     Backend    *be,
        DB_TXN *txn,
-    const char *dn
-)
+    const char *dn,
+       ID *id )
 {
        int             rc;
        DBT             key, data;
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        DB *db = bdb->bi_dn2id->bdi_db;
-       ID              id;
 
-       Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_children( %s )\n",
-               dn, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id( \"%s\" )\n", dn, 0, 0 );
 
        DBTzero( &key );
        key.size = strlen( dn ) + 2;
        key.data = ch_malloc( key.size );
-       ((char *)key.data)[0] = DN_ONE_PREFIX;
+       ((char *)key.data)[0] = DN_BASE_PREFIX;
        AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 );
 
-       /* we actually could do a empty get... */
+       /* store the ID */
        DBTzero( &data );
-       data.data = &id;
-       data.ulen = sizeof(id);
+       data.data = id;
+       data.ulen = sizeof(ID);
        data.flags = DB_DBT_USERMEM;
-       data.doff = 0;
-       data.dlen = sizeof(id);
 
+       /* fetch it */
        rc = db->get( db, txn, &key, &data, 0 );
 
-       Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_children( %s ): %s (%d)\n",
-               dn,
-               rc == 0 ? "yes" :       ( rc == DB_NOTFOUND ? "no" :
-                       db_strerror(rc) ), rc );
+       Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id: id=%ld: %s (%d)\n",
+               id, db_strerror( rc ), rc );
 
+       ch_free( key.data );
        return rc;
 }
 
-#if 0
-ID
-dn2id(
+int
+bdb_dn2id_matched(
     Backend    *be,
-    const char *dn
-)
+       DB_TXN *txn,
+    const char *in,
+       ID *id,
+       char **matchedDN )
 {
-       struct ldbminfo *li = (struct ldbminfo *) be->be_private;
-       DBCache *db;
-       ID              id;
-       Datum           key, data;
-
-       Debug( LDAP_DEBUG_TRACE, "=> dn2id( \"%s\" )\n", dn, 0, 0 );
-
-       /* first check the cache */
-       if ( (id = cache_find_entry_dn2id( be, &li->li_cache, dn )) != NOID ) {
-               Debug( LDAP_DEBUG_TRACE, "<= dn2id %ld (in cache)\n", id,
-                       0, 0 );
-               return( id );
-       }
-
-       if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
-               == NULL ) {
-               Debug( LDAP_DEBUG_ANY, "<= dn2id could not open dn2id%s\n",
-                       LDBM_SUFFIX, 0, 0 );
-               return( NOID );
-       }
-
-       ldbm_datum_init( key );
-
-       key.dsize = strlen( dn ) + 2;
-       key.dptr = ch_malloc( key.dsize );
-       sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn );
-
-       data = ldbm_cache_fetch( db, key );
+       int             rc;
+       DBT             key, data;
+       struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+       DB *db = bdb->bi_dn2id->bdi_db;
+       const char *dn = in;
+       char *tmp = NULL;
 
-       ldbm_cache_close( be, db );
+       Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_matched( \"%s\" )\n", dn, 0, 0 );
 
-       free( key.dptr );
+       DBTzero( &key );
+       key.size = strlen( dn ) + 2;
+       key.data = ch_malloc( key.size );
+       ((char *)key.data)[0] = DN_BASE_PREFIX;
 
-       if ( data.dptr == NULL ) {
-               Debug( LDAP_DEBUG_TRACE, "<= dn2id NOID\n", 0, 0, 0 );
-               return( NOID );
-       }
+       /* store the ID */
+       DBTzero( &data );
+       data.data = id;
+       data.ulen = sizeof(ID);
+       data.flags = DB_DBT_USERMEM;
 
-       AC_MEMCPY( (char *) &id, data.dptr, sizeof(ID) );
+       *matchedDN = NULL;
 
-       assert( id != NOID );
+       while(1) {
+               AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 );
 
-       ldbm_datum_free( db->dbc_db, data );
+               /* fetch it */
+               rc = db->get( db, txn, &key, &data, 0 );
 
-       Debug( LDAP_DEBUG_TRACE, "<= dn2id %ld\n", id, 0, 0 );
-       return( id );
-}
+               if( rc == DB_NOTFOUND ) {
+                       char *pdn = dn_parent( be, dn );
+                       ch_free( tmp );
+                       tmp = NULL;
 
-ID_BLOCK *
-dn2idl(
-    Backend    *be,
-    const char *dn,
-       int             prefix
-)
-{
-       DBCache *db;
-       Datum           key;
-       ID_BLOCK        *idl;
+                       if( pdn == NULL || *pdn == '\0' ) {
+                               ch_free( pdn );
+                               break;
+                       }
 
-       Debug( LDAP_DEBUG_TRACE, "=> dn2idl( \"%c%s\" )\n", prefix, dn, 0 );
+                       dn = pdn;
+                       tmp = pdn;
+                       key.size = strlen( dn ) + 2;
 
-       if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
-               == NULL ) {
-               Debug( LDAP_DEBUG_ANY, "<= dn2idl could not open dn2id%s\n",
-                       LDBM_SUFFIX, 0, 0 );
-               return NULL;
+               } else if ( rc == 0 ) {
+                       if( in != dn ) {
+                               *matchedDN = (char *) dn;
+                       }
+                       Debug( LDAP_DEBUG_TRACE,
+                               "<= bdb_dn2id_matched: id=%ld: %s\n",
+                               id, dn, 0 );
+                       break;
+
+               } else {
+                       ch_free( tmp );
+                       break;
+               }
        }
 
-       ldbm_datum_init( key );
-
-       key.dsize = strlen( dn ) + 2;
-       key.dptr = ch_malloc( key.dsize );
-       sprintf( key.dptr, "%c%s", prefix, dn );
-
-       idl = idl_fetch( be, db, key );
-
-       ldbm_cache_close( be, db );
-
-       free( key.dptr );
-
-       return( idl );
+       ch_free( key.data );
+       return rc;
 }
 
-
-/*
- * dn2entry - look up dn in the cache/indexes and return the corresponding
- * entry.
- */
-
-Entry *
-dn2entry_rw(
+int
+bdb_dn2id_children(
     Backend    *be,
-    const char *dn,
-    Entry      **matched,
-    int         rw
-)
+       DB_TXN *txn,
+    const char *dn )
 {
+       int             rc;
+       DBT             key, data;
+       struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+       DB *db = bdb->bi_dn2id->bdi_db;
        ID              id;
-       Entry           *e = NULL;
-       char            *pdn;
-
-       Debug(LDAP_DEBUG_TRACE, "dn2entry_%s: dn: \"%s\"\n",
-               rw ? "w" : "r", dn, 0);
 
-       if( matched != NULL ) {
-               /* caller cares about match */
-               *matched = NULL;
-       }
+       Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_children( %s )\n",
+               dn, 0, 0 );
 
-       if ( (id = dn2id( be, dn )) != NOID &&
-               (e = id2entry_rw( be, id, rw )) != NULL )
-       {
-               return( e );
-       }
+       DBTzero( &key );
+       key.size = strlen( dn ) + 2;
+       key.data = ch_malloc( key.size );
+       ((char *)key.data)[0] = DN_ONE_PREFIX;
+       AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 );
 
-       if ( id != NOID ) {
-               Debug(LDAP_DEBUG_ANY,
-                       "dn2entry_%s: no entry for valid id (%ld), dn \"%s\"\n",
-                       rw ? "w" : "r", id, dn);
-               /* must have been deleted from underneath us */
-               /* treat as if NOID was found */
-       }
+       /* we actually could do a empty get... */
+       DBTzero( &data );
+       data.data = &id;
+       data.ulen = sizeof(id);
+       data.flags = DB_DBT_USERMEM;
+       data.doff = 0;
+       data.dlen = sizeof(id);
 
-       /* caller doesn't care about match */
-       if( matched == NULL ) return NULL;
+       rc = db->get( db, txn, &key, &data, 0 );
 
-       /* entry does not exist - see how much of the dn does exist */
-       /* dn_parent checks returns NULL if dn is suffix */
-       if ( (pdn = dn_parent( be, dn )) != NULL ) {
-               /* get entry with reader lock */
-               if ( (e = dn2entry_r( be, pdn, matched )) != NULL ) {
-                       *matched = e;
-               }
-               free( pdn );
-       }
+       Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_children( %s ): %s (%d)\n",
+               dn,
+               rc == 0 ? "yes" : ( rc == DB_NOTFOUND ? "no" :
+                       db_strerror(rc) ), rc );
 
-       return NULL;
+       return rc;
 }
-#endif
\ No newline at end of file
index fbbc8806bbf7e8ebecf3ec40fdfce756e76aa183..1adee5d1a55c1097365f59f362362aa505f7807c 100644 (file)
@@ -11,6 +11,46 @@ LDAP_BEGIN_DECL
 
 extern int     bdb_initialize LDAP_P(( BackendInfo *bi ));
 
+extern int     bdb_add LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op, Entry *e ));
+
+extern int bdb_bind LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       const char *dn, const char *ndn, int method,
+       struct berval *cred, char** edn ));
+
+extern int     bdb_compare LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       const char *dn, const char *ndn,
+       AttributeAssertion *ava ));
+
+extern int     bdb_delete LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       const char *dn, const char *ndn ));
+
+extern int     bdb_abandon LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op, ber_int_t msgid ));
+
+extern int     bdb_modify LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       const char *dn, const char *ndn, Modifications *ml ));
+
+extern int     bdb_modrdn LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       const char *dn, const char *ndn,
+       const char* newrdn, int deleteoldrdn,
+       const char *newSuperior ));
+
+extern int     bdb_search LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op,
+       const char *base, const char *nbase,
+       int scope, int deref, int sizelimit, int timelimit,
+       Filter *filter, const char *filterstr,
+       char **attrs, int attrsonly ));
+
+extern int     bdb_unbind LDAP_P(( BackendDB *bd,
+       Connection *conn, Operation *op ));
+
 LDAP_END_DECL
 
 #endif /* _BDB_EXTERNAL_H */
index f613b910a34b2e8355bb343329c187cf894e267f..2725c4e557531db9d4db612772a4574e896ffc48 100644 (file)
@@ -18,6 +18,7 @@ int bdb_id2entry_add(
        Entry *e )
 {
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+       DB *db = bdb->bi_id2entry->bdi_db;
        DBT key, data;
        struct berval *bv;
        int rc;
@@ -34,9 +35,71 @@ int bdb_id2entry_add(
        DBTzero( &data );
        bv2DBT( bv, &data );
 
-       rc = bdb->bi_id2entry->bdi_db->put( bdb->bi_id2entry->bdi_db,
-               tid, &key, &data, DB_NOOVERWRITE );
+       rc = db->put( db, tid, &key, &data, DB_NOOVERWRITE );
 
        ber_bvfree( bv );
        return rc;
 }
+
+int bdb_id2entry(
+       Backend *be,
+       DB_TXN *tid,
+       ID id,
+       Entry **e )
+{
+       struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+       DB *db = bdb->bi_id2entry->bdi_db;
+       DBT key, data;
+       struct berval bv;
+       int rc;
+
+       DBTzero( &key );
+       key.data = (char *) &id;
+       key.size = sizeof(ID);
+
+       DBTzero( &data );
+       data.flags = DB_DBT_MALLOC;
+
+       /* fetch it */
+       rc = db->get( db, tid, &key, &data, 0 );
+
+       if( rc != 0 ) {
+               return rc;
+       }
+
+       DBT2bv( &data, &bv );
+
+       rc = entry_decode( &bv, e );
+
+       ch_free( data.data );
+       return rc;
+}
+
+int bdb_id2entry_delete(
+       Backend *be,
+       DB_TXN *tid,
+       ID id )
+{
+       struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+       DB *db = bdb->bi_id2entry->bdi_db;
+       DBT key;
+       struct berval *bv;
+       int rc;
+
+       DBTzero( &key );
+       key.data = (char *) &id;
+       key.size = sizeof(ID);
+
+       rc = db->del( db, tid, &key, 0 );
+
+       ber_bvfree( bv );
+       return rc;
+}
+
+int bdb_entry_return(
+       Backend *be,
+       Entry *e )
+{
+       entry_free( e );
+       return 0;
+}
index 024660ac9f099a4f68f683a825bf56d2b16036ff..c58987ebe0987ea2c3351aed4a78bbcf95441555 100644 (file)
@@ -11,6 +11,7 @@
 #include <ac/string.h>
 
 #include "back-bdb.h"
+#include "external.h"
 
 static struct bdbi_database {
        char *file;
@@ -273,15 +274,15 @@ bdb_initialize(
        bi->bi_db_close = bdb_db_close;
        bi->bi_db_destroy = bdb_db_destroy;
 
+       bi->bi_op_add = bdb_add;
+       bi->bi_op_compare = bdb_compare;
+       bi->bi_op_delete = bdb_delete;
 #if 0
        bi->bi_op_bind = bi_back_bind;
        bi->bi_op_unbind = bi_back_unbind;
        bi->bi_op_search = bi_back_search;
-       bi->bi_op_compare = bi_back_compare;
        bi->bi_op_modify = bi_back_modify;
        bi->bi_op_modrdn = bi_back_modrdn;
-       bi->bi_op_add = bi_back_add;
-       bi->bi_op_delete = bi_back_delete;
        bi->bi_op_abandon = bi_back_abandon;
 
        bi->bi_extended = bi_back_extended;
index 780b275b875ff656bb5bdcb4dc995e75ad11b41b..e7a869ba4bbdfe3939ad7ba0fda345780580da0b 100644 (file)
@@ -25,9 +25,34 @@ Entry *bdb_deref_internal_r LDAP_P((
 #define deref_dn_r( be, dn, err, matched, text ) \
        bdb_deref_internal_r( be, NULL, dn, err, matched, text)
 
+/*
+ * dn2entry.c
+ */
+int bdb_dn2entry LDAP_P(( Backend *be, DB_TXN *tid,
+       const char *dn, Entry **e, Entry **matched, int flags ));
+
+#define dn2entry_r(be, tid, dn, p, m) \
+       bdb_dn2entry((be), (tid), (dn), (p), (m), 0 )
+
+#define dn2entry_w(be, tid, dn, p, m) \
+       bdb_dn2entry((be), (tid), (dn), (p), (m), DB_RMW )
+
 /*
  * dn2id.c
  */
+int bdb_dn2id(
+       BackendDB *be,
+       DB_TXN *tid,
+       const char *dn,
+       ID *id );
+
+int bdb_dn2id_matched(
+       BackendDB *be,
+       DB_TXN *tid,
+       const char *dn,
+       ID *id,
+       char **matchedDN );
+
 int bdb_dn2id_add(
        BackendDB *be,
        DB_TXN *tid,
@@ -45,12 +70,6 @@ int bdb_dn2id_children(
        DB_TXN *tid,
        const char *dn );
 
-int bdb_dn2entry_rw LDAP_P(( Backend *be, DB_TXN *tid,
-       const char *dn, Entry **e, Entry **matched, int rw ));
-
-#define dn2entry_r(be, tid, dn, p, m) bdb_dn2entry_rw((be), (tid), (dn), (p), (m), 0)
-#define dn2entry_w(be, tid, dn, p, m) bdb_dn2entry_rw((be), (tid), (dn), (p), (m), 1)
-
 /*
  * entry.c
  */
@@ -74,6 +93,12 @@ int bdb_id2entry_delete(
        DB_TXN *tid,
        ID id );
 
+int bdb_id2entry(
+       Backend *be,
+       DB_TXN *tid,
+       ID id,
+       Entry **e );
+
 /*
  * idl.c
  */