73cc9952eb67b4f25eff914009f77c0ec2faf52c
[gnupg.git] / dirmngr / cdb.h
1 /* $Id: cdb.h 106 2003-12-12 17:36:49Z werner $
2  * public cdb include file
3  *
4  * This file is a part of tinycdb package by Michael Tokarev, mjt@corpit.ru.
5  * Public domain.
6  *
7  * Taken from tinycdb-0.73. By Werner Koch <wk@gnupg.org> 2003-12-12.
8  */
9
10 #ifndef TINYCDB_VERSION
11 #define TINYCDB_VERSION 0.73
12
13 typedef unsigned int cdbi_t; /*XXX should be at least 32 bits long */
14
15 /* common routines */
16 cdbi_t cdb_hash(const void *buf, cdbi_t len);
17 cdbi_t cdb_unpack(const unsigned char buf[4]);
18 void cdb_pack(cdbi_t num, unsigned char buf[4]);
19
20 struct cdb {
21   int cdb_fd;                   /* file descriptor */
22   /* private members */
23   cdbi_t cdb_fsize;             /* datafile size */
24   const unsigned char *cdb_mem; /* mmap'ed file memory */
25   cdbi_t cdb_vpos, cdb_vlen;    /* found data */
26   cdbi_t cdb_kpos, cdb_klen;    /* found key (only set if cdb_findinit
27                                    was called with KEY set to NULL). */
28 };
29
30 #define cdb_datapos(c) ((c)->cdb_vpos)
31 #define cdb_datalen(c) ((c)->cdb_vlen)
32 #define cdb_keypos(c) ((c)->cdb_kpos)
33 #define cdb_keylen(c) ((c)->cdb_klen)
34 #define cdb_fileno(c) ((c)->cdb_fd)
35
36 int cdb_init(struct cdb *cdbp, int fd);
37 void cdb_free(struct cdb *cdbp);
38
39 int cdb_read(const struct cdb *cdbp,
40              void *buf, unsigned len, cdbi_t pos);
41 int cdb_find(struct cdb *cdbp, const void *key, unsigned klen);
42
43 struct cdb_find {
44   struct cdb *cdb_cdbp;
45   cdbi_t cdb_hval;
46   const unsigned char *cdb_htp, *cdb_htab, *cdb_htend;
47   cdbi_t cdb_httodo;
48   const void *cdb_key;
49   cdbi_t cdb_klen;
50 };
51
52 int cdb_findinit(struct cdb_find *cdbfp, struct cdb *cdbp,
53                  const void *key, cdbi_t klen);
54 int cdb_findnext(struct cdb_find *cdbfp);
55
56 /* old simple interface */
57 /* open file using standard routine, then: */
58 int cdb_seek(int fd, const void *key, unsigned klen, cdbi_t *dlenp);
59 int cdb_bread(int fd, void *buf, int len);
60
61 /* cdb_make */
62
63 struct cdb_make {
64   int cdb_fd;                   /* file descriptor */
65   /* private */
66   cdbi_t cdb_dpos;              /* data position so far */
67   cdbi_t cdb_rcnt;              /* record count so far */
68   char cdb_buf[4096];           /* write buffer */
69   char *cdb_bpos;               /* current buf position */
70   struct cdb_rl *cdb_rec[256];  /* list of arrays of record infos */
71 };
72
73
74
75 int cdb_make_start(struct cdb_make *cdbmp, int fd);
76 int cdb_make_add(struct cdb_make *cdbmp,
77                  const void *key, cdbi_t klen,
78                  const void *val, cdbi_t vlen);
79 int cdb_make_exists(struct cdb_make *cdbmp,
80                     const void *key, cdbi_t klen);
81 int cdb_make_put(struct cdb_make *cdbmp,
82                  const void *key, cdbi_t klen,
83                  const void *val, cdbi_t vlen,
84                  int flag);
85 #define CDB_PUT_ADD     0       /* add unconditionnaly, like cdb_make_add() */
86 #define CDB_PUT_REPLACE 1       /* replace: do not place to index OLD record */
87 #define CDB_PUT_INSERT  2       /* add only if not already exists */
88 #define CDB_PUT_WARN    3       /* add unconditionally but ret. 1 if exists */
89 int cdb_make_finish(struct cdb_make *cdbmp);
90
91 #endif /* include guard */