aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-07-05 08:29:47 +0200
committerMax Kellermann <max@duempel.org>2009-07-05 08:29:47 +0200
commit0c2ab17e91637fdc27f7b8dd5578e15a951e1420 (patch)
tree03b31c0b0f7a7e0883832b45de5827709cfbd351
parent12e82b9e33de5c6c8b622560fd7224f4fef113e7 (diff)
downloadmpd-0c2ab17e91637fdc27f7b8dd5578e15a951e1420.tar.gz
mpd-0c2ab17e91637fdc27f7b8dd5578e15a951e1420.tar.xz
mpd-0c2ab17e91637fdc27f7b8dd5578e15a951e1420.zip
sticker: use GError for error handling
-rw-r--r--src/main.c7
-rw-r--r--src/sticker.c47
-rw-r--r--src/sticker.h8
3 files changed, 45 insertions, 17 deletions
diff --git a/src/main.c b/src/main.c
index cdf403266..c19fc9324 100644
--- a/src/main.c
+++ b/src/main.c
@@ -231,6 +231,8 @@ int main(int argc, char *argv[])
Options options;
clock_t start;
bool create_db;
+ bool success;
+ GError *error = NULL;
daemonize_close_stdin();
@@ -288,7 +290,10 @@ int main(int argc, char *argv[])
create_db = !openDB(&options);
#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
command_init();
diff --git a/src/sticker.c b/src/sticker.c
index 0d30fbb70..4cccd9399 100644
--- a/src/sticker.c
+++ b/src/sticker.c
@@ -72,50 +72,69 @@ static const char sticker_sql_create[] =
static sqlite3 *sticker_db;
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 *
-sticker_prepare(const char *sql)
+sticker_prepare(const char *sql, GError **error_r)
{
int ret;
sqlite3_stmt *stmt;
ret = sqlite3_prepare_v2(sticker_db, sql, -1, &stmt, NULL);
- if (ret != SQLITE_OK)
- g_error("sqlite3_prepare_v2() failed: %s",
- sqlite3_errmsg(sticker_db));
+ if (ret != SQLITE_OK) {
+ g_set_error(error_r, sticker_quark(), ret,
+ "sqlite3_prepare_v2() failed: %s",
+ sqlite3_errmsg(sticker_db));
+ return NULL;
+ }
return stmt;
}
-void
-sticker_global_init(const char *path)
+bool
+sticker_global_init(const char *path, GError **error_r)
{
int ret;
if (path == NULL)
/* not configured */
- return;
+ return true;
/* open/create the sqlite database */
ret = sqlite3_open(path, &sticker_db);
- if (ret != SQLITE_OK)
- g_error("Failed to open sqlite database '%s': %s",
- path, sqlite3_errmsg(sticker_db));
+ if (ret != SQLITE_OK) {
+ g_set_error(error_r, sticker_quark(), ret,
+ "Failed to open sqlite database '%s': %s",
+ path, sqlite3_errmsg(sticker_db));
+ return false;
+ }
/* create the table and index */
ret = sqlite3_exec(sticker_db, sticker_sql_create, NULL, NULL, NULL);
- if (ret != SQLITE_OK)
- g_error("Failed to create sticker table: %s",
- sqlite3_errmsg(sticker_db));
+ if (ret != SQLITE_OK) {
+ g_set_error(error_r, sticker_quark(), ret,
+ "Failed to create sticker table: %s",
+ sqlite3_errmsg(sticker_db));
+ return false;
+ }
/* prepare the statements we're going to use */
for (unsigned i = 0; i < G_N_ELEMENTS(sticker_sql); ++i) {
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
diff --git a/src/sticker.h b/src/sticker.h
index 8e6410914..30d85fa18 100644
--- a/src/sticker.h
+++ b/src/sticker.h
@@ -50,9 +50,13 @@ struct sticker;
/**
* 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
-sticker_global_init(const char *path);
+bool
+sticker_global_init(const char *path, GError **error_r);
/**
* Close the sticker database.