summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-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
4 files changed, 37 insertions, 25 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);