-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,66 +1,70 @@ AC_INIT([napkin], [0.0], [napkin-bugs@klever.net]) AC_CONFIG_AUX_DIR([aux.d]) AC_CONFIG_SRCDIR([src/napkin.cc]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE([dist-bzip2]) AC_PROG_INSTALL AC_PROG_CXX AC_PROG_CC AC_PROG_LIBTOOL PKG_PROG_PKG_CONFIG +onegetcwd=false +AC_CHECK_FUNCS([get_current_dir_name getcwd],[onegetcwd=true;break]) +$onegetcwd || AC_MSG_ERROR([no function to get current directory found. weird.]) + AC_HEADER_STDC AC_PATH_PROG([XSLTPROC],[xsltproc],[true]) PKG_CHECK_MODULES([MODULES],[gtkmm-2.4 sqlite3],,[ AC_MSG_ERROR([not all dependencies could be satisfied]) ]) AC_MSG_CHECKING([whether to enable debugging code]) ndebug=true AC_ARG_ENABLE([debug], AC_HELP_STRING([--enable-debug],[enable debugging/development code]), [ test "$enableval" = "no" || ndebug=false ] ) if $ndebug ; then AC_MSG_RESULT([no]) CPPFLAGS="${CPPFLAGS}-DNDEBUG" else AC_MSG_RESULT([yes]) fi nitpick=false AC_MSG_CHECKING([whether to enable compiler nitpicking]) AC_ARG_ENABLE([nitpicking], AC_HELP_STRING([--enable-nitpicking],[make compiler somewhat overly fastidious about the code it deals with]), [ test "$enableval" = "no" || nitpick=true ] ) if $nitpick ; then AC_MSG_RESULT([yes]) CPP_NITPICK="-pedantic -Wall -Wextra -Wundef -Wshadow \ -Wunsafe-loop-optimizations -Wconversion -Wmissing-format-attribute \ -Wredundant-decls -ansi" # -Wlogical-op -Wmissing-noreturn C_NITPICK="$CPP_NITPICK" CXX_NITPICK="$C_NITPICK" CPPFLAGS="$CPPFLAGS $CPP_NITPICK" CFLAGS="$CFLAGS $C_NITPICK" CXXFLAGS="$CXXFLAGS $CXX_NITPICK" else AC_MSG_RESULT([no]) fi AC_CONFIG_FILES([ Makefile include/Makefile lib/Makefile src/Makefile test/Makefile ]) AC_OUTPUT dnl vim:set ft=m4 sw=1: @@ -1,101 +1,120 @@ #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <cassert> #include <napkin/exception.h> #include "db.h" #include "config.h" namespace napkin { extern const char *sql_bootstrap; db_t::db_t() { const char *h = getenv("HOME"); if(h) { datadir = h; datadir += "/."PACKAGE_NAME"/"; }else{ +#if defined(HAVE_GET_CURRENT_DIR_NAME) char *cwd = get_current_dir_name(); if(!cwd) throw napkin::exception("failed to get_current_dir_name()"); datadir = cwd; free(cwd); +#elif defined(HAVE_GETCWD) + { + char cwd[ +# if defined(MAXPATH) + MAXPATH +# elif defined(MAXPATHLEN) + MAXPATHLEN +# else /* maxpath */ + 512 +#endif /* maxpath */ + ]; + if(!getcwd(cwd,sizeof(cwd))) + throw napkin::exception("failed to getcwd()"); + datadir = cwd; + } +#else /* get cwd */ +# error dunno how to get current workdir +#endif /* get cwd */ datadir += "/."PACKAGE_NAME"/"; } if(access(datadir.c_str(),R_OK|W_OK) && mkdir(datadir.c_str(),0700)) throw napkin::exception("no access to '"+datadir+"' directory"); open((datadir+PACKAGE_NAME".db").c_str()); assert(_D); char **resp; int nr,nc; char *errm; if(sqlite3_get_table( _D, "SELECT s_tobed FROM sleeps LIMIT 0", &resp,&nr,&nc,&errm)!=SQLITE_OK) { if(sqlite3_exec(_D,sql_bootstrap,NULL,NULL,&errm)!=SQLITE_OK) throw napkin::exception(string("failed to bootstrap sqlite database: ")+errm); }else sqlite3_free_table(resp); } void db_t::store(const hypnodata_t& hd) { sqlite::mem_t<char*> S = sqlite3_mprintf( "INSERT INTO sleeps (" "s_tobed,s_alarm," "s_window,s_data_a," "s_almost_awakes," "s_timezone" ") VALUES (" "%Q,%Q,%d,%d,%Q,%ld" ")", hd.w3c_to_bed().c_str(), hd.w3c_alarm().c_str(), hd.window,hd.data_a, hd.w3c_almostawakes().c_str(), timezone ); try { exec(S); }catch(sqlite::exception& se) { if(se.rcode==SQLITE_CONSTRAINT) throw exception_db_already("The record seems to be already in the database"); throw exception_db("Well, some error occured"); } } void db_t::remove(const hypnodata_t& hd) { sqlite::mem_t<char*> S = sqlite3_mprintf( "DELETE FROM sleeps" " WHERE s_tobed=%Q AND s_alarm=%Q", hd.w3c_to_bed().c_str(), hd.w3c_alarm().c_str() ); exec(S); } void db_t::load(list<hypnodata_ptr_t>& rv, const string& sql) { sqlite::table_t T; int nr,nc; get_table( string( "SELECT" " s_tobed, s_alarm," " s_window, s_data_a," " s_almost_awakes" " FROM sleeps" " "+sql).c_str(),T,&nr,&nc ); if(nr) { assert(nc==5); for(int r=1;r<=nr;++r) { hypnodata_ptr_t hd(new hypnodata_t()); hd->set_to_bed(T.get(r,0,nc)); hd->set_alarm(T.get(r,1,nc)); hd->set_window(T.get(r,2,nc)); hd->set_data_a(T.get(r,3,nc)); hd->set_almost_awakes(T.get(r,4,nc)); rv.push_back(hd); } } } } |