diff options
-rw-r--r-- | src/lib/batch.c | 32 | ||||
-rw-r--r-- | src/lib/file.c | 7 | ||||
-rw-r--r-- | src/lib/mdb.h | 4 | ||||
-rw-r--r-- | src/test.c | 47 |
4 files changed, 41 insertions, 49 deletions
diff --git a/src/lib/batch.c b/src/lib/batch.c index b1579d3..30102c7 100644 --- a/src/lib/batch.c +++ b/src/lib/batch.c @@ -12,6 +12,7 @@ static tablist_t *copytab(tablist_t *dst, tablist_t *src); static void dellist(tablist_t *list); extern int setkey(tablist_t **, int, char *); +extern int delkey(tablist_t *, int, char *); tablist_t *setkey_copy; char *setkey_str; @@ -58,31 +59,36 @@ tablist_t *delkey_copy; char *delkey_str; mtx_t delkey_mtx; -int delkeys(tablist_t *list, char *key) +int delkeys(tablist_t *list, int id, char *key) { int rc = 0; delkey_copy = calloc(list[0].len, sizeof(tablist_t)); copytab(delkey_copy, list); delkey_str = key; - thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t)); - if (mtx_init(&delkey_mtx, mtx_plain) != thrd_success) + 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) + thrd_create(&thrds[i], delkey_helper, clone(i)); + for (int i = 0; i < delkey_copy[0].len; ++i) { + if (rc) + thrd_join(thrds[i], NULL); + else + thrd_join(thrds[i], &rc); + } + free(thrds); + } else + rc = delkey_helper(clone(id)); - 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) { - if (rc) - thrd_join(thrds[i], NULL); - else - thrd_join(thrds[i], &rc); - } if (!rc) { dellist(list); memmove(list, delkey_copy, delkey_copy[0].len * sizeof(tablist_t)); } else dellist(delkey_copy); - free(thrds); free(delkey_copy); return rc; } @@ -102,7 +108,7 @@ static int setkey_helper(void *thr_data) static int delkey_helper(void *thr_data) { - int rc; + int rc = 0; int *id = (int *) thr_data; mtx_lock(&delkey_mtx); diff --git a/src/lib/file.c b/src/lib/file.c index e711511..a5119ea 100644 --- a/src/lib/file.c +++ b/src/lib/file.c @@ -46,12 +46,7 @@ tablist_t *readdb(char *filename) fail: fclose(fp); - 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); - } + delkeys(list, -1, NULL); free(list); return NULL; } diff --git a/src/lib/mdb.h b/src/lib/mdb.h index 1a47a52..b5dc768 100644 --- a/src/lib/mdb.h +++ b/src/lib/mdb.h @@ -20,13 +20,11 @@ typedef struct { // Table operations tabidx_t getkey(tablist_t *list, int id, char *key); -// TODO: Make these private -int delkey(tablist_t *list, int id, char *key); // 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); +int delkeys(tablist_t *list, int id, char *key); // file operations tablist_t *readdb(char *filename); @@ -11,12 +11,11 @@ void test_setkeys(void) 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) { + 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); } + delkeys(list, -1, NULL); free(list); } @@ -25,12 +24,7 @@ void test_setkeys_fail(void) tablist_t *list = readdb("dbs/test.db"); 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); - for (int j = 0; indexes[j]; ++j) - delkey(list, i, list[i].tab[indexes[j]].key); - free(indexes); - } + delkeys(list, -1, NULL); free(list); } @@ -39,36 +33,30 @@ 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); - } + delkeys(list, -1, NULL); free(list); } void test_delkeys(void) { tablist_t *list = readdb("dbs/test.db"); - if (delkeys(list, "Row_1")) + if (delkeys(list, -1, "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) { + 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); } + delkeys(list, -1, NULL); free(list); } void test_delkeys_all(void) { tablist_t *list = readdb("dbs/test.db"); - if (delkeys(list, NULL)) + if (delkeys(list, -1, NULL)) fprintf(stderr, "test_delkeys_all: failed\n"); free(list); } @@ -76,14 +64,18 @@ void test_delkeys_all(void) void test_delkeys_fail(void) { tablist_t *list = readdb("dbs/test.db"); - if (!delkeys(list, "Row_4")) + if (!delkeys(list, -1, "Row_4")) fprintf(stderr, "test_delkeys_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); - } + delkeys(list, -1, NULL); + free(list); +} + +void test_delkeys_single(void) +{ + tablist_t *list = readdb("dbs/test.db"); + if (delkeys(list, 0, NULL)) + fprintf(stderr, "test_delkeys_single: failed\n"); + delkeys(list, -1, NULL); free(list); } @@ -96,6 +88,7 @@ int main(void) test_delkeys(); test_delkeys_all(); test_delkeys_fail(); + test_delkeys_single(); exit(0); } |