summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-04-23 14:04:31 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-04-23 14:04:31 -0400
commit49a24bf62efc8d46e813d769dac2c36c413c21e8 (patch)
treeb43d4547da9677eb1051f4a21c66b5f0d0d076a4
parentba5422d8ac64ca864dca168780a957a92f22a5d0 (diff)
Implemented Isolation in delkeys
-rw-r--r--README.md2
-rw-r--r--src/lib/delkeys.c59
-rw-r--r--src/lib/mdb.h2
3 files changed, 41 insertions, 22 deletions
diff --git a/README.md b/README.md
index 3965481..8224360 100644
--- a/README.md
+++ b/README.md
@@ -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 {