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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/* dblayer.c - Database layer for ck ---------------------------*- C -*-
*
* This file is part of ck, the config keeper
*
* ------------------------------------------------------------------ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dblayer.h"
int db_exists() {
FILE *db_file;
if ((db_file = fopen("/home/gramanas/.ck/ckdb", "rb")) == NULL) {
return 0;
}
fclose(db_file);
return 1;
}
// check if db has the correct tables
int check_initialized_DB(sqlite3 *db) {
char *sql = "SELECT * FROM SQLITE_MASTER;";
sqlite3_stmt *stmt;
int rc = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, NULL);
int program_table_ok, config_table_ok, rel_table_ok = 0;
while (sqlite3_step(stmt) != SQLITE_DONE) {
const unsigned char *tmpbuf = sqlite3_column_text(stmt, 1);
if (strcmp((char *)tmpbuf, "PROGRAM") == 0) {
program_table_ok = 1;
}
if (strcmp((char *)tmpbuf, "CONFIG") == 0) {
config_table_ok = 1;
}
if (strcmp((char *)tmpbuf, "REL") == 0) {
rel_table_ok = 1;
}
}
if (!program_table_ok
|| !config_table_ok
|| !rel_table_ok ) {
return 1;
}
sqlite3_finalize(stmt);
return 0;
}
DB empty_DB(SqlError err) {
return (DB){ .ptr = NULL, .error = err };
}
DB new_DB(sqlite3 *db) {
return (DB){ .ptr = db, .error = SQL_NO_ERR };
}
void close_DB(DB *db) {
sqlite3_close(db->ptr);
}
DB init_make_DB() {
sqlite3 *db;
int rc;
rc = sqlite3_open("/home/gramanas/.ck/ckdb", &db);
if (rc) {
return empty_DB(SQL_ERR_NO_DB_FILE);
}
return new_DB(db);
}
DB open_DB() {
sqlite3 *db;
int rc;
rc = sqlite3_open("/home/gramanas/.ck/ckdb", &db);
if (rc) {
return empty_DB(SQL_ERR_NO_DB_FILE);
}
if (check_initialized_DB(db)) {
return empty_DB(SQL_ERR_NO_TABLES);
}
return new_DB(db);
}
void init_make_tables(DB *db) {
char * sql = "CREATE TABLE REL("
"pId INT NOT NULL,"
"cId INT NOT NULL);"
"CREATE TABLE PROGRAM("
"id INT PRIMARY KEY NOT NULL,"
"name TEXT NOT NULL);"
"CREATE TABLE CONFIG("
"id INT PRIMARY KEY NOT NULL,"
"path TEXT NOT NULL,"
"secret INT NOT NULL,"
"prime INT NOT NULL);";
char *err_msg = NULL;
int rc = sqlite3_exec(db->ptr, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK ) {
printf("SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
db->error = SQL_ERR_SQLITE;
return;
}
}
|