From 7b9e72e559f43a62c6fe38f22e90cd30354fc928 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 28 Sep 2018 20:50:24 +0200 Subject: [PATCH] reduce dependeny spaghetti for database code. --- src/CMakeLists.txt | 1 + src/bind_eressea.c | 9 +++++++- src/checker.c | 14 ++++++++++++ src/eressea.c | 10 ++++----- src/gamedb.c | 3 +-- src/kernel/CMakeLists.txt | 1 - src/kernel/database.c | 46 -------------------------------------- src/kernel/database.h | 23 ------------------- src/kernel/database.test.c | 6 ++--- src/kernel/db/berkeley.c | 45 ++++++++++++++++++------------------- src/kernel/db/driver.h | 6 ++++- src/kernel/db/sqlite.c | 12 +++++----- src/kernel/orderdb.c | 28 ++++++++++++++++++++--- src/kernel/orderdb.h | 3 +++ src/orderfile.c | 9 +------- src/orderfile.h | 4 ++-- src/test_eressea.c | 1 - tests/orders.txt | 3 +++ 18 files changed, 98 insertions(+), 126 deletions(-) delete mode 100644 src/kernel/database.c delete mode 100644 src/kernel/database.h create mode 100644 tests/orders.txt diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e84a1bb18..fb21a9d50 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -144,6 +144,7 @@ set (ERESSEA_SRC set(CHECK_SRC checker.c + orderfile.c ) set(SERVER_SRC diff --git a/src/bind_eressea.c b/src/bind_eressea.c index 9f73c4a29..34640137b 100755 --- a/src/bind_eressea.c +++ b/src/bind_eressea.c @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -34,7 +35,13 @@ int eressea_write_game(const char * filename) { } int eressea_read_orders(const char * filename) { - return readorders(filename); + FILE * F = fopen(filename, "r"); + if (!F) { + perror(filename); + return -1; + } + log_info("reading orders from %s", filename); + return readorders(F); } int eressea_export_json(const char * filename, int flags) { diff --git a/src/checker.c b/src/checker.c index eec1db26f..1a07897a0 100644 --- a/src/checker.c +++ b/src/checker.c @@ -2,7 +2,21 @@ #include #endif +#include +#include "orderfile.h" + int main(int argc, char **argv) { + FILE * F = stdin; + if (argc >= 1) { + const char *filename = argv[1]; + F = fopen(filename, "r"); + if (!F) { + perror(filename); + return -1; + } + readorders(F); + fclose(F); + } return 0; } diff --git a/src/eressea.c b/src/eressea.c index 0bf1454ee..382e23fa3 100644 --- a/src/eressea.c +++ b/src/eressea.c @@ -1,14 +1,14 @@ #include #include "eressea.h" +#include "kernel/building.h" #include "kernel/calendar.h" #include "kernel/config.h" #include "kernel/curse.h" -#include "kernel/faction.h" -#include "kernel/building.h" #include "kernel/equipment.h" +#include "kernel/faction.h" #include "kernel/item.h" -#include "kernel/database.h" +#include "kernel/orderdb.h" #include "util/functions.h" #include "util/language.h" @@ -54,12 +54,12 @@ void game_done(void) free_locales(); #endif kernel_done(); - dblib_close(); + orderdb_close(); } void game_init(void) { - dblib_open(); + orderdb_open(); errno = 0; kernel_init(); register_triggers(); diff --git a/src/gamedb.c b/src/gamedb.c index e570d61e8..2ca2dba73 100644 --- a/src/gamedb.c +++ b/src/gamedb.c @@ -6,7 +6,6 @@ #include "kernel/config.h" #include "kernel/calendar.h" -#include "kernel/database.h" #include "kernel/faction.h" #include "kernel/db/driver.h" @@ -21,7 +20,7 @@ int gamedb_update(void) err = db_driver_open(DB_GAME, dbname); if (err == 0) { for (f = factions; f; f = f->next) { - int uid = dblib_save_faction(f, turn); + int uid = db_driver_faction_save(f->uid, f->no, turn, f->email, f->_password); if (uid > 0) { f->uid = uid; } diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index db448bf11..53161efe7 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -55,7 +55,6 @@ command.c config.c connection.c curse.c -database.c equipment.c faction.c group.c diff --git a/src/kernel/database.c b/src/kernel/database.c deleted file mode 100644 index 137665e31..000000000 --- a/src/kernel/database.c +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include "database.h" - -#include - -#include -#include -#include -#include - -#include - -#include "db/driver.h" - -order_data *dblib_load_order(int id) -{ - if (id > 0) { - return db_driver_order_load(id); - } - return NULL; -} - -int dblib_save_order(order_data *od) -{ - if (od->_str) { - return db_driver_order_save(od); - } - return 0; -} - -int dblib_save_faction(const faction *f, int turn) { - return db_driver_faction_save(f->uid, f->no, turn, f->email, f->_password); -} - -void dblib_open(void) -{ - const char *dbname; - - dbname = config_get("game.dbswap"); - db_driver_open(DB_SWAP, dbname); -} - -void dblib_close(void) -{ - db_driver_close(DB_SWAP); -} diff --git a/src/kernel/database.h b/src/kernel/database.h deleted file mode 100644 index e3bdf11d1..000000000 --- a/src/kernel/database.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef H_DATABASE -#define H_DATABASE - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - struct order_data; - struct faction; - - void dblib_open(void); - void dblib_close(void); - - struct order_data *dblib_load_order(int id); - int dblib_save_order(struct order_data *od); - int dblib_save_faction(const struct faction *f, int turn); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/kernel/database.test.c b/src/kernel/database.test.c index cde4edc11..df777a580 100644 --- a/src/kernel/database.test.c +++ b/src/kernel/database.test.c @@ -2,7 +2,7 @@ #include #include -#include "database.h" +#include "db/driver.h" #include "orderdb.h" #include @@ -39,9 +39,9 @@ static void test_update_faction(CuTest *tc) { test_setup(); f = test_create_faction(NULL); - uid = dblib_save_faction(f, 0); + uid = db_driver_faction_save(f->uid, f->no, 0, f->email, f->_password); f->uid = uid; - uid = dblib_save_faction(f, 0); + uid = db_driver_faction_save(f->uid, f->no, 0, f->email, f->_password); CuAssertIntEquals(tc, f->uid, uid); test_teardown(); } diff --git a/src/kernel/db/berkeley.c b/src/kernel/db/berkeley.c index 778e0bfe7..9a10e4bf8 100644 --- a/src/kernel/db/berkeley.c +++ b/src/kernel/db/berkeley.c @@ -4,36 +4,35 @@ #include #include "driver.h" -#include -#include - #include #include static DB *g_dbp; -void db_driver_open(void) +void db_driver_open(database_t db, const char *dbname) { - int ret; - u_int32_t flags = DB_CREATE; - const char * dbname; + if (db == DB_SWAP) { + int ret; + u_int32_t flags = DB_CREATE; - dbname = config_get("game.dbname"); - ret = db_create(&g_dbp, NULL, 0); - assert(ret==0); + ret = db_create(&g_dbp, NULL, 0); + assert(ret == 0); - ret = g_dbp->open(g_dbp, NULL, dbname, NULL, DB_RECNO, flags, 0); - assert(ret==0); + ret = g_dbp->open(g_dbp, NULL, dbname, NULL, DB_RECNO, flags, 0); + assert(ret == 0); + } } -void db_driver_close(void) +void db_driver_close(database_t db) { - int ret; - ret = g_dbp->close(g_dbp, 0); - assert(ret==0); + if (db == DB_SWAP) { + int ret; + ret = g_dbp->close(g_dbp, 0); + assert(ret == 0); + } } -int db_driver_order_save(struct order_data *od) +int db_driver_order_save(const char *str) { int ret; DBT key, data; @@ -46,18 +45,13 @@ int db_driver_order_save(struct order_data *od) key.size = key.ulen = sizeof(recno); key.flags = DB_DBT_USERMEM; data.data = (void *)od->_str; - data.size = data.ulen = strlen(od->_str) + 1; + data.size = data.ulen = strlen(str) + 1; data.flags = DB_DBT_USERMEM; ret = g_dbp->put(g_dbp, NULL, &key, &data, DB_APPEND); assert(ret == 0); return (int)recno; } -int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password) -{ - return -1; -} - struct order_data *db_driver_order_load(int id) { int ret; @@ -79,3 +73,8 @@ struct order_data *db_driver_order_load(int id) return od; } +int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password) +{ + return -1; +} + diff --git a/src/kernel/db/driver.h b/src/kernel/db/driver.h index 26b0461e3..9632cb5db 100644 --- a/src/kernel/db/driver.h +++ b/src/kernel/db/driver.h @@ -1,7 +1,11 @@ #pragma once +#include + struct order_data; +extern void odata_create(struct order_data **pdata, size_t len, const char *str); + typedef enum database_t { DB_SWAP, DB_GAME, @@ -9,6 +13,6 @@ typedef enum database_t { int db_driver_open(database_t db, const char *dbname); void db_driver_close(database_t db); -int db_driver_order_save(struct order_data *od); +int db_driver_order_save(const char *str); struct order_data *db_driver_order_load(int id); int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password); diff --git a/src/kernel/db/sqlite.c b/src/kernel/db/sqlite.c index 70cacaf48..ffdcc8e67 100644 --- a/src/kernel/db/sqlite.c +++ b/src/kernel/db/sqlite.c @@ -1,8 +1,6 @@ #include #include -#include -#include #include @@ -25,9 +23,9 @@ static sqlite3_stmt * g_stmt_insert_faction; static int g_order_batchsize; static int g_order_tx_size; -order_data *db_driver_order_load(int id) +struct order_data *db_driver_order_load(int id) { - order_data * od = NULL; + struct order_data * od = NULL; int err; ERRNO_CHECK(); @@ -58,12 +56,12 @@ order_data *db_driver_order_load(int id) return NULL; } -int db_driver_order_save(order_data *od) +int db_driver_order_save(const char *str) { int err; sqlite3_int64 id; - assert(od && od->_str); + assert(str); ERRNO_CHECK(); @@ -76,7 +74,7 @@ int db_driver_order_save(order_data *od) err = sqlite3_reset(g_stmt_insert_order); assert(err == SQLITE_OK); - err = sqlite3_bind_text(g_stmt_insert_order, 1, od->_str, -1, SQLITE_STATIC); + err = sqlite3_bind_text(g_stmt_insert_order, 1, str, -1, SQLITE_STATIC); assert(err == SQLITE_OK); err = sqlite3_step(g_stmt_insert_order); assert(err == SQLITE_DONE); diff --git a/src/kernel/orderdb.c b/src/kernel/orderdb.c index b30131be4..c4c4746f0 100644 --- a/src/kernel/orderdb.c +++ b/src/kernel/orderdb.c @@ -1,5 +1,8 @@ #include -#include "database.h" + +#include "config.h" +#include "db/driver.h" + #include "orderdb.h" #include @@ -10,6 +13,19 @@ #include #include +void orderdb_open(void) +{ + const char *dbname; + + dbname = config_get("game.dbswap"); + db_driver_open(DB_SWAP, dbname); +} + +void orderdb_close(void) +{ + db_driver_close(DB_SWAP); +} + void odata_create(order_data **pdata, size_t len, const char *str) { order_data *data; @@ -42,10 +58,16 @@ void odata_addref(order_data *od) order_data *odata_load(int id) { - return dblib_load_order(id); + if (id > 0) { + return db_driver_order_load(id); + } + return NULL; } int odata_save(order_data *od) { - return dblib_save_order(od); + if (od->_str) { + return db_driver_order_save(od->_str); + } + return 0; } diff --git a/src/kernel/orderdb.h b/src/kernel/orderdb.h index 800732c5e..33f8b6fce 100644 --- a/src/kernel/orderdb.h +++ b/src/kernel/orderdb.h @@ -19,6 +19,9 @@ extern "C" { order_data *odata_load(int id); int odata_save(order_data *od); + void orderdb_open(void); + void orderdb_close(void); + #ifdef __cplusplus } #endif diff --git a/src/orderfile.c b/src/orderfile.c index 9771b7e14..a2c7a6c87 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -226,20 +226,13 @@ static const char * file_getbuf(void *data) return getbuf(F, ENCODING_UTF8); } -int readorders(const char *filename) +int readorders(FILE *F) { input in; int result; - FILE *F = fopen(filename, "r"); - if (!F) { - perror(filename); - return -1; - } - log_info("reading orders from %s", filename); in.getbuf = file_getbuf; in.data = F; result = read_orders(&in); - fclose(F); return result; } diff --git a/src/orderfile.h b/src/orderfile.h index 43b86042e..fa051993e 100644 --- a/src/orderfile.h +++ b/src/orderfile.h @@ -1,7 +1,7 @@ #ifndef H_ORDERFILE #define H_ORDERFILE -#include +#include #ifdef __cplusplus extern "C" { @@ -13,7 +13,7 @@ extern "C" { } input; int read_orders(struct input *in); - int readorders(const char *filename); + int readorders(FILE *F); #ifdef __cplusplus } diff --git a/src/test_eressea.c b/src/test_eressea.c index d91c225ae..439fee1d6 100644 --- a/src/test_eressea.c +++ b/src/test_eressea.c @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include diff --git a/tests/orders.txt b/tests/orders.txt new file mode 100644 index 000000000..a4a4f7456 --- /dev/null +++ b/tests/orders.txt @@ -0,0 +1,3 @@ +ERESSEA uhfr "Hodor" +EINHEIT 8bz3 +BENENNEN EINHEIT 'Goldene Herde'