File tracker-fix-sqlite-3-44-regressions.patch of Package tracker.33568

diff --unified --recursive --text --new-file --color tracker-3.2.1.old/src/libtracker-data/tracker-data-manager.c tracker-3.2.1.new/src/libtracker-data/tracker-data-manager.c
--- tracker-3.2.1.old/src/libtracker-data/tracker-data-manager.c	2021-10-31 05:18:34.484660600 +0800
+++ tracker-3.2.1.new/src/libtracker-data/tracker-data-manager.c	2024-04-18 16:35:48.792960160 +0800
@@ -3774,12 +3774,16 @@
 	GHashTable *fts_props, *multivalued;
 	gboolean retval;
 
+	if (!create)
+		return TRUE;
+
 	ontology_get_fts_properties (manager, &fts_props, &multivalued);
-	retval = tracker_db_interface_sqlite_fts_init (iface,
-	                                               database,
-	                                               fts_props,
-	                                               multivalued, create,
-	                                               error);
+	retval = tracker_db_interface_sqlite_fts_create_table (iface,
+							       database,
+							       fts_props,
+							       multivalued,
+							       error);
+
 	g_hash_table_unref (fts_props);
 	g_hash_table_unref (multivalued);
 
diff --unified --recursive --text --new-file --color tracker-3.2.1.old/src/libtracker-data/tracker-db-interface-sqlite.c tracker-3.2.1.new/src/libtracker-data/tracker-db-interface-sqlite.c
--- tracker-3.2.1.old/src/libtracker-data/tracker-db-interface-sqlite.c	2021-10-31 05:18:34.486660700 +0800
+++ tracker-3.2.1.new/src/libtracker-data/tracker-db-interface-sqlite.c	2024-04-18 16:13:01.191293954 +0800
@@ -35,6 +35,7 @@
 #include <libtracker-sparql/tracker-private.h>
 
 #include <libtracker-fts/tracker-fts.h>
+#include <libtracker-fts/tracker-fts-tokenizer.h>
 
 
 #ifdef HAVE_LIBUNISTRING
@@ -2264,22 +2265,28 @@
 }
 
 gboolean
