aboutsummaryrefslogtreecommitdiff
path: root/src/npassd/db.c
blob: 5afa45e298953045fd9cdcde24b793d86cbe01e3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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;
}