[tracker/wip/carlosg/2to3-export: 2/2] tracker: Add --2to3 switch to "tracker3 export"




commit ae6c9477271ba58787c51cb9f9bcd4139fe6a495
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Sep 2 00:33:06 2020 +0200

    tracker: Add --2to3 switch to "tracker3 export"
    
    This special mode opens the old Tracker2 database, and tries to
    extract data, pretty much in the same fashion than "tracker export"
    command introduced recently in 2.3.x.
    
    So far, this submode only supports exporting of starred files.

 src/tracker/tracker-export.c | 141 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 139 insertions(+), 2 deletions(-)
---
diff --git a/src/tracker/tracker-export.c b/src/tracker/tracker-export.c
index 2484e0296..eb5e4a55d 100644
--- a/src/tracker/tracker-export.c
+++ b/src/tracker/tracker-export.c
@@ -29,8 +29,8 @@
 
 #include <libtracker-sparql/tracker-sparql.h>
 #include <libtracker-common/tracker-common.h>
+#include <libtracker-data/tracker-data.h>
 
-#include "tracker-sparql.h"
 #include "tracker-color.h"
 
 static gchar *database_path;
@@ -38,6 +38,7 @@ static gchar *dbus_service;
 static gchar *remote_service;
 static gboolean show_graphs;
 static gchar **iris;
+static gchar *data_type;
 
 static GOptionEntry entries[] = {
        { "database", 'd', 0, G_OPTION_ARG_FILENAME, &database_path,
@@ -56,6 +57,10 @@ static GOptionEntry entries[] = {
          N_("Output TriG format which includes named graph information"),
          NULL
        },
+        { "2to3", 0, 0, G_OPTION_ARG_STRING, &data_type,
+         N_("Migrate data from 2.x database"),
+         NULL
+        },
        { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &iris,
          N_("IRI"),
          N_("IRI")},
@@ -88,7 +93,6 @@ create_connection (GError **error)
        }
 }
 
-
 /* format a URI for Turtle; if it has a prefix, display uri
  * as prefix:rest_of_uri; if not, display as <uri>
  */
@@ -318,6 +322,135 @@ export_run_default (void)
        return EXIT_SUCCESS;
 }
 
