URI:
       tmsgdbx.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tmsgdbx.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 }