summaryrefslogtreecommitdiff
path: root/src/tracker
diff options
context:
space:
mode:
Diffstat (limited to 'src/tracker')
-rw-r--r--src/tracker/tracker-export.c196
1 files changed, 192 insertions, 4 deletions
diff --git a/src/tracker/tracker-export.c b/src/tracker/tracker-export.c
index 2484e0296..900fc411b 100644
--- a/src/tracker/tracker-export.c
+++ b/src/tracker/tracker-export.c
@@ -27,17 +27,20 @@
#include <glib.h>
#include <glib/gi18n.h>
-#include <libtracker-sparql/tracker-sparql.h>
-#include <libtracker-common/tracker-common.h>
-
#include "tracker-sparql.h"
#include "tracker-color.h"
+#include <libtracker-sparql/tracker-sparql.h>
+#include <libtracker-common/tracker-common.h>
+#include <libtracker-data/tracker-data.h>
+
static gchar *database_path;
static gchar *dbus_service;
static gchar *remote_service;
static gboolean show_graphs;
static gchar **iris;
+static gchar *data_type = NULL;
+static gboolean keyfile = FALSE;
static GOptionEntry entries[] = {
{ "database", 'd', 0, G_OPTION_ARG_FILENAME, &database_path,
@@ -56,6 +59,14 @@ static GOptionEntry entries[] = {
N_("Output TriG format which includes named graph information"),
NULL
},
+ { "2to3", 0, 0, G_OPTION_ARG_STRING, &data_type,
+ NULL,
+ NULL
+ },
+ { "keyfile", 0, 0, G_OPTION_ARG_NONE, &keyfile,
+ NULL,
+ NULL
+ },
{ G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &iris,
N_("IRI"),
N_("IRI")},
@@ -88,7 +99,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>
*/
@@ -243,6 +253,44 @@ print_trig (TrackerSparqlCursor *cursor,
g_free (previous_graph);
}
+static void
+print_keyfile (TrackerSparqlCursor *cursor)
+{
+ GKeyFile *key_file;
+ gchar *data;
+
+ key_file = g_key_file_new ();
+
+ while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
+ const gchar *resource = tracker_sparql_cursor_get_string (cursor, 1, NULL);
+ const gchar *key = tracker_sparql_cursor_get_string (cursor, 2, NULL);
+ const gchar *value = tracker_sparql_cursor_get_string (cursor, 3, NULL);
+ GStrv values;
+ gsize n_items;
+
+ values = g_key_file_get_string_list (key_file, resource, key, &n_items, NULL);
+
+ if (values) {
+ GArray *array;
+
+ array = g_array_new (TRUE, TRUE, sizeof (char*));
+ g_array_append_vals (array, values, n_items);
+ g_array_append_val (array, value);
+
+ g_key_file_set_string_list (key_file, resource, key,
+ (const gchar * const *) array->data,
+ array->len);
+ } else {
+ g_key_file_set_string (key_file, resource, key, value);
+ }
+
+ g_strfreev (values);
+ }
+
+ data = g_key_file_to_data (key_file, NULL, NULL);
+ g_print ("%s\n", data);
+}
+
static int
export_run_default (void)
{
@@ -318,6 +366,142 @@ 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 (keyfile) {
+ print_keyfile (cursor);
+ } 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\" ) ) ,"
+ " \"v_p\","
+ " \"v_v\","
+ " 'true' "
+ "FROM ("
+ " SELECT * "
+ " FROM (("
+ " SELECT "
+ " \"v_u\" ,"
+ " 'rdf:type' AS \"v_p\" ,"
+ " 'nfo:FileDataObject' 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\" ,"
+ " \"nao:hasTag\" AS \"v_p\" ,"
+ " \"urn:gnome:nautilus:starred\" 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 ();
+ }
+
+ g_print ("Options: files-starred\n");
+
+ return EXIT_FAILURE;
+}
+
int
tracker_export (int argc, const char **argv)
{
@@ -338,5 +522,9 @@ tracker_export (int argc, const char **argv)
g_option_context_free (context);
+ if (data_type) {
+ return export_2to3_run ();
+ }
+
return export_run_default ();
}