Re: [gnome-db] GdaSqlBuilder: Specifying the full field name in a WHERE clause.



On Sun, 2010-06-13 at 14:56 +0200, Murray Cumming wrote:
> On Tue, 2010-05-25 at 16:15 +0200, Murray Cumming wrote:
> > When specifying the fields to get, gda_sql_builder_select_add_field()
> > lets me specify both the table name and the field name, to avoid
> > ambiguity:
> > http://library.gnome.org/devel/libgda/unstable/GdaSqlBuilder.html#gda-sql-builder-select-add-field
> > 
> > But when I want to specify the field in a WHERE clause, or a JOIN, or a
> > function parameer, I must manually create that string, such as
> > "mytable"."myfield", with the quotes if necessary, when passing it to
> > gda_sql_builder_add_id():
> > http://library.gnome.org/devel/libgda/unstable/GdaSqlBuilder.html#gda-sql-builder-add-id
> > 
> > I'd like to have a function for field IDs that takes both strings. But
> > gda_sql_builder_add_field_id() already exists and has a very different
> > purpose:
> > http://library.gnome.org/devel/libgda/unstable/GdaSqlBuilder.html#gda-sql-builder-add-field-id
> > 
> > Maybe gda_sql_builder_add_id_for_field()?
> 
> Thoughts? I might go ahead and implement this.

May I commit the attached patch?

GdaSqlBuilder: Add gda_sql_builder_add_field_id(builder, field, table).
    
    * libgda/gda-sql-builder.[h|c]: Added gda_sql_builder_add_field_id()
    as an easier way to call gda_sql_builder_add_id() when you need to
    specify the field name with a table prefix to avoid ambiguity.
    Note that there was previously a gda_sql_builder_add_field_id()
    which has been renamed to gda_sql_builder_add_field_value_id().
    Luckily it's signature is quite different.
    * doc/C/libgda-sections.txt:
    * libgda/libgda.symbols: Mention the new function here.



-- 
murrayc murrayc com
www.murrayc.com
www.openismus.com
>From a294bd7310b52591e351d40a6c7efd758bb7b687 Mon Sep 17 00:00:00 2001
From: Murray Cumming <murrayc murrayc com>
Date: Mon, 14 Jun 2010 15:50:41 +0200
Subject: [PATCH] GdaSqlBuilder: Add gda_sql_builder_add_field_id(builder, field, table).

* libgda/gda-sql-builder.[h|c]: Added gda_sql_builder_add_field_id()
as an easier way to call gda_sql_builder_add_id() when you need to
specify the field name with a table prefix to avoid ambiguity.
Note that there was previously a gda_sql_builder_add_field_id()
which has been renamed to gda_sql_builder_add_field_value_id().
Luckily it's signature is quite different.
* doc/C/libgda-sections.txt:
* libgda/libgda.symbols: Mention the new function here.
---
 doc/C/libgda-sections.txt |    1 +
 libgda/gda-sql-builder.c  |   44 +++++++++++++++++++++++++++++++++++++++++++-
 libgda/gda-sql-builder.h  |    1 +
 libgda/libgda.symbols     |    1 +
 4 files changed, 46 insertions(+), 1 deletions(-)

diff --git a/doc/C/libgda-sections.txt b/doc/C/libgda-sections.txt
index a358910..7a8272c 100644
--- a/doc/C/libgda-sections.txt
+++ b/doc/C/libgda-sections.txt
@@ -1681,6 +1681,7 @@ gda_sql_builder_add_function
 gda_sql_builder_add_function_v
 <SUBSECTION>
 gda_sql_builder_add_id
+gda_sql_builder_add_field_id
 gda_sql_builder_add_expr
 gda_sql_builder_add_expr_value
 gda_sql_builder_add_param
diff --git a/libgda/gda-sql-builder.c b/libgda/gda-sql-builder.c
index 0bd59e1..533e4e5 100644
--- a/libgda/gda-sql-builder.c
+++ b/libgda/gda-sql-builder.c
@@ -488,6 +488,8 @@ gda_sql_builder_set_where (GdaSqlBuilder *builder, GdaSqlBuilderId cond_id)
  *
  * Add a selected selected item to the SELECT statement.
  *
