Querying the Store: Tracker SPARQL Library Reference Manual

## Querying the Store

First, a TrackerSparqlConnection object must be acquired with `tracker_sparql_connection_get`. Then, a query can be launched either synchronously (`tracker_sparql_connection_query`) or asynchronously (`tracker_sparql_connection_query_async`). If launched asynchronously, the results of the query can be obtained with `tracker_sparql_connection_query_finish`.

If the query was successful, a TrackerSparqlCursor will be available. You can now iterate the results of the query both synchronously (with `tracker_sparql_cursor_next`) or asynchronously (with `tracker_sparql_cursor_next_async` and `tracker_sparql_cursor_next_finish`)

Once you end up with the query, remember to call `g_object_unref` for the TrackerSparqlCursor. And the same applies to the TrackerSparqlConnection when no longer needed.

The following program shows how Read-Only queries can be done to the store in a synchronous way:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include <libtracker-sparql/tracker-sparql.h>

    int main (int argc, const char **argv)
    {
      GError *error = NULL;
      TrackerSparqlConnection *connection;
      TrackerSparqlCursor *cursor;
      const gchar *query = "SELECT nie:url(?u) WHERE { ?u a nfo:FileDataObject }";

      connection = tracker_sparql_connection_bus_new ("org.freedesktop.Tracker3.Miner.Files", NULL, NULL, &error);
      if (!connection) {
        g_printerr ("Couldn't obtain a connection to the Tracker store: %s",
          error ? error->message : "unknown error");
        g_clear_error (&error);

        return 1;
      }

      /* Make a synchronous query to the store */
      cursor = tracker_sparql_connection_query (connection,
                                    query,
                                    NULL,
                                    &error);

      if (error) {
        /* Some error happened performing the query, not good */
        g_printerr ("Couldn't query the Tracker Store: '%s'",
          error->message);
        g_clear_error (&error);

        return 1;
      }

      /* Check results... */
      if (!cursor) {
        g_print ("No results found :-/\n");
      } else {
        gint i = 0;

        /* Iterate, synchronously, the results... */
        while (tracker_sparql_cursor_next (cursor, NULL, &error)) {
          g_print ("Result [%d]: %s\n",
         i++,
         tracker_sparql_cursor_get_string (cursor, 0, NULL));
        }

        g_print ("A total of '%d' results were found\n", i);

        g_object_unref (cursor);
      }

      g_object_unref (connection);

      return 0;
    }