diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/batch.c | 55 |
1 files changed, 45 insertions, 10 deletions
diff --git a/src/lib/batch.c b/src/lib/batch.c index b8b7629..15b349c 100644 --- a/src/lib/batch.c +++ b/src/lib/batch.c @@ -22,7 +22,7 @@ int setkeys(tablist_t **list, char *pair) thrd_t *thrds = calloc(list[0]->len, sizeof(thrd_t)); if (mtx_init(&setkey_mtx, mtx_plain) != thrd_success) - return 1; + return -1; for (int i = 0; i < setkey_copy[0].len; ++i) thrd_create(&thrds[i], setkey_helper, clone(i)); @@ -43,16 +43,37 @@ tablist_t *delkey_copy; char *delkey_str; mtx_t delkey_mtx; +// TODO: make copy_init function int delkeys(tablist_t *list, char *key) { int rc = 0; delkey_copy = calloc(list[0].len, sizeof(tablist_t)); - memcpy(delkey_copy, list, list[0].len * sizeof(tablist_t)); + for (int i = 0; i < list[0].len; ++i) { + for (int j = 0; j < TABLEN; ++j) { + if (list[i].tab[j].flag) { + delkey_copy[i].tab[j].key = + calloc(strlen(list[i].tab[j].key) + 1, sizeof(char)); + strcpy(delkey_copy[i].tab[j].key, list[i].tab[j].key); + delkey_copy[i].tab[j].flag = list[i].tab[j].flag; + switch(list[i].tab[j].flag) { + case 3: + delkey_copy[i].tab[j].value.str = + calloc(strlen(list[i].tab[j].value.str) + 1, sizeof(char)); + strcpy(delkey_copy[i].tab[j].value.str, list[i].tab[j].value.str); + break; + default: + delkey_copy[i].tab[j].value = list[i].tab[j].value; + break; + } + } + } + } + delkey_copy[0].len = list[0].len; delkey_str = key; thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t)); if (mtx_init(&delkey_mtx, mtx_plain) != thrd_success) - return 1; + return -1; for (int i = 0; i < delkey_copy[0].len; ++i) thrd_create(&thrds[i], delkey_helper, clone(i)); @@ -62,8 +83,22 @@ int delkeys(tablist_t *list, char *key) else thrd_join(thrds[i], &rc); } - if (!rc) - memcpy(list, delkey_copy, delkey_copy[0].len * sizeof(tablist_t)); + if (!rc) { + 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); + } + memmove(list, delkey_copy, delkey_copy[0].len * sizeof(tablist_t)); + } else { + for (int i = 0; i < delkey_copy[0].len; ++i) { + int *indexes = getkeys(delkey_copy, i); + for (int j = 0; indexes[j]; ++j) + delkey(delkey_copy, i, delkey_copy[i].tab[indexes[j]].key); + free(indexes); + } + } free(thrds); free(delkey_copy); return rc; @@ -71,27 +106,27 @@ int delkeys(tablist_t *list, char *key) static int setkey_helper(void *thr_data) { - int rc = 0; + int rc; + int *id = (int *) thr_data; mtx_lock(&setkey_mtx); - int *id = (int *) thr_data; rc = setkey(&setkey_copy, *id, setkey_str); - free(id); mtx_unlock(&setkey_mtx); + free(id); return rc; } static int delkey_helper(void *thr_data) { int rc; + int *id = (int *) thr_data; mtx_lock(&delkey_mtx); - int *id = (int *) thr_data; rc = delkey(delkey_copy, *id, delkey_str); - free(id); mtx_unlock(&delkey_mtx); + free(id); return rc; } |