diff options
author | Sam Thursfield <sam@afuera.me.uk> | 2022-02-11 09:48:14 +0000 |
---|---|---|
committer | Sam Thursfield <sam@afuera.me.uk> | 2022-02-11 09:48:14 +0000 |
commit | 8249b6786197087f4476db7af21625a5e3430fb9 (patch) | |
tree | 27b7fc6f9f99a606fc6655772328b05d1f6f158a | |
parent | e0604941a56fe8d5641443fb7203242aa9a666f6 (diff) | |
parent | 977d7a69d8d4186d720ddd8af6312097a571b0a8 (diff) | |
download | tracker-8249b6786197087f4476db7af21625a5e3430fb9.tar.gz |
Merge branch 'wip/carlosg/rowid-type' into 'master'
libtracker-data: Add specific TrackerRowid type
Closes #339
See merge request GNOME/tracker!484
-rw-r--r-- | src/libtracker-data/meson.build | 1 | ||||
-rw-r--r-- | src/libtracker-data/tracker-class.c | 6 | ||||
-rw-r--r-- | src/libtracker-data/tracker-class.h | 6 | ||||
-rw-r--r-- | src/libtracker-data/tracker-data-manager.c | 45 | ||||
-rw-r--r-- | src/libtracker-data/tracker-data-manager.h | 3 | ||||
-rw-r--r-- | src/libtracker-data/tracker-data-query.c | 10 | ||||
-rw-r--r-- | src/libtracker-data/tracker-data-query.h | 6 | ||||
-rw-r--r-- | src/libtracker-data/tracker-data-update.c | 180 | ||||
-rw-r--r-- | src/libtracker-data/tracker-data-update.h | 26 | ||||
-rw-r--r-- | src/libtracker-data/tracker-ontologies.c | 16 | ||||
-rw-r--r-- | src/libtracker-data/tracker-ontologies.h | 4 | ||||
-rw-r--r-- | src/libtracker-data/tracker-property.c | 6 | ||||
-rw-r--r-- | src/libtracker-data/tracker-property.h | 4 | ||||
-rw-r--r-- | src/libtracker-data/tracker-rowid.c | 39 | ||||
-rw-r--r-- | src/libtracker-data/tracker-rowid.h | 38 | ||||
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 44 | ||||
-rw-r--r-- | src/libtracker-data/tracker-vtab-triples.c | 27 | ||||
-rw-r--r-- | src/libtracker-sparql/direct/tracker-direct-batch.c | 3 | ||||
-rw-r--r-- | src/libtracker-sparql/direct/tracker-direct.c | 30 |
19 files changed, 296 insertions, 198 deletions
diff --git a/src/libtracker-data/meson.build b/src/libtracker-data/meson.build index b367edd12..562c6f735 100644 --- a/src/libtracker-data/meson.build +++ b/src/libtracker-data/meson.build @@ -24,6 +24,7 @@ libtracker_data = static_library('tracker-data', 'tracker-ontology.c', 'tracker-ontologies.c', 'tracker-property.c', + 'tracker-rowid.c', 'tracker-string-builder.c', 'tracker-sparql-parser.c', 'tracker-sparql-types.c', diff --git a/src/libtracker-data/tracker-class.c b/src/libtracker-data/tracker-class.c index c83879f86..3a9eac370 100644 --- a/src/libtracker-data/tracker-class.c +++ b/src/libtracker-data/tracker-class.c @@ -34,7 +34,7 @@ typedef struct _TrackerClassPrivate TrackerClassPrivate; struct _TrackerClassPrivate { gchar *uri; gchar *name; - gint id; + TrackerRowid id; guint is_new : 1; guint db_schema_changed : 1; guint notify : 1; @@ -189,7 +189,7 @@ tracker_class_get_name (TrackerClass *service) return priv->name; } -gint +TrackerRowid tracker_class_get_id (TrackerClass *service) { TrackerClassPrivate *priv; @@ -367,7 +367,7 @@ tracker_class_set_uri (TrackerClass *service, void tracker_class_set_id (TrackerClass *service, - gint value) + TrackerRowid value) { TrackerClassPrivate *priv; diff --git a/src/libtracker-data/tracker-class.h b/src/libtracker-data/tracker-class.h index e806c035f..c57631595 100644 --- a/src/libtracker-data/tracker-class.h +++ b/src/libtracker-data/tracker-class.h @@ -23,6 +23,8 @@ #include <glib-object.h> +#include "tracker-rowid.h" + G_BEGIN_DECLS #if !defined (__LIBTRACKER_DATA_INSIDE__) && !defined (TRACKER_COMPILATION) @@ -53,7 +55,7 @@ GType tracker_class_get_type (void) G_GNUC_CONST; TrackerClass * tracker_class_new (gboolean use_gvdb); const gchar * tracker_class_get_uri (TrackerClass *service); const gchar * tracker_class_get_name (TrackerClass *service); -gint tracker_class_get_id (TrackerClass *service); +TrackerRowid tracker_class_get_id (TrackerClass *service); gboolean tracker_class_get_is_new (TrackerClass *service); gboolean tracker_class_get_db_schema_changed (TrackerClass *service); gboolean tracker_class_get_notify (TrackerClass *service); @@ -78,7 +80,7 @@ void tracker_class_del_domain_index (TrackerClass *ser void tracker_class_reset_domain_indexes (TrackerClass *service); void tracker_class_reset_super_classes (TrackerClass *service); void tracker_class_set_id (TrackerClass *service, - gint id); + TrackerRowid id); void tracker_class_set_is_new (TrackerClass *service, gboolean value); void tracker_class_set_db_schema_changed (TrackerClass *service, diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c index ca51c9e4f..1fbd45bac 100644 --- a/src/libtracker-data/tracker-data-manager.c +++ b/src/libtracker-data/tracker-data-manager.c @@ -172,7 +172,7 @@ tracker_data_manager_initialize_graphs (TrackerDataManager *manager, graphs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - NULL); + (GDestroyNotify) tracker_rowid_free); stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, error, "SELECT ID, Uri FROM Resource WHERE ID IN (SELECT ID FROM Graph)"); @@ -191,13 +191,13 @@ tracker_data_manager_initialize_graphs (TrackerDataManager *manager, while (tracker_db_cursor_iter_next (cursor, NULL, NULL)) { const gchar *name; - gint id; + TrackerRowid id; id = tracker_db_cursor_get_int (cursor, 0); name = tracker_db_cursor_get_string (cursor, 1, NULL); g_hash_table_insert (graphs, g_strdup (name), - GINT_TO_POINTER (id)); + tracker_rowid_copy (&id)); } g_object_unref (cursor); @@ -575,7 +575,7 @@ update_property_value (TrackerDataManager *manager, if (!unsup_onto_err) { GValue value = G_VALUE_INIT; - gint64 subject_id = 0; + TrackerRowid subject_id = 0; tracker_data_query_string_to_value (manager, str, NULL, @@ -614,7 +614,7 @@ update_property_value (TrackerDataManager *manager, if (!error && needed && object) { GValue value = G_VALUE_INIT; - gint64 subject_id = 0; + TrackerRowid subject_id = 0; tracker_data_query_string_to_value (manager, object, NULL, @@ -858,7 +858,7 @@ tracker_data_ontology_load_statement (TrackerDataManager *manager, if (g_strcmp0 (predicate, RDF_TYPE) == 0) { if (g_strcmp0 (object, RDFS_CLASS) == 0) { TrackerClass *class; - gint subject_id; + TrackerRowid subject_id; class = tracker_ontologies_get_class_by_uri (manager->ontologies, subject); @@ -903,7 +903,7 @@ tracker_data_ontology_load_statement (TrackerDataManager *manager, g_object_unref (class); } else if (g_strcmp0 (object, RDF_PROPERTY) == 0) { TrackerProperty *property; - gint subject_id; + TrackerRowid subject_id; property = tracker_ontologies_get_property_by_uri (manager->ontologies, subject); if (property != NULL) { @@ -1550,7 +1550,7 @@ check_for_deleted_domain_index (TrackerDataManager *manager, TrackerProperty *prop = l->data; const gchar *uri; GValue value = G_VALUE_INIT; - gint64 class_id = 0; + TrackerRowid class_id = 0; TRACKER_NOTE (ONTOLOGY_CHANGES, g_message ("Ontology change: deleting nrl:domainIndex: %s", @@ -1741,7 +1741,7 @@ check_for_deleted_super_properties (TrackerDataManager *manager, const gchar *object = tracker_property_get_uri (prop_to_remove); const gchar *subject = tracker_property_get_uri (property); GValue value = G_VALUE_INIT; - gint64 subject_id; + TrackerRowid subject_id; property = tracker_ontologies_get_property_by_uri (ontologies, TRACKER_PREFIX_RDFS "subPropertyOf"); @@ -2220,7 +2220,7 @@ tracker_data_ontology_process_statement (TrackerDataManager *manager, { TrackerProperty *property; GValue value = G_VALUE_INIT; - gint64 subject_id = 0; + TrackerRowid subject_id = 0; if (g_strcmp0 (predicate, RDF_TYPE) == 0) { if (g_strcmp0 (object, RDFS_CLASS) == 0) { @@ -2599,7 +2599,7 @@ db_get_static_data (TrackerDBInterface *iface, while (tracker_db_cursor_iter_next (cursor, NULL, &internal_error)) { TrackerClass *class; const gchar *uri; - gint id; + TrackerRowid id; GValue value = { 0 }; gboolean notify; @@ -2668,7 +2668,7 @@ db_get_static_data (TrackerDBInterface *iface, const gchar *uri, *domain_uri, *range_uri, *secondary_index_uri; gboolean multi_valued, indexed, fulltext_indexed; gboolean is_inverse_functional_property; - gint id; + TrackerRowid id; property = tracker_property_new (FALSE); @@ -2775,7 +2775,7 @@ static void insert_uri_in_resource_table (TrackerDataManager *manager, TrackerDBInterface *iface, const gchar *uri, - gint id, + TrackerRowid id, GError **error) { TrackerDBStatement *stmt; @@ -4057,14 +4057,17 @@ update_attached_databases (TrackerDBInterface *iface, g_hash_table_remove (data_manager->graphs, name); *changed = TRUE; } else if (tracker_db_cursor_get_int (cursor, 2)) { + TrackerRowid id; + if (!tracker_db_manager_attach_database (data_manager->db_manager, iface, name, FALSE, error)) { retval = FALSE; break; } + id = tracker_db_cursor_get_int (cursor, 3); g_hash_table_insert (data_manager->graphs, g_strdup (name), - GINT_TO_POINTER (tracker_db_cursor_get_int (cursor, 3))); + tracker_rowid_copy (&id)); *changed = TRUE; } } @@ -5058,11 +5061,11 @@ copy_graphs (GHashTable *graphs) copy = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - NULL); + (GDestroyNotify) tracker_rowid_free); g_hash_table_iter_init (&iter, graphs); while (g_hash_table_iter_next (&iter, &key, &value)) - g_hash_table_insert (copy, g_strdup (key), value); + g_hash_table_insert (copy, g_strdup (key), tracker_rowid_copy (value)); return copy; } @@ -5073,8 +5076,7 @@ tracker_data_manager_create_graph (TrackerDataManager *manager, GError **error) { TrackerDBInterface *iface; - gint id; - + TrackerRowid id; iface = tracker_db_manager_get_writable_db_interface (manager->db_manager); @@ -5096,7 +5098,8 @@ tracker_data_manager_create_graph (TrackerDataManager *manager, if (!manager->transaction_graphs) manager->transaction_graphs = copy_graphs (manager->graphs); - g_hash_table_insert (manager->transaction_graphs, g_strdup (name), GINT_TO_POINTER (id)); + g_hash_table_insert (manager->transaction_graphs, g_strdup (name), + tracker_rowid_copy (&id)); return TRUE; @@ -5137,13 +5140,13 @@ tracker_data_manager_drop_graph (TrackerDataManager *manager, return TRUE; } -gint +TrackerRowid tracker_data_manager_find_graph (TrackerDataManager *manager, const gchar *name, gboolean in_transaction) { GHashTable *graphs; - gint graph_id; + TrackerRowid graph_id; graphs = tracker_data_manager_get_graphs (manager, in_transaction); graph_id = GPOINTER_TO_UINT (g_hash_table_lookup (graphs, name)); diff --git a/src/libtracker-data/tracker-data-manager.h b/src/libtracker-data/tracker-data-manager.h index 47f8c07f9..c132f2b0c 100644 --- a/src/libtracker-data/tracker-data-manager.h +++ b/src/libtracker-data/tracker-data-manager.h @@ -37,6 +37,7 @@ typedef struct _TrackerDataManagerClass TrackerDataManagerClass; #include <libtracker-common/tracker-common.h> #include <libtracker-sparql/tracker-ontologies.h> +#include <libtracker-data/tracker-rowid.h> #include <libtracker-data/tracker-data-update.h> #include <libtracker-data/tracker-db-interface.h> #include <libtracker-data/tracker-db-manager.h> @@ -98,7 +99,7 @@ gboolean tracker_data_manager_copy_graph (TrackerDataManager *mana GHashTable * tracker_data_manager_get_graphs (TrackerDataManager *manager, gboolean in_transaction); -gint tracker_data_manager_find_graph (TrackerDataManager *manager, +TrackerRowid tracker_data_manager_find_graph (TrackerDataManager *manager, const gchar *name, gboolean in_transaction); diff --git a/src/libtracker-data/tracker-data-query.c b/src/libtracker-data/tracker-data-query.c index f4a191e6f..09f41961e 100644 --- a/src/libtracker-data/tracker-data-query.c +++ b/src/libtracker-data/tracker-data-query.c @@ -36,7 +36,7 @@ GPtrArray* tracker_data_query_rdf_type (TrackerDataManager *manager, const gchar *graph, - gint64 id, + TrackerRowid id, GError **error) { TrackerDBCursor *cursor = NULL; @@ -97,7 +97,7 @@ tracker_data_query_rdf_type (TrackerDataManager *manager, gchar * tracker_data_query_resource_urn (TrackerDataManager *manager, TrackerDBInterface *iface, - gint64 id) + TrackerRowid id) { TrackerDBCursor *cursor = NULL; TrackerDBStatement *stmt; @@ -125,7 +125,7 @@ tracker_data_query_resource_urn (TrackerDataManager *manager, return uri; } -gint64 +TrackerRowid tracker_data_query_resource_id (TrackerDataManager *manager, TrackerDBInterface *iface, const gchar *uri, @@ -134,7 +134,7 @@ tracker_data_query_resource_id (TrackerDataManager *manager, TrackerDBCursor *cursor = NULL; TrackerDBStatement *stmt; GError *inner_error = NULL; - gint64 id = 0; + TrackerRowid id = 0; g_return_val_if_fail (uri != NULL, 0); @@ -193,7 +193,7 @@ tracker_data_query_string_to_value (TrackerDataManager *manager, GError **error) { TrackerData *data; - gint64 object_id; + TrackerRowid object_id; gchar *datetime_str; GDateTime *datetime; diff --git a/src/libtracker-data/tracker-data-query.h b/src/libtracker-data/tracker-data-query.h index 9d916e8dc..254ae97ce 100644 --- a/src/libtracker-data/tracker-data-query.h +++ b/src/libtracker-data/tracker-data-query.h @@ -36,8 +36,8 @@ G_BEGIN_DECLS gchar * tracker_data_query_resource_urn (TrackerDataManager *manager, TrackerDBInterface *iface, - gint64 id); -gint64 tracker_data_query_resource_id (TrackerDataManager *manager, + TrackerRowid id); +TrackerRowid tracker_data_query_resource_id (TrackerDataManager *manager, TrackerDBInterface *iface, const gchar *uri, GError **error); @@ -47,7 +47,7 @@ TrackerDBCursor *tracker_data_query_sparql_cursor (TrackerDataManager *mana GPtrArray* tracker_data_query_rdf_type (TrackerDataManager *manager, const gchar *graph, - gint64 id, + TrackerRowid id, GError **error); gboolean tracker_data_query_string_to_value (TrackerDataManager *manager, diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c index c090f63dc..1934a22e3 100644 --- a/src/libtracker-data/tracker-data-update.c +++ b/src/libtracker-data/tracker-data-update.c @@ -59,7 +59,7 @@ struct _TrackerDataUpdateBuffer { struct _TrackerDataUpdateBufferGraph { gchar *graph; - gint64 id; + TrackerRowid id; /* string -> TrackerDataUpdateBufferResource */ GHashTable *resources; @@ -69,7 +69,7 @@ struct _TrackerDataUpdateBufferGraph { struct _TrackerDataUpdateBufferResource { const TrackerDataUpdateBufferGraph *graph; - gint64 id; + TrackerRowid id; gboolean create; gboolean modified; /* TrackerProperty -> GArray */ @@ -157,18 +157,18 @@ static gboolean update_resource_single (TrackerData *data, TrackerResource *resource, GHashTable *visited, GHashTable *bnodes, - gint64 *id, + TrackerRowid *id, GError **error); void tracker_data_insert_statement_with_uri (TrackerData *data, const gchar *graph, - gint64 subject, + TrackerRowid subject, TrackerProperty *predicate, const GValue *object, GError **error); void tracker_data_insert_statement_with_string (TrackerData *data, const gchar *graph, - gint64 subject, + TrackerRowid subject, TrackerProperty *predicate, const GValue *object, GError **error); @@ -316,9 +316,9 @@ tracker_data_remove_insert_statement_callback (TrackerData *data, } void -tracker_data_dispatch_insert_statement_callbacks (TrackerData *data, - gint64 predicate_id, - gint64 class_id) +tracker_data_dispatch_insert_statement_callbacks (TrackerData *data, + TrackerRowid predicate_id, + TrackerRowid class_id) { if (data->insert_callbacks) { guint n; @@ -377,9 +377,9 @@ tracker_data_remove_delete_statement_callback (TrackerData *data, } void -tracker_data_dispatch_delete_statement_callbacks (TrackerData *data, - gint64 predicate_id, - gint64 class_id) +tracker_data_dispatch_delete_statement_callbacks (TrackerData *data, + TrackerRowid predicate_id, + TrackerRowid class_id) { if (data->delete_callbacks) { guint n; @@ -654,13 +654,13 @@ cache_delete_value (TrackerData *data, g_array_append_val (table->properties, property); } -static gint64 +static TrackerRowid query_resource_id (TrackerData *data, const gchar *uri, GError **error) { TrackerDBInterface *iface; - gint64 *value, id; + TrackerRowid *value, id; value = g_hash_table_lookup (data->update_buffer.resource_cache, uri); @@ -669,9 +669,8 @@ query_resource_id (TrackerData *data, id = tracker_data_query_resource_id (data->manager, iface, uri, error); if (id != 0) { - value = g_new0 (gint64, 1); - *value = id; - g_hash_table_insert (data->update_buffer.resource_cache, g_strdup (uri), value); + g_hash_table_insert (data->update_buffer.resource_cache, g_strdup (uri), + tracker_rowid_copy (&id)); } return id; @@ -680,7 +679,7 @@ query_resource_id (TrackerData *data, return *value; } -gint64 +TrackerRowid tracker_data_update_ensure_resource (TrackerData *data, const gchar *uri, GError **error) @@ -691,7 +690,7 @@ tracker_data_update_ensure_resource (TrackerData *data, TrackerDBStatement *stmt = NULL; GError *inner_error = NULL; gchar *key; - gint64 *value, id; + TrackerRowid *value, id; value = g_hash_table_lookup (data->update_buffer.resource_cache, uri); @@ -741,13 +740,11 @@ tracker_data_update_ensure_resource (TrackerData *data, id = tracker_db_interface_sqlite_get_last_insert_id (iface); key = g_strdup (uri); - value = g_new0 (gint64, 1); - *value = id; - g_hash_table_insert (data->update_buffer.resource_cache, key, value); + g_hash_table_insert (data->update_buffer.resource_cache, key, + tracker_rowid_copy (&id)); - value = g_new0 (gint64, 1); - *value = id; - g_hash_table_add (data->update_buffer.new_resources, value); + g_hash_table_add (data->update_buffer.new_resources, + tracker_rowid_copy (&id)); return id; } @@ -1065,28 +1062,26 @@ tracker_data_resource_buffer_flush (TrackerData *data, } static void -tracker_data_update_refcount (TrackerData *data, - gint64 id, - gint refcount) +tracker_data_update_refcount (TrackerData *data, + TrackerRowid id, + gint refcount) { const TrackerDataUpdateBufferGraph *graph; gint old_refcount; - gint64 *value; g_assert (data->resource_buffer != NULL); graph = data->resource_buffer->graph; old_refcount = GPOINTER_TO_INT (g_hash_table_lookup (graph->refcounts, &id)); - value = g_new0 (gint64, 1); - *value = id; - g_hash_table_insert (graph->refcounts, value, + g_hash_table_insert (graph->refcounts, + tracker_rowid_copy (&id), GINT_TO_POINTER (old_refcount + refcount)); } static void -tracker_data_resource_ref (TrackerData *data, - gint64 id, - gboolean multivalued) +tracker_data_resource_ref (TrackerData *data, + TrackerRowid id, + gboolean multivalued) { if (multivalued) tracker_data_update_refcount (data, data->resource_buffer->id, 1); @@ -1095,9 +1090,9 @@ tracker_data_resource_ref (TrackerData *data, } static void -tracker_data_resource_unref (TrackerData *data, - gint64 id, - gboolean multivalued) +tracker_data_resource_unref (TrackerData *data, + TrackerRowid id, + gboolean multivalued) { if (multivalued) tracker_data_update_refcount (data, data->resource_buffer->id, -1); @@ -1140,7 +1135,7 @@ tracker_data_flush_graph_refcounts (TrackerData *data, TrackerDBStatement *stmt; GHashTableIter iter; gpointer key, value; - gint64 id; + TrackerRowid id; gint refcount; GError *inner_error = NULL; const gchar *database; @@ -1161,7 +1156,7 @@ tracker_data_flush_graph_refcounts (TrackerData *data, g_hash_table_iter_init (&iter, graph->refcounts); while (g_hash_table_iter_next (&iter, &key, &value)) { - id = *(gint64*) key; + id = *(TrackerRowid *) key; refcount = GPOINTER_TO_INT (value); if (refcount > 0) { @@ -1318,7 +1313,7 @@ cache_create_service_decomposed (TrackerData *data, TrackerProperty **domain_indexes; GValue gvalue = { 0 }; guint i; - gint64 class_id; + TrackerRowid class_id; TrackerOntologies *ontologies; /* also create instance of all super classes */ @@ -1710,13 +1705,13 @@ get_old_property_values (TrackerData *data, return old_values; } -static gint64 +static TrackerRowid get_bnode_id (GHashTable *bnodes, - TrackerData *data, + TrackerData *data, const gchar *str, GError **error) { - gint64 *value, bnode_id; + TrackerRowid *value, bnode_id; value = g_hash_table_lookup (bnodes, str); if (value) @@ -1726,14 +1721,13 @@ get_bnode_id (GHashTable *bnodes, if (bnode_id == 0) return 0; - value = g_new0 (gint64, 1); - *value = bnode_id; - g_hash_table_insert (bnodes, g_strdup (str), value); + g_hash_table_insert (bnodes, g_strdup (str), + tracker_rowid_copy (&bnode_id)); return bnode_id; } -static gint64 +static TrackerRowid get_bnode_for_resource (GHashTable *bnodes, TrackerData *data, TrackerResource *resource, @@ -2159,7 +2153,8 @@ ensure_graph_buffer (TrackerDataUpdateBuffer *buffer, graph_buffer = g_slice_new0 (TrackerDataUpdateBufferGraph); graph_buffer->refcounts = - g_hash_table_new_full (g_int64_hash, g_int64_equal, g_free, NULL); + g_hash_table_new_full (tracker_rowid_hash, tracker_rowid_equal, + (GDestroyNotify) tracker_rowid_free, NULL); graph_buffer->graph = g_strdup (name); if (graph_buffer->graph) { graph_buffer->id = tracker_data_manager_find_graph (data->manager, @@ -2168,7 +2163,7 @@ ensure_graph_buffer (TrackerDataUpdateBuffer *buffer, } graph_buffer->resources = - g_hash_table_new_full (g_int64_hash, g_int64_equal, NULL, + g_hash_table_new_full (tracker_rowid_hash, tracker_rowid_equal, NULL, (GDestroyNotify) resource_buffer_free); g_ptr_array_add (buffer->graphs, graph_buffer); @@ -2176,10 +2171,10 @@ ensure_graph_buffer (TrackerDataUpdateBuffer *buffer, } static gboolean -resource_buffer_switch (TrackerData *data, - const gchar *graph, - gint64 subject, - GError **error) +resource_buffer_switch (TrackerData *data, + const gchar *graph, + TrackerRowid subject, + GError **error) { TrackerDataUpdateBufferGraph *graph_buffer; GError *inner_error = NULL; @@ -2250,7 +2245,7 @@ resource_buffer_switch (TrackerData *data, void tracker_data_delete_statement (TrackerData *data, const gchar *graph, - gint64 subject, + TrackerRowid subject, TrackerProperty *predicate, const GValue *object, GError **error) @@ -2271,7 +2266,7 @@ tracker_data_delete_statement (TrackerData *data, if (predicate == tracker_ontologies_get_rdf_type (ontologies)) { const gchar *object_str = NULL; - gint64 object_id = g_value_get_int64 (object); + TrackerRowid object_id = g_value_get_int64 (object); object_str = tracker_ontologies_get_uri_by_id (ontologies, object_id); class = tracker_ontologies_get_class_by_uri (ontologies, object_str); @@ -2284,7 +2279,7 @@ tracker_data_delete_statement (TrackerData *data, "Class '%s' not found in the ontology", object_str); } } else { - gint64 pred_id; + TrackerRowid pred_id; pred_id = tracker_property_get_id (predicate); data->has_persistent = TRUE; @@ -2301,7 +2296,7 @@ tracker_data_delete_statement (TrackerData *data, static gboolean delete_all_helper (TrackerData *data, const gchar *graph, - gint64 subject, + TrackerRowid subject, TrackerProperty *subproperty, TrackerProperty *property, GArray *old_values, @@ -2374,11 +2369,11 @@ delete_all_helper (TrackerData *data, } static gboolean -tracker_data_delete_all (TrackerData *data, - const gchar *graph, - gint64 subject, - const gchar *predicate, - GError **error) +tracker_data_delete_all (TrackerData *data, + const gchar *graph, + TrackerRowid subject, + const gchar *predicate, + GError **error) { TrackerOntologies *ontologies; TrackerProperty *property; @@ -2409,12 +2404,12 @@ tracker_data_delete_all (TrackerData *data, } static gboolean -delete_single_valued (TrackerData *data, - const gchar *graph, - gint64 subject, - TrackerProperty *predicate, - gboolean super_is_single_valued, - GError **error) +delete_single_valued (TrackerData *data, + const gchar *graph, + TrackerRowid subject, + TrackerProperty *predicate, + gboolean super_is_single_valued, + GError **error) { TrackerProperty **super_properties; gboolean multiple_values; @@ -2469,7 +2464,7 @@ delete_single_valued (TrackerData *data, void tracker_data_insert_statement (TrackerData *data, const gchar *graph, - gint64 subject, + TrackerRowid subject, TrackerProperty *predicate, const GValue *object, GError **error) @@ -2489,14 +2484,14 @@ tracker_data_insert_statement (TrackerData *data, void tracker_data_insert_statement_with_uri (TrackerData *data, const gchar *graph, - gint64 subject, + TrackerRowid subject, TrackerProperty *predicate, const GValue *object, GError **error) { GError *actual_error = NULL; TrackerClass *class; - gint64 prop_id = 0; + TrackerRowid prop_id = 0; gboolean change = FALSE; TrackerOntologies *ontologies; @@ -2518,7 +2513,7 @@ tracker_data_insert_statement_with_uri (TrackerData *data, if (predicate == tracker_ontologies_get_rdf_type (ontologies)) { const gchar *object_str = NULL; - gint64 object_id; + TrackerRowid object_id; object_id = g_value_get_int64 (object); object_str = tracker_ontologies_get_uri_by_id (ontologies, object_id); @@ -2554,14 +2549,14 @@ tracker_data_insert_statement_with_uri (TrackerData *data, void tracker_data_insert_statement_with_string (TrackerData *data, const gchar *graph, - gint64 subject, + TrackerRowid subject, TrackerProperty *predicate, const GValue *object, GError **error) { GError *actual_error = NULL; gboolean change; - gint64 pred_id = 0; + TrackerRowid pred_id = 0; g_return_if_fail (subject != 0); g_return_if_fail (predicate != NULL); @@ -2595,7 +2590,7 @@ tracker_data_insert_statement_with_string (TrackerData *data, void tracker_data_update_statement (TrackerData *data, const gchar *graph, - gint64 subject, + TrackerRowid subject, TrackerProperty *predicate, const GValue *object, GError **error) @@ -2690,8 +2685,10 @@ tracker_data_begin_transaction (TrackerData *data, data->has_persistent = FALSE; if (data->update_buffer.resource_cache == NULL) { - data->update_buffer.resource_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - data->update_buffer.new_resources = g_hash_table_new_full (g_int64_hash, g_int64_equal, g_free, NULL); + data->update_buffer.resource_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, + (GDestroyNotify) tracker_rowid_free); + data->update_buffer.new_resources = g_hash_table_new_full (tracker_rowid_hash, tracker_rowid_equal, + (GDestroyNotify) tracker_rowid_free, NULL); /* used for normal transactions */ data->update_buffer.graphs = g_ptr_array_new_with_free_func ((GDestroyNotify) graph_buffer_free); } @@ -2884,7 +2881,7 @@ tracker_data_load_turtle_file (TrackerData *data, &inner_error)) { TrackerProperty *predicate; GValue object = G_VALUE_INIT; - gint64 subject; + TrackerRowid subject; predicate = tracker_ontologies_get_property_by_uri (ontologies, predicate_str); if (predicate == NULL) { @@ -2951,14 +2948,14 @@ failed: g_free (ontology_uri); } -gint64 +TrackerRowid tracker_data_ensure_graph (TrackerData *data, const gchar *uri, GError **error) { TrackerDBInterface *iface; TrackerDBStatement *stmt; - gint64 id; + TrackerRowid id; id = tracker_data_update_ensure_resource (data, uri, error); if (id == 0) @@ -2984,7 +2981,7 @@ tracker_data_delete_graph (TrackerData *data, { TrackerDBInterface *iface; TrackerDBStatement *stmt; - gint64 id; + TrackerRowid id; id = query_resource_id (data, uri, error); if (id == 0) @@ -3007,7 +3004,7 @@ static gboolean resource_maybe_reset_property (TrackerData *data, const gchar *graph, TrackerResource *resource, - gint64 subject, + TrackerRowid subject, const gchar *property_uri, GHashTable *bnodes, GError **error) @@ -3038,7 +3035,7 @@ static gboolean update_resource_property (TrackerData *data, const gchar *graph_uri, TrackerResource *resource, - gint64 subject, + TrackerRowid subject, const gchar *property, GHashTable *visited, GHashTable *bnodes, @@ -3068,7 +3065,7 @@ update_resource_property (TrackerData *data, for (v = values; v && !inner_error; v = v->next) { GValue *value, free_me = G_VALUE_INIT; - gint64 id; + TrackerRowid id; if (G_VALUE_HOLDS (v->data, TRACKER_TYPE_RESOURCE)) { @@ -3141,13 +3138,13 @@ update_resource_single (TrackerData *data, TrackerResource *resource, GHashTable *visited, GHashTable *bnodes, - gint64 *id, + TrackerRowid *id, GError **error) { GList *properties = NULL, *l; GError *inner_error = NULL; const gchar *subject_str; - gint64 subject; + TrackerRowid subject; gchar *graph_uri = NULL; gboolean is_bnode = FALSE; @@ -3261,7 +3258,7 @@ tracker_data_update_resource (TrackerData *data, if (bnodes) g_hash_table_ref (bnodes); else - bnodes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + bnodes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) tracker_rowid_free); retval = update_resource_single (data, graph, resource, visited, bnodes, NULL, error); @@ -3271,14 +3268,14 @@ tracker_data_update_resource (TrackerData *data, return retval; } -gint64 +TrackerRowid tracker_data_generate_bnode (TrackerData *data, GError **error) { TrackerDBInterface *iface; TrackerDBStatement *stmt = NULL; GError *inner_error = NULL; - gint64 *value, id; + TrackerRowid id; iface = tracker_data_manager_get_writable_db_interface (data->manager); @@ -3301,9 +3298,8 @@ tracker_data_generate_bnode (TrackerData *data, } id = tracker_db_interface_sqlite_get_last_insert_id (iface); - value = g_new0 (gint64, 1); - *value = id; - g_hash_table_add (data->update_buffer.new_resources, value); + g_hash_table_add (data->update_buffer.new_resources, + tracker_rowid_copy (&id)); return id; } diff --git a/src/libtracker-data/tracker-data-update.h b/src/libtracker-data/tracker-data-update.h index 2c26f3c4d..5954e4721 100644 --- a/src/libtracker-data/tracker-data-update.h +++ b/src/libtracker-data/tracker-data-update.h @@ -45,11 +45,11 @@ typedef struct _TrackerDataClass TrackerDataClass; typedef struct _TrackerData TrackerDataUpdate; -typedef void (*TrackerStatementCallback) (gint64 graph_id, +typedef void (*TrackerStatementCallback) (TrackerRowid graph_id, const gchar *graph, - gint64 subject_id, - gint64 predicate_id, - gint64 object_id, + TrackerRowid subject_id, + TrackerRowid predicate_id, + TrackerRowid object_id, GPtrArray *rdf_types, gpointer user_data); typedef void (*TrackerCommitCallback) (gpointer user_data); @@ -59,19 +59,19 @@ GQuark tracker_data_error_quark (void); /* Metadata */ void tracker_data_delete_statement (TrackerData *data, const gchar *graph, - gint64 subject, + TrackerRowid subject, TrackerProperty *predicate, const GValue *object, GError **error); void tracker_data_insert_statement (TrackerData *data, const gchar *graph, - gint64 subject, + TrackerRowid subject, TrackerProperty *predicate, const GValue *object, GError **error); void tracker_data_update_statement (TrackerData *data, const gchar *graph, - gint64 subject, + TrackerRowid subject, TrackerProperty *predicate, const GValue *object, GError **error); @@ -98,7 +98,7 @@ void tracker_data_load_turtle_file (TrackerData * const gchar *graph, GError **error); -gint64 tracker_data_ensure_graph (TrackerData *data, +TrackerRowid tracker_data_ensure_graph (TrackerData *data, const gchar *name, GError **error); gboolean tracker_data_delete_graph (TrackerData *data, @@ -137,11 +137,11 @@ gboolean tracker_data_update_resource (TrackerData *data, GHashTable *bnodes, GError **error); -gint64 tracker_data_update_ensure_resource (TrackerData *data, - const gchar *uri, - GError **error); -gint64 tracker_data_generate_bnode (TrackerData *data, - GError **error); +TrackerRowid tracker_data_update_ensure_resource (TrackerData *data, + const gchar *uri, + GError **error); +TrackerRowid tracker_data_generate_bnode (TrackerData *data, + GError **error); GType tracker_data_get_type (void) G_GNUC_CONST; TrackerData * tracker_data_new (TrackerDataManager *manager); diff --git a/src/libtracker-data/tracker-ontologies.c b/src/libtracker-data/tracker-ontologies.c index ed97bf648..ef0f8306d 100644 --- a/src/libtracker-data/tracker-ontologies.c +++ b/src/libtracker-data/tracker-ontologies.c @@ -102,8 +102,8 @@ tracker_ontologies_init (TrackerOntologies *ontologies) g_free, g_object_unref); - priv->id_uri_pairs = g_hash_table_new_full (g_direct_hash, g_direct_equal, - NULL, + priv->id_uri_pairs = g_hash_table_new_full (tracker_rowid_hash, tracker_rowid_equal, + (GDestroyNotify) tracker_rowid_free, g_free); priv->properties = g_ptr_array_new_with_free_func (g_object_unref); @@ -174,13 +174,13 @@ tracker_ontologies_get_rdf_type (TrackerOntologies *ontologies) const gchar* tracker_ontologies_get_uri_by_id (TrackerOntologies *ontologies, - gint id) + TrackerRowid id) { TrackerOntologiesPrivate *priv = tracker_ontologies_get_instance_private (ontologies); g_return_val_if_fail (id != -1, NULL); - return g_hash_table_lookup (priv->id_uri_pairs, GINT_TO_POINTER (id)); + return g_hash_table_lookup (priv->id_uri_pairs, &id); } void @@ -362,13 +362,13 @@ tracker_ontologies_add_property (TrackerOntologies *ontologies, void tracker_ontologies_add_id_uri_pair (TrackerOntologies *ontologies, - gint id, + TrackerRowid id, const gchar *uri) { TrackerOntologiesPrivate *priv = tracker_ontologies_get_instance_private (ontologies); g_hash_table_insert (priv->id_uri_pairs, - GINT_TO_POINTER (id), + tracker_rowid_copy (&id), g_strdup (uri)); } @@ -561,7 +561,7 @@ tracker_ontologies_write_gvdb (TrackerOntologies *ontologies, item = gvdb_hash_table_insert_item (table, root, uri); - str = g_strdup_printf ("%d", tracker_class_get_id (class)); + str = g_strdup_printf ("%" G_GINT64_FORMAT, tracker_class_get_id (class)); gvdb_hash_table_insert_statement (table, item, uri, "id", str); g_free (str); @@ -593,7 +593,7 @@ tracker_ontologies_write_gvdb (TrackerOntologies *ontologies, item = gvdb_hash_table_insert_item (table, root, uri); - str = g_strdup_printf ("%d", tracker_property_get_id (property)); + str = g_strdup_printf ("%" G_GINT64_FORMAT, tracker_property_get_id (property)); gvdb_hash_table_insert_statement (table, item, uri, "id", str); g_free (str); diff --git a/src/libtracker-data/tracker-ontologies.h b/src/libtracker-data/tracker-ontologies.h index c984b7a2e..529be25fa 100644 --- a/src/libtracker-data/tracker-ontologies.h +++ b/src/libtracker-data/tracker-ontologies.h @@ -83,9 +83,9 @@ TrackerNamespace * tracker_ontologies_get_namespace_by_uri (TrackerOntologies *o TrackerOntology * tracker_ontologies_get_ontology_by_uri (TrackerOntologies *ontologies, const gchar *namespace_uri); const gchar* tracker_ontologies_get_uri_by_id (TrackerOntologies *ontologies, - gint id); + TrackerRowid id); void tracker_ontologies_add_id_uri_pair (TrackerOntologies *ontologies, - gint id, + TrackerRowid id, const gchar *uri); gboolean tracker_ontologies_write_gvdb (TrackerOntologies *ontologies, diff --git a/src/libtracker-data/tracker-property.c b/src/libtracker-data/tracker-property.c index 7d84a7b35..0bab37b1b 100644 --- a/src/libtracker-data/tracker-property.c +++ b/src/libtracker-data/tracker-property.c @@ -71,7 +71,7 @@ struct _TrackerPropertyPrivate { TrackerClass *domain_index; TrackerClass *range; gint weight; - gint id; + TrackerRowid id; guint use_gvdb : 1; guint indexed : 1; guint orig_fulltext_indexed : 1; @@ -469,7 +469,7 @@ tracker_property_get_weight (TrackerProperty *property) return priv->weight; } -gint +TrackerRowid tracker_property_get_id (TrackerProperty *property) { TrackerPropertyPrivate *priv; @@ -879,7 +879,7 @@ tracker_property_set_weight (TrackerProperty *property, void tracker_property_set_id (TrackerProperty *property, - gint value) + TrackerRowid value) { TrackerPropertyPrivate *priv; g_return_if_fail (TRACKER_IS_PROPERTY (property)); diff --git a/src/libtracker-data/tracker-property.h b/src/libtracker-data/tracker-property.h index 6ad6b9fda..84e98b5f5 100644 --- a/src/libtracker-data/tracker-property.h +++ b/src/libtracker-data/tracker-property.h @@ -82,7 +82,7 @@ TrackerClass * tracker_property_get_domain (TrackerProperty TrackerClass * tracker_property_get_range (TrackerProperty *property); TrackerClass ** tracker_property_get_domain_indexes (TrackerProperty *property); gint tracker_property_get_weight (TrackerProperty *property); -gint tracker_property_get_id (TrackerProperty *property); +TrackerRowid tracker_property_get_id (TrackerProperty *property); gboolean tracker_property_get_indexed (TrackerProperty *property); TrackerProperty * tracker_property_get_secondary_index (TrackerProperty *property); gboolean tracker_property_get_orig_fulltext_indexed(TrackerProperty *property); @@ -116,7 +116,7 @@ void tracker_property_set_range (TrackerProperty void tracker_property_set_weight (TrackerProperty *property, gint value); void tracker_property_set_id (TrackerProperty *property, - gint value); + TrackerRowid value); void tracker_property_set_indexed (TrackerProperty *property, gboolean value); void tracker_property_set_secondary_index (TrackerProperty *property, diff --git a/src/libtracker-data/tracker-rowid.c b/src/libtracker-data/tracker-rowid.c new file mode 100644 index 000000000..fc293f760 --- /dev/null +++ b/src/libtracker-data/tracker-rowid.c @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2022 Red Hat Inc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * Author: Carlos Garnacho <carlosg@gnome.org> + */ + +#include "config.h" + +#include "tracker-rowid.h" + +G_DEFINE_BOXED_TYPE (TrackerRowid, tracker_rowid, + tracker_rowid_copy, tracker_rowid_free) + +TrackerRowid * +tracker_rowid_copy (TrackerRowid *rowid) +{ + return g_slice_dup (TrackerRowid, rowid); +} + +void +tracker_rowid_free (TrackerRowid *rowid) +{ + g_slice_free (TrackerRowid, rowid); +} diff --git a/src/libtracker-data/tracker-rowid.h b/src/libtracker-data/tracker-rowid.h new file mode 100644 index 000000000..135588ecf --- /dev/null +++ b/src/libtracker-data/tracker-rowid.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2022 Red Hat Inc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * Author: Carlos Garnacho <carlosg@gnome.org> + */ + +#ifndef __TRACKER_ROWID_H__ +#define __TRACKER_ROWID_H__ + +#include <glib-object.h> + +typedef gint64 TrackerRowid; + +#define TRACKER_ROWID_TYPE (tracker_rowid_get_type ()); +#define tracker_rowid_equal g_int64_equal +#define tracker_rowid_hash g_int64_hash + +GType tracker_rowid_get_type (void) G_GNUC_CONST; + +TrackerRowid * tracker_rowid_copy (TrackerRowid *rowid); +void tracker_rowid_free (TrackerRowid *rowid); + +#endif /* __TRACKER_ROWID_H__ */ diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index 4a504e939..d02686360 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -716,7 +716,7 @@ tracker_sparql_get_effective_graphs (TrackerSparql *sparql) g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - NULL); + (GDestroyNotify) tracker_rowid_free); for (i = 0; i < sparql->policy.graphs->len; i++) { gpointer key, value; @@ -725,7 +725,8 @@ tracker_sparql_get_effective_graphs (TrackerSparql *sparql) g_ptr_array_index (sparql->policy.graphs, i), &key, &value)) { g_hash_table_insert (sparql->policy.filtered_graphs, - g_strdup (key), value); + g_strdup (key), + tracker_rowid_copy (value)); } } } @@ -761,7 +762,7 @@ _append_union_graph_with_clause (TrackerSparql *sparql, const gchar *properties, gint n_properties) { - gpointer graph_name, graph_id; + gpointer graph_name, value; GHashTable *graphs; GHashTableIter iter; @@ -779,11 +780,13 @@ _append_union_graph_with_clause (TrackerSparql *sparql, } g_hash_table_iter_init (&iter, graphs); - while (g_hash_table_iter_next (&iter, &graph_name, &graph_id)) { + while (g_hash_table_iter_next (&iter, &graph_name, &value)) { + TrackerRowid *graph_id = value; + _append_string_printf (sparql, - "UNION ALL SELECT ID, %s %d AS graph FROM \"%s\".\"%s\" ", + "UNION ALL SELECT ID, %s %" G_GINT64_FORMAT " AS graph FROM \"%s\".\"%s\" ", properties, - GPOINTER_TO_INT (graph_id), + *graph_id, (gchar *) graph_name, table_name); } @@ -854,7 +857,7 @@ static void tracker_sparql_add_union_graph_subquery_for_named_graphs (TrackerSparql *sparql) { TrackerStringBuilder *old; - gpointer graph_id; + gpointer value; GHashTable *graphs; GHashTableIter iter; gboolean first = TRUE; @@ -875,13 +878,15 @@ tracker_sparql_add_union_graph_subquery_for_named_graphs (TrackerSparql *sparql) _append_string (sparql, "\"unionGraph_graphs\"(graph) AS ("); g_hash_table_iter_init (&iter, graphs); - while (g_hash_table_iter_next (&iter, NULL, &graph_id)) { + while (g_hash_table_iter_next (&iter, NULL, &value)) { + TrackerRowid *graph_id = value; + if (first) _append_string (sparql, "VALUES "); else _append_string (sparql, ", "); - _append_string_printf (sparql, "(%d) ", GPOINTER_TO_INT (graph_id)); + _append_string_printf (sparql, "(%" G_GINT64_FORMAT ") ", *graph_id); first = FALSE; } @@ -894,7 +899,7 @@ tracker_sparql_add_union_graph_subquery_for_named_graphs (TrackerSparql *sparql) g_hash_table_unref (graphs); } -static gint +static TrackerRowid tracker_sparql_find_graph (TrackerSparql *sparql, const gchar *name) { @@ -947,7 +952,7 @@ _prepend_path_element (TrackerSparql *sparql, TRACKER_PROPERTY_TYPE_RESOURCE, TRACKER_PROPERTY_TYPE_RESOURCE); } else if (tracker_sparql_find_graph (sparql, graph)) { - zero_length_match = g_strdup_printf ("SELECT ID, ID, %d, %d, %d " + zero_length_match = g_strdup_printf ("SELECT ID, ID, %" G_GINT64_FORMAT ", %d, %d " "FROM \"%s\".\"rdfs:Resource\"", tracker_sparql_find_graph (sparql, graph), TRACKER_PROPERTY_TYPE_RESOURCE, @@ -981,7 +986,7 @@ _prepend_path_element (TrackerSparql *sparql, if (tracker_sparql_find_graph (sparql, graph)) { table_name = g_strdup_printf ("\"%s\".\"%s\"", graph, tracker_property_get_table_name (path_elem->data.property)); - graph_column = g_strdup_printf ("%d", + graph_column = g_strdup_printf ("%" G_GINT64_FORMAT, tracker_sparql_find_graph (sparql, graph)); } else { /* Graph does not exist, ensure to come back empty */ @@ -1112,7 +1117,7 @@ _prepend_path_element (TrackerSparql *sparql, _append_string (sparql, "WHERE "); } - _append_string_printf (sparql, "predicate != %d ", + _append_string_printf (sparql, "predicate != %" G_GINT64_FORMAT " ", tracker_property_get_id (path_elem->data.property)); _append_string (sparql, ") "); break; @@ -1588,7 +1593,7 @@ tracker_sparql_add_fts_subquery (TrackerSparql *sparql, _append_empty_select (sparql, n_properties); } } else { - gpointer graph_name, graph_id; + gpointer graph_name, value; GHashTable *graphs; GHashTableIter iter; @@ -1606,13 +1611,15 @@ tracker_sparql_add_fts_subquery (TrackerSparql *sparql, graphs = tracker_sparql_get_effective_graphs (sparql); g_hash_table_iter_init (&iter, graphs); - while (g_hash_table_iter_next (&iter, &graph_name, &graph_id)) { + while (g_hash_table_iter_next (&iter, &graph_name, &value)) { + TrackerRowid *graph_id = value; + _append_string_printf (sparql, - "UNION ALL %s, %d AS graph " + "UNION ALL %s, %" G_GINT64_FORMAT " AS graph " "FROM \"%s\".\"fts5\" " "WHERE fts5 = '\"' || REPLACE (", select_items->str, - GPOINTER_TO_INT (graph_id), + *graph_id, (gchar *) graph_name); _append_literal_sql (sparql, binding); _append_string (sparql, ", '\"', ' ') || '\"*'"); @@ -2752,7 +2759,8 @@ translate_Update (TrackerSparql *sparql, if (!sparql->current_state->blank_node_map) { sparql->current_state->blank_node_map = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, g_free); + g_free, + (GDestroyNotify) tracker_rowid_free); } if (_check_in_rule (sparql, NAMED_RULE_Update1)) { diff --git a/src/libtracker-data/tracker-vtab-triples.c b/src/libtracker-data/tracker-vtab-triples.c index e6316b3a5..469a6f02e 100644 --- a/src/libtracker-data/tracker-vtab-triples.c +++ b/src/libtracker-data/tracker-vtab-triples.c @@ -22,6 +22,7 @@ #include "tracker-ontologies.h" #include "tracker-vtab-triples.h" +#include "tracker-rowid.h" /* Avoid casts everywhere. */ #define sqlite3_value_text(x) ((const gchar *) sqlite3_value_text(x)) @@ -325,13 +326,16 @@ collect_graphs (TrackerTriplesCursor *cursor) if (rc != SQLITE_OK) return rc; - cursor->query_graphs = g_hash_table_new_full (NULL, NULL, NULL, g_free); + cursor->query_graphs = g_hash_table_new_full (tracker_rowid_hash, + tracker_rowid_equal, + (GDestroyNotify) tracker_rowid_free, + g_free); while ((rc = sqlite3_step (stmt)) == SQLITE_ROW) { const gchar *uri; - gint id; + TrackerRowid id; - id = sqlite3_column_int (stmt, 0); + id = sqlite3_column_int64 (stmt, 0); uri = sqlite3_column_text (stmt, 1); if (cursor->match.graph) { @@ -343,7 +347,7 @@ collect_graphs (TrackerTriplesCursor *cursor) } g_hash_table_insert (cursor->query_graphs, - GINT_TO_POINTER (id), + tracker_rowid_copy (&id), g_strdup (uri)); } @@ -428,9 +432,11 @@ bind_arg (sqlite3_stmt *stmt, static gboolean iterate_next_stmt (TrackerTriplesCursor *cursor, const gchar **graph, - gint *graph_id, + TrackerRowid *graph_id, TrackerProperty **property) { + TrackerRowid *id; + while (cursor->properties && !cursor->graphs) { /* Iterate to next property, and redo graph list */ cursor->properties = g_list_remove (cursor->properties, @@ -442,9 +448,10 @@ iterate_next_stmt (TrackerTriplesCursor *cursor, return FALSE; *property = cursor->properties->data; - *graph_id = GPOINTER_TO_INT (cursor->graphs->data); - *graph = g_hash_table_lookup (cursor->query_graphs, - cursor->graphs->data); + + id = cursor->graphs->data; + *graph_id = *id; + *graph = g_hash_table_lookup (cursor->query_graphs, id); cursor->graphs = g_list_remove (cursor->graphs, cursor->graphs->data); @@ -456,7 +463,7 @@ init_stmt (TrackerTriplesCursor *cursor) { TrackerProperty *property; const gchar *graph; - gint graph_id; + TrackerRowid graph_id; GString *sql; int rc; @@ -468,7 +475,7 @@ init_stmt (TrackerTriplesCursor *cursor) sql = g_string_new (NULL); g_string_append_printf (sql, - "SELECT %d, t.ID, " + "SELECT %" G_GINT64_FORMAT ", t.ID, " " (SELECT ID From Resource WHERE Uri = \"%s\"), " " %s, " " %d " diff --git a/src/libtracker-sparql/direct/tracker-direct-batch.c b/src/libtracker-sparql/direct/tracker-direct-batch.c index 748836456..fa3cf324a 100644 --- a/src/libtracker-sparql/direct/tracker-direct-batch.c +++ b/src/libtracker-sparql/direct/tracker-direct-batch.c @@ -198,7 +198,8 @@ tracker_direct_batch_update (TrackerDirectBatch *batch, priv = tracker_direct_batch_get_instance_private (batch); data = tracker_data_manager_get_data (data_manager); - bnodes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + bnodes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, + (GDestroyNotify) tracker_rowid_free); tracker_data_begin_transaction (data, &inner_error); if (inner_error) diff --git a/src/libtracker-sparql/direct/tracker-direct.c b/src/libtracker-sparql/direct/tracker-direct.c index 8317f40d3..4487749bb 100644 --- a/src/libtracker-sparql/direct/tracker-direct.c +++ b/src/libtracker-sparql/direct/tracker-direct.c @@ -535,7 +535,9 @@ get_event_cache_ht (TrackerNotifier *notifier) events = g_object_get_qdata (G_OBJECT (notifier), tracker_direct_notifier_quark ()); if (!events) { - events = g_hash_table_new_full (NULL, NULL, NULL, + events = g_hash_table_new_full (tracker_rowid_hash, + tracker_rowid_equal, + (GDestroyNotify) tracker_rowid_free, (GDestroyNotify) _tracker_notifier_event_cache_free); g_object_set_qdata_full (G_OBJECT (notifier), tracker_direct_notifier_quark (), events, (GDestroyNotify) g_hash_table_unref); @@ -546,18 +548,18 @@ get_event_cache_ht (TrackerNotifier *notifier) static TrackerNotifierEventCache * lookup_event_cache (TrackerNotifier *notifier, - gint graph_id, + TrackerRowid graph_id, const gchar *graph) { TrackerNotifierEventCache *cache; GHashTable *events; events = get_event_cache_ht (notifier); - cache = g_hash_table_lookup (events, GINT_TO_POINTER (graph_id)); + cache = g_hash_table_lookup (events, &graph_id); if (!cache) { cache = _tracker_notifier_event_cache_new (notifier, graph); - g_hash_table_insert (events, GINT_TO_POINTER (graph_id), cache); + g_hash_table_insert (events, tracker_rowid_copy (&graph_id), cache); } return cache; @@ -567,11 +569,11 @@ lookup_event_cache (TrackerNotifier *notifier, * (always the same one though), handle with care. */ static void -insert_statement_cb (gint64 graph_id, - const gchar *graph, - gint64 subject_id, - gint64 predicate_id, - gint64 object_id, +insert_statement_cb (TrackerRowid graph_id, + const gchar *graph, + TrackerRowid subject_id, + TrackerRowid predicate_id, + TrackerRowid object_id, GPtrArray *rdf_types, gpointer user_data) { @@ -611,11 +613,11 @@ insert_statement_cb (gint64 graph_id, } static void -delete_statement_cb (gint64 graph_id, - const gchar *graph, - gint64 subject_id, - gint64 predicate_id, - gint64 object_id, +delete_statement_cb (TrackerRowid graph_id, + const gchar *graph, + TrackerRowid subject_id, + TrackerRowid predicate_id, + TrackerRowid object_id, GPtrArray *rdf_types, gpointer user_data) { |