[libgda] GdaSqlBuilder can now build function expressions
- From: Vivien Malerba <vivien src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [libgda] GdaSqlBuilder can now build function expressions
- Date: Wed, 30 Sep 2009 19:00:54 +0000 (UTC)
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]