summaryrefslogtreecommitdiff
path: root/c_src
diff options
context:
space:
mode:
Diffstat (limited to 'c_src')
-rw-r--r--c_src/permdb.c97
1 files changed, 24 insertions, 73 deletions
diff --git a/c_src/permdb.c b/c_src/permdb.c
index 50618c5..9221f45 100644
--- a/c_src/permdb.c
+++ b/c_src/permdb.c
@@ -22,11 +22,11 @@
#include "util.h"
#include "uthash.h"
+#include "utarray.h"
#include "pstring.h"
#define INDEX_COMMIT_TRAILER_SIZE (sizeof(uint64_t) + SHA256_DIGEST_SIZE + sizeof(index_commit_cookie))
-static const int bitsperlevel = 2;
static const int keylen = 32;
struct permdb_object {
@@ -580,35 +580,10 @@ entryoffset(node_entry entry)
return entry & NODE_ENTRY_OFFSET_MASK;
}
-struct nodelist {
- node_object *nodes;
- unsigned int len;
- unsigned int pos;
-};
-
-static void
-add_entry_to_nodelist(struct nodelist *list, node_object node)
-{
- list->nodes[list->pos] = node;
- list->pos++;
-}
-
-static void
-init_nodelist(struct nodelist *list)
-{
- list->len = keylen * 8 / bitsperlevel;
- list->nodes = malloc(sizeof(node_object) * list->len);
- list->pos = 0;
-}
-
-static void
-free_nodelist(struct nodelist *list)
-{
- free(list->nodes);
-}
+UT_icd node_object_icd = {sizeof(node_object), NULL, NULL, NULL };
static char
-getpath(permdb_object *state, const unsigned char *key, struct nodelist *nodes)
+getpath(permdb_object *state, const unsigned char *key, UT_array *nodes)
{
unsigned int level = 0;
@@ -626,11 +601,7 @@ getpath(permdb_object *state, const unsigned char *key, struct nodelist *nodes)
while (1) {
unsigned char kb = keybits(key, level);
node_entry entry = get_entry_in_node(node, kb);
- if (nodes->pos >= nodes->len) {
- fprintf(stderr, "tried to write after end of allocated list: level %d\n", level);
- return -1;
- }
- add_entry_to_nodelist(nodes, node);
+ utarray_push_back(nodes, &node);
if (entry == 0 || isdata(entry)) {
dprintf(READ, (stderr, "getpath: return node\n"));
return (char) kb;
@@ -785,35 +756,30 @@ writedata(permdb_object *state, const unsigned char *key, const unsigned char *d
int
addindex(permdb_object *state, const unsigned char *key, unsigned int keylength, node_offset dataoffset)
{
- struct nodelist nodes;
- init_nodelist(&nodes);
+ UT_array *nodes;
+ utarray_new(nodes, &node_object_icd);
- char kb = getpath(state, key, &nodes);
+ char kb = getpath(state, key, nodes);
if (kb == -1) {
- free_nodelist(&nodes);
+ utarray_free(nodes);
return -1;
}
- unsigned int foundlevel = nodes.pos - 1;
+ unsigned int foundlevel = utarray_len(nodes) - 1;
- if (foundlevel >= nodes.len) {
- fprintf(stderr, "tried to read after end of allocated list\n");
- free_nodelist(&nodes);
- return 0;
- }
- node_object lastnode = nodes.nodes[foundlevel];
+ 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) {
- free_nodelist(&nodes);
+ utarray_free(nodes);
return -1;
}
if (memcmp(olddatakey, key, keylen) == 0) {
- free_nodelist(&nodes);
+ utarray_free(nodes);
free(olddatakey);
return 0;
}
@@ -852,12 +818,7 @@ addindex(permdb_object *state, const unsigned char *key, unsigned int keylength,
level--;
while (level >= 0) {
- if (level >= (int) nodes.len) {
- fprintf(stderr, "tried to read after end of allocated list\n");
- free_nodelist(&nodes);
- return 0;
- }
- node_object node = nodes.nodes[level];
+ 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);
@@ -865,7 +826,7 @@ addindex(permdb_object *state, const unsigned char *key, unsigned int keylength,
level--;
}
- free_nodelist(&nodes);
+ utarray_free(nodes);
return 1;
}
@@ -874,24 +835,19 @@ addindex(permdb_object *state, const unsigned char *key, unsigned int keylength,
int
addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, const unsigned char *data, size_t datalength)
{
- struct nodelist nodes;
- init_nodelist(&nodes);
+ UT_array *nodes;
+ utarray_new(nodes, &node_object_icd);
- char kb = getpath(state, key, &nodes);
+ char kb = getpath(state, key, nodes);
if (kb == -1) {
- free_nodelist(&nodes);
+ utarray_free(nodes);
return -1;
}
- unsigned int foundlevel = nodes.pos - 1;
+ unsigned int foundlevel = utarray_len(nodes) - 1;
- if (foundlevel >= nodes.len) {
- fprintf(stderr, "tried to read after end of allocated list\n");
- free_nodelist(&nodes);
- return 0;
- }
- node_object lastnode = nodes.nodes[foundlevel];
+ 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);
addentry(&lastnode, keybits(key, foundlevel), buildentry(1, dataoffset));
@@ -899,11 +855,11 @@ addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength,
node_offset olddataoffset = entryoffset(get_entry_in_node(lastnode, (unsigned char) kb));
unsigned char *olddatakey = readdatakey(state, olddataoffset);
if (olddatakey == NULL) {
- free_nodelist(&nodes);
+ utarray_free(nodes);
return -1;
}
if (memcmp(olddatakey, key, keylen) == 0) {
- free_nodelist(&nodes);
+ utarray_free(nodes);
free(olddatakey);
return 0;
}
@@ -943,12 +899,7 @@ addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength,
level--;
while (level >= 0) {
- if (level >= (int) nodes.len) {
- fprintf(stderr, "tried to read after end of allocated list\n");
- free_nodelist(&nodes);
- return 0;
- }
- node_object node = nodes.nodes[level];
+ 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);
@@ -956,7 +907,7 @@ addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength,
level--;
}
- free_nodelist(&nodes);
+ utarray_free(nodes);
return 1;
}