diff options
Diffstat (limited to 'src/npassd/db.c')
-rw-r--r-- | src/npassd/db.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/npassd/db.c b/src/npassd/db.c new file mode 100644 index 0000000..5afa45e --- /dev/null +++ b/src/npassd/db.c @@ -0,0 +1,49 @@ +#include <errno.h> +#include <linux/limits.h> +#include <stdio.h> + +#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; +} |