ref: a7c01127f9749fe471367c6461cde357403cc3b3
dir: /sys/src/cmd/upas/bayes/msgdbx.c/
#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; }