diff options
Diffstat (limited to 'src/cmd/upas/bayes/msgdbx.c')
-rw-r--r-- | src/cmd/upas/bayes/msgdbx.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/cmd/upas/bayes/msgdbx.c b/src/cmd/upas/bayes/msgdbx.c new file mode 100644 index 00000000..60ce70ae --- /dev/null +++ b/src/cmd/upas/bayes/msgdbx.c @@ -0,0 +1,109 @@ +#include <u.h> +#include <libc.h> +#include <db.h> +#include "msgdb.h" + +struct Msgdb +{ + DB *db; + int reset; +}; + +Msgdb* +mdopen(char *file, int create) +{ + Msgdb *mdb; + DB *db; + HASHINFO h; + + if((mdb = mallocz(sizeof(Msgdb), 1)) == nil) + return nil; + memset(&h, 0, sizeof h); + h.cachesize = 2*1024*1024; + if((db = dbopen(file, ORDWR|(create ? OCREATE:0), 0666, DB_HASH, &h)) == nil){ + free(mdb); + return nil; + } + mdb->db = db; + mdb->reset = 1; + return mdb; +} + +long +mdget(Msgdb *mdb, char *tok) +{ + DB *db = mdb->db; + DBT key, val; + uchar *p; + + key.data = tok; + key.size = strlen(tok)+1; + val.data = 0; + val.size = 0; + + if(db->get(db, &key, &val, 0) < 0) + return 0; + if(val.data == 0) + return 0; + if(val.size != 4) + return 0; + p = val.data; + return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3]; +} + +void +mdput(Msgdb *mdb, char *tok, long n) +{ + uchar p[4]; + DB *db = mdb->db; + DBT key, val; + + key.data = tok; + key.size = strlen(tok)+1; + if(n <= 0){ + db->del(db, &key, 0); + return; + } + + p[0] = n>>24; + p[1] = n>>16; + p[2] = n>>8; + p[3] = n; + + val.data = p; + val.size = 4; + db->put(db, &key, &val, 0); +} + +void +mdenum(Msgdb *mdb) +{ + mdb->reset = 1; +} + +int +mdnext(Msgdb *mdb, char **sp, long *vp) +{ + DBT key, val; + uchar *p; + DB *db = mdb->db; + int i; + + i = db->seq(db, &key, &val, mdb->reset ? R_FIRST : R_NEXT); + mdb->reset = 0; + if(i) + return -1; + *sp = key.data; + p = val.data; + *vp = (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3]; + return 0; +} + +void +mdclose(Msgdb *mdb) +{ + DB *db = mdb->db; + + db->close(db); + mdb->db = nil; +} |