From 44fa7d3682ff4e102bb7a228e9e5a100a050fea5 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Tue, 15 Apr 2025 15:21:29 -0400 Subject: Updated delkeys and setkeys to take multiple keys --- src/lib/batch.c | 62 +++++++++++++++++++++++++++++++------------------------ src/lib/file.c | 4 ++-- src/lib/mdb.h | 5 +++-- src/main.c | 10 ++++----- src/test.c | 64 +++++++++++++++++++++++++++++++++++++++++++++------------ 5 files changed, 95 insertions(+), 50 deletions(-) (limited to 'src') diff --git a/src/lib/batch.c b/src/lib/batch.c index 30102c7..a56ff2d 100644 --- a/src/lib/batch.c +++ b/src/lib/batch.c @@ -18,31 +18,33 @@ tablist_t *setkey_copy; char *setkey_str; mtx_t setkey_mtx; -int setkeys(tablist_t **list, int id, char *pair) +int setkeys(tablist_t **list, int id, char **pairs, int len) { - int rc = 0; - setkey_copy = calloc((*list)[0].len, sizeof(tablist_t)); - copytab(setkey_copy, *list); - setkey_str = pair; - if (id < -1) + if (id < -1 || pairs == NULL || len <= 0) return -1; if (mtx_init(&setkey_mtx, mtx_plain) != thrd_success) return -2; + int rc = 0; + setkey_copy = calloc((*list)[0].len, sizeof(tablist_t)); + copytab(setkey_copy, *list); - if (id == -1) { - thrd_t *thrds = calloc((*list)[0].len, sizeof(thrd_t)); - 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) { - if (rc) - thrd_join(thrds[i], NULL); - else - thrd_join(thrds[i], &rc); + for (int i = 0; i < len; ++i) { + setkey_str = pairs[i]; + if (id == -1) { + thrd_t *thrds = calloc((*list)[0].len, sizeof(thrd_t)); + 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) { + if (rc) + thrd_join(thrds[i], NULL); + else + thrd_join(thrds[i], &rc); + } + free(thrds); } - free(thrds); + else + rc = setkey_helper(clone(id)); } - else - rc = setkey_helper(clone(id)); if (!rc) { if (setkey_copy[0].len > (*list)[0].len) @@ -56,20 +58,22 @@ int setkeys(tablist_t **list, int id, char *pair) } tablist_t *delkey_copy; -char *delkey_str; +char **delkeys_keys; +int keys_len; mtx_t delkey_mtx; -int delkeys(tablist_t *list, int id, char *key) +int delkeys(tablist_t *list, int id, char **keys, int len) { + if (id < -1 || len < 0) + return -1; + if (mtx_init(&delkey_mtx, mtx_plain) != thrd_success) + return -2; int rc = 0; delkey_copy = calloc(list[0].len, sizeof(tablist_t)); copytab(delkey_copy, list); - delkey_str = key; + delkeys_keys = keys; + keys_len = len; - if (id < -1) - return -1; - if (mtx_init(&delkey_mtx, mtx_plain) != thrd_success) - return -2; if (id == -1) { thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t)); for (int i = 0; i < delkey_copy[0].len; ++i) @@ -112,8 +116,12 @@ static int delkey_helper(void *thr_data) int *id = (int *) thr_data; mtx_lock(&delkey_mtx); - if (delkey_str) - rc = delkey(delkey_copy, *id, delkey_str); + if (keys_len > 0) + for (int i = 0; i < keys_len; ++i) { + if (delkeys_keys[i] == NULL) + return -3; + rc = delkey(delkey_copy, *id, delkeys_keys[i]); + } else { int *indexes = getkeys(delkey_copy, *id); for (int i = 0; indexes[i]; ++i) diff --git a/src/lib/file.c b/src/lib/file.c index a5119ea..f8a4db6 100644 --- a/src/lib/file.c +++ b/src/lib/file.c @@ -26,7 +26,7 @@ tablist_t *readdb(char *filename) case 250: p = getpair(&c, fp); if (p == NULL) goto fail; - setkeys(&list, i, p); + setkeys(&list, i, &p, 1); free(p); break; case 251: @@ -46,7 +46,7 @@ tablist_t *readdb(char *filename) fail: fclose(fp); - delkeys(list, -1, NULL); + delkeys(list, -1, NULL, 0); free(list); return NULL; } diff --git a/src/lib/mdb.h b/src/lib/mdb.h index b5dc768..a53f4b5 100644 --- a/src/lib/mdb.h +++ b/src/lib/mdb.h @@ -22,9 +22,10 @@ typedef struct { tabidx_t getkey(tablist_t *list, int id, char *key); // Batch Operations +// TODO: make setkeys and delkeys take char ** and int int *getkeys(tablist_t *list, int id); // TODO: Reimplement getkeys -int setkeys(tablist_t **list, int id, char *pair); -int delkeys(tablist_t *list, int id, char *key); +int setkeys(tablist_t **list, int id, char **pairs, int len); +int delkeys(tablist_t *list, int id, char **keys, int len); // file operations tablist_t *readdb(char *filename); diff --git a/src/main.c b/src/main.c index 9d37166..aabc18d 100644 --- a/src/main.c +++ b/src/main.c @@ -143,9 +143,8 @@ int setkeys_main(tablist_t **list, int id, char **pairs, int plen) { if (pairs == NULL || id < -1) return 1; - for (int i = 0; i < plen; ++i) - if(setkeys(list, id, pairs[i])) - return 2; + if (setkeys(list, id, pairs, plen)) + return 2; return 0; } @@ -153,9 +152,8 @@ int delkeys_main(tablist_t **list, int id, char **keys, int klen) { if (keys == NULL || id < -1) return 1; - for (int i = 0; i < klen; ++i) - if(delkeys(*list, id, keys[i])) - return 2; + if (delkeys(*list, id, keys, klen)) + return 2; return 0; } diff --git a/src/test.c b/src/test.c index a2a241d..5f2f867 100644 --- a/src/test.c +++ b/src/test.c @@ -6,7 +6,8 @@ void test_setkeys(void) { tablist_t *list = readdb("dbs/test.db"); - if (setkeys(&list, -1, "name:john")) + char *pairs[] = { "name:John" }; + if (setkeys(&list, -1, pairs, 1)) fprintf(stderr, "test_setkeys: failed\n"); for (int i = 0; i < list[0].len; ++i) { printf("id: %d\n", i); @@ -15,32 +16,55 @@ void test_setkeys(void) printf("%s\n", list[i].tab[indexes[j]].key); free(indexes); } - delkeys(list, -1, NULL); + delkeys(list, -1, NULL, 0); free(list); } void test_setkeys_fail(void) { tablist_t *list = readdb("dbs/test.db"); - if (!setkeys(&list, -1, "namejohn")) + char *pairs[] = { "namejohn" }; + if (!setkeys(&list, -1, pairs, 1)) fprintf(stderr, "test_setkeys_fail: failed\n"); - delkeys(list, -1, NULL); + delkeys(list, -1, NULL, 0); + free(list); +} + +void test_setkeys_multi_fail(void) +{ + tablist_t *list = readdb("dbs/test.db"); + char *pairs[] = { "name:John", NULL }; + if (!setkeys(&list, -1, pairs, 2)) + fprintf(stderr, "test_setkeys_multi_fail: failed\n"); + delkeys(list, -1, NULL, 0); free(list); } void test_setkeys_single(void) { tablist_t *list = readdb("dbs/test.db"); - if (setkeys(&list, 101, "name:alice")) + char *pairs[] = { "name:Alice" }; + if (setkeys(&list, 101, pairs, 1)) fprintf(stderr, "test_setkeys_single: failed\n"); - delkeys(list, -1, NULL); + delkeys(list, -1, NULL, 0); + free(list); +} + +void test_setkeys_multipairs(void) +{ + tablist_t *list = readdb("dbs/test.db"); + char *pairs[] = { "name:Bob", "active:true" }; + if (setkeys(&list, 0, pairs, 2)) + fprintf(stderr, "test_setkeys_multipairs: failed\n"); + delkeys(list, -1, NULL, 0); free(list); } void test_delkeys(void) { tablist_t *list = readdb("dbs/test.db"); - if (delkeys(list, -1, "Row_1")) + char *keys[] = { "Row_1" }; + if (delkeys(list, -1, keys, 1)) fprintf(stderr, "test_delkeys: failed\n"); for (int i = 0; i < list[0].len; ++i) { printf("id: %d\n", i); @@ -49,14 +73,14 @@ void test_delkeys(void) printf("%s\n", list[i].tab[indexes[j]].key); free(indexes); } - delkeys(list, -1, NULL); + delkeys(list, -1, NULL, 0); free(list); } void test_delkeys_all(void) { tablist_t *list = readdb("dbs/test.db"); - if (delkeys(list, -1, NULL)) + if (delkeys(list, -1, NULL, 0)) fprintf(stderr, "test_delkeys_all: failed\n"); free(list); } @@ -64,18 +88,29 @@ void test_delkeys_all(void) void test_delkeys_fail(void) { tablist_t *list = readdb("dbs/test.db"); - if (!delkeys(list, -1, "Row_4")) + char *keys[] = { "Row_4" }; + if (!delkeys(list, -1, keys, 1)) fprintf(stderr, "test_delkeys_fail: failed\n"); - delkeys(list, -1, NULL); + delkeys(list, -1, NULL, 0); free(list); } void test_delkeys_single(void) { tablist_t *list = readdb("dbs/test.db"); - if (delkeys(list, 0, NULL)) + if (delkeys(list, 0, NULL, 0)) fprintf(stderr, "test_delkeys_single: failed\n"); - delkeys(list, -1, NULL); + delkeys(list, -1, NULL, 0); + free(list); +} + +void test_delkeys_multi(void) +{ + tablist_t *list = readdb("dbs/test.db"); + char *keys[] = { "Row_1", "Row_2" }; + if (delkeys(list, -1, keys, 2)) + fprintf(stderr, "test_delkeys_multi: failed\n"); + delkeys(list, -1, NULL, 0); free(list); } @@ -84,11 +119,14 @@ int main(void) test_setkeys(); test_setkeys_fail(); test_setkeys_single(); + test_setkeys_multipairs(); + test_setkeys_multi_fail(); test_delkeys(); test_delkeys_all(); test_delkeys_fail(); test_delkeys_single(); + test_delkeys_multi(); exit(0); } -- cgit v1.2.3