From d1eb4277100d5ef08d6768d394660e89bf656250 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Thu, 20 Mar 2025 15:42:33 -0400 Subject: Add delkeys --- src/lib/batch.c | 75 +++++++++++++++++++++++++++++++++++++++++++------------- src/lib/keytab.c | 5 +--- src/main.c | 4 ++- src/test.c | 34 +++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 22 deletions(-) diff --git a/src/lib/batch.c b/src/lib/batch.c index e728557..91def77 100644 --- a/src/lib/batch.c +++ b/src/lib/batch.c @@ -7,44 +7,65 @@ #include "mdb.h" static int setkey_helper(void *thr_data); -/*static int delkey_helper(void *thr_data);*/ +static int delkey_helper(void *thr_data); +static int *clone(int n); - -tablist_t *copy; -char *str; +tablist_t *setkey_copy; +char *setkey_str; mtx_t setkey_mtx; int setkeys(tablist_t **list, char *pair) { int rc; - copy = calloc(list[0]->len, sizeof(tablist_t)); - memcpy(copy, *list, list[0]->len * sizeof(tablist_t)); - str = pair; + setkey_copy = calloc(list[0]->len, sizeof(tablist_t)); + memcpy(setkey_copy, *list, list[0]->len * sizeof(tablist_t)); + setkey_str = pair; thrd_t *thrds = calloc(list[0]->len, sizeof(thrd_t)); if (mtx_init(&setkey_mtx, mtx_plain) != thrd_success) return 1; - for (int i = 0; i < copy[0].len; ++i) { - int *arg = calloc(1, sizeof(int)); - *arg = i; - thrd_create(&thrds[i], setkey_helper, arg); - } - for (int i = 0; i < copy[0].len; ++i) { + for (int i = 0; i < setkey_copy[0].len; ++i) + thrd_create(&thrds[i], setkey_helper, clone(i)); + for (int i = 0; i < setkey_copy[0].len; ++i) { thrd_join(thrds[i], &rc); if (rc) break; } if (!rc) - memcpy(*list, copy, copy[0].len * sizeof(tablist_t)); + memcpy(*list, setkey_copy, setkey_copy[0].len * sizeof(tablist_t)); free(thrds); - free(copy); + free(setkey_copy); return rc; } +tablist_t *delkey_copy; +char *delkey_str; + +mtx_t delkey_mtx; int delkeys(tablist_t *list, char *key) { - return 0; + int rc; + delkey_copy = calloc(list[0].len, sizeof(tablist_t)); + memcpy(delkey_copy, list, list[0].len * sizeof(tablist_t)); + delkey_str = key; + + thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t)); + if (mtx_init(&delkey_mtx, mtx_plain) != thrd_success) + return 1; + + for (int i = 0; i < delkey_copy[0].len; ++i) + thrd_create(&thrds[i], delkey_helper, clone(i)); + for (int i = 0; i < delkey_copy[0].len; ++i) { + thrd_join(thrds[i], &rc); + if (rc) + break; + } + if (!rc) + memcpy(list, delkey_copy, delkey_copy[0].len * sizeof(tablist_t)); + free(thrds); + free(delkey_copy); + return rc; } static int setkey_helper(void *thr_data) @@ -53,9 +74,29 @@ static int setkey_helper(void *thr_data) int rc; mtx_lock(&setkey_mtx); - rc = setkey(©, *id, str); + rc = setkey(&setkey_copy, *id, setkey_str); mtx_unlock(&setkey_mtx); free(id); return rc; } + +static int delkey_helper(void *thr_data) +{ + int *id = (int *) thr_data; + int rc; + + mtx_lock(&delkey_mtx); + rc = delkey(delkey_copy, *id, delkey_str); + mtx_unlock(&delkey_mtx); + + free(id); + return rc; +} + +static int *clone(int n) +{ + int *c = calloc(1, sizeof(int)); + *c = n; + return c; +} diff --git a/src/lib/keytab.c b/src/lib/keytab.c index ff32e42..7f73afb 100644 --- a/src/lib/keytab.c +++ b/src/lib/keytab.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -54,10 +53,8 @@ int setkey(tablist_t **list, int id, char *pair) (*list)[0].len = id + 1; } char **kv = getkv(pair); - if (kv == NULL) { - free(pair); + if (kv == NULL) return 1; - } int idx = hash(kv[0]); while ((*list)[id].tab[idx].key != NULL && diff --git a/src/main.c b/src/main.c index a0ffa87..ba40b56 100644 --- a/src/main.c +++ b/src/main.c @@ -128,8 +128,10 @@ int setkeys_main(tablist_t **list, int id, char **pairs, int plen) for (int i = 0; i < plen; ++i) { char *tmp = calloc(strlen(pairs[i]) + 1, sizeof(char)); strcpy(tmp, pairs[i]); - if (setkey(list, id, tmp)) + if (setkey(list, id, tmp)) { + free(tmp); return 1; + } free(tmp); } return 0; diff --git a/src/test.c b/src/test.c index 4103c41..dd96490 100644 --- a/src/test.c +++ b/src/test.c @@ -9,6 +9,38 @@ void test_setkeys(void) 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); + int *indexes = getkeys(list, i); + for (int j = 0; indexes[j]; ++j) { + printf("%s\n", list[i].tab[indexes[j]].key); + delkey(list, i, list[i].tab[indexes[j]].key); + } + free(indexes); + } + free(list); +} + +void test_setkeys_fail(void) +{ + tablist_t *list = readdb("dbs/test.db"); + 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); + for (int j = 0; indexes[j]; ++j) + delkey(list, i, list[i].tab[indexes[j]].key); + free(indexes); + } + free(list); +} + +void test_delkeys(void) +{ + tablist_t *list = readdb("dbs/test.db"); + if (delkeys(list, "Row_1")) + fprintf(stderr, "test_delkeys: failed\n"); + for (int i = 0; i < list[0].len; ++i) { + printf("id: %d\n", i); int *indexes = getkeys(list, i); for (int j = 0; indexes[j]; ++j) { printf("%s\n", list[i].tab[indexes[j]].key); @@ -22,5 +54,7 @@ void test_setkeys(void) int main(void) { test_setkeys(); + test_setkeys_fail(); + test_delkeys(); exit(0); } -- cgit v1.2.3