summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/batch.c32
-rw-r--r--src/lib/file.c7
-rw-r--r--src/lib/mdb.h4
-rw-r--r--src/test.c47
4 files changed, 41 insertions, 49 deletions
diff --git a/src/lib/batch.c b/src/lib/batch.c
index b1579d3..30102c7 100644
--- a/src/lib/batch.c
+++ b/src/lib/batch.c
@@ -12,6 +12,7 @@ static tablist_t *copytab(tablist_t *dst, tablist_t *src);
static void dellist(tablist_t *list);
extern int setkey(tablist_t **, int, char *);
+extern int delkey(tablist_t *, int, char *);
tablist_t *setkey_copy;
char *setkey_str;
@@ -58,31 +59,36 @@ tablist_t *delkey_copy;
char *delkey_str;
mtx_t delkey_mtx;
-int delkeys(tablist_t *list, char *key)
+int delkeys(tablist_t *list, int id, char *key)
{
int rc = 0;
delkey_copy = calloc(list[0].len, sizeof(tablist_t));
copytab(delkey_copy, list);
delkey_str = key;
- thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t));
- if (mtx_init(&delkey_mtx, mtx_plain) != thrd_success)
+ 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)
+ thrd_create(&thrds[i], delkey_helper, clone(i));
+ for (int i = 0; i < delkey_copy[0].len; ++i) {
+ if (rc)
+ thrd_join(thrds[i], NULL);
+ else
+ thrd_join(thrds[i], &rc);
+ }
+ free(thrds);
+ } else
+ rc = delkey_helper(clone(id));
- 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) {
- if (rc)
- thrd_join(thrds[i], NULL);
- else
- thrd_join(thrds[i], &rc);
- }
if (!rc) {
dellist(list);
memmove(list, delkey_copy, delkey_copy[0].len * sizeof(tablist_t));
} else
dellist(delkey_copy);
- free(thrds);
free(delkey_copy);
return rc;
}
@@ -102,7 +108,7 @@ static int setkey_helper(void *thr_data)
static int delkey_helper(void *thr_data)
{
- int rc;
+ int rc = 0;
int *id = (int *) thr_data;
mtx_lock(&delkey_mtx);
diff --git a/src/lib/file.c b/src/lib/file.c
index e711511..a5119ea 100644
--- a/src/lib/file.c
+++ b/src/lib/file.c
@@ -46,12 +46,7 @@ tablist_t *readdb(char *filename)
fail:
fclose(fp);
- 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);
- }
+ delkeys(list, -1, NULL);
free(list);
return NULL;
}
diff --git a/src/lib/mdb.h b/src/lib/mdb.h
index 1a47a52..b5dc768 100644
--- a/src/lib/mdb.h
+++ b/src/lib/mdb.h
@@ -20,13 +20,11 @@ typedef struct {
// Table operations
tabidx_t getkey(tablist_t *list, int id, char *key);
-// TODO: Make these private
-int delkey(tablist_t *list, int id, char *key);
// 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);
+int delkeys(tablist_t *list, int id, char *key);
// file operations
tablist_t *readdb(char *filename);
diff --git a/src/test.c b/src/test.c
index 0e5b448..a2a241d 100644
--- a/src/test.c
+++ b/src/test.c
@@ -11,12 +11,11 @@ void test_setkeys(void)
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) {
+ 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);
}
+ delkeys(list, -1, NULL);
free(list);
}
@@ -25,12 +24,7 @@ void test_setkeys_fail(void)
tablist_t *list = readdb("dbs/test.db");
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);
- for (int j = 0; indexes[j]; ++j)
- delkey(list, i, list[i].tab[indexes[j]].key);
- free(indexes);
- }
+ delkeys(list, -1, NULL);
free(list);
}
@@ -39,36 +33,30 @@ 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);
- }
+ delkeys(list, -1, NULL);
free(list);
}
void test_delkeys(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (delkeys(list, "Row_1"))
+ if (delkeys(list, -1, "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) {
+ 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);
}
+ delkeys(list, -1, NULL);
free(list);
}
void test_delkeys_all(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (delkeys(list, NULL))
+ if (delkeys(list, -1, NULL))
fprintf(stderr, "test_delkeys_all: failed\n");
free(list);
}
@@ -76,14 +64,18 @@ void test_delkeys_all(void)
void test_delkeys_fail(void)
{
tablist_t *list = readdb("dbs/test.db");
- if (!delkeys(list, "Row_4"))
+ if (!delkeys(list, -1, "Row_4"))
fprintf(stderr, "test_delkeys_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);
- }
+ delkeys(list, -1, NULL);
+ free(list);
+}
+
+void test_delkeys_single(void)
+{
+ tablist_t *list = readdb("dbs/test.db");
+ if (delkeys(list, 0, NULL))
+ fprintf(stderr, "test_delkeys_single: failed\n");
+ delkeys(list, -1, NULL);
free(list);
}
@@ -96,6 +88,7 @@ int main(void)
test_delkeys();
test_delkeys_all();
test_delkeys_fail();
+ test_delkeys_single();
exit(0);
}