sqlite: Add database initialization 32/167132/8
authorPaweł Szewczyk <p.szewczyk@samsung.com>
Mon, 15 Jan 2018 15:42:12 +0000 (16:42 +0100)
committerPaweł Szewczyk <p.szewczyk@samsung.com>
Fri, 16 Feb 2018 13:33:01 +0000 (14:33 +0100)
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 <p.szewczyk@samsung.com>
src/database/sqlite.c

index afa31d521779cc5bc1d260edab55c73a9346aa0d..2c5c5eab71dcc41cd9752a0eef294fac7bd3036e 100644 (file)
 #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)