From: Paweł Szewczyk
Date: Tue, 20 Nov 2018 18:03:43 +0000 (+0100)
Subject: Improve error handling in sqlite adapter
X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Ftizen;p=platform%2Fcore%2Fsystem%2Ffaultd.git
Improve error handling in sqlite adapter
Change-Id: I02be4a093d3d2e7c43e6bb4c2cba63a4117ee916
Signed-off-by: Paweł Szewczyk
---
diff --git a/src/database/sqlite.c b/src/database/sqlite.c
index 76995a3..3107066 100644
--- a/src/database/sqlite.c
+++ b/src/database/sqlite.c
@@ -96,7 +96,7 @@ static int init_sqlite_adapter(struct faultd_module *module,
ret = sqlite3_exec(da->db, "CREATE TABLE IF NOT EXISTS " META_TABLE
"(id INTEGER PRIMARY KEY, signature TEXT)"
";", NULL, 0, &sqlite_err);
- if (ret < 0) {
+ if (ret < 0 || sqlite_err) {
log_error("SQL Error: %s\n", sqlite3_errmsg(da->db));
sqlite3_free(sqlite_err);
goto close_db;
@@ -319,8 +319,16 @@ static int get_table_match(struct faultd_database_adapter *adapter, struct fault
int _id;
query = da->stmts[STMT_FIND_TABLE];
- sqlite3_reset(query);
- sqlite3_bind_text(query, 1, signature, -1, SQLITE_TRANSIENT);
+ ret = sqlite3_reset(query);
+ if (ret != SQLITE_OK)
+ log_error("Last call with this query failed: %s", sqlite3_expanded_sql(query));
+
+ ret = sqlite3_bind_text(query, 1, signature, -1, SQLITE_TRANSIENT);
+ if (ret != SQLITE_OK) {
+ log_error("could not bind new values to the query: %s", sqlite3_errmsg(da->db));
+ return ret;
+ }
+
log_debug("query: %s", sqlite3_expanded_sql(query));
ret = sqlite3_step(query);
if (ret == SQLITE_ROW) {
@@ -354,8 +362,9 @@ static int get_table_match(struct faultd_database_adapter *adapter, struct fault
log_debug("creating table:\n%s", query_str);
ret = sqlite3_exec(da->db, query_str, NULL, 0, &sqlite_err);
- if (ret != SQLITE_OK) {
+ if (ret != SQLITE_OK || sqlite_err) {
log_error("SQL Error: %s", sqlite3_errmsg(da->db));
+ sqlite3_free(sqlite_err);
goto free_name;
}
@@ -364,8 +373,9 @@ static int get_table_match(struct faultd_database_adapter *adapter, struct fault
goto free_name;
ret = sqlite3_exec(da->db, query_str, NULL, 0, &sqlite_err);
- if (ret != SQLITE_OK) {
+ if (ret != SQLITE_OK || sqlite_err) {
log_error("SQL Error: %s", sqlite3_errmsg(da->db));
+ sqlite3_free(sqlite_err);
goto free_name;
}
@@ -643,7 +653,8 @@ static int get_from_table(struct sqlite_adapter *da, faultd_oid_t *oid, const ch
ret = sqlite3_step(query);
if (ret != SQLITE_ROW) {
log_debug("No entry in %s", name);
- return -ENOENT;
+ ret = -ENOENT;
+ goto finalize;
}
log_debug("found matching entry in %s", name);
@@ -655,6 +666,9 @@ static int get_from_table(struct sqlite_adapter *da, faultd_oid_t *oid, const ch
}
return 0;
+
+finalize:
+ sqlite3_finalize(query);
}
static int sqlite_get_by_oid(struct faultd_database_adapter *adapter, faultd_oid_t *oid, struct faultd_object *result)
@@ -673,8 +687,16 @@ static int sqlite_get_by_oid(struct faultd_database_adapter *adapter, faultd_oid
return ret;
query = da->stmts[STMT_GET_TABLE_BY_ID];
- sqlite3_reset(query);
- sqlite3_bind_int(query, 1, oid->sqlite.table);
+ ret = sqlite3_reset(query);
+ if (ret != SQLITE_OK)
+ log_error("Last call with this query failed: %s", sqlite3_expanded_sql(query));
+
+ ret = sqlite3_bind_int(query, 1, oid->sqlite.table);
+ if (ret != SQLITE_OK) {
+ log_error("could not bind new values to the query: %s", sqlite3_errmsg(da->db));
+ goto free_name;
+ }
+
log_debug("query: %s", sqlite3_expanded_sql(query));
ret = sqlite3_step(query);
if (ret != SQLITE_ROW) {
@@ -698,7 +720,12 @@ static int sqlite_get_by_oid(struct faultd_database_adapter *adapter, faultd_oid
query = da->stmts[STMT_FIND_TABLE];
sqlite3_reset(query);
- sqlite3_bind_text(query, 1, signature, -1, SQLITE_TRANSIENT);
+ ret = sqlite3_bind_text(query, 1, signature, -1, SQLITE_TRANSIENT);
+ if (ret != SQLITE_OK) {
+ log_error("could not bind new values to the query: %s", sqlite3_errmsg(da->db));
+ return ret;
+ }
+
log_debug("query: %s", sqlite3_expanded_sql(query));
ret = sqlite3_step(query);
if (ret != SQLITE_ROW) {
@@ -724,7 +751,7 @@ free_name:
static int sqlite_load(struct faultd_database_adapter *adapter, struct faultd_object *query,
struct faultd_object *hints, struct faultd_object *result, uint32_t *nr)
{
- sqlite3_stmt *sql_query, *subquery;
+ sqlite3_stmt *sql_query = NULL, *subquery = NULL;
struct sqlite_adapter *da = to_sqlite_adapter(adapter);
int ret;
const char *name, *signature;
@@ -765,13 +792,13 @@ static int sqlite_load(struct faultd_database_adapter *adapter, struct faultd_ob
ret = snprintf(query_str, BUFSIZE, "SELECT * FROM %s %s;", name, qsignature);
if (ret < 0 || ret >= BUFSIZE)
- return ret;
+ goto finalize;
log_debug("query: %s", query_str);
ret = sqlite3_prepare_v2(da->db, query_str, -1, &subquery, NULL);
if (ret != SQLITE_OK) {
log_error("SQL Error: %s", sqlite3_errmsg(da->db));
- return ret;
+ goto finalize;
}
ret = bind_values(query, subquery, 1);
@@ -794,8 +821,10 @@ static int sqlite_load(struct faultd_database_adapter *adapter, struct faultd_ob
log_debug("fetched row %u", n);
ret = snprintf(key, sizeof(key), "%u", n);
- if (ret < 0 || ret >= sizeof(key))
- return -ENOMEM;
+ if (ret < 0 || ret >= sizeof(key)) {
+ ret = -ENOMEM;
+ goto finalize;
+ }
ret = faultd_object_new(&part_result);
if (ret < 0) {
@@ -813,6 +842,9 @@ static int sqlite_load(struct faultd_database_adapter *adapter, struct faultd_ob
faultd_object_unref(part_result);
n++;
}
+
+ sqlite3_finalize(subquery);
+ subquery = NULL;
}
ret = 0;
@@ -820,6 +852,11 @@ static int sqlite_load(struct faultd_database_adapter *adapter, struct faultd_ob
finish:
if (ret == 0 && nr != NULL)
*nr = n;
+finalize:
+ if (sql_query)
+ sqlite3_finalize(sql_query);
+ if (subquery)
+ sqlite3_finalize(subquery);
return ret;
}