summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-04-05 13:14:44 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-04-05 13:14:44 -0400
commit6eaa6e615a18422b140a7661ae5e31d48743324c (patch)
tree1be6cefbff4346a75e11fd41ecdcea0547fb0964 /src
parent127964c29a3834404f50fa611d75ce4c679f34ba (diff)
Update setkeys so it handles both single and batch operations
Diffstat (limited to 'src')
-rw-r--r--src/lib/batch.c49
-rw-r--r--src/lib/file.c2
-rw-r--r--src/lib/mdb.h7
-rw-r--r--src/main.c19
-rw-r--r--src/test.c19
5 files changed, 55 insertions, 41 deletions
diff --git a/src/lib/batch.c b/src/lib/batch.c
index 5046d82..b1579d3 100644
--- a/src/lib/batch.c
+++ b/src/lib/batch.c
@@ -11,35 +11,45 @@ static int *clone(int n);
static tablist_t *copytab(tablist_t *dst, tablist_t *src);
static void dellist(tablist_t *list);
+extern int setkey(tablist_t **, int, char *);
+
tablist_t *setkey_copy;
char *setkey_str;
mtx_t setkey_mtx;
-int setkeys(tablist_t *list, char *pair)
+int setkeys(tablist_t **list, int id, char *pair)
{
int rc = 0;
- setkey_copy = calloc(list[0].len, sizeof(tablist_t));
- copytab(setkey_copy, list);
+ setkey_copy = calloc((*list)[0].len, sizeof(tablist_t));
+ copytab(setkey_copy, *list);
setkey_str = pair;
-
- thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t));
- if (mtx_init(&setkey_mtx, mtx_plain) != thrd_success)
+ if (id < -1)
return -1;
-
- 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);
+ if (mtx_init(&setkey_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 < 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);
}
+ else
+ rc = setkey_helper(clone(id));
+
if (!rc) {
- dellist(list);
- memcpy(list, setkey_copy, setkey_copy[0].len * sizeof(tablist_t));
- } else
- dellist(setkey_copy);
- free(thrds);
+ if (setkey_copy[0].len > (*list)[0].len)
+ *list = realloc(*list, setkey_copy[0].len * sizeof(tablist_t));
+ dellist(*list);
+ copytab(*list, setkey_copy);
+ }
+ dellist(setkey_copy);
free(setkey_copy);
return rc;
}
@@ -124,6 +134,7 @@ static tablist_t *copytab(tablist_t *dst, tablist_t *src)
dst[0].len = src[0].len;
for (int i = 0; i < src[0].len; ++i) {
for (int j = 0; j < TABLEN; ++j) {
+ dst[i].tab[j] = (tabidx_t) { NULL, 0, { 0 } };
if (src[i].tab[j].flag) {
switch (src[i].tab[j].flag) {
case 3:
diff --git a/src/lib/file.c b/src/lib/file.c
index a6bb035..e711511 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;
- setkey(&list, i, p);
+ setkeys(&list, i, p);
free(p);
break;
case 251:
diff --git a/src/lib/mdb.h b/src/lib/mdb.h
index 56bed05..1a47a52 100644
--- a/src/lib/mdb.h
+++ b/src/lib/mdb.h
@@ -20,11 +20,12 @@ typedef struct {
// Table operations
tabidx_t getkey(tablist_t *list, int id, char *key);
-int setkey(tablist_t **list, int id, char *pair);
+// TODO: Make these private
int delkey(tablist_t *list, int id, char *key);
-int *getkeys(tablist_t *list, int id);
-int setkeys(tablist_t *list, char *pair);
+// Batch Operations
+int *getkeys(tablist_t *list, int id); // TODO: Reimplement getkeys
+int setkeys(tablist_t **list, int id, char *pair);
int delkeys(tablist_t *list, char *key);
// file operations
diff --git a/src/main.c b/src/main.c
index ab33a86..8b2688b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -147,23 +147,10 @@ void printkey(tabidx_t idx)
int setkeys_main(tablist_t **list, int id, char **pairs, int plen)
{
- if (pairs == NULL)
+ if (pairs == NULL || id < -1)
return 1;
- if (id > -1) {
- 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)) {
- free(tmp);
- return 1;
- }
- free(tmp);
- }
- } else {
- for (int i = 0; i < plen; ++i)
- if (setkeys(*list, pairs[i]))
- return 1;
- }
+ for (int i = 0; i < plen; ++i)
+ setkeys(list, id, pairs[i]);
return 0;
}
diff --git a/src/test.c b/src/test.c
index 5a4976e..0e5b448 100644
--- a/src/test.c
+++ b/src/test.c
@@ -6,7 +6,7 @@
void test_setkeys(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (setkeys(list, "name:john"))
+ if (setkeys(&list, -1, "name:john"))
fprintf(stderr, "test_setkeys: failed\n");
for (int i = 0; i < list[0].len; ++i) {
printf("id: %d\n", i);
@@ -23,7 +23,7 @@ void test_setkeys(void)
void test_setkeys_fail(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (!setkeys(list, "namejohn"))
+ if (!setkeys(&list, -1, "namejohn"))
fprintf(stderr, "test_setkeys_fail: failed\n");
for (int i = 0; i < list[0].len; ++i) {
int *indexes = getkeys(list, i);
@@ -34,6 +34,20 @@ void test_setkeys_fail(void)
free(list);
}
+void test_setkeys_single(void)
+{
+ tablist_t *list = readdb("dbs/test.db");
+ if (setkeys(&list, 101, "name:alice"))
+ fprintf(stderr, "test_setkeys_single: 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");
@@ -77,6 +91,7 @@ int main(void)
{
test_setkeys();
test_setkeys_fail();
+ test_setkeys_single();
test_delkeys();
test_delkeys_all();