diff options
author | bpc2003 <wpesfriendnva@gmail.com> | 2025-04-23 14:04:31 -0400 |
---|---|---|
committer | bpc2003 <wpesfriendnva@gmail.com> | 2025-04-23 14:04:31 -0400 |
commit | 49a24bf62efc8d46e813d769dac2c36c413c21e8 (patch) | |
tree | b43d4547da9677eb1051f4a21c66b5f0d0d076a4 | |
parent | ba5422d8ac64ca864dca168780a957a92f22a5d0 (diff) |
Implemented Isolation in delkeys
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | src/lib/delkeys.c | 59 | ||||
-rw-r--r-- | src/lib/mdb.h | 2 |
3 files changed, 41 insertions, 22 deletions
@@ -36,7 +36,7 @@ Examples: There are six functions and two types in mdb.h #### Types: - tabidx_t: represents a single key-value pair in an object. -- tablist_t: represents a single object. +- tablist_t: represents a single document. #### Functions: - readdb: takes a filename and returns a tablist array\ if the file doesn't exist it will return an empty tablist array\ diff --git a/src/lib/delkeys.c b/src/lib/delkeys.c index b1ee83a..36a5174 100644 --- a/src/lib/delkeys.c +++ b/src/lib/delkeys.c @@ -7,30 +7,33 @@ static int delkey_helper(void *thr_data); static int delkey(tablist_t *, int, char *); +static struct params *pass(mtx_t *mtx, tablist_t *list, char **keys, int len, int id); -tablist_t *delkey_copy; -char **delkeys_keys; -int keys_len; -mtx_t delkey_mtx; +struct params { + mtx_t *mtx; + tablist_t *copy; + char **keys; + int len; + int id; +}; int delkeys(tablist_t *list, int id, char **keys, int len) { + mtx_t mtx; if (id < -1 || len < 0) return -1; - if (mtx_init(&delkey_mtx, mtx_plain) != thrd_success) + if (mtx_init(&mtx, mtx_plain) != thrd_success) return -2; int rc = 0; - delkey_copy = calloc(list[0].len, sizeof(tablist_t)); + tablist_t *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)); + thrd_create(&thrds[i], delkey_helper, pass(&mtx, delkey_copy, keys, len, i)); for (int i = 0; i < delkey_copy[0].len; ++i) { if (rc) thrd_join(thrds[i], NULL); @@ -39,14 +42,14 @@ int delkeys(tablist_t *list, int id, char **keys, int len) } free(thrds); } else - rc = delkey_helper(clone(id)); + rc = delkey_helper(pass(&mtx, delkey_copy, keys, len, id)); if (!rc) { dellist(list); memmove(list, delkey_copy, delkey_copy[0].len * sizeof(tablist_t)); } else dellist(delkey_copy); - mtx_destroy(&delkey_mtx); + mtx_destroy(&mtx); free(delkey_copy); return rc; } @@ -54,24 +57,27 @@ int delkeys(tablist_t *list, int id, char **keys, int len) static int delkey_helper(void *thr_data) { int rc = 0; - int *id = (int *) thr_data; + struct params *p = (struct params *) 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) + mtx_lock(p->mtx); + if (p->len > 0 && p->keys != NULL) + for (int i = 0; i < p->len; ++i) { + if (p->keys[i] == NULL) { + mtx_unlock(p->mtx); + free(p); return -3; - rc = delkey(delkey_copy, *id, delkeys_keys[i]); + } + rc = delkey(p->copy, p->id, p->keys[i]); } else { - tablist_t *indexes = getkeys(delkey_copy, *id, NULL, 0); + tablist_t *indexes = getkeys(p->copy, p->id, NULL, 0); for (int i = 0; indexes[0].tab[i].flag; ++i) - rc = delkey(delkey_copy, *id, indexes[0].tab[i].key); + rc = delkey(p->copy, p->id, indexes[0].tab[i].key); free(indexes); } - mtx_unlock(&delkey_mtx); + mtx_unlock(p->mtx); - free(id); + free(p); return rc; } @@ -93,3 +99,14 @@ static int delkey(tablist_t *list, int id, char *key) list[id].tab[idx].flag = 0; return 0; } + +static struct params *pass(mtx_t *mtx, tablist_t *list, char **keys, int len, int id) +{ + struct params *p = calloc(1, sizeof(struct params)); + p->mtx = mtx; + p->copy = list; + p->keys = keys; + p->len = len; + p->id = id; + return p; +} diff --git a/src/lib/mdb.h b/src/lib/mdb.h index cb0502d..96a0e3e 100644 --- a/src/lib/mdb.h +++ b/src/lib/mdb.h @@ -1,6 +1,8 @@ #ifndef MDB_H #define MDB_H +// TODO: implement isolation in setkeys and getkeys. + #define TABLEN 1024 typedef struct { |