From: Jonathan McDowell Date: Sun, 1 Aug 2004 11:33:19 +0000 (+0000) Subject: Upgrade db3 backend to db4. X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/commitdiff_plain/28052481c1892cd06a2626a1ecd7221c3814f0e6?hp=6f0d21388eeeb33893728d92dfc0f3a3a6d6aafe Upgrade db3 backend to db4. 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. --- diff --git a/configure.ac b/configure.ac index e8f7022..a3468aa 100644 --- a/configure.ac +++ b/configure.ac @@ -7,16 +7,36 @@ AC_PROG_CC AC_C_BIGENDIAN -AC_ARG_ENABLE(backend,AC_HELP_STRING([--enable-backend=],[Choose the backend database to use. Defaults to db3.]), [], [enable_backend="db3"]) +AC_ARG_ENABLE(backend,AC_HELP_STRING([--enable-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 \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_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,, diff --git a/keydb_db3.c b/keydb_db4.c similarity index 97% rename from keydb_db3.c rename to keydb_db4.c index 7cc3b1e..04949d0 100644 --- a/keydb_db3.c +++ b/keydb_db4.c @@ -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 * - * Copyright 2002 Project Purple + * Copyright 2002-2004 Project Purple */ #include @@ -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,