+/* Execute a query and export the resulting triples or quads to stdout.
+ *
+ * The query should return quads (graph, subject, predicate, object) plus an extra
+ * boolean column that is false when the 'object' value is a simple type or a resource.
+ */
+static gboolean
+export_2to3_with_query (const gchar  *query,
+                        gboolean      show_graphs,
+                        GError      **error)
+{
+       g_autoptr(TrackerDBManager) db_manager = NULL;
+       TrackerDBInterface *iface = NULL;
+       TrackerDBStatement *stmt = NULL;
+       TrackerSparqlCursor *cursor = NULL;
+       GError *inner_error = NULL;
+       g_autoptr(GFile) store = NULL;
+       g_autofree char *path = NULL;
+
+       path = g_build_filename (g_get_user_cache_dir (),
+                                "tracker", NULL);
+       store = g_file_new_for_path (path);
+
+       db_manager = tracker_db_manager_new (TRACKER_DB_MANAGER_READONLY |
+                                            TRACKER_DB_MANAGER_SKIP_VERSION_CHECK,
+                                            store,
+                                            NULL, FALSE,
+                                            1, 1, NULL, NULL, NULL, NULL, &inner_error);
+
+       if (inner_error) {
+               g_propagate_prefixed_error (error, inner_error,
+                                           "%s: ", _("Could not run query"));
+               g_object_unref (db_manager);
+               return FALSE;
+       }
+
+       iface = tracker_db_manager_get_writable_db_interface (db_manager);
+
+       stmt = tracker_db_interface_create_statement (iface,
+                                                     TRACKER_DB_STATEMENT_CACHE_TYPE_NONE,
+                                                     &inner_error,
+                                                     "%s", query);
+       if (!stmt) {
+               g_propagate_prefixed_error (error, inner_error,
+                                           "%s: ", _("Could not run query"));
+               g_object_unref (db_manager);
+               return FALSE;
+       }
+
+       cursor = TRACKER_SPARQL_CURSOR (tracker_db_statement_start_cursor (stmt, &inner_error));
+       g_object_unref (stmt);
+
+       if (!cursor) {
+               g_propagate_prefixed_error (error, inner_error,
+                                           "%s: ", _("Could not run query"));
+               g_object_unref (db_manager);
+               return FALSE;
+       }
+
+       if (show_graphs) {
+               print_trig (cursor, NULL, FALSE);
+       } else {
+               print_turtle (cursor, NULL, FALSE);
+       }
+
+       g_object_unref (cursor);
+
+       return TRUE;
+}
+
+static int
+export_2to3_run_files_starred (void)
+{
+       const gchar *query;
+       g_autoptr(GError) error = NULL;
+
+       query = "SELECT "
+               "  \"\" ,"
+               "  COALESCE ((SELECT \"nie:url\" FROM \"nie:DataObject\" WHERE ID = \"v_u\" ) ,"
+               "            (SELECT Uri FROM Resource WHERE ID = \"v_u\" ) ) ,"
+               "  (SELECT Uri FROM Resource WHERE ID = \"v_p\" ) ,"
+               "  (SELECT Uri FROM Resource WHERE ID = \"v_v\" ) ,"
+               "  'true' "
+               "FROM ("
+               "  SELECT * "
+               "  FROM (("
+               "    SELECT "
+               "      \"v_u\" ,"
+               "      COALESCE ((SELECT ID FROM Resource WHERE Uri = 
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' ), 0) AS \"v_p\" ,"
+               "      COALESCE ((SELECT ID FROM Resource WHERE Uri = 
'http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#FileDataObject' ), 0) AS \"v_v\""
+               "    FROM ("
+               "      SELECT"
+               "        \"nfo:FileDataObject1\".\"ID\" AS \"v_u\""
+               "      FROM \"nfo:FileDataObject\" AS \"nfo:FileDataObject1\" ,"
+               "           \"rdfs:Resource_nao:hasTag\" AS \"rdfs:Resource_nao:hasTag2\""
+               "      WHERE \"nfo:FileDataObject1\".\"ID\" = \"rdfs:Resource_nao:hasTag2\".\"ID\""
+               "        AND \"rdfs:Resource_nao:hasTag2\".\"nao:hasTag\" = COALESCE ((SELECT ID FROM 
Resource WHERE Uri = 'urn:gnome:nautilus:starred' ), 0) ) ) )"
+               "  UNION ALL"
+               "  SELECT *"
+               "  FROM (("
+               "    SELECT"
+               "      \"v_u\" ,"
+               "      COALESCE ((SELECT ID FROM Resource WHERE Uri = 
'http://www.semanticdesktop.org/ontologies/2007/08/15/nao#hasTag' ), 0) AS \"v_p\" ,"
+               "      COALESCE ((SELECT ID FROM Resource WHERE Uri = 'urn:gnome:nautilus:starred' ), 0) AS 
\"v_v\" FROM (SELECT \"nfo:FileDataObject1\".\"ID\" AS \"v_u\""
+               "    FROM \"nfo:FileDataObject\" AS \"nfo:FileDataObject1\" ,"
+               "         \"rdfs:Resource_nao:hasTag\" AS \"rdfs:Resource_nao:hasTag2\""
+               "    WHERE \"nfo:FileDataObject1\".\"ID\" = \"rdfs:Resource_nao:hasTag2\".\"ID\""
+               "      AND \"rdfs:Resource_nao:hasTag2\".\"nao:hasTag\" = COALESCE ((SELECT ID FROM Resource 
WHERE Uri = \"urn:gnome:nautilus:starred\" ), 0) ) ) ) )"
+               "ORDER BY (SELECT Uri FROM Resource WHERE ID = \"v_u\" )";
+
+       export_2to3_with_query (query, FALSE, &error);
+
+       if (error) {
+               g_printerr ("%s\n", error->message);
+               return EXIT_FAILURE;
+       } else {
+               return EXIT_SUCCESS;
+       }
+}
+
+static gint
+export_2to3_run (void)
+{
+       if (strcmp (data_type, "files-starred") == 0) {
+               return export_2to3_run_files_starred ();
+       }
+
+       return EXIT_FAILURE;
+}
+
 int
 tracker_export (int argc, const char **argv)
 {
@@ -338,5 +471,9 @@ tracker_export (int argc, const char **argv)
 
        g_option_context_free (context);
 
+        if (data_type) {
+               return export_2to3_run ();
+        }
+
        return export_run_default ();
 }


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