From 89bf17cdca63a19df2e02949f9bd274da2c3d36d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 9 Nov 2017 21:33:42 +0100 Subject: [PATCH] almost have sqlite storage working (in memory, not file). but test_teach_magic crashes. --- src/kernel/dbsqlite.c | 30 ++++++++++++++++++++++++++++-- src/study.c | 2 +- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/kernel/dbsqlite.c b/src/kernel/dbsqlite.c index ac970ce4a..2dd249c65 100644 --- a/src/kernel/dbsqlite.c +++ b/src/kernel/dbsqlite.c @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -20,8 +21,25 @@ order_data *db_load_order(int id) { if (id > 0) { order_data * od = NULL; - odata_create(&od, 0, NULL); - return od; + int err; + + err = sqlite3_reset(g_stmt_select); + assert(err == SQLITE_OK); + err = sqlite3_bind_int(g_stmt_select, 1, id); + assert(err == SQLITE_OK); + do { + err = sqlite3_step(g_stmt_select); + if (err == SQLITE_ROW) { + const unsigned char *text; + int bytes; + bytes = sqlite3_column_bytes(g_stmt_select, 0); + assert(bytes > 0); + text = sqlite3_column_text(g_stmt_select, 0); + odata_create(&od, (size_t)bytes, (const char *)text); + return od; + } + } while (err == SQLITE_ROW); + assert(err == SQLITE_DONE); } return NULL; } @@ -30,12 +48,16 @@ int db_save_order(order_data *od) { if (od->_str) { int err; + sqlite3_int64 id; err = sqlite3_reset(g_stmt_insert); assert(err == SQLITE_OK); err = sqlite3_bind_text(g_stmt_insert, 1, od->_str, -1, SQLITE_STATIC); assert(err == SQLITE_OK); err = sqlite3_step(g_stmt_insert); assert(err == SQLITE_DONE); + id = sqlite3_last_insert_rowid(g_db); + assert(id <= INT_MAX); + return (int)id; } return 0; } @@ -50,12 +72,16 @@ void db_open(void) assert(err == SQLITE_OK); err = sqlite3_prepare_v2(g_db, "INSERT INTO orders (data) VALUES (?)", -1, &g_stmt_insert, NULL); assert(err == SQLITE_OK); + err = sqlite3_prepare_v2(g_db, "SELECT data FROM orders WHERE id = ?", -1, &g_stmt_select, NULL); + assert(err == SQLITE_OK); } void db_close(void) { int err; + err = sqlite3_finalize(g_stmt_select); + assert(err == SQLITE_OK); err = sqlite3_finalize(g_stmt_insert); assert(err == SQLITE_OK); err = sqlite3_close(g_db); diff --git a/src/study.c b/src/study.c index 9264f9060..a80fa932f 100644 --- a/src/study.c +++ b/src/study.c @@ -371,7 +371,7 @@ int teach_cmd(unit * teacher, struct order *ord) token = getstrtoken(); /* Beginne die Fehlermeldung */ - if (isparam(token, teacher->faction->locale, P_TEMP)) { + if (token && isparam(token, teacher->faction->locale, P_TEMP)) { token = getstrtoken(); sprintf(tbuf, "%s %s", LOC(teacher->faction->locale, parameters[P_TEMP]), token);