#include #include #include #include "npassd/db.h" #include "util.h" #define DB_NAME "secret_service.sqlite" const char sql_stmt_init[] = "CREATE TABLE IF NOT EXISTS store (" " storeid INTEGER PRIMARY KEY," " name TEXT NOT NULL UNIQUE" ");" "CREATE TABLE IF NOT EXISTS lookup (" " key TEXT NOT NULL," " value TEXT NOT NULL," " storeid INTEGER," " UNIQUE(storeid, key)," " FOREIGN KEY(storeid) REFERENCES store(storeid)" ");"; int db_init(const char *store_path, struct sqlite3 **db) { char db_path[PATH_MAX]; int ret; ret = snprintf(db_path, sizeof(db_path), "%s/" DB_NAME, store_path); if (ret < 0 || (size_t)ret > sizeof(db_path)) { print_err("Path exceeded PATH_MAX"); return -ENAMETOOLONG; } ret = sqlite3_open_v2(db_path, db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL); if (ret != SQLITE_OK) { print_err("Can't open database: %s", sqlite3_errmsg(*db)); return -EPERM; } ret = sqlite3_exec(*db, sql_stmt_init, NULL, NULL, NULL); if (ret != SQLITE_OK) { print_err("Failed to create tables: %s", sqlite3_errmsg(*db)); return -EPERM; } return 0; }