From 0c2ab17e91637fdc27f7b8dd5578e15a951e1420 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Sun, 5 Jul 2009 08:29:47 +0200
Subject: sticker: use GError for error handling

---
 src/main.c    |  7 ++++++-
 src/sticker.c | 47 +++++++++++++++++++++++++++++++++--------------
 src/sticker.h |  8 ++++++--
 3 files changed, 45 insertions(+), 17 deletions(-)

(limited to 'src')

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.
-- 
cgit v1.2.3