[tracker/wip/carlosg/deserialize-api: 2/17] libtracker-sparql: Add internal API to load RDF from a deserializer




commit 5f15c513b92af2df0ed4796099c01fe1456ce39f
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat May 7 23:52:22 2022 +0200

    libtracker-sparql: Add internal API to load RDF from a deserializer
    
    This API takes a deserializer (really, a cursor), and loads into the
    database. The former Turtle oriented API has been rewritten on top
    of this.

 src/libtracker-sparql/core/tracker-data-update.c | 68 +++++++++++++++---------
 src/libtracker-sparql/core/tracker-data-update.h |  8 +++
 2 files changed, 51 insertions(+), 25 deletions(-)
---
diff --git a/src/libtracker-sparql/core/tracker-data-update.c 
b/src/libtracker-sparql/core/tracker-data-update.c
index 0ada33356..72e9801f6 100644
--- a/src/libtracker-sparql/core/tracker-data-update.c
+++ b/src/libtracker-sparql/core/tracker-data-update.c
@@ -2854,44 +2854,36 @@ tracker_data_update_sparql_blank (TrackerData  *data,
        return update_sparql (data, update, TRUE, error);
 }
 
-void
-tracker_data_load_turtle_file (TrackerData  *data,
-                               GFile        *file,
-                               const gchar  *graph,
-                               GError      **error)
+gboolean
+tracker_data_load_from_deserializer (TrackerData          *data,
+                                     TrackerDeserializer  *deserializer,
+                                     const gchar          *graph,
+                                     const gchar          *location,
+                                     GError              **error)
 {
-       TrackerSparqlCursor *deserializer;
+       TrackerSparqlCursor *cursor = TRACKER_SPARQL_CURSOR (deserializer);
        TrackerOntologies *ontologies;
        GError *inner_error = NULL;
        const gchar *subject_str, *predicate_str, *object_str;
        goffset last_parsed_line_no = 0, last_parsed_column_no = 0;
-       gchar *ontology_uri;
-
-       deserializer = tracker_deserializer_new_for_file (file, NULL, error);
-       if (!deserializer)
-               return;
 
        ontologies = tracker_data_manager_get_ontologies (data->manager);
 
-       while (tracker_sparql_cursor_next (deserializer, NULL, &inner_error)) {
+       while (tracker_sparql_cursor_next (cursor, NULL, &inner_error)) {
                TrackerProperty *predicate;
                GValue object = G_VALUE_INIT;
                TrackerRowid subject;
 
-               subject_str = tracker_sparql_cursor_get_string (deserializer,
+               subject_str = tracker_sparql_cursor_get_string (cursor,
                                                                TRACKER_RDF_COL_SUBJECT,
                                                                NULL);
-               predicate_str = tracker_sparql_cursor_get_string (deserializer,
+               predicate_str = tracker_sparql_cursor_get_string (cursor,
                                                                  TRACKER_RDF_COL_PREDICATE,
                                                                  NULL);
-               object_str = tracker_sparql_cursor_get_string (deserializer,
+               object_str = tracker_sparql_cursor_get_string (cursor,
                                                               TRACKER_RDF_COL_OBJECT,
                                                               NULL);
 
-               tracker_deserializer_get_parser_location (TRACKER_DESERIALIZER (deserializer),
-                                                         &last_parsed_line_no,
-                                                         &last_parsed_column_no);
-
                predicate = tracker_ontologies_get_property_by_uri (ontologies, predicate_str);
                if (predicate == NULL) {
                        g_set_error (&inner_error, TRACKER_SPARQL_ERROR,
@@ -2936,18 +2928,44 @@ tracker_data_load_turtle_file (TrackerData  *data,
                        goto failed;
        }
 
-       g_clear_object (&deserializer);
+       if (inner_error)
+               goto failed;
 
-       return;
+       return TRUE;
 
 failed:
-       g_clear_object (&deserializer);
+       tracker_deserializer_get_parser_location (deserializer,
+                                                 &last_parsed_line_no,
+                                                 &last_parsed_column_no);
 
-       ontology_uri = g_file_get_uri (file);
        g_propagate_prefixed_error (error, inner_error,
                                    "%s:%" G_GOFFSET_FORMAT ":%" G_GOFFSET_FORMAT ": ",
-                                   ontology_uri, last_parsed_line_no, last_parsed_column_no);
-       g_free (ontology_uri);
+                                   location, last_parsed_line_no, last_parsed_column_no);
+
+       return FALSE;
+}
+
+void
+tracker_data_load_turtle_file (TrackerData  *data,
+                               GFile        *file,
+                               const gchar  *graph,
+                               GError      **error)
+{
+       TrackerSparqlCursor *deserializer;
+       gchar *uri;
+
+       deserializer = tracker_deserializer_new_for_file (file, NULL, error);
+       if (!deserializer)
+               return;
+
+       uri = g_file_get_uri (file);
+       tracker_data_load_from_deserializer (data,
+                                            TRACKER_DESERIALIZER (deserializer),
+                                            graph,
+                                            uri,
+                                            error);
+       g_object_unref (deserializer);
+       g_free (uri);
 }
 
 TrackerRowid
diff --git a/src/libtracker-sparql/core/tracker-data-update.h 
b/src/libtracker-sparql/core/tracker-data-update.h
index f11d227b7..d270e6003 100644
--- a/src/libtracker-sparql/core/tracker-data-update.h
+++ b/src/libtracker-sparql/core/tracker-data-update.h
@@ -32,6 +32,8 @@ typedef struct _TrackerDataClass TrackerDataClass;
 #include "tracker-db-interface.h"
 #include "tracker-data-manager.h"
 
+#include <libtracker-sparql/tracker-deserializer.h>
+
 #define TRACKER_TYPE_DATA         (tracker_data_get_type ())
 #define TRACKER_DATA(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_DATA, TrackerData))
 #define TRACKER_DATA_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST ((k), TRACKER_TYPE_DATA, TrackerDataClass))
@@ -89,6 +91,12 @@ void     tracker_data_update_buffer_flush           (TrackerData               *
                                                      GError                   **error);
 void     tracker_data_update_buffer_might_flush     (TrackerData               *data,
                                                      GError                   **error);
+
+gboolean tracker_data_load_from_deserializer        (TrackerData               *data,
+                                                     TrackerDeserializer       *deserializer,
+                                                     const gchar               *graph,
+                                                     const gchar               *location,
+                                                     GError                   **error);
 void     tracker_data_load_turtle_file              (TrackerData               *data,
                                                      GFile                     *file,
                                                      const gchar               *graph,


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