[grilo-plugins] tracker: Refactor query() function



commit b0f0e3cdb50f30f92714e63dac7c8f627f6fcae1
Author: Juan A. Suarez Romero <jasuarez igalia com>
Date:   Fri Jan 14 13:07:41 2011 +0000

    tracker: Refactor query() function
    
    Move core code to its own private function, so it can be reused by another
    functions.
    
    Signed-off-by: Juan A. Suarez Romero <jasuarez igalia com>

 src/tracker/grl-tracker.c |  200 +++++++++++++++++++++++++-------------------
 1 files changed, 114 insertions(+), 86 deletions(-)
---
diff --git a/src/tracker/grl-tracker.c b/src/tracker/grl-tracker.c
index c24bf57..956341d 100644
--- a/src/tracker/grl-tracker.c
+++ b/src/tracker/grl-tracker.c
@@ -195,9 +195,9 @@ build_grilo_media (const gchar *rdf_type)
 
   /* As rdf_type can be formed by several types, split them */
   rdf_single_type = g_strsplit (rdf_type, ",", -1);
-  i = g_strv_length (rdf_single_type);
+  i = g_strv_length (rdf_single_type) - 1;
 
-  while (!media && i > 0) {
+  while (!media && i >= 0) {
     if (g_str_has_suffix (rdf_single_type[i], RDF_TYPE_AUDIO)) {
       media = grl_media_audio_new ();
     } else if (g_str_has_suffix (rdf_single_type[i], RDF_TYPE_VIDEO)) {
@@ -219,6 +219,110 @@ build_grilo_media (const gchar *rdf_type)
   return media;
 }
 
+/* Execute a sparql query an sends the elements as Grilo medias.
+   Returns FALSE if the query failed.
+*/
+static gboolean
+do_tracker_query (GrlMediaSource *source,
+                  const gchar *sparql_query,
+                  GrlMediaSourceResultCb callback,
+                  guint query_id,
+                  gpointer user_data,
+                  GError **error)
+{
+  GError *tracker_error = NULL;
+  GrlKeyID key;
+  GrlMedia *media;
+  TrackerSparqlCursor *cursor;
+  const gchar *key_name = NULL;
+  int i;
+  int n_columns;
+  int type_column;
+
+  cursor =
+    tracker_sparql_connection_query (GRL_TRACKER_SOURCE (source)->priv->tracker_connection,
+                                     sparql_query,
+                                     NULL,
+                                     &tracker_error);
+  if (!cursor) {
+    if (error) {
+      *error = g_error_new (GRL_CORE_ERROR,
+                            GRL_CORE_ERROR_QUERY_FAILED,
+                            "Query failed: %s",
+                            tracker_error->message);
+    }
+    return FALSE;
+  }
+
+  while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
+      n_columns = tracker_sparql_cursor_get_n_columns (cursor);
+      /* Search column with type */
+      for (type_column = 0; type_column < n_columns; type_column++) {
+        if (strcmp (tracker_sparql_cursor_get_variable_name (cursor,
+                                                             type_column),
+                    MEDIA_TYPE) == 0) {
+          break;
+        }
+      }
+
+      /* type not found */
+      if (type_column >= n_columns) {
+        continue;
+      }
+
+      media = build_grilo_media (tracker_sparql_cursor_get_string (cursor,
+                                                                   type_column,
+                                                                   NULL));
+      /* Unknown media */
+      if (!media) {
+        continue;
+      }
+
+      /* Fill data */
+      for (i = 0; i < n_columns; i++) {
+        /* Skip type */
+        if (i == type_column) {
+          continue;
+        }
+
+        /* Column has no value */
+        if (!tracker_sparql_cursor_is_bound (cursor, i)) {
+          continue;
+        }
+
+        key_name = tracker_sparql_cursor_get_variable_name (cursor, i);
+
+        /* Unnamed column */
+        if (!key_name) {
+          continue;
+        }
+
+        key = grl_plugin_registry_lookup_metadata_key (grl_plugin_registry_get_default (),
+                                                       key_name);
+        /* Unknown key */
+        if (!key) {
+          continue;
+        }
+
+        grl_data_set_string (GRL_DATA (media),
+                             key,
+                             tracker_sparql_cursor_get_string (cursor,
+                                                               i,
+                                                               NULL));
+      }
+
+      /* Send data */
+      callback (source, query_id, media, -1, user_data, NULL);
+  }
+
+  /* Notify there is no more elements */
+  callback (source, query_id, NULL, 0, user_data, NULL);
+
+  g_object_unref (cursor);
+
+  return TRUE;
+}
+
 /* ================== API Implementation ================ */
 
 static GrlSupportedOps
@@ -299,14 +403,6 @@ grl_tracker_source_query (GrlMediaSource *source,
                           GrlMediaSourceQuerySpec *qs)
 {
   GError *error = NULL;
-  GError *tracker_error = NULL;
-  GrlKeyID key;
-  GrlMedia *media;
-  TrackerSparqlCursor *cursor;
-  const gchar *key_name = NULL;
-  int i;
-  int n_columns;
-  int type_column;
 
   GRL_DEBUG ("grl_tracker_source_query");
 
@@ -317,85 +413,17 @@ grl_tracker_source_query (GrlMediaSource *source,
     goto send_error;
   }
 
-  cursor =
-    tracker_sparql_connection_query (GRL_TRACKER_SOURCE (source)->priv->tracker_connection,
-                                     qs->query,
-                                     NULL,
-                                     &tracker_error);
-  if (!cursor) {
-    error = g_error_new (GRL_CORE_ERROR,
-                         GRL_CORE_ERROR_QUERY_FAILED,
-                         "Query failed: %s",
-                         tracker_error->message);
-    goto send_error;
-  }
+  do_tracker_query (source,
+                    qs->query,
+                    qs->callback,
+                    qs->query_id,
+                    qs->user_data,
+                    &error);
 
-  while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
-      n_columns = tracker_sparql_cursor_get_n_columns (cursor);
-      /* Search column with type */
-      for (type_column = 0; type_column < n_columns; type_column++) {
-        if (strcmp (tracker_sparql_cursor_get_variable_name (cursor,
-                                                             type_column),
-                    MEDIA_TYPE) == 0) {
-          break;
-        }
-      }
-
-      /* type not found */
-      if (type_column >= n_columns) {
-        continue;
-      }
-
-      media = build_grilo_media (tracker_sparql_cursor_get_string (cursor,
-                                                                   type_column,
-                                                                   NULL));
-      /* Unknown media */
-      if (!media) {
-        continue;
-      }
-
-      /* Fill data */
-      for (i = 0; i < n_columns; i++) {
-        /* Skip type */
-        if (i == type_column) {
-          continue;
-        }
-
-        /* Column has no value */
-        if (!tracker_sparql_cursor_is_bound (cursor, i)) {
-          continue;
-        }
-
-        key_name = tracker_sparql_cursor_get_variable_name (cursor, i);
-
-        /* Unnamed column */
-        if (!key_name) {
-          continue;
-        }
-
-        key = grl_plugin_registry_lookup_metadata_key (grl_plugin_registry_get_default (),
-                                                       key_name);
-        /* Unknown key */
-        if (!key) {
-          continue;
-        }
-
-        grl_data_set_string (GRL_DATA (media),
-                             key,
-                             tracker_sparql_cursor_get_string (cursor,
-                                                               i,
-                                                               NULL));
-      }
-
-      /* Send data */
-      qs->callback (qs->source, qs->query_id, media, -1, qs->user_data, NULL);
+  if (error) {
+    goto send_error;
   }
 
-  /* Notify there is no more elements */
-  qs->callback (qs->source, qs->query_id, NULL, 0, qs->user_data, NULL);
-
-  g_object_unref (cursor);
-
   return;
 
  send_error:



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