From 127964c29a3834404f50fa611d75ce4c679f34ba Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Fri, 28 Mar 2025 12:35:30 -0400 Subject: Added batch operations into main.c --- src/lib/batch.c | 2 +- src/lib/keytab.c | 4 ++- src/main.c | 108 ++++++++++++++++++++++++++++++++++++------------------- src/test.c | 3 +- 4 files changed, 77 insertions(+), 40 deletions(-) diff --git a/src/lib/batch.c b/src/lib/batch.c index 52cc399..5046d82 100644 --- a/src/lib/batch.c +++ b/src/lib/batch.c @@ -101,7 +101,7 @@ static int delkey_helper(void *thr_data) 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); + rc = delkey(delkey_copy, *id, delkey_copy[*id].tab[indexes[i]].key); free(indexes); } mtx_unlock(&delkey_mtx); diff --git a/src/lib/keytab.c b/src/lib/keytab.c index 7f73afb..c8b1f75 100644 --- a/src/lib/keytab.c +++ b/src/lib/keytab.c @@ -44,6 +44,8 @@ tabidx_t getkey(tablist_t *list, int id, char *key) // if setkey fails it will return 1 otherwise 0 int setkey(tablist_t **list, int id, char *pair) { + if (pair == NULL) + return 1; if (id >= (*list)[0].len) { *list = realloc(*list, (id + 1) * sizeof(tablist_t)); for (int i = (*list)[0].len; i <= id; ++i) { @@ -54,7 +56,7 @@ int setkey(tablist_t **list, int id, char *pair) } char **kv = getkv(pair); if (kv == NULL) - return 1; + return 2; int idx = hash(kv[0]); while ((*list)[id].tab[idx].key != NULL && diff --git a/src/main.c b/src/main.c index d1765e8..ab33a86 100644 --- a/src/main.c +++ b/src/main.c @@ -15,7 +15,6 @@ 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) { @@ -86,22 +85,46 @@ int getid(char *selector) { int printkeys(tablist_t **list, int id, char **keys, int klen) { - if (keys == NULL) { - int *indexes = getkeys(*list, id); - printf("{ id: %d ", id); - for (int i = 0; indexes[i]; ++i) - printkey((*list)[id].tab[indexes[i]]); - free(indexes); - printf("}\n"); + if (id > -1) { + if (keys == NULL) { + int *indexes = getkeys(*list, id); + printf("{ id: %d ", id); + for (int i = 0; indexes[i]; ++i) + printkey((*list)[id].tab[indexes[i]]); + free(indexes); + printf("}\n"); + } else { + printf("{ id: %d ", id); + for (int i = 0; i < klen; ++i) { + tabidx_t idx = getkey(*list, id, keys[i]); + if (idx.flag == 0) + continue; + printkey(idx); + } + printf("}\n"); + } } else { - printf("{ id: %d ", id); - for (int i = 0; i < klen; ++i) { - tabidx_t idx = getkey(*list, id, keys[i]); - if (idx.flag == 0) - continue; - printkey(idx); + if (keys == NULL) { + for (int i = 0; i < (*list)[0].len; ++i) { + int *indexes = getkeys(*list, i); + printf("{ id: %d ", i); + for (int j = 0; indexes[j]; ++j) + printkey((*list)[i].tab[indexes[j]]); + free(indexes); + printf("}\n"); + } + } else { + for (int i = 0; i < (*list)[0].len; ++i) { + printf("{ id: %d\n", i); + for (int j = 0; j < klen; ++j) { + tabidx_t idx = getkey(*list, i, keys[i]); + if (idx.flag == 0) + continue; + printkey(idx); + } + printf("}\n"); + } } - printf("}\n"); } return 0; } @@ -126,30 +149,46 @@ int setkeys_main(tablist_t **list, int id, char **pairs, int plen) { if (pairs == NULL) return 1; - 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 (id > -1) { + 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)) { + free(tmp); + return 1; + } free(tmp); - return 1; } - free(tmp); + } else { + for (int i = 0; i < plen; ++i) + if (setkeys(*list, pairs[i])) + return 1; } return 0; } int delkeys_main(tablist_t **list, int id, char **keys, int klen) { - if (keys == NULL) { - int *indexes = getkeys(*list, id); - for (int i = 0; indexes[i]; ++i) - if (delkey(*list, id, (*list)[id].tab[indexes[i]].key)) - return 1; - free(indexes); + if (id > -1) { + if (keys == NULL) { + int *indexes = getkeys(*list, id); + for (int i = 0; indexes[i]; ++i) + if (delkey(*list, id, (*list)[id].tab[indexes[i]].key)) + return 1; + free(indexes); + } else { + for (int i = 0; i < klen; ++i) + if (delkey(*list, id, keys[i])) + return 1; + } } else { - for (int i = 0; i < klen; ++i) - if (delkey(*list, id, keys[i])) - return 1; + if (keys == NULL) + delkeys(*list, NULL); + else { + for (int i = 0; i < klen; ++i) + if (delkeys(*list, keys[i])) + return 1; + } } return 0; } @@ -157,14 +196,9 @@ 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) { - if (id >= 0) + if (id >= -1) return tabop(list, id, keys, klen); - else if (id == -1) { - for (int i = 0; i < (*list)[0].len; ++i) - if (tabop(list, i, keys, klen)) - return 1; - return 0; - } else { + else { fprintf(stderr, "Invalid id\n"); return 1; } diff --git a/src/test.c b/src/test.c index eb9c827..5a4976e 100644 --- a/src/test.c +++ b/src/test.c @@ -54,7 +54,7 @@ void test_delkeys(void) void test_delkeys_all(void) { tablist_t *list = readdb("dbs/test.db"); - if (!delkeys(list, NULL)) + if (delkeys(list, NULL)) fprintf(stderr, "test_delkeys_all: failed\n"); free(list); } @@ -79,6 +79,7 @@ int main(void) test_setkeys_fail(); test_delkeys(); + test_delkeys_all(); test_delkeys_fail(); exit(0); -- cgit v1.2.3