* Jonathan McDowell <noodles@earth.li>
*
* Copyright 2002 Project Purple
+ *
+ * $Id: keydb_db3.c,v 1.16 2003/06/04 20:57:08 noodles Exp $
*/
#include <assert.h>
}
/*
- * This is a bit of a kludge. Either we run a separate process for
- * deadlock detection or we do this every time we run. What we really
- * want to do is specify that our locks are exclusive locks when we
- * start to do an update.
+ * Enable deadlock detection so that we don't block indefinitely on
+ * anything. What we really want is simple 2 state locks, but I'm not
+ * sure how to make the standard DB functions do that yet.
*/
- ret = lock_detect(dbenv,
- 0, /* flags */
- DB_LOCK_RANDOM,
- NULL); /* If non null int* for number broken */
+ ret = dbenv->set_lk_detect(dbenv, DB_LOCK_DEFAULT);
+ if (ret != 0) {
+ logthing(LOGTHING_CRITICAL,
+ "db_env_create: %s", db_strerror(ret));
+ exit(1);
+ }
ret = dbenv->open(dbenv, config.db_dir,
DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_LOCK |
DB_CREATE,
0);
if (ret != 0) {
- dbenv->err(dbenv, ret, "%s", config.db_dir);
+ logthing(LOGTHING_CRITICAL,
+ "Erroring opening db environment: %s (%s)",
+ config.db_dir,
+ db_strerror(ret));
exit(1);
}
DB_CREATE,
0664);
if (ret != 0) {
- dbconn->err(dbconn, ret, "keydb.db");
+ logthing(LOGTHING_CRITICAL,
+ "Error opening key database: %s (%s)",
+ "keydb.db",
+ db_strerror(ret));
exit(1);
}
DB_CREATE,
0664);
if (ret != 0) {
- worddb->err(worddb, ret, "worddb");
+ logthing(LOGTHING_CRITICAL,
+ "Error opening word database: %s (%s)",
+ "worddb",
+ db_strerror(ret));
exit(1);
}
*/
void cleanupdb(void)
{
+ txn_checkpoint(dbenv, 0, 0, 0);
worddb->close(worddb, 0);
worddb = NULL;
dbconn->close(dbconn, 0);
&txn,
0);
if (ret != 0) {
- dbenv->err(dbenv, ret, "starttrans():");
+ logthing(LOGTHING_CRITICAL,
+ "Error starting transaction: %s",
+ db_strerror(ret));
exit(1);
}
ret = txn_commit(txn,
0);
if (ret != 0) {
- dbenv->err(dbenv, ret, "endtrans():");
+ logthing(LOGTHING_CRITICAL,
+ "Error ending transaction: %s",
+ db_strerror(ret));
exit(1);
}
txn = NULL;
packets = NULL;
numkeys++;
} else if (ret != DB_NOTFOUND) {
- dbconn->err(dbconn, ret, "Problem retrieving key");
+ logthing(LOGTHING_ERROR,
+ "Problem retrieving key: %s",
+ db_strerror(ret));
}
if (!intrans) {
&data,
0); /* flags*/
if (ret != 0) {
- dbconn->err(dbconn, ret, "Problem storing key");
+ logthing(LOGTHING_ERROR,
+ "Problem storing key: %s",
+ db_strerror(ret));
if (ret == DB_LOCK_DEADLOCK) {
deadlock = true;
}
&data,
0);
if (ret != 0) {
- worddb->err(worddb, ret,
- "Problem storing key");
+ logthing(LOGTHING_ERROR,
+ "Problem storing word: %s",
+ db_strerror(ret));
if (ret == DB_LOCK_DEADLOCK) {
deadlock = true;
}
if (ret == 0) {
ret = cursor->c_del(cursor, 0);
if (ret != 0) {
- worddb->err(worddb, ret,
- "Problem deleting word.");
+ logthing(LOGTHING_ERROR,
+ "Problem deleting word: %s",
+ db_strerror(ret));
}
}
if (ret != 0) {
- worddb->err(worddb, ret,
- "Problem deleting word.");
+ logthing(LOGTHING_ERROR,
+ "Problem deleting word: %s",
+ db_strerror(ret));
if (ret == DB_LOCK_DEADLOCK) {
deadlock = true;
}
memset(&data, 0, sizeof(data));
ret = cursor->c_get(cursor, &key, &data, DB_NEXT);
}
- dbconn->err(dbconn, ret, "Problem reading key");
+ if (ret != DB_NOTFOUND) {
+ logthing(LOGTHING_ERROR, "Problem reading key: %s",
+ db_strerror(ret));
+ }
close(fd);