summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/batch.c62
-rw-r--r--src/lib/file.c4
-rw-r--r--src/lib/mdb.h5
-rw-r--r--src/main.c10
-rw-r--r--src/test.c64
5 files changed, 95 insertions, 50 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);
diff --git a/src/main.c b/src/main.c
index 9d37166..aabc18d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -143,9 +143,8 @@ int setkeys_main(tablist_t **list, int id, char **pairs, int plen)
{
if (pairs == NULL || id < -1)
return 1;
- for (int i = 0; i < plen; ++i)
- if(setkeys(list, id, pairs[i]))
- return 2;
+ if (setkeys(list, id, pairs, plen))
+ return 2;
return 0;
}
@@ -153,9 +152,8 @@ int delkeys_main(tablist_t **list, int id, char **keys, int klen)
{
if (keys == NULL || id < -1)
return 1;
- for (int i = 0; i < klen; ++i)
- if(delkeys(*list, id, keys[i]))
- return 2;
+ if (delkeys(*list, id, keys, klen))
+ return 2;
return 0;
}
diff --git a/src/test.c b/src/test.c
index a2a241d..5f2f867 100644
--- a/src/test.c
+++ b/src/test.c
@@ -6,7 +6,8 @@
void test_setkeys(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (setkeys(&list, -1, "name:john"))
+ char *pairs[] = { "name:John" };
+ if (setkeys(&list, -1, pairs, 1))
fprintf(stderr, "test_setkeys: failed\n");
for (int i = 0; i < list[0].len; ++i) {
printf("id: %d\n", i);
@@ -15,32 +16,55 @@ void test_setkeys(void)
printf("%s\n", list[i].tab[indexes[j]].key);
free(indexes);
}
- delkeys(list, -1, NULL);
+ delkeys(list, -1, NULL, 0);
free(list);
}
void test_setkeys_fail(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (!setkeys(&list, -1, "namejohn"))
+ char *pairs[] = { "namejohn" };
+ if (!setkeys(&list, -1, pairs, 1))
fprintf(stderr, "test_setkeys_fail: failed\n");
- delkeys(list, -1, NULL);
+ delkeys(list, -1, NULL, 0);
+ free(list);
+}
+
+void test_setkeys_multi_fail(void)
+{
+ tablist_t *list = readdb("dbs/test.db");
+ char *pairs[] = { "name:John", NULL };
+ if (!setkeys(&list, -1, pairs, 2))
+ fprintf(stderr, "test_setkeys_multi_fail: failed\n");
+ delkeys(list, -1, NULL, 0);
free(list);
}
void test_setkeys_single(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (setkeys(&list, 101, "name:alice"))
+ char *pairs[] = { "name:Alice" };
+ if (setkeys(&list, 101, pairs, 1))
fprintf(stderr, "test_setkeys_single: failed\n");
- delkeys(list, -1, NULL);
+ delkeys(list, -1, NULL, 0);
+ free(list);
+}
+
+void test_setkeys_multipairs(void)
+{
+ tablist_t *list = readdb("dbs/test.db");
+ char *pairs[] = { "name:Bob", "active:true" };
+ if (setkeys(&list, 0, pairs, 2))
+ fprintf(stderr, "test_setkeys_multipairs: failed\n");
+ delkeys(list, -1, NULL, 0);
free(list);
}
void test_delkeys(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (delkeys(list, -1, "Row_1"))
+ char *keys[] = { "Row_1" };
+ if (delkeys(list, -1, keys, 1))
fprintf(stderr, "test_delkeys: failed\n");
for (int i = 0; i < list[0].len; ++i) {
printf("id: %d\n", i);
@@ -49,14 +73,14 @@ void test_delkeys(void)
printf("%s\n", list[i].tab[indexes[j]].key);
free(indexes);
}
- delkeys(list, -1, NULL);
+ delkeys(list, -1, NULL, 0);
free(list);
}
void test_delkeys_all(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (delkeys(list, -1, NULL))
+ if (delkeys(list, -1, NULL, 0))
fprintf(stderr, "test_delkeys_all: failed\n");
free(list);
}
@@ -64,18 +88,29 @@ void test_delkeys_all(void)
void test_delkeys_fail(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (!delkeys(list, -1, "Row_4"))
+ char *keys[] = { "Row_4" };
+ if (!delkeys(list, -1, keys, 1))
fprintf(stderr, "test_delkeys_fail: failed\n");
- delkeys(list, -1, NULL);
+ delkeys(list, -1, NULL, 0);
free(list);
}
void test_delkeys_single(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (delkeys(list, 0, NULL))
+ if (delkeys(list, 0, NULL, 0))
fprintf(stderr, "test_delkeys_single: failed\n");
- delkeys(list, -1, NULL);
+ delkeys(list, -1, NULL, 0);
+ free(list);
+}
+
+void test_delkeys_multi(void)
+{
+ tablist_t *list = readdb("dbs/test.db");
+ char *keys[] = { "Row_1", "Row_2" };
+ if (delkeys(list, -1, keys, 2))
+ fprintf(stderr, "test_delkeys_multi: failed\n");
+ delkeys(list, -1, NULL, 0);
free(list);
}
@@ -84,11 +119,14 @@ int main(void)
test_setkeys();
test_setkeys_fail();
test_setkeys_single();
+ test_setkeys_multipairs();
+ test_setkeys_multi_fail();
test_delkeys();
test_delkeys_all();
test_delkeys_fail();
test_delkeys_single();
+ test_delkeys_multi();
exit(0);
}