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; }