[cvs] bogofilter/src datastore.c,1.28.2.6,1.28.2.7 datastore.h,1.27.2.7,1.27.2.8 datastore_db.c,1.93
Fast Bayesian spam filter along lines suggested by Paul Graham
Brought to you by:
m-a
Update of /cvsroot/bogofilter/bogofilter/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4280/src Modified Files: Tag: branch-db-txn datastore.c datastore.h datastore_db.c datastore_db.h datastore_qdbm.c datastore_tdb.c Log Message: Merge datastore layer cleanup from trunk. Index: datastore.c =================================================================== RCS file: /cvsroot/bogofilter/bogofilter/src/datastore.c,v retrieving revision 1.28.2.6 retrieving revision 1.28.2.7 diff -u -d -r1.28.2.6 -r1.28.2.7 --- datastore.c 4 Jun 2004 22:03:03 -0000 1.28.2.6 +++ datastore.c 9 Jun 2004 07:35:03 -0000 1.28.2.7 @@ -102,12 +102,11 @@ } dsh_t *dsh_init( - void *dbh, /* database handle from db_open() */ - bool is_swapped) + void *dbh) /* database handle from db_open() */ { dsh_t *val = xmalloc(sizeof(*val)); val->dbh = dbh; - val->is_swapped = is_swapped; + val->is_swapped = db_is_swapped(dbh); return val; } @@ -120,16 +119,24 @@ void *ds_open(const char *path, const char *name, dbmode_t open_mode) { + dsh_t *dsh; + bool create = false; void *v = db_open(path, name, open_mode); if (v == NULL && open_mode != DS_READ) { + create = true; v = db_open(path, name, DS_CREATE); - - if (v && (open_mode & DS_WRITE) && ! (open_mode & DS_LOAD)) - ds_set_wordlist_version(v, NULL); } - return v; + if (!v) + return NULL; + + dsh = dsh_init(v); + + if (create && (open_mode & DS_WRITE) && ! (open_mode & DS_LOAD)) + ds_set_wordlist_version(dsh, NULL); + + return dsh; } void ds_close(/*@only@*/ void *vhandle, bool nosync /** Normally false, if true, do not synchronize data. This should not be used in regular operation but only to ease the disk I/O load when the lock operation failed. */) @@ -142,7 +149,7 @@ void ds_flush(void *vhandle) { dsh_t *dsh = vhandle; - db_flush(dsh); + db_flush(dsh->dbh); } int ds_read(void *vhandle, const word_t *word, /*@out@*/ dsv_t *val) @@ -168,7 +175,7 @@ ex_data.data = cv; ex_data.leng = sizeof(cv); - ret = db_get_dbvalue(dsh, &ex_key, &ex_data); + ret = db_get_dbvalue(dsh->dbh, &ex_key, &ex_data); switch (ret) { case 0: @@ -178,7 +185,7 @@ if (DEBUG_DATABASE(3)) { fprintf(dbgout, "ds_read: [%.*s] -- %lu,%lu\n", - CLAMP_INT_MAX(word->leng), word->text, + CLAMP_INT_MAX(word->leng), (const char *)word->text, (unsigned long)val->spamcount, (unsigned long)val->goodcount); } @@ -223,11 +230,11 @@ convert_internal_to_external(dsh, val, &ex_data); - ret = db_set_dbvalue(dsh, &ex_key, &ex_data); + ret = db_set_dbvalue(dsh->dbh, &ex_key, &ex_data); if (DEBUG_DATABASE(3)) { fprintf(dbgout, "ds_write: [%.*s] -- %lu,%lu,%lu\n", - CLAMP_INT_MAX(word->leng), word->text, + CLAMP_INT_MAX(word->leng), (const char *)word->text, (unsigned long)val->spamcount, (unsigned long)val->goodcount, (unsigned long)val->date); @@ -246,14 +253,25 @@ ex_key.data = word->text; ex_key.leng = word->leng; - ret = db_delete(dsh, &ex_key); + ret = db_delete(dsh->dbh, &ex_key); return ret; /* 0 if ok */ } -int ds_txn_begin(void *vhandle) { return db_txn_begin(vhandle); } -int ds_txn_abort(void *vhandle) { return db_txn_abort(vhandle); } -int ds_txn_commit(void *vhandle) { return db_txn_commit(vhandle); } +int ds_txn_begin(void *vhandle) { + dsh_t *h = vhandle; + return db_txn_begin(h->dbh); +} + +int ds_txn_abort(void *vhandle) { + dsh_t *h = vhandle; + return db_txn_abort(h->dbh); +} + +int ds_txn_commit(void *vhandle) { + dsh_t *h = vhandle; + return db_txn_commit(h->dbh); +} typedef struct { ds_foreach_t *hook; @@ -291,7 +309,7 @@ ds_data.dsh = dsh; ds_data.data = userdata; - ret = db_foreach(dsh, ds_hook, &ds_data); + ret = db_foreach(dsh->dbh, ds_hook, &ds_data); return ret; } Index: datastore.h =================================================================== RCS file: /cvsroot/bogofilter/bogofilter/src/datastore.h,v retrieving revision 1.27.2.7 retrieving revision 1.27.2.8 diff -u -d -r1.27.2.7 -r1.27.2.8 --- datastore.h 4 Jun 2004 22:03:19 -0000 1.27.2.7 +++ datastore.h 9 Jun 2004 07:35:04 -0000 1.27.2.8 @@ -118,8 +118,7 @@ /** Initialize datastore handle. */ dsh_t *dsh_init( - void *dbh, /* database handle from db_open() */ - bool is_swapped); + void *dbh); /* database handle from db_open() */ /** Free data store handle that must not be used after calling this * function. */ Index: datastore_db.c =================================================================== RCS file: /cvsroot/bogofilter/bogofilter/src/datastore_db.c,v retrieving revision 1.93.2.13 retrieving revision 1.93.2.14 diff -u -d -r1.93.2.13 -r1.93.2.14 --- datastore_db.c 7 Jun 2004 22:25:01 -0000 1.93.2.13 +++ datastore_db.c 9 Jun 2004 07:35:04 -0000 1.93.2.14 @@ -167,6 +167,13 @@ /* If header and library version do not match, * print an error message on stderr and exit with EX_ERROR. */ + +bool db_is_swapped(void *vhandle) +{ + dbh_t *handle = vhandle; + return handle->is_swapped; +} + static void check_db_version(void) { int maj, min; @@ -390,13 +397,7 @@ check_fsize_limit(handle->fd, pagesize); } - if (handle) { - dsh_t *dsh; - dsh = dsh_init(handle, handle->is_swapped); - return (void *)dsh; - } - - return NULL; + return handle; open_err: dbh_free(handle); @@ -425,14 +426,14 @@ #endif /** begin transaction. Returns 0 for success. */ -int db_txn_begin(dsh_t *dsh) +int db_txn_begin(void *vhandle) { DB_TXN *t; int ret; + dbh_t *handle = vhandle; assert(dbe); - assert(dsh); - assert(dsh->dbh); + assert(handle); ret = BF_TXN_BEGIN(dbe, NULL, &t, 0); if (ret) { @@ -440,7 +441,7 @@ dbe, db_strerror(ret)); return ret; } - ((dbh_t *)dsh->dbh)->txn = t; + handle->txn = t; if (DEBUG_DATABASE(1)) fprintf(dbgout, "DB_ENV->txn_begin(%p), tid: %lx\n", dbe, (unsigned long)BF_TXN_ID(t)); @@ -448,10 +449,11 @@ return 0; } -int db_txn_abort(dsh_t *dsh) +int db_txn_abort(void *vhandle) { int ret; - DB_TXN *t = ((dbh_t *)dsh->dbh)->txn; + dbh_t *handle = vhandle; + DB_TXN *t = handle->txn; assert(dbe); assert(t); @@ -463,7 +465,7 @@ if (DEBUG_DATABASE(1)) fprintf(dbgout, "DB_TXN->abort(%lx)\n", (unsigned long)BF_TXN_ID(t)); - ((dbh_t *)dsh->dbh)->txn = NULL; + handle->txn = NULL; switch (ret) { case 0: @@ -475,10 +477,11 @@ } } -int db_txn_commit(dsh_t *dsh) +int db_txn_commit(void *vhandle) { int ret; - DB_TXN *t = ((dbh_t *)dsh->dbh)->txn; + dbh_t *handle = vhandle; + DB_TXN *t = handle->txn; assert(dbe); assert(t); @@ -490,7 +493,7 @@ if (DEBUG_DATABASE(1)) fprintf(dbgout, "DB_TXN->commit(%lx, 0)\n", (unsigned long)BF_TXN_ID(t)); - ((dbh_t *)dsh->dbh)->txn = NULL; + handle->txn = NULL; switch (ret) { case 0: @@ -502,10 +505,10 @@ } } -int db_delete(dsh_t *dsh, const dbv_t *token) +int db_delete(void *vhandle, const dbv_t *token) { int ret = 0; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; DB *dbp = handle->dbp; DBT db_key; @@ -533,13 +536,13 @@ } -int db_get_dbvalue(dsh_t *dsh, const dbv_t *token, /*@out@*/ dbv_t *val) +int db_get_dbvalue(void *vhandle, const dbv_t *token, /*@out@*/ dbv_t *val) { int ret = 0; DBT db_key; DBT db_data; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; DB *dbp = handle->dbp; assert(handle->txn); @@ -572,7 +575,7 @@ default: print_error(__FILE__, __LINE__, "(db) DB->get( '%.*s' ), err: %d, %s", CLAMP_INT_MAX(token->leng), (char *) token->data, ret, db_strerror(ret)); - db_txn_abort(dsh); + db_txn_abort(handle); exit(EX_ERROR); } @@ -580,14 +583,14 @@ } -int db_set_dbvalue(dsh_t *dsh, const dbv_t *token, dbv_t *val) +int db_set_dbvalue(void *vhandle, const dbv_t *token, dbv_t *val) { int ret; DBT db_key; DBT db_data; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; DB *dbp = handle->dbp; assert(handle->txn); @@ -603,7 +606,7 @@ ret = dbp->put(dbp, handle->txn, &db_key, &db_data, 0); if (ret == DB_LOCK_DEADLOCK) - db_txn_abort(dsh); + db_txn_abort(handle); if (ret != 0) { print_error(__FILE__, __LINE__, "(db) db_set_dbvalue( '%.*s' ), err: %d, %s", @@ -652,10 +655,10 @@ /* flush any data in memory to disk */ -void db_flush(dsh_t *dsh) +void db_flush(void *vhandle) { int ret; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; DB *dbp = handle->dbp; if (DEBUG_DATABASE(1)) @@ -678,9 +681,9 @@ fprintf(dbgout, "DB_ENV->log_flush(%p): %s\n", dbe, db_strerror(ret)); } -int db_foreach(dsh_t *dsh, db_foreach_t hook, void *userdata) +int db_foreach(void *vhandle, db_foreach_t hook, void *userdata) { - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; DB *dbp = handle->dbp; int ret = 0, eflag = 0; Index: datastore_db.h =================================================================== RCS file: /cvsroot/bogofilter/bogofilter/src/datastore_db.h,v retrieving revision 1.8.4.4 retrieving revision 1.8.4.5 diff -u -d -r1.8.4.4 -r1.8.4.5 --- datastore_db.h 4 Jun 2004 22:03:19 -0000 1.8.4.4 +++ datastore_db.h 9 Jun 2004 07:35:04 -0000 1.8.4.5 @@ -36,7 +36,7 @@ void db_close(/*@only@*/ void *vhandle, bool nosync /** Normally false, if true, do not synchronize data. This should not be used in regular operation but only to ease the disk I/O load when the lock operation failed. */); /** Flush pending writes to disk */ -void db_flush(dsh_t *dsh); +void db_flush(void *handle); /** Do global initializations. \return 0 for success, non-zero for * error. */ @@ -48,33 +48,33 @@ /** Retrieve the value associated with a given word in a list. * \return zero if the word does not exist in the database. Front-end */ -bool db_getvalues(dsh_t *dsh, const dbv_t *key, dbv_t *val); +bool db_getvalues(void *handle, const dbv_t *key, dbv_t *val); /** Retrieve the value associated with a given word in a list. * \return zero if the word does not exist in the database. Implementation */ -int db_get_dbvalue(dsh_t *dsh, const dbv_t *token, /*@out@*/ dbv_t *val); +int db_get_dbvalue(void *handle, const dbv_t *token, /*@out@*/ dbv_t *val); /** Delete the key */ -int db_delete(dsh_t *dsh, const dbv_t *data); +int db_delete(void *handle, const dbv_t *data); /** Set the value associated with a given word in a list. Front end */ -int db_setvalues(dsh_t *dsh, const dbv_t *token, dbv_t *val); +int db_setvalues(void *handle, const dbv_t *token, dbv_t *val); /** Set the value associated with a given word in a list. Implementation */ -int db_set_dbvalue(dsh_t *dsh, const dbv_t *token, dbv_t *val); +int db_set_dbvalue(void *handle, const dbv_t *token, dbv_t *val); /** Update the value associated with a given word in a list */ -void db_updvalues(dsh_t *dsh, const dbv_t *token, const dbv_t *updval); +void db_updvalues(void *handle, const dbv_t *token, const dbv_t *updval); /** Iterate over all elements in data base and call \p hook for each item. * \p userdata is passed through to the hook function unaltered. */ typedef int (*db_foreach_t)(dbv_t *token, dbv_t *data, void *userdata); -int db_foreach(dsh_t *dsh, db_foreach_t hook, void *userdata); +int db_foreach(void *handle, db_foreach_t hook, void *userdata); /* Get the database filename */ -char *db_handle_filename(dsh_t *dsh); +char *db_handle_filename(void *handle); /* Returns error associated with code */ const char *db_str_err(int); @@ -82,13 +82,16 @@ /* Returns version string */ const char *db_version_str(void); -/* */ -int db_txn_begin(dsh_t *dsh); -int db_txn_abort(dsh_t *dsh); -int db_txn_commit(dsh_t *dsh); +/* Transactional interfaces */ +int db_txn_begin(void *handle); +int db_txn_abort(void *handle); +int db_txn_commit(void *handle); + +/* Returns is_swapped flag */ +bool db_is_swapped(void *vhandle); /* This is not currently used ... - * + * #define db_write_lock(fd) db_lock(fd, F_SETLKW, F_WRLCK) #define db_read_lock(fd) db_lock(fd, F_SETLKW, F_RDLCK) #define db_unlock(fd) db_lock(fd, F_SETLK, F_UNLCK) Index: datastore_qdbm.c =================================================================== RCS file: /cvsroot/bogofilter/bogofilter/src/datastore_qdbm.c,v retrieving revision 1.21.2.2 retrieving revision 1.21.2.3 diff -u -d -r1.21.2.2 -r1.21.2.3 --- datastore_qdbm.c 4 Jun 2004 22:03:19 -0000 1.21.2.2 +++ datastore_qdbm.c 9 Jun 2004 07:35:04 -0000 1.21.2.3 @@ -83,13 +83,19 @@ } +bool db_is_swapped(void *vhandle) +{ + vhandle = NULL; /* assignment to suppress compiler warning */ + return false; +} + + /* Initialize database. Returns: pointer to database handle on success, NULL otherwise. */ void *db_open(const char *db_file, const char *name, dbmode_t open_mode) { - dsh_t *dsh; dbh_t *handle; int flags; @@ -104,8 +110,6 @@ if (handle == NULL) return NULL; - dsh = dsh_init(handle, false); - dbp = handle->dbp = dpopen(handle->name, flags, DB_INITBNUM); if (dbp == NULL) @@ -121,7 +125,7 @@ if (DEBUG_DATABASE(1)) fprintf(dbgout, "(qdbm) dpopen( %s, %d )\n", handle->name, open_mode); - return dsh; + return handle; open_err: print_error(__FILE__, __LINE__, "(qdbm) dpopen(%s, %d) failed: %s", @@ -132,10 +136,10 @@ } -int db_delete(dsh_t *dsh, const dbv_t *token) +int db_delete(void *vhandle, const dbv_t *token) { int ret; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; DEPOT *dbp; dbp = handle->dbp; @@ -153,12 +157,12 @@ } -int db_get_dbvalue(dsh_t *dsh, const dbv_t *token, /*@out@*/ dbv_t *val) +int db_get_dbvalue(void *vhandle, const dbv_t *token, /*@out@*/ dbv_t *val) { char *data; int dsiz; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; DEPOT *dbp = handle->dbp; data = dpget(dbp, token->data, token->leng, 0, -1, &dsiz); @@ -200,10 +204,10 @@ } -int db_set_dbvalue(dsh_t *dsh, const dbv_t *token, dbv_t *val) +int db_set_dbvalue(void *vhandle, const dbv_t *token, dbv_t *val) { int ret; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; DEPOT *dbp = handle->dbp; ret = dpput(dbp, token->data, token->leng, val->data, val->leng, DP_DOVER); @@ -252,9 +256,9 @@ /* Flush any data in memory to disk */ -void db_flush(dsh_t *dsh) +void db_flush(void *vhandle) { - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; DEPOT * dbp = handle->dbp; if (!dpsync(dbp)) @@ -263,11 +267,11 @@ } -int db_foreach(dsh_t *dsh, db_foreach_t hook, void *userdata) +int db_foreach(void *vhandle, db_foreach_t hook, void *userdata) { int ret = 0; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; DEPOT *dbp = handle->dbp; dbv_t dbv_key, dbv_data; Index: datastore_tdb.c =================================================================== RCS file: /cvsroot/bogofilter/bogofilter/src/datastore_tdb.c,v retrieving revision 1.24.4.2 retrieving revision 1.24.4.3 diff -u -d -r1.24.4.2 -r1.24.4.3 --- datastore_tdb.c 4 Jun 2004 22:03:19 -0000 1.24.4.2 +++ datastore_tdb.c 9 Jun 2004 07:35:04 -0000 1.24.4.3 @@ -69,13 +69,19 @@ } +bool db_is_swapped(void *vhandle) +{ + dbh_t *handle = vhandle; + return handle->is_swapped; +} + + /* Initialize database. Returns: pointer to database handle on success, NULL otherwise. */ void *db_open(const char *db_file, const char *name, dbmode_t open_mode) { - dsh_t *dsh; dbh_t *handle; int tdb_flags = 0; @@ -94,8 +100,6 @@ if (handle == NULL) return NULL; - dsh = dsh_init(handle, false); - dbp = handle->dbp = tdb_open(handle->name, 0, tdb_flags, open_flags, 0664); if (dbp == NULL) @@ -115,7 +119,7 @@ } } - return dsh; + return handle; open_err: dbh_free(handle); @@ -123,10 +127,10 @@ return NULL; } -int db_delete(dsh_t *dsh, const dbv_t *token) +int db_delete(void *vhandle, const dbv_t *token) { int ret; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; TDB_DATA db_key; TDB_CONTEXT *dbp; @@ -146,12 +150,12 @@ return ret; /* 0 if ok */ } -int db_get_dbvalue(dsh_t *dsh, const dbv_t *token, /*@out@*/ dbv_t *val) +int db_get_dbvalue(void *vhandle, const dbv_t *token, /*@out@*/ dbv_t *val) { TDB_DATA db_key; TDB_DATA db_data; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; TDB_CONTEXT *dbp = handle->dbp; db_key.dptr = token->data; @@ -179,13 +183,13 @@ } -int db_set_dbvalue(dsh_t *dsh, const dbv_t *token, dbv_t *val) +int db_set_dbvalue(void *vhandle, const dbv_t *token, dbv_t *val) { int ret; TDB_DATA db_key; TDB_DATA db_data; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; TDB_CONTEXT *dbp = handle->dbp; db_key.dptr = token->data; @@ -232,7 +236,7 @@ /* flush any data in memory to disk */ -void db_flush(/*@unused@*/ __attribute__ ((unused)) dsh_t *dsh) +void db_flush(/*@unused@*/ __attribute__ ((unused)) void *vhandle) { /* noop */ } @@ -270,10 +274,10 @@ } -int db_foreach(dsh_t *dsh, db_foreach_t hook, void *userdata) +int db_foreach(void *vhandle, db_foreach_t hook, void *userdata) { int ret; - dbh_t *handle = dsh->dbh; + dbh_t *handle = vhandle; TDB_CONTEXT *dbp = handle->dbp; userdata_t hookdata; |