[tracker/wip/carlosg/fts-error-propagation: 3/3] libtracker-data: Handle errors initializing the fts5 module




commit 23fb3da17bc92ccbc6f74acaa7008637f0e000b4
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Mar 13 14:11:39 2021 +0100

    libtracker-data: Handle errors initializing the fts5 module
    
    Propagate these up the stack.

 src/libtracker-data/tracker-db-interface-sqlite.c |  4 +++-
 src/libtracker-fts/tracker-fts-tokenizer.c        | 21 ++++++++++++++++-----
 src/libtracker-fts/tracker-fts-tokenizer.h        |  3 ++-
 src/libtracker-fts/tracker-fts.c                  | 16 ++++++++++------
 src/libtracker-fts/tracker-fts.h                  |  9 +++++----
 5 files changed, 36 insertions(+), 17 deletions(-)
---
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c 
b/src/libtracker-data/tracker-db-interface-sqlite.c
index 6a7dd5353..0be15c283 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.c
+++ b/src/libtracker-data/tracker-db-interface-sqlite.c
@@ -2254,7 +2254,9 @@ tracker_db_interface_sqlite_fts_init (TrackerDBInterface  *db_interface,
        GError *inner_error = NULL;
        GStrv fts_columns;
 
-       tracker_fts_init_db (db_interface->db, db_interface, db_interface->flags, properties);
+       if (!tracker_fts_init_db (db_interface->db, db_interface,
+                                 db_interface->flags, properties, error))
+               return FALSE;
 
        if (create &&
            !tracker_fts_create_table (db_interface->db, database, "fts5",
diff --git a/src/libtracker-fts/tracker-fts-tokenizer.c b/src/libtracker-fts/tracker-fts-tokenizer.c
index d2688ac3b..707e81a81 100644
--- a/src/libtracker-fts/tracker-fts-tokenizer.c
+++ b/src/libtracker-fts/tracker-fts-tokenizer.c
@@ -380,7 +380,9 @@ tracker_rank_function (const Fts5ExtensionApi  *api,
 }
 
 static fts5_api *
-get_fts5_api (sqlite3 *db) {
+get_fts5_api (sqlite3  *db,
+              GError  **error)
+{
        int rc = SQLITE_OK;
        sqlite3_stmt *stmt;
        fts5_api *api = NULL;
@@ -391,7 +393,7 @@ get_fts5_api (sqlite3 *db) {
                rc = sqlite3_prepare_v2(db, "SELECT fts5(?1)",
                                        -1, &stmt, 0);
                if (rc != SQLITE_OK)
-                       return NULL;
+                       goto error;
 
                sqlite3_bind_pointer (stmt, 1, (void*) &api, "fts5_api_ptr", NULL);
                sqlite3_step (stmt);
@@ -402,7 +404,7 @@ get_fts5_api (sqlite3 *db) {
                                        -1, &stmt, 0);
 
                if (rc != SQLITE_OK)
-                       return NULL;
+                       goto error;
 
                if (sqlite3_step (stmt) == SQLITE_ROW)
                        memcpy (&api, sqlite3_column_blob (stmt, 0), sizeof (api));
@@ -411,6 +413,14 @@ get_fts5_api (sqlite3 *db) {
        sqlite3_finalize (stmt);
 
        return api;
+
+error:
+       g_set_error (error,
+                    TRACKER_DB_INTERFACE_ERROR,
+                    TRACKER_DB_OPEN_ERROR,
+                    "Could not override fts5 tokenizer: %s",
+                    sqlite3_errstr (rc));
+       return NULL;
 }
 
 static TrackerTokenizerFunctionData *
@@ -437,14 +447,15 @@ gboolean
 tracker_tokenizer_initialize (sqlite3                *db,
                               TrackerDBInterface     *interface,
                               TrackerDBManagerFlags   flags,
-                              const gchar           **property_names)
+                              const gchar           **property_names,
+                              GError                **error)
 {
        TrackerTokenizerData *data;
        TrackerTokenizerFunctionData *func_data;
        fts5_tokenizer *tokenizer;
        fts5_api *api;
 
-       api = get_fts5_api (db);
+       api = get_fts5_api (db, error);
 
        if (!api)
                return FALSE;
diff --git a/src/libtracker-fts/tracker-fts-tokenizer.h b/src/libtracker-fts/tracker-fts-tokenizer.h
index 0065167a0..0e9da34c1 100644
--- a/src/libtracker-fts/tracker-fts-tokenizer.h
+++ b/src/libtracker-fts/tracker-fts-tokenizer.h
@@ -29,6 +29,7 @@
 gboolean tracker_tokenizer_initialize (sqlite3                *db,
                                        TrackerDBInterface     *interface,
                                        TrackerDBManagerFlags   flags,
-                                       const gchar           **property_names);
+                                       const gchar           **property_names,
+                                       GError                **error);
 
 #endif /* __TRACKER_FTS_TOKENIZER_H__ */
diff --git a/src/libtracker-fts/tracker-fts.c b/src/libtracker-fts/tracker-fts.c
index 95767f33f..55211fb81 100644
--- a/src/libtracker-fts/tracker-fts.c
+++ b/src/libtracker-fts/tracker-fts.c
@@ -65,10 +65,11 @@ get_fts_properties (GHashTable  *tables)
 }
 
 gboolean
-tracker_fts_init_db (sqlite3               *db,
-                     TrackerDBInterface    *interface,
-                     TrackerDBManagerFlags  flags,
-                     GHashTable            *tables)
+tracker_fts_init_db (sqlite3                *db,
+                     TrackerDBInterface     *interface,
+                     TrackerDBManagerFlags   flags,
+                     GHashTable             *tables,
+                     GError                **error)
 {
        gchar **property_names;
        gboolean retval;
@@ -76,13 +77,16 @@ tracker_fts_init_db (sqlite3               *db,
        gchar *err;
 
        if (sqlite3_load_extension (db, NULL, "sqlite3_fts5_init", &err) != SQLITE_OK) {
-               g_warning ("Could not load fts5 module: %s", err);
+               g_set_error (error,
+                            TRACKER_DB_INTERFACE_ERROR,
+                            TRACKER_DB_OPEN_ERROR,
+                            "Could not load fts5 module: %s", err);
                return FALSE;
        }
 #endif
 
        property_names = get_fts_properties (tables);
-       retval = tracker_tokenizer_initialize (db, interface, flags, (const gchar **) property_names);
+       retval = tracker_tokenizer_initialize (db, interface, flags, (const gchar **) property_names, error);
        g_strfreev (property_names);
 
        return retval;
diff --git a/src/libtracker-fts/tracker-fts.h b/src/libtracker-fts/tracker-fts.h
index 65f5665fa..795837f38 100644
--- a/src/libtracker-fts/tracker-fts.h
+++ b/src/libtracker-fts/tracker-fts.h
@@ -29,10 +29,11 @@
 
 G_BEGIN_DECLS
 
-gboolean    tracker_fts_init_db          (sqlite3               *db,
-                                          TrackerDBInterface    *interface,
-                                          TrackerDBManagerFlags  flags,
-                                          GHashTable            *tables);
+gboolean    tracker_fts_init_db          (sqlite3                *db,
+                                          TrackerDBInterface     *interface,
+                                          TrackerDBManagerFlags   flags,
+                                          GHashTable             *tables,
+                                          GError                **error);
 gboolean    tracker_fts_create_table     (sqlite3      *db,
                                           const gchar  *database,
                                           gchar        *table_name,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]