|
diff --git a/src/db.cc b/src/db.cc index c350e68..2b4a7eb 100644 --- a/ src/db.cc+++ b/ src/db.cc |
|
@@ -1,67 +1,69 @@ |
1 | #include <unistd.h> |
1 | #include <unistd.h> |
2 | #include <sys/stat.h> |
2 | #include <sys/stat.h> |
3 | #include <sys/types.h> |
3 | #include <sys/types.h> |
| |
4 | #include <stdlib.h> |
| |
5 | #include <string.h> |
4 | #include <cassert> |
6 | #include <cassert> |
5 | #include <napkin/exception.h> |
7 | #include <napkin/exception.h> |
6 | #include "db.h" |
8 | #include "db.h" |
7 | |
9 | |
8 | #include "config.h" |
10 | #include "config.h" |
9 | |
11 | |
10 | namespace napkin { |
12 | namespace napkin { |
11 | |
13 | |
12 | extern const char *sql_bootstrap; |
14 | extern const char *sql_bootstrap; |
13 | |
15 | |
14 | db_t::db_t() { |
16 | db_t::db_t() { |
15 | const char *h = getenv("HOME"); |
17 | const char *h = getenv("HOME"); |
16 | if(h) { |
18 | if(h) { |
17 | datadir = h; |
19 | datadir = h; |
18 | datadir += "/."PACKAGE_NAME"/"; |
20 | datadir += "/."PACKAGE_NAME"/"; |
19 | }else{ |
21 | }else{ |
20 | #if defined(HAVE_GET_CURRENT_DIR_NAME) |
22 | #if defined(HAVE_GET_CURRENT_DIR_NAME) |
21 | char *cwd = get_current_dir_name(); |
23 | char *cwd = get_current_dir_name(); |
22 | if(!cwd) |
24 | if(!cwd) |
23 | throw napkin::exception("failed to get_current_dir_name()"); |
25 | throw napkin::exception("failed to get_current_dir_name()"); |
24 | datadir = cwd; |
26 | datadir = cwd; |
25 | free(cwd); |
27 | free(cwd); |
26 | #elif defined(HAVE_GETCWD) |
28 | #elif defined(HAVE_GETCWD) |
27 | { |
29 | { |
28 | char cwd[ |
30 | char cwd[ |
29 | # if defined(MAXPATH) |
31 | # if defined(MAXPATH) |
30 | MAXPATH |
32 | MAXPATH |
31 | # elif defined(MAXPATHLEN) |
33 | # elif defined(MAXPATHLEN) |
32 | MAXPATHLEN |
34 | MAXPATHLEN |
33 | # else /* maxpath */ |
35 | # else /* maxpath */ |
34 | 512 |
36 | 512 |
35 | # endif /* maxpath */ |
37 | # endif /* maxpath */ |
36 | ]; |
38 | ]; |
37 | if(!getcwd(cwd,sizeof(cwd))) |
39 | if(!getcwd(cwd,sizeof(cwd))) |
38 | throw napkin::exception("failed to getcwd()"); |
40 | throw napkin::exception("failed to getcwd()"); |
39 | datadir = cwd; |
41 | datadir = cwd; |
40 | } |
42 | } |
41 | #else /* get cwd */ |
43 | #else /* get cwd */ |
42 | # error dunno how to get current workdir |
44 | # error dunno how to get current workdir |
43 | #endif /* get cwd */ |
45 | #endif /* get cwd */ |
44 | datadir += "/."PACKAGE_NAME"/"; |
46 | datadir += "/."PACKAGE_NAME"/"; |
45 | } |
47 | } |
46 | if(access(datadir.c_str(),R_OK|W_OK) |
48 | if(access(datadir.c_str(),R_OK|W_OK) |
47 | && mkdir(datadir.c_str(),0700)) |
49 | && mkdir(datadir.c_str(),0700)) |
48 | throw napkin::exception("no access to '"+datadir+"' directory"); |
50 | throw napkin::exception("no access to '"+datadir+"' directory"); |
49 | open((datadir+PACKAGE_NAME".db").c_str()); |
51 | open((datadir+PACKAGE_NAME".db").c_str()); |
50 | assert(_D); |
52 | assert(_D); |
51 | char **resp; int nr,nc; char *errm; |
53 | char **resp; int nr,nc; char *errm; |
52 | if(sqlite3_get_table( |
54 | if(sqlite3_get_table( |
53 | _D, |
55 | _D, |
54 | "SELECT s_tobed FROM sleeps LIMIT 0", |
56 | "SELECT s_tobed FROM sleeps LIMIT 0", |
55 | &resp,&nr,&nc,&errm)!=SQLITE_OK) { |
57 | &resp,&nr,&nc,&errm)!=SQLITE_OK) { |
56 | if(sqlite3_exec(_D,sql_bootstrap,NULL,NULL,&errm)!=SQLITE_OK) |
58 | if(sqlite3_exec(_D,sql_bootstrap,NULL,NULL,&errm)!=SQLITE_OK) |
57 | throw napkin::exception(string("failed to bootstrap sqlite database: ")+errm); |
59 | throw napkin::exception(string("failed to bootstrap sqlite database: ")+errm); |
58 | }else |
60 | }else |
59 | sqlite3_free_table(resp); |
61 | sqlite3_free_table(resp); |
60 | } |
62 | } |
61 | |
63 | |
62 | void db_t::store(const hypnodata_t& hd) { |
64 | void db_t::store(const hypnodata_t& hd) { |
63 | sqlite::mem_t<char*> S = sqlite3_mprintf( |
65 | sqlite::mem_t<char*> S = sqlite3_mprintf( |
64 | "INSERT INTO sleeps (" |
66 | "INSERT INTO sleeps (" |
65 | "s_tobed,s_alarm," |
67 | "s_tobed,s_alarm," |
66 | "s_window,s_data_a," |
68 | "s_window,s_data_a," |
67 | "s_almost_awakes," |
69 | "s_almost_awakes," |
|