Author: noodles
Date: 2003/09/28 14:54:57
Add support for multiple DB3 key database files.
*
* Copyright 2002 Project Purple
*
*
* Copyright 2002 Project Purple
*
- * $Id: keydb_db3.c,v 1.16 2003/06/04 20:57:08 noodles Exp $
+ * $Id: keydb_db3.c,v 1.17 2003/09/28 14:54:57 noodles Exp $
static DB_ENV *dbenv = NULL;
/**
static DB_ENV *dbenv = NULL;
/**
- * dbconn - our connection to the key database.
+ * numdb - The number of database files we have.
-static DB *dbconn = NULL;
+static int numdbs = 16;
+
+/**
+ * dbconn - our connections to the key database files.
+ */
+static DB **dbconns = NULL;
/**
* worddb - our connection to the word database.
/**
* worddb - our connection to the word database.
*/
static DB_TXN *txn = NULL;
*/
static DB_TXN *txn = NULL;
+DB *keydb(uint64_t keyid)
+{
+ return(dbconns[keyid % numdbs]);
+}
+
/**
* makewordlist - Takes a string and splits it into a set of unique words.
* @wordlist: The current word list.
/**
* makewordlist - Takes a string and splits it into a set of unique words.
* @wordlist: The current word list.
+ char buf[1024];
+ FILE *numdb = NULL;
+ int ret = 0;
+ int i = 0;
+
+ snprintf(buf, sizeof(buf) - 1, "%s/num_keydb", config.db_dir);
+ numdb = fopen(buf, "r");
+ if (numdb != NULL) {
+ if (fgets(buf, sizeof(buf), numdb) != NULL) {
+ numdbs = atoi(buf);
+ }
+ fclose(numdb);
+ } else {
+ logthing(LOGTHING_ERROR, "Couldn't open num_keydb: %s",
+ strerror(errno));
+ }
+
+ dbconns = malloc(sizeof (DB *) * numdbs);
+ if (dbconns == NULL) {
+ logthing(LOGTHING_CRITICAL,
+ "Couldn't allocate memory for dbconns");
+ exit(1);
+ }
ret = db_env_create(&dbenv, 0);
if (ret != 0) {
ret = db_env_create(&dbenv, 0);
if (ret != 0) {
- ret = db_create(&dbconn, dbenv, 0);
- if (ret != 0) {
- logthing(LOGTHING_CRITICAL,
+ for (i = 0; i < numdbs; i++) {
+ ret = db_create(&dbconns[i], dbenv, 0);
+ if (ret != 0) {
+ logthing(LOGTHING_CRITICAL,
"db_create: %s", db_strerror(ret));
"db_create: %s", db_strerror(ret));
- ret = dbconn->open(dbconn, "keydb.db",
+ snprintf(buf, 1023, "keydb.%d.db", i);
+ ret = dbconns[i]->open(dbconns[i], buf,
NULL,
DB_HASH,
DB_CREATE,
0664);
NULL,
DB_HASH,
DB_CREATE,
0664);
- if (ret != 0) {
- logthing(LOGTHING_CRITICAL,
+ if (ret != 0) {
+ logthing(LOGTHING_CRITICAL,
"Error opening key database: %s (%s)",
"Error opening key database: %s (%s)",
}
ret = db_create(&worddb, dbenv, 0);
}
ret = db_create(&worddb, dbenv, 0);
*/
void cleanupdb(void)
{
*/
void cleanupdb(void)
{
txn_checkpoint(dbenv, 0, 0, 0);
worddb->close(worddb, 0);
worddb = NULL;
txn_checkpoint(dbenv, 0, 0, 0);
worddb->close(worddb, 0);
worddb = NULL;
- dbconn->close(dbconn, 0);
- dbconn = NULL;
+ for (i = 0; i < numdbs; i++) {
+ dbconns[i]->close(dbconns[i], 0);
+ dbconns[i] = NULL;
+ }
dbenv->close(dbenv, 0);
dbenv = NULL;
}
dbenv->close(dbenv, 0);
dbenv = NULL;
}
- ret = dbconn->get(dbconn,
+ ret = keydb(keyid)->get(keydb(keyid),
data.size = storebuf.offset;
data.data = storebuf.buffer;
data.size = storebuf.offset;
data.data = storebuf.buffer;
- ret = dbconn->put(dbconn,
+ ret = keydb(keyid)->put(keydb(keyid),
key.data = &keyid;
key.size = sizeof(keyid);
key.data = &keyid;
key.size = sizeof(keyid);
+ keydb(keyid)->del(keydb(keyid),
txn,
&key,
0); /* flags */
txn,
&key,
0); /* flags */
DBC *cursor = NULL;
int ret = 0;
int fd = -1;
DBC *cursor = NULL;
int ret = 0;
int fd = -1;
+ for (i = 0; i < numdbs; i++) {
+ starttrans();
- ret = dbconn->cursor(dbconn,
- txn,
- &cursor,
- 0); /* flags */
+ ret = dbconns[i]->cursor(dbconns[i],
+ NULL,
+ &cursor,
+ 0); /* flags */
- fd = open(filenamebase, O_CREAT | O_WRONLY | O_TRUNC, 0640);
- memset(&key, 0, sizeof(key));
- memset(&data, 0, sizeof(data));
- ret = cursor->c_get(cursor, &key, &data, DB_NEXT);
- while (ret == 0) {
- write(fd, data.data, data.size);
+ fd = open(filenamebase, O_CREAT | O_WRONLY | O_TRUNC, 0640);
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
ret = cursor->c_get(cursor, &key, &data, DB_NEXT);
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
ret = cursor->c_get(cursor, &key, &data, DB_NEXT);
- }
- if (ret != DB_NOTFOUND) {
- logthing(LOGTHING_ERROR, "Problem reading key: %s",
- db_strerror(ret));
- }
+ while (ret == 0) {
+ write(fd, data.data, data.size);
+ memset(&key, 0, sizeof(key));
+ memset(&data, 0, sizeof(data));
+ ret = cursor->c_get(cursor, &key, &data, DB_NEXT);
+ }
+ if (ret != DB_NOTFOUND) {
+ logthing(LOGTHING_ERROR, "Problem reading key: %s",
+ db_strerror(ret));
+ }
- ret = cursor->c_close(cursor);
- cursor = NULL;
+ ret = cursor->c_close(cursor);
+ cursor = NULL;