Commit 0c2ab17e authored by Max Kellermann's avatar Max Kellermann

sticker: use GError for error handling

parent 12e82b9e
...@@ -231,6 +231,8 @@ int main(int argc, char *argv[]) ...@@ -231,6 +231,8 @@ int main(int argc, char *argv[])
Options options; Options options;
clock_t start; clock_t start;
bool create_db; bool create_db;
bool success;
GError *error = NULL;
daemonize_close_stdin(); daemonize_close_stdin();
...@@ -288,7 +290,10 @@ int main(int argc, char *argv[]) ...@@ -288,7 +290,10 @@ int main(int argc, char *argv[])
create_db = !openDB(&options); create_db = !openDB(&options);
#ifdef ENABLE_SQLITE #ifdef ENABLE_SQLITE
sticker_global_init(config_get_path(CONF_STICKER_FILE)); success = sticker_global_init(config_get_path(CONF_STICKER_FILE),
&error);
if (!success)
g_error("%s", error->message);
#endif #endif
command_init(); command_init();
......
...@@ -72,50 +72,69 @@ static const char sticker_sql_create[] = ...@@ -72,50 +72,69 @@ static const char sticker_sql_create[] =
static sqlite3 *sticker_db; static sqlite3 *sticker_db;
static sqlite3_stmt *sticker_stmt[G_N_ELEMENTS(sticker_sql)]; static sqlite3_stmt *sticker_stmt[G_N_ELEMENTS(sticker_sql)];
static GQuark
sticker_quark(void)
{
return g_quark_from_static_string("sticker");
}
static sqlite3_stmt * static sqlite3_stmt *
sticker_prepare(const char *sql) sticker_prepare(const char *sql, GError **error_r)
{ {
int ret; int ret;
sqlite3_stmt *stmt; sqlite3_stmt *stmt;
ret = sqlite3_prepare_v2(sticker_db, sql, -1, &stmt, NULL); ret = sqlite3_prepare_v2(sticker_db, sql, -1, &stmt, NULL);
if (ret != SQLITE_OK) if (ret != SQLITE_OK) {
g_error("sqlite3_prepare_v2() failed: %s", g_set_error(error_r, sticker_quark(), ret,
"sqlite3_prepare_v2() failed: %s",
sqlite3_errmsg(sticker_db)); sqlite3_errmsg(sticker_db));
return NULL;
}
return stmt; return stmt;
} }
void bool
sticker_global_init(const char *path) sticker_global_init(const char *path, GError **error_r)
{ {
int ret; int ret;
if (path == NULL) if (path == NULL)
/* not configured */ /* not configured */
return; return true;
/* open/create the sqlite database */ /* open/create the sqlite database */
ret = sqlite3_open(path, &sticker_db); ret = sqlite3_open(path, &sticker_db);
if (ret != SQLITE_OK) if (ret != SQLITE_OK) {
g_error("Failed to open sqlite database '%s': %s", g_set_error(error_r, sticker_quark(), ret,
"Failed to open sqlite database '%s': %s",
path, sqlite3_errmsg(sticker_db)); path, sqlite3_errmsg(sticker_db));
return false;
}
/* create the table and index */ /* create the table and index */
ret = sqlite3_exec(sticker_db, sticker_sql_create, NULL, NULL, NULL); ret = sqlite3_exec(sticker_db, sticker_sql_create, NULL, NULL, NULL);
if (ret != SQLITE_OK) if (ret != SQLITE_OK) {
g_error("Failed to create sticker table: %s", g_set_error(error_r, sticker_quark(), ret,
"Failed to create sticker table: %s",
sqlite3_errmsg(sticker_db)); sqlite3_errmsg(sticker_db));
return false;
}
/* prepare the statements we're going to use */ /* prepare the statements we're going to use */
for (unsigned i = 0; i < G_N_ELEMENTS(sticker_sql); ++i) { for (unsigned i = 0; i < G_N_ELEMENTS(sticker_sql); ++i) {
assert(sticker_sql[i] != NULL); assert(sticker_sql[i] != NULL);
sticker_stmt[i] = sticker_prepare(sticker_sql[i]); sticker_stmt[i] = sticker_prepare(sticker_sql[i], error_r);
if (sticker_stmt[i] == NULL)
return false;
} }
return true;
} }
void void
......
...@@ -50,9 +50,13 @@ struct sticker; ...@@ -50,9 +50,13 @@ struct sticker;
/** /**
* Opens the sticker database (if path is not NULL). * Opens the sticker database (if path is not NULL).
*
* @param error_r location to store the error occuring, or NULL to
* ignore errors
* @return true on success, false on error
*/ */
void bool
sticker_global_init(const char *path); sticker_global_init(const char *path, GError **error_r);
/** /**
* Close the sticker database. * Close the sticker database.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment