123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- #include <u.h>
- #include <libc.h>
- #include <db.h>
- #include "msgdb.h"
- struct Msgdb
- {
- DB *db;
- int reset;
- };
- Msgdb*
- mdopen(char *file, int create)
- {
- Msgdb *mdb;
- DB *db;
- HASHINFO h;
- if((mdb = mallocz(sizeof(Msgdb), 1)) == nil)
- return nil;
- memset(&h, 0, sizeof h);
- h.cachesize = 2*1024*1024;
- if((db = dbopen(file, ORDWR|(create ? OCREATE:0), 0666, DB_HASH, &h)) == nil){
- free(mdb);
- return nil;
- }
- mdb->db = db;
- mdb->reset = 1;
- return mdb;
- }
- long
- mdget(Msgdb *mdb, char *tok)
- {
- DB *db = mdb->db;
- DBT key, val;
- uchar *p;
- key.data = tok;
- key.size = strlen(tok)+1;
- val.data = 0;
- val.size = 0;
- if(db->get(db, &key, &val, 0) < 0)
- return 0;
- if(val.data == 0)
- return 0;
- if(val.size != 4)
- return 0;
- p = val.data;
- return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
- }
- void
- mdput(Msgdb *mdb, char *tok, long n)
- {
- uchar p[4];
- DB *db = mdb->db;
- DBT key, val;
- key.data = tok;
- key.size = strlen(tok)+1;
- if(n <= 0){
- db->del(db, &key, 0);
- return;
- }
- p[0] = n>>24;
- p[1] = n>>16;
- p[2] = n>>8;
- p[3] = n;
- val.data = p;
- val.size = 4;
- db->put(db, &key, &val, 0);
- }
- void
- mdenum(Msgdb *mdb)
- {
- mdb->reset = 1;
- }
- int
- mdnext(Msgdb *mdb, char **sp, long *vp)
- {
- DBT key, val;
- uchar *p;
- DB *db = mdb->db;
- int i;
- i = db->seq(db, &key, &val, mdb->reset ? R_FIRST : R_NEXT);
- mdb->reset = 0;
- if(i)
- return -1;
- *sp = key.data;
- p = val.data;
- *vp = (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
- return 0;
- }
- void
- mdclose(Msgdb *mdb)
- {
- DB *db = mdb->db;
- db->close(db);
- mdb->db = nil;
- }
|