[tracker/return-types] Implement fetching variable-names further, not working yet
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/return-types] Implement fetching variable-names further, not working yet
- Date: Fri, 10 Sep 2010 11:19:35 +0000 (UTC)
commit 465de5050897040f547f7a25e33f4514e556ad37
Author: Philip Van Hoof <philip codeminded be>
Date: Fri Sep 10 13:19:12 2010 +0200
Implement fetching variable-names further, not working yet
src/libtracker-bus/tracker-bus-fd-cursor.c | 3 ++
src/libtracker-client/tracker.c | 2 +
src/libtracker-common/tracker-dbus.c | 39 +++++++++++++++++++-
src/libtracker-common/tracker-dbus.h | 2 +
src/libtracker-data/tracker-db-interface-sqlite.c | 26 --------------
src/libtracker-data/tracker-db-interface.h | 1 -
src/miners/fs/tracker-miner-files.c | 2 +
src/tracker-store/tracker-steroids.c | 12 ++++++-
tests/functional-tests/shared-query-test.vala | 7 +++-
9 files changed, 63 insertions(+), 31 deletions(-)
---
diff --git a/src/libtracker-bus/tracker-bus-fd-cursor.c b/src/libtracker-bus/tracker-bus-fd-cursor.c
index 7cd7874..15a5523 100644
--- a/src/libtracker-bus/tracker-bus-fd-cursor.c
+++ b/src/libtracker-bus/tracker-bus-fd-cursor.c
@@ -313,6 +313,7 @@ tracker_bus_fd_query (DBusGConnection *gconnection,
static void
query_async_cb (gpointer buffer,
gssize buffer_size,
+ GStrv variable_names,
GError *error,
gpointer user_data)
{
@@ -331,6 +332,7 @@ query_async_cb (gpointer buffer,
cursor->buffer = buffer;
cursor->buffer_size = buffer_size;
+ cursor->variable_names = g_strdupv (variable_names);
g_simple_async_result_set_op_res_gpointer (res, cursor, g_object_unref);
}
@@ -388,6 +390,7 @@ tracker_bus_fd_query_async (DBusGConnection *gconnection,
tracker_dbus_send_and_splice_async (connection,
message,
pipefd[0],
+ TRUE,
cancellable,
query_async_cb, res);
/* message is destroyed by tracker_dbus_send_and_splice_async */
diff --git a/src/libtracker-client/tracker.c b/src/libtracker-client/tracker.c
index e31016f..9e802ed 100644
--- a/src/libtracker-client/tracker.c
+++ b/src/libtracker-client/tracker.c
@@ -641,6 +641,7 @@ iterator_buffer_read_int (TrackerResultIterator *iterator)
static void
callback_iterator (void *buffer,
gssize buffer_size,
+ GStrv variable_names,
GError *error,
gpointer user_data)
{
@@ -2408,6 +2409,7 @@ tracker_resources_sparql_query_iterate_async (TrackerClient *client,
tracker_dbus_send_and_splice_async (connection,
message,
pipefd[0],
+ TRUE,
cancellable,
callback_iterator,
fad);
diff --git a/src/libtracker-common/tracker-dbus.c b/src/libtracker-common/tracker-dbus.c
index e07a90c..340703c 100644
--- a/src/libtracker-common/tracker-dbus.c
+++ b/src/libtracker-common/tracker-dbus.c
@@ -56,6 +56,7 @@ typedef struct {
DBusPendingCall *call;
TrackerDBusSendAndSpliceCallback callback;
gpointer user_data;
+ gboolean expect_variable_names;
} SendAndSpliceData;
static GSList *hooks;
@@ -841,6 +842,7 @@ static SendAndSpliceData *
send_and_splice_data_new (GInputStream *unix_input_stream,
GInputStream *buffered_input_stream,
GOutputStream *output_stream,
+ gboolean expect_variable_names,
DBusPendingCall *call,
TrackerDBusSendAndSpliceCallback callback,
gpointer user_data)
@@ -854,6 +856,7 @@ send_and_splice_data_new (GInputStream *unix_input_stream,
data->call = call;
data->callback = callback;
data->user_data = user_data;
+ data->expect_variable_names = expect_variable_names;
return data;
}
@@ -897,25 +900,55 @@ send_and_splice_async_callback (GObject *source,
dbus_set_g_error (&error, &dbus_error);
dbus_error_free (&dbus_error);
- (* data->callback) (NULL, -1, error, data->user_data);
+ (* data->callback) (NULL, -1, NULL, error, data->user_data);
/* Note: GError should be freed by callback. We do this to be aligned
* with the behavior of dbus-glib, where if an error happens, the
* GError passed to the callback is supposed to be disposed by the
* callback itself. */
} else {
+ GStrv v_names = NULL;
+
+ if (data->expect_variable_names) {
+ guint i;
+ GPtrArray *found = g_ptr_array_new ();
+ DBusMessageIter iter, arr;
+
+ dbus_message_iter_init (reply, &iter);
+ dbus_message_iter_recurse (&iter, &arr);
+
+ while (dbus_message_iter_has_next(&arr)) {
+ gchar *str;
+
+ dbus_message_iter_get_basic (&arr, &str);
+ g_ptr_array_add (found, str);
+ dbus_message_iter_next (&arr);
+ }
+
+ v_names = g_new0 (gchar *, found->len + 1);
+ for (i = 0; i < found->len; i++) {
+ v_names[i] = g_ptr_array_index (found, i);
+ }
+
+ g_ptr_array_free (found, FALSE);
+ }
+
dbus_pending_call_cancel (data->call);
+
(* data->callback) (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (data->output_stream)),
g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (data->output_stream)),
+ v_names,
NULL,
data->user_data);
+
+ g_strfreev (v_names);
}
} else {
/* If any error happened, we're not passing any received data, so we
* need to free it */
g_free (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (data->output_stream)));
- (* data->callback) (NULL, -1, error, data->user_data);
+ (* data->callback) (NULL, -1, NULL, error, data->user_data);
/* Note: GError should be freed by callback. We do this to be aligned
* with the behavior of dbus-glib, where if an error happens, the
@@ -934,6 +967,7 @@ gboolean
tracker_dbus_send_and_splice_async (DBusConnection *connection,
DBusMessage *message,
int fd,
+ gboolean expect_variable_names,
GCancellable *cancellable,
TrackerDBusSendAndSpliceCallback callback,
gpointer user_data)
@@ -968,6 +1002,7 @@ tracker_dbus_send_and_splice_async (DBusConnection *connection
data = send_and_splice_data_new (unix_input_stream,
buffered_input_stream,
output_stream,
+ expect_variable_names,
call,
callback,
user_data);
diff --git a/src/libtracker-common/tracker-dbus.h b/src/libtracker-common/tracker-dbus.h
index f2dd4f5..7890b03 100644
--- a/src/libtracker-common/tracker-dbus.h
+++ b/src/libtracker-common/tracker-dbus.h
@@ -105,6 +105,7 @@ typedef void (*TrackerDBusRequestFunc) (guint request_id,
typedef void (*TrackerDBusSendAndSpliceCallback) (void *buffer,
gssize buffer_size,
+ GStrv variable_names,
GError *error,
gpointer user_data);
@@ -191,6 +192,7 @@ gboolean tracker_dbus_send_and_splice (DBusConnection
gboolean tracker_dbus_send_and_splice_async (DBusConnection *connection,
DBusMessage *message,
int fd,
+ gboolean expect_variable_names,
GCancellable *cancellable,
TrackerDBusSendAndSpliceCallback callback,
gpointer user_data);
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c b/src/libtracker-data/tracker-db-interface-sqlite.c
index 548828c..139a62b 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.c
+++ b/src/libtracker-data/tracker-db-interface-sqlite.c
@@ -66,7 +66,6 @@ struct TrackerDBCursor {
sqlite3_stmt *stmt;
TrackerDBStatement *ref_stmt;
gboolean finished;
- gchar **variable_names;
TrackerPropertyType *types;
gint n_types;
};
@@ -1058,9 +1057,6 @@ tracker_db_cursor_finalize (GObject *object)
g_free (cursor->types);
- g_strfreev (cursor->variable_names);
- cursor->variable_names = NULL;
-
if (cursor->ref_stmt) {
cursor->ref_stmt->stmt_is_sunk = FALSE;
tracker_db_statement_sqlite_reset (cursor->ref_stmt);
@@ -1334,28 +1330,6 @@ tracker_db_cursor_get_value_type (TrackerDBCursor *cursor, guint column)
}
}
-const gchar**
-tracker_db_cursor_get_variable_names (TrackerDBCursor *cursor)
-{
- gint n_columns = sqlite3_column_count (cursor->stmt);
-
- if (cursor->variable_names == NULL) {
- gint i;
-
- cursor->variable_names = g_new0 (gchar *, n_columns);
-
- for (i = 0 ; i < n_columns; i++) {
- const char *sqlite_name = sqlite3_column_name (cursor->stmt, i);
- if (g_str_has_suffix (sqlite_name, "_u")) {
- /* SPARQL variable */
- cursor->variable_names[i] = g_strndup (sqlite_name, strlen (sqlite_name - strlen ("_u")));
- }
- }
- }
-
- return (const gchar **) cursor->variable_names;
-}
-
const gchar*
tracker_db_cursor_get_variable_name (TrackerDBCursor *cursor, guint column)
{
diff --git a/src/libtracker-data/tracker-db-interface.h b/src/libtracker-data/tracker-db-interface.h
index 78d5734..d63e1b1 100644
--- a/src/libtracker-data/tracker-db-interface.h
+++ b/src/libtracker-data/tracker-db-interface.h
@@ -148,7 +148,6 @@ gboolean tracker_db_cursor_iter_next (TrackerDBCursor
guint tracker_db_cursor_get_n_columns (TrackerDBCursor *cursor);
const gchar* tracker_db_cursor_get_variable_name (TrackerDBCursor *cursor,
guint column);
-const gchar** tracker_db_cursor_get_variable_names (TrackerDBCursor *cursor);
TrackerSparqlValueType tracker_db_cursor_get_value_type (TrackerDBCursor *cursor,
guint column);
void tracker_db_cursor_get_value (TrackerDBCursor *cursor,
diff --git a/src/miners/fs/tracker-miner-files.c b/src/miners/fs/tracker-miner-files.c
index cc633c3..6438863 100644
--- a/src/miners/fs/tracker-miner-files.c
+++ b/src/miners/fs/tracker-miner-files.c
@@ -2011,6 +2011,7 @@ fast_async_data_free (FastAsyncData *data)
static void
get_metadata_fast_cb (void *buffer,
gssize buffer_size,
+ GStrv variable_names,
GError *error,
gpointer user_data)
{
@@ -2083,6 +2084,7 @@ get_metadata_fast_async (DBusConnection *connection,
tracker_dbus_send_and_splice_async (connection,
message,
pipefd[0],
+ FALSE,
cancellable,
get_metadata_fast_cb,
data);
diff --git a/src/tracker-store/tracker-steroids.c b/src/tracker-store/tracker-steroids.c
index 3c49f05..538514d 100644
--- a/src/tracker-store/tracker-steroids.c
+++ b/src/tracker-store/tracker-steroids.c
@@ -266,6 +266,8 @@ query_inthread (TrackerDBCursor *cursor,
gint *column_offsets;
gint *column_types;
const gchar **column_data;
+ guint i;
+ GStrv variable_names = NULL;
ptr = g_slice_new0 (InThreadPtr);
info = user_data;
@@ -290,6 +292,11 @@ query_inthread (TrackerDBCursor *cursor,
column_data = alloca (n_columns * sizeof (gchar*));
column_types = alloca (n_columns * sizeof (gchar*));
+ variable_names = g_new0 (gchar *, n_columns);
+ for (i = 0; i < n_columns; i++) {
+ variable_names[i] = g_strdup (tracker_db_cursor_get_variable_name (cursor, i));
+ }
+
while (tracker_db_cursor_iter_next (cursor, cancellable, &loop_error)) {
gint i;
guint last_offset = -1;
@@ -373,8 +380,11 @@ end_query_inthread:
if (loop_error) {
ptr->error = loop_error;
+ if (variable_names) {
+ g_strfreev (variable_names);
+ }
} else {
- ptr->variable_names = g_strdupv ((gchar **) tracker_db_cursor_get_variable_names (cursor));
+ ptr->variable_names = variable_names;
}
return ptr;
diff --git a/tests/functional-tests/shared-query-test.vala b/tests/functional-tests/shared-query-test.vala
index 2f0eba9..d3b35da 100644
--- a/tests/functional-tests/shared-query-test.vala
+++ b/tests/functional-tests/shared-query-test.vala
@@ -11,9 +11,14 @@ public class TestApp : GLib.Object {
}
int iter_cursor (Cursor cursor) {
+ int i;
+
+ for (i = 0; i < cursor.n_columns; i++) {
+ print ("%s%s", i != 0 ? " | " : "", cursor.get_variable_name (i));
+ }
+
try {
while (cursor.next()) {
- int i;
for (i = 0; i < cursor.n_columns; i++) {
print ("%s%s", i != 0 ? ",":"", cursor.get_string (i));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]