#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 collections (" " id INTEGER PRIMARY KEY," " root TEXT NOT NULL UNIQUE," " label TEXT UNIQUE," " alias TEXT UNIQUE," " created INTEGER," " modified INTEGER" ");" "CREATE TABLE IF NOT EXISTS collection_attrs (" " id INTEGER PRIMARY KEY," " key TEXT NOT NULL," " value TEXT NOT NULL," " collectionid INTEGER," " UNIQUE(key, collectionid)" " FOREIGN KEY(collectionid) REFERENCES collections(id)" ");"; 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) { sqlite3_close(*db); print_err("Failed to create tables: %s", sqlite3_errmsg(*db)); return -EPERM; } return 0; }