-tracker_db_interface_sqlite_fts_init (TrackerDBInterface  *db_interface,
-                                      const gchar         *database,
-                                      GHashTable          *properties,
-                                      GHashTable          *multivalued,
-                                      gboolean             create,
-                                      GError             **error)
+tracker_db_interface_sqlite_fts_init (TrackerDBInterface     *db_interface,
+				      TrackerDBManagerFlags   fts_flags,
+				      GError                **error)
+{
+	return tracker_tokenizer_initialize (db_interface->db,
+					     db_interface,
+					     fts_flags,
+					     db_interface->user_data,
+					     error);
+}
+
+gboolean
+tracker_db_interface_sqlite_fts_create_table (TrackerDBInterface  *db_interface,
+					      const gchar         *database,
+					      GHashTable          *properties,
+					      GHashTable          *multivalued,
+					      GError             **error)
 {
 	GError *inner_error = NULL;
 	GStrv fts_columns;
 
-	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",
+	if (!tracker_fts_create_table (db_interface->db, database, "fts5",
 	                               properties, multivalued,
 	                               &inner_error)) {
 		g_propagate_prefixed_error (error,
diff --unified --recursive --text --new-file --color tracker-3.2.1.old/src/libtracker-data/tracker-db-interface-sqlite.h tracker-3.2.1.new/src/libtracker-data/tracker-db-interface-sqlite.h
--- tracker-3.2.1.old/src/libtracker-data/tracker-db-interface-sqlite.h	2021-10-31 05:18:34.486660700 +0800
+++ tracker-3.2.1.new/src/libtracker-data/tracker-db-interface-sqlite.h	2024-04-18 16:42:32.772261021 +0800
@@ -23,6 +23,7 @@
 #include "config.h"
 
 #include "tracker-db-interface.h"
+#include "tracker-db-manager.h"
 
 G_BEGIN_DECLS
 
@@ -49,11 +50,13 @@
                                                                         GError                  **error);
 gint64              tracker_db_interface_sqlite_get_last_insert_id     (TrackerDBInterface       *interface);
 void                tracker_db_interface_sqlite_enable_shared_cache    (void);
-gboolean            tracker_db_interface_sqlite_fts_init               (TrackerDBInterface       *interface,
+gboolean            tracker_db_interface_sqlite_fts_init               (TrackerDBInterface     *db_interface,
+									TrackerDBManagerFlags   fts_flags,
+									GError                **error);
+gboolean            tracker_db_interface_sqlite_fts_create_table       (TrackerDBInterface       *interface,
                                                                         const gchar              *database,
                                                                         GHashTable               *properties,
                                                                         GHashTable               *multivalued,
-                                                                        gboolean                  create,
                                                                         GError                  **error);
 void                tracker_db_interface_sqlite_reset_collator         (TrackerDBInterface       *interface);
 gboolean            tracker_db_interface_sqlite_wal_checkpoint         (TrackerDBInterface       *interface,
diff --unified --recursive --text --new-file --color tracker-3.2.1.old/src/libtracker-data/tracker-db-manager.c tracker-3.2.1.new/src/libtracker-data/tracker-db-manager.c
--- tracker-3.2.1.old/src/libtracker-data/tracker-db-manager.c	2021-10-31 05:18:34.486660700 +0800
+++ tracker-3.2.1.new/src/libtracker-data/tracker-db-manager.c	2024-04-18 16:15:41.265384710 +0800
@@ -827,6 +827,11 @@
 		return NULL;
 	}
 
+	if (!tracker_db_interface_sqlite_fts_init (connection,
+	                                           db_manager->flags,
+	                                           error))
+		return FALSE;
+
 	tracker_db_interface_set_max_stmt_cache_size (connection,
 	                                              TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT,
 	                                              db_manager->s_cache_size);
diff --unified --recursive --text --new-file --color tracker-3.2.1.old/src/libtracker-fts/tracker-fts.c tracker-3.2.1.new/src/libtracker-fts/tracker-fts.c
--- tracker-3.2.1.old/src/libtracker-fts/tracker-fts.c	2021-10-31 05:18:34.494660900 +0800
+++ tracker-3.2.1.new/src/libtracker-fts/tracker-fts.c	2024-04-18 16:28:42.226300032 +0800
@@ -35,63 +35,6 @@
 
 #endif
 
-static gchar **
-get_fts_properties (GHashTable  *tables)
-{
-	GList *table_columns;
-	GArray *property_names;
-	GList *keys, *l;
-
-	keys = g_hash_table_get_keys (tables);
-	keys = g_list_sort (keys, (GCompareFunc) strcmp);
-
-	property_names = g_array_new (TRUE, FALSE, sizeof (gchar *));
-
-	for (l = keys; l; l = l->next) {
-		table_columns = g_hash_table_lookup (tables, l->data);
-
-		while (table_columns) {
-			gchar *str;
-
-			str = g_strdup (table_columns->data);
-			g_array_append_val (property_names, str);
-			table_columns = table_columns->next;
-		}
-	}
-
-	g_list_free (keys);
-
-	return (gchar **) g_array_free (property_names, FALSE);
-}
-
-gboolean
-tracker_fts_init_db (sqlite3                *db,
-                     TrackerDBInterface     *interface,
-                     TrackerDBManagerFlags   flags,
-                     GHashTable             *tables,
-                     GError                **error)
-{
-	gchar **property_names;
-	gboolean retval;
-#ifndef HAVE_BUILTIN_FTS
-	gchar *err;
-
-	if (sqlite3_load_extension (db, NULL, "sqlite3_fts5_init", &err) != SQLITE_OK) {
-		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, error);
-	g_strfreev (property_names);
-
-	return retval;
-}
-
 gboolean
 tracker_fts_create_table (sqlite3      *db,
                           const gchar  *database,
diff --unified --recursive --text --new-file --color tracker-3.2.1.old/src/libtracker-fts/tracker-fts.h tracker-3.2.1.new/src/libtracker-fts/tracker-fts.h
--- tracker-3.2.1.old/src/libtracker-fts/tracker-fts.h	2021-10-31 05:18:34.494660900 +0800
+++ tracker-3.2.1.new/src/libtracker-fts/tracker-fts.h	2024-04-18 16:29:10.576549381 +0800
@@ -29,11 +29,6 @@
 
 G_BEGIN_DECLS
 
-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,
diff --unified --recursive --text --new-file --color tracker-3.2.1.old/src/libtracker-fts/tracker-fts-tokenizer.c tracker-3.2.1.new/src/libtracker-fts/tracker-fts-tokenizer.c
--- tracker-3.2.1.old/src/libtracker-fts/tracker-fts-tokenizer.c	2021-10-31 05:18:34.494660900 +0800
+++ tracker-3.2.1.new/src/libtracker-fts/tracker-fts-tokenizer.c	2024-04-18 16:27:01.832038848 +0800
@@ -49,6 +49,7 @@
 
 struct TrackerTokenizerFunctionData {
 	TrackerDBInterface *interface;
+	TrackerDataManager *data_manager;
 	gchar **property_names;
 };
 
@@ -187,6 +188,37 @@
 	return SQLITE_OK;
 }
 
+static gboolean
+ensure_fts_properties (TrackerTokenizerFunctionData *data)
+{
+	TrackerOntologies *ontologies;
+	TrackerProperty **properties;
+	GArray *property_names;
+	guint i, len;
+
+	if (data->property_names)
+		return data->property_names[0] != NULL;
+
+	ontologies = tracker_data_manager_get_ontologies (data->data_manager);
+
+	property_names = g_array_new (TRUE, FALSE, sizeof (gchar *));
+	properties = tracker_ontologies_get_properties (ontologies, &len);
+
+	for (i = 0; i < len; i++) {
+		gchar *column;
+
+		if (!tracker_property_get_fulltext_indexed (properties[i]))
+			continue;
+
+		column = g_strdup (tracker_property_get_name (properties[i]));
+		g_array_append_val (property_names, column);
+	}
+
+	data->property_names = (gchar **) g_array_free (property_names, FALSE);
+
+	return data->property_names[0] != NULL;
+}
+
 static void
 tracker_offsets_function (const Fts5ExtensionApi  *api,
                           Fts5Context             *fts_ctx,
@@ -207,6 +239,12 @@
 	}
 
 	data = api->xUserData (fts_ctx);
+
+	if (!ensure_fts_properties (data)) {
+		sqlite3_result_null (ctx);
+		return;
+	}
+
 	rc = api->xInstCount (fts_ctx, &n_hits);
 
 	if (rc != SQLITE_OK) {
@@ -349,6 +387,12 @@
 
 	n_columns = api->xColumnCount (fts_ctx);
 	data = api->xUserData (fts_ctx);
+
+	if (!ensure_fts_properties (data)) {
+		sqlite3_result_null (ctx);
+		return;
+	}
+
 	weights = get_fts_weights (data->interface, ctx);
 
 	if (!weights) {
@@ -424,14 +468,14 @@
 }
 
 static TrackerTokenizerFunctionData *
-tracker_tokenizer_function_data_new (TrackerDBInterface  *interface,
-                                     const gchar        **property_names)
+tracker_tokenizer_function_data_new (TrackerDBInterface *interface,
+                                     TrackerDataManager *data_manager)
 {
 	TrackerTokenizerFunctionData *data;
 
 	data = g_new0 (TrackerTokenizerFunctionData, 1);
 	data->interface = interface;
-	data->property_names = g_strdupv ((gchar **) property_names);
+	data->data_manager = data_manager;
 
 	return data;
 }
@@ -447,7 +491,7 @@
 tracker_tokenizer_initialize (sqlite3                *db,
                               TrackerDBInterface     *interface,
                               TrackerDBManagerFlags   flags,
-                              const gchar           **property_names,
+                              TrackerDataManager     *data_manager,
                               GError                **error)
 {
 	TrackerTokenizerData *data;
@@ -466,13 +510,13 @@
 	                       tracker_tokenizer_data_free);
 
 	/* Offsets */
-	func_data = tracker_tokenizer_function_data_new (interface, property_names);
+	func_data = tracker_tokenizer_function_data_new (interface, data_manager);
 	api->xCreateFunction (api, "tracker_offsets", func_data,
 	                      &tracker_offsets_function,
 	                      (GDestroyNotify) tracker_tokenizer_function_data_free);
 
 	/* Rank */
-	func_data = tracker_tokenizer_function_data_new (interface, property_names);
+	func_data = tracker_tokenizer_function_data_new (interface, data_manager);
 	api->xCreateFunction (api, "tracker_rank", func_data,
 	                      &tracker_rank_function,
 	                      (GDestroyNotify) tracker_tokenizer_function_data_free);
diff --unified --recursive --text --new-file --color tracker-3.2.1.old/src/libtracker-fts/tracker-fts-tokenizer.h tracker-3.2.1.new/src/libtracker-fts/tracker-fts-tokenizer.h
--- tracker-3.2.1.old/src/libtracker-fts/tracker-fts-tokenizer.h	2021-10-31 05:18:34.494660900 +0800
+++ tracker-3.2.1.new/src/libtracker-fts/tracker-fts-tokenizer.h	2024-04-18 16:40:25.444797053 +0800
@@ -22,6 +22,7 @@
 #include <sqlite3.h>
 #include <glib.h>
 #include <libtracker-data/tracker-db-manager.h>
+#include <libtracker-data/tracker-data-manager.h>
 
 #ifndef __TRACKER_FTS_TOKENIZER_H__
 #define __TRACKER_FTS_TOKENIZER_H__
@@ -29,7 +30,7 @@
 gboolean tracker_tokenizer_initialize (sqlite3                *db,
                                        TrackerDBInterface     *interface,
                                        TrackerDBManagerFlags   flags,
-                                       const gchar           **property_names,
+                                       TrackerDataManager     *data_manager,
                                        GError                **error);
 
 #endif /* __TRACKER_FTS_TOKENIZER_H__ */
openSUSE Build Service is sponsored by