diff options
author | bpc2003 <wpesfriendnva@gmail.com> | 2025-04-22 16:45:36 -0400 |
---|---|---|
committer | bpc2003 <wpesfriendnva@gmail.com> | 2025-04-22 16:45:36 -0400 |
commit | ba5422d8ac64ca864dca168780a957a92f22a5d0 (patch) | |
tree | 7dbc2c9dd25038cb1af8f153331cd0bd417aa3d5 /src/lib/delkeys.c | |
parent | dc83060f785031f1607dc4152e678472bff06b8a (diff) |
Add utils.h and moved batch operations into their own files
Diffstat (limited to 'src/lib/delkeys.c')
-rw-r--r-- | src/lib/delkeys.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/lib/delkeys.c b/src/lib/delkeys.c index e69de29..b1ee83a 100644 --- a/src/lib/delkeys.c +++ b/src/lib/delkeys.c @@ -0,0 +1,95 @@ +#include <threads.h> +#include <stdlib.h> +#include <string.h> + +#include "mdb.h" +#include "utils.h" + +static int delkey_helper(void *thr_data); +static int delkey(tablist_t *, int, char *); + +tablist_t *delkey_copy; +char **delkeys_keys; +int keys_len; + +mtx_t delkey_mtx; + + +int delkeys(tablist_t *list, int id, char **keys, int len) +{ + if (id < -1 || len < 0) + return -1; + if (mtx_init(&delkey_mtx, mtx_plain) != thrd_success) + return -2; + int rc = 0; + delkey_copy = calloc(list[0].len, sizeof(tablist_t)); + copytab(delkey_copy, list); + delkeys_keys = keys; + keys_len = len; + + 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)); + + if (!rc) { + dellist(list); + memmove(list, delkey_copy, delkey_copy[0].len * sizeof(tablist_t)); + } else + dellist(delkey_copy); + mtx_destroy(&delkey_mtx); + free(delkey_copy); + return rc; +} + +static int delkey_helper(void *thr_data) +{ + int rc = 0; + int *id = (int *) thr_data; + + mtx_lock(&delkey_mtx); + if (keys_len > 0 && delkeys_keys != NULL) + for (int i = 0; i < keys_len; ++i) { + if (delkeys_keys[i] == NULL) + return -3; + rc = delkey(delkey_copy, *id, delkeys_keys[i]); + } + else { + 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); + + free(id); + return rc; +} + +static int delkey(tablist_t *list, int id, char *key) +{ + int idx = hash(key); + if (list[id].tab[idx].key == NULL) + return 1; + while (strcmp(list[id].tab[idx].key, key) && idx < TABLEN) + idx++; + if (idx >= TABLEN) + return 2; + free(list[id].tab[idx].key); + list[id].tab[idx].key = NULL; + if (list[id].tab[idx].flag == 3) { + free(list[id].tab[idx].value.str); + list[id].tab[idx].value.str = NULL; + } + list[id].tab[idx].flag = 0; + return 0; +} |