-
Notifications
You must be signed in to change notification settings - Fork 6
/
sqlite.c
110 lines (85 loc) · 3.08 KB
/
sqlite.c
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
#include "sqlite.h"
static int
busy(void *unused __attribute__ ((unused)), int count) {
usleep(500000);
#ifdef DEBUG_DB
printf("retrying query...\n");
#endif
// give up after 30 seconds
return (count < 60);
}
int
exec_query(sqlite3 * db, char *query) {
char *error = NULL;
#ifdef DEBUG_DB
if (strstr(query, "TRANSACTION") == NULL)
printf("sql: %s\n", query);
#endif
if (sqlite3_exec(db, query, NULL, NULL, &error) != SQLITE_OK) {
printf("sql error: %s\n", error);
sqlite3_free(error);
return -1;
}
return 0;
}
sqlite3 *
open_db(void) {
sqlite3 *db;
// open database file
if (sqlite3_open(DB_SQLITE, &db) != SQLITE_OK) {
printf("Coudln't open database: %s", DB_SQLITE);
return NULL;
}
// retry on busy errors
sqlite3_busy_handler(db, busy, NULL);
// disable waiting for write to be completed
exec_query(db, "PRAGMA synchronous = OFF");
// disable journal
exec_query(db, "PRAGMA journal_mode = OFF");
return db;
}
void
init_db(sqlite3 * db) {
exec_query(db, "BEGIN TRANSACTION");
// create data table
exec_query(db, "CREATE TABLE IF NOT EXISTS data ( \
id INTEGER PRIMARY KEY, \
time DATE, \
rpm FLOAT, \
speed FLOAT, \
injection_time FLOAT, \
oil_pressure FLOAT, \
consumption_per_100km FLOAT, \
consumption_per_h FLOAT, \
duration_consumption FLOAT, \
duration_speed FLOAT, \
liters FLOAT, \
kilometers FLOAT, \
temp_engine FLOAT, \
temp_air_intake FLOAT, \
voltage FLOAT, \
gps_mode INTEGER, \
gps_latitude FLOAT, \
gps_longitude FLOAT, \
gps_altitude FLOAT, \
gps_speed FLOAT, \
gps_climb FLOAT, \
gps_track FLOAT, \
gps_err_latitude FLOAT, \
gps_err_longitude FLOAT, \
gps_err_altitude FLOAT, \
gps_err_speed FLOAT, \
gps_err_climb FLOAT, \
gps_err_track FLOAT )");
// create table where set point information is stored
exec_query(db, "CREATE TABLE IF NOT EXISTS setpoints ( \
name VARCHAR PRIMARY KEY, \
time DATE, \
data INTEGER)");
exec_query(db, "END TRANSACTION");
return;
}
void
close_db(sqlite3 * db) {
sqlite3_close(db);
}