summaryrefslogtreecommitdiffabout
path: root/src
Unidiff
Diffstat (limited to 'src') (more/less context) (ignore whitespace changes)
-rw-r--r--src/db.cc2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/db.cc b/src/db.cc
index c350e68..2b4a7eb 100644
--- a/src/db.cc
+++ b/src/db.cc
@@ -1,99 +1,101 @@
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
10namespace napkin { 12namespace 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,"
68 "s_timezone" 70 "s_timezone"
69 ") VALUES (" 71 ") VALUES ("
70 "%Q,%Q,%d,%d,%Q,%ld" 72 "%Q,%Q,%d,%d,%Q,%ld"
71 ")", 73 ")",
72 hd.w3c_to_bed().c_str(), 74 hd.w3c_to_bed().c_str(),
73 hd.w3c_alarm().c_str(), 75 hd.w3c_alarm().c_str(),
74 hd.window,hd.data_a, 76 hd.window,hd.data_a,
75 hd.w3c_almostawakes().c_str(), 77 hd.w3c_almostawakes().c_str(),
76 timezone ); 78 timezone );
77 try { 79 try {
78 exec(S); 80 exec(S);
79 }catch(sqlite::exception& se) { 81 }catch(sqlite::exception& se) {
80 if(se.rcode==SQLITE_CONSTRAINT) 82 if(se.rcode==SQLITE_CONSTRAINT)
81 throw exception_db_already("The record seems to be already in the database"); 83 throw exception_db_already("The record seems to be already in the database");
82 throw exception_db("Well, some error occured"); 84 throw exception_db("Well, some error occured");
83 } 85 }
84 } 86 }
85 87
86 void db_t::remove(const hypnodata_t& hd) { 88 void db_t::remove(const hypnodata_t& hd) {
87 sqlite::mem_t<char*> S = sqlite3_mprintf( 89 sqlite::mem_t<char*> S = sqlite3_mprintf(
88 "DELETE FROM sleeps" 90 "DELETE FROM sleeps"
89 " WHERE s_tobed=%Q AND s_alarm=%Q", 91 " WHERE s_tobed=%Q AND s_alarm=%Q",
90 hd.w3c_to_bed().c_str(), 92 hd.w3c_to_bed().c_str(),
91 hd.w3c_alarm().c_str() ); 93 hd.w3c_alarm().c_str() );
92 exec(S); 94 exec(S);
93 } 95 }
94 96
95 void db_t::load(list<hypnodata_ptr_t>& rv, 97 void db_t::load(list<hypnodata_ptr_t>& rv,
96 const string& sql) { 98 const string& sql) {
97 sqlite::table_t T; 99 sqlite::table_t T;
98 int nr,nc; 100 int nr,nc;
99 get_table( string( 101 get_table( string(