From 0b0b12f85f312a21e0dd2c890b64d6b78ea2fd8e Mon Sep 17 00:00:00 2001
From: =?utf8?q?Pawe=C5=82=20Szewczyk?=
Date: Mon, 15 Jan 2018 16:42:12 +0100
Subject: [PATCH] sqlite: Add database initialization
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit
At initialization the adapter creates 'meta' table with integer id as key
and signature, which contains information about object structure. Also,
several sql statements are prepared to be used in runtime.
Change-Id: Ib9380d6899601477195390e7fd77483c8dffe4b3
Signed-off-by: PaweÅ Szewczyk
---
src/database/sqlite.c | 64 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/src/database/sqlite.c b/src/database/sqlite.c
index afa31d5..2c5c5ea 100644
--- a/src/database/sqlite.c
+++ b/src/database/sqlite.c
@@ -25,10 +25,23 @@
#include "log.h"
#include "module.h"
+#define META_TABLE "meta"
+#define OBJ_TABLE_PREFIX "objects"
#define ID_KEY "id"
+enum prepared_stmts {
+ STMT_GET_ALL_TABLES = 0,
+ STMT_NUM,
+};
+
+const char *prepared_stmts_str[STMT_NUM] = {
+ [STMT_GET_ALL_TABLES] = "SELECT ('" OBJ_TABLE_PREFIX "'||id), signature FROM " META_TABLE ";",
+};
+
struct sqlite_adapter {
struct faultd_database_adapter database_adapter;
+ sqlite3 *db;
+ sqlite3_stmt *stmts[STMT_NUM];
};
#define to_sqlite_adapter(MOD) \
@@ -36,13 +49,64 @@ struct sqlite_adapter {
static void cleanup_sqlite_adapter(struct faultd_module *module)
{
+ struct faultd_database_adapter *_da = to_database_adapter(module);
+ struct sqlite_adapter *da = to_sqlite_adapter(_da);
+ int i;
+
+ for (i = 0; i < STMT_NUM; ++i)
+ sqlite3_finalize(da->stmts[i]);
+
+ sqlite3_close(da->db);
}
static int init_sqlite_adapter(struct faultd_module *module,
struct faultd_config *config,
sd_event *event_loop)
{
+ struct faultd_database_adapter *_da = to_database_adapter(module);
+ struct sqlite_adapter *da = to_sqlite_adapter(_da);
+ int ret;
+ char *sqlite_err = NULL;
+ int prepared = 0;
+
+ ret = sqlite3_open(DBDIR "/faultd.sqlite", &da->db);
+ if (ret < 0) {
+ log_error("Could not open database: %s\n", sqlite3_errmsg(da->db));
+ return ret;
+ }
+
+ ret = sqlite3_exec(da->db, "CREATE TABLE IF NOT EXISTS " META_TABLE
+ "(id INTEGER PRIMARY KEY, signature TEXT)"
+ ";", NULL, 0, &sqlite_err);
+ if (ret < 0) {
+ log_error("SQL Error: %s\n", sqlite3_errmsg(da->db));
+ sqlite3_free(sqlite_err);
+ goto close_db;
+ }
+
+ for (prepared = 0; prepared < STMT_NUM; ++prepared) {
+ ret = sqlite3_prepare_v2(da->db, prepared_stmts_str[prepared], -1, &da->stmts[prepared], NULL);
+ if (ret < 0) {
+ log_error_errno(ret, "Could not prepare sql statement:\n %s", prepared_stmts_str[prepared]);
+ goto out;
+ }
+ }
+
+ ret = faultd_set_database_adapter(_da);
+ if (ret < 0) {
+ log_error("Database adapter was already set. Please, enable only one database module");
+ goto out;
+ }
+
return 0;
+
+out:
+ while (prepared--)
+ sqlite3_finalize(da->stmts[prepared]);
+
+close_db:
+ sqlite3_close(da->db);
+ return ret;
}
static int sqlite_store(struct faultd_database_adapter *adapter, struct faultd_object *obj, faultd_oid_t *oid)
--
2.34.1