[tracker/libtracker-bus: 5/44] libtracker-bus: Refactoring the bus-cursor to have the array one in vala
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/libtracker-bus: 5/44] libtracker-bus: Refactoring the bus-cursor to have the array one in vala
- Date: Fri, 13 Aug 2010 14:05:02 +0000 (UTC)
commit 7889773da3a3109dd63a8e403613732a2add4798
Author: Philip Van Hoof <philip codeminded be>
Date: Mon Jul 19 12:05:14 2010 +0200
libtracker-bus: Refactoring the bus-cursor to have the array one in vala
src/libtracker-bus/Makefile.am | 9 +-
src/libtracker-bus/tracker-array-cursor.vala | 68 ++++++++
...racker-bus-cursor.c => tracker-bus-fd-cursor.c} | 177 +++++++-------------
src/libtracker-bus/tracker-bus.vala | 7 +-
4 files changed, 140 insertions(+), 121 deletions(-)
---
diff --git a/src/libtracker-bus/Makefile.am b/src/libtracker-bus/Makefile.am
index 1d95674..f2950c3 100644
--- a/src/libtracker-bus/Makefile.am
+++ b/src/libtracker-bus/Makefile.am
@@ -16,12 +16,13 @@ lib_LTLIBRARIES = libtracker-bus- TRACKER_API_VERSION@.la
libtracker_busincludedir = $(includedir)/tracker-$(TRACKER_API_VERSION)/libtracker-bus
libtracker_bus_la_VALASOURCES = \
- tracker-bus.vala
+ tracker-bus.vala \
+ tracker-array-cursor.vala
libtracker_bus_ TRACKER_API_VERSION@_la_SOURCES = \
- libtracker-bus.vala.stamp \
- $(libtracker_bus_la_VALASOURCES:.vala=.c) \
- tracker-bus-cursor.c
+ libtracker-bus.vala.stamp \
+ $(libtracker_bus_la_VALASOURCES:.vala=.c) \
+ tracker-bus-fd-cursor.c
libtracker_bus_ TRACKER_API_VERSION@_la_LDFLAGS = \
-shared -fPIC -module -avoid-version
diff --git a/src/libtracker-bus/tracker-array-cursor.vala b/src/libtracker-bus/tracker-array-cursor.vala
new file mode 100644
index 0000000..d82b5cd
--- /dev/null
+++ b/src/libtracker-bus/tracker-array-cursor.vala
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2010, Nokia <ivan frade nokia com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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.
+ */
+
+internal class Tracker.Bus.ArrayCursor : Tracker.Sparql.Cursor {
+ int rows;
+ int current_row;
+ char **results;
+ int cols;
+
+ public ArrayCursor (owned char** results, int rows, int cols) {
+ this.rows = rows;
+ this.cols = cols;
+ this.results = results;
+ }
+
+ public override int n_columns { get { return cols; } }
+
+ public override unowned string? get_string (int column, out long length = null) {
+ char **row;
+ unowned string str;
+
+ if (rows < 1) {
+ return null;
+ }
+
+ row = results + current_row;
+ str = (string) row[column];
+
+ if (&length != null) {
+ length = str.length;
+ }
+
+ return str;
+ }
+
+ public override bool next (Cancellable? cancellable = null) throws GLib.Error {
+ if (current_row >= rows - 1) {
+ return false;
+ }
+ current_row++;
+ return true;
+ }
+
+ public override async bool next_async (Cancellable? cancellable = null) throws GLib.Error {
+ /* This cursor isn't blocking, it's fine to just call next here */
+ return next (cancellable);
+ }
+
+ public override void rewind () {
+ current_row = 0;
+ }
+}
diff --git a/src/libtracker-bus/tracker-bus-cursor.c b/src/libtracker-bus/tracker-bus-fd-cursor.c
similarity index 52%
rename from src/libtracker-bus/tracker-bus-cursor.c
rename to src/libtracker-bus/tracker-bus-fd-cursor.c
index e10f0bd..d63adf8 100644
--- a/src/libtracker-bus/tracker-bus-cursor.c
+++ b/src/libtracker-bus/tracker-bus-fd-cursor.c
@@ -32,20 +32,21 @@
#include "tracker-bus.h"
-#define TRACKER_TYPE_BUS_CURSOR (tracker_bus_cursor_get_type ())
-#define TRACKER_BUS_CURSOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TRACKER_TYPE_BUS_CURSOR, TrackerBusCursor))
-#define TRACKER_BUS_CURSOR_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), TRACKER_TYPE_BUS_CURSOR, TrackerBusCursorClass))
-#define TRACKER_IS_BUS_CURSOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TRACKER_TYPE_BUS_CURSOR))
-#define TRACKER_IS_BUS_CURSOR_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((o), TRACKER_TYPE_BUS_CURSOR))
-#define TRACKER_BUS_CURSOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TRACKER_TYPE_BUS_CURSOR, TrackerBusCursorClass))
+#ifdef HAVE_DBUS_FD_PASSING
+
+#define TRACKER_TYPE_BUS_FD_CURSOR (tracker_bus_fd_cursor_get_type ())
+#define TRACKER_BUS_FD_CURSOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TRACKER_TYPE_BUS_FD_CURSOR, TrackerBusFDCursor))
+#define TRACKER_BUS_FD_CURSOR_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), TRACKER_TYPE_BUS_FD_CURSOR, TrackerBusFDCursorClass))
+#define TRACKER_IS_BUS_FD_CURSOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TRACKER_TYPE_BUS_FD_CURSOR))
+#define TRACKER_IS_BUS_FD_CURSOR_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((o), TRACKER_TYPE_BUS_FD_CURSOR))
+#define TRACKER_BUS_FD_CURSOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TRACKER_TYPE_BUS_FD_CURSOR, TrackerBusFDCursorClass))
-typedef struct TrackerBusCursor TrackerBusCursor;
-typedef struct TrackerBusCursorClass TrackerBusCursorClass;
+typedef struct TrackerBusFDCursor TrackerBusFDCursor;
+typedef struct TrackerBusFDCursorClass TrackerBusFDCursorClass;
-struct TrackerBusCursor {
+struct TrackerBusFDCursor {
TrackerSparqlCursor parent_instance;
-#ifdef HAVE_DBUS_FD_PASSING
char *buffer;
int buffer_index;
long buffer_size;
@@ -53,33 +54,25 @@ struct TrackerBusCursor {
guint n_columns;
int *offsets;
char *data;
-#else /* HAVE_DBUS_FD_PASSING */
- gint n_columns;
- gint rows;
- gint current_row;
- gchar **results;
-#endif /* HAVE_DBUS_FD_PASSING */
};
-struct TrackerBusCursorClass {
+struct TrackerBusFDCursorClass {
TrackerSparqlCursorClass parent_class;
};
-GType tracker_bus_cursor_get_type (void);
-void tracker_bus_cursor_finalize (GObject *object);
+GType tracker_bus_fd_cursor_get_type (void);
+void tracker_bus_fd_cursor_finalize (GObject *object);
-G_DEFINE_TYPE (TrackerBusCursor, tracker_bus_cursor, TRACKER_SPARQL_TYPE_CURSOR)
+G_DEFINE_TYPE (TrackerBusFDCursor, tracker_bus_fd_cursor, TRACKER_SPARQL_TYPE_CURSOR)
static void
-tracker_bus_cursor_rewind (TrackerBusCursor *cursor)
+tracker_bus_fd_cursor_rewind (TrackerBusFDCursor *cursor)
{
/* FIXME: Implement */
}
-#ifdef HAVE_DBUS_FD_PASSING
-
static inline int
-buffer_read_int (TrackerBusCursor *cursor)
+buffer_read_int (TrackerBusFDCursor *cursor)
{
int v = *((int *)(cursor->buffer + cursor->buffer_index));
@@ -88,14 +81,12 @@ buffer_read_int (TrackerBusCursor *cursor)
return v;
}
-#endif /* HAVE_DBUS_FD_PASSING */
static gboolean
-tracker_bus_cursor_iter_next (TrackerBusCursor *cursor,
- GCancellable *cancellable,
- GError **error)
+tracker_bus_fd_cursor_iter_next (TrackerBusFDCursor *cursor,
+ GCancellable *cancellable,
+ GError **error)
{
-#ifdef HAVE_DBUS_FD_PASSING
int last_offset;
if (cursor->buffer_index >= cursor->buffer_size) {
@@ -107,6 +98,7 @@ tracker_bus_cursor_iter_next (TrackerBusCursor *cursor,
* iteration = [4 bytes for number of columns,
* 4 bytes for last offset]
*/
+
cursor->n_columns = buffer_read_int (cursor);
cursor->offsets = (int *)(cursor->buffer + cursor->buffer_index);
cursor->buffer_index += sizeof (int) * (cursor->n_columns - 1);
@@ -114,20 +106,14 @@ tracker_bus_cursor_iter_next (TrackerBusCursor *cursor,
last_offset = buffer_read_int (cursor);
cursor->data = cursor->buffer + cursor->buffer_index;
cursor->buffer_index += last_offset + 1;
-#else /* HAVE_DBUS_FD_PASSING */
- if (cursor->current_row >= (gint) cursor->rows - 1) {
- return FALSE;
- }
- cursor->current_row++;
-#endif /* HAVE_DBUS_FD_PASSING */
return TRUE;
}
static void
-tracker_bus_cursor_iter_next_thread (GSimpleAsyncResult *res,
- GObject *object,
- GCancellable *cancellable)
+tracker_bus_fd_cursor_iter_next_thread (GSimpleAsyncResult *res,
+ GObject *object,
+ GCancellable *cancellable)
{
/* This is stolen from the direct access work,
* do we REALLY need to do this in the next thread?
@@ -136,7 +122,7 @@ tracker_bus_cursor_iter_next_thread (GSimpleAsyncResult *res,
GError *error = NULL;
gboolean result;
- result = tracker_bus_cursor_iter_next (TRACKER_BUS_CURSOR (object), cancellable, &error);
+ result = tracker_bus_fd_cursor_iter_next (TRACKER_BUS_FD_CURSOR (object), cancellable, &error);
if (error) {
g_simple_async_result_set_from_error (res, error);
} else {
@@ -145,21 +131,21 @@ tracker_bus_cursor_iter_next_thread (GSimpleAsyncResult *res,
}
static void
-tracker_bus_cursor_iter_next_async (TrackerBusCursor *cursor,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
+tracker_bus_fd_cursor_iter_next_async (TrackerBusFDCursor *cursor,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
GSimpleAsyncResult *res;
- res = g_simple_async_result_new (G_OBJECT (cursor), callback, user_data, tracker_bus_cursor_iter_next_async);
- g_simple_async_result_run_in_thread (res, tracker_bus_cursor_iter_next_thread, 0, cancellable);
+ res = g_simple_async_result_new (G_OBJECT (cursor), callback, user_data, tracker_bus_fd_cursor_iter_next_async);
+ g_simple_async_result_run_in_thread (res, tracker_bus_fd_cursor_iter_next_thread, 0, cancellable);
}
static gboolean
-tracker_bus_cursor_iter_next_finish (TrackerBusCursor *cursor,
- GAsyncResult *res,
- GError **error)
+tracker_bus_fd_cursor_iter_next_finish (TrackerBusFDCursor *cursor,
+ GAsyncResult *res,
+ GError **error)
{
if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) {
return FALSE;
@@ -168,45 +154,29 @@ tracker_bus_cursor_iter_next_finish (TrackerBusCursor *cursor,
}
static guint
-tracker_bus_cursor_get_n_columns (TrackerBusCursor *cursor)
+tracker_bus_fd_cursor_get_n_columns (TrackerBusFDCursor *cursor)
{
return cursor->n_columns;
}
static const gchar *
-tracker_bus_cursor_get_string (TrackerBusCursor *cursor,
- guint column,
- gint *length)
+tracker_bus_fd_cursor_get_string (TrackerBusFDCursor *cursor,
+ guint column,
+ glong *length)
{
const gchar *str = NULL;
if (length) {
*length = 0;
}
-
-#ifdef HAVE_DBUS_FD_PASSING
- g_return_val_if_fail (column < tracker_bus_cursor_get_n_columns (cursor), NULL);
+
+ g_return_val_if_fail (column < tracker_bus_fd_cursor_get_n_columns (cursor), NULL);
if (column == 0) {
str = cursor->data;
} else {
str = cursor->data + cursor->offsets[column - 1] + 1;
}
-#else /* HAVE_DBUS_FD_PASSING */
- gchar **row;
-
- g_return_val_if_fail (column < tracker_bus_cursor_get_n_columns (cursor), NULL);
-
- if (cursor->rows < 1) {
- return NULL;
- }
-
- g_return_val_if_fail (cursor->current_row < (gint) cursor->rows, NULL);
-
- row = cursor->results + cursor->current_row;
-
- str = row[column];
-#endif /* HAVE_DBUS_FD_PASSING */
if (length) {
*length = strlen (str);
@@ -216,54 +186,52 @@ tracker_bus_cursor_get_string (TrackerBusCursor *cursor,
}
static void
-tracker_bus_cursor_class_init (TrackerBusCursorClass *class)
+tracker_bus_fd_cursor_class_init (TrackerBusFDCursorClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
TrackerSparqlCursorClass *sparql_cursor_class = TRACKER_SPARQL_CURSOR_CLASS (class);
- object_class->finalize = tracker_bus_cursor_finalize;
+ object_class->finalize = tracker_bus_fd_cursor_finalize;
- sparql_cursor_class->get_n_columns = (gint (*) (TrackerSparqlCursor *)) tracker_bus_cursor_get_n_columns;
- sparql_cursor_class->get_string = (const gchar * (*) (TrackerSparqlCursor *, gint, gint*)) tracker_bus_cursor_get_string;
- sparql_cursor_class->next = (gboolean (*) (TrackerSparqlCursor *, GCancellable *, GError **)) tracker_bus_cursor_iter_next;
- sparql_cursor_class->next_async = (void (*) (TrackerSparqlCursor *, GCancellable *, GAsyncReadyCallback, gpointer)) tracker_bus_cursor_iter_next_async;
- sparql_cursor_class->next_finish = (gboolean (*) (TrackerSparqlCursor *, GAsyncResult *, GError **)) tracker_bus_cursor_iter_next_finish;
- sparql_cursor_class->rewind = (void (*) (TrackerSparqlCursor *)) tracker_bus_cursor_rewind;
+ sparql_cursor_class->get_n_columns = (gint (*) (TrackerSparqlCursor *)) tracker_bus_fd_cursor_get_n_columns;
+ sparql_cursor_class->get_string = (const gchar * (*) (TrackerSparqlCursor *, gint, glong*)) tracker_bus_fd_cursor_get_string;
+ sparql_cursor_class->next = (gboolean (*) (TrackerSparqlCursor *, GCancellable *, GError **)) tracker_bus_fd_cursor_iter_next;
+ sparql_cursor_class->next_async = (void (*) (TrackerSparqlCursor *, GCancellable *, GAsyncReadyCallback, gpointer)) tracker_bus_fd_cursor_iter_next_async;
+ sparql_cursor_class->next_finish = (gboolean (*) (TrackerSparqlCursor *, GAsyncResult *, GError **)) tracker_bus_fd_cursor_iter_next_finish;
+ sparql_cursor_class->rewind = (void (*) (TrackerSparqlCursor *)) tracker_bus_fd_cursor_rewind;
}
void
-tracker_bus_cursor_init (TrackerBusCursor *cursor)
+tracker_bus_fd_cursor_init (TrackerBusFDCursor *cursor)
{
}
void
-tracker_bus_cursor_finalize (GObject *object)
+tracker_bus_fd_cursor_finalize (GObject *object)
{
- TrackerBusCursor *cursor;
+ TrackerBusFDCursor *cursor;
- cursor = TRACKER_BUS_CURSOR (object);
+ cursor = TRACKER_BUS_FD_CURSOR (object);
-#ifdef HAVE_DBUS_FD_PASSING
g_free (cursor->buffer);
-#else /* HAVE_DBUS_FD_PASSING */
- g_strfreev (cursor->results);
-#endif /* HAVE_DBUS_FD_PASSING */
- G_OBJECT_CLASS (tracker_bus_cursor_parent_class)->finalize (object);
+ G_OBJECT_CLASS (tracker_bus_fd_cursor_parent_class)->finalize (object);
}
-// Public API
+#endif /* HAVE_DBUS_FD_PASSING */
+
+/* Public API */
TrackerSparqlCursor *
-tracker_bus_query (DBusGConnection *gconnection,
- const gchar *query,
- GError **error)
+tracker_bus_fd_query (DBusGConnection *gconnection,
+ const gchar *query,
+ GError **error)
{
#ifdef HAVE_DBUS_FD_PASSING
DBusConnection *connection;
DBusMessage *message;
DBusMessageIter iter;
- TrackerBusCursor *cursor;
+ TrackerBusFDCursor *cursor;
GError *inner_error = NULL;
int pipefd[2];
@@ -288,7 +256,7 @@ tracker_bus_query (DBusGConnection *gconnection,
dbus_message_iter_append_basic (&iter, DBUS_TYPE_UNIX_FD, &pipefd[1]);
close (pipefd[1]);
- cursor = g_object_new (TRACKER_TYPE_BUS_CURSOR, NULL);
+ cursor = g_object_new (TRACKER_TYPE_BUS_FD_CURSOR, NULL);
tracker_dbus_send_and_splice (connection,
message,
@@ -305,26 +273,9 @@ tracker_bus_query (DBusGConnection *gconnection,
cursor = NULL;
}
return TRACKER_SPARQL_CURSOR (cursor);
-#else /* HAVE_DBUS_FD_PASSING */
- return NULL;
+#else /* HAVE_DBUS_FD_PASSING */
+ g_assert_not_reached ();
+ return NULL;
#endif /* HAVE_DBUS_FD_PASSING */
}
-TrackerSparqlCursor *
-tracker_bus_query_results_to_cursor (char **results,
- int rows,
- int cols)
-{
- TrackerBusCursor *cursor;
-
- cursor = g_object_new (TRACKER_TYPE_BUS_CURSOR, NULL);
-
-#ifndef HAVE_DBUS_FD_PASSING
- cursor->rows = rows;
- cursor->current_row = -1;
- cursor->n_columns = cols;
- cursor->results = results;
-#endif /* HAVE_DBUS_FD_PASSING */
-
- return TRACKER_SPARQL_CURSOR (cursor);
-}
diff --git a/src/libtracker-bus/tracker-bus.vala b/src/libtracker-bus/tracker-bus.vala
index 140b2d5..e4b63c4 100644
--- a/src/libtracker-bus/tracker-bus.vala
+++ b/src/libtracker-bus/tracker-bus.vala
@@ -23,8 +23,7 @@ private interface Tracker.Bus.Resources : GLib.Object {
}
// Imported DBus FD API until we have support with Vala
-public extern Tracker.Sparql.Cursor tracker_bus_query (DBus.Connection connection, string query) throws GLib.Error;
-public extern Tracker.Sparql.Cursor tracker_bus_query_results_to_cursor (owned char **results, int rows, int cols);
+public extern Tracker.Sparql.Cursor tracker_bus_fd_query (DBus.Connection connection, string query) throws GLib.Error;
// Actual class definition
public class Tracker.Bus.Connection : Tracker.Sparql.Connection {
@@ -69,10 +68,10 @@ public class Tracker.Bus.Connection : Tracker.Sparql.Connection {
if (use_steroids) {
- return tracker_bus_query (connection, sparql);
+ return tracker_bus_fd_query (connection, sparql);
} else {
string[,] results = resources.SparqlQuery (sparql);
- return tracker_bus_query_results_to_cursor ((owned) results, results.length[0], results.length[1]);
+ return new Tracker.Bus.ArrayCursor ((owned) results, results.length[0], results.length[1]);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]