From 6d79f8562894574b95edd97b9a332472c025d0f8 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 14 Oct 2017 08:43:01 +0200 Subject: [PATCH] orderdb backend choices and first tests. --- src/CMakeLists.txt | 1 + src/eressea.c | 7 ++++++- src/orderdb.c | 14 ++++++++++++-- src/orderdb.h | 10 +++++++++- src/orderdb.test.c | 27 +++++++++++++++++++++++++++ src/test_eressea.c | 1 + src/util/log.c | 1 + 7 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 src/orderdb.test.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c8a4c4783..cfce6e1a2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -219,6 +219,7 @@ set(TESTS_SRC monsters.test.c move.test.c names.test.c + orderdb.test.c orderfile.test.c piracy.test.c prefix.test.c diff --git a/src/eressea.c b/src/eressea.c index b4ae7890f..857c309f6 100755 --- a/src/eressea.c +++ b/src/eressea.c @@ -37,6 +37,8 @@ #include #include +#include + void game_done(void) { #ifdef CLEANUP_CODE @@ -63,7 +65,10 @@ void game_done(void) void game_init(void) { - orderdb_open(); + db_backend choices[] = { DB_MEMORY, DB_NONE }; + if (orderdb_open(choices) == DB_NONE) { + log_fatal("no orderdb backend available"); + } kernel_init(); register_triggers(); register_xmas(); diff --git a/src/orderdb.c b/src/orderdb.c index 37faeacc4..37ae35978 100644 --- a/src/orderdb.c +++ b/src/orderdb.c @@ -15,6 +15,8 @@ struct cb_entry { order_data *data; }; +static db_backend odata_backend = DB_NONE; + order_data *odata_load(int id) { void * match; @@ -67,9 +69,17 @@ void free_data(void) { cb_clear(&cb_orders); } -void orderdb_open(void) +db_backend orderdb_open(db_backend choices[]) { - auto_id = 0; + int i; + for (i = 0; choices[i] != DB_NONE; ++i) { + db_backend choice = choices[i]; + if (choice == DB_MEMORY) { + auto_id = 0; + return odata_backend = choice; + } + } + return DB_NONE; } void orderdb_close(void) diff --git a/src/orderdb.h b/src/orderdb.h index be39a642e..eb92850d0 100644 --- a/src/orderdb.h +++ b/src/orderdb.h @@ -5,12 +5,20 @@ extern "C" { #endif + typedef enum { + DB_NONE, + DB_MEMORY, + DB_MMAP, + DB_BDB, + DB_SQLITE + } db_backend; + typedef struct order_data { const char *_str; int _refcount; } order_data; - void orderdb_open(void); + db_backend orderdb_open(db_backend choices[]); void orderdb_close(void); order_data *odata_load(int id); diff --git a/src/orderdb.test.c b/src/orderdb.test.c new file mode 100644 index 000000000..5336c540d --- /dev/null +++ b/src/orderdb.test.c @@ -0,0 +1,27 @@ +#include +#include + +#include "orderdb.h" + +#include +#include + +static void test_orderdb_open_close(CuTest *tc) { + db_backend choices[] = { DB_MEMORY, DB_NONE }; + db_backend nochoice[] = { DB_SQLITE, DB_NONE }; + + CuAssertIntEquals(tc, DB_MEMORY, orderdb_open(choices)); + orderdb_close(); + + CuAssertIntEquals(tc, DB_NONE, orderdb_open(nochoice)); + + orderdb_close(); +} + +CuSuite *get_orderdb_suite(void) +{ + CuSuite *suite = CuSuiteNew(); + SUITE_ADD_TEST(suite, test_orderdb_open_close); + + return suite; +} diff --git a/src/test_eressea.c b/src/test_eressea.c index 38c5cf026..c21a1cf5e 100644 --- a/src/test_eressea.c +++ b/src/test_eressea.c @@ -132,6 +132,7 @@ int RunAllTests(int argc, char *argv[]) ADD_SUITE(monsters); ADD_SUITE(move); ADD_SUITE(names); + ADD_SUITE(orderdb); ADD_SUITE(orderfile); ADD_SUITE(otherfaction); ADD_SUITE(piracy); diff --git a/src/util/log.c b/src/util/log.c index 24ddce757..cacd3d36e 100644 --- a/src/util/log.c +++ b/src/util/log.c @@ -218,6 +218,7 @@ void log_fatal(const char *format, ...) va_start(args, format); log_write(LOG_CPERROR, NULL, format, args); va_end(args); + abort(); } void log_error(const char *format, ...) /*-V524 */