diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-11-18 02:14:15 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2020-11-27 00:14:06 +0100 |
commit | ca184133503eb8361d8ef5e1161cd999b87fd712 (patch) | |
tree | 85875a7df6e60f5d495aef50f01f8d48adce78d3 | |
parent | b1e5becf444bdf2dbf6f09510d07e72647c3fd1e (diff) | |
download | tracker-ca184133503eb8361d8ef5e1161cd999b87fd712.tar.gz |
libtracker-sparql: Refactor namespace expanding to its own function
This will be called from other places, so make it a TrackerDataManager
function.
-rw-r--r-- | src/libtracker-data/tracker-data-manager.c | 65 | ||||
-rw-r--r-- | src/libtracker-data/tracker-data-manager.h | 6 | ||||
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 59 |
3 files changed, 77 insertions, 53 deletions
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c index bbb4d2e0e..bea674b3e 100644 --- a/src/libtracker-data/tracker-data-manager.c +++ b/src/libtracker-data/tracker-data-manager.c @@ -5108,3 +5108,68 @@ tracker_data_manager_release_memory (TrackerDataManager *manager) { tracker_db_manager_release_memory (manager->db_manager); } + +gboolean +tracker_data_manager_expand_prefix (TrackerDataManager *manager, + const gchar *term, + GHashTable *prefix_map, + gchar **prefix, + gchar **expanded) +{ + const gchar *sep, *expanded_ns = NULL; + TrackerOntologies *ontologies; + TrackerNamespace **namespaces; + guint n_namespaces, i; + gchar *ns; + + sep = strchr (term, ':'); + + if (sep) { + ns = g_strndup (term, sep - term); + sep++; + } else { + ns = g_strdup (term); + } + + if (prefix_map) + expanded_ns = g_hash_table_lookup (prefix_map, ns); + + if (!expanded_ns) { + ontologies = tracker_data_manager_get_ontologies (manager); + namespaces = tracker_ontologies_get_namespaces (ontologies, &n_namespaces); + + for (i = 0; i < n_namespaces; i++) { + if (!g_str_equal (ns, tracker_namespace_get_prefix (namespaces[i]))) + continue; + + expanded_ns = tracker_namespace_get_uri (namespaces[i]); + + if (prefix_map) + g_hash_table_insert (prefix_map, ns, g_strdup (expanded_ns)); + break; + } + } + + if (!expanded_ns) { + if (prefix) + *prefix = NULL; + if (expanded) + *expanded = g_strdup (term); + + g_free (ns); + return FALSE; + } + + if (prefix) + *prefix = g_strdup (expanded_ns); + + if (expanded) { + if (sep) { + *expanded = g_strdup_printf ("%s%s", expanded_ns, sep); + } else { + *expanded = g_strdup (expanded_ns); + } + } + + return TRUE; +} diff --git a/src/libtracker-data/tracker-data-manager.h b/src/libtracker-data/tracker-data-manager.h index db8b4e509..474e8f815 100644 --- a/src/libtracker-data/tracker-data-manager.h +++ b/src/libtracker-data/tracker-data-manager.h @@ -107,6 +107,12 @@ void tracker_data_manager_commit_graphs (TrackerDataManager *man void tracker_data_manager_release_memory (TrackerDataManager *manager); +gboolean tracker_data_manager_expand_prefix (TrackerDataManager *manager, + const gchar *term, + GHashTable *prefix_map, + gchar **prefix, + gchar **expanded); + G_END_DECLS #endif /* __LIBTRACKER_DATA_MANAGER_H__ */ diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index f2b81f695..cde68ab73 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -310,58 +310,6 @@ tracker_sparql_expand_base (TrackerSparql *sparql, return g_strdup (term); } -static inline gchar * -tracker_sparql_expand_prefix (TrackerSparql *sparql, - const gchar *term) -{ - const gchar *sep; - gchar *ns, *expanded_ns; - - sep = strchr (term, ':'); - - if (sep) { - ns = g_strndup (term, sep - term); - sep++; - } else { - ns = g_strdup (term); - } - - expanded_ns = g_hash_table_lookup (sparql->prefix_map, ns); - - if (!expanded_ns && g_strcmp0 (ns, "fn") == 0) - expanded_ns = FN_NS; - - if (!expanded_ns) { - TrackerOntologies *ontologies; - TrackerNamespace **namespaces; - guint n_namespaces, i; - - ontologies = tracker_data_manager_get_ontologies (sparql->data_manager); - namespaces = tracker_ontologies_get_namespaces (ontologies, &n_namespaces); - - for (i = 0; i < n_namespaces; i++) { - if (!g_str_equal (ns, tracker_namespace_get_prefix (namespaces[i]))) - continue; - - expanded_ns = g_strdup (tracker_namespace_get_uri (namespaces[i])); - g_hash_table_insert (sparql->prefix_map, g_strdup (ns), expanded_ns); - } - - if (!expanded_ns) { - g_free (ns); - return NULL; - } - } - - g_free (ns); - - if (sep) { - return g_strdup_printf ("%s%s", expanded_ns, sep); - } else { - return g_strdup (expanded_ns); - } -} - static inline void tracker_sparql_iter_next (TrackerSparql *sparql) { @@ -1117,7 +1065,10 @@ _extract_node_string (TrackerParserNode *node, unexpanded = g_strndup (terminal_start + add_start, terminal_end - terminal_start - subtract_end); - str = tracker_sparql_expand_prefix (sparql, unexpanded); + tracker_data_manager_expand_prefix (sparql->data_manager, + unexpanded, + sparql->prefix_map, + NULL, &str); g_free (unexpanded); break; } @@ -9310,6 +9261,8 @@ tracker_sparql_init (TrackerSparql *sparql) { sparql->prefix_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + g_hash_table_insert (sparql->prefix_map, g_strdup ("fn"), g_strdup (FN_NS)); + sparql->cached_bindings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); sparql->parameters = g_hash_table_new_full (g_str_hash, g_str_equal, |