summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/batch.c14
-rw-r--r--src/lib/file.c14
-rw-r--r--src/lib/keytab.c30
-rw-r--r--src/lib/mdb.h4
-rw-r--r--src/main.c14
-rw-r--r--src/test.c27
6 files changed, 65 insertions, 38 deletions
diff --git a/src/lib/batch.c b/src/lib/batch.c
index a56ff2d..eb53631 100644
--- a/src/lib/batch.c
+++ b/src/lib/batch.c
@@ -116,16 +116,16 @@ static int delkey_helper(void *thr_data)
int *id = (int *) thr_data;
mtx_lock(&delkey_mtx);
- if (keys_len > 0)
+ if (keys_len > 0 && delkeys_keys != NULL)
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)
- rc = delkey(delkey_copy, *id, delkey_copy[*id].tab[indexes[i]].key);
+ tabidx_t *indexes = getkeys(delkey_copy, *id, NULL, 0);
+ for (int i = 0; indexes[i].flag; ++i)
+ rc = delkey(delkey_copy, *id, indexes[i].key);
free(indexes);
}
mtx_unlock(&delkey_mtx);
@@ -172,9 +172,9 @@ static tablist_t *copytab(tablist_t *dst, tablist_t *src)
static void dellist(tablist_t *list)
{
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);
+ tabidx_t *indexes = getkeys(list, i, NULL, 0);
+ for (int j = 0; indexes[j].flag; ++j)
+ delkey(list, i, indexes[j].key);
free(indexes);
}
}
diff --git a/src/lib/file.c b/src/lib/file.c
index f8a4db6..0204e4e 100644
--- a/src/lib/file.c
+++ b/src/lib/file.c
@@ -59,19 +59,19 @@ void writedb(char *filename, tablist_t *list)
return;
for (int i = 0; i < list[0].len; ++i) {
fputc(0xFB, fp);
- int *indexes = getkeys(list, i);
- for (int j = 0; indexes[j]; ++j) {
- fprintf(fp, "\xfa%s:", list[i].tab[indexes[j]].key);
- switch (list[i].tab[indexes[j]].flag) {
+ tabidx_t *indexes = getkeys(list, i, NULL, 0);
+ for (int j = 0; indexes[j].flag; ++j) {
+ fprintf(fp, "\xfa%s:", indexes[j].key);
+ switch (indexes[j].flag) {
case 1:
- fprintf(fp, "%.2lf\xfc", list[i].tab[indexes[j]].value.num);
+ fprintf(fp, "%.2lf\xfc", indexes[j].value.num);
break;
case 2:
- fprintf(fp, "%s\xfc", list[i].tab[indexes[j]].value.boolean ?
+ fprintf(fp, "%s\xfc", indexes[j].value.boolean ?
"true" : "false");
break;
case 3:
- fprintf(fp, "%s\xfc", list[i].tab[indexes[j]].value.str);
+ fprintf(fp, "%s\xfc", indexes[j].value.str);
break;
}
}
diff --git a/src/lib/keytab.c b/src/lib/keytab.c
index c8b1f75..425b0e1 100644
--- a/src/lib/keytab.c
+++ b/src/lib/keytab.c
@@ -8,19 +8,31 @@ static int hash(char *key);
static char **getkv(char *pair);
// getkeys - gets every single key in a key table
-int *getkeys(tablist_t *list, int id)
+tabidx_t *getkeys(tablist_t *list, int id, char **keys, int klen)
{
- int len = 2;
+ int len = 1;
if (id >= list[0].len)
return NULL;
- int *indexes = calloc(len, sizeof(int));
- for (int i = 0, j = 0; i < TABLEN; ++i) {
- if (j >= len) {
- indexes = realloc(indexes, ++len * sizeof(int));
- indexes[len - 1] = 0;
+ tabidx_t *indexes = calloc(len, sizeof(tabidx_t));
+ if (klen == 0) {
+ for (int i = 0, j = 0; i < TABLEN; ++i) {
+ if (j >= len) {
+ indexes = realloc(indexes, ++len * sizeof(tabidx_t));
+ indexes[len - 1] = (tabidx_t) { NULL, 0, { 0 } };
+ }
+ if (list[id].tab[i].flag)
+ indexes[j++] = list[id].tab[i];
+ }
+ } else {
+ for (int i = 0, j = 0; i < klen; ++i) {
+ tabidx_t idx = getkey(list, id, keys[i]);
+ if (idx.flag == 0)
+ return NULL;
+ if (j >= len) {
+ indexes = realloc(indexes, ++len * sizeof(tabidx_t));
+ }
+ indexes[j++] = idx;
}
- if (list[id].tab[i].key)
- indexes[j++] = i;
}
return indexes;
}
diff --git a/src/lib/mdb.h b/src/lib/mdb.h
index a53f4b5..9038aef 100644
--- a/src/lib/mdb.h
+++ b/src/lib/mdb.h
@@ -19,11 +19,11 @@ typedef struct {
} tablist_t;
// Table operations
+// TODO: Make this private
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
+tabidx_t *getkeys(tablist_t *list, int id, char **keys, int len); // TODO: Reimplement getkeys
int setkeys(tablist_t **list, int id, char **pairs, int len);
int delkeys(tablist_t *list, int id, char **keys, int len);
diff --git a/src/main.c b/src/main.c
index aabc18d..df49b49 100644
--- a/src/main.c
+++ b/src/main.c
@@ -59,7 +59,7 @@ int main(int argc, char **argv)
}
free(cmd);
- delkeys(list, -1, NULL);
+ delkeys(list, -1, NULL, 0);
free(list);
exit(0);
}
@@ -81,10 +81,10 @@ int printkeys(tablist_t **list, int id, char **keys, int klen)
{
if (id > -1) {
if (keys == NULL) {
- int *indexes = getkeys(*list, id);
+ tabidx_t *indexes = getkeys(*list, id, NULL, 0);
printf("{ id: %d ", id);
- for (int i = 0; indexes[i]; ++i)
- printkey((*list)[id].tab[indexes[i]]);
+ for (int i = 0; indexes[i].flag; ++i)
+ printkey(indexes[i]);
free(indexes);
printf("}\n");
} else {
@@ -100,10 +100,10 @@ int printkeys(tablist_t **list, int id, char **keys, int klen)
} else {
if (keys == NULL) {
for (int i = 0; i < (*list)[0].len; ++i) {
- int *indexes = getkeys(*list, i);
+ tabidx_t *indexes = getkeys(*list, i, NULL, 0);
printf("{ id: %d ", i);
- for (int j = 0; indexes[j]; ++j)
- printkey((*list)[i].tab[indexes[j]]);
+ for (int j = 0; indexes[j].flag; ++j)
+ printkey(indexes[j]);
free(indexes);
printf("}\n");
}
diff --git a/src/test.c b/src/test.c
index 5f2f867..76debdc 100644
--- a/src/test.c
+++ b/src/test.c
@@ -11,9 +11,9 @@ void test_setkeys(void)
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);
+ tabidx_t *indexes = getkeys(list, i, NULL, 0);
+ for (int j = 0; indexes[j].flag; ++j)
+ printf("%s\n", indexes[j].key);
free(indexes);
}
delkeys(list, -1, NULL, 0);
@@ -68,9 +68,9 @@ void test_delkeys(void)
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);
+ tabidx_t *indexes = getkeys(list, i, NULL, 0);
+ for (int j = 0; indexes[j].flag; ++j)
+ printf("%s\n", indexes[j].key);
free(indexes);
}
delkeys(list, -1, NULL, 0);
@@ -114,6 +114,20 @@ void test_delkeys_multi(void)
free(list);
}
+void test_getkeys_multi(void)
+{
+ tablist_t *list = readdb("dbs/test.db");
+ char *keys[] = { "Row_1", "Row_2" };
+ tabidx_t *ret = getkeys(list, 0, keys, 2);
+ if (ret == NULL)
+ fprintf(stderr, "test_getkeys_multi: failed\n");
+ for (int i = 0; ret[i].flag; ++i)
+ printf("%s\n", ret[i].key);
+ free(ret);
+ delkeys(list, -1, NULL, 0);
+ free(list);
+}
+
int main(void)
{
test_setkeys();
@@ -128,5 +142,6 @@ int main(void)
test_delkeys_single();
test_delkeys_multi();
+ test_getkeys_multi();
exit(0);
}