summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarinus Schraal <mschraal@gnome.org>2021-08-16 21:13:30 +0200
committerMarinus Schraal <mschraal@gnome.org>2021-09-06 16:07:19 +0200
commitce47e012114e88d0b5b520e7f571a6b5c7c0a9cd (patch)
tree10e3fbddef9461d80d520697ccd6d57ce13a97be
parent3062ec7a7febef75a2eebb3f26aab6a63f21de79 (diff)
downloadgrilo-plugins-wip/mschraal/tracker3-resolve-async.tar.gz
tracker3: Make resolve asyncwip/mschraal/tracker3-resolve-async
tracker_sparql_cursor_next is sync and can block, make it use the async API instead.
-rw-r--r--src/tracker3/grl-tracker-source-api.c71
1 files changed, 54 insertions, 17 deletions
diff --git a/src/tracker3/grl-tracker-source-api.c b/src/tracker3/grl-tracker-source-api.c
index 807a464..5517f47 100644
--- a/src/tracker3/grl-tracker-source-api.c
+++ b/src/tracker3/grl-tracker-source-api.c
@@ -340,25 +340,20 @@ TRACKER_QUERY_CB(GrlSourceBrowseSpec, browse, BROWSE)
TRACKER_QUERY_CB(GrlSourceSearchSpec, search, SEARCH)
static void
-tracker_resolve_cb (GObject *source_object,
- GAsyncResult *result,
- GrlTrackerOp *os)
+tracker_resolve_result_cb (GObject *source_object,
+ GAsyncResult *result,
+ GrlTrackerOp *os)
{
- TrackerSparqlStatement *statement = TRACKER_SPARQL_STATEMENT (source_object);
- GrlSourceResolveSpec *rs = (GrlSourceResolveSpec *) os->data;
+ TrackerSparqlCursor *cursor = TRACKER_SPARQL_CURSOR (source_object);
gint col;
GError *tracker_error = NULL, *error = NULL;
- TrackerSparqlCursor *cursor;
+ GrlSourceResolveSpec *rs = (GrlSourceResolveSpec *) os->data;
GRL_ODEBUG ("%s", __FUNCTION__);
- cursor = tracker_sparql_statement_execute_finish (statement,
- result, &tracker_error);
+ if (tracker_sparql_cursor_next_finish (cursor, result, &tracker_error)) {
+ GRL_ODEBUG ("\tend of parsing id=%u :)", rs->operation_id);
- if (!cursor)
- goto end_operation;
-
- if (tracker_sparql_cursor_next (cursor, NULL, &tracker_error)) {
/* Translate Sparql result into Grilo result */
for (col = 0 ; col < tracker_sparql_cursor_get_n_columns (cursor) ; col++) {
fill_grilo_media_from_sparql (GRL_TRACKER_SOURCE (rs->source),
@@ -371,10 +366,9 @@ tracker_resolve_cb (GObject *source_object,
rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, NULL);
}
- end_operation:
if (tracker_error) {
- GRL_WARNING ("Could not execute sparql resolve query : %s",
- tracker_error->message);
+ GRL_WARNING ("\terror in parsing resolve id=%u : %s",
+ rs->operation_id, tracker_error->message);
error = g_error_new (GRL_CORE_ERROR,
GRL_CORE_ERROR_RESOLVE_FAILED,
@@ -383,16 +377,59 @@ tracker_resolve_cb (GObject *source_object,
rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, error);
- g_error_free (tracker_error);
+ g_clear_error (&tracker_error);
g_error_free (error);
}
g_clear_object (&cursor);
-
grl_tracker_op_free (os);
}
static void
+tracker_resolve_cb (GObject *source_object,
+ GAsyncResult *result,
+ GrlTrackerOp *os)
+{
+ TrackerSparqlStatement *statement = TRACKER_SPARQL_STATEMENT (source_object);
+ GrlSourceResolveSpec *rs = (GrlSourceResolveSpec *) os->data;
+ GError *tracker_error = NULL, *error = NULL;
+ TrackerSparqlCursor *cursor;
+
+ GRL_ODEBUG ("%s", __FUNCTION__);
+
+ cursor = tracker_sparql_statement_execute_finish (statement,
+ result, &tracker_error);
+
+ if (!cursor) {
+ if (tracker_error) {
+ GRL_WARNING ("Could not execute sparql resolve query : %s",
+ tracker_error->message);
+
+ error = g_error_new (GRL_CORE_ERROR,
+ GRL_CORE_ERROR_RESOLVE_FAILED,
+ _("Failed to resolve: %s"),
+ tracker_error->message);
+
+ rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, error);
+
+ g_clear_error (&tracker_error);
+ g_error_free (error);
+ } else {
+ rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, NULL);
+ }
+
+ g_clear_object (&cursor);
+ grl_tracker_op_free (os);
+
+ return;
+ }
+
+ tracker_sparql_cursor_next_async (cursor, NULL,
+ (GAsyncReadyCallback) tracker_resolve_result_cb,
+ (gpointer) os);
+}
+
+static void
tracker_media_from_uri_cb (GObject *source_object,
GAsyncResult *result,
GrlTrackerOp *os)