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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show 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 /* "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