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