diff options
author | Magnus Ahltorp <map@kth.se> | 2016-05-13 17:20:08 +0200 |
---|---|---|
committer | Magnus Ahltorp <map@kth.se> | 2016-05-13 17:22:09 +0200 |
commit | cc037396bf405ec942352ea834e137ea1b24e6af (patch) | |
tree | af9d2df2ddb095f50d344ecf8002f0a7c0144762 /c_src | |
parent | 8a19f620874ebecf125f831c633aec02c3922fd6 (diff) |
Added 'keyexists' command to permdb
Diffstat (limited to 'c_src')
-rw-r--r-- | c_src/permdb.c | 37 |
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); |