Blob
1 #include <u.h>2 #include <libc.h>3 #include <db.h>4 #include "msgdb.h"6 struct Msgdb7 {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 long33 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 void55 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 void79 mdenum(Msgdb *mdb)80 {81 mdb->reset = 1;82 }84 int85 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;100 }102 void103 mdclose(Msgdb *mdb)104 {105 DB *db = mdb->db;107 db->close(db);108 mdb->db = nil;109 }