[tracker/wip/carlosg/batches-and-resources: 5/11] libtracker-sparql: Refactor namespace expanding to its own function




commit 682e5f54ea3091b0ffe8ad5764b98f7ff94bb08a
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Nov 18 02:14:15 2020 +0100

    libtracker-sparql: Refactor namespace expanding to its own function
    
    This will be called from other places, so make it a TrackerDataManager
    function.

 src/libtracker-data/tracker-data-manager.c | 65 ++++++++++++++++++++++++++++++
 src/libtracker-data/tracker-data-manager.h |  6 +++
 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..57432fd04 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,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]