summaryrefslogtreecommitdiff
path: root/c_src/permdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'c_src/permdb.c')
-rw-r--r--c_src/permdb.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/c_src/permdb.c b/c_src/permdb.c
index 90bb2ff..93eb02e 100644
--- a/c_src/permdb.c
+++ b/c_src/permdb.c
@@ -982,6 +982,31 @@ getvalue(permdb_object *state, const unsigned char *key, size_t keylength,
return readdata(state, olddataoffset, *datalen);
}
+unsigned int
+keyexists(permdb_object *state, const unsigned char *key, size_t keylength)
+{
+ node_entry entry = getlastnode(state, key);
+ if (entry == 0) {
+ dprintf(READ, (stderr, "getvalue: no node\n"));
+ return 0;
+ }
+
+ dprintf(READ, (stderr, "getvalue: got node\n"));
+
+ node_offset olddataoffset = entryoffset(entry);
+
+ unsigned char *datakey = readdatakey(state, olddataoffset);
+ if (datakey == NULL) {
+ return 0;
+ }
+ if (memcmp(datakey, key, keylength) != 0) {
+ free(datakey);
+ return 0;
+ }
+ free(datakey);
+ return 1;
+}
+
static int
string_length_comparison(struct nodecache *a, struct nodecache *b) {
size_t a_len = a->key->length;
@@ -1175,6 +1200,18 @@ portloop(permdb_object *state)
write_reply(&result_byte, 1, 4);
}
dprintf(PORT, (stderr, "commit reply\n"));
+ } else if (buf[0] == 3) {
+ dprintf(PORT, (stderr, "keyexists\n"));
+ if (len != keylen+1) {
+ write_reply(NULL, 0, 4);
+ continue;
+ }
+ assert(len == keylen+1);
+
+ unsigned char result_byte = keyexists(state, (buf+1), keylen);
+
+ write_reply(&result_byte, 1, 4);
+ dprintf(PORT, (stderr, "keyexists reply\n"));
} else {
dprintf(PORT, (stderr, "unknown command\n"));
write_reply(NULL, 0, 4);