Upgrade db3 backend to db4.
authorJonathan McDowell <noodles@earth.li>
Sun, 1 Aug 2004 11:33:19 +0000 (11:33 +0000)
committerJonathan McDowell <noodles@earth.li>
Sun, 1 Aug 2004 11:33:19 +0000 (11:33 +0000)
Upgrade db3 backend to db4. Hopefully this will fix the locking issues
that have been seen - certainly no issues have been seen in testing over the
past week.

configure.ac
keydb_db4.c [moved from keydb_db3.c with 97% similarity]

index e8f702209932b2f1440acac9e95adc1a4d16611b..a3468aac8dd27dedd0d3c810b5f6f753a71f3e00 100644 (file)
@@ -7,16 +7,36 @@ AC_PROG_CC
 
 AC_C_BIGENDIAN
 
-AC_ARG_ENABLE(backend,AC_HELP_STRING([--enable-backend=<backend>],[Choose the backend database to use. Defaults to db3.]), [], [enable_backend="db3"])
+AC_ARG_ENABLE(backend,AC_HELP_STRING([--enable-backend=<backend>],[Choose the backend database to use. Defaults to db4.]), [], [enable_backend="db4"])
 
 AC_MSG_CHECKING([which key database backend to use])
 AC_MSG_RESULT([$enable_backend])
 AC_CHECK_FILE([$srcdir/keydb_$enable_backend.c], ,AC_MSG_ERROR([non existent key database backend $enable_backend]))
 
-if test "x$enable_backend" = "xdb3"
+if test "x$enable_backend" = "xdb4"
 then
-       AC_CHECK_LIB(db3, db_env_create,,
-               AC_MSG_ERROR([cannot compile DB3 backend without libdb3]))
+       AC_CHECK_HEADER(db.h, have_db_h="yes", have_db_h="no")
+       AC_MSG_CHECKING(for libdb version in db.h)
+       printf "#include <db.h>\nDB_VERSION_MAJOR DB_VERSION_MINOR\n" >conftest.c
+       set `eval $ac_cpp conftest.c | egrep '^ *[[0-9]] *'`; v="$1"; vv="$2"
+       AC_MSG_RESULT($v.$vv)
+       if test "$v" -ne 4; then
+               AC_MSG_RESULT([   * onak requires libdb version 4])
+       fi
+       for db in "db-$v.$vv" "db$v.$vv" "db-$v" "db$v" "db"; do
+               AC_MSG_CHECKING(for db_create in lib$db)
+               oldLIBS="$LIBS"
+               LIBS="$LIBS -l$db"
+               AC_TRY_LINK([#include <db.h>], db_create(0, 0, 0),
+                       have_libdb="yes", have_libdb="no")
+               AC_MSG_RESULT($have_libdb)
+               if test "$have_libdb" != "no"; then break; fi
+               LIBS="$oldLIBS"
+       done
+       if test "$have_libdb" = "no" -o "$have_db_h" = "no"; then
+               AC_MSG_ERROR(libdb not found.)
+       fi
+       AC_DEFINE(HAVE_LIBDB, 1, [libdb found])
 else if test "x$enable_backend" = "xpg"
 then
        AC_CHECK_LIB(pq, PQsetdbLogin,,
similarity index 97%
rename from keydb_db3.c
rename to keydb_db4.c
index 7cc3b1ef78d45227262e85744f95a520c2dda5fc..04949d000ce90dd48a37401f12cf15855434530f 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * keydb_db3.c - Routines to store and fetch keys in a DB3 database.
+ * keydb_db4.c - Routines to store and fetch keys in a DB3 database.
  *
  * Jonathan McDowell <noodles@earth.li>
  *
- * Copyright 2002 Project Purple
+ * Copyright 2002-2004 Project Purple
  */
 
 #include <assert.h>
@@ -144,6 +144,8 @@ void initdb(bool readonly)
                exit(1);
        }
 
+       starttrans();
+
        for (i = 0; i < numdbs; i++) {
                ret = db_create(&dbconns[i], dbenv, 0);
                if (ret != 0) {
@@ -157,11 +159,13 @@ void initdb(bool readonly)
                if (readonly) {
                        flags = DB_RDONLY;
                }
-               ret = dbconns[i]->open(dbconns[i], buf,
-                       NULL,
-                       DB_HASH,
-                       flags,
-                       0664);
+               ret = dbconns[i]->open(dbconns[i],
+                               txn,
+                               buf,
+                               "keydb",
+                               DB_HASH,
+                               flags,
+                               0664);
                if (ret != 0) {
                        logthing(LOGTHING_CRITICAL,
                                "Error opening key database: %s (%s)",
@@ -178,7 +182,7 @@ void initdb(bool readonly)
        }
        ret = worddb->set_flags(worddb, DB_DUP);
 
-       ret = worddb->open(worddb, "worddb", NULL, DB_BTREE,
+       ret = worddb->open(worddb, txn, "worddb", "worddb", DB_BTREE,
                        flags,
                        0664);
        if (ret != 0) {
@@ -196,7 +200,7 @@ void initdb(bool readonly)
        }
        ret = id32db->set_flags(id32db, DB_DUP);
 
-       ret = id32db->open(id32db, "id32db", NULL, DB_HASH,
+       ret = id32db->open(id32db, txn, "id32db", "id32db", DB_HASH,
                        flags,
                        0664);
        if (ret != 0) {
@@ -206,6 +210,7 @@ void initdb(bool readonly)
                                db_strerror(ret));
                exit(1);
        }
+       endtrans();
        
        return;
 }
@@ -220,7 +225,7 @@ void cleanupdb(void)
 {
        int i = 0;
 
-       txn_checkpoint(dbenv, 0, 0, 0);
+       dbenv->txn_checkpoint(dbenv, 0, 0, 0);
        id32db->close(id32db, 0);
        id32db = NULL;
        worddb->close(worddb, 0);
@@ -247,7 +252,7 @@ bool starttrans(void)
        assert(dbenv != NULL);
        assert(txn == NULL);
 
-       ret = txn_begin(dbenv,
+       ret = dbenv->txn_begin(dbenv,
                NULL, /* No parent transaction */
                &txn,
                0);
@@ -273,7 +278,7 @@ void endtrans(void)
        assert(dbenv != NULL);
        assert(txn != NULL);
 
-       ret = txn_commit(txn,
+       ret = txn->commit(txn,
                0);
        if (ret != 0) {
                logthing(LOGTHING_CRITICAL,