+ * For non-SELECT statements, see gda_sql_builder_add_field_id().
+ *
  * Returns: the ID of the added field, or 0 if there was an error
  *
  * Since: 4.2
@@ -846,7 +848,9 @@ gda_sql_builder_add_expr (GdaSqlBuilder *builder, GdaDataHandler *dh, GType type
  * @string: a string
  *
  * Defines an expression representing an identifier in @builder,
- * which may be reused to build other parts of a statement.
+ * which may be reused to build other parts of a statement,
+ * for instance as a parameter to gda_sql_builder_add_cond() or
+ * gda_sql_builder_add_field_value_id().
  *
  * The new expression will contain the @string literal.
  * For example:
@@ -863,6 +867,8 @@ gda_sql_builder_add_expr (GdaSqlBuilder *builder, GdaDataHandler *dh, GType type
  *
  * because "date" is an SQL reserved keyword.
  *
+ * For fields, see gda_sql_builder_add_field_id().
+ *
  * Returns: the ID of the new expression, or 0 if there was an error
  *
  * Since: 4.2
@@ -885,6 +891,42 @@ gda_sql_builder_add_id (GdaSqlBuilder *builder, const gchar *string)
 }
 
 /**
+ * gda_sql_builder_add_field_id
+ * @builder: a #GdaSqlBuilder object
+ * @field_name: a field name
+ * @table_name: a table name, or %NULL
+ *
+ * Defines an expression representing a field in @builder,
+ * which may be reused to build other parts of a statement,
+ * for instance as a parameter to gda_sql_builder_add_cond() or
+ * gda_sql_builder_add_field_value_id().
+ *
+ * Calling this with a %NULL @table_name is equivalent to calling gda_sql_builder_add_id().
+ *
+ * For SELECT queries, see gda_sql_builder_select_add_field().
+ *
+ * Returns: the ID of the new expression, or 0 if there was an error
+ *
+ * Since: 4.2
+ */
+GdaSqlBuilderId
+gda_sql_builder_add_field_id (GdaSqlBuilder *builder, const gchar *field_name, const gchar *table_name)
+{
+	gchar* tmp = 0;
+	if (table_name && *table_name)
+		tmp = g_strdup_printf ("%s.%s", table_name, field_name);
+	else
+		tmp = (gchar*) field_name;
+
+	guint field_id = gda_sql_builder_add_id (builder, tmp);
+
+	if (table_name)
+		g_free (tmp);
+
+	return field_id;
+}
+
+/**
  * gda_sql_builder_add_param
  * @builder: a #GdaSqlBuilder object
  * @param_name: parameter's name
diff --git a/libgda/gda-sql-builder.h b/libgda/gda-sql-builder.h
index 955d7fe..8c07794 100644
--- a/libgda/gda-sql-builder.h
+++ b/libgda/gda-sql-builder.h
@@ -75,6 +75,7 @@ GdaSqlStatement  *gda_sql_builder_get_sql_statement (GdaSqlBuilder *builder);
 
 /* Expression API */
 GdaSqlBuilderId gda_sql_builder_add_id (GdaSqlBuilder *builder, const gchar *string);
+GdaSqlBuilderId gda_sql_builder_add_field_id (GdaSqlBuilder *builder, const gchar *field_name, const gchar *table_name);
 GdaSqlBuilderId gda_sql_builder_add_expr (GdaSqlBuilder *builder, GdaDataHandler *dh, GType type, ...);
 GdaSqlBuilderId gda_sql_builder_add_expr_value (GdaSqlBuilder *builder, GdaDataHandler *dh, const GValue *value);
 GdaSqlBuilderId gda_sql_builder_add_param (GdaSqlBuilder *builder, const gchar *param_name, GType type, gboolean nullok);
diff --git a/libgda/libgda.symbols b/libgda/libgda.symbols
index 34159d1..df247aa 100644
--- a/libgda/libgda.symbols
+++ b/libgda/libgda.symbols
@@ -579,6 +579,7 @@
 	gda_sql_builder_add_cond_v
 	gda_sql_builder_add_expr
 	gda_sql_builder_add_expr_value
+	gda_sql_builder_add_field_id
 	gda_sql_builder_add_field_value
 	gda_sql_builder_add_field_value_id
 	gda_sql_builder_add_field_value_as_gvalue
-- 
1.6.3.3



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]