Improve error handling in sqlite adapter 48/193448/2 tizen
authorPaweł Szewczyk <p.szewczyk@samsung.com>
Tue, 20 Nov 2018 18:03:43 +0000 (19:03 +0100)
committerPaweł Szewczyk <p.szewczyk@samsung.com>
Tue, 20 Nov 2018 18:33:00 +0000 (19:33 +0100)
Change-Id: I02be4a093d3d2e7c43e6bb4c2cba63a4117ee916
Signed-off-by: Paweł Szewczyk <p.szewczyk@samsung.com>
src/database/sqlite.c

index 76995a3b59beae7305cfe8afb0dfaf8846430bc0..31070669f74a3097cd8622bd526764fb89525441 100644 (file)
@@ -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;
 }