[libgda] Support more types for gda_sql_builder_add_expr_value()
- From: Vivien Malerba <vivien src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] Support more types for gda_sql_builder_add_expr_value()
- Date: Wed, 30 Jun 2010 18:48:55 +0000 (UTC)
commit 89a99a8b23a66ef414e91c1fbe5ab4c33e3b3e90
Author: Vivien Malerba <malerba gnome-db org>
Date: Wed Jun 30 17:52:35 2010 +0200
Support more types for gda_sql_builder_add_expr_value()
libgda/gda-sql-builder.c | 85 +++++++++++++++++++++++++++++++++++++++------
tests/test-sql-builder.c | 47 +++++++++++++++++++++++++-
2 files changed, 119 insertions(+), 13 deletions(-)
---
diff --git a/libgda/gda-sql-builder.c b/libgda/gda-sql-builder.c
index 533e4e5..13a5b63 100644
--- a/libgda/gda-sql-builder.c
+++ b/libgda/gda-sql-builder.c
@@ -532,12 +532,68 @@ create_typed_value (GType type, va_list *ap)
GValue *v = NULL;
if (type == G_TYPE_STRING)
g_value_set_string ((v = gda_value_new (G_TYPE_STRING)), va_arg (*ap, gchar*));
+ else if (type == G_TYPE_BOOLEAN)
+ g_value_set_boolean ((v = gda_value_new (G_TYPE_BOOLEAN)), va_arg (*ap, gboolean));
+ else if (type == G_TYPE_INT64)
+ g_value_set_int64 ((v = gda_value_new (G_TYPE_INT64)), va_arg (*ap, gint64));
+ else if (type == G_TYPE_UINT64)
+ g_value_set_uint64 ((v = gda_value_new (G_TYPE_UINT64)), va_arg (*ap, guint64));
else if (type == G_TYPE_INT)
g_value_set_int ((v = gda_value_new (G_TYPE_INT)), va_arg (*ap, gint));
+ else if (type == G_TYPE_UINT)
+ g_value_set_uint ((v = gda_value_new (G_TYPE_UINT)), va_arg (*ap, guint));
+ else if (type == GDA_TYPE_SHORT)
+ gda_value_set_short ((v = gda_value_new (GDA_TYPE_SHORT)), va_arg (*ap, gint));
+ else if (type == GDA_TYPE_USHORT)
+ gda_value_set_ushort ((v = gda_value_new (GDA_TYPE_USHORT)), va_arg (*ap, guint));
+ else if (type == G_TYPE_CHAR)
+ g_value_set_char ((v = gda_value_new (G_TYPE_CHAR)), va_arg (*ap, gint));
+ else if (type == G_TYPE_UCHAR)
+ g_value_set_uchar ((v = gda_value_new (G_TYPE_UCHAR)), va_arg (*ap, guint));
else if (type == G_TYPE_FLOAT)
- g_value_set_float ((v = gda_value_new (G_TYPE_FLOAT)), va_arg (*ap, double));
+ g_value_set_float ((v = gda_value_new (G_TYPE_FLOAT)), va_arg (*ap, gdouble));
+ else if (type == G_TYPE_DOUBLE)
+ g_value_set_double ((v = gda_value_new (G_TYPE_DOUBLE)), va_arg (*ap, gdouble));
+ else if (type == GDA_TYPE_NUMERIC) {
+ GdaNumeric *numeric;
+ numeric = va_arg (*ap, GdaNumeric *);
+ gda_value_set_numeric ((v = gda_value_new (GDA_TYPE_NUMERIC)), numeric);
+ }
+ else if (type == G_TYPE_DATE) {
+ GDate *gdate;
+ gdate = va_arg (*ap, GDate *);
+ g_value_set_boxed ((v = gda_value_new (G_TYPE_DATE)), gdate);
+ }
+ else if (type == GDA_TYPE_TIME) {
+ GdaTime *timegda;
+ timegda = va_arg (*ap, GdaTime *);
+ gda_value_set_time ((v = gda_value_new (GDA_TYPE_TIME)), timegda);
+ }
+ else if (type == GDA_TYPE_TIMESTAMP) {
+ GdaTimestamp *timestamp;
+ timestamp = va_arg (*ap, GdaTimestamp *);
+ gda_value_set_timestamp ((v = gda_value_new (GDA_TYPE_TIMESTAMP)), timestamp);
+ }
+ else if (type == GDA_TYPE_NULL)
+ v = gda_value_new_null ();
+ else if (type == G_TYPE_GTYPE)
+ g_value_set_gtype ((v = gda_value_new (G_TYPE_GTYPE)), va_arg (*ap, GType));
+ else if (type == G_TYPE_ULONG)
+ g_value_set_ulong ((v = gda_value_new (G_TYPE_ULONG)), va_arg (*ap, gulong));
+ else if (type == G_TYPE_LONG)
+ g_value_set_long ((v = gda_value_new (G_TYPE_LONG)), va_arg (*ap, ulong));
+ else if (type == GDA_TYPE_BINARY) {
+ GdaBinary *bin;
+ bin = va_arg (*ap, GdaBinary *);
+ gda_value_set_binary ((v = gda_value_new (GDA_TYPE_BINARY)), bin);
+ }
+ else if (type == GDA_TYPE_BLOB) {
+ GdaBlob *blob;
+ blob = va_arg (*ap, GdaBlob *);
+ gda_value_set_blob ((v = gda_value_new (GDA_TYPE_BLOB)), blob);
+ }
else
- g_warning (_("Could not convert value to type '%s'"), g_type_name (type));
+ g_warning (_("Could not convert value to type '%s', value not defined"), g_type_name (type));
return v;
}
@@ -551,7 +607,7 @@ create_typed_value (GType type, va_list *ap)
* Valid only for: INSERT, UPDATE statements.
*
* Specifies that the field represented by @field_name will be set to the value identified
- * by @... of type @type.
+ * by @... of type @type. See gda_sql_builder_add_expr() for more information.
*
* This is a C convenience function. See also gda_sql_builder_add_field_value_as_gvalue().
*
@@ -800,19 +856,24 @@ gda_sql_builder_add_expr_value (GdaSqlBuilder *builder, GdaDataHandler *dh, cons
*
* Defines an expression in @builder which may be reused to build other parts of a statement.
*
- * The new expression will contain the value passed as the @v argument. It is possible to
+ * The new expression will contain the value passed as the @... argument. It is possible to
* customize how the value has to be interpreted by passing a specific #GdaDataHandler object as @dh.
*
- * For example:
- * <programlisting>
- * gda_sql_builder_add_expr (b, G_TYPE_INT, 15);
- * gda_sql_builder_add_expr (b, G_TYPE_STRING, "joe")
- * </programlisting>
+ * Note that for composite types such as #GdaNumeric, #Gdate, #GdaTime, ... pointer to these
+ * structures are expected, they should no be passed by value. For example:
+ * <programlisting><![CDATA[GDate *date = g_date_new_dmy (27, G_DATE_MAY, 1972);
+id = gda_sql_builder_add_expr (b, NULL, G_TYPE_DATE, date);
+g_date_free (date);
+
+id = gda_sql_builder_add_expr (b, NULL, G_TYPE_STRING, "my string");
+id = gda_sql_builder_add_expr (b, NULL, G_TYPE_INT, 25);
+]]></programlisting>
*
- * will be rendered as SQL as:
+ * will correspond in SQL to:
* <programlisting>
- * 15
- * 'joe'
+ * '05-27-1972'
+ * 'my string'
+ * 25
* </programlisting>
*
* Returns: the ID of the new expression, or 0 if there was an error
diff --git a/tests/test-sql-builder.c b/tests/test-sql-builder.c
index 7917868..6f41153 100644
--- a/tests/test-sql-builder.c
+++ b/tests/test-sql-builder.c
@@ -43,6 +43,7 @@ static GdaSqlStatement *build9 (void);
static GdaSqlStatement *build10 (void);
static GdaSqlStatement *build11 (void);
static GdaSqlStatement *build12 (void);
+static GdaSqlStatement *build13 (void);
static gboolean builder_test_target_id (void);
@@ -59,7 +60,8 @@ ATest tests[] = {
{"build9", build9, "{\"sql\":null,\"stmt_type\":\"INSERT\",\"contents\":{\"table\":\"mytable\",\"fields\":[\"session\",\"name\"],\"values\":[[{\"value\":\"NULL\"},{\"value\":\"NULL\"}]]}}"},
{"build10", build10, "{\"sql\":null,\"stmt_type\":\"SELECT\",\"contents\":{\"distinct\":\"true\",\"fields\":[{\"expr\":{\"value\":\"fav_id\",\"sqlident\":\"TRUE\"}},{\"expr\":{\"value\":\"rank\",\"sqlident\":\"TRUE\"}}],\"from\":{\"targets\":[{\"expr\":{\"value\":\"mytable\",\"sqlident\":\"TRUE\"},\"table_name\":\"mytable\"}]},\"limit\":{\"value\":\"5\"}}}"},
{"build11", build11, "{\"sql\":null,\"stmt_type\":\"SELECT\",\"contents\":{\"distinct\":\"true\",\"distinct_on\":{\"value\":\"rank\",\"sqlident\":\"TRUE\"},\"fields\":[{\"expr\":{\"value\":\"fav_id\",\"sqlident\":\"TRUE\"}},{\"expr\":{\"value\":\"rank\",\"sqlident\":\"TRUE\"}}],\"from\":{\"targets\":[{\"expr\":{\"value\":\"mytable\",\"sqlident\":\"TRUE\"},\"table_name\":\"mytable\"}]},\"limit\":{\"value\":\"5\"},\"offset\":{\"value\":\"2\"}}}"},
- {"build12", build12, "{\"sql\":null,\"stmt_type\":\"SELECT\",\"contents\":{\"distinct\":\"false\",\"fields\":[{\"expr\":{\"value\":\"store_name\",\"sqlident\":\"TRUE\"}},{\"expr\":{\"func\":{\"function_name\":\"sum\",\"function_args\":[{\"value\":\"sales\",\"sqlident\":\"TRUE\"}]}}}],\"from\":{\"targets\":[{\"expr\":{\"value\":\"stores\",\"sqlident\":\"TRUE\"},\"table_name\":\"stores\"}]},\"group_by\":[{\"value\":\"store_name\",\"sqlident\":\"TRUE\"}],\"having\":{\"operation\":{\"operator\":\">\",\"operand0\":{\"func\":{\"function_name\":\"sum\",\"function_args\":[{\"value\":\"sales\",\"sqlident\":\"TRUE\"}]}},\"operand1\":{\"value\":\"10\"}}}}}"}
+ {"build12", build12, "{\"sql\":null,\"stmt_type\":\"SELECT\",\"contents\":{\"distinct\":\"false\",\"fields\":[{\"expr\":{\"value\":\"store_name\",\"sqlident\":\"TRUE\"}},{\"expr\":{\"func\":{\"function_name\":\"sum\",\"function_args\":[{\"value\":\"sales\",\"sqlident\":\"TRUE\"}]}}}],\"from\":{\"targets\":[{\"expr\":{\"value\":\"stores\",\"sqlident\":\"TRUE\"},\"table_name\":\"stores\"}]},\"group_by\":[{\"value\":\"store_name\",\"sqlident\":\"TRUE\"}],\"having\":{\"operation\":{\"operator\":\">\",\"operand0\":{\"func\":{\"function_name\":\"sum\",\"function_args\":[{\"value\":\"sales\",\"sqlident\":\"TRUE\"}]}},\"operand1\":{\"value\":\"10\"}}}}}"},
+ {"build13", build13, "{\"sql\":null,\"stmt_type\":\"SELECT\",\"contents\":{\"distinct\":\"false\",\"fields\":[{\"expr\":{\"value\":\"'A''string'\"}},{\"expr\":{\"value\":\"234\"}},{\"expr\":{\"value\":\"TRUE\"}},{\"expr\":{\"value\":\"123.4567890\"}},{\"expr\":{\"value\":\"'05-27-1972'\"}},{\"expr\":{\"value\":\"'abc''de\\\\\\\\\\\\\\\\fgh'\"}}]}}"}
};
int
@@ -600,3 +602,46 @@ builder_test_target_id (void)
return allok;
}
+
+/*
+ * SELECT store_name, sum (sales) FROM stores GROUP BY store_name HAVING sum (sales) > 10
+ */
+static GdaSqlStatement *
+build13 (void)
+{
+ GdaSqlBuilder *b;
+ GdaSqlStatement *stmt;
+
+ b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+ gda_sql_builder_add_field_value_id (b,
+ gda_sql_builder_add_expr (b, NULL, G_TYPE_STRING, "A'string"), 0);
+ gda_sql_builder_add_field_value_id (b,
+ gda_sql_builder_add_expr (b, NULL, G_TYPE_INT, 234), 0);
+ gda_sql_builder_add_field_value_id (b,
+ gda_sql_builder_add_expr (b, NULL, G_TYPE_BOOLEAN, TRUE), 0);
+ GdaNumeric numval = {"123.4567890", 0, 0};
+ gda_sql_builder_add_field_value_id (b,
+ gda_sql_builder_add_expr (b, NULL, GDA_TYPE_NUMERIC, &numval), 0);
+ GDate *date = g_date_new_dmy (27, G_DATE_MAY, 1972);
+ gda_sql_builder_add_field_value_id (b,
+ gda_sql_builder_add_expr (b, NULL, G_TYPE_DATE, date), 0);
+ g_date_free (date);
+
+ GdaBinary bin = {"abc'de\\fghijklm", 10};
+ gda_sql_builder_add_field_value_id (b,
+ gda_sql_builder_add_expr (b, NULL, GDA_TYPE_BINARY, &bin), 0);
+
+
+#ifdef DEBUG
+ {
+ GdaStatement *st;
+ st = gda_sql_builder_get_statement (b, FALSE);
+ g_print ("[%s]\n", gda_statement_to_sql (st, NULL, NULL));
+ g_object_unref (st);
+ }
+#endif
+
+ stmt = gda_sql_statement_copy (gda_sql_builder_get_sql_statement (b));
+ g_object_unref (b);
+ return stmt;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]