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__ */