summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-11-18 02:14:15 +0100
committerCarlos Garnacho <carlosg@gnome.org>2020-11-27 00:14:06 +0100
commitca184133503eb8361d8ef5e1161cd999b87fd712 (patch)
tree85875a7df6e60f5d495aef50f01f8d48adce78d3
parentb1e5becf444bdf2dbf6f09510d07e72647c3fd1e (diff)
downloadtracker-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.c65
-rw-r--r--src/libtracker-data/tracker-data-manager.h6
-rw-r--r--src/libtracker-data/tracker-sparql.c59
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,