From e0629ac93be30bcb0e11d240fd632c2185706306 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Thu, 17 Apr 2025 15:49:08 -0400 Subject: Continuing reimplemtation of getkeys --- src/lib/batch.c | 12 ++++++------ src/lib/file.c | 14 +++++++------- src/lib/getkeys.c | 0 src/lib/keytab.c | 44 +++++++++++++++++++++++--------------------- src/lib/mdb.h | 2 +- src/test.c | 33 +++++++++++++++++++++++---------- 6 files changed, 60 insertions(+), 45 deletions(-) create mode 100644 src/lib/getkeys.c (limited to 'src') diff --git a/src/lib/batch.c b/src/lib/batch.c index eb53631..998abb9 100644 --- a/src/lib/batch.c +++ b/src/lib/batch.c @@ -123,9 +123,9 @@ static int delkey_helper(void *thr_data) rc = delkey(delkey_copy, *id, delkeys_keys[i]); } else { - tabidx_t *indexes = getkeys(delkey_copy, *id, NULL, 0); - for (int i = 0; indexes[i].flag; ++i) - rc = delkey(delkey_copy, *id, indexes[i].key); + tablist_t *indexes = getkeys(delkey_copy, *id, NULL, 0); + for (int i = 0; indexes[0].tab[i].flag; ++i) + rc = delkey(delkey_copy, *id, indexes[0].tab[i].key); free(indexes); } mtx_unlock(&delkey_mtx); @@ -172,9 +172,9 @@ static tablist_t *copytab(tablist_t *dst, tablist_t *src) static void dellist(tablist_t *list) { for (int i = 0; i < list[0].len; ++i) { - tabidx_t *indexes = getkeys(list, i, NULL, 0); - for (int j = 0; indexes[j].flag; ++j) - delkey(list, i, indexes[j].key); + tablist_t *indexes = getkeys(list, i, NULL, 0); + for (int j = 0; indexes[0].tab[j].flag; ++j) + delkey(list, i, indexes[0].tab[j].key); free(indexes); } } diff --git a/src/lib/file.c b/src/lib/file.c index 0204e4e..8b0c715 100644 --- a/src/lib/file.c +++ b/src/lib/file.c @@ -59,19 +59,19 @@ void writedb(char *filename, tablist_t *list) return; for (int i = 0; i < list[0].len; ++i) { fputc(0xFB, fp); - tabidx_t *indexes = getkeys(list, i, NULL, 0); - for (int j = 0; indexes[j].flag; ++j) { - fprintf(fp, "\xfa%s:", indexes[j].key); - switch (indexes[j].flag) { + tablist_t *indexes = getkeys(list, i, NULL, 0); + for (int j = 0; indexes[0].tab[j].flag; ++j) { + fprintf(fp, "\xfa%s:", indexes[0].tab[j].key); + switch (indexes[0].tab[j].flag) { case 1: - fprintf(fp, "%.2lf\xfc", indexes[j].value.num); + fprintf(fp, "%.2lf\xfc", indexes[0].tab[j].value.num); break; case 2: - fprintf(fp, "%s\xfc", indexes[j].value.boolean ? + fprintf(fp, "%s\xfc", indexes[0].tab[j].value.boolean ? "true" : "false"); break; case 3: - fprintf(fp, "%s\xfc", indexes[j].value.str); + fprintf(fp, "%s\xfc", indexes[0].tab[j].value.str); break; } } diff --git a/src/lib/getkeys.c b/src/lib/getkeys.c new file mode 100644 index 0000000..e69de29 diff --git a/src/lib/keytab.c b/src/lib/keytab.c index 425b0e1..146937c 100644 --- a/src/lib/keytab.c +++ b/src/lib/keytab.c @@ -8,33 +8,35 @@ static int hash(char *key); static char **getkv(char *pair); // getkeys - gets every single key in a key table -tabidx_t *getkeys(tablist_t *list, int id, char **keys, int klen) +tablist_t *getkeys(tablist_t *list, int id, char **keys, int klen) { - int len = 1; - if (id >= list[0].len) + if (id >= list[0].len || id < -1) return NULL; - tabidx_t *indexes = calloc(len, sizeof(tabidx_t)); - if (klen == 0) { - for (int i = 0, j = 0; i < TABLEN; ++i) { - if (j >= len) { - indexes = realloc(indexes, ++len * sizeof(tabidx_t)); - indexes[len - 1] = (tabidx_t) { NULL, 0, { 0 } }; + int rc = 0; + int len = id == -1 ? list[0].len : 1; + tablist_t *indexes = calloc(len, sizeof(tablist_t)); + indexes[0].len = len; + if (id >= 0) { + if (klen == 0) { + for (int i = 0, j = 0; i < TABLEN; ++i) { + if (list[id].tab[i].flag) + indexes[0].tab[j++] = list[id].tab[i]; } - if (list[id].tab[i].flag) - indexes[j++] = list[id].tab[i]; - } - } else { - for (int i = 0, j = 0; i < klen; ++i) { - tabidx_t idx = getkey(list, id, keys[i]); - if (idx.flag == 0) - return NULL; - if (j >= len) { - indexes = realloc(indexes, ++len * sizeof(tabidx_t)); + } else { + for (int i = 0, j = 0; i < klen; ++i) { + tabidx_t idx = getkey(list, id, keys[i]); + if (idx.flag == 0) + rc = 1; + indexes[0].tab[j++] = idx; } - indexes[j++] = idx; } } - return indexes; + if (!rc) { + return indexes; + } else { + free(indexes); + return NULL; + } } // getkey - gets a single key from a keytable diff --git a/src/lib/mdb.h b/src/lib/mdb.h index 9038aef..f1284b7 100644 --- a/src/lib/mdb.h +++ b/src/lib/mdb.h @@ -23,7 +23,7 @@ typedef struct { tabidx_t getkey(tablist_t *list, int id, char *key); // Batch Operations -tabidx_t *getkeys(tablist_t *list, int id, char **keys, int len); // TODO: Reimplement getkeys +tablist_t *getkeys(tablist_t *list, int id, char **keys, int len); // TODO: Reimplement getkeys int setkeys(tablist_t **list, int id, char **pairs, int len); int delkeys(tablist_t *list, int id, char **keys, int len); diff --git a/src/test.c b/src/test.c index 76debdc..bb5f063 100644 --- a/src/test.c +++ b/src/test.c @@ -11,9 +11,9 @@ void test_setkeys(void) fprintf(stderr, "test_setkeys: failed\n"); for (int i = 0; i < list[0].len; ++i) { printf("id: %d\n", i); - tabidx_t *indexes = getkeys(list, i, NULL, 0); - for (int j = 0; indexes[j].flag; ++j) - printf("%s\n", indexes[j].key); + tablist_t *indexes = getkeys(list, i, NULL, 0); + for (int j = 0; indexes[0].tab[j].flag; ++j) + printf("%s\n", indexes[0].tab[j].key); free(indexes); } delkeys(list, -1, NULL, 0); @@ -68,9 +68,9 @@ void test_delkeys(void) fprintf(stderr, "test_delkeys: failed\n"); for (int i = 0; i < list[0].len; ++i) { printf("id: %d\n", i); - tabidx_t *indexes = getkeys(list, i, NULL, 0); - for (int j = 0; indexes[j].flag; ++j) - printf("%s\n", indexes[j].key); + tablist_t *indexes = getkeys(list, i, NULL, 0); + for (int j = 0; indexes[0].tab[j].flag; ++j) + printf("%s\n", indexes[0].tab[j].key); free(indexes); } delkeys(list, -1, NULL, 0); @@ -118,18 +118,32 @@ void test_getkeys_multi(void) { tablist_t *list = readdb("dbs/test.db"); char *keys[] = { "Row_1", "Row_2" }; - tabidx_t *ret = getkeys(list, 0, keys, 2); + tablist_t *ret = getkeys(list, 0, keys, 2); if (ret == NULL) fprintf(stderr, "test_getkeys_multi: failed\n"); - for (int i = 0; ret[i].flag; ++i) - printf("%s\n", ret[i].key); + for (int i = 0; ret[0].tab[i].flag; ++i) + printf("%s\n", ret[0].tab[i].key); free(ret); delkeys(list, -1, NULL, 0); free(list); } +void test_getkeys_multi_fail(void) +{ + tablist_t *list = readdb("dbs/test.db"); + char *keys[] = { "Row_1", "Row_4" }; + tablist_t *ret = getkeys(list, 0, keys, 2); + if (ret) + fprintf(stderr, "test_getkeys_multi_fail: failed\n"); + delkeys(list, -1, NULL, 0); + free(list); +} + int main(void) { + test_getkeys_multi(); + test_getkeys_multi_fail(); + test_setkeys(); test_setkeys_fail(); test_setkeys_single(); @@ -142,6 +156,5 @@ int main(void) test_delkeys_single(); test_delkeys_multi(); - test_getkeys_multi(); exit(0); } -- cgit v1.2.3