summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-03-20 15:42:33 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-03-20 15:42:33 -0400
commitd1eb4277100d5ef08d6768d394660e89bf656250 (patch)
treefe6fcbe7e404ec9484fed0d025309baf57fe09c6
parent283a433f56fc761a8fe698fcfc71898ebca07e71 (diff)
Add delkeys
-rw-r--r--src/lib/batch.c75
-rw-r--r--src/lib/keytab.c5
-rw-r--r--src/main.c4
-rw-r--r--src/test.c34
4 files changed, 96 insertions, 22 deletions
diff --git a/src/lib/batch.c b/src/lib/batch.c
index e728557..91def77 100644
--- a/src/lib/batch.c
+++ b/src/lib/batch.c
@@ -7,44 +7,65 @@
#include "mdb.h"
static int setkey_helper(void *thr_data);
-/*static int delkey_helper(void *thr_data);*/
+static int delkey_helper(void *thr_data);
+static int *clone(int n);
-
-tablist_t *copy;
-char *str;
+tablist_t *setkey_copy;
+char *setkey_str;
mtx_t setkey_mtx;
int setkeys(tablist_t **list, char *pair)
{
int rc;
- copy = calloc(list[0]->len, sizeof(tablist_t));
- memcpy(copy, *list, list[0]->len * sizeof(tablist_t));
- str = pair;
+ setkey_copy = calloc(list[0]->len, sizeof(tablist_t));
+ memcpy(setkey_copy, *list, list[0]->len * sizeof(tablist_t));
+ setkey_str = pair;
thrd_t *thrds = calloc(list[0]->len, sizeof(thrd_t));
if (mtx_init(&setkey_mtx, mtx_plain) != thrd_success)
return 1;
- for (int i = 0; i < copy[0].len; ++i) {
- int *arg = calloc(1, sizeof(int));
- *arg = i;
- thrd_create(&thrds[i], setkey_helper, arg);
- }
- for (int i = 0; i < copy[0].len; ++i) {
+ for (int i = 0; i < setkey_copy[0].len; ++i)
+ thrd_create(&thrds[i], setkey_helper, clone(i));
+ for (int i = 0; i < setkey_copy[0].len; ++i) {
thrd_join(thrds[i], &rc);
if (rc)
break;
}
if (!rc)
- memcpy(*list, copy, copy[0].len * sizeof(tablist_t));
+ memcpy(*list, setkey_copy, setkey_copy[0].len * sizeof(tablist_t));
free(thrds);
- free(copy);
+ free(setkey_copy);
return rc;
}
+tablist_t *delkey_copy;
+char *delkey_str;
+
+mtx_t delkey_mtx;
int delkeys(tablist_t *list, char *key)
{
- return 0;
+ int rc;
+ delkey_copy = calloc(list[0].len, sizeof(tablist_t));
+ memcpy(delkey_copy, list, list[0].len * sizeof(tablist_t));
+ delkey_str = key;
+
+ thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t));
+ if (mtx_init(&delkey_mtx, mtx_plain) != thrd_success)
+ return 1;
+
+ 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) {
+ thrd_join(thrds[i], &rc);
+ if (rc)
+ break;
+ }
+ if (!rc)
+ memcpy(list, delkey_copy, delkey_copy[0].len * sizeof(tablist_t));
+ free(thrds);
+ free(delkey_copy);
+ return rc;
}
static int setkey_helper(void *thr_data)
@@ -53,9 +74,29 @@ static int setkey_helper(void *thr_data)
int rc;
mtx_lock(&setkey_mtx);
- rc = setkey(&copy, *id, str);
+ rc = setkey(&setkey_copy, *id, setkey_str);
mtx_unlock(&setkey_mtx);
free(id);
return rc;
}
+
+static int delkey_helper(void *thr_data)
+{
+ int *id = (int *) thr_data;
+ int rc;
+
+ mtx_lock(&delkey_mtx);
+ rc = delkey(delkey_copy, *id, delkey_str);
+ mtx_unlock(&delkey_mtx);
+
+ free(id);
+ return rc;
+}
+
+static int *clone(int n)
+{
+ int *c = calloc(1, sizeof(int));
+ *c = n;
+ return c;
+}
diff --git a/src/lib/keytab.c b/src/lib/keytab.c
index ff32e42..7f73afb 100644
--- a/src/lib/keytab.c
+++ b/src/lib/keytab.c
@@ -1,4 +1,3 @@
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
@@ -54,10 +53,8 @@ int setkey(tablist_t **list, int id, char *pair)
(*list)[0].len = id + 1;
}
char **kv = getkv(pair);
- if (kv == NULL) {
- free(pair);
+ if (kv == NULL)
return 1;
- }
int idx = hash(kv[0]);
while ((*list)[id].tab[idx].key != NULL &&
diff --git a/src/main.c b/src/main.c
index a0ffa87..ba40b56 100644
--- a/src/main.c
+++ b/src/main.c
@@ -128,8 +128,10 @@ int setkeys_main(tablist_t **list, int id, char **pairs, int plen)
for (int i = 0; i < plen; ++i) {
char *tmp = calloc(strlen(pairs[i]) + 1, sizeof(char));
strcpy(tmp, pairs[i]);
- if (setkey(list, id, tmp))
+ if (setkey(list, id, tmp)) {
+ free(tmp);
return 1;
+ }
free(tmp);
}
return 0;
diff --git a/src/test.c b/src/test.c
index 4103c41..dd96490 100644
--- a/src/test.c
+++ b/src/test.c
@@ -9,6 +9,38 @@ void test_setkeys(void)
if (setkeys(&list, "name:john"))
fprintf(stderr, "test_setkeys: 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) {
+ printf("%s\n", list[i].tab[indexes[j]].key);
+ delkey(list, i, list[i].tab[indexes[j]].key);
+ }
+ free(indexes);
+ }
+ free(list);
+}
+
+void test_setkeys_fail(void)
+{
+ tablist_t *list = readdb("dbs/test.db");
+ if (!setkeys(&list, "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);
+ }
+ free(list);
+}
+
+void test_delkeys(void)
+{
+ tablist_t *list = readdb("dbs/test.db");
+ if (delkeys(list, "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) {
printf("%s\n", list[i].tab[indexes[j]].key);
@@ -22,5 +54,7 @@ void test_setkeys(void)
int main(void)
{
test_setkeys();
+ test_setkeys_fail();
+ test_delkeys();
exit(0);
}