/[LeafOK_CVS]/pvpgn-1.7.4/src/tinycdb/cdb_make_put.c
ViewVC logotype

Annotation of /pvpgn-1.7.4/src/tinycdb/cdb_make_put.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Tue Jun 6 03:41:38 2006 UTC (19 years, 9 months ago) by sysadm
CVS Tags: pvpgn_1-7-4-0_MIL
Branch point for: GNU, MAIN
Content type: text/x-csrc
Initial revision

1 sysadm 1.1 /* "advanced" cdb_make_put routine
2     *
3     * This file is a part of tinycdb package by Michael Tokarev, mjt@corpit.ru.
4     * Public domain.
5     */
6    
7     #include "common/setup_before.h"
8     #ifdef STDC_HEADERS
9     # include <stdlib.h>
10     #else
11     # ifdef HAVE_MALLOC_H
12     # include <malloc.h>
13     # endif
14     #endif
15     #include "common/xalloc.h"
16     #include "cdb_int.h"
17     #include "common/setup_after.h"
18    
19     int
20     cdb_make_put(struct cdb_make *cdbmp,
21     const void *key, unsigned klen,
22     const void *val, unsigned vlen,
23     int flags)
24     {
25     unsigned char rlen[8];
26     unsigned hval = cdb_hash(key, klen);
27     struct cdb_rl *rl;
28     int c, r;
29    
30     switch(flags) {
31     case CDB_PUT_REPLACE:
32     case CDB_PUT_INSERT:
33     case CDB_PUT_WARN:
34     c = _cdb_make_find(cdbmp, key, klen, hval, &rl);
35     if (c < 0)
36     return -1;
37     if (c) {
38     if (flags == CDB_PUT_INSERT)
39     return errno = EEXIST, 1;
40     else if (flags == CDB_PUT_REPLACE) {
41     --c;
42     r = 1;
43     break;
44     }
45     else
46     r = 1;
47     }
48     /* fall */
49    
50     case CDB_PUT_ADD:
51     rl = cdbmp->cdb_rec[hval&255];
52     if (!rl || rl->cnt >= sizeof(rl->rec)/sizeof(rl->rec[0])) {
53     rl = (struct cdb_rl*)xmalloc(sizeof(struct cdb_rl));
54     if (!rl)
55     return errno = ENOMEM, -1;
56     rl->cnt = 0;
57     rl->next = cdbmp->cdb_rec[hval&255];
58     cdbmp->cdb_rec[hval&255] = rl;
59     }
60     c = rl->cnt;
61     r = 0;
62     break;
63    
64     default:
65     return errno = EINVAL, -1;
66     }
67    
68     if (klen > 0xffffffff - (cdbmp->cdb_dpos + 8) ||
69     vlen > 0xffffffff - (cdbmp->cdb_dpos + klen + 8))
70     return errno = ENOMEM, -1;
71     rl->rec[c].hval = hval;
72     rl->rec[c].rpos = cdbmp->cdb_dpos;
73     if ((unsigned)c == rl->cnt) {
74     ++rl->cnt;
75     ++cdbmp->cdb_rcnt;
76     }
77     cdb_pack(klen, rlen);
78     cdb_pack(vlen, rlen + 4);
79     if (_cdb_make_write(cdbmp, rlen, 8) < 0 ||
80     _cdb_make_write(cdbmp, key, klen) < 0 ||
81     _cdb_make_write(cdbmp, val, vlen) < 0)
82     return -1;
83     return r;
84     }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1