diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd.c | 59 | ||||
-rw-r--r-- | src/cmd.h | 15 | ||||
-rw-r--r-- | src/include/engine/file.c | 2 | ||||
-rw-r--r-- | src/include/init.c | 25 | ||||
-rw-r--r-- | src/include/xdbms.h | 9 | ||||
-rw-r--r-- | src/main.c | 98 | ||||
-rw-r--r-- | src/test.c | 266 |
7 files changed, 37 insertions, 437 deletions
diff --git a/src/cmd.c b/src/cmd.c deleted file mode 100644 index d03f8fc..0000000 --- a/src/cmd.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <stdlib.h> -#include <string.h> - -#include "cmd.h" - -char *getselector(char *str); -char **getparams(char *str, int *len); - -struct cmd eval(char *str) { - struct cmd ret; - ret.params = NULL; - ret.selector = NULL; - if (!strncmp(str, "GET", 3)) { - ret.type = GET; - } else if (!strncmp(str, "SET", 3)) { - ret.type = SET; - } else if (!strncmp(str, "DEL", 3)) { - ret.type = DEL; - } else { - ret.type = ERR; - return ret; - } - - ret.selector = getselector(str); - ret.params = getparams(str, &ret.plen); - return ret; -} - -char *getselector(char *str) { - char *selector = calloc(1, sizeof(char)); - int pos = 4, i; - for (i = 0; str[pos] != '/' && pos < strlen(str); ++pos) { - if (i >= 1) { - selector = realloc(selector, (i + 1) * sizeof(char)); - } - selector[i++] = str[pos]; - } - selector = realloc(selector, (i + 1) * sizeof(char)); - selector[i] = '\0'; - return selector; -} - -char **getparams(char *str, int *len) { - char **params = calloc(1, sizeof(char *)); - char *tok = strtok(str, "/"); - int i = 0; - while ((tok = strtok(NULL, "/"))) { - if (i >= 1) - params = realloc(params, (i + 1) * sizeof(char *)); - params[i] = calloc(strlen(tok) + 1, sizeof(char)); - strcpy(params[i++], tok); - } - if (i == 0) { - free(params); - return NULL; - } - *len = i; - return params; -} diff --git a/src/cmd.h b/src/cmd.h deleted file mode 100644 index 03a4005..0000000 --- a/src/cmd.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef CMD_H -#define CMD_H - -enum cmdtype { GET, SET, DEL, ERR }; - -struct cmd { - enum cmdtype type; - char *selector; - int plen; - char **params; -}; - -struct cmd eval(char *str); - -#endif diff --git a/src/include/engine/file.c b/src/include/engine/file.c index 4ff7263..efc845c 100644 --- a/src/include/engine/file.c +++ b/src/include/engine/file.c @@ -6,7 +6,7 @@ #include "engine.h" static const uint32_t ND_MARK = 0xffffffff; -static const uint32_t V_MARK = 0xfeffffff; +static const uint32_t V_MARK = 0xfefffffe; static const char *HEAD = "XDBF"; diff --git a/src/include/init.c b/src/include/init.c new file mode 100644 index 0000000..76f46a1 --- /dev/null +++ b/src/include/init.c @@ -0,0 +1,25 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "xdbms.h" +#include "engine/engine.h" + +static tablist_t *db; + +int xdb_init(char *filename) +{ + if (filename == NULL) + fprintf(stderr, "Warning: running in-memory database\n"); + db = readdb(filename); + + tablist_t *tmp = getkeys(db, -1, NULL, 0); + for (int i = 0; i < tmp[0].len; ++i) { + printf("id: %d\n", i); + for (int j = 0; tmp[0].tab[j].flag; ++j) + printf("%s\n", tmp[0].tab[j].key); + } + free(tmp); + delkeys(db, -1, NULL, 0); + free(db); + return 0; +} diff --git a/src/include/xdbms.h b/src/include/xdbms.h index 3438f5e..a18996d 100644 --- a/src/include/xdbms.h +++ b/src/include/xdbms.h @@ -1,6 +1,13 @@ #ifndef XDBMS_H #define XDBMS_H -#include "engine/engine.h" +// init: intialize an XDBMS DB +int xdb_init(char *filename); + +// exec: execute a statement on an XDBMS DB +char *exec(char *stmt); + +// close: close an XDBMS DB +int close(); #endif @@ -1,103 +1,11 @@ -#include <ctype.h> -#include <stdio.h> #include <stdlib.h> -#include <string.h> -#include "cmd.h" #include "include/xdbms.h" -int getid(char *selector); -int printkeys(tablist_t *list, int id, char **keys, int klen); -void printkey(tabidx_t idx); - int main(int argc, char **argv) { - if (argc > 2) { - printf("usage: %s [db file]\n", argv[0]); - exit(1); - } - char *filename = NULL; - if (argc == 2) - filename = argv[1]; - tablist_t *list = readdb(filename); - if (list == NULL) + if (argc == 1) exit(1); - char *cmd = calloc(1024, sizeof(char)); - - while (fgets(cmd, 1024, stdin) != NULL) { - cmd[strlen(cmd) - 1] = '\0'; - if (!strcmp(cmd, "exit") || !strcmp(cmd, "")) - break; - struct cmd evaled = eval(cmd); - int id = getid(evaled.selector); - switch (evaled.type) { - case GET: - printkeys(list, id, evaled.params, evaled.plen); - break; - case SET: - id = setkeys(&list, id, evaled.params, evaled.plen); - if (!id && filename) - writedb(filename, list); - break; - case DEL: - id = delkeys(list, id, evaled.params, evaled.plen); - if (!id && filename) - writedb(filename, list); - break; - case ERR: - fprintf(stderr, "Unkown command: %s\n", cmd); - break; - } - if (evaled.params != NULL) { - for (int i = 0; i < evaled.plen; ++i) - free(evaled.params[i]); - free(evaled.params); - } - free(evaled.selector); - } - free(cmd); - - delkeys(list, -1, NULL, 0); - free(list); + char *filename = argv[1]; + xdb_init(filename); exit(0); } - -int getid(char *selector) { - if (selector == NULL) - return -2; - int id; - if (!strcmp(selector, "*")) - return -1; - else if (isdigit(selector[0]) && (id = atoi(selector)) >= 0) - return id; - else - return -2; -} - -int printkeys(tablist_t *list, int id, char **keys, int klen) { - tablist_t *indexes = getkeys(list, id, keys, klen); - if (indexes == NULL) - return 1; - for (int i = 0; i < indexes[0].len; ++i) { - printf("{ id: %d ", i); - for (int j = 0; indexes[i].tab[j].flag; ++j) - printkey(indexes[i].tab[j]); - printf("}\n"); - } - free(indexes); - return 0; -} - -void printkey(tabidx_t idx) { - printf("%s: ", idx.key); - switch (idx.flag) { - case 1: - printf("%.2lf ", idx.value.num); - break; - case 2: - printf("%s ", idx.value.boolean ? "true" : "false"); - break; - case 3: - printf("%s ", idx.value.str); - break; - } -} diff --git a/src/test.c b/src/test.c deleted file mode 100644 index aa6c2e9..0000000 --- a/src/test.c +++ /dev/null @@ -1,266 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "include/engine/engine.h" -#include "include/xml/xml.h" - -void test_writedb(void) { - tablist_t *list = readdb("dbs/test.xdb"); - writedb("dbs/test.xdb", list); - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_readdb(void) { - tablist_t *list = readdb("dbs/test.xdb"); - tablist_t *indices = getkeys(list, -1, NULL, 0); - for (int i = 0; i < indices[0].len; ++i) { - printf("id: %d\n", i); - for (int j = 0; indices[i].tab[j].flag; ++j) - printf("%s\n", indices[i].tab[j].key); - } - free(indices); - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_readdb_fail(void) { - tablist_t *list = readdb("dbs/bad.xdb"); - if (list != NULL) - fprintf(stderr, "test_readdb_fail: failed\n"); -} - -void test_setkeys(void) { - tablist_t *list = readdb("dbs/test.xdb"); - char *pairs[] = {"name:John"}; - if (setkeys(&list, -1, pairs, 1)) { - fprintf(stderr, "test_setkeys: failed\n"); - return; - } - for (int i = 0; i < list[0].len; ++i) { - printf("id: %d\n", i); - tablist_t *indexes = getkeys(list, i, NULL, 0); - for (int j = 0; indexes[0].tab[j].flag; ++j) - printf("%s\n", indexes[0].tab[j].key); - free(indexes); - } - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_setkeys_fail(void) { - tablist_t *list = readdb("dbs/test.xdb"); - char *pairs[] = {"namejohn"}; - if (!setkeys(&list, -1, pairs, 1)) { - fprintf(stderr, "test_setkeys_fail: failed\n"); - return; - } - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_setkeys_multi_fail(void) { - tablist_t *list = readdb("dbs/test.xdb"); - char *pairs[] = {"name:John", NULL}; - if (!setkeys(&list, -1, pairs, 2)) { - fprintf(stderr, "test_setkeys_multi_fail: failed\n"); - return; - } - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_setkeys_single(void) { - tablist_t *list = readdb("dbs/test.xdb"); - char *pairs[] = {"name:Alice"}; - if (setkeys(&list, 101, pairs, 1)) { - fprintf(stderr, "test_setkeys_single: failed\n"); - return; - } - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_setkeys_multipairs(void) { - tablist_t *list = readdb("dbs/test.xdb"); - char *pairs[] = {"name:Bob", "active:true"}; - if (setkeys(&list, 0, pairs, 2)) { - fprintf(stderr, "test_setkeys_multipairs: failed\n"); - return; - } - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_delkeys(void) { - tablist_t *list = readdb("dbs/test.xdb"); - char *keys[] = {"Row_1"}; - if (delkeys(list, -1, keys, 1)) { - fprintf(stderr, "test_delkeys: failed\n"); - return; - } - for (int i = 0; i < list[0].len; ++i) { - printf("id: %d\n", i); - tablist_t *indexes = getkeys(list, i, NULL, 0); - for (int j = 0; indexes[0].tab[j].flag; ++j) - printf("%s\n", indexes[0].tab[j].key); - free(indexes); - } - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_delkeys_all(void) { - tablist_t *list = readdb("dbs/test.xdb"); - if (delkeys(list, -1, NULL, 0)) { - fprintf(stderr, "test_delkeys_all: failed\n"); - return; - } - free(list); -} - -void test_delkeys_fail(void) { - tablist_t *list = readdb("dbs/test.xdb"); - char *keys[] = {"Row_4"}; - if (!delkeys(list, -1, keys, 1)) { - fprintf(stderr, "test_delkeys_fail: failed\n"); - return; - } - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_delkeys_single(void) { - tablist_t *list = readdb("dbs/test.xdb"); - if (delkeys(list, 0, NULL, 0)) { - fprintf(stderr, "test_delkeys_single: failed\n"); - return; - } - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_delkeys_multi(void) { - tablist_t *list = readdb("dbs/test.xdb"); - char *keys[] = {"Row_1", "Row_2"}; - if (delkeys(list, -1, keys, 2)) { - fprintf(stderr, "test_delkeys_multi: failed\n"); - return; - } - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_getkeys_multi(void) { - tablist_t *list = readdb("dbs/test.xdb"); - char *keys[] = {"Row_1", "Row_2"}; - tablist_t *ret = getkeys(list, 0, keys, 2); - if (ret == NULL) { - fprintf(stderr, "test_getkeys_multi: failed\n"); - return; - } - for (int i = 0; ret[0].tab[i].flag; ++i) - printf("%s\n", ret[0].tab[i].key); - free(ret); - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_getkeys_multi_fail(void) { - tablist_t *list = readdb("dbs/test.xdb"); - char *keys[] = {"Row_1", "Row_4"}; - tablist_t *ret = getkeys(list, 0, keys, 2); - if (ret) { - fprintf(stderr, "test_getkeys_multi_fail: failed\n"); - return; - } - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_getkeys(void) { - tablist_t *list = readdb("dbs/test.xdb"); - tablist_t *ret = getkeys(list, -1, NULL, 0); - if (!ret) { - fprintf(stderr, "test_getkeys: failed\n"); - return; - } - free(ret); - delkeys(list, -1, NULL, 0); - free(list); -} - -void test_encode(void) { - map_t *map = calloc(1, sizeof(map_t)); - map->attrs = NULL; - map->n_attrs = 0; - map->tag = "documents"; - map->size = sizeof(map_t); - map->n = 2; - map->payload = (map_t[]){{.attrs = (attr_t[]){{.id = "id", .value = "0"}}, - .n_attrs = 1, - .tag = "document", - .payload = (map_t[]){{.attrs = NULL, - .n_attrs = 0, - .tag = "test", - .payload = "test", - .size = sizeof(char), - .n = 4}}, - .size = sizeof(map_t), - .n = 1}, - {.attrs = (attr_t[]){{.id = "id", .value = "1"}}, - .n_attrs = 1, - .tag = "document", - .payload = (map_t[]){{.attrs = NULL, - .n_attrs = 0, - .tag = "test", - .payload = "test", - .size = sizeof(char), - .n = 4}}, - .size = sizeof(map_t), - .n = 1}}; - - char *xml = encode(map); - if (xml == NULL) { - fprintf(stderr, "test_encode: failed\n"); - return; - } - printf("%s\n", xml); - free(map); - free(xml); -} - -void test_decode(void) { - char *xml = "<set id='0' " - "test='true'><key1>value1</key1><key2>value2</key2></set>"; - map_t *map = decode(xml); - printf("%s\n", (xml = encode(map))); - free(xml); - freemap(map); -} - -int main(void) { - // test_writedb(); - // test_readdb(); - // test_readdb_fail(); - // test_getkeys(); - // test_getkeys_multi(); - // test_getkeys_multi_fail(); - // - // 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(); - // test_encode(); - // test_decode(); - - exit(0); -} |