[libgda] GdaSqlBuilder can now build function expressions



commit d0f88fbbe6e358b8e3cb141a65f771bb93198b75
Author: Vivien Malerba <malerba gnome-db org>
Date:   Wed Sep 30 20:51:32 2009 +0200

    GdaSqlBuilder can now build function expressions

 doc/C/libgda-sections.txt       |    2 +
 doc/C/tmpl/gda-sql-builder.sgml |   25 +++++++++++
 libgda/gda-sql-builder.c        |   89 +++++++++++++++++++++++++++++++++++++++
 libgda/gda-sql-builder.h        |    4 +-
 libgda/libgda.symbols           |    2 +
 samples/SqlBuilder/example.c    |   25 +++++++++++
 6 files changed, 146 insertions(+), 1 deletions(-)
---
diff --git a/doc/C/libgda-sections.txt b/doc/C/libgda-sections.txt
index cda871f..c6204af 100644
--- a/doc/C/libgda-sections.txt
+++ b/doc/C/libgda-sections.txt
@@ -1662,6 +1662,8 @@ gda_sql_builder_get_sql_statement
 <SUBSECTION>
 gda_sql_builder_set_table
 gda_sql_builder_add_field
+gda_sql_builder_add_function
+gda_sql_builder_add_function_v
 <SUBSECTION>
 gda_sql_builder_ident
 gda_sql_builder_expr
diff --git a/doc/C/tmpl/gda-sql-builder.sgml b/doc/C/tmpl/gda-sql-builder.sgml
index e85dc9a..7eebede 100644
--- a/doc/C/tmpl/gda-sql-builder.sgml
+++ b/doc/C/tmpl/gda-sql-builder.sgml
@@ -104,6 +104,31 @@ gda_sql_builder_cond2 (b, 5, GDA_SQL_OPERATOR_TYPE_AND, 3, 4); // whole expressi
 @value_id: 
 
 
+<!-- ##### FUNCTION gda_sql_builder_add_function ##### -->
+<para>
+
+</para>
+
+ builder: 
+ id: 
+ func_name: 
+ Varargs: 
+ Returns: 
+
+
+<!-- ##### FUNCTION gda_sql_builder_add_function_v ##### -->
+<para>
+
+</para>
+
+ builder: 
+ id: 
+ func_name: 
+ args: 
+ args_size: 
+ Returns: 
+
+
 <!-- ##### FUNCTION gda_sql_builder_ident ##### -->
 <para>
 
diff --git a/libgda/gda-sql-builder.c b/libgda/gda-sql-builder.c
index 77659c0..a47dc83 100644
--- a/libgda/gda-sql-builder.c
+++ b/libgda/gda-sql-builder.c
@@ -1108,3 +1108,92 @@ gda_sql_builder_select_order_by (GdaSqlBuilder *builder, guint expr_id,
 		sorder->collation_name = g_strdup (collation_name);
 	sel->order_by = g_slist_append (sel->order_by, sorder);
 }
+
+/**
+ * gda_sql_builder_add_function
+ * @builder: a #GdaSqlBuilder object
+ * @id: the requested ID, or 0 if to be determined by @builder
+ * @function_id: the ID of the functions's name
+ * @...: a list, terminated with %0, of each function's argument's ID
+ *
+ * Builds a new expression which reprenents a function applied to some arguments
+ *
+ * Returns: the ID of the new expression, or 0 if there was an error
+ *
+ * Since: 4.2
+ */
+guint
+gda_sql_builder_add_function (GdaSqlBuilder *builder, guint id, const gchar *func_name, ...)
+{
+	g_return_val_if_fail (GDA_IS_SQL_BUILDER (builder), 0);
+	g_return_val_if_fail (builder->priv->main_stmt, 0);
+
+	GdaSqlExpr *expr;
+	GSList *list = NULL;
+	va_list ap;
+	SqlPart *part;
+	guint aid;
+
+	expr = gda_sql_expr_new (NULL);
+	expr->func = gda_sql_function_new (GDA_SQL_ANY_PART (expr));
+	expr->func->function_name = g_strdup (func_name);
+
+	va_start (ap, func_name);
+	for (aid = va_arg (ap, guint); aid; aid = va_arg (ap, guint)) {
+		part = get_part (builder, aid, GDA_SQL_ANY_EXPR);
+		if (!part) {
+			expr->func->args_list = list;
+			gda_sql_expr_free (expr);
+			return 0;
+		}
+		list = g_slist_prepend (list, use_part (part, GDA_SQL_ANY_PART (expr->func)));
+	}
+	va_end (ap);
+	expr->func->args_list = g_slist_reverse (list);
+
+	return add_part (builder, id, (GdaSqlAnyPart *) expr);
+}
+
+/**
+ * gda_sql_builder_add_function_v
+ * @builder: a #GdaSqlBuilder object
+ * @id: the requested ID, or 0 if to be determined by @builder
+ * @function_id: the ID of the functions's name
+ * @args: an array of IDs representing the function's arguments
+ * @args_size: @args's size
+ *
+ * Builds a new expression which reprenents a function applied to some arguments
+ *
+ * Returns: the ID of the new expression, or 0 if there was an error
+ *
+ * Since: 4.2
+ */
+guint
+gda_sql_builder_add_function_v (GdaSqlBuilder *builder, guint id, const gchar *func_name,
+				const guint *args, gint args_size)
+{
+	gint i;
+	g_return_val_if_fail (GDA_IS_SQL_BUILDER (builder), 0);
+	g_return_val_if_fail (builder->priv->main_stmt, 0);
+	g_return_val_if_fail (func_name && *func_name, 0);
+
+	GdaSqlExpr *expr;
+	GSList *list = NULL;
+	expr = gda_sql_expr_new (NULL);
+	expr->func = gda_sql_function_new (GDA_SQL_ANY_PART (expr));
+	expr->func->function_name = g_strdup (func_name);
+
+	for (i = 0; i < args_size; i++) {
+		SqlPart *part;
+		part = get_part (builder, args[i], GDA_SQL_ANY_EXPR);
+		if (!part) {
+			expr->func->args_list = list;
+			gda_sql_expr_free (expr);
+			return 0;
+		}
+		list = g_slist_prepend (list, use_part (part, GDA_SQL_ANY_PART (expr->func)));
+	}
+	expr->func->args_list = g_slist_reverse (list);
+
+	return add_part (builder, id, (GdaSqlAnyPart *) expr);
+}
diff --git a/libgda/gda-sql-builder.h b/libgda/gda-sql-builder.h
index 72f17a5..9240bef 100644
--- a/libgda/gda-sql-builder.h
+++ b/libgda/gda-sql-builder.h
@@ -79,6 +79,9 @@ guint              gda_sql_builder_cond (GdaSqlBuilder *builder, guint id, GdaSq
 					 guint op1, guint op2, guint op3);
 guint              gda_sql_builder_cond_v (GdaSqlBuilder *builder, guint id, GdaSqlOperatorType op,
 					   const guint *op_ids, gint op_ids_size);
+guint             gda_sql_builder_add_function (GdaSqlBuilder *builder, guint id, const gchar *func_name, ...);
+guint             gda_sql_builder_add_function_v (GdaSqlBuilder *builder, guint id, const gchar *func_name,
+						  const guint *args, gint args_size);
 
 
 /* SELECT Statement API */
@@ -99,7 +102,6 @@ void              gda_sql_builder_set_where (GdaSqlBuilder *builder, guint cond_
 void              gda_sql_builder_add_field (GdaSqlBuilder *builder, guint field_id, guint value_id);
 
 
-
 G_END_DECLS
 
 #endif
diff --git a/libgda/libgda.symbols b/libgda/libgda.symbols
index d8f16a3..d025b90 100644
--- a/libgda/libgda.symbols
+++ b/libgda/libgda.symbols
@@ -563,6 +563,8 @@
 	gda_sql_any_part_foreach
 	gda_sql_any_part_type_get_type
 	gda_sql_builder_add_field
+	gda_sql_builder_add_function
+	gda_sql_builder_add_function_v
 	gda_sql_builder_cond
 	gda_sql_builder_cond_v
 	gda_sql_builder_expr
diff --git a/samples/SqlBuilder/example.c b/samples/SqlBuilder/example.c
index 6b1fd2a..9e4e827 100644
--- a/samples/SqlBuilder/example.c
+++ b/samples/SqlBuilder/example.c
@@ -91,6 +91,31 @@ main (int argc, char *argv[])
 	render_as_sql (b);
 	g_object_unref (b);
 
+	/* SELECT myfunc (a, 5, 'Joe') FROM mytable */
+	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+	gda_sql_builder_select_add_target (b, 0,
+					   gda_sql_builder_ident (b, 0, "mytable"),
+					   NULL);
+	gda_sql_builder_add_function (b, 1, "myfunc",
+				      gda_sql_builder_ident (b, 0, "a"),
+				      gda_sql_builder_expr (b, 0, NULL, G_TYPE_INT, 5),
+				      gda_sql_builder_expr (b, 0, NULL, G_TYPE_STRING, "Joe"),
+				      0);
+	gda_sql_builder_add_field (b, 1, 0);
+	render_as_sql (b);
+
+	/* reuse the same GdaSqlBuilder object to have:
+	 * SELECT myfunc (a, 5, 'Joe'), MAX (myfunc (a, 5, 'Joe'), b, 10) FROM mytable */
+	guint args[] = {1, 3, 4};
+	gda_sql_builder_ident (b, 3, "b");
+	gda_sql_builder_expr (b, 4, NULL, G_TYPE_INT, 10);
+
+	gda_sql_builder_add_function_v (b, 5, "MAX", args, 3);
+	gda_sql_builder_add_field (b, 5, 0);
+
+	render_as_sql (b);
+	g_object_unref (b);	
+
 	return 0;
 }
 



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