-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | src/db.cc | 19 |
2 files changed, 23 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac index 3ca0b4e..fbf373b 100644 --- a/configure.ac +++ b/configure.ac | |||
@@ -1,60 +1,64 @@ | |||
1 | AC_INIT([napkin], [0.0], [napkin-bugs@klever.net]) | 1 | AC_INIT([napkin], [0.0], [napkin-bugs@klever.net]) |
2 | AC_CONFIG_AUX_DIR([aux.d]) | 2 | AC_CONFIG_AUX_DIR([aux.d]) |
3 | AC_CONFIG_SRCDIR([src/napkin.cc]) | 3 | AC_CONFIG_SRCDIR([src/napkin.cc]) |
4 | AC_CONFIG_HEADERS([config.h]) | 4 | AC_CONFIG_HEADERS([config.h]) |
5 | AM_INIT_AUTOMAKE([dist-bzip2]) | 5 | AM_INIT_AUTOMAKE([dist-bzip2]) |
6 | 6 | ||
7 | AC_PROG_INSTALL | 7 | AC_PROG_INSTALL |
8 | AC_PROG_CXX | 8 | AC_PROG_CXX |
9 | AC_PROG_CC | 9 | AC_PROG_CC |
10 | AC_PROG_LIBTOOL | 10 | AC_PROG_LIBTOOL |
11 | PKG_PROG_PKG_CONFIG | 11 | PKG_PROG_PKG_CONFIG |
12 | 12 | ||
13 | onegetcwd=false | ||
14 | AC_CHECK_FUNCS([get_current_dir_name getcwd],[onegetcwd=true;break]) | ||
15 | $onegetcwd || AC_MSG_ERROR([no function to get current directory found. weird.]) | ||
16 | |||
13 | AC_HEADER_STDC | 17 | AC_HEADER_STDC |
14 | 18 | ||
15 | AC_PATH_PROG([XSLTPROC],[xsltproc],[true]) | 19 | AC_PATH_PROG([XSLTPROC],[xsltproc],[true]) |
16 | 20 | ||
17 | PKG_CHECK_MODULES([MODULES],[gtkmm-2.4 sqlite3],,[ | 21 | PKG_CHECK_MODULES([MODULES],[gtkmm-2.4 sqlite3],,[ |
18 | AC_MSG_ERROR([not all dependencies could be satisfied]) | 22 | AC_MSG_ERROR([not all dependencies could be satisfied]) |
19 | ]) | 23 | ]) |
20 | 24 | ||
21 | AC_MSG_CHECKING([whether to enable debugging code]) | 25 | AC_MSG_CHECKING([whether to enable debugging code]) |
22 | ndebug=true | 26 | ndebug=true |
23 | AC_ARG_ENABLE([debug], | 27 | AC_ARG_ENABLE([debug], |
24 | AC_HELP_STRING([--enable-debug],[enable debugging/development code]), | 28 | AC_HELP_STRING([--enable-debug],[enable debugging/development code]), |
25 | [ test "$enableval" = "no" || ndebug=false ] | 29 | [ test "$enableval" = "no" || ndebug=false ] |
26 | ) | 30 | ) |
27 | if $ndebug ; then | 31 | if $ndebug ; then |
28 | AC_MSG_RESULT([no]) | 32 | AC_MSG_RESULT([no]) |
29 | CPPFLAGS="${CPPFLAGS}-DNDEBUG" | 33 | CPPFLAGS="${CPPFLAGS}-DNDEBUG" |
30 | else | 34 | else |
31 | AC_MSG_RESULT([yes]) | 35 | AC_MSG_RESULT([yes]) |
32 | fi | 36 | fi |
33 | 37 | ||
34 | nitpick=false | 38 | nitpick=false |
35 | AC_MSG_CHECKING([whether to enable compiler nitpicking]) | 39 | AC_MSG_CHECKING([whether to enable compiler nitpicking]) |
36 | AC_ARG_ENABLE([nitpicking], | 40 | AC_ARG_ENABLE([nitpicking], |
37 | AC_HELP_STRING([--enable-nitpicking],[make compiler somewhat overly fastidious about the code it deals with]), | 41 | AC_HELP_STRING([--enable-nitpicking],[make compiler somewhat overly fastidious about the code it deals with]), |
38 | [ test "$enableval" = "no" || nitpick=true ] | 42 | [ test "$enableval" = "no" || nitpick=true ] |
39 | ) | 43 | ) |
40 | if $nitpick ; then | 44 | if $nitpick ; then |
41 | AC_MSG_RESULT([yes]) | 45 | AC_MSG_RESULT([yes]) |
42 | CPP_NITPICK="-pedantic -Wall -Wextra -Wundef -Wshadow \ | 46 | CPP_NITPICK="-pedantic -Wall -Wextra -Wundef -Wshadow \ |
43 | -Wunsafe-loop-optimizations -Wconversion -Wmissing-format-attribute \ | 47 | -Wunsafe-loop-optimizations -Wconversion -Wmissing-format-attribute \ |
44 | -Wredundant-decls -ansi" | 48 | -Wredundant-decls -ansi" |
45 | # -Wlogical-op -Wmissing-noreturn | 49 | # -Wlogical-op -Wmissing-noreturn |
46 | C_NITPICK="$CPP_NITPICK" | 50 | C_NITPICK="$CPP_NITPICK" |
47 | CXX_NITPICK="$C_NITPICK" | 51 | CXX_NITPICK="$C_NITPICK" |
48 | 52 | ||
49 | CPPFLAGS="$CPPFLAGS $CPP_NITPICK" | 53 | CPPFLAGS="$CPPFLAGS $CPP_NITPICK" |
50 | CFLAGS="$CFLAGS $C_NITPICK" | 54 | CFLAGS="$CFLAGS $C_NITPICK" |
51 | CXXFLAGS="$CXXFLAGS $CXX_NITPICK" | 55 | CXXFLAGS="$CXXFLAGS $CXX_NITPICK" |
52 | else | 56 | else |
53 | AC_MSG_RESULT([no]) | 57 | AC_MSG_RESULT([no]) |
54 | fi | 58 | fi |
55 | 59 | ||
56 | 60 | ||
57 | AC_CONFIG_FILES([ | 61 | AC_CONFIG_FILES([ |
58 | Makefile | 62 | Makefile |
59 | include/Makefile | 63 | include/Makefile |
60 | lib/Makefile | 64 | lib/Makefile |
@@ -1,72 +1,91 @@ | |||
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 <cassert> | 4 | #include <cassert> |
5 | #include <napkin/exception.h> | 5 | #include <napkin/exception.h> |
6 | #include "db.h" | 6 | #include "db.h" |
7 | 7 | ||
8 | #include "config.h" | 8 | #include "config.h" |
9 | 9 | ||
10 | namespace napkin { | 10 | namespace napkin { |
11 | 11 | ||
12 | extern const char *sql_bootstrap; | 12 | extern const char *sql_bootstrap; |
13 | 13 | ||
14 | db_t::db_t() { | 14 | db_t::db_t() { |
15 | const char *h = getenv("HOME"); | 15 | const char *h = getenv("HOME"); |
16 | if(h) { | 16 | if(h) { |
17 | datadir = h; | 17 | datadir = h; |
18 | datadir += "/."PACKAGE_NAME"/"; | 18 | datadir += "/."PACKAGE_NAME"/"; |
19 | }else{ | 19 | }else{ |
20 | #if defined(HAVE_GET_CURRENT_DIR_NAME) | ||
20 | char *cwd = get_current_dir_name(); | 21 | char *cwd = get_current_dir_name(); |
21 | if(!cwd) | 22 | if(!cwd) |
22 | throw napkin::exception("failed to get_current_dir_name()"); | 23 | throw napkin::exception("failed to get_current_dir_name()"); |
23 | datadir = cwd; | 24 | datadir = cwd; |
24 | free(cwd); | 25 | free(cwd); |
26 | #elif defined(HAVE_GETCWD) | ||
27 | { | ||
28 | char cwd[ | ||
29 | # if defined(MAXPATH) | ||
30 | MAXPATH | ||
31 | # elif defined(MAXPATHLEN) | ||
32 | MAXPATHLEN | ||
33 | # else /* maxpath */ | ||
34 | 512 | ||
35 | #endif /* maxpath */ | ||
36 | ]; | ||
37 | if(!getcwd(cwd,sizeof(cwd))) | ||
38 | throw napkin::exception("failed to getcwd()"); | ||
39 | datadir = cwd; | ||
40 | } | ||
41 | #else /* get cwd */ | ||
42 | # error dunno how to get current workdir | ||
43 | #endif /* get cwd */ | ||
25 | datadir += "/."PACKAGE_NAME"/"; | 44 | datadir += "/."PACKAGE_NAME"/"; |
26 | } | 45 | } |
27 | if(access(datadir.c_str(),R_OK|W_OK) | 46 | if(access(datadir.c_str(),R_OK|W_OK) |
28 | && mkdir(datadir.c_str(),0700)) | 47 | && mkdir(datadir.c_str(),0700)) |
29 | throw napkin::exception("no access to '"+datadir+"' directory"); | 48 | throw napkin::exception("no access to '"+datadir+"' directory"); |
30 | open((datadir+PACKAGE_NAME".db").c_str()); | 49 | open((datadir+PACKAGE_NAME".db").c_str()); |
31 | assert(_D); | 50 | assert(_D); |
32 | char **resp; int nr,nc; char *errm; | 51 | char **resp; int nr,nc; char *errm; |
33 | if(sqlite3_get_table( | 52 | if(sqlite3_get_table( |
34 | _D, | 53 | _D, |
35 | "SELECT s_tobed FROM sleeps LIMIT 0", | 54 | "SELECT s_tobed FROM sleeps LIMIT 0", |
36 | &resp,&nr,&nc,&errm)!=SQLITE_OK) { | 55 | &resp,&nr,&nc,&errm)!=SQLITE_OK) { |
37 | if(sqlite3_exec(_D,sql_bootstrap,NULL,NULL,&errm)!=SQLITE_OK) | 56 | if(sqlite3_exec(_D,sql_bootstrap,NULL,NULL,&errm)!=SQLITE_OK) |
38 | throw napkin::exception(string("failed to bootstrap sqlite database: ")+errm); | 57 | throw napkin::exception(string("failed to bootstrap sqlite database: ")+errm); |
39 | }else | 58 | }else |
40 | sqlite3_free_table(resp); | 59 | sqlite3_free_table(resp); |
41 | } | 60 | } |
42 | 61 | ||
43 | void db_t::store(const hypnodata_t& hd) { | 62 | void db_t::store(const hypnodata_t& hd) { |
44 | sqlite::mem_t<char*> S = sqlite3_mprintf( | 63 | sqlite::mem_t<char*> S = sqlite3_mprintf( |
45 | "INSERT INTO sleeps (" | 64 | "INSERT INTO sleeps (" |
46 | "s_tobed,s_alarm," | 65 | "s_tobed,s_alarm," |
47 | "s_window,s_data_a," | 66 | "s_window,s_data_a," |
48 | "s_almost_awakes," | 67 | "s_almost_awakes," |
49 | "s_timezone" | 68 | "s_timezone" |
50 | ") VALUES (" | 69 | ") VALUES (" |
51 | "%Q,%Q,%d,%d,%Q,%ld" | 70 | "%Q,%Q,%d,%d,%Q,%ld" |
52 | ")", | 71 | ")", |
53 | hd.w3c_to_bed().c_str(), | 72 | hd.w3c_to_bed().c_str(), |
54 | hd.w3c_alarm().c_str(), | 73 | hd.w3c_alarm().c_str(), |
55 | hd.window,hd.data_a, | 74 | hd.window,hd.data_a, |
56 | hd.w3c_almostawakes().c_str(), | 75 | hd.w3c_almostawakes().c_str(), |
57 | timezone ); | 76 | timezone ); |
58 | try { | 77 | try { |
59 | exec(S); | 78 | exec(S); |
60 | }catch(sqlite::exception& se) { | 79 | }catch(sqlite::exception& se) { |
61 | if(se.rcode==SQLITE_CONSTRAINT) | 80 | if(se.rcode==SQLITE_CONSTRAINT) |
62 | throw exception_db_already("The record seems to be already in the database"); | 81 | throw exception_db_already("The record seems to be already in the database"); |
63 | throw exception_db("Well, some error occured"); | 82 | throw exception_db("Well, some error occured"); |
64 | } | 83 | } |
65 | } | 84 | } |
66 | 85 | ||
67 | void db_t::remove(const hypnodata_t& hd) { | 86 | void db_t::remove(const hypnodata_t& hd) { |
68 | sqlite::mem_t<char*> S = sqlite3_mprintf( | 87 | sqlite::mem_t<char*> S = sqlite3_mprintf( |
69 | "DELETE FROM sleeps" | 88 | "DELETE FROM sleeps" |
70 | " WHERE s_tobed=%Q AND s_alarm=%Q", | 89 | " WHERE s_tobed=%Q AND s_alarm=%Q", |
71 | hd.w3c_to_bed().c_str(), | 90 | hd.w3c_to_bed().c_str(), |
72 | hd.w3c_alarm().c_str() ); | 91 | hd.w3c_alarm().c_str() ); |