Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}