Blame


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"
5 d1f529f4 2005-10-29 devnull
6 d1f529f4 2005-10-29 devnull struct Msgdb
7 d1f529f4 2005-10-29 devnull {
8 d1f529f4 2005-10-29 devnull DB *db;
9 d1f529f4 2005-10-29 devnull int reset;
10 d1f529f4 2005-10-29 devnull };
11 d1f529f4 2005-10-29 devnull
12 d1f529f4 2005-10-29 devnull Msgdb*
13 d1f529f4 2005-10-29 devnull mdopen(char *file, int create)
14 d1f529f4 2005-10-29 devnull {
15 d1f529f4 2005-10-29 devnull Msgdb *mdb;
16 d1f529f4 2005-10-29 devnull DB *db;
17 d1f529f4 2005-10-29 devnull HASHINFO h;
18 d1f529f4 2005-10-29 devnull
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;
26 d1f529f4 2005-10-29 devnull }
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;
30 d1f529f4 2005-10-29 devnull }
31 d1f529f4 2005-10-29 devnull
32 d1f529f4 2005-10-29 devnull long
33 d1f529f4 2005-10-29 devnull mdget(Msgdb *mdb, char *tok)
34 d1f529f4 2005-10-29 devnull {
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;
38 d1f529f4 2005-10-29 devnull
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;
43 d1f529f4 2005-10-29 devnull
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];
52 d1f529f4 2005-10-29 devnull }
53 d1f529f4 2005-10-29 devnull
54 d1f529f4 2005-10-29 devnull void
55 d1f529f4 2005-10-29 devnull mdput(Msgdb *mdb, char *tok, long n)
56 d1f529f4 2005-10-29 devnull {
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;
60 d1f529f4 2005-10-29 devnull
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);
65 d1f529f4 2005-10-29 devnull return;
66 d1f529f4 2005-10-29 devnull }
67 d1f529f4 2005-10-29 devnull
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;
72 d1f529f4 2005-10-29 devnull
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);
76 d1f529f4 2005-10-29 devnull }
77 d1f529f4 2005-10-29 devnull
78 d1f529f4 2005-10-29 devnull void
79 d1f529f4 2005-10-29 devnull mdenum(Msgdb *mdb)
80 d1f529f4 2005-10-29 devnull {
81 d1f529f4 2005-10-29 devnull mdb->reset = 1;
82 d1f529f4 2005-10-29 devnull }
83 d1f529f4 2005-10-29 devnull
84 d1f529f4 2005-10-29 devnull int
85 d1f529f4 2005-10-29 devnull mdnext(Msgdb *mdb, char **sp, long *vp)
86 d1f529f4 2005-10-29 devnull {
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;
90 d1f529f4 2005-10-29 devnull int i;
91 d1f529f4 2005-10-29 devnull
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;
94 d1f529f4 2005-10-29 devnull if(i)
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;
100 d1f529f4 2005-10-29 devnull }
101 d1f529f4 2005-10-29 devnull
102 d1f529f4 2005-10-29 devnull void
103 d1f529f4 2005-10-29 devnull mdclose(Msgdb *mdb)
104 d1f529f4 2005-10-29 devnull {
105 d1f529f4 2005-10-29 devnull DB *db = mdb->db;
106 d1f529f4 2005-10-29 devnull
107 d1f529f4 2005-10-29 devnull db->close(db);
108 d1f529f4 2005-10-29 devnull mdb->db = nil;
109 d1f529f4 2005-10-29 devnull }