[grilo-plugins/wip/mschraal/tracker3-resolve-async] tracker3: Make resolve async
- From: Marinus Schraal <mschraal src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [grilo-plugins/wip/mschraal/tracker3-resolve-async] tracker3: Make resolve async
- Date: Mon, 6 Sep 2021 13:58:41 +0000 (UTC)
commit d1e9815e396d188b76b622e8dc4e121058d7496b
Author: Marinus Schraal <mschraal gnome org>
Date: Mon Aug 16 21:13:30 2021 +0200
tracker3: Make resolve async
tracker_sparql_cursor_next is sync and can block, make it use the async
API instead.
src/tracker3/grl-tracker-source-api.c | 74 ++++++++++++++++++++++++++---------
1 file changed, 56 insertions(+), 18 deletions(-)
---
diff --git a/src/tracker3/grl-tracker-source-api.c b/src/tracker3/grl-tracker-source-api.c
index 807a464f..ea9adee7 100644
--- a/src/tracker3/grl-tracker-source-api.c
+++ b/src/tracker3/grl-tracker-source-api.c
@@ -31,6 +31,7 @@
#endif
#include <gio/gio.h>
+#include <glib/gprintf.h>
#include <tracker-sparql.h>
#include "grl-tracker.h"
@@ -340,25 +341,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 +367,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,15 +378,58 @@ 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,
@@ -666,7 +704,7 @@ grl_tracker_source_resolve (GrlSource *source,
statement =
grl_tracker_source_create_statement (GRL_TRACKER_SOURCE (source),
- query_type, NULL,
+ query_type, rs->options,
rs->keys, NULL, &error);
if (!statement) {
rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, error);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]