From eaed6187fd1a3957c6cb88755788d6cc87a770a9 Mon Sep 17 00:00:00 2001 From: Adrien Bustany Date: Mon, 24 May 2010 11:54:48 -0400 Subject: Add Steroids example client This commit adds a steroids-sparql program. This program shows how to use the tracker_resources_sparql_query_iterate function to do a query and fetch the results. It does exactly the same thing as tracker-sparql -q. --- examples/Makefile.am | 3 +- examples/tracker-steroids/Makefile.am | 50 +++++++++++ examples/tracker-steroids/benchmark-update.c | 92 ++++++++++++++++++++ examples/tracker-steroids/benchmark.c | 92 ++++++++++++++++++++ examples/tracker-steroids/benchmark_tracker_ipc.c | 92 ++++++++++++++++++++ examples/tracker-steroids/steroids-sparql-async.c | 81 ++++++++++++++++++ .../steroids-sparql-update-async.c | 97 ++++++++++++++++++++++ examples/tracker-steroids/steroids-sparql.c | 69 +++++++++++++++ 8 files changed, 575 insertions(+), 1 deletion(-) create mode 100644 examples/tracker-steroids/Makefile.am create mode 100644 examples/tracker-steroids/benchmark-update.c create mode 100644 examples/tracker-steroids/benchmark.c create mode 100644 examples/tracker-steroids/benchmark_tracker_ipc.c create mode 100644 examples/tracker-steroids/steroids-sparql-async.c create mode 100644 examples/tracker-steroids/steroids-sparql-update-async.c create mode 100644 examples/tracker-steroids/steroids-sparql.c (limited to 'examples') diff --git a/examples/Makefile.am b/examples/Makefile.am index 41a8a6762..1664c21bc 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -3,4 +3,5 @@ include $(top_srcdir)/Makefile.decl SUBDIRS = \ libtracker-extract \ libtracker-miner \ - rss-reader + rss-reader \ + tracker-steroids diff --git a/examples/tracker-steroids/Makefile.am b/examples/tracker-steroids/Makefile.am new file mode 100644 index 000000000..5b87d307b --- /dev/null +++ b/examples/tracker-steroids/Makefile.am @@ -0,0 +1,50 @@ +include $(top_srcdir)/Makefile.decl + +INCLUDES = \ + -DSHAREDIR=\""$(datadir)"\" \ + -DG_LOG_DOMAIN=\"Tracker\" \ + -DTRACKER_COMPILATION \ + -I$(top_srcdir)/src \ + -I$(top_builddir)/src \ + -I$(top_builddir)/src/libtracker-client \ + $(WARN_CFLAGS) \ + $(GLIB2_CFLAGS) \ + $(GCOV_CFLAGS) \ + $(GIO_CFLAGS) \ + $(DBUS_CFLAGS) + +noinst_PROGRAMS = \ + steroids-sparql \ + steroids-sparql-async \ + steroids-sparql-update-async \ + benchmark \ + benchmark-update + +steroids_sparql_SOURCES = \ + steroids-sparql.c + +steroids_sparql_update_async_SOURCES=steroids-sparql-update-async.c + +benchmark_SOURCES= benchmark.c + +benchmark_update_SOURCES=benchmark-update.c + +steroids_sparql_LDADD = \ + $(top_builddir)/src/libtracker-client/libtracker-client-@TRACKER_API_VERSION@.la \ + $(top_builddir)/src/libtracker-common/libtracker-common.la \ + $(DBUS_LIBS) \ + $(GMODULE_LIBS) \ + $(GTHREAD_LIBS) \ + $(GIO_LIBS) \ + $(GCOV_LIBS) \ + $(GLIB2_LIBS) \ + -lz \ + -lm + +steroids_sparql_async_LDADD= $(steroids_sparql_LDADD) + +steroids_sparql_update_async_LDADD= $(steroids_sparql_LDADD) + +benchmark_LDADD= $(steroids_sparql_LDADD) + +benchmark_update_LDADD= $(steroids_sparql_LDADD) diff --git a/examples/tracker-steroids/benchmark-update.c b/examples/tracker-steroids/benchmark-update.c new file mode 100644 index 000000000..c673bc3fa --- /dev/null +++ b/examples/tracker-steroids/benchmark-update.c @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2010, Codeminded BVBA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include + +#define N_TRIES 500 + +int +main (int argc, char **argv) +{ + const char *query; + TrackerClient *client; + GError *error = NULL; + GTimer *timer; + int i; + double time_normal, time_steroids; + + if (argc != 2) { + fprintf (stderr, "Usage: %s query\n", argv[0]); + exit (1); + } + + query = argv[1]; + + client = tracker_client_new (0, 0); + + /* Run a first time to warm cache */ + for (i = 0; i < N_TRIES; i++) { + tracker_resources_sparql_update (client, query, &error); + + if (error) { + g_critical ("Query error: %s", error->message); + g_error_free (error); + exit (1); + } + } + + timer = g_timer_new (); + + for (i = 0; i < N_TRIES; i++) { + tracker_resources_sparql_update (client, query, &error); + + if (error) { + g_critical ("Query error: %s", error->message); + g_error_free (error); + g_timer_destroy (timer); + exit (1); + } + } + + time_normal = g_timer_elapsed (timer, NULL); + + g_timer_start (timer); + + for (i = 0; i < N_TRIES; i++) { + tracker_resources_sparql_update_fast (client, query, &error); + + if (error) { + g_critical ("Query error: %s", error->message); + g_error_free (error); + g_timer_destroy (timer); + exit (1); + } + } + + time_steroids = g_timer_elapsed (timer, NULL); + + printf ("Normal: %f seconds\n", time_normal/N_TRIES); + printf ("Steroids: %f seconds\n", time_steroids/N_TRIES); + printf ("Speedup: %f %%\n", 100 * (time_normal/time_steroids - 1)); + + return 0; +} diff --git a/examples/tracker-steroids/benchmark.c b/examples/tracker-steroids/benchmark.c new file mode 100644 index 000000000..a866f2095 --- /dev/null +++ b/examples/tracker-steroids/benchmark.c @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2010, Codeminded BVBA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + const char *query; + TrackerClient *client; + GError *error = NULL; + GPtrArray *results; + TrackerResultIterator *iterator; + char buffer[1024*1024]; + GTimer *timer; + int i, j; + double time_normal, time_steroids; + + if (argc != 2) { + fprintf (stderr, "Usage: %s query\n", argv[0]); + exit (1); + } + + query = argv[1]; + + client = tracker_client_new (0, 0); + + timer = g_timer_new (); + + results = tracker_resources_sparql_query (client, query, &error); + + if (error) { + g_critical ("Query error: %s", error->message); + g_error_free (error); + g_timer_destroy (timer); + exit (1); + } + + for (i = 0; i < results->len; i++) { + GStrv row = g_ptr_array_index (results, i); + + for (j = 0; row[j]; j++) { + memcpy (buffer, row[j], g_utf8_strlen (row[j], -1)); + } + } + + time_normal = g_timer_elapsed (timer, NULL); + + g_ptr_array_free (results, TRUE); + + g_timer_start (timer); + + iterator = tracker_resources_sparql_query_iterate (client, query, &error); + + while (tracker_result_iterator_has_next (iterator)) { + tracker_result_iterator_next (iterator); + + for (i = 0; i < tracker_result_iterator_n_columns (iterator); i++) { + const char *data = tracker_result_iterator_value (iterator, i); + memcpy (buffer, data, g_utf8_strlen (data, -1)); + } + } + + time_steroids = g_timer_elapsed (timer, NULL); + + tracker_result_iterator_free (iterator); + + printf ("Normal: %f seconds\n", time_normal); + printf ("Steroids: %f seconds\n", time_steroids); + printf ("Speedup: %f %%\n", 100 * (time_normal/time_steroids - 1)); + + return 0; +} diff --git a/examples/tracker-steroids/benchmark_tracker_ipc.c b/examples/tracker-steroids/benchmark_tracker_ipc.c new file mode 100644 index 000000000..a866f2095 --- /dev/null +++ b/examples/tracker-steroids/benchmark_tracker_ipc.c @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2010, Codeminded BVBA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + const char *query; + TrackerClient *client; + GError *error = NULL; + GPtrArray *results; + TrackerResultIterator *iterator; + char buffer[1024*1024]; + GTimer *timer; + int i, j; + double time_normal, time_steroids; + + if (argc != 2) { + fprintf (stderr, "Usage: %s query\n", argv[0]); + exit (1); + } + + query = argv[1]; + + client = tracker_client_new (0, 0); + + timer = g_timer_new (); + + results = tracker_resources_sparql_query (client, query, &error); + + if (error) { + g_critical ("Query error: %s", error->message); + g_error_free (error); + g_timer_destroy (timer); + exit (1); + } + + for (i = 0; i < results->len; i++) { + GStrv row = g_ptr_array_index (results, i); + + for (j = 0; row[j]; j++) { + memcpy (buffer, row[j], g_utf8_strlen (row[j], -1)); + } + } + + time_normal = g_timer_elapsed (timer, NULL); + + g_ptr_array_free (results, TRUE); + + g_timer_start (timer); + + iterator = tracker_resources_sparql_query_iterate (client, query, &error); + + while (tracker_result_iterator_has_next (iterator)) { + tracker_result_iterator_next (iterator); + + for (i = 0; i < tracker_result_iterator_n_columns (iterator); i++) { + const char *data = tracker_result_iterator_value (iterator, i); + memcpy (buffer, data, g_utf8_strlen (data, -1)); + } + } + + time_steroids = g_timer_elapsed (timer, NULL); + + tracker_result_iterator_free (iterator); + + printf ("Normal: %f seconds\n", time_normal); + printf ("Steroids: %f seconds\n", time_steroids); + printf ("Speedup: %f %%\n", 100 * (time_normal/time_steroids - 1)); + + return 0; +} diff --git a/examples/tracker-steroids/steroids-sparql-async.c b/examples/tracker-steroids/steroids-sparql-async.c new file mode 100644 index 000000000..ee2d04a3f --- /dev/null +++ b/examples/tracker-steroids/steroids-sparql-async.c @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2010, Codeminded BVBA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include + +#include + +static TrackerClient *client; +static GMainLoop *main_loop; + +static void +query_cb (TrackerResultIterator *iterator, + GError *error, + gpointer user_data) +{ + if (!iterator) { + fprintf (stderr, "Query preparation failed, %s\n", error->message); + g_error_free (error); + exit (1); + } + + while (tracker_result_iterator_has_next (iterator)) { + int i; + + tracker_result_iterator_next (iterator); + + for (i = 0; i < tracker_result_iterator_n_columns (iterator); i++) { + printf ("%s", tracker_result_iterator_value (iterator, i)); + + if (i != tracker_result_iterator_n_columns (iterator) - 1) { + printf (", "); + } + } + + printf ("\n"); + } + + tracker_result_iterator_free (iterator); + g_object_unref (client); + + g_main_loop_quit (main_loop); +} + +int +main (int argc, char **argv) { + const char *query; + + if (argc != 2) { + fprintf (stderr, "Usage: %s query\n", argv[0]); + exit (1); + } + + query = argv[1]; + + main_loop = g_main_loop_new (NULL, FALSE); + + client = tracker_client_new (0, 0); + + tracker_resources_sparql_query_iterate_async (client, query, query_cb, NULL); + + g_main_loop_run (main_loop); + + return 0; +} diff --git a/examples/tracker-steroids/steroids-sparql-update-async.c b/examples/tracker-steroids/steroids-sparql-update-async.c new file mode 100644 index 000000000..008cf66d4 --- /dev/null +++ b/examples/tracker-steroids/steroids-sparql-update-async.c @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2010, Codeminded BVBA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include + +#include + +#include + +static TrackerClient *client; +static GMainLoop *main_loop; + +static void +query_cb (GPtrArray *results, + GError *error, + gpointer user_data) +{ + int i, j; + + if (error) { + g_critical ("Update failed: %s", error->message); + g_error_free (error); + g_object_unref (client); + g_main_loop_quit (main_loop); + return; + } + + for (i = 0; i < results->len; i++) { + GPtrArray *inner_array; + + inner_array = g_ptr_array_index (results, i); + + for (j = 0; j < inner_array->len; j++) { + GHashTable *hash; + GHashTableIter iter; + gpointer key, value; + + hash = g_ptr_array_index (inner_array, j); + + g_hash_table_iter_init (&iter, hash); + + while (g_hash_table_iter_next (&iter, &key, &value)) { + g_printf ("%s -> %s\n", (char *)key, (char *)value); + } + + g_hash_table_unref (hash); + } + } + + g_ptr_array_free (results, TRUE); + + g_object_unref (client); + + g_main_loop_quit (main_loop); +} + +int +main (int argc, char **argv) { + const char *query; + + if (argc != 2) { + fprintf (stderr, "Usage: %s query\n", argv[0]); + exit (1); + } + + query = argv[1]; + + main_loop = g_main_loop_new (NULL, FALSE); + + client = tracker_client_new (0, 0); + + if (tracker_resources_sparql_update_blank_fast_async (client, query, query_cb, NULL) == 0) { + g_critical ("error running update"); + return 1; + } + + g_main_loop_run (main_loop); + + return 0; +} diff --git a/examples/tracker-steroids/steroids-sparql.c b/examples/tracker-steroids/steroids-sparql.c new file mode 100644 index 000000000..ba2fc71dc --- /dev/null +++ b/examples/tracker-steroids/steroids-sparql.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2010, Codeminded BVBA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include + +#include + +int +main (int argc, char **argv) { + const char *query; + TrackerClient *client; + GError *error = NULL; + TrackerResultIterator *iterator; + + if (argc != 2) { + fprintf (stderr, "Usage: %s query\n", argv[0]); + exit (1); + } + + query = argv[1]; + + client = tracker_client_new (0, 0); + + iterator = tracker_resources_sparql_query_iterate (client, query, &error); + + if (!iterator) { + fprintf (stderr, "Query preparation failed, %s\n", error->message); + g_error_free (error); + exit (1); + } + + while (tracker_result_iterator_has_next (iterator)) { + int i; + + tracker_result_iterator_next (iterator); + + for (i = 0; i < tracker_result_iterator_n_columns (iterator); i++) { + printf ("%s", tracker_result_iterator_value (iterator, i)); + + if (i != tracker_result_iterator_n_columns (iterator) - 1) { + printf (", "); + } + } + + printf ("\n"); + } + + tracker_result_iterator_free (iterator); + g_object_unref (client); + + return 0; +} -- cgit v1.2.1