diff options
-rw-r--r-- | src/lib/batch.c | 49 | ||||
-rw-r--r-- | src/lib/file.c | 2 | ||||
-rw-r--r-- | src/lib/mdb.h | 7 | ||||
-rw-r--r-- | src/main.c | 19 | ||||
-rw-r--r-- | src/test.c | 19 |
5 files changed, 55 insertions, 41 deletions
diff --git a/src/lib/batch.c b/src/lib/batch.c index 5046d82..b1579d3 100644 --- a/src/lib/batch.c +++ b/src/lib/batch.c @@ -11,35 +11,45 @@ static int *clone(int n); static tablist_t *copytab(tablist_t *dst, tablist_t *src); static void dellist(tablist_t *list); +extern int setkey(tablist_t **, int, char *); + tablist_t *setkey_copy; char *setkey_str; mtx_t setkey_mtx; -int setkeys(tablist_t *list, char *pair) +int setkeys(tablist_t **list, int id, 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)); - if (mtx_init(&setkey_mtx, mtx_plain) != thrd_success) + if (id < -1) return -1; - - 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); + if (mtx_init(&setkey_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 < 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); } + else + rc = setkey_helper(clone(id)); + if (!rc) { - dellist(list); - memcpy(list, setkey_copy, setkey_copy[0].len * sizeof(tablist_t)); - } else - dellist(setkey_copy); - free(thrds); + if (setkey_copy[0].len > (*list)[0].len) + *list = realloc(*list, setkey_copy[0].len * sizeof(tablist_t)); + dellist(*list); + copytab(*list, setkey_copy); + } + dellist(setkey_copy); free(setkey_copy); return rc; } @@ -124,6 +134,7 @@ static tablist_t *copytab(tablist_t *dst, tablist_t *src) dst[0].len = src[0].len; for (int i = 0; i < src[0].len; ++i) { for (int j = 0; j < TABLEN; ++j) { + dst[i].tab[j] = (tabidx_t) { NULL, 0, { 0 } }; if (src[i].tab[j].flag) { switch (src[i].tab[j].flag) { case 3: diff --git a/src/lib/file.c b/src/lib/file.c index a6bb035..e711511 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; - setkey(&list, i, p); + setkeys(&list, i, p); free(p); break; case 251: diff --git a/src/lib/mdb.h b/src/lib/mdb.h index 56bed05..1a47a52 100644 --- a/src/lib/mdb.h +++ b/src/lib/mdb.h @@ -20,11 +20,12 @@ typedef struct { // Table operations tabidx_t getkey(tablist_t *list, int id, char *key); -int setkey(tablist_t **list, int id, char *pair); +// TODO: Make these private int delkey(tablist_t *list, int id, char *key); -int *getkeys(tablist_t *list, int id); -int setkeys(tablist_t *list, char *pair); +// Batch Operations +int *getkeys(tablist_t *list, int id); // TODO: Reimplement getkeys +int setkeys(tablist_t **list, int id, char *pair); int delkeys(tablist_t *list, char *key); // file operations @@ -147,23 +147,10 @@ void printkey(tabidx_t idx) int setkeys_main(tablist_t **list, int id, char **pairs, int plen) { - if (pairs == NULL) + if (pairs == NULL || id < -1) return 1; - 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); - } - } else { - for (int i = 0; i < plen; ++i) - if (setkeys(*list, pairs[i])) - return 1; - } + for (int i = 0; i < plen; ++i) + setkeys(list, id, pairs[i]); return 0; } @@ -6,7 +6,7 @@ void test_setkeys(void) { tablist_t *list = readdb("dbs/test.db"); - if (setkeys(list, "name:john")) + if (setkeys(&list, -1, "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, -1, "namejohn")) fprintf(stderr, "test_setkeys_fail: failed\n"); for (int i = 0; i < list[0].len; ++i) { int *indexes = getkeys(list, i); @@ -34,6 +34,20 @@ void test_setkeys_fail(void) free(list); } +void test_setkeys_single(void) +{ + tablist_t *list = readdb("dbs/test.db"); + if (setkeys(&list, 101, "name:alice")) + fprintf(stderr, "test_setkeys_single: 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"); @@ -77,6 +91,7 @@ int main(void) { test_setkeys(); test_setkeys_fail(); + test_setkeys_single(); test_delkeys(); test_delkeys_all(); |