msgdbx.c (1509B)
1 #include <u.h> 2 #include <libc.h> 3 #include <db.h> 4 #include "msgdb.h" 5 6 struct Msgdb 7 { 8 DB *db; 9 int reset; 10 }; 11 12 Msgdb* 13 mdopen(char *file, int create) 14 { 15 Msgdb *mdb; 16 DB *db; 17 HASHINFO h; 18 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 } 31 32 long 33 mdget(Msgdb *mdb, char *tok) 34 { 35 DB *db = mdb->db; 36 DBT key, val; 37 uchar *p; 38 39 key.data = tok; 40 key.size = strlen(tok)+1; 41 val.data = 0; 42 val.size = 0; 43 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 } 53 54 void 55 mdput(Msgdb *mdb, char *tok, long n) 56 { 57 uchar p[4]; 58 DB *db = mdb->db; 59 DBT key, val; 60 61 key.data = tok; 62 key.size = strlen(tok)+1; 63 if(n <= 0){ 64 db->del(db, &key, 0); 65 return; 66 } 67 68 p[0] = n>>24; 69 p[1] = n>>16; 70 p[2] = n>>8; 71 p[3] = n; 72 73 val.data = p; 74 val.size = 4; 75 db->put(db, &key, &val, 0); 76 } 77 78 void 79 mdenum(Msgdb *mdb) 80 { 81 mdb->reset = 1; 82 } 83 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; 91 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; 100 } 101 102 void 103 mdclose(Msgdb *mdb) 104 { 105 DB *db = mdb->db; 106 107 db->close(db); 108 mdb->db = nil; 109 }