summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Ahltorp <map@kth.se>2016-02-18 16:28:52 +0100
committerLinus Nordberg <linus@nordu.net>2016-04-25 13:14:12 +0200
commit430c5f86b9d2e13b47199e5005a728aa3c597fcc (patch)
tree412465c652d8a151fd170e14d45af38ea2d33706
parent2c309788000ee8693a9396538df2592470881ee2 (diff)
Fold addindex into addvalue
-rw-r--r--c_src/permdb.c95
-rw-r--r--c_src/permdb.h2
-rw-r--r--c_src/permdbpy.c2
-rw-r--r--c_src/permdbtest.c2
4 files changed, 12 insertions, 89 deletions
diff --git a/c_src/permdb.c b/c_src/permdb.c
index 29c38cc..dec0bbb 100644
--- a/c_src/permdb.c
+++ b/c_src/permdb.c
@@ -326,9 +326,6 @@ read_data_commit_backward(buffered_file *file, node_offset *offset)
}
int
-addindex(permdb_object *state, const unsigned char *key, unsigned int keylength, node_offset dataoffset);
-
-int
rebuild_index_file(permdb_object *state)
{
bf_truncate(state->indexfile);
@@ -346,7 +343,7 @@ rebuild_index_file(permdb_object *state)
size_t datalen;
unsigned char *datakey = readdatakeyandlen(state, offset, &datalen);
//fprintf(stderr, "entry %llu: %zu\n", offset, datalen);
- int result = addindex(state, datakey, keylen, offset);
+ int result = addvalue(state, datakey, keylen, NULL, 0, offset);
offset += sizeof(data_entry_cookie) + keylen + sizeof(uint32_t) + datalen;
free(datakey);
@@ -752,87 +749,9 @@ writedata(permdb_object *state, const unsigned char *key, const unsigned char *d
return offset;
}
-int
-addindex(permdb_object *state, const unsigned char *key, unsigned int keylength, node_offset dataoffset)
-{
- UT_array *nodes;
- utarray_new(nodes, &node_object_icd);
-
- char kb = getpath(state, key, nodes);
-
- if (kb == -1) {
- utarray_free(nodes);
- return -1;
- }
-
- unsigned int foundlevel = utarray_len(nodes) - 1;
-
- node_object lastnode = *(node_object *)utarray_back(nodes);
- if (get_entry_in_node(lastnode, (unsigned char) kb) == 0) {
- addentry(&lastnode, keybits(key, foundlevel), buildentry(1, dataoffset));
- } else {
- node_offset olddataoffset = entryoffset(get_entry_in_node(lastnode, (unsigned char) kb));
- unsigned char *olddatakey = readdatakey(state, olddataoffset);
- if (olddatakey == NULL) {
- utarray_free(nodes);
- return -1;
- }
- if (memcmp(olddatakey, key, keylen) == 0) {
- utarray_free(nodes);
- free(olddatakey);
- return 0;
- }
- unsigned int level = foundlevel + 1;
- while (keybits(key, level) == keybits(olddatakey, level)) {
- level++;
- }
- node_object leafnode = nullnode;
- addentry(&leafnode, keybits(key, level), buildentry(1, dataoffset));
- addentry(&leafnode, keybits(olddatakey, level), buildentry(1, olddataoffset));
- free(olddatakey);
- {
- ps_string cachekey;
- keypart(key, level, &cachekey);
- put_node_in_dirtynodes(state, &cachekey, leafnode);
- }
- level--;
- while (level > foundlevel) {
- node_object node = nullnode;
- addentry(&node, keybits(key, level), NODE_ENTRY_DIRTY_NODE);
- ps_string cachekey;
- keypart(key, level, &cachekey);
- put_node_in_dirtynodes(state, &cachekey, node);
- level--;
- }
- overwriteentry(&lastnode, keybits(key, foundlevel), NODE_ENTRY_DIRTY_NODE);
- }
-
- int level = (int) foundlevel;
-
- {
- ps_string cachekey;
- keypart(key, (unsigned int) level, &cachekey);
- put_node_in_dirtynodes(state, &cachekey, lastnode);
- }
-
- level--;
- while (level >= 0) {
- node_object node = *(node_object *)utarray_eltptr(nodes, level);
- overwriteentry(&node, keybits(key, (unsigned int) level), NODE_ENTRY_DIRTY_NODE);
- ps_string cachekey;
- keypart(key, (unsigned int) level, &cachekey);
- put_node_in_dirtynodes(state, &cachekey, node);
- level--;
- }
-
- utarray_free(nodes);
-
- return 1;
-}
-
int
-addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, const unsigned char *data, size_t datalength)
+addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, const unsigned char *data, size_t datalength, node_offset dataoffset)
{
UT_array *nodes;
utarray_new(nodes, &node_object_icd);
@@ -848,7 +767,9 @@ addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength,
node_object lastnode = *(node_object *)utarray_back(nodes);
if (get_entry_in_node(lastnode, (unsigned char) kb) == 0) {
- node_offset dataoffset = writedata(state, key, data, datalength);
+ if (data != NULL) {
+ dataoffset = writedata(state, key, data, datalength);
+ }
addentry(&lastnode, keybits(key, foundlevel), buildentry(1, dataoffset));
} else {
node_offset olddataoffset = entryoffset(get_entry_in_node(lastnode, (unsigned char) kb));
@@ -862,7 +783,9 @@ addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength,
free(olddatakey);
return 0;
}
- node_offset dataoffset = writedata(state, key, data, datalength);
+ if (data != NULL) {
+ dataoffset = writedata(state, key, data, datalength);
+ }
unsigned int level = foundlevel + 1;
while (keybits(key, level) == keybits(olddatakey, level)) {
level++;
@@ -1061,7 +984,7 @@ portloop(permdb_object *state)
unsigned char *key = buf + 1;
unsigned char *data = key + keylen;
- int result = addvalue(state, key, keylen, data, datalen);
+ int result = addvalue(state, key, keylen, data, datalen, 0);
if (result < 0) {
write_reply(NULL, 0, 4);
diff --git a/c_src/permdb.h b/c_src/permdb.h
index b8af13c..0b5fe04 100644
--- a/c_src/permdb.h
+++ b/c_src/permdb.h
@@ -34,7 +34,7 @@ node_offset
datasize(permdb_object *state);
int
-addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, const unsigned char *data, size_t datalength);
+addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, const unsigned char *data, size_t datalength, node_offset dataoffset);
unsigned char *
getvalue(permdb_object *state, const unsigned char *key, size_t keylength, size_t *datalen);
diff --git a/c_src/permdbpy.c b/c_src/permdbpy.c
index 1e8c2f7..ff3dc2a 100644
--- a/c_src/permdbpy.c
+++ b/c_src/permdbpy.c
@@ -103,7 +103,7 @@ addvalue_wrapper(PyObject *self, PyObject *args)
return NULL;
}
- int result = addvalue(state->permdb, (unsigned char *) key, keylength, (unsigned char *) data, datalength);
+ int result = addvalue(state->permdb, (unsigned char *) key, keylength, (unsigned char *) data, datalength, 0);
if (result < 0) {
return NULL;
diff --git a/c_src/permdbtest.c b/c_src/permdbtest.c
index e4b54c2..5e2ea1d 100644
--- a/c_src/permdbtest.c
+++ b/c_src/permdbtest.c
@@ -78,7 +78,7 @@ main(int argc, char *argv[])
memcpy(value + (datasize / 32) * 32, testdata + i * 32 * 2 + 32, datasize % 32);
}
- int result = addvalue(state, key, 32, value, datasize);
+ int result = addvalue(state, key, 32, value, datasize, 0);
if (result < 0) {
free(testdata);
permdb_free(state);