]> git.sur5r.net Git - openldap/commitdiff
Add new nextid code.
authorKurt Zeilenga <kurt@openldap.org>
Tue, 19 Sep 2000 20:13:41 +0000 (20:13 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Tue, 19 Sep 2000 20:13:41 +0000 (20:13 +0000)
servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/backbdb.dsp
servers/slapd/back-bdb/init.c
servers/slapd/back-bdb/nextid.c [new file with mode: 0644]
servers/slapd/back-bdb/proto-bdb.h
servers/slapd/back-bdb/tools.c

index ae2f78f5240fbb60391aa71ceffed81d81802ea1..8d6e0dd7fe62a4f8b84c3f48818d2a213beee638 100644 (file)
@@ -29,9 +29,9 @@ LDAP_BEGIN_DECL
 #define DEFAULT_DB_LG_DIR      DEFAULT_DBENV_HOME LDAP_DIRSEP "log"
 #define DEFAULT_DB_DATA_DIR    DEFAULT_DBENV_HOME LDAP_DIRSEP "data"
 
-#define BDB_ID         0
+#define BDB_NEXTID     0
 #define BDB_ENTRIES    1
-#define BDB_DNS                2
+#define BDB_DN2ID      2
 
 struct bdb_db_info {
        DB                      *bdi_db;
@@ -56,9 +56,9 @@ struct bdb_info {
        int                     bi_ndatabases;
        struct bdb_db_info **bdi_databases;
 };
-#define bi_id          bdi_databases[BDB_ID]
+#define bi_nextid      bdi_databases[BDB_NEXTID]
 #define bi_entries     bdi_databases[BDB_ENTRIES]
-#define bi_dns         bdi_databases[BDB_DNS]
+#define bi_dn2id       bdi_databases[BDB_DN2ID]
 
 LDAP_END_DECL
 
index 45d3786ea3916f09a4d6ae4c78f6ad83b30c6751..7d22533f37a819a6c546a87ef7525feb3629ffba 100644 (file)
@@ -143,6 +143,10 @@ SOURCE=.\init.c
 # End Source File
 # Begin Source File
 
+SOURCE=.\nextid.c
+# End Source File
+# Begin Source File
+
 SOURCE=".\proto-bdb.h"
 # End Source File
 # Begin Source File
index a93d53e2d63dbc505e5be02c76d29d4a279b8a92..b33811061fba86a69a1a1cdcbe79ccad6219f62c 100644 (file)
@@ -168,7 +168,7 @@ bi_back_db_destroy( BackendDB *be )
 }
 
 #ifdef SLAPD_BDB_DYNAMIC
-int back_bi_LTX_init_module( int argc, char *argv[] ) {
+int back_bdb_LTX_init_module( int argc, char *argv[] ) {
     BackendInfo bi;
 
     memset( &bi, '\0', sizeof(bi) );
@@ -181,7 +181,7 @@ int back_bi_LTX_init_module( int argc, char *argv[] ) {
 #endif /* SLAPD_BDB_DYNAMIC */
 
 int
-bi_back_initialize(
+bdb_back_initialize(
     BackendInfo        *bi
 )
 {
diff --git a/servers/slapd/back-bdb/nextid.c b/servers/slapd/back-bdb/nextid.c
new file mode 100644 (file)
index 0000000..92af935
--- /dev/null
@@ -0,0 +1,58 @@
+/* init.c - initialize bdb backend */
+/* $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 <ac/socket.h>
+
+#include "back-bdb.h"
+
+int bdb_next_id( BackendDB *be, DB_TXN *tid, ID *out )
+{
+       struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+       int rc;
+       ID kid = NOID;
+       ID id;
+       DBT key, data;
+
+       DBTzero( &key );
+       key.data = (char *) &kid;
+       key.size = sizeof( kid );
+
+       DBTzero( &data );
+       data.data = (char *) &id;
+       data.ulen = sizeof( id );
+       data.flags = DB_DBT_USERMEM;
+
+       /* get exiting value (with write lock) */
+       rc = bdb->bi_entries->bdi_db->get( bdb->bi_nextid->bdi_db,
+               tid, &key, &data, DB_RMW );
+
+       if( rc == DB_NOTFOUND ) {
+               /* must be first add */
+               id = NOID;
+
+       } else if( rc != 0 ) {
+               return rc;
+
+       } else if ( data.size != sizeof(ID) ) {
+               /* size mismatch! */
+               return -1;
+       }
+
+       id++;
+
+       /* store new value */
+       rc = bdb->bi_entries->bdi_db->put( bdb->bi_nextid->bdi_db,
+               tid, &key, &data, 0 );
+
+       *out = id;
+       return rc;
+}
index a5434711cf632484a800c8e97e275cd0586bda16..1cad0d6cc629814ba292e4b6470864cd6853269d 100644 (file)
@@ -14,6 +14,20 @@ LDAP_BEGIN_DECL
  */
 void bdb_errcall( const char *pfx, char * msg );
 
+/*
+ * dn.c
+ */
+int bdb_index_dn_add(
+       BackendDB *be,
+       DB_TXN *tid,
+       const char *dn,
+       ID id );
+
+/*
+ * nextid.c
+ */
+int bdb_next_id( BackendDB *be, DB_TXN *tid, ID *id );
+
 LDAP_END_DECL
 
 #endif /* _PROTO_BDB_H */
index 8282961f9764d69ec85756dce70ae3435cd6e794..113a5e33e68e0884e0470aff6463492cccba3102 100644 (file)
@@ -135,8 +135,8 @@ ID bdb_tool_entry_put(
                return NOID;
        }
 
-       e->e_id = bdb_next_id( be, tid );
-       if( e->e_id == NOID ) {
+       rc = bdb_next_id( be, tid, &e->e_id );
+       if( rc != 0 ) {
                goto done;
        }
 
@@ -144,27 +144,26 @@ ID bdb_tool_entry_put(
        rc = bdb->bi_entries->bdi_db->put( bdb->bi_entries->bdi_db,
                tid, &key, &data, DB_NOOVERWRITE );
        if( rc != 0 ) {
-               e->e_id = NOID;
                goto done;
        }
 
        /* add dn indices */
        rc = bdb_index_dn_add( be, tid, e->e_ndn, e->e_id );
        if( rc != 0 ) {
-               e->e_id = NOID;
                goto done;
        }
 
 #if 0
        rc = bdb_index_entry_add( be, tid, e, e->e_attrs );
        if( rc != 0 ) {
-               e->e_id = NOID;
                goto done;
        }
 #endif
 
 done:
-       if( e->e_id != NOID ) {
+       ber_bvfree( bv );
+
+       if( rc == 0 ) {
                rc = txn_commit( tid, 0 );
                if( rc != 0 ) {
                        e->e_id = NOID;
@@ -172,9 +171,9 @@ done:
 
        } else {
                txn_abort( tid );
+               e->e_id = NOID;
        }
 
-       ber_bvfree( bv );
        return e->e_id;
 }