Blob


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