xref: /plan9/sys/src/cmd/upas/bayes/msgdbx.c (revision 4246b6162acdbb658503b8bdc98024362bfbf0fe)
1*4246b616SDavid du Colombier #include <u.h>
2*4246b616SDavid du Colombier #include <libc.h>
3*4246b616SDavid du Colombier #include <db.h>
4*4246b616SDavid du Colombier #include "msgdb.h"
5*4246b616SDavid du Colombier 
6*4246b616SDavid du Colombier struct Msgdb
7*4246b616SDavid du Colombier {
8*4246b616SDavid du Colombier 	DB *db;
9*4246b616SDavid du Colombier 	int reset;
10*4246b616SDavid du Colombier };
11*4246b616SDavid du Colombier 
12*4246b616SDavid du Colombier Msgdb*
mdopen(char * file,int create)13*4246b616SDavid du Colombier mdopen(char *file, int create)
14*4246b616SDavid du Colombier {
15*4246b616SDavid du Colombier 	Msgdb *mdb;
16*4246b616SDavid du Colombier 	DB *db;
17*4246b616SDavid du Colombier 	HASHINFO h;
18*4246b616SDavid du Colombier 
19*4246b616SDavid du Colombier 	if((mdb = mallocz(sizeof(Msgdb), 1)) == nil)
20*4246b616SDavid du Colombier 		return nil;
21*4246b616SDavid du Colombier 	memset(&h, 0, sizeof h);
22*4246b616SDavid du Colombier 	h.cachesize = 2*1024*1024;
23*4246b616SDavid du Colombier 	if((db = dbopen(file, ORDWR|(create ? OCREATE:0), 0666, DB_HASH, &h)) == nil){
24*4246b616SDavid du Colombier 		free(mdb);
25*4246b616SDavid du Colombier 		return nil;
26*4246b616SDavid du Colombier 	}
27*4246b616SDavid du Colombier 	mdb->db = db;
28*4246b616SDavid du Colombier 	mdb->reset = 1;
29*4246b616SDavid du Colombier 	return mdb;
30*4246b616SDavid du Colombier }
31*4246b616SDavid du Colombier 
32*4246b616SDavid du Colombier long
mdget(Msgdb * mdb,char * tok)33*4246b616SDavid du Colombier mdget(Msgdb *mdb, char *tok)
34*4246b616SDavid du Colombier {
35*4246b616SDavid du Colombier 	DB *db = mdb->db;
36*4246b616SDavid du Colombier 	DBT key, val;
37*4246b616SDavid du Colombier 	uchar *p;
38*4246b616SDavid du Colombier 
39*4246b616SDavid du Colombier 	key.data = tok;
40*4246b616SDavid du Colombier 	key.size = strlen(tok)+1;
41*4246b616SDavid du Colombier 	val.data = 0;
42*4246b616SDavid du Colombier 	val.size = 0;
43*4246b616SDavid du Colombier 
44*4246b616SDavid du Colombier 	if(db->get(db, &key, &val, 0) < 0)
45*4246b616SDavid du Colombier 		return 0;
46*4246b616SDavid du Colombier 	if(val.data == 0)
47*4246b616SDavid du Colombier 		return 0;
48*4246b616SDavid du Colombier 	if(val.size != 4)
49*4246b616SDavid du Colombier 		return 0;
50*4246b616SDavid du Colombier 	p = val.data;
51*4246b616SDavid du Colombier 	return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
52*4246b616SDavid du Colombier }
53*4246b616SDavid du Colombier 
54*4246b616SDavid du Colombier void
mdput(Msgdb * mdb,char * tok,long n)55*4246b616SDavid du Colombier mdput(Msgdb *mdb, char *tok, long n)
56*4246b616SDavid du Colombier {
57*4246b616SDavid du Colombier 	uchar p[4];
58*4246b616SDavid du Colombier 	DB *db = mdb->db;
59*4246b616SDavid du Colombier 	DBT key, val;
60*4246b616SDavid du Colombier 
61*4246b616SDavid du Colombier 	key.data = tok;
62*4246b616SDavid du Colombier 	key.size = strlen(tok)+1;
63*4246b616SDavid du Colombier 	if(n <= 0){
64*4246b616SDavid du Colombier 		db->del(db, &key, 0);
65*4246b616SDavid du Colombier 		return;
66*4246b616SDavid du Colombier 	}
67*4246b616SDavid du Colombier 
68*4246b616SDavid du Colombier 	p[0] = n>>24;
69*4246b616SDavid du Colombier 	p[1] = n>>16;
70*4246b616SDavid du Colombier 	p[2] = n>>8;
71*4246b616SDavid du Colombier 	p[3] = n;
72*4246b616SDavid du Colombier 
73*4246b616SDavid du Colombier 	val.data = p;
74*4246b616SDavid du Colombier 	val.size = 4;
75*4246b616SDavid du Colombier 	db->put(db, &key, &val, 0);
76*4246b616SDavid du Colombier }
77*4246b616SDavid du Colombier 
78*4246b616SDavid du Colombier void
mdenum(Msgdb * mdb)79*4246b616SDavid du Colombier mdenum(Msgdb *mdb)
80*4246b616SDavid du Colombier {
81*4246b616SDavid du Colombier 	mdb->reset = 1;
82*4246b616SDavid du Colombier }
83*4246b616SDavid du Colombier 
84*4246b616SDavid du Colombier int
mdnext(Msgdb * mdb,char ** sp,long * vp)85*4246b616SDavid du Colombier mdnext(Msgdb *mdb, char **sp, long *vp)
86*4246b616SDavid du Colombier {
87*4246b616SDavid du Colombier 	DBT key, val;
88*4246b616SDavid du Colombier 	uchar *p;
89*4246b616SDavid du Colombier 	DB *db = mdb->db;
90*4246b616SDavid du Colombier 	int i;
91*4246b616SDavid du Colombier 
92*4246b616SDavid du Colombier 	i = db->seq(db, &key, &val, mdb->reset ? R_FIRST : R_NEXT);
93*4246b616SDavid du Colombier 	mdb->reset = 0;
94*4246b616SDavid du Colombier 	if(i)
95*4246b616SDavid du Colombier 		return -1;
96*4246b616SDavid du Colombier 	*sp = key.data;
97*4246b616SDavid du Colombier 	p = val.data;
98*4246b616SDavid du Colombier 	*vp = (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
99*4246b616SDavid du Colombier 	return 0;
100*4246b616SDavid du Colombier }
101*4246b616SDavid du Colombier 
102*4246b616SDavid du Colombier void
mdclose(Msgdb * mdb)103*4246b616SDavid du Colombier mdclose(Msgdb *mdb)
104*4246b616SDavid du Colombier {
105*4246b616SDavid du Colombier 	DB *db = mdb->db;
106*4246b616SDavid du Colombier 
107*4246b616SDavid du Colombier 	db->close(db);
108*4246b616SDavid du Colombier 	mdb->db = nil;
109*4246b616SDavid du Colombier }
110