From 6c7e0b5b3239a1f96f7dc15f6f12d556e0b57d20 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 8 Jan 2014 16:30:15 -0600 Subject: [PATCH] Adding in some code to create a database all nice like --- CMakeLists.txt | 3 +++ service/CMakeLists.txt | 12 +++++++++ service/create-db-sql.h | 3 +++ service/create-db.c | 60 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 service/create-db-sql.h create mode 100644 service/create-db.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 97f8ee0..4c23ae9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,9 @@ include_directories(${JSONGLIB_INCLUDE_DIRS}) pkg_check_modules(DBUSTEST REQUIRED dbustest-1>=14.04.0) include_directories(${DBUSTEST_INCLUDE_DIRS}) +pkg_check_modules(SQLITE REQUIRED sqlite3) +include_directories(${SQLITE_INCLUDE_DIRS}) + if(${LOCAL_INSTALL}) set(DBUSSERVICEDIR "${CMAKE_INSTALL_DATADIR}/dbus-1/services/") else() diff --git a/service/CMakeLists.txt b/service/CMakeLists.txt index a6f7f2c..fae6f70 100644 --- a/service/CMakeLists.txt +++ b/service/CMakeLists.txt @@ -1,9 +1,13 @@ +include(UseConstantBuilder) + ########################### # Generated Lib ########################### + set(SERVICE_GENERATED_HEADERS +create-db-sql.h service-iface.h ) @@ -11,6 +15,12 @@ set(SERVICE_GENERATED_SOURCES service-iface.c ) +add_constant_template(SERVICE_GENERATED_SOURCES + create-db-sql + create_db_sql + "${CMAKE_CURRENT_SOURCE_DIR}/create-db.sql" +) + add_gdbus_codegen( OUTFILES SERVICE_GENERATED_SOURCES NAME service-iface @@ -33,6 +43,7 @@ ${JSONGLIB_LIBRARIES} ########################### add_library(dispatcher-lib STATIC + create-db.c dispatcher.h dispatcher.c) @@ -41,6 +52,7 @@ target_link_libraries(dispatcher-lib ${GLIB2_LIBRARIES} ${GOBJECT2_LIBRARIES} ${GIO2_LIBRARIES} + ${SQLITE_LIBRARIES} ) ########################### diff --git a/service/create-db-sql.h b/service/create-db-sql.h new file mode 100644 index 0000000..f0a9683 --- /dev/null +++ b/service/create-db-sql.h @@ -0,0 +1,3 @@ + +extern const char * create_db_sql; + diff --git a/service/create-db.c b/service/create-db.c new file mode 100644 index 0000000..c8178ea --- /dev/null +++ b/service/create-db.c @@ -0,0 +1,60 @@ + +#include +#include +#include "create-db-sql.h" + +sqlite3 * +create_database (void) +{ + const gchar * cachedir = g_getenv("URL_DISPATCHER_CACHE_DIR"); /* Mostly for testing */ + + if (G_LIKELY(cachedir == NULL)) { + cachedir = g_get_user_cache_dir(); + } + + gchar * urldispatchercachedir = g_build_filename(cachedir, "url-dispatcher", NULL); + if (!g_file_test(urldispatchercachedir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) { + gint cachedirokay = g_mkdir_with_parents(urldispatchercachedir, 1 << 6 | 1 << 7 | 1 << 8); // 700 + + if (cachedirokay != 0) { + g_warning("Unable to make or find cache directory '%s'", urldispatchercachedir); + g_free(urldispatchercachedir); + return NULL; + } + } + + gchar * dbfilename = g_build_filename(urldispatchercachedir, "urls.db", NULL); + g_free(urldispatchercachedir); + + gboolean dbexists = g_file_test(dbfilename, G_FILE_TEST_EXISTS); + int open_status = SQLITE_ERROR; + sqlite3 * db = NULL; + + open_status = sqlite3_open(dbfilename, &db); + if (open_status != SQLITE_OK) { + g_warning("Unable to open URL database"); + g_free(dbfilename); + if (db != NULL) { + sqlite3_close(db); + } + return NULL; + } + + g_free(dbfilename); + + if (!dbexists) { /* First usage */ + int exec_status = SQLITE_ERROR; + char * failstring = NULL; + + exec_status = sqlite3_exec(db, create_db_sql, NULL, NULL, &failstring); + + if (exec_status != SQLITE_OK) { + g_warning("Unable to create tables: %s", failstring); + sqlite3_close(db); + return NULL; + } + + } + + return db; +}