forked from github/server
separate database logic from order_data.
laying groundwork for different database backends.
This commit is contained in:
parent
34808a25c5
commit
fee9b6d0a8
|
@ -116,7 +116,6 @@ set (ERESSEA_SRC
|
||||||
magic.c
|
magic.c
|
||||||
market.c
|
market.c
|
||||||
morale.c
|
morale.c
|
||||||
orderdb.c
|
|
||||||
orderfile.c
|
orderfile.c
|
||||||
randenc.c
|
randenc.c
|
||||||
renumber.c
|
renumber.c
|
||||||
|
@ -219,7 +218,6 @@ set(TESTS_SRC
|
||||||
monsters.test.c
|
monsters.test.c
|
||||||
move.test.c
|
move.test.c
|
||||||
names.test.c
|
names.test.c
|
||||||
orderdb.test.c
|
|
||||||
orderfile.test.c
|
orderfile.test.c
|
||||||
piracy.test.c
|
piracy.test.c
|
||||||
prefix.test.c
|
prefix.test.c
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
#include "creport.h"
|
#include "creport.h"
|
||||||
#include "report.h"
|
#include "report.h"
|
||||||
#include "names.h"
|
#include "names.h"
|
||||||
#include "orderdb.h"
|
|
||||||
#include "reports.h"
|
#include "reports.h"
|
||||||
#include "spells.h"
|
#include "spells.h"
|
||||||
#include "vortex.h"
|
#include "vortex.h"
|
||||||
|
@ -25,6 +24,7 @@
|
||||||
#include <util/functions.h>
|
#include <util/functions.h>
|
||||||
#include <kernel/building.h>
|
#include <kernel/building.h>
|
||||||
#include <kernel/curse.h>
|
#include <kernel/curse.h>
|
||||||
|
#include <kernel/db.h>
|
||||||
#include <kernel/equipment.h>
|
#include <kernel/equipment.h>
|
||||||
#include <kernel/item.h>
|
#include <kernel/item.h>
|
||||||
#include <kernel/xmlreader.h>
|
#include <kernel/xmlreader.h>
|
||||||
|
@ -60,15 +60,12 @@ void game_done(void)
|
||||||
free_special_directions();
|
free_special_directions();
|
||||||
free_locales();
|
free_locales();
|
||||||
kernel_done();
|
kernel_done();
|
||||||
orderdb_close();
|
db_close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void game_init(void)
|
void game_init(void)
|
||||||
{
|
{
|
||||||
db_backend choices[] = { DB_MEMORY, DB_NONE };
|
db_open();
|
||||||
if (orderdb_open(choices) == DB_NONE) {
|
|
||||||
log_fatal("no orderdb backend available");
|
|
||||||
}
|
|
||||||
kernel_init();
|
kernel_init();
|
||||||
register_triggers();
|
register_triggers();
|
||||||
register_xmas();
|
register_xmas();
|
||||||
|
|
|
@ -11,12 +11,14 @@ command.test.c
|
||||||
config.test.c
|
config.test.c
|
||||||
# connection.test.c
|
# connection.test.c
|
||||||
curse.test.c
|
curse.test.c
|
||||||
|
db.test.c
|
||||||
equipment.test.c
|
equipment.test.c
|
||||||
faction.test.c
|
faction.test.c
|
||||||
group.test.c
|
group.test.c
|
||||||
item.test.c
|
item.test.c
|
||||||
messages.test.c
|
messages.test.c
|
||||||
order.test.c
|
order.test.c
|
||||||
|
orderdb.test.c
|
||||||
# pathfinder.test.c
|
# pathfinder.test.c
|
||||||
plane.test.c
|
plane.test.c
|
||||||
pool.test.c
|
pool.test.c
|
||||||
|
@ -34,7 +36,10 @@ jsonconf.test.c
|
||||||
# xmlreader.test.c
|
# xmlreader.test.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
SET(_DBFILES dbtrie.c)
|
||||||
|
|
||||||
SET(_FILES
|
SET(_FILES
|
||||||
|
${_DBFILES}
|
||||||
alliance.c
|
alliance.c
|
||||||
ally.c
|
ally.c
|
||||||
build.c
|
build.c
|
||||||
|
@ -50,6 +55,7 @@ group.c
|
||||||
item.c
|
item.c
|
||||||
messages.c
|
messages.c
|
||||||
order.c
|
order.c
|
||||||
|
orderdb.c
|
||||||
pathfinder.c
|
pathfinder.c
|
||||||
plane.c
|
plane.c
|
||||||
pool.c
|
pool.c
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#ifndef H_DB
|
||||||
|
#define H_DB
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct order_data;
|
||||||
|
|
||||||
|
void db_open(void);
|
||||||
|
void db_close(void);
|
||||||
|
|
||||||
|
struct order_data *db_load_order(int id);
|
||||||
|
int db_save_order(struct order_data *od);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,40 @@
|
||||||
|
#include <platform.h>
|
||||||
|
#include <kernel/config.h>
|
||||||
|
|
||||||
|
#include "db.h"
|
||||||
|
#include "orderdb.h"
|
||||||
|
|
||||||
|
#include <CuTest.h>
|
||||||
|
#include <tests.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static void test_save_load_order(CuTest *tc) {
|
||||||
|
order_data *od;
|
||||||
|
int id;
|
||||||
|
const char * s = "GIB enno 1 Hodor";
|
||||||
|
|
||||||
|
db_open();
|
||||||
|
|
||||||
|
odata_create(&od, strlen(s) + 1, s);
|
||||||
|
CuAssertTrue(tc, od->_refcount >= 1);
|
||||||
|
id = odata_save(od);
|
||||||
|
odata_release(od);
|
||||||
|
CuAssertTrue(tc, id != 0);
|
||||||
|
|
||||||
|
od = odata_load(id);
|
||||||
|
CuAssertPtrNotNull(tc, od);
|
||||||
|
CuAssertTrue(tc, od->_refcount >= 1);
|
||||||
|
CuAssertStrEquals(tc, s, od->_str);
|
||||||
|
odata_release(od);
|
||||||
|
|
||||||
|
db_close();
|
||||||
|
}
|
||||||
|
|
||||||
|
CuSuite *get_db_suite(void)
|
||||||
|
{
|
||||||
|
CuSuite *suite = CuSuiteNew();
|
||||||
|
SUITE_ADD_TEST(suite, test_save_load_order);
|
||||||
|
|
||||||
|
return suite;
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
#include <platform.h>
|
#include <platform.h>
|
||||||
|
#include "db.h"
|
||||||
#include "orderdb.h"
|
#include "orderdb.h"
|
||||||
|
|
||||||
#include <util/log.h>
|
#include <util/log.h>
|
||||||
|
@ -16,9 +17,7 @@ struct cb_entry {
|
||||||
order_data *data;
|
order_data *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
static db_backend odata_backend = DB_NONE;
|
order_data *db_load_order(int id)
|
||||||
|
|
||||||
order_data *odata_load(int id)
|
|
||||||
{
|
{
|
||||||
void * match;
|
void * match;
|
||||||
|
|
||||||
|
@ -33,20 +32,7 @@ order_data *odata_load(int id)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void odata_create(order_data **pdata, size_t len, const char *str)
|
int db_save_order(order_data *od)
|
||||||
{
|
|
||||||
order_data *data;
|
|
||||||
char *result;
|
|
||||||
|
|
||||||
data = malloc(sizeof(order_data) + len + 1);
|
|
||||||
data->_refcount = 1;
|
|
||||||
result = (char *)(data + 1);
|
|
||||||
data->_str = (len > 0) ? result : NULL;
|
|
||||||
if (str) strcpy(result, str);
|
|
||||||
if (pdata) *pdata = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
int odata_save(order_data *od)
|
|
||||||
{
|
{
|
||||||
if (od->_str) {
|
if (od->_str) {
|
||||||
struct cb_entry ent;
|
struct cb_entry ent;
|
||||||
|
@ -59,16 +45,9 @@ int odata_save(order_data *od)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void odata_release(order_data * od)
|
static int free_data_cb(const void *match, const void *key, size_t keylen,
|
||||||
|
void *udata)
|
||||||
{
|
{
|
||||||
if (od) {
|
|
||||||
if (--od->_refcount == 0) {
|
|
||||||
free(od);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int free_data_cb(const void *match, const void *key, size_t keylen, void *udata) {
|
|
||||||
struct cb_entry * ent = (struct cb_entry *)match;
|
struct cb_entry * ent = (struct cb_entry *)match;
|
||||||
order_data *od = ent->data;
|
order_data *od = ent->data;
|
||||||
if (od->_refcount > 1) {
|
if (od->_refcount > 1) {
|
||||||
|
@ -78,25 +57,13 @@ int free_data_cb(const void *match, const void *key, size_t keylen, void *udata)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_data(void) {
|
void db_open(void)
|
||||||
|
{
|
||||||
|
auto_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void db_close(void)
|
||||||
|
{
|
||||||
cb_foreach(&cb_orders, NULL, 0, free_data_cb, NULL);
|
cb_foreach(&cb_orders, NULL, 0, free_data_cb, NULL);
|
||||||
cb_clear(&cb_orders);
|
cb_clear(&cb_orders);
|
||||||
}
|
}
|
||||||
|
|
||||||
db_backend orderdb_open(db_backend choices[])
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
free_data();
|
|
||||||
}
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
#include <platform.h>
|
||||||
|
#include "db.h"
|
||||||
|
#include "orderdb.h"
|
||||||
|
|
||||||
|
#include <util/log.h>
|
||||||
|
|
||||||
|
#include <critbit.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
void odata_create(order_data **pdata, size_t len, const char *str)
|
||||||
|
{
|
||||||
|
order_data *data;
|
||||||
|
char *result;
|
||||||
|
|
||||||
|
data = malloc(sizeof(order_data) + len + 1);
|
||||||
|
data->_refcount = 1;
|
||||||
|
result = (char *)(data + 1);
|
||||||
|
data->_str = (len > 0) ? result : NULL;
|
||||||
|
if (str) strcpy(result, str);
|
||||||
|
if (pdata) *pdata = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void odata_release(order_data * od)
|
||||||
|
{
|
||||||
|
if (od) {
|
||||||
|
if (--od->_refcount == 0) {
|
||||||
|
free(od);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
order_data *odata_load(int id)
|
||||||
|
{
|
||||||
|
return db_load_order(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
int odata_save(order_data *od)
|
||||||
|
{
|
||||||
|
return db_save_order(od);
|
||||||
|
}
|
|
@ -7,22 +7,11 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
DB_NONE,
|
|
||||||
DB_MEMORY,
|
|
||||||
DB_MMAP,
|
|
||||||
DB_BDB,
|
|
||||||
DB_SQLITE
|
|
||||||
} db_backend;
|
|
||||||
|
|
||||||
typedef struct order_data {
|
typedef struct order_data {
|
||||||
const char *_str;
|
const char *_str;
|
||||||
int _refcount;
|
int _refcount;
|
||||||
} order_data;
|
} order_data;
|
||||||
|
|
||||||
db_backend orderdb_open(db_backend choices[]);
|
|
||||||
void orderdb_close(void);
|
|
||||||
|
|
||||||
void odata_create(order_data **pdata, size_t len, const char *str);
|
void odata_create(order_data **pdata, size_t len, const char *str);
|
||||||
void odata_release(order_data * od);
|
void odata_release(order_data * od);
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
#include <platform.h>
|
||||||
|
#include <kernel/config.h>
|
||||||
|
|
||||||
|
#include "orderdb.h"
|
||||||
|
|
||||||
|
#include <CuTest.h>
|
||||||
|
#include <tests.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static void test_orderdb(CuTest *tc) {
|
||||||
|
order_data *od = NULL;
|
||||||
|
const char * s = "GIB enno 1 Hodor";
|
||||||
|
|
||||||
|
odata_create(&od, strlen(s) + 1, s);
|
||||||
|
CuAssertPtrNotNull(tc, od);
|
||||||
|
CuAssertStrEquals(tc, s, od->_str);
|
||||||
|
CuAssertTrue(tc, od->_refcount >= 1);
|
||||||
|
odata_release(od);
|
||||||
|
}
|
||||||
|
|
||||||
|
CuSuite *get_orderdb_suite(void)
|
||||||
|
{
|
||||||
|
CuSuite *suite = CuSuiteNew();
|
||||||
|
SUITE_ADD_TEST(suite, test_orderdb);
|
||||||
|
|
||||||
|
return suite;
|
||||||
|
}
|
|
@ -1,53 +0,0 @@
|
||||||
#include <platform.h>
|
|
||||||
#include <kernel/config.h>
|
|
||||||
|
|
||||||
#include "orderdb.h"
|
|
||||||
|
|
||||||
#include <CuTest.h>
|
|
||||||
#include <tests.h>
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_odata_save_load(CuTest *tc) {
|
|
||||||
db_backend choices[] = { DB_MEMORY, DB_NONE };
|
|
||||||
order_data *od;
|
|
||||||
int id;
|
|
||||||
const char * s = "GIB enno 1 Hodor";
|
|
||||||
|
|
||||||
CuAssertIntEquals(tc, DB_MEMORY, orderdb_open(choices));
|
|
||||||
|
|
||||||
odata_create(&od, strlen(s) + 1, s);
|
|
||||||
CuAssertTrue(tc, od->_refcount >= 1);
|
|
||||||
id = odata_save(od);
|
|
||||||
odata_release(od);
|
|
||||||
CuAssertTrue(tc, id != 0);
|
|
||||||
|
|
||||||
od = odata_load(id);
|
|
||||||
CuAssertPtrNotNull(tc, od);
|
|
||||||
CuAssertTrue(tc, od->_refcount >= 1);
|
|
||||||
CuAssertStrEquals(tc, s, od->_str);
|
|
||||||
odata_release(od);
|
|
||||||
|
|
||||||
orderdb_close();
|
|
||||||
}
|
|
||||||
|
|
||||||
CuSuite *get_orderdb_suite(void)
|
|
||||||
{
|
|
||||||
CuSuite *suite = CuSuiteNew();
|
|
||||||
SUITE_ADD_TEST(suite, test_orderdb_open_close);
|
|
||||||
SUITE_ADD_TEST(suite, test_odata_save_load);
|
|
||||||
|
|
||||||
return suite;
|
|
||||||
}
|
|
|
@ -93,6 +93,7 @@ int RunAllTests(int argc, char *argv[])
|
||||||
/* kernel */
|
/* kernel */
|
||||||
ADD_SUITE(alliance);
|
ADD_SUITE(alliance);
|
||||||
ADD_SUITE(command);
|
ADD_SUITE(command);
|
||||||
|
ADD_SUITE(db);
|
||||||
ADD_SUITE(plane);
|
ADD_SUITE(plane);
|
||||||
ADD_SUITE(unit);
|
ADD_SUITE(unit);
|
||||||
ADD_SUITE(faction);
|
ADD_SUITE(faction);
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
cd c:\users\enno\documents\eressea\git\tests
|
cd c:\users\enno\documents\eressea\git\tests
|
||||||
|
|
||||||
"C:\Program Files (x86)\Dr. Memory\bin64\drmemory.exe" ..\build-vs14\eressea\Debug\eressea.exe -t184 test-turn.lua
|
"C:\Program Files (x86)\Dr. Memory\bin64\drmemory.exe" ..\build-vs14\eressea\Debug\eressea.exe -t184 test-turn.lua
|
||||||
|
REM "C:\Program Files (x86)\Dr. Memory\bin64\drmemory.exe" ..\build-vs14\eressea\Debug\test_eressea.exe -t184 test-turn.lua
|
||||||
|
|
||||||
del /q reports
|
del /q reports
|
||||||
del /q datum htpasswd parteien parteien.full passwd score turn
|
del /q datum htpasswd parteien parteien.full passwd score turn
|
||||||
|
|
Loading…
Reference in New Issue