diff options
author | Max Kellermann <max@duempel.org> | 2009-07-05 08:29:47 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-07-05 08:29:47 +0200 |
commit | 0c2ab17e91637fdc27f7b8dd5578e15a951e1420 (patch) | |
tree | 03b31c0b0f7a7e0883832b45de5827709cfbd351 | |
parent | 12e82b9e33de5c6c8b622560fd7224f4fef113e7 (diff) | |
download | mpd-0c2ab17e91637fdc27f7b8dd5578e15a951e1420.tar.gz mpd-0c2ab17e91637fdc27f7b8dd5578e15a951e1420.tar.xz mpd-0c2ab17e91637fdc27f7b8dd5578e15a951e1420.zip |
sticker: use GError for error handling
-rw-r--r-- | src/main.c | 7 | ||||
-rw-r--r-- | src/sticker.c | 47 | ||||
-rw-r--r-- | src/sticker.h | 8 |
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. |