summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-04-15 15:21:29 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-04-15 15:21:29 -0400
commit44fa7d3682ff4e102bb7a228e9e5a100a050fea5 (patch)
tree23f020e97aaf2e7e6b8e7be88562831972ec4580 /src/lib
parent0abf0ad19a09a7d643d9d64adcdb4d9b4d7fdbc1 (diff)
Updated delkeys and setkeys to take multiple keys
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/batch.c62
-rw-r--r--src/lib/file.c4
-rw-r--r--src/lib/mdb.h5
3 files changed, 40 insertions, 31 deletions
diff --git a/src/lib/batch.c b/src/lib/batch.c
index 30102c7..a56ff2d 100644
--- a/src/lib/batch.c
+++ b/src/lib/batch.c
@@ -18,31 +18,33 @@ tablist_t *setkey_copy;
char *setkey_str;
mtx_t setkey_mtx;
-int setkeys(tablist_t **list, int id, char *pair)
+int setkeys(tablist_t **list, int id, char **pairs, int len)
{
- int rc = 0;
- setkey_copy = calloc((*list)[0].len, sizeof(tablist_t));
- copytab(setkey_copy, *list);
- setkey_str = pair;
- if (id < -1)
+ if (id < -1 || pairs == NULL || len <= 0)
return -1;
if (mtx_init(&setkey_mtx, mtx_plain) != thrd_success)
return -2;
+ int rc = 0;
+ setkey_copy = calloc((*list)[0].len, sizeof(tablist_t));
+ copytab(setkey_copy, *list);
- if (id == -1) {
- thrd_t *thrds = calloc((*list)[0].len, sizeof(thrd_t));
- 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) {
- if (rc)
- thrd_join(thrds[i], NULL);
- else
- thrd_join(thrds[i], &rc);
+ for (int i = 0; i < len; ++i) {
+ setkey_str = pairs[i];
+ if (id == -1) {
+ thrd_t *thrds = calloc((*list)[0].len, sizeof(thrd_t));
+ 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) {
+ if (rc)
+ thrd_join(thrds[i], NULL);
+ else
+ thrd_join(thrds[i], &rc);
+ }
+ free(thrds);
}
- free(thrds);
+ else
+ rc = setkey_helper(clone(id));
}
- else
- rc = setkey_helper(clone(id));
if (!rc) {
if (setkey_copy[0].len > (*list)[0].len)
@@ -56,20 +58,22 @@ int setkeys(tablist_t **list, int id, char *pair)
}
tablist_t *delkey_copy;
-char *delkey_str;
+char **delkeys_keys;
+int keys_len;
mtx_t delkey_mtx;
-int delkeys(tablist_t *list, int id, char *key)
+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);
- delkey_str = key;
+ delkeys_keys = keys;
+ keys_len = len;
- if (id < -1)
- return -1;
- if (mtx_init(&delkey_mtx, mtx_plain) != thrd_success)
- return -2;
if (id == -1) {
thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t));
for (int i = 0; i < delkey_copy[0].len; ++i)
@@ -112,8 +116,12 @@ static int delkey_helper(void *thr_data)
int *id = (int *) thr_data;
mtx_lock(&delkey_mtx);
- if (delkey_str)
- rc = delkey(delkey_copy, *id, delkey_str);
+ if (keys_len > 0)
+ for (int i = 0; i < keys_len; ++i) {
+ if (delkeys_keys[i] == NULL)
+ return -3;
+ rc = delkey(delkey_copy, *id, delkeys_keys[i]);
+ }
else {
int *indexes = getkeys(delkey_copy, *id);
for (int i = 0; indexes[i]; ++i)
diff --git a/src/lib/file.c b/src/lib/file.c
index a5119ea..f8a4db6 100644
--- a/src/lib/file.c
+++ b/src/lib/file.c
@@ -26,7 +26,7 @@ tablist_t *readdb(char *filename)
case 250:
p = getpair(&c, fp);
if (p == NULL) goto fail;
- setkeys(&list, i, p);
+ setkeys(&list, i, &p, 1);
free(p);
break;
case 251:
@@ -46,7 +46,7 @@ tablist_t *readdb(char *filename)
fail:
fclose(fp);
- delkeys(list, -1, NULL);
+ delkeys(list, -1, NULL, 0);
free(list);
return NULL;
}
diff --git a/src/lib/mdb.h b/src/lib/mdb.h
index b5dc768..a53f4b5 100644
--- a/src/lib/mdb.h
+++ b/src/lib/mdb.h
@@ -22,9 +22,10 @@ typedef struct {
tabidx_t getkey(tablist_t *list, int id, char *key);
// Batch Operations
+// TODO: make setkeys and delkeys take char ** and int
int *getkeys(tablist_t *list, int id); // TODO: Reimplement getkeys
-int setkeys(tablist_t **list, int id, char *pair);
-int delkeys(tablist_t *list, int id, char *key);
+int setkeys(tablist_t **list, int id, char **pairs, int len);
+int delkeys(tablist_t *list, int id, char **keys, int len);
// file operations
tablist_t *readdb(char *filename);