reduce dependeny spaghetti for database code.

This commit is contained in:
Enno Rehling 2018-09-28 20:50:24 +02:00
parent 17f7aa2c0a
commit 7b9e72e559
18 changed files with 98 additions and 126 deletions

View file

@ -144,6 +144,7 @@ set (ERESSEA_SRC
set(CHECK_SRC set(CHECK_SRC
checker.c checker.c
orderfile.c
) )
set(SERVER_SRC set(SERVER_SRC

View file

@ -12,6 +12,7 @@
#include <kernel/save.h> #include <kernel/save.h>
#include <util/language.h> #include <util/language.h>
#include <util/log.h>
#include <stream.h> #include <stream.h>
#include <stdio.h> #include <stdio.h>
@ -34,7 +35,13 @@ int eressea_write_game(const char * filename) {
} }
int eressea_read_orders(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) { int eressea_export_json(const char * filename, int flags) {

View file

@ -2,7 +2,21 @@
#include <platform.h> #include <platform.h>
#endif #endif
#include <stdio.h>
#include "orderfile.h"
int main(int argc, char **argv) { 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; return 0;
} }

View file

@ -1,14 +1,14 @@
#include <platform.h> #include <platform.h>
#include "eressea.h" #include "eressea.h"
#include "kernel/building.h"
#include "kernel/calendar.h" #include "kernel/calendar.h"
#include "kernel/config.h" #include "kernel/config.h"
#include "kernel/curse.h" #include "kernel/curse.h"
#include "kernel/faction.h"
#include "kernel/building.h"
#include "kernel/equipment.h" #include "kernel/equipment.h"
#include "kernel/faction.h"
#include "kernel/item.h" #include "kernel/item.h"
#include "kernel/database.h" #include "kernel/orderdb.h"
#include "util/functions.h" #include "util/functions.h"
#include "util/language.h" #include "util/language.h"
@ -54,12 +54,12 @@ void game_done(void)
free_locales(); free_locales();
#endif #endif
kernel_done(); kernel_done();
dblib_close(); orderdb_close();
} }
void game_init(void) void game_init(void)
{ {
dblib_open(); orderdb_open();
errno = 0; errno = 0;
kernel_init(); kernel_init();
register_triggers(); register_triggers();

View file

@ -6,7 +6,6 @@
#include "kernel/config.h" #include "kernel/config.h"
#include "kernel/calendar.h" #include "kernel/calendar.h"
#include "kernel/database.h"
#include "kernel/faction.h" #include "kernel/faction.h"
#include "kernel/db/driver.h" #include "kernel/db/driver.h"
@ -21,7 +20,7 @@ int gamedb_update(void)
err = db_driver_open(DB_GAME, dbname); err = db_driver_open(DB_GAME, dbname);
if (err == 0) { if (err == 0) {
for (f = factions; f; f = f->next) { 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) { if (uid > 0) {
f->uid = uid; f->uid = uid;
} }

View file

@ -55,7 +55,6 @@ command.c
config.c config.c
connection.c connection.c
curse.c curse.c
database.c
equipment.c equipment.c
faction.c faction.c
group.c group.c

View file

@ -1,46 +0,0 @@
#include <platform.h>
#include "database.h"
#include <platform.h>
#include <kernel/config.h>
#include <kernel/faction.h>
#include <kernel/database.h>
#include <kernel/orderdb.h>
#include <util/log.h>
#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);
}

View file

@ -1,23 +0,0 @@
#ifndef H_DATABASE
#define H_DATABASE
#include <stddef.h>
#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

View file

@ -2,7 +2,7 @@
#include <kernel/config.h> #include <kernel/config.h>
#include <kernel/faction.h> #include <kernel/faction.h>
#include "database.h" #include "db/driver.h"
#include "orderdb.h" #include "orderdb.h"
#include <CuTest.h> #include <CuTest.h>
@ -39,9 +39,9 @@ static void test_update_faction(CuTest *tc) {
test_setup(); test_setup();
f = test_create_faction(NULL); 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; 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); CuAssertIntEquals(tc, f->uid, uid);
test_teardown(); test_teardown();
} }

View file

@ -4,36 +4,35 @@
#include <platform.h> #include <platform.h>
#include "driver.h" #include "driver.h"
#include <kernel/config.h>
#include <kernel/orderdb.h>
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
static DB *g_dbp; static DB *g_dbp;
void db_driver_open(void) void db_driver_open(database_t db, const char *dbname)
{ {
if (db == DB_SWAP) {
int ret; int ret;
u_int32_t flags = DB_CREATE; u_int32_t flags = DB_CREATE;
const char * dbname;
dbname = config_get("game.dbname");
ret = db_create(&g_dbp, NULL, 0); ret = db_create(&g_dbp, NULL, 0);
assert(ret==0); assert(ret == 0);
ret = g_dbp->open(g_dbp, NULL, dbname, NULL, DB_RECNO, flags, 0); ret = g_dbp->open(g_dbp, NULL, dbname, NULL, DB_RECNO, flags, 0);
assert(ret==0); assert(ret == 0);
}
} }
void db_driver_close(void) void db_driver_close(database_t db)
{ {
if (db == DB_SWAP) {
int ret; int ret;
ret = g_dbp->close(g_dbp, 0); ret = g_dbp->close(g_dbp, 0);
assert(ret==0); assert(ret == 0);
}
} }
int db_driver_order_save(struct order_data *od) int db_driver_order_save(const char *str)
{ {
int ret; int ret;
DBT key, data; DBT key, data;
@ -46,18 +45,13 @@ int db_driver_order_save(struct order_data *od)
key.size = key.ulen = sizeof(recno); key.size = key.ulen = sizeof(recno);
key.flags = DB_DBT_USERMEM; key.flags = DB_DBT_USERMEM;
data.data = (void *)od->_str; 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; data.flags = DB_DBT_USERMEM;
ret = g_dbp->put(g_dbp, NULL, &key, &data, DB_APPEND); ret = g_dbp->put(g_dbp, NULL, &key, &data, DB_APPEND);
assert(ret == 0); assert(ret == 0);
return (int)recno; 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) struct order_data *db_driver_order_load(int id)
{ {
int ret; int ret;
@ -79,3 +73,8 @@ struct order_data *db_driver_order_load(int id)
return od; return od;
} }
int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password)
{
return -1;
}

View file

@ -1,7 +1,11 @@
#pragma once #pragma once
#include <stddef.h>
struct order_data; struct order_data;
extern void odata_create(struct order_data **pdata, size_t len, const char *str);
typedef enum database_t { typedef enum database_t {
DB_SWAP, DB_SWAP,
DB_GAME, DB_GAME,
@ -9,6 +13,6 @@ typedef enum database_t {
int db_driver_open(database_t db, const char *dbname); int db_driver_open(database_t db, const char *dbname);
void db_driver_close(database_t db); 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); 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); int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password);

View file

@ -1,8 +1,6 @@
#include <platform.h> #include <platform.h>
#include <kernel/config.h> #include <kernel/config.h>
#include <kernel/database.h>
#include <kernel/orderdb.h>
#include <util/log.h> #include <util/log.h>
@ -25,9 +23,9 @@ static sqlite3_stmt * g_stmt_insert_faction;
static int g_order_batchsize; static int g_order_batchsize;
static int g_order_tx_size; 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; int err;
ERRNO_CHECK(); ERRNO_CHECK();
@ -58,12 +56,12 @@ order_data *db_driver_order_load(int id)
return NULL; return NULL;
} }
int db_driver_order_save(order_data *od) int db_driver_order_save(const char *str)
{ {
int err; int err;
sqlite3_int64 id; sqlite3_int64 id;
assert(od && od->_str); assert(str);
ERRNO_CHECK(); ERRNO_CHECK();
@ -76,7 +74,7 @@ int db_driver_order_save(order_data *od)
err = sqlite3_reset(g_stmt_insert_order); err = sqlite3_reset(g_stmt_insert_order);
assert(err == SQLITE_OK); 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); assert(err == SQLITE_OK);
err = sqlite3_step(g_stmt_insert_order); err = sqlite3_step(g_stmt_insert_order);
assert(err == SQLITE_DONE); assert(err == SQLITE_DONE);

View file

@ -1,5 +1,8 @@
#include <platform.h> #include <platform.h>
#include "database.h"
#include "config.h"
#include "db/driver.h"
#include "orderdb.h" #include "orderdb.h"
#include <util/log.h> #include <util/log.h>
@ -10,6 +13,19 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
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) void odata_create(order_data **pdata, size_t len, const char *str)
{ {
order_data *data; order_data *data;
@ -42,10 +58,16 @@ void odata_addref(order_data *od)
order_data *odata_load(int id) 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) int odata_save(order_data *od)
{ {
return dblib_save_order(od); if (od->_str) {
return db_driver_order_save(od->_str);
}
return 0;
} }

View file

@ -19,6 +19,9 @@ extern "C" {
order_data *odata_load(int id); order_data *odata_load(int id);
int odata_save(order_data *od); int odata_save(order_data *od);
void orderdb_open(void);
void orderdb_close(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -226,20 +226,13 @@ static const char * file_getbuf(void *data)
return getbuf(F, ENCODING_UTF8); return getbuf(F, ENCODING_UTF8);
} }
int readorders(const char *filename) int readorders(FILE *F)
{ {
input in; input in;
int result; 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.getbuf = file_getbuf;
in.data = F; in.data = F;
result = read_orders(&in); result = read_orders(&in);
fclose(F);
return result; return result;
} }

View file

@ -1,7 +1,7 @@
#ifndef H_ORDERFILE #ifndef H_ORDERFILE
#define H_ORDERFILE #define H_ORDERFILE
#include <skill.h> #include <stdio.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -13,7 +13,7 @@ extern "C" {
} input; } input;
int read_orders(struct input *in); int read_orders(struct input *in);
int readorders(const char *filename); int readorders(FILE *F);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -1,7 +1,6 @@
#include <platform.h> #include <platform.h>
#include <eressea.h> #include <eressea.h>
#include <kernel/config.h> #include <kernel/config.h>
#include <kernel/database.h>
#include <CuTest.h> #include <CuTest.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>

3
tests/orders.txt Normal file
View file

@ -0,0 +1,3 @@
ERESSEA uhfr "Hodor"
EINHEIT 8bz3
BENENNEN EINHEIT 'Goldene Herde'