diff options
Diffstat (limited to 'c_src')
-rw-r--r-- | c_src/permdb.c | 95 | ||||
-rw-r--r-- | c_src/permdb.h | 2 | ||||
-rw-r--r-- | c_src/permdbpy.c | 2 | ||||
-rw-r--r-- | c_src/permdbtest.c | 2 |
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); |