#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) \
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)