*
* Copyright 2002 Project Purple
*
- * $Id: keydb_db3.c,v 1.20 2003/09/30 20:40:10 noodles Exp $
+ * $Id: keydb_db3.c,v 1.26 2004/05/27 03:33:24 noodles Exp $
*/
#include <assert.h>
#include "log.h"
#include "onak-conf.h"
#include "parsekey.h"
+#include "wordlist.h"
/**
* dbenv - our database environment.
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.
- * @words: The string to split and add.
- *
- * We take words and split it on non alpha numeric characters. These get
- * added to the word list if they're not already present. If the wordlist
- * is NULL then we start a new list, otherwise it's search for already
- * added words. Note that words is modified in the process of scanning.
- *
- * Returns the new word list.
- */
-struct ll *makewordlist(struct ll *wordlist, char *word)
-{
- char *start = NULL;
- char *end = NULL;
+ uint64_t keytrun;
- /*
- * Walk through the words string, spliting on non alphanumerics and
- * then checking if the word already exists in the list. If not then
- * we add it.
- */
- end = word;
- while (end != NULL && *end != 0) {
- start = end;
- while (*start != 0 && !isalnum(*start)) {
- start++;
- }
- end = start;
- while (*end != 0 && isalnum(*end)) {
- *end = tolower(*end);
- end++;
- }
- if (end - start > 1) {
- if (*end != 0) {
- *end = 0;
- end++;
- }
-
- if (llfind(wordlist, start,
- strcmp) == NULL) {
- wordlist = lladd(wordlist,
- start);
- }
- }
- }
+ keytrun = keyid >> 8;
- return wordlist;
+ return(dbconns[keytrun % numdbs]);
}
/**
* this file are called in order to allow the DB to be initialized ready
* for access.
*/
-void initdb(void)
+void initdb(bool readonly)
{
- char buf[1024];
- FILE *numdb = NULL;
- int ret = 0;
- int i = 0;
+ char buf[1024];
+ FILE *numdb = NULL;
+ int ret = 0;
+ int i = 0;
+ u_int32_t flags = 0;
snprintf(buf, sizeof(buf) - 1, "%s/num_keydb", config.db_dir);
numdb = fopen(buf, "r");
numdbs = atoi(buf);
}
fclose(numdb);
- } else {
+ } else if (!readonly) {
logthing(LOGTHING_ERROR, "Couldn't open num_keydb: %s",
strerror(errno));
+ numdb = fopen(buf, "w");
+ if (numdb != NULL) {
+ fprintf(numdb, "%d", numdbs);
+ fclose(numdb);
+ } else {
+ logthing(LOGTHING_ERROR,
+ "Couldn't write num_keydb: %s",
+ strerror(errno));
+ }
}
dbconns = malloc(sizeof (DB *) * numdbs);
0);
if (ret != 0) {
logthing(LOGTHING_CRITICAL,
- "Erroring opening db environment: %s (%s)",
+ "Error opening db environment: %s (%s)",
config.db_dir,
db_strerror(ret));
exit(1);
}
snprintf(buf, 1023, "keydb.%d.db", i);
+ flags = DB_CREATE;
+ if (readonly) {
+ flags = DB_RDONLY;
+ }
ret = dbconns[i]->open(dbconns[i], buf,
NULL,
DB_HASH,
- DB_CREATE,
+ flags,
0664);
if (ret != 0) {
logthing(LOGTHING_CRITICAL,
ret = worddb->set_flags(worddb, DB_DUP);
ret = worddb->open(worddb, "worddb", NULL, DB_BTREE,
- DB_CREATE,
+ flags,
0664);
if (ret != 0) {
logthing(LOGTHING_CRITICAL,