plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }