summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-05-23 14:23:10 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-05-23 14:23:10 -0400
commit0cb3dab6b0fc4b5ebe00c0afaaceb68dcf98c6dc (patch)
tree468adce03e77dc837d022d99d0b07260626123c0 /src
parent175c04f2972c2a65e29ba2456ba5d058c35dcf87 (diff)
Migrating from personal testing framework to Unity
Diffstat (limited to 'src')
-rw-r--r--src/cmd.c59
-rw-r--r--src/cmd.h15
-rw-r--r--src/include/engine/file.c2
-rw-r--r--src/include/init.c25
-rw-r--r--src/include/xdbms.h9
-rw-r--r--src/main.c98
-rw-r--r--src/test.c266
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
diff --git a/src/main.c b/src/main.c
index 418addd..7d06d65 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);
-}