aboutsummaryrefslogtreecommitdiff
path: root/src/npassd/db.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/npassd/db.c')
-rw-r--r--src/npassd/db.c49
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;
+}