summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/batch.c21
-rw-r--r--src/lib/mdb.h2
-rw-r--r--src/main.c1
-rw-r--r--src/test.c12
4 files changed, 26 insertions, 10 deletions
diff --git a/src/lib/batch.c b/src/lib/batch.c
index 3991973..52cc399 100644
--- a/src/lib/batch.c
+++ b/src/lib/batch.c
@@ -15,14 +15,14 @@ tablist_t *setkey_copy;
char *setkey_str;
mtx_t setkey_mtx;
-int setkeys(tablist_t **list, char *pair)
+int setkeys(tablist_t *list, char *pair)
{
int rc = 0;
- setkey_copy = calloc(list[0]->len, sizeof(tablist_t));
- copytab(setkey_copy, *list);
+ setkey_copy = calloc(list[0].len, sizeof(tablist_t));
+ copytab(setkey_copy, list);
setkey_str = pair;
- thrd_t *thrds = calloc(list[0]->len, sizeof(thrd_t));
+ thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t));
if (mtx_init(&setkey_mtx, mtx_plain) != thrd_success)
return -1;
@@ -35,8 +35,8 @@ int setkeys(tablist_t **list, char *pair)
thrd_join(thrds[i], &rc);
}
if (!rc) {
- dellist(*list);
- memcpy(*list, setkey_copy, setkey_copy[0].len * sizeof(tablist_t));
+ dellist(list);
+ memcpy(list, setkey_copy, setkey_copy[0].len * sizeof(tablist_t));
} else
dellist(setkey_copy);
free(thrds);
@@ -96,7 +96,14 @@ static int delkey_helper(void *thr_data)
int *id = (int *) thr_data;
mtx_lock(&delkey_mtx);
- rc = delkey(delkey_copy, *id, delkey_str);
+ if (delkey_str)
+ rc = delkey(delkey_copy, *id, delkey_str);
+ else {
+ int *indexes = getkeys(delkey_copy, *id);
+ for (int i = 0; indexes[i]; ++i)
+ delkey(delkey_copy, *id, delkey_copy[*id].tab[indexes[i]].key);
+ free(indexes);
+ }
mtx_unlock(&delkey_mtx);
free(id);
diff --git a/src/lib/mdb.h b/src/lib/mdb.h
index f1c6a1c..56bed05 100644
--- a/src/lib/mdb.h
+++ b/src/lib/mdb.h
@@ -24,7 +24,7 @@ int setkey(tablist_t **list, int id, char *pair);
int delkey(tablist_t *list, int id, char *key);
int *getkeys(tablist_t *list, int id);
-int setkeys(tablist_t **list, char *pair);
+int setkeys(tablist_t *list, char *pair);
int delkeys(tablist_t *list, char *key);
// file operations
diff --git a/src/main.c b/src/main.c
index ba40b56..d1765e8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -15,6 +15,7 @@ int delkeys_main(tablist_t **list, int id, char **keys, int klen);
int exec(int (*tabop)(tablist_t **, int, char **, int),
tablist_t **list, int id, char **keys, int klen);
+// TODO: reimplement helpers to use batch operations
int main(int argc, char **argv)
{
if (argc > 2) {
diff --git a/src/test.c b/src/test.c
index 7f46105..eb9c827 100644
--- a/src/test.c
+++ b/src/test.c
@@ -6,7 +6,7 @@
void test_setkeys(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (setkeys(&list, "name:john"))
+ if (setkeys(list, "name:john"))
fprintf(stderr, "test_setkeys: failed\n");
for (int i = 0; i < list[0].len; ++i) {
printf("id: %d\n", i);
@@ -23,7 +23,7 @@ void test_setkeys(void)
void test_setkeys_fail(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (!setkeys(&list, "namejohn"))
+ if (!setkeys(list, "namejohn"))
fprintf(stderr, "test_setkeys_fail: failed\n");
for (int i = 0; i < list[0].len; ++i) {
int *indexes = getkeys(list, i);
@@ -51,6 +51,14 @@ void test_delkeys(void)
free(list);
}
+void test_delkeys_all(void)
+{
+ tablist_t *list = readdb("dbs/test.db");
+ if (!delkeys(list, NULL))
+ fprintf(stderr, "test_delkeys_all: failed\n");
+ free(list);
+}
+
void test_delkeys_fail(void)
{
tablist_t *list = readdb("dbs/test.db");