1 d1f529f4 2005-10-29 devnull #include <u.h>
2 d1f529f4 2005-10-29 devnull #include <libc.h>
3 d1f529f4 2005-10-29 devnull #include <db.h>
4 d1f529f4 2005-10-29 devnull #include "msgdb.h"
6 d1f529f4 2005-10-29 devnull struct Msgdb
9 d1f529f4 2005-10-29 devnull int reset;
13 d1f529f4 2005-10-29 devnull mdopen(char *file, int create)
15 d1f529f4 2005-10-29 devnull Msgdb *mdb;
17 d1f529f4 2005-10-29 devnull HASHINFO h;
19 d1f529f4 2005-10-29 devnull if((mdb = mallocz(sizeof(Msgdb), 1)) == nil)
20 d1f529f4 2005-10-29 devnull return nil;
21 d1f529f4 2005-10-29 devnull memset(&h, 0, sizeof h);
22 d1f529f4 2005-10-29 devnull h.cachesize = 2*1024*1024;
23 d1f529f4 2005-10-29 devnull if((db = dbopen(file, ORDWR|(create ? OCREATE:0), 0666, DB_HASH, &h)) == nil){
24 d1f529f4 2005-10-29 devnull free(mdb);
25 d1f529f4 2005-10-29 devnull return nil;
27 d1f529f4 2005-10-29 devnull mdb->db = db;
28 d1f529f4 2005-10-29 devnull mdb->reset = 1;
29 d1f529f4 2005-10-29 devnull return mdb;
33 d1f529f4 2005-10-29 devnull mdget(Msgdb *mdb, char *tok)
35 d1f529f4 2005-10-29 devnull DB *db = mdb->db;
36 d1f529f4 2005-10-29 devnull DBT key, val;
37 d1f529f4 2005-10-29 devnull uchar *p;
39 d1f529f4 2005-10-29 devnull key.data = tok;
40 d1f529f4 2005-10-29 devnull key.size = strlen(tok)+1;
41 d1f529f4 2005-10-29 devnull val.data = 0;
42 d1f529f4 2005-10-29 devnull val.size = 0;
44 d1f529f4 2005-10-29 devnull if(db->get(db, &key, &val, 0) < 0)
45 d1f529f4 2005-10-29 devnull return 0;
46 d1f529f4 2005-10-29 devnull if(val.data == 0)
47 d1f529f4 2005-10-29 devnull return 0;
48 d1f529f4 2005-10-29 devnull if(val.size != 4)
49 d1f529f4 2005-10-29 devnull return 0;
50 d1f529f4 2005-10-29 devnull p = val.data;
51 d1f529f4 2005-10-29 devnull return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
55 d1f529f4 2005-10-29 devnull mdput(Msgdb *mdb, char *tok, long n)
57 d1f529f4 2005-10-29 devnull uchar p[4];
58 d1f529f4 2005-10-29 devnull DB *db = mdb->db;
59 d1f529f4 2005-10-29 devnull DBT key, val;
61 d1f529f4 2005-10-29 devnull key.data = tok;
62 d1f529f4 2005-10-29 devnull key.size = strlen(tok)+1;
63 d1f529f4 2005-10-29 devnull if(n <= 0){
64 d1f529f4 2005-10-29 devnull db->del(db, &key, 0);
68 d1f529f4 2005-10-29 devnull p[0] = n>>24;
69 d1f529f4 2005-10-29 devnull p[1] = n>>16;
70 d1f529f4 2005-10-29 devnull p[2] = n>>8;
71 d1f529f4 2005-10-29 devnull p[3] = n;
73 d1f529f4 2005-10-29 devnull val.data = p;
74 d1f529f4 2005-10-29 devnull val.size = 4;
75 d1f529f4 2005-10-29 devnull db->put(db, &key, &val, 0);
79 d1f529f4 2005-10-29 devnull mdenum(Msgdb *mdb)
81 d1f529f4 2005-10-29 devnull mdb->reset = 1;
85 d1f529f4 2005-10-29 devnull mdnext(Msgdb *mdb, char **sp, long *vp)
87 d1f529f4 2005-10-29 devnull DBT key, val;
88 d1f529f4 2005-10-29 devnull uchar *p;
89 d1f529f4 2005-10-29 devnull DB *db = mdb->db;
92 d1f529f4 2005-10-29 devnull i = db->seq(db, &key, &val, mdb->reset ? R_FIRST : R_NEXT);
93 d1f529f4 2005-10-29 devnull mdb->reset = 0;
95 d1f529f4 2005-10-29 devnull return -1;
96 d1f529f4 2005-10-29 devnull *sp = key.data;
97 d1f529f4 2005-10-29 devnull p = val.data;
98 d1f529f4 2005-10-29 devnull *vp = (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
99 d1f529f4 2005-10-29 devnull return 0;
103 d1f529f4 2005-10-29 devnull mdclose(Msgdb *mdb)
105 d1f529f4 2005-10-29 devnull DB *db = mdb->db;
107 d1f529f4 2005-10-29 devnull db->close(db);
108 d1f529f4 2005-10-29 devnull mdb->db = nil;