tracker r1472 - in branches/indexer-split: . src/trackerd
- From: mr svn gnome org
- To: svn-commits-list gnome org
- Subject: tracker r1472 - in branches/indexer-split: . src/trackerd
- Date: Fri, 23 May 2008 11:06:06 +0000 (UTC)
Author: mr
Date: Fri May 23 11:06:05 2008
New Revision: 1472
URL: http://svn.gnome.org/viewvc/tracker?rev=1472&view=rev
Log:
* src/trackerd/Makefile.am:
* src/trackerd/tracker-db-sqlite.c:
* src/trackerd/tracker-db-sqlite.h:
* src/trackerd/tracker-dbus-metadata.c:
* src/trackerd/tracker-field-data.[ch]:
* src/trackerd/tracker-field.c:
* src/trackerd/tracker-rdf-query.c:
* src/trackerd/tracker-xesam-query.c: Added the
tracker-field-data.[ch] to handle all FieldData code that used to
exist. Also fixed up some errors in the tracker-xesam-query.c
module where is_end_operator() and is_operator() were not proper
logic statements.
Added:
branches/indexer-split/src/trackerd/tracker-field-data.c
branches/indexer-split/src/trackerd/tracker-field-data.h
Modified:
branches/indexer-split/ChangeLog
branches/indexer-split/src/trackerd/Makefile.am
branches/indexer-split/src/trackerd/tracker-db-sqlite.c
branches/indexer-split/src/trackerd/tracker-db-sqlite.h
branches/indexer-split/src/trackerd/tracker-dbus-metadata.c
branches/indexer-split/src/trackerd/tracker-field.c
branches/indexer-split/src/trackerd/tracker-rdf-query.c
branches/indexer-split/src/trackerd/tracker-xesam-query.c
Modified: branches/indexer-split/src/trackerd/Makefile.am
==============================================================================
--- branches/indexer-split/src/trackerd/Makefile.am (original)
+++ branches/indexer-split/src/trackerd/Makefile.am Fri May 23 11:06:05 2008
@@ -104,6 +104,8 @@
tracker-email-utils.h \
tracker-field.c \
tracker-field.h \
+ tracker-field-data.c \
+ tracker-field-data.h \
tracker-indexer.c \
tracker-indexer.h \
tracker-index-stage.c \
Modified: branches/indexer-split/src/trackerd/tracker-db-sqlite.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-db-sqlite.c (original)
+++ branches/indexer-split/src/trackerd/tracker-db-sqlite.c Fri May 23 11:06:05 2008
@@ -5079,54 +5079,72 @@
return TRUE;
}
-
-FieldData *
-tracker_db_get_metadata_field (DBConnection *db_con, const char *service, const char *field_name, int field_count, gboolean is_select, gboolean is_condition)
+TrackerFieldData *
+tracker_db_get_metadata_field (DBConnection *db_con,
+ const gchar *service,
+ const gchar *field_name,
+ gint field_count,
+ gboolean is_select,
+ gboolean is_condition)
{
- FieldData *field_data = NULL;
- TrackerField *def;
-
- field_data = g_new0 (FieldData, 1);
-
- field_data->is_select = is_select;
- field_data->is_condition = is_condition;
- field_data->field_name = g_strdup (field_name);
+ TrackerFieldData *field_data = NULL;
+ TrackerField *def;
def = tracker_ontology_get_field_def (field_name);
if (def) {
-
- field_data->table_name = tracker_get_metadata_table (tracker_field_get_data_type (def));
- field_data->alias = g_strdup_printf ("M%d", field_count);
- field_data->data_type = tracker_field_get_data_type (def);
- field_data->id_field = g_strdup (tracker_field_get_id (def));
- field_data->multiple_values = tracker_field_get_multiple_values (def);
+ gchar *alias;
+ gchar *table_name;
+ gchar *this_field_name;
+ gchar *where_field;
+
+ field_data = g_object_new (TRACKER_TYPE_FIELD_DATA,
+ "is-select", is_select,
+ "is-condition", is_condition,
+ "field-name", field_name,
+ NULL);
+
+ alias = g_strdup_printf ("M%d", field_count);
+ table_name = tracker_get_metadata_table (tracker_field_get_data_type (def));
+
+ tracker_field_data_set_alias (field_data, alias);
+ tracker_field_data_set_table_name (field_data, table_name);
+ tracker_field_data_set_id_field (field_data, tracker_field_get_id (def));
+ tracker_field_data_set_data_type (field_data, tracker_field_get_data_type (def));
+ tracker_field_data_set_multiple_values (field_data, tracker_field_get_multiple_values (def));
- char *my_field = tracker_db_get_field_name (service, field_name);
+ this_field_name = tracker_db_get_field_name (service, field_name);
- if (my_field) {
- field_data->select_field = g_strdup_printf (" S.%s ", my_field);
- g_free (my_field);
- field_data->needs_join = FALSE;
+ if (this_field_name) {
+ gchar *str;
+
+ str = g_strdup_printf (" S.%s ", this_field_name);
+ tracker_field_data_set_select_field (field_data, str);
+ tracker_field_data_set_needs_join (field_data, FALSE);
+ g_free (str);
+ g_free (this_field_name);
} else {
- char *disp_field = tracker_ontology_get_display_field (def);
- field_data->select_field = g_strdup_printf ("M%d.%s", field_count, disp_field);
- g_free (disp_field);
- field_data->needs_join = TRUE;
+ gchar *str;
+ gchar *display_field;
+
+ display_field = tracker_ontology_get_display_field (def);
+ str = g_strdup_printf ("M%d.%s", field_count, display_field);
+ tracker_field_data_set_select_field (field_data, str);
+ tracker_field_data_set_needs_join (field_data, TRUE);
+ g_free (str);
+ g_free (display_field);
}
if (tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_DOUBLE) {
- field_data->where_field = g_strdup_printf ("M%d.MetaDataDisplay", field_count);
+ where_field = g_strdup_printf ("M%d.MetaDataDisplay", field_count);
} else {
- field_data->where_field = g_strdup_printf ("M%d.MetaDataValue", field_count);
+ where_field = g_strdup_printf ("M%d.MetaDataValue", field_count);
}
- } else {
- g_free (field_data);
- return NULL;
+ tracker_field_data_set_where_field (field_data, where_field);
+ g_free (where_field);
}
-
return field_data;
}
@@ -5255,18 +5273,3 @@
return FALSE;
}
-
-void
-tracker_free_metadata_field (FieldData *field_data)
-{
- g_return_if_fail (field_data);
-
- g_free (field_data->alias);
- g_free (field_data->where_field);
- g_free (field_data->field_name);
- g_free (field_data->select_field);
- g_free (field_data->table_name);
- g_free (field_data->id_field);
-
- g_free (field_data);
-}
Modified: branches/indexer-split/src/trackerd/tracker-db-sqlite.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-db-sqlite.h (original)
+++ branches/indexer-split/src/trackerd/tracker-db-sqlite.h Fri May 23 11:06:05 2008
@@ -26,6 +26,7 @@
#include <libtracker-db/tracker-db-interface.h>
#include <libtracker-db/tracker-db-file-info.h>
+#include "tracker-field-data.h"
#include "tracker-ontology.h"
#include "tracker-indexer.h"
#include "tracker-utils.h"
@@ -310,7 +311,7 @@
void tracker_db_delete_service (DBConnection *db_con,
guint32 id,
const gchar *uri);
-FieldData * tracker_db_get_metadata_field (DBConnection *db_con,
+TrackerFieldData * tracker_db_get_metadata_field (DBConnection *db_con,
const gchar *service,
const gchar *field_name,
gint field_count,
Modified: branches/indexer-split/src/trackerd/tracker-dbus-metadata.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-dbus-metadata.c (original)
+++ branches/indexer-split/src/trackerd/tracker-dbus-metadata.c Fri May 23 11:06:05 2008
@@ -30,6 +30,7 @@
#include "tracker-dbus.h"
#include "tracker-dbus-metadata.h"
#include "tracker-db.h"
+#include "tracker-field-data.h"
#include "tracker-marshal.h"
#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_DBUS_METADATA, TrackerDBusMetadataPriv))
@@ -217,16 +218,16 @@
sql_join = g_string_new (" FROM Services S ");
for (i = 0; i < g_strv_length (keys); i++) {
- FieldData *field;
+ TrackerFieldData *field_data;
- field = tracker_db_get_metadata_field (db_con,
- service_result,
- keys[i],
- i,
- TRUE,
- FALSE);
-
- if (!field) {
+ field_data = tracker_db_get_metadata_field (db_con,
+ service_result,
+ keys[i],
+ i,
+ TRUE,
+ FALSE);
+
+ if (!field_data) {
g_string_free (sql_join, TRUE);
g_string_free (sql, TRUE);
g_free (service_result);
@@ -240,22 +241,24 @@
}
if (i == 0) {
- g_string_append_printf (sql, " %s", field->select_field);
+ g_string_append_printf (sql, " %s",
+ tracker_field_data_get_select_field (field_data));
} else {
- g_string_append_printf (sql, ", %s", field->select_field);
+ g_string_append_printf (sql, ", %s",
+ tracker_field_data_get_select_field (field_data));
}
- if (field->needs_join) {
+ if (tracker_field_data_get_needs_join (field_data)) {
g_string_append_printf (sql_join,
"\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID = %s) ",
- field->table_name,
- field->alias,
- field->alias,
- field->alias,
- field->id_field);
+ tracker_field_data_get_table_name (field_data),
+ tracker_field_data_get_alias (field_data),
+ tracker_field_data_get_alias (field_data),
+ tracker_field_data_get_alias (field_data),
+ tracker_field_data_get_id_field (field_data));
}
- tracker_free_metadata_field (field);
+ g_object_unref (field_data);
}
g_string_append (sql, sql_join->str);
Added: branches/indexer-split/src/trackerd/tracker-field-data.c
==============================================================================
--- (empty file)
+++ branches/indexer-split/src/trackerd/tracker-field-data.c Fri May 23 11:06:05 2008
@@ -0,0 +1,637 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
+ * Copyright (C) 2008, Nokia (urho konttori nokia com)
+ *
+ * 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 <string.h>
+#include <stdlib.h>
+
+#include <glib.h>
+
+#include "tracker-field-data.h"
+
+#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_FIELD_DATA, TrackerFieldDataPriv))
+
+typedef struct _TrackerFieldDataPriv TrackerFieldDataPriv;
+
+struct _TrackerFieldDataPriv {
+ gchar *alias;
+
+ gchar *table_name;
+ gchar *field_name;
+
+ gchar *select_field;
+ gchar *where_field;
+ gchar *id_field;
+
+ TrackerFieldType data_type;
+
+ gboolean multiple_values;
+ gboolean is_select;
+ gboolean is_condition;
+ gboolean needs_join;
+};
+
+static void field_data_finalize (GObject *object);
+static void field_data_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void field_data_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
+enum {
+ PROP_0,
+ PROP_ALIAS,
+ PROP_TABLE_NAME,
+ PROP_FIELD_NAME,
+ PROP_SELECT_FIELD,
+ PROP_WHERE_FIELD,
+ PROP_ID_FIELD,
+ PROP_DATA_TYPE,
+ PROP_MULTIPLE_VALUES,
+ PROP_IS_SELECT,
+ PROP_IS_CONDITION,
+ PROP_NEEDS_JOIN
+};
+
+G_DEFINE_TYPE (TrackerFieldData, tracker_field_data, G_TYPE_OBJECT);
+
+static void
+tracker_field_data_class_init (TrackerFieldDataClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = field_data_finalize;
+ object_class->get_property = field_data_get_property;
+ object_class->set_property = field_data_set_property;
+
+ g_object_class_install_property (object_class,
+ PROP_ALIAS,
+ g_param_spec_string ("alias",
+ "alias",
+ "A name for this field data",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_TABLE_NAME,
+ g_param_spec_string ("table-name",
+ "Table name",
+ "Table name",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_FIELD_NAME,
+ g_param_spec_string ("field-name",
+ "Field name",
+ "Field name",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_SELECT_FIELD,
+ g_param_spec_string ("select-field",
+ "Select field",
+ "Select field",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_WHERE_FIELD,
+ g_param_spec_string ("where-field",
+ "Where field",
+ "Where field",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_ID_FIELD,
+ g_param_spec_string ("id-field",
+ "ID field",
+ "ID field",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_DATA_TYPE,
+ g_param_spec_enum ("data-type",
+ "Data type",
+ "TrackerField type",
+ tracker_field_type_get_type (),
+ TRACKER_FIELD_TYPE_INDEX,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_MULTIPLE_VALUES,
+ g_param_spec_boolean ("multiple-values",
+ "Multiple values",
+ "Multiple values",
+ FALSE,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_IS_SELECT,
+ g_param_spec_boolean ("is-select",
+ "Is select",
+ "Is select",
+ FALSE,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_IS_CONDITION,
+ g_param_spec_boolean ("is-condition",
+ "Is condition",
+ "Is condition",
+ FALSE,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_NEEDS_JOIN,
+ g_param_spec_boolean ("needs-join",
+ "Needs join",
+ "Needs join",
+ FALSE,
+ G_PARAM_READWRITE));
+
+ g_type_class_add_private (object_class, sizeof (TrackerFieldDataPriv));
+}
+
+static void
+tracker_field_data_init (TrackerFieldData *field_data)
+{
+}
+
+static void
+field_data_finalize (GObject *object)
+{
+ TrackerFieldDataPriv *priv;
+
+ priv = GET_PRIV (object);
+
+ g_free (priv->alias);
+
+ g_free (priv->table_name);
+ g_free (priv->field_name);
+
+ g_free (priv->select_field);
+ g_free (priv->where_field);
+ g_free (priv->id_field);
+
+ (G_OBJECT_CLASS (tracker_field_data_parent_class)->finalize) (object);
+}
+
+static void
+field_data_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ TrackerFieldDataPriv *priv;
+
+ priv = GET_PRIV (object);
+
+ switch (param_id) {
+ case PROP_ALIAS:
+ g_value_set_string (value, priv->alias);
+ break;
+ case PROP_TABLE_NAME:
+ g_value_set_string (value, priv->table_name);
+ break;
+ case PROP_FIELD_NAME:
+ g_value_set_string (value, priv->field_name);
+ break;
+ case PROP_SELECT_FIELD:
+ g_value_set_string (value, priv->select_field);
+ break;
+ case PROP_WHERE_FIELD:
+ g_value_set_string (value, priv->where_field);
+ break;
+ case PROP_ID_FIELD:
+ g_value_set_string (value, priv->id_field);
+ break;
+ case PROP_DATA_TYPE:
+ g_value_set_enum (value, priv->data_type);
+ break;
+ case PROP_MULTIPLE_VALUES:
+ g_value_set_boolean (value, priv->multiple_values);
+ break;
+ case PROP_IS_SELECT:
+ g_value_set_boolean (value, priv->is_select);
+ break;
+ case PROP_IS_CONDITION:
+ g_value_set_boolean (value, priv->is_condition);
+ break;
+ case PROP_NEEDS_JOIN:
+ g_value_set_boolean (value, priv->needs_join);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ };
+}
+
+static void
+field_data_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (param_id) {
+ case PROP_ALIAS:
+ tracker_field_data_set_alias (TRACKER_FIELD_DATA (object),
+ g_value_get_string (value));
+ break;
+ case PROP_TABLE_NAME:
+ tracker_field_data_set_table_name (TRACKER_FIELD_DATA (object),
+ g_value_get_string (value));
+ break;
+ case PROP_FIELD_NAME:
+ tracker_field_data_set_field_name (TRACKER_FIELD_DATA (object),
+ g_value_get_string (value));
+ break;
+ case PROP_SELECT_FIELD:
+ tracker_field_data_set_select_field (TRACKER_FIELD_DATA (object),
+ g_value_get_string (value));
+ break;
+ case PROP_WHERE_FIELD:
+ tracker_field_data_set_where_field (TRACKER_FIELD_DATA (object),
+ g_value_get_string (value));
+ break;
+ case PROP_ID_FIELD:
+ tracker_field_data_set_id_field (TRACKER_FIELD_DATA (object),
+ g_value_get_string (value));
+ break;
+ case PROP_DATA_TYPE:
+ tracker_field_data_set_data_type (TRACKER_FIELD_DATA (object),
+ g_value_get_enum (value));
+ break;
+ case PROP_MULTIPLE_VALUES:
+ tracker_field_data_set_multiple_values (TRACKER_FIELD_DATA (object),
+ g_value_get_boolean (value));
+ break;
+ case PROP_IS_SELECT:
+ tracker_field_data_set_is_select (TRACKER_FIELD_DATA (object),
+ g_value_get_boolean (value));
+ break;
+ case PROP_IS_CONDITION:
+ tracker_field_data_set_is_condition (TRACKER_FIELD_DATA (object),
+ g_value_get_boolean (value));
+ break;
+ case PROP_NEEDS_JOIN:
+ tracker_field_data_set_needs_join (TRACKER_FIELD_DATA (object),
+ g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ };
+}
+
+TrackerFieldData *
+tracker_field_data_new (void)
+{
+ TrackerFieldData *field_data;
+
+ field_data = g_object_new (TRACKER_TYPE_FIELD_DATA, NULL);
+
+ return field_data;
+}
+
+const gchar *
+tracker_field_data_get_alias (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->alias;
+}
+
+const gchar *
+tracker_field_data_get_table_name (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->table_name;
+}
+
+const gchar *
+tracker_field_data_get_field_name (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->field_name;
+}
+
+const gchar *
+tracker_field_data_get_select_field (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->select_field;
+}
+
+const gchar *
+tracker_field_data_get_where_field (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->where_field;
+}
+
+const gchar *
+tracker_field_data_get_id_field (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), NULL);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->id_field;
+}
+
+TrackerFieldType
+tracker_field_data_get_data_type (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), TRACKER_FIELD_TYPE_INDEX);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->data_type;
+}
+
+gboolean
+tracker_field_data_get_multiple_values (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), FALSE);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->multiple_values;
+}
+
+
+gboolean
+tracker_field_data_get_is_select (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), FALSE);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->is_select;
+}
+
+gboolean
+tracker_field_data_get_is_condition (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), FALSE);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->is_condition;
+}
+
+gboolean
+tracker_field_data_get_needs_join (TrackerFieldData *field_data)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_val_if_fail (TRACKER_IS_FIELD_DATA (field_data), FALSE);
+
+ priv = GET_PRIV (field_data);
+
+ return priv->needs_join;
+}
+
+void
+tracker_field_data_set_alias (TrackerFieldData *field_data,
+ const gchar *value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ g_free (priv->alias);
+
+ if (value) {
+ priv->alias = g_strdup (value);
+ } else {
+ priv->alias = NULL;
+ }
+
+ g_object_notify (G_OBJECT (field_data), "alias");
+}
+
+void
+tracker_field_data_set_table_name (TrackerFieldData *field_data,
+ const gchar *value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ g_free (priv->table_name);
+
+ if (value) {
+ priv->table_name = g_strdup (value);
+ } else {
+ priv->table_name = NULL;
+ }
+
+ g_object_notify (G_OBJECT (field_data), "table-name");
+}
+
+void
+tracker_field_data_set_field_name (TrackerFieldData *field_data,
+ const gchar *value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ g_free (priv->field_name);
+
+ if (value) {
+ priv->field_name = g_strdup (value);
+ } else {
+ priv->field_name = NULL;
+ }
+
+ g_object_notify (G_OBJECT (field_data), "field-name");
+}
+
+void
+tracker_field_data_set_select_field (TrackerFieldData *field_data,
+ const gchar *value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ g_free (priv->select_field);
+
+ if (value) {
+ priv->select_field = g_strdup (value);
+ } else {
+ priv->select_field = NULL;
+ }
+
+ g_object_notify (G_OBJECT (field_data), "select-field");
+}
+
+void
+tracker_field_data_set_where_field (TrackerFieldData *field_data,
+ const gchar *value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ g_free (priv->where_field);
+
+ if (value) {
+ priv->where_field = g_strdup (value);
+ } else {
+ priv->where_field = NULL;
+ }
+
+ g_object_notify (G_OBJECT (field_data), "where-field");
+}
+
+void
+tracker_field_data_set_id_field (TrackerFieldData *field_data,
+ const gchar *value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ g_free (priv->id_field);
+
+ if (value) {
+ priv->id_field = g_strdup (value);
+ } else {
+ priv->id_field = NULL;
+ }
+
+ g_object_notify (G_OBJECT (field_data), "id-field");
+}
+
+void
+tracker_field_data_set_data_type (TrackerFieldData *field_data,
+ TrackerFieldType value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ priv->data_type = value;
+ g_object_notify (G_OBJECT (field_data), "data-type");
+}
+
+void
+tracker_field_data_set_multiple_values (TrackerFieldData *field_data,
+ gboolean value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ priv->multiple_values = value;
+ g_object_notify (G_OBJECT (field_data), "multiple-values");
+}
+
+void
+tracker_field_data_set_is_select (TrackerFieldData *field_data,
+ gboolean value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ priv->is_select = value;
+ g_object_notify (G_OBJECT (field_data), "is-select");
+}
+
+void
+tracker_field_data_set_is_condition (TrackerFieldData *field_data,
+ gboolean value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ priv->is_condition = value;
+ g_object_notify (G_OBJECT (field_data), "is-condition");
+}
+
+void
+tracker_field_data_set_needs_join (TrackerFieldData *field_data,
+ gboolean value)
+{
+ TrackerFieldDataPriv *priv;
+
+ g_return_if_fail (TRACKER_IS_FIELD_DATA (field_data));
+
+ priv = GET_PRIV (field_data);
+
+ priv->needs_join = value;
+ g_object_notify (G_OBJECT (field_data), "needs-join");
+}
Added: branches/indexer-split/src/trackerd/tracker-field-data.h
==============================================================================
--- (empty file)
+++ branches/indexer-split/src/trackerd/tracker-field-data.h Fri May 23 11:06:05 2008
@@ -0,0 +1,91 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
+ * Copyright (C) 2008, Nokia (urho konttori nokia com)
+ *
+ * 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.
+ */
+
+#ifndef __TRACKERD_FIELD_DATA_H__
+#define __TRACKERD_FIELD_DATA_H__
+
+#include <glib-object.h>
+
+#include "tracker-field.h"
+
+G_BEGIN_DECLS
+
+#define TRACKER_TYPE_FIELD_DATA (tracker_field_data_get_type ())
+#define TRACKER_FIELD_DATA(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_FIELD_DATA, TrackerFieldData))
+#define TRACKER_FIELD_DATA_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TRACKER_TYPE_FIELD_DATA, TrackerFieldDataClass))
+#define TRACKER_IS_FIELD_DATA(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TRACKER_TYPE_FIELD_DATA))
+#define TRACKER_IS_FIELD_DATA_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TRACKER_TYPE_FIELD_DATA))
+#define TRACKER_FIELD_DATA_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_FIELD_DATA, TrackerFieldDataClass))
+
+typedef struct _TrackerFieldData TrackerFieldData;
+typedef struct _TrackerFieldDataClass TrackerFieldDataClass;
+
+struct _TrackerFieldData {
+ GObject parent;
+};
+
+struct _TrackerFieldDataClass {
+ GObjectClass parent_class;
+};
+
+GType tracker_field_data_get_type (void) G_GNUC_CONST;
+
+TrackerFieldData *tracker_field_data_new (void);
+
+const gchar * tracker_field_data_get_alias (TrackerFieldData *field_data);
+const gchar * tracker_field_data_get_table_name (TrackerFieldData *field_data);
+const gchar * tracker_field_data_get_field_name (TrackerFieldData *field_data);
+const gchar * tracker_field_data_get_select_field (TrackerFieldData *field_data);
+const gchar * tracker_field_data_get_where_field (TrackerFieldData *field_data);
+const gchar * tracker_field_data_get_id_field (TrackerFieldData *field_data);
+TrackerFieldType tracker_field_data_get_data_type (TrackerFieldData *field_data);
+gboolean tracker_field_data_get_multiple_values (TrackerFieldData *field_data);
+gboolean tracker_field_data_get_is_select (TrackerFieldData *field_data);
+gboolean tracker_field_data_get_is_condition (TrackerFieldData *field_data);
+gboolean tracker_field_data_get_needs_join (TrackerFieldData *field_data);
+
+void tracker_field_data_set_alias (TrackerFieldData *field_data,
+ const gchar *value);
+void tracker_field_data_set_table_name (TrackerFieldData *field_data,
+ const gchar *value);
+void tracker_field_data_set_field_name (TrackerFieldData *field_data,
+ const gchar *value);
+void tracker_field_data_set_select_field (TrackerFieldData *field_data,
+ const gchar *value);
+void tracker_field_data_set_where_field (TrackerFieldData *field_data,
+ const gchar *value);
+void tracker_field_data_set_id_field (TrackerFieldData *field_data,
+ const gchar *value);
+void tracker_field_data_set_data_type (TrackerFieldData *field_data,
+ TrackerFieldType value);
+void tracker_field_data_set_multiple_values (TrackerFieldData *field_data,
+ gboolean value);
+void tracker_field_data_set_is_select (TrackerFieldData *field_data,
+ gboolean value);
+void tracker_field_data_set_is_condition (TrackerFieldData *field_data,
+ gboolean value);
+void tracker_field_data_set_needs_join (TrackerFieldData *field_data,
+ gboolean value);
+
+G_END_DECLS
+
+#endif /* __TRACKERD_FIELD_DATA_H__ */
+
Modified: branches/indexer-split/src/trackerd/tracker-field.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-field.c (original)
+++ branches/indexer-split/src/trackerd/tracker-field.c Fri May 23 11:06:05 2008
@@ -293,10 +293,6 @@
const GValue *value,
GParamSpec *pspec)
{
- TrackerFieldPriv *priv;
-
- priv = GET_PRIV (object);
-
switch (param_id) {
case PROP_ID:
tracker_field_set_id (TRACKER_FIELD (object),
@@ -610,7 +606,6 @@
priv->weight = value;
g_object_notify (G_OBJECT (field), "weight");
-
}
void
@@ -627,7 +622,6 @@
g_object_notify (G_OBJECT (field), "embedded");
}
-
void
tracker_field_set_multiple_values (TrackerField *field,
gboolean value)
Modified: branches/indexer-split/src/trackerd/tracker-rdf-query.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-rdf-query.c (original)
+++ branches/indexer-split/src/trackerd/tracker-rdf-query.c Fri May 23 11:06:05 2008
@@ -336,60 +336,63 @@
-static FieldData *
-add_metadata_field (ParserData *data, const char *field_name, gboolean is_select, gboolean is_condition)
+static TrackerFieldData *
+add_metadata_field (ParserData *data,
+ const gchar *field_name,
+ gboolean is_select,
+ gboolean is_condition)
{
- gboolean field_exists;
- FieldData *field_data;
- const GSList *tmp;
+ TrackerFieldData *field_data;
+ gboolean field_exists;
+ GSList *l;
field_exists = FALSE;
field_data = NULL;
- // check if field is already in list
- for (tmp = data->fields; tmp; tmp = tmp->next) {
- FieldData *tmp_field;
+ /* Check if field is already in list */
+ for (l = data->fields; l; l = l->next) {
+ const gchar *this_field_name;
+
+ this_field_name = tracker_field_data_get_field_name (l->data);
+ if (!this_field_name) {
+ continue;
+ }
+
+ if (strcasecmp (this_field_name, field_name) == 0) {
+ field_data = l->data;
+ field_exists = TRUE;
+
+ if (is_condition) {
+ tracker_field_data_set_is_condition (field_data, TRUE);
+ }
+
+ if (is_select) {
+ if (!tracker_field_data_get_is_select (field_data)) {
+ tracker_field_data_set_is_select (field_data, TRUE);
+ g_string_append_printf (data->sql_select, ", %s",
+ tracker_field_data_get_select_field (field_data));
+ }
+ }
- tmp_field = tmp->data;
-
- if (tmp_field && tmp_field->field_name) {
- if (strcasecmp (tmp_field->field_name, field_name) == 0) {
-
- field_data = tmp_field;
-
- field_exists = TRUE;
-
- if (is_condition) {
- field_data->is_condition = TRUE;
- }
-
- if (is_select) {
- if (!field_data->is_select) {
-
- field_data->is_select = TRUE;
- g_string_append_printf (data->sql_select, ", %s", field_data->select_field);
- }
-
- }
-
- break;
-
- }
+ break;
}
}
-
if (!field_exists) {
-
- field_data = tracker_db_get_metadata_field (data->db_con, data->service, field_name, g_slist_length (data->fields), is_select, is_condition);
+ field_data = tracker_db_get_metadata_field (data->db_con,
+ data->service,
+ field_name,
+ g_slist_length (data->fields),
+ is_select,
+ is_condition);
if (field_data) {
data->fields = g_slist_prepend (data->fields, field_data);
if (is_select) {
- g_string_append_printf (data->sql_select, ", %s", field_data->select_field);
+ g_string_append_printf (data->sql_select, ", %s",
+ tracker_field_data_get_select_field (field_data));
}
-
- }
+ }
}
return field_data;
@@ -666,12 +669,17 @@
static gboolean
build_sql (ParserData *data)
{
- ParseState state;
- char *avalue, *value, *sub;
- FieldData *field_data;
- GString *str;
-
- g_return_val_if_fail (data->current_field && data->current_operator != OP_NONE && data->current_value, FALSE);
+ TrackerFieldData *field_data;
+ ParseState state;
+ gchar *avalue, *value, *sub;
+ const gchar *where_field;
+ GString *str;
+ gchar **s;
+
+ g_return_val_if_fail (data->current_field &&
+ data->current_operator != OP_NONE &&
+ data->current_value,
+ FALSE);
str = g_string_new ("");
@@ -679,7 +687,9 @@
state = peek_state (data);
- avalue = get_value (data->current_value, (state != STATE_END_DATE && state != STATE_END_INTEGER && state != STATE_END_FLOAT));
+ avalue = get_value (data->current_value, (state != STATE_END_DATE &&
+ state != STATE_END_INTEGER &&
+ state != STATE_END_FLOAT));
field_data = add_metadata_field (data, data->current_field, FALSE, TRUE);
@@ -690,9 +700,9 @@
return FALSE;
}
- if (field_data->data_type == TRACKER_FIELD_TYPE_DATE) {
- char *bvalue;
- int cvalue;
+ if (tracker_field_data_get_data_type (field_data) == TRACKER_FIELD_TYPE_DATE) {
+ gchar *bvalue;
+ gint cvalue;
bvalue = tracker_date_format (avalue);
g_debug (bvalue);
@@ -716,102 +726,112 @@
}
}
- char **s;
+ where_field = tracker_field_data_get_where_field (field_data);
switch (data->current_operator) {
+ case OP_EQUALS:
+ sub = strchr (data->current_value, '*');
+ if (sub) {
+ g_string_append_printf (str, " (%s glob '%s') ",
+ where_field,
+ data->current_value);
+ } else {
+ TrackerFieldType data_type;
+
+ data_type = tracker_field_data_get_data_type (field_data);
+
+ if (data_type == TRACKER_FIELD_TYPE_DATE ||
+ data_type == TRACKER_FIELD_TYPE_INTEGER ||
+ data_type == TRACKER_FIELD_TYPE_DOUBLE) {
+ g_string_append_printf (str, " (%s = %s) ",
+ where_field,
+ value);
+ } else {
+ g_string_append_printf (str, " (%s = '%s') ",
+ where_field,
+ value);
+ }
+ }
+ break;
+
+ case OP_GREATER:
+ g_string_append_printf (str, " (%s > %s) ",
+ where_field,
+ value);
+ break;
+
+ case OP_GREATER_EQUAL:
+ g_string_append_printf (str, " (%s >= %s) ",
+ where_field,
+ value);
+ break;
+
+ case OP_LESS:
+ g_string_append_printf (str, " (%s < %s) ",
+ where_field,
+ value);
+ break;
+
+ case OP_LESS_EQUAL:
+ g_string_append_printf (str, " (%s <= %s) ",
+ where_field,
+ value);
+ break;
+
+ case OP_CONTAINS:
+ sub = strchr (data->current_value, '*');
+
+ if (sub) {
+ g_string_append_printf (str, " (%s like '%%%s%%') ",
+ where_field,
+ data->current_value);
+ } else {
+ g_string_append_printf (str, " (%s like '%%%s%%') ",
+ where_field,
+ data->current_value);
+ }
+ break;
+
+ case OP_STARTS:
+ sub = strchr (data->current_value, '*');
+
+ if (sub) {
+ g_string_append_printf (str, " (%s like '%s') ",
+ where_field,
+ data->current_value);
+ } else {
+ g_string_append_printf (str, " (%s like '%s%%') ",
+ where_field,
+ data->current_value);
+ }
+ break;
+
+ case OP_REGEX:
+ g_string_append_printf (str, " (%s REGEXP '%s') ",
+ where_field,
+ data->current_value);
+ break;
- case OP_EQUALS:
-
- sub = strchr (data->current_value, '*');
- if (sub) {
- g_string_append_printf (str, " (%s glob '%s') ", field_data->where_field, data->current_value);
- } else {
- if (field_data->data_type == TRACKER_FIELD_TYPE_DATE
- || field_data->data_type == TRACKER_FIELD_TYPE_INTEGER
- || field_data->data_type == TRACKER_FIELD_TYPE_DOUBLE) {
- g_string_append_printf (str, " (%s = %s) ", field_data->where_field, value);
- } else {
- g_string_append_printf (str, " (%s = '%s') ", field_data->where_field, value);
- }
- }
-
- break;
-
- case OP_GREATER:
-
- g_string_append_printf (str, " (%s > %s) ", field_data->where_field, value);
-
- break;
-
- case OP_GREATER_EQUAL:
-
- g_string_append_printf (str, " (%s >= %s) ", field_data->where_field, value);
-
- break;
-
- case OP_LESS:
-
- g_string_append_printf (str, " (%s < %s) ", field_data->where_field, value);
-
- break;
-
- case OP_LESS_EQUAL:
-
- g_string_append_printf (str, " (%s <= %s) ", field_data->where_field, value);
-
- break;
-
- case OP_CONTAINS:
-
- sub = strchr (data->current_value, '*');
-
- if (sub) {
- g_string_append_printf (str, " (%s like '%s%s%s') ", field_data->where_field, "%", data->current_value, "%");
- } else {
- g_string_append_printf (str, " (%s like '%s%s%s') ", field_data->where_field, "%", data->current_value, "%");
- }
-
- break;
-
- case OP_STARTS:
-
- sub = strchr (data->current_value, '*');
-
- if (sub) {
- g_string_append_printf (str, " (%s like '%s') ", field_data->where_field, data->current_value);
- } else {
- g_string_append_printf (str, " (%s like '%s%s') ", field_data->where_field, data->current_value, "%");
- }
-
- break;
-
- case OP_REGEX:
-
- g_string_append_printf (str, " (%s REGEXP '%s') ", field_data->where_field, data->current_value);
-
- break;
-
- case OP_SET:
-
- s = g_strsplit (data->current_value, ",", 0);
-
- if (s && s[0]) {
-
- g_string_append_printf (str, " (%s in ('%s'", field_data->where_field, s[0]);
-
- char **p;
- for (p = s+1; *p; p++) {
- g_string_append_printf (str, ",'%s'", *p);
- }
- g_string_append_printf (str, ") ) " );
-
- }
-
- break;
-
- default:
+ case OP_SET:
+ s = g_strsplit (data->current_value, ",", 0);
+
+ if (s && s[0]) {
+ gchar **p;
- break;
+ g_string_append_printf (str, " (%s in ('%s'",
+ where_field,
+ s[0]);
+
+ for (p = s + 1; *p; p++) {
+ g_string_append_printf (str, ",'%s'", *p);
+ }
+
+ g_string_append_printf (str, ") ) " );
+ }
+ break;
+
+ default:
+ break;
}
data->sql_where = g_string_append (data->sql_where, str->str);
@@ -829,7 +849,6 @@
return TRUE;
}
-
static void
end_element_handler (GMarkupParseContext *context,
const gchar *element_name,
@@ -1079,13 +1098,13 @@
int i;
for (i = 0; i < field_count; i++) {
- FieldData *field_data;
+ TrackerFieldData *field_data;
field_data = add_metadata_field (&data, fields[i], TRUE, FALSE);
if (!field_data) {
g_critical ("RDF Query failed: field %s not found", fields[i]);
- g_slist_foreach (data.fields, (GFunc) tracker_free_metadata_field, NULL);
+ g_slist_foreach (data.fields, (GFunc) g_object_unref, NULL);
g_slist_free (data.fields);
g_string_free (data.sql_select, TRUE);
return NULL;
@@ -1195,7 +1214,7 @@
g_string_free (data.sql_order, TRUE);
}
- g_slist_foreach (data.fields, (GFunc) tracker_free_metadata_field, NULL);
+ g_slist_foreach (data.fields, (GFunc) g_object_unref, NULL);
g_slist_free (data.fields);
g_slist_free (data.stack);
Modified: branches/indexer-split/src/trackerd/tracker-xesam-query.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-xesam-query.c (original)
+++ branches/indexer-split/src/trackerd/tracker-xesam-query.c Fri May 23 11:06:05 2008
@@ -26,6 +26,7 @@
#include <libtracker-common/tracker-utils.h>
#include "tracker-xesam-query.h"
+#include "tracker-field-data.h"
/* XESAM Query Condition
@@ -188,34 +189,49 @@
static gboolean
is_operator (ParseState state)
{
- return state == STATE_EQUALS || state == STATE_GREATER_THAN || state == STATE_LESS_THAN ||
- state == STATE_CONTAINS || state == STATE_IN_SET || STATE_LESS_OR_EQUAL ||
- STATE_GREATER_OR_EQUAL || state == STATE_STARTS_WITH || state == STATE_REGEX;
+ return
+ state == STATE_EQUALS ||
+ state == STATE_GREATER_THAN ||
+ state == STATE_LESS_THAN ||
+ state == STATE_CONTAINS ||
+ state == STATE_IN_SET ||
+ state == STATE_LESS_OR_EQUAL ||
+ state == STATE_GREATER_OR_EQUAL ||
+ state == STATE_STARTS_WITH ||
+ state == STATE_REGEX;
}
-
static gboolean
is_end_operator (ParseState state)
{
- return state == STATE_END_EQUALS || state == STATE_END_GREATER_THAN || state == STATE_END_LESS_THAN ||
- state == STATE_END_CONTAINS || state == STATE_END_IN_SET || STATE_END_LESS_OR_EQUAL ||
- STATE_END_GREATER_OR_EQUAL || state == STATE_END_STARTS_WITH || state == STATE_END_REGEX;
-
+ return
+ state == STATE_END_EQUALS ||
+ state == STATE_END_GREATER_THAN ||
+ state == STATE_END_LESS_THAN ||
+ state == STATE_END_CONTAINS ||
+ state == STATE_END_IN_SET ||
+ state == STATE_END_LESS_OR_EQUAL ||
+ state == STATE_END_GREATER_OR_EQUAL ||
+ state == STATE_END_STARTS_WITH ||
+ state == STATE_END_REGEX;
}
-
static gboolean
is_logic (ParseState state)
{
- return state == STATE_AND || state == STATE_OR;
+ return
+ state == STATE_AND ||
+ state == STATE_OR;
}
static gboolean
is_end_logic (ParseState state)
{
- return state == STATE_END_AND || state == STATE_END_OR;
+ return
+ state == STATE_END_AND ||
+ state == STATE_END_OR;
}
@@ -338,19 +354,24 @@
static GList *
-add_metadata_field (ParserData *data, const char *xesam_name, gboolean is_select, gboolean is_condition)
+add_metadata_field (ParserData *data,
+ const char *xesam_name,
+ gboolean is_select,
+ gboolean is_condition)
{
- gboolean field_exists;
- FieldData *field_data;
- const GSList *tmp;
- GList *reply=NULL;
TrackerDBResultSet *result_set;
- gboolean valid = TRUE;
+ TrackerFieldData *field_data;
+ gboolean field_exists;
+ const GSList *l;
+ GList *reply;
+ gboolean valid;
+ reply = NULL;
field_exists = FALSE;
field_data = NULL;
+ valid = TRUE;
- // Do the xesam mapping
+ /* Do the xesam mapping */
result_set = tracker_get_xesam_metadata_names (data->db_con, xesam_name);
if (!result_set) {
@@ -362,54 +383,41 @@
tracker_db_result_set_get (result_set, 0, &field_name, -1);
- // check if field is already in list
- for (tmp = data->fields; tmp; tmp = tmp->next) {
- FieldData *tmp_field;
+ /* Check if field is already in list */
+ for (l = data->fields; l; l = l->next) {
+ const gchar *this_field_name;
- tmp_field = tmp->data;
+ this_field_name = tracker_field_data_get_field_name (l->data);
- if (tmp_field && tmp_field->field_name) {
- if (strcasecmp (tmp_field->field_name, field_name) == 0) {
-
- field_data = tmp_field;
-
- field_exists = TRUE;
-
- if (is_condition) {
- field_data->is_condition = TRUE;
- }
-
- if (is_select) {
- if (!field_data->is_select) {
-
- field_data->is_select = TRUE;
- //g_string_append_printf (data->sql_select, ", %s", field_data->select_field);
- }
-
- }
-
- break;
-
- }
+ if (!this_field_name) {
+ continue;
+ }
+
+ if (strcasecmp (this_field_name, field_name) != 0) {
+ continue;
}
+
+ field_exists = TRUE;
+
+ tracker_field_data_set_is_condition (l->data, is_condition);
+ tracker_field_data_set_is_select (l->data, is_select);
+
+ break;
}
-
-
if (!field_exists) {
-
- field_data = tracker_db_get_metadata_field (data->db_con, data->service, field_name, g_slist_length (data->fields), is_select, is_condition);
+ field_data = tracker_db_get_metadata_field (data->db_con,
+ data->service,
+ field_name,
+ g_slist_length (data->fields),
+ is_select,
+ is_condition);
if (field_data) {
data->fields = g_slist_prepend (data->fields, field_data);
- if (is_select) {
- // g_string_append_printf (data->sql_select, ", %s", field_data->select_field);
- }
-
}
}
- reply = g_list_append(reply, field_data);
-
+ reply = g_list_append (reply, field_data);
valid = tracker_db_result_set_iter_next (result_set);
g_free (field_name);
}
@@ -419,11 +427,11 @@
static void
-start_element_handler (GMarkupParseContext *context,
- const gchar *element_name,
+start_element_handler (GMarkupParseContext *context,
+ const gchar *element_name,
const gchar **attribute_names,
const gchar **attribute_values,
- gpointer user_data,
+ gpointer user_data,
GError **error)
{
ParserData *data;
@@ -791,20 +799,27 @@
static gboolean
build_sql (ParserData *data)
{
- ParseState state;
- char *avalue, *value, *sub;
+ ParseState state;
+ gchar *avalue, *value, *sub;
GList *field_data = NULL;
GList *field_data_list = NULL;
GString *str;
- int i=0;
+ gint i = 0;
- g_return_val_if_fail (data->current_field && data->current_operator != OP_NONE && data->current_value, FALSE);
+ g_return_val_if_fail (data->current_field &&
+ data->current_operator != OP_NONE &&
+ data->current_value,
+ FALSE);
data->statement_count++;
state = peek_state (data);
- avalue = get_value (data->current_value, (state != STATE_END_DATE && state != STATE_END_INTEGER && state != STATE_END_FLOAT && state != STATE_END_BOOLEAN));
+ avalue = get_value (data->current_value,
+ (state != STATE_END_DATE &&
+ state != STATE_END_INTEGER &&
+ state != STATE_END_FLOAT &&
+ state != STATE_END_BOOLEAN));
field_data_list = add_metadata_field (data, data->current_field, FALSE, TRUE);
@@ -820,16 +835,19 @@
field_data = g_list_first (field_data_list);
while (field_data) {
+ const gchar *where_field;
+ gchar **s;
+
i++;
str = g_string_new ("");
if (i>1) {
g_string_append (str, " OR ");
}
-
- if (((FieldData *)field_data->data)->data_type == TRACKER_FIELD_TYPE_DATE) {
- char *bvalue;
- int cvalue;
+
+ if (tracker_field_data_get_data_type (field_data->data) == TRACKER_FIELD_TYPE_DATE) {
+ gchar *bvalue;
+ gint cvalue;
bvalue = tracker_date_format (avalue);
g_debug (bvalue);
@@ -837,13 +855,17 @@
g_debug ("%d", cvalue);
value = tracker_int_to_string (cvalue);
g_free (bvalue);
- } else if (state == STATE_END_BOOLEAN) { /* FIXME We do a state check here, because TRACKER_FIELD_TYPE_BOOLEAN is not in db */
+ } else if (state == STATE_END_BOOLEAN) {
+ /* FIXME We do a state check here, because
+ * TRACKER_FIELD_TYPE_BOOLEAN is not in db.
+ */
if (!strcmp(avalue,"true")) {
value = g_strdup("1");
} else if(!strcmp(avalue,"false")) {
value = g_strdup("0");
} else {
- return FALSE; /* TODO Add error message */
+ /* TODO Add error message */
+ return FALSE;
}
} else {
value = g_strdup (avalue);
@@ -859,114 +881,124 @@
}
}
- char **s;
+ where_field = tracker_field_data_get_where_field (field_data->data);
switch (data->current_operator) {
-
- case OP_EQUALS:
-
+ case OP_EQUALS:
sub = strchr (data->current_value, '*');
+
if (sub) {
- g_string_append_printf (str, " (%s glob '%s') ", ((FieldData *)field_data->data)->where_field, data->current_value);
+ g_string_append_printf (str, " (%s glob '%s') ",
+ where_field,
+ data->current_value);
} else {
- if (((FieldData *)field_data->data)->data_type == TRACKER_FIELD_TYPE_DATE
- || ((FieldData *)field_data->data)->data_type == TRACKER_FIELD_TYPE_INTEGER
- || ((FieldData *)field_data->data)->data_type == TRACKER_FIELD_TYPE_DOUBLE) {
- g_string_append_printf (str, " (%s = %s) ", ((FieldData *)field_data->data)->where_field, value);
+ TrackerFieldType data_type;
+
+ data_type = tracker_field_data_get_data_type (field_data->data);
+
+ if (data_type == TRACKER_FIELD_TYPE_DATE ||
+ data_type == TRACKER_FIELD_TYPE_INTEGER ||
+ data_type == TRACKER_FIELD_TYPE_DOUBLE) {
+ g_string_append_printf (str, " (%s = %s) ",
+ where_field,
+ value);
} else {
- g_string_append_printf (str, " (%s = '%s') ", ((FieldData *)field_data->data)->where_field, value);
+ g_string_append_printf (str, " (%s = '%s') ",
+ where_field,
+ value);
}
}
-
break;
case OP_GREATER:
-
- g_string_append_printf (str, " (%s > %s) ", ((FieldData *)field_data->data)->where_field, value);
-
+ g_string_append_printf (str, " (%s > %s) ",
+ where_field,
+ value);
break;
case OP_GREATER_EQUAL:
-
- g_string_append_printf (str, " (%s >= %s) ", ((FieldData *)field_data->data)->where_field, value);
-
+ g_string_append_printf (str, " (%s >= %s) ",
+ where_field,
+ value);
break;
case OP_LESS:
-
- g_string_append_printf (str, " (%s < %s) ", ((FieldData *)field_data->data)->where_field, value);
-
+ g_string_append_printf (str, " (%s < %s) ",
+ where_field,
+ value);
break;
case OP_LESS_EQUAL:
-
- g_string_append_printf (str, " (%s <= %s) ", ((FieldData *)field_data->data)->where_field, value);
-
+ g_string_append_printf (str, " (%s <= %s) ",
+ where_field,
+ value);
break;
case OP_CONTAINS:
-
sub = strchr (data->current_value, '*');
if (sub) {
- g_string_append_printf (str, " (%s like '%s%s%s') ", ((FieldData *)field_data->data)->where_field, "%", data->current_value, "%");
+ g_string_append_printf (str, " (%s like '%%%s%%') ",
+ where_field,
+ data->current_value);
} else {
- g_string_append_printf (str, " (%s like '%s%s%s') ", ((FieldData *)field_data->data)->where_field, "%", data->current_value, "%");
+ g_string_append_printf (str, " (%s like '%%%s%%') ",
+ where_field,
+ data->current_value);
}
-
break;
case OP_STARTS:
-
sub = strchr (data->current_value, '*');
if (sub) {
- g_string_append_printf (str, " (%s like '%s') ", ((FieldData *)field_data->data)->where_field, data->current_value);
+ g_string_append_printf (str, " (%s like '%s') ",
+ where_field,
+ data->current_value);
} else {
- g_string_append_printf (str, " (%s like '%s%s') ", ((FieldData *)field_data->data)->where_field, data->current_value, "%");
+ g_string_append_printf (str, " (%s like '%s%%') ",
+ where_field,
+ data->current_value);
}
break;
case OP_REGEX:
-
- g_string_append_printf (str, " (%s REGEXP '%s') ", ((FieldData *)field_data->data)->where_field, data->current_value);
-
+ g_string_append_printf (str, " (%s REGEXP '%s') ",
+ where_field,
+ data->current_value);
break;
case OP_SET:
-
s = g_strsplit (data->current_value, ",", 0);
if (s && s[0]) {
+ gchar **p;
- g_string_append_printf (str, " (%s in ('%s'", ((FieldData *)field_data->data)->where_field, s[0]);
+ g_string_append_printf (str, " (%s in ('%s'",
+ where_field,
+ s[0]);
- char **p;
- for (p = s+1; *p; p++) {
- g_string_append_printf (str, ",'%s'", *p);
+ for (p = s + 1; *p; p++) {
+ g_string_append_printf (str, ",'%s'", *p);
}
+
g_string_append_printf (str, ") ) " );
-
}
-
break;
default:
-
break;
}
data->sql_where = g_string_append (data->sql_where, str->str);
g_string_free (str, TRUE);
field_data = g_list_next (field_data);
-
}
data->sql_where = g_string_append (data->sql_where, " ) ");
g_free (avalue);
-
g_free (data->current_field);
data->current_field = NULL;
@@ -1222,19 +1254,31 @@
*where = NULL;
} else {
- const GSList *tmp;
- FieldData *tmp_field;
+ GSList *l;
- for (tmp = data.fields; tmp; tmp = tmp->next) {
- tmp_field = tmp->data;
-
- if (!tmp_field->is_condition) {
- if (tmp_field->needs_join) {
- g_string_append_printf (data.sql_from, "\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID = %s) ", tmp_field->table_name, tmp_field->alias, tmp_field->alias, tmp_field->alias, tmp_field->id_field);
+ for (l = data.fields; l; l = l->next) {
+ if (!tracker_field_data_get_is_condition (l->data)) {
+ if (tracker_field_data_get_needs_join (l->data)) {
+ g_string_append_printf (data.sql_from,
+ "\n LEFT OUTER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID = %s) ",
+ tracker_field_data_get_table_name (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_id_field (l->data));
}
} else {
- char *related_metadata = tracker_get_related_metadata_names (db_con, tmp_field->field_name);
- g_string_append_printf (data.sql_from, "\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ", tmp_field->table_name, tmp_field->alias, tmp_field->alias, tmp_field->alias, related_metadata);
+ gchar *related_metadata;
+
+ related_metadata = tracker_get_related_metadata_names (db_con,
+ tracker_field_data_get_field_name (l->data));
+ g_string_append_printf (data.sql_from,
+ "\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ",
+ tracker_field_data_get_table_name (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ tracker_field_data_get_alias (l->data),
+ related_metadata);
g_free (related_metadata);
}
}
@@ -1246,7 +1290,7 @@
g_string_free (data.sql_where, TRUE);
}
- g_slist_foreach (data.fields, (GFunc) tracker_free_metadata_field, NULL);
+ g_slist_foreach (data.fields, (GFunc) g_object_unref, NULL);
g_slist_free (data.fields);
g_slist_free (data.stack);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]