From 704fb6fee45b3e5feae02d4a9282dccce0d85117 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Thu, 27 Mar 2025 11:38:16 -0400 Subject: Added ability to delete every key in delkeys --- src/lib/batch.c | 21 ++++++++++++++------- src/lib/mdb.h | 2 +- src/main.c | 1 + src/test.c | 12 ++++++++++-- 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"); -- cgit v1.2.3