[cvs] bogofilter datastore_db.c,1.26,1.27 datastore_db.h,1.5,1.6
Fast Bayesian spam filter along lines suggested by Paul Graham
Brought to you by:
m-a
From: <gy...@pr...> - 2002-11-18 02:17:06
|
Update of /cvsroot/bogofilter/bogofilter In directory sc8-pr-cvs1:/tmp/cvs-serv14372 Modified Files: datastore_db.c datastore_db.h Log Message: preserve database byte order when it differs from cpu"s Index: datastore_db.c =================================================================== RCS file: /cvsroot/bogofilter/bogofilter/datastore_db.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- datastore_db.c 17 Nov 2002 11:32:10 -0000 1.26 +++ datastore_db.c 18 Nov 2002 02:17:03 -0000 1.27 @@ -31,10 +31,10 @@ #define DBT_init(dbt) do { memset(&dbt, 0, sizeof(DBT)); } while(0) -#ifndef HAVE_SYSLOG_H -#define SYSLOG_ERROR(format, filename) -#else +#ifdef HAVE_SYSLOG_H #define SYSLOG_ERROR(format, filename) if (logflag) syslog( LOG_ERR, format, filename) +#else +#define SYSLOG_ERROR(format, filename) #endif static void db_enforce_locking(dbh_t *handle, const char *func_name){ @@ -44,6 +44,12 @@ } } +/* stolen from glibc's byteswap.c */ +static long swap_long(long x){ + return ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | + (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)); +} + static dbh_t *dbh_init(const char *filename, const char *name){ dbh_t *handle; @@ -53,6 +59,7 @@ handle->name = xstrdup(name); handle->pid = getpid(); handle->locked = false; + handle->is_swapped= 0; return handle; } @@ -66,7 +73,7 @@ /* Initialize database. - Returns: pointer database handle on success, NULL otherwise. + Returns: pointer to database handle on success, NULL otherwise. */ void *db_open(const char *db_file, const char *name, dbmode_t open_mode){ int ret; @@ -92,7 +99,20 @@ handle->dbp->err (handle->dbp, ret, "%s (db) open: %s", progname, db_file); } else { - return (void *)handle; + /* see if the database byte order differs from that of the cpu's */ + int had_err = 0; + +#if DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR >= 3 + if ( (ret = handle->dbp->get_byteswapped (handle->dbp, &(handle->is_swapped))) != 0){ + handle->dbp->err (handle->dbp, ret, "%s (db) get_byteswapped: %s", progname, db_file); + had_err = 1; + } +#else + handle->is_swapped = handle->dbp->get_byteswapped (handle->dbp); +#endif + if (!had_err) + return (void *)handle; + } dbh_free(handle); @@ -123,9 +143,12 @@ ret = handle->dbp->get(handle->dbp, NULL, &db_key, &db_data, 0); xfree(t); - if (ret == 0) { + if (ret == 0) { value = *(long *)db_data.data; - + + if (handle->is_swapped) + value = swap_long(value); + if (DEBUG_DATABASE(2)) { fprintf(stderr, "[%lu] db_getvalue (%s): [%s] has value %ld\n", (unsigned long) handle->pid, handle->name, word, value); @@ -164,6 +187,9 @@ key.data = t = xstrdup(word); key.size = strlen(word); + + if (handle->is_swapped) + value = swap_long(value); data.data = &value; data.size = sizeof(long); Index: datastore_db.h =================================================================== RCS file: /cvsroot/bogofilter/bogofilter/datastore_db.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- datastore_db.h 11 Nov 2002 00:57:59 -0000 1.5 +++ datastore_db.h 18 Nov 2002 02:17:04 -0000 1.6 @@ -13,7 +13,7 @@ DB *dbp; pid_t pid; bool locked; - + int is_swapped; } dbh_t; #endif |