From b26fa296e93e704dca879fa149cda4f89a72a68a Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sun, 24 Jan 2016 11:30:05 +0100 Subject: [PATCH 01/16] Added program gdaex2gettext. --- .gitignore | 7 +- Makefile.am | 2 +- configure.ac | 2 + docs/gdaex2gettext/gdaex2gettext.xml | 8 ++ gdaex2gettext/Makefile.am | 11 ++ gdaex2gettext/gdaex2gettext.c | 153 +++++++++++++++++++++++++++ tests/gdaex2gettext.xml | 8 ++ 7 files changed, 188 insertions(+), 3 deletions(-) create mode 100644 docs/gdaex2gettext/gdaex2gettext.xml create mode 100644 gdaex2gettext/Makefile.am create mode 100644 gdaex2gettext/gdaex2gettext.c create mode 100644 tests/gdaex2gettext.xml diff --git a/.gitignore b/.gitignore index 79f01f5..2505b7a 100644 --- a/.gitignore +++ b/.gitignore @@ -27,9 +27,11 @@ stamp-it mkinstalldirs docs/reference/html/ docs/reference/xml/ -src/.libs/ -src/.deps/ +.libs +.deps src/*marshal.[ch] +gdaex2gettext/gdaex2gettext +gdaex2gettext/gdaex2gettext.exe tests/.libs/ tests/.deps/ po/POTFILES @@ -44,6 +46,7 @@ intltool* libgdaex*tar* tests/test_prefix* tests/query_editor +tests/*.gdaexxml tests/grid tests/fill_liststore tests/*.exe diff --git a/Makefile.am b/Makefile.am index fa762b2..8ed654a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc -SUBDIRS = data po src docs tests +SUBDIRS = data po src gdaex2gettext docs tests ACLOCAL_AMFLAGS = -I m4 diff --git a/configure.ac b/configure.ac index 921d19a..1fe5b29 100644 --- a/configure.ac +++ b/configure.ac @@ -49,6 +49,7 @@ PKG_CHECK_MODULES(GDAEX, [gmodule-2.0 >= 2 libgda-5.0 >= 5 gio-2.0 >= 2.36 gtk+-3.0 >= 3 + libxml-2.0 >= 2 libzakutils]) AC_SUBST(GDAEX_CFLAGS) @@ -89,6 +90,7 @@ AC_CONFIG_FILES([ docs/Makefile docs/reference/Makefile docs/reference/version.xml + gdaex2gettext/Makefile tests/Makefile po/Makefile.in ]) diff --git a/docs/gdaex2gettext/gdaex2gettext.xml b/docs/gdaex2gettext/gdaex2gettext.xml new file mode 100644 index 0000000..4761d6c --- /dev/null +++ b/docs/gdaex2gettext/gdaex2gettext.xml @@ -0,0 +1,8 @@ + + + + + sql statement + + + diff --git a/gdaex2gettext/Makefile.am b/gdaex2gettext/Makefile.am new file mode 100644 index 0000000..1d25de9 --- /dev/null +++ b/gdaex2gettext/Makefile.am @@ -0,0 +1,11 @@ +AM_CPPFLAGS = $(WARN_CFLAGS) \ + $(DISABLE_DEPRECATED_CFLAGS) \ + -I$(top_srcdir)/src \ + $(GDAEX_CFLAGS) + +LIBS = $(GDAEX_LIBS) + +LDADD = $(top_builddir)/src/libgdaex.la + +bin_PROGRAMS = \ + gdaex2gettext diff --git a/gdaex2gettext/gdaex2gettext.c b/gdaex2gettext/gdaex2gettext.c new file mode 100644 index 0000000..8f29f15 --- /dev/null +++ b/gdaex2gettext/gdaex2gettext.c @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2016 Andrea Zagli + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include + +void +read_xml_file (const gchar *xmlfilename, GdaEx *gdaex) +{ + xmlDoc *xdoc; + xmlNode *xnode; + + gchar *filename; + gchar *sql; + GdaDataModel *dm; + + GError *error; + + xdoc = xmlParseFile (xmlfilename); + if (xdoc == NULL) + { + g_error ("Unable to parse xml file «%s».", xmlfilename); + } + else + { + xnode = xmlDocGetRootElement (xdoc); + if (xnode != NULL) + { + if (xmlStrcmp (xnode->name, "gdaex2gettext") != 0) + { + g_error ("Xml file not valid: «%s».", xmlfilename); + } + else + { + xnode = xnode->children; + while (xnode) + { + if (xmlStrcmp (xnode->name, "file") == 0) + { + filename = g_strdup (xmlGetProp (xnode, "filename")); + if (filename != NULL + && g_strcmp0 (g_strstrip (filename), "") != 0) + { + sql = g_strdup (xmlNodeGetContent (xnode)); + + dm = gdaex_query (gdaex, g_strstrip (sql)); + xmlFree (sql); + if (dm != NULL) + { + error = NULL; + if (!gda_data_model_export_to_file (dm, + GDA_DATA_MODEL_IO_DATA_ARRAY_XML, + filename, + NULL, 0, + NULL, 0, + NULL, + &error) + || error != NULL) + { + g_warning ("Error on data model export: %s.", + error != NULL && error->message != NULL ? error->message : "no details"); + } + g_object_unref (dm); + } + } + if (filename != NULL) + { + g_free (filename); + } + } + + xnode = xnode->next; + } + } + } + else + { + g_error ("Xml file not valid: «%s».", xmlfilename); + } + } + + return; +} + +int +main (int argc, char **argv) +{ + gchar *cncstring; + gchar *xmlfile; + + GError *error; + GOptionContext *context; + + GdaEx *gdaex; + + GOptionEntry entries[] = + { + { "cnc-string", 'c', 0, G_OPTION_ARG_STRING, &cncstring, "Connection string", NULL }, + { "xml-file", 'x', 0, G_OPTION_ARG_FILENAME, &xmlfile, "Xml file", NULL }, + { NULL } + }; + + cncstring = NULL; + xmlfile = NULL; + + gtk_init (&argc, &argv); + + error = NULL; + context = g_option_context_new ("gdaex2gettext"); + g_option_context_add_main_entries (context, entries, "gdaex2gettext"); + g_option_context_parse (context, &argc, &argv, &error); + if (error != NULL) + { + g_error ("Error on command line parsing: %s", error->message); + return 0; + } + + if (cncstring == NULL) + { + g_error ("Connection string is mandatory."); + return 0; + } + if (xmlfile == NULL) + { + g_error ("Xml file is mandatory."); + return 0; + } + + gdaex = gdaex_new_from_string (cncstring); + if (gdaex == NULL) + { + g_error ("Unable to create database connection «%s».", cncstring); + return 0; + } + + read_xml_file (xmlfile, gdaex); + + return 0; +} diff --git a/tests/gdaex2gettext.xml b/tests/gdaex2gettext.xml new file mode 100644 index 0000000..02b7bcb --- /dev/null +++ b/tests/gdaex2gettext.xml @@ -0,0 +1,8 @@ + + + + + SELECT * FROM articoli + + + -- 2.49.0 From d06ec8f77179d41e5f1b9f80a0873fff703a1a6c Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sun, 24 Jan 2016 11:46:44 +0100 Subject: [PATCH 02/16] Added specification files for gettext. --- data/gdaex2gettext/gdaex2gettext.its | 8 ++++++++ data/gdaex2gettext/gdaex2gettext.loc | 7 +++++++ 2 files changed, 15 insertions(+) create mode 100644 data/gdaex2gettext/gdaex2gettext.its create mode 100644 data/gdaex2gettext/gdaex2gettext.loc diff --git a/data/gdaex2gettext/gdaex2gettext.its b/data/gdaex2gettext/gdaex2gettext.its new file mode 100644 index 0000000..6f1af9e --- /dev/null +++ b/data/gdaex2gettext/gdaex2gettext.its @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/data/gdaex2gettext/gdaex2gettext.loc b/data/gdaex2gettext/gdaex2gettext.loc new file mode 100644 index 0000000..35fb996 --- /dev/null +++ b/data/gdaex2gettext/gdaex2gettext.loc @@ -0,0 +1,7 @@ + + + + + + + -- 2.49.0 From 1004753f66b3647eeb95f007092573a62db1215f Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sat, 6 Feb 2016 09:33:22 +0100 Subject: [PATCH 03/16] Version 0.6.0. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 1fe5b29..0f4b99a 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT([libgdaex], [0.5.0], [azagli@libero.it]) +AC_INIT([libgdaex], [0.6.0], [azagli@libero.it]) AC_CONFIG_SRCDIR([src/gdaex.c]) AM_CONFIG_HEADER([config.h]) -- 2.49.0 From b072b195d12e5c1bfe85804858978b5073720b0a Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sun, 21 Feb 2016 16:35:32 +0100 Subject: [PATCH 04/16] Removed warning in GdaEx::get_blob. --- src/gdaex.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gdaex.c b/src/gdaex.c index 63bcc21..a4f9746 100644 --- a/src/gdaex.c +++ b/src/gdaex.c @@ -34,6 +34,7 @@ #include #include +#include #include "gdaex.h" @@ -3572,14 +3573,15 @@ const gchar { blob = gda_value_get_blob (value); - filename_orig = g_strdup (""); + filename_orig = g_strdup ("jdoe"); error = NULL; value = gda_data_model_get_value_at (dm, gda_data_model_get_column_index (dm, filename_field_name), 0, &error); - if (!gda_value_is_null (value)) + if (value != NULL && !gda_value_is_null (value)) { path = g_value_get_string (value); + g_free (filename_orig); filename_orig = g_path_get_basename (path); } -- 2.49.0 From 9613000e1b8aaac450f91323217e0858a57704e7 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sun, 21 Feb 2016 17:20:48 +0100 Subject: [PATCH 05/16] SqlBuilder: enabled number of arguments different from 2. --- src/sqlbuilder.c | 58 +++++++++++++++++++++++++++++++++++++++------- tests/sqlbuilder.c | 37 +++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 9 deletions(-) diff --git a/src/sqlbuilder.c b/src/sqlbuilder.c index 180a455..939ca36 100644 --- a/src/sqlbuilder.c +++ b/src/sqlbuilder.c @@ -1,7 +1,7 @@ /* * sql_builder.c * - * Copyright (C) 2010-2014 Andrea Zagli + * Copyright (C) 2010-2016 Andrea Zagli * * This file is part of libgdaex. * @@ -445,7 +445,8 @@ gdaex_sql_builder_where (GdaExSqlBuilder *sqlb, GdaSqlOperatorType op, ...) GdaSqlOperatorType op_expr; - GdaSqlBuilderId id_expr; + GdaSqlBuilderId id_expr1; + GdaSqlBuilderId id_expr2; GdaSqlBuilderId id_cond; GdaExSqlBuilderPrivate *priv = GDAEX_SQLBUILDER_GET_PRIVATE (sqlb); @@ -487,17 +488,56 @@ gdaex_sql_builder_where (GdaExSqlBuilder *sqlb, GdaSqlOperatorType op, ...) op_expr = va_arg (ap, guint); - gval = va_arg (ap, GValue *); - if (gval != NULL) - { - id_expr = gda_sql_builder_add_expr_value (priv->sqlb, NULL, gval); - } - else + id_expr1 = 0; + id_expr2 = 0; + switch (op_expr) { + case GDA_SQL_OPERATOR_TYPE_EQ: + case GDA_SQL_OPERATOR_TYPE_IS: + case GDA_SQL_OPERATOR_TYPE_LIKE: + case GDA_SQL_OPERATOR_TYPE_NOTLIKE: + case GDA_SQL_OPERATOR_TYPE_ILIKE: + case GDA_SQL_OPERATOR_TYPE_NOTILIKE: + case GDA_SQL_OPERATOR_TYPE_GT: + case GDA_SQL_OPERATOR_TYPE_LT: + case GDA_SQL_OPERATOR_TYPE_GEQ: + case GDA_SQL_OPERATOR_TYPE_LEQ: + case GDA_SQL_OPERATOR_TYPE_DIFF: + case GDA_SQL_OPERATOR_TYPE_REGEXP: + case GDA_SQL_OPERATOR_TYPE_REGEXP_CI: + case GDA_SQL_OPERATOR_TYPE_NOT_REGEXP: + case GDA_SQL_OPERATOR_TYPE_NOT_REGEXP_CI: + case GDA_SQL_OPERATOR_TYPE_SIMILAR: + case GDA_SQL_OPERATOR_TYPE_REM: + case GDA_SQL_OPERATOR_TYPE_DIV: + case GDA_SQL_OPERATOR_TYPE_BITAND: + case GDA_SQL_OPERATOR_TYPE_BITOR: + gval = va_arg (ap, GValue *); + if (gval != NULL) + { + id_expr1 = gda_sql_builder_add_expr_value (priv->sqlb, NULL, gval); + } + break; + + case GDA_SQL_OPERATOR_TYPE_ISNULL: + case GDA_SQL_OPERATOR_TYPE_ISNOTNULL: + break; + + case GDA_SQL_OPERATOR_TYPE_BETWEEN: + gval = va_arg (ap, GValue *); + if (gval != NULL) + { + id_expr1 = gda_sql_builder_add_expr_value (priv->sqlb, NULL, gval); + } + gval = va_arg (ap, GValue *); + if (gval != NULL) + { + id_expr2 = gda_sql_builder_add_expr_value (priv->sqlb, NULL, gval); + } break; } - id_cond = gda_sql_builder_add_cond (priv->sqlb, op_expr, f->id, id_expr, 0); + id_cond = gda_sql_builder_add_cond (priv->sqlb, op_expr, f->id, id_expr1, id_expr2); if (priv->id_where != 0) { priv->id_where = gda_sql_builder_add_cond (priv->sqlb, op, priv->id_where, id_cond, 0); diff --git a/tests/sqlbuilder.c b/tests/sqlbuilder.c index e12c229..2a29520 100644 --- a/tests/sqlbuilder.c +++ b/tests/sqlbuilder.c @@ -75,6 +75,43 @@ main (int argc, char **argv) g_object_unref (sqlb); + sqlb = gdaex_sql_builder_new (GDA_SQL_STATEMENT_SELECT); + + gdaex_sql_builder_from (sqlb, "pippo", ""); + + gdaex_sql_builder_fields (sqlb, + "pippo", "id", "", NULL, + "pippo", "name", "the_name", NULL, + NULL); + + gval = g_new0 (GValue, 1); + g_value_init (gval, G_TYPE_INT); + g_value_set_int (gval, 44); + gdaex_sql_builder_where (sqlb, 0, + "pippo", "id", "", + GDA_SQL_OPERATOR_TYPE_ISNULL, + gval, + NULL); + g_value_unset (gval); + + gval = g_new0 (GValue, 1); + g_value_init (gval, G_TYPE_INT); + g_value_set_int (gval, 44); + GValue *gval2 = g_new0 (GValue, 1); + g_value_init (gval2, G_TYPE_INT); + g_value_set_int (gval2, 8877); + gdaex_sql_builder_where (sqlb, 0, + "pippo", "id", "", + GDA_SQL_OPERATOR_TYPE_BETWEEN, + gval, gval2, + NULL); + g_value_unset (gval); + g_value_unset (gval2); + + g_message ("sql: %s", gdaex_sql_builder_get_sql (sqlb, NULL, NULL)); + + g_object_unref (sqlb); + sqlb = gdaex_sql_builder_new (GDA_SQL_STATEMENT_DELETE); gdaex_sql_builder_from_v (sqlb, -- 2.49.0 From 676d7a6f032478a1b7924d4547ffc22f3de5efd0 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sat, 5 Mar 2016 10:05:36 +0100 Subject: [PATCH 06/16] QueryEditor: order doesn't work after translation was added. --- data/libgdaex/gui/libgdaex.ui | 7 ++++++- src/queryeditor.c | 18 +++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/data/libgdaex/gui/libgdaex.ui b/data/libgdaex/gui/libgdaex.ui index e2fbb4a..0e7fe4f 100644 --- a/data/libgdaex/gui/libgdaex.ui +++ b/data/libgdaex/gui/libgdaex.ui @@ -12,6 +12,8 @@ + + @@ -185,6 +187,7 @@ False vertical 5 + True start @@ -385,6 +388,7 @@ False vertical 5 + True start @@ -540,7 +544,7 @@ - 3 + 4 @@ -560,6 +564,7 @@ False vertical 5 + True start diff --git a/src/queryeditor.c b/src/queryeditor.c index c6d5d6c..27a3b58 100644 --- a/src/queryeditor.c +++ b/src/queryeditor.c @@ -294,7 +294,8 @@ enum COL_ORDER_TABLE_NAME, COL_ORDER_NAME, COL_ORDER_VISIBLE_NAME, - COL_ORDER_ORDER + COL_ORDER_ORDER, + COL_ORDER_ORDER_VISIBLE }; static void @@ -2874,8 +2875,8 @@ gdaex_query_editor_load_choices_from_xml (GdaExQueryEditor *qe, xmlNode *root, gchar *asc_desc; asc_desc = xmlGetProp (node_field, "asc_desc"); - if (g_strcmp0 (asc_desc, _("ASC")) == 0 - || g_strcmp0 (asc_desc, _("DESC")) == 0) + if (g_strcmp0 (asc_desc, "ASC") == 0 + || g_strcmp0 (asc_desc, "DESC") == 0) { gtk_list_store_append (priv->lstore_order, &iter); gtk_list_store_set (priv->lstore_order, &iter, @@ -2883,6 +2884,7 @@ gdaex_query_editor_load_choices_from_xml (GdaExQueryEditor *qe, xmlNode *root, COL_ORDER_NAME, field_name, COL_ORDER_VISIBLE_NAME, name_visible, COL_ORDER_ORDER, asc_desc, + COL_ORDER_ORDER_VISIBLE, g_strcmp0 (asc_desc, "ASC") == 0 ? _("Ascending") : _("Descending"), -1); } } @@ -3642,6 +3644,7 @@ gdaex_query_editor_on_btn_save_clicked (GtkButton *button, gchar *val1; gchar *val2; gchar *asc_desc; + gchar *asc_desc_visible; qe = (GdaExQueryEditor *)user_data; priv = GDAEX_QUERY_EDITOR_GET_PRIVATE (qe); @@ -3839,15 +3842,18 @@ gdaex_query_editor_on_btn_save_clicked (GtkButton *button, { if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->opt_asc))) { - asc_desc = g_strdup (_("ASC")); + asc_desc = g_strdup ("ASC"); + asc_desc_visible = g_strdup (_("Ascending")); } else { - asc_desc = g_strdup (_("DESC")); + asc_desc = g_strdup ("DESC"); + asc_desc_visible = g_strdup (_("Descending")); } gtk_list_store_set (priv->lstore_order, &iter, COL_ORDER_ORDER, asc_desc, + COL_ORDER_ORDER_VISIBLE, asc_desc_visible, -1); gtk_tree_selection_unselect_all (priv->sel_order); @@ -3856,6 +3862,7 @@ gdaex_query_editor_on_btn_save_clicked (GtkButton *button, } g_free (asc_desc); + g_free (asc_desc_visible); g_free (val1); g_free (val2); @@ -4736,6 +4743,7 @@ gdaex_query_editor_on_btn_order_add_clicked (GtkButton *button, COL_ORDER_NAME, field_name, COL_ORDER_VISIBLE_NAME, g_strconcat (table->name_visible, " - ", field->name_visible, NULL), COL_ORDER_ORDER, "ASC", + COL_ORDER_ORDER_VISIBLE, _("Ascending"), -1); wpage = gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook), GDAEX_QE_PAGE_ORDER); -- 2.49.0 From ea6381902020cc2ac3b9c8c3b454320231efc10a Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sat, 5 Mar 2016 10:49:59 +0100 Subject: [PATCH 07/16] QueryEditor: added and implemented always_ordered and order_default field properties (refs #977). --- data/gdaex_query_editor.dtd | 6 +- src/queryeditor.c | 142 +++++++++++++++++++++++++++--------- src/queryeditor.h | 8 ++ tests/query_editor.xml | 3 + 4 files changed, 123 insertions(+), 36 deletions(-) diff --git a/data/gdaex_query_editor.dtd b/data/gdaex_query_editor.dtd index 2156c6c..238b889 100644 --- a/data/gdaex_query_editor.dtd +++ b/data/gdaex_query_editor.dtd @@ -13,7 +13,7 @@ table_name CDATA #REQUIRED > - + @@ -25,6 +25,8 @@ + + @@ -42,4 +44,4 @@ - \ No newline at end of file + diff --git a/src/queryeditor.c b/src/queryeditor.c index 27a3b58..2b92ac3 100644 --- a/src/queryeditor.c +++ b/src/queryeditor.c @@ -103,6 +103,7 @@ static void gdaex_query_editor_refresh_gui_add_fields (GdaExQueryEditor *qe, GtkTreeIter *iter_parent); static void gdaex_query_editor_refill_always_show (GdaExQueryEditor *qe); +static void gdaex_query_editor_refill_always_order (GdaExQueryEditor *qe); static void gdaex_query_editor_store_remove_iter (GdaExQueryEditor *qe, GtkTreeSelection *sel, @@ -141,6 +142,7 @@ static void gdaex_query_editor_on_notebook_switch_page (GtkNotebook *notebook, gpointer user_data); static void gdaex_query_editor_show_add_iter (GdaExQueryEditor *qe, GtkTreeIter *iter); +static void gdaex_query_editor_order_add_iter (GdaExQueryEditor *qe, GtkTreeIter *iter); static void gdaex_query_editor_on_btn_show_add_clicked (GtkButton *button, gpointer user_data); @@ -1384,6 +1386,21 @@ gdaex_query_editor_load_tables_from_xml (GdaExQueryEditor *qe, { field->for_order = zak_utils_string_to_boolean (xmlNodeGetContent (cur)); } + else if (xmlStrcmp (cur->name, "always_ordered") == 0) + { + field->always_ordered = zak_utils_string_to_boolean (xmlNodeGetContent (cur)); + } + else if (xmlStrcmp (cur->name, "order_default") == 0) + { + if (g_strcmp0 (xmlNodeGetContent (cur), "ASC") == 0) + { + field->order_default = GDAEX_QE_ORDER_ASC; + } + else + { + field->order_default = GDAEX_QE_ORDER_DESC; + } + } else if (xmlStrcmp (cur->name, "decode") == 0) { xdecode = cur->children; @@ -1619,6 +1636,7 @@ gdaex_query_editor_clean_choices (GdaExQueryEditor *qe) gtk_list_store_clear (priv->lstore_order); gdaex_query_editor_refill_always_show (qe); + gdaex_query_editor_refill_always_order (qe); gtk_button_clicked (GTK_BUTTON (gtk_builder_get_object (priv->gtkbuilder, "button16"))); } @@ -3120,6 +3138,10 @@ gdaex_query_editor_refresh_gui_add_fields (GdaExQueryEditor *qe, { gdaex_query_editor_show_add_iter (qe, &iter); } + if (field->for_order && field->always_ordered) + { + gdaex_query_editor_order_add_iter (qe, &iter); + } } } @@ -3163,6 +3185,46 @@ gdaex_query_editor_refill_always_show (GdaExQueryEditor *qe) } } +static void +gdaex_query_editor_refill_always_order (GdaExQueryEditor *qe) +{ + GdaExQueryEditorPrivate *priv; + + GtkTreeIter iter_table; + GtkTreeIter iter; + + gchar *table_name; + gchar *field_name; + + GdaExQueryEditorTable *table; + GdaExQueryEditorField *field; + + priv = GDAEX_QUERY_EDITOR_GET_PRIVATE (qe); + + if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->tstore_fields), &iter_table)) + { + do + { + if (gtk_tree_model_iter_children (GTK_TREE_MODEL (priv->tstore_fields), &iter, &iter_table)) + { + do + { + gtk_tree_model_get (GTK_TREE_MODEL (priv->tstore_fields), &iter, + COL_FIELDS_TABLE_NAME, &table_name, + COL_FIELDS_NAME, &field_name, + -1); + table = g_hash_table_lookup (priv->tables, table_name); + field = g_hash_table_lookup (table->fields, field_name); + if (field->always_ordered) + { + gdaex_query_editor_order_add_iter (qe, &iter); + } + } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->tstore_fields), &iter)); + } + } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->tstore_fields), &iter_table)); + } +} + static void gdaex_query_editor_store_remove_iter (GdaExQueryEditor *qe, GtkTreeSelection *sel, @@ -3932,6 +3994,47 @@ gdaex_query_editor_show_add_iter (GdaExQueryEditor *qe, GtkTreeIter *iter) g_free (field_name); } +static void +gdaex_query_editor_order_add_iter (GdaExQueryEditor *qe, GtkTreeIter *iter) +{ + GdaExQueryEditorPrivate *priv; + + gchar *table_name; + gchar *field_name; + GdaExQueryEditorTable *table; + GdaExQueryEditorField *field; + + GtkWidget *wpage; + + priv = GDAEX_QUERY_EDITOR_GET_PRIVATE (qe); + + gtk_tree_model_get (GTK_TREE_MODEL (priv->tstore_fields), iter, + COL_FIELDS_TABLE_NAME, &table_name, + COL_FIELDS_NAME, &field_name, + -1); + + table = g_hash_table_lookup (priv->tables, table_name); + field = g_hash_table_lookup (table->fields, field_name); + + gtk_list_store_append (priv->lstore_order, iter); + gtk_list_store_set (priv->lstore_order, iter, + COL_ORDER_TABLE_NAME, field->table_name, + COL_ORDER_NAME, field_name, + COL_ORDER_VISIBLE_NAME, g_strconcat (table->name_visible, " - ", field->name_visible, NULL), + COL_ORDER_ORDER, field->order_default == GDAEX_QE_ORDER_ASC ? "ASC" : "DESC", + COL_ORDER_ORDER_VISIBLE, field->order_default == GDAEX_QE_ORDER_ASC ? _("Ascending") : _("Descending"), + -1); + + wpage = gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook), GDAEX_QE_PAGE_ORDER); + if (gtk_widget_get_visible (wpage)) + { + gtk_tree_selection_select_iter (priv->sel_order, iter); + } + + g_free (table_name); + g_free (field_name); +} + static void gdaex_query_editor_on_btn_show_add_clicked (GtkButton *button, gpointer user_data) @@ -4714,48 +4817,16 @@ gdaex_query_editor_on_btn_order_add_clicked (GtkButton *button, GdaExQueryEditorPrivate *priv; GtkTreeIter iter; - GtkWidget *dialog; - gchar *table_name; - gchar *field_name; - - GdaExQueryEditorTable *table; - GdaExQueryEditorField *field; - - GtkWidget *wpage; + GtkWidget *dialog; qe = (GdaExQueryEditor *)user_data; priv = GDAEX_QUERY_EDITOR_GET_PRIVATE (qe); if (gtk_tree_selection_get_selected (priv->sel_fields, NULL, &iter)) { - gtk_tree_model_get (GTK_TREE_MODEL (priv->tstore_fields), &iter, - COL_FIELDS_TABLE_NAME, &table_name, - COL_FIELDS_NAME, &field_name, - -1); - - table = g_hash_table_lookup (priv->tables, table_name); - field = g_hash_table_lookup (table->fields, field_name); - - gtk_list_store_append (priv->lstore_order, &iter); - gtk_list_store_set (priv->lstore_order, &iter, - COL_ORDER_TABLE_NAME, field->table_name, - COL_ORDER_NAME, field_name, - COL_ORDER_VISIBLE_NAME, g_strconcat (table->name_visible, " - ", field->name_visible, NULL), - COL_ORDER_ORDER, "ASC", - COL_ORDER_ORDER_VISIBLE, _("Ascending"), - -1); - - wpage = gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook), GDAEX_QE_PAGE_ORDER); - if (gtk_widget_get_visible (wpage)) - { - gtk_tree_selection_select_iter (priv->sel_order, &iter); - } - + gdaex_query_editor_order_add_iter (qe, &iter); gdaex_query_editor_on_sel_fields_changed (NULL, user_data); - - g_free (table_name); - g_free (field_name); } else { @@ -4815,6 +4886,7 @@ gdaex_query_editor_on_btn_order_clean_clicked (GtkButton *button, GdaExQueryEditorPrivate *priv = GDAEX_QUERY_EDITOR_GET_PRIVATE (qe); gtk_list_store_clear (priv->lstore_order); + gdaex_query_editor_refill_always_order (qe); gtk_button_clicked (GTK_BUTTON (gtk_builder_get_object (priv->gtkbuilder, "button16"))); } @@ -4857,6 +4929,8 @@ gdaex_query_editor_on_sel_order_changed (GtkTreeSelection *treeselection, table = g_hash_table_lookup (priv->tables, table_name); field = g_hash_table_lookup (table->fields, field_name); + gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv->gtkbuilder, "button12")), !field->always_ordered); + if (!GTK_IS_BOX (priv->hbox_order)) { priv->hbox_order = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); diff --git a/src/queryeditor.h b/src/queryeditor.h index b5f3dd2..cdefb8f 100644 --- a/src/queryeditor.h +++ b/src/queryeditor.h @@ -102,6 +102,12 @@ typedef enum GDAEX_QE_JOIN_TYPE_LEFT } GdaExQueryEditorJoinType; +typedef enum + { + GDAEX_QE_ORDER_ASC, + GDAEX_QE_ORDER_DESC + } GdaExQueryEditorOrderType; + #define GDAEX_QE_WHERE_TYPE_STRING GDAEX_QE_WHERE_TYPE_STARTS | GDAEX_QE_WHERE_TYPE_CONTAINS | GDAEX_QE_WHERE_TYPE_ENDS | GDAEX_QE_WHERE_TYPE_ISTARTS | GDAEX_QE_WHERE_TYPE_ICONTAINS | GDAEX_QE_WHERE_TYPE_IENDS #define GDAEX_QE_WHERE_TYPE_NUMBER GDAEX_QE_WHERE_TYPE_EQUAL | GDAEX_QE_WHERE_TYPE_GREAT | GDAEX_QE_WHERE_TYPE_GREAT_EQUAL | GDAEX_QE_WHERE_TYPE_LESS | GDAEX_QE_WHERE_TYPE_LESS_EQUAL | GDAEX_QE_WHERE_TYPE_BETWEEN @@ -122,6 +128,8 @@ typedef struct gboolean for_where; guint available_where_type; gboolean for_order; + gboolean always_ordered; + GdaExQueryEditorOrderType order_default; GdaExQueryEditorIWidget *iwidget_from; GdaExQueryEditorIWidget *iwidget_to; diff --git a/tests/query_editor.xml b/tests/query_editor.xml index 3404fdc..5096f61 100644 --- a/tests/query_editor.xml +++ b/tests/query_editor.xml @@ -32,6 +32,8 @@ The client's surname text string|is_null + true + DESC age @@ -74,6 +76,7 @@ If married boolean equal + DESC -- 2.49.0 From adc7a293e5ce96fb7268184ff9771b1fad89180d Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sat, 5 Mar 2016 11:02:06 +0100 Subject: [PATCH 08/16] QueryEditor test: removed deprecations. --- tests/query_editor.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/query_editor.c b/tests/query_editor.c index 4329264..c69fda7 100644 --- a/tests/query_editor.c +++ b/tests/query_editor.c @@ -224,8 +224,8 @@ on_btn_save_xml_clicked (GtkButton *button, dialog = gtk_file_chooser_dialog_new ("Save xml to...", GTK_WINDOW (w), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + "gtk-cancel", GTK_RESPONSE_CANCEL, + "gtk-save", GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { @@ -248,8 +248,8 @@ on_btn_load_xml_clicked (GtkButton *button, dialog = gtk_file_chooser_dialog_new ("Load xml from...", GTK_WINDOW (w), GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + "gtk-cancel", GTK_RESPONSE_CANCEL, + "gtk-open", GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { @@ -418,7 +418,7 @@ main (int argc, char *argv[]) g_signal_connect (G_OBJECT (btn_destroy), "clicked", G_CALLBACK (on_btn_destroy_clicked), NULL); - btn_clean = gtk_button_new_from_stock ("gtk-clear"); + btn_clean = gtk_button_new_with_mnemonic ("_Clear"); gtk_box_pack_start (GTK_BOX (hbtnbox), btn_clean, TRUE, TRUE, 5); g_signal_connect (G_OBJECT (btn_clean), "clicked", G_CALLBACK (on_btn_clean_clicked), NULL); @@ -428,17 +428,17 @@ main (int argc, char *argv[]) g_signal_connect (G_OBJECT (btn_get_sql), "clicked", G_CALLBACK (on_btn_get_sql_clicked), NULL); - btn_save_xml = gtk_button_new_from_stock ("gtk-save"); + btn_save_xml = gtk_button_new_with_mnemonic ("_Save"); gtk_box_pack_start (GTK_BOX (hbtnbox), btn_save_xml, TRUE, TRUE, 5); g_signal_connect (G_OBJECT (btn_save_xml), "clicked", G_CALLBACK (on_btn_save_xml_clicked), NULL); - btn_load_xml = gtk_button_new_from_stock ("gtk-open"); + btn_load_xml = gtk_button_new_with_mnemonic ("_Open"); gtk_box_pack_start (GTK_BOX (hbtnbox), btn_load_xml, TRUE, TRUE, 5); g_signal_connect (G_OBJECT (btn_load_xml), "clicked", G_CALLBACK (on_btn_load_xml_clicked), NULL); - btn_ok = gtk_button_new_from_stock ("gtk-close"); + btn_ok = gtk_button_new_with_mnemonic ("_Close"); gtk_box_pack_start (GTK_BOX (hbtnbox), btn_ok, TRUE, TRUE, 5); g_signal_connect (G_OBJECT (btn_ok), "clicked", gtk_main_quit, NULL); -- 2.49.0 From e53ded9a63b99dcf0cddb447bbf4630c56b94b09 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sat, 5 Mar 2016 12:33:06 +0100 Subject: [PATCH 09/16] QueryEditor: added and implemented where_default_not and where_default_type field properties (refs #977 closes #981). --- data/gdaex_query_editor.dtd | 4 +++- src/queryeditor.c | 29 ++++++++++++++++++++++------- src/queryeditor.h | 2 ++ tests/query_editor.xml | 2 ++ 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/data/gdaex_query_editor.dtd b/data/gdaex_query_editor.dtd index 238b889..b5011e0 100644 --- a/data/gdaex_query_editor.dtd +++ b/data/gdaex_query_editor.dtd @@ -13,7 +13,7 @@ table_name CDATA #REQUIRED > - + @@ -24,6 +24,8 @@ + + diff --git a/src/queryeditor.c b/src/queryeditor.c index 2b92ac3..9d485f3 100644 --- a/src/queryeditor.c +++ b/src/queryeditor.c @@ -1382,6 +1382,14 @@ gdaex_query_editor_load_tables_from_xml (GdaExQueryEditor *qe, { field->available_where_type = gdaex_query_editor_str_to_where_type (xmlNodeGetContent (cur)); } + else if (xmlStrcmp (cur->name, "where_default_not") == 0) + { + field->where_default_not = zak_utils_string_to_boolean (xmlNodeGetContent (cur)); + } + else if (xmlStrcmp (cur->name, "where_default_type") == 0) + { + field->where_default_type = gdaex_query_editor_str_to_where_type (xmlNodeGetContent (cur)); + } else if (xmlStrcmp (cur->name, "for_order") == 0) { field->for_order = zak_utils_string_to_boolean (xmlNodeGetContent (cur)); @@ -3714,6 +3722,7 @@ gdaex_query_editor_on_btn_save_clicked (GtkButton *button, val1 = NULL; val2 = NULL; asc_desc = NULL; + asc_desc_visible = NULL; switch (priv->editor_type) { @@ -3872,8 +3881,10 @@ gdaex_query_editor_on_btn_save_clicked (GtkButton *button, else { where_type = 0; + val1_visible = g_strdup (""); val1 = g_strdup (""); val1_sql = g_strdup (""); + val2_visible = g_strdup (""); val2 = g_strdup (""); val2_sql = g_strdup (""); } @@ -3894,7 +3905,9 @@ gdaex_query_editor_on_btn_save_clicked (GtkButton *button, gtk_tree_selection_unselect_all (priv->sel_where); + g_free (val1_visible); g_free (val1_sql); + g_free (val2_visible); g_free (val2_sql); } break; @@ -4200,7 +4213,7 @@ gdaex_query_editor_on_sel_show_changed (GtkTreeSelection *treeselection, static void gdaex_query_editor_on_btn_where_add_clicked (GtkButton *button, - gpointer user_data) + gpointer user_data) { GdaExQueryEditor *qe; GdaExQueryEditorPrivate *priv; @@ -4258,6 +4271,9 @@ gdaex_query_editor_on_btn_where_add_clicked (GtkButton *button, COL_WHERE_TABLE_NAME, field->table_name, COL_WHERE_NAME, field_name, COL_WHERE_VISIBLE_NAME, g_strconcat (table->name_visible, " - ", field->name_visible, NULL), + COL_WHERE_CONDITION_NOT, field->where_default_not, + COL_WHERE_CONDITION_TYPE, field->where_default_type, + COL_WHERE_CONDITION_TYPE_VISIBLE, gdaex_query_editor_get_where_type_str_from_type (field->where_default_type), -1); if (with_parent) @@ -4460,7 +4476,6 @@ gdaex_query_editor_on_sel_where_changed (GtkTreeSelection *treeselection, if (GTK_IS_BOX (priv->hbox_where)) { gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->cb_link_type), NULL); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->chk_not), not); gtk_container_remove (GTK_CONTAINER (priv->tbl), GTK_WIDGET (priv->txt_from)); gtk_container_remove (GTK_CONTAINER (priv->tbl), GTK_WIDGET (priv->txt_to)); } @@ -4541,6 +4556,8 @@ gdaex_query_editor_on_sel_where_changed (GtkTreeSelection *treeselection, gtk_grid_attach (GTK_GRID (priv->tbl), priv->lbl_to, 5, 1, 1, 1); } + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->chk_not), not); + if (is_group) { gtk_label_set_label (GTK_LABEL (gtk_frame_get_label_widget (GTK_FRAME (priv->frame_where))), ""); @@ -4632,9 +4649,9 @@ gdaex_query_editor_on_sel_where_changed (GtkTreeSelection *treeselection, { gtk_list_store_append (priv->lstore_where_type, &iter_cb); gtk_list_store_set (priv->lstore_where_type, &iter_cb, - 0, GDAEX_QE_WHERE_TYPE_ICONTAINS, - 1, gdaex_query_editor_get_where_type_str_from_type (GDAEX_QE_WHERE_TYPE_ICONTAINS), - -1); + 0, GDAEX_QE_WHERE_TYPE_ICONTAINS, + 1, gdaex_query_editor_get_where_type_str_from_type (GDAEX_QE_WHERE_TYPE_ICONTAINS), + -1); } if (field->available_where_type & GDAEX_QE_WHERE_TYPE_IENDS) { @@ -4771,8 +4788,6 @@ gdaex_query_editor_on_sel_where_changed (GtkTreeSelection *treeselection, gtk_widget_set_visible (gtk_frame_get_label_widget (GTK_FRAME (priv->frame_where)), TRUE); gtk_widget_set_visible (priv->lbl_where_type, TRUE); gtk_widget_set_visible (priv->cb_where_type, TRUE); - gtk_widget_set_visible (priv->lbl_from, TRUE); - gtk_widget_set_visible (priv->txt_from, TRUE); } else { diff --git a/src/queryeditor.h b/src/queryeditor.h index cdefb8f..d92890f 100644 --- a/src/queryeditor.h +++ b/src/queryeditor.h @@ -127,6 +127,8 @@ typedef struct gboolean always_showed; gboolean for_where; guint available_where_type; + gboolean where_default_not; + GdaExQueryEditorWhereType where_default_type; gboolean for_order; gboolean always_ordered; GdaExQueryEditorOrderType order_default; diff --git a/tests/query_editor.xml b/tests/query_editor.xml index 5096f61..bced065 100644 --- a/tests/query_editor.xml +++ b/tests/query_editor.xml @@ -32,6 +32,8 @@ The client's surname text string|is_null + t + is_null true DESC -- 2.49.0 From 7684674243732511ef00ba31766f0b4a2d5688c5 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sat, 5 Mar 2016 14:17:22 +0100 Subject: [PATCH 10/16] QueryEditor: added and implemented where_default_* field properties (closes #977). --- data/gdaex_query_editor.dtd | 8 ++++- src/queryeditor.c | 65 +++++++++++++++++++++++++++++++++++-- src/queryeditor.h | 6 ++++ tests/query_editor.xml | 14 ++++++-- 4 files changed, 87 insertions(+), 6 deletions(-) diff --git a/data/gdaex_query_editor.dtd b/data/gdaex_query_editor.dtd index b5011e0..7097eb8 100644 --- a/data/gdaex_query_editor.dtd +++ b/data/gdaex_query_editor.dtd @@ -13,7 +13,7 @@ table_name CDATA #REQUIRED > - + @@ -26,10 +26,16 @@ + + + + + + diff --git a/src/queryeditor.c b/src/queryeditor.c index 9d485f3..d08fac3 100644 --- a/src/queryeditor.c +++ b/src/queryeditor.c @@ -283,9 +283,9 @@ enum COL_WHERE_CONDITION_NOT, COL_WHERE_CONDITION_TYPE, COL_WHERE_CONDITION_TYPE_VISIBLE, - COL_WHERE_CONDITION_FROM, /* column with exchange value from GtkTreeStore and GFtkWidget */ - COL_WHERE_CONDITION_FROM_VISIBLE, /* column with the visible eventually formatted value */ - COL_WHERE_CONDITION_FROM_SQL, /* columne with the value formatted useful for sql */ + COL_WHERE_CONDITION_FROM, /* column with exchange value from GtkTreeStore and GtkWidget */ + COL_WHERE_CONDITION_FROM_VISIBLE, /* column with the visible, eventually formatted, value */ + COL_WHERE_CONDITION_FROM_SQL, /* column with the value formatted useful for sql */ COL_WHERE_CONDITION_TO, COL_WHERE_CONDITION_TO_VISIBLE, COL_WHERE_CONDITION_TO_SQL @@ -1335,6 +1335,13 @@ gdaex_query_editor_load_tables_from_xml (GdaExQueryEditor *qe, field->for_where = TRUE; field->for_order = TRUE; + field->where_default_from = g_strdup (""); + field->where_default_from_visible = g_strdup (""); + field->where_default_from_sql = g_strdup (""); + field->where_default_to = g_strdup (""); + field->where_default_to_visible = g_strdup (""); + field->where_default_to_sql = g_strdup (""); + cur = xfield->children; while (cur != NULL) { @@ -1390,6 +1397,52 @@ gdaex_query_editor_load_tables_from_xml (GdaExQueryEditor *qe, { field->where_default_type = gdaex_query_editor_str_to_where_type (xmlNodeGetContent (cur)); } + else if (xmlStrcmp (cur->name, "where_default_from") == 0) + { + xmlNode *wfrom; + + wfrom = cur->children; + while (wfrom != NULL) + { + if (xmlStrcmp (wfrom->name, "w_value") == 0) + { + field->where_default_from = xmlNodeGetContent (wfrom); + } + else if (xmlStrcmp (wfrom->name, "w_visible") == 0) + { + field->where_default_from_visible = xmlNodeGetContent (wfrom); + } + else if (xmlStrcmp (wfrom->name, "w_sql") == 0) + { + field->where_default_from_sql = xmlNodeGetContent (wfrom); + } + + wfrom = wfrom->next; + } + } + else if (xmlStrcmp (cur->name, "where_default_to") == 0) + { + xmlNode *wto; + + wto = cur->children; + while (wto != NULL) + { + if (xmlStrcmp (wto->name, "w_value") == 0) + { + field->where_default_to = xmlNodeGetContent (wto); + } + else if (xmlStrcmp (wto->name, "w_visible") == 0) + { + field->where_default_to_visible = xmlNodeGetContent (wto); + } + else if (xmlStrcmp (wto->name, "w_sql") == 0) + { + field->where_default_to_sql = xmlNodeGetContent (wto); + } + + wto = wto->next; + } + } else if (xmlStrcmp (cur->name, "for_order") == 0) { field->for_order = zak_utils_string_to_boolean (xmlNodeGetContent (cur)); @@ -4274,6 +4327,12 @@ gdaex_query_editor_on_btn_where_add_clicked (GtkButton *button, COL_WHERE_CONDITION_NOT, field->where_default_not, COL_WHERE_CONDITION_TYPE, field->where_default_type, COL_WHERE_CONDITION_TYPE_VISIBLE, gdaex_query_editor_get_where_type_str_from_type (field->where_default_type), + COL_WHERE_CONDITION_FROM, field->where_default_from, + COL_WHERE_CONDITION_FROM_VISIBLE, field->where_default_from_visible, + COL_WHERE_CONDITION_FROM_SQL, field->where_default_from_sql, + COL_WHERE_CONDITION_TO, field->where_default_to, + COL_WHERE_CONDITION_TO_VISIBLE, field->where_default_to_visible, + COL_WHERE_CONDITION_TO_SQL, field->where_default_to_sql, -1); if (with_parent) diff --git a/src/queryeditor.h b/src/queryeditor.h index d92890f..8da5013 100644 --- a/src/queryeditor.h +++ b/src/queryeditor.h @@ -129,6 +129,12 @@ typedef struct guint available_where_type; gboolean where_default_not; GdaExQueryEditorWhereType where_default_type; + gchar *where_default_from; + gchar *where_default_from_visible; + gchar *where_default_from_sql; + gchar *where_default_to; + gchar *where_default_to_visible; + gchar *where_default_to_sql; gboolean for_order; gboolean always_ordered; GdaExQueryEditorOrderType order_default; diff --git a/tests/query_editor.xml b/tests/query_editor.xml index bced065..4b0c1a0 100644 --- a/tests/query_editor.xml +++ b/tests/query_editor.xml @@ -31,9 +31,19 @@ Surname The client's surname text - string|is_null + string|is_null|between t - is_null + between + + jon + jon + 'jon' + + + jane + jane + 'jane' + true DESC -- 2.49.0 From b2210aab948caf9a8d45486a14a53d86c5415406 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Tue, 22 Mar 2016 21:29:27 +0100 Subject: [PATCH 11/16] Added funcions GdaExSqlBuilder::get_sql_* (closes #1001). --- src/sqlbuilder.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++ src/sqlbuilder.h | 8 ++- 2 files changed, 167 insertions(+), 2 deletions(-) diff --git a/src/sqlbuilder.c b/src/sqlbuilder.c index 939ca36..feaf3d6 100644 --- a/src/sqlbuilder.c +++ b/src/sqlbuilder.c @@ -674,6 +674,167 @@ gchar return ret; } +/** + * gdaex_sql_builder_get_sql_select: + * @sqlb: + * @cnc: + * @params: + * + */ +gchar +*gdaex_sql_builder_get_sql_select (GdaExSqlBuilder *sqlb, GdaConnection *cnc, GdaSet *params) +{ + gchar *ret; + gchar *sql; + + gchar *start; + gchar *end; + + ret = NULL; + + sql = gdaex_sql_builder_get_sql (sqlb, cnc, params); + if (sql == NULL) + { + return ret; + } + + start = g_strstr_len (sql, -1, "SELECT"); + if (start == NULL) + { + return ret; + } + + end = g_strstr_len (sql, -1, "FROM"); + if (end == NULL) + { + return ret; + } + + ret = g_strndup (start + 7, strlen (sql) - 8 - strlen (end)); + + g_free (sql); + + return ret; +} + +/** + * gdaex_sql_builder_get_sql_from: + * @sqlb: + * @cnc: + * @params: + * + */ +gchar +*gdaex_sql_builder_get_sql_from (GdaExSqlBuilder *sqlb, GdaConnection *cnc, GdaSet *params) +{ + gchar *ret; + gchar *sql; + + gchar *start; + gchar *end; + + ret = NULL; + + sql = gdaex_sql_builder_get_sql (sqlb, cnc, params); + if (sql == NULL) + { + return ret; + } + + start = g_strstr_len (sql, -1, "FROM"); + if (start == NULL) + { + return ret; + } + + end = g_strstr_len (sql, -1, "WHERE"); + if (end == NULL) + { + end = g_strstr_len (sql, -1, "ORDER BY"); + } + + ret = g_strndup (start + 5, strlen (start) - (end != NULL ? 6 : 5) - (end != NULL ? strlen (end) : 0)); + + g_free (sql); + + return ret; +} + +/** + * gdaex_sql_builder_get_sql_where: + * @sqlb: + * @cnc: + * @params: + * + */ +gchar +*gdaex_sql_builder_get_sql_where (GdaExSqlBuilder *sqlb, GdaConnection *cnc, GdaSet *params) +{ + gchar *ret; + gchar *sql; + + gchar *start; + gchar *end; + + ret = NULL; + + sql = gdaex_sql_builder_get_sql (sqlb, cnc, params); + if (sql == NULL) + { + return ret; + } + + start = g_strstr_len (sql, -1, "WHERE"); + if (start == NULL) + { + return ret; + } + + end = g_strstr_len (sql, -1, "ORDER BY"); + + ret = g_strndup (start + 6, strlen (start) - (end != NULL ? 7 : 6) - (end != NULL ? strlen (end) : 0)); + + g_free (sql); + + return ret; +} + +/** + * gdaex_sql_builder_get_sql_order: + * @sqlb: + * @cnc: + * @params: + * + */ +gchar +*gdaex_sql_builder_get_sql_order (GdaExSqlBuilder *sqlb, GdaConnection *cnc, GdaSet *params) +{ + gchar *ret; + gchar *sql; + + gchar *start; + + ret = NULL; + + sql = gdaex_sql_builder_get_sql (sqlb, cnc, params); + if (sql == NULL) + { + return ret; + } + + start = g_strstr_len (sql, -1, "ORDER BY"); + if (start == NULL) + { + return ret; + } + + ret = g_strndup (start + 9, strlen (start) - 9); + + g_free (sql); + + return ret; +} + /** * gdaex_sql_builder_query: * @sqlb: diff --git a/src/sqlbuilder.h b/src/sqlbuilder.h index fb69f33..af3343c 100644 --- a/src/sqlbuilder.h +++ b/src/sqlbuilder.h @@ -1,7 +1,7 @@ /* * sqlbuilder.h * - * Copyright (C) 2015 Andrea Zagli + * Copyright (C) 2015-2016 Andrea Zagli * * This file is part of libgdaex. * @@ -68,13 +68,17 @@ void gdaex_sql_builder_join (GdaExSqlBuilder *sqlb, void gdaex_sql_builder_field (GdaExSqlBuilder *sqlb, const gchar *table_name, const gchar *field_name, const gchar *field_alias, GValue *gval); void gdaex_sql_builder_fields (GdaExSqlBuilder *sqlb, ...); -GdaSqlBuilderId gdaex_sql_builder_where (GdaExSqlBuilder *sqln, GdaSqlOperatorType op, +GdaSqlBuilderId gdaex_sql_builder_where (GdaExSqlBuilder *sqlb, GdaSqlOperatorType op, ...); void gdaex_sql_builder_order (GdaExSqlBuilder *sqlb, ...); GdaSqlBuilder *gdaex_sql_builder_get_gda_sql_builder (GdaExSqlBuilder *sqlb); gchar *gdaex_sql_builder_get_sql (GdaExSqlBuilder *sqlb, GdaConnection *cnc, GdaSet *params); +gchar *gdaex_sql_builder_get_sql_select (GdaExSqlBuilder *sqlb, GdaConnection *cnc, GdaSet *params); +gchar *gdaex_sql_builder_get_sql_from (GdaExSqlBuilder *sqlb, GdaConnection *cnc, GdaSet *params); +gchar *gdaex_sql_builder_get_sql_where (GdaExSqlBuilder *sqlb, GdaConnection *cnc, GdaSet *params); +gchar *gdaex_sql_builder_get_sql_order (GdaExSqlBuilder *sqlb, GdaConnection *cnc, GdaSet *params); GdaDataModel *gdaex_sql_builder_query (GdaExSqlBuilder *sqlb, GdaEx *gdaex, GdaSet *params); gint gdaex_sql_builder_execute (GdaExSqlBuilder *sqlb, GdaEx *gdaex, GdaSet *params); -- 2.49.0 From 5f6b47abced0d1dcc556e2fa318a2fd522c55e38 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Mon, 10 Oct 2016 16:03:58 +0200 Subject: [PATCH 12/16] Added functions GdaEx::fill_treemodel_*. Deprecated functions GdaEx::fill_liststore_*. --- src/gdaex.c | 111 +++++++++++++++++++++++++++++++++++++++++++------- src/gdaex.h | 35 +++++++++++++++- tests/grid.db | Bin 0 -> 2048 bytes 3 files changed, 130 insertions(+), 16 deletions(-) create mode 100644 tests/grid.db diff --git a/src/gdaex.c b/src/gdaex.c index a4f9746..ae68ed6 100644 --- a/src/gdaex.c +++ b/src/gdaex.c @@ -1,7 +1,7 @@ /* * gdaex.c * - * Copyright (C) 2005-2015 Andrea Zagli + * Copyright (C) 2005-2016 Andrea Zagli * * This file is part of libgdaex. * @@ -2934,12 +2934,12 @@ GtkBuilder } void -gdaex_fill_liststore_from_sql_with_missing_func (GdaEx *gdaex, - GtkListStore *lstore, +gdaex_fill_treemodel_from_sql_with_missing_func (GdaEx *gdaex, + GtkTreeModel *store, const gchar *sql, guint *cols_formatted, gchar *(*cols_format_func) (GdaDataModelIter *, guint), - GdaExFillListStoreMissingFunc missing_func, gpointer user_data) + GdaExFillTreeModelMissingFunc missing_func, gpointer user_data) { GdaDataModel *dm; @@ -2954,17 +2954,17 @@ gdaex_fill_liststore_from_sql_with_missing_func (GdaEx *gdaex, dm = gdaex_query (gdaex, _sql); g_free (_sql); - gdaex_fill_liststore_from_datamodel_with_missing_func (gdaex, lstore, dm, cols_formatted, cols_format_func, missing_func, user_data); + gdaex_fill_treemodel_from_datamodel_with_missing_func (gdaex, store, dm, cols_formatted, cols_format_func, missing_func, user_data); g_object_unref (dm); } void -gdaex_fill_liststore_from_datamodel_with_missing_func (GdaEx *gdaex, - GtkListStore *lstore, +gdaex_fill_treemodel_from_datamodel_with_missing_func (GdaEx *gdaex, + GtkTreeModel *store, GdaDataModel *dm, guint *cols_formatted, gchar *(*cols_format_func) (GdaDataModelIter *, guint), - GdaExFillListStoreMissingFunc missing_func, gpointer user_data) + GdaExFillTreeModelMissingFunc missing_func, gpointer user_data) { GtkTreeIter iter; @@ -2988,12 +2988,19 @@ gdaex_fill_liststore_from_datamodel_with_missing_func (GdaEx *gdaex, GDateTime *gdatetime; g_return_if_fail (IS_GDAEX (gdaex)); - g_return_if_fail (GTK_IS_LIST_STORE (lstore)); + g_return_if_fail (GTK_IS_TREE_MODEL (store)); g_return_if_fail (GDA_IS_DATA_MODEL (dm)); - gtk_list_store_clear (lstore); + if (GTK_IS_LIST_STORE (store)) + { + gtk_list_store_clear (GTK_LIST_STORE (store)); + } + else /* GTK_IS_TREE_STORE */ + { + gtk_tree_store_clear (GTK_TREE_STORE (store)); + } - cols = gtk_tree_model_get_n_columns (GTK_TREE_MODEL (lstore)); + cols = gtk_tree_model_get_n_columns (store); if (cols == 0) { return; @@ -3016,7 +3023,7 @@ gdaex_fill_liststore_from_datamodel_with_missing_func (GdaEx *gdaex, /* caching of columns types */ for (col = 0; col < cols; col++) { - col_gtypes[col] = gtk_tree_model_get_column_type (GTK_TREE_MODEL (lstore), col); + col_gtypes[col] = gtk_tree_model_get_column_type (store, col); gdacolumn = gda_data_model_describe_column (dm, col); if (gdacolumn == NULL) @@ -3034,7 +3041,14 @@ gdaex_fill_liststore_from_datamodel_with_missing_func (GdaEx *gdaex, while (gda_data_model_iter_move_next (gda_iter)) { - gtk_list_store_append (lstore, &iter); + if (GTK_IS_LIST_STORE (store)) + { + gtk_list_store_append (GTK_LIST_STORE (store), &iter); + } + else /* GTK_IS_TREE_STORE */ + { + gtk_tree_store_append (GTK_TREE_STORE (store), &iter, NULL); + } for (col = 0; col < cols; col++) { @@ -3150,15 +3164,81 @@ gdaex_fill_liststore_from_datamodel_with_missing_func (GdaEx *gdaex, } } - gtk_list_store_set_valuesv (lstore, &iter, columns, values, cols); + if (GTK_IS_LIST_STORE (store)) + { + gtk_list_store_set_valuesv (GTK_LIST_STORE (store), &iter, columns, values, cols); + } + else /* GTK_IS_TREE_STORE */ + { + gtk_tree_store_set_valuesv (GTK_TREE_STORE (store), &iter, columns, values, cols); + } if (call_missing_func && missing_func != NULL) { - missing_func (lstore, &iter, user_data); + missing_func (store, &iter, user_data); } } } +void +gdaex_fill_treemodel_from_sql (GdaEx *gdaex, + GtkTreeModel *store, + const gchar *sql, + guint *cols_formatted, + gchar *(*cols_format_func) (GdaDataModelIter *, guint)) +{ + gdaex_fill_treemodel_from_sql_with_missing_func (gdaex, store, sql, cols_formatted, cols_format_func, NULL, NULL); +} + +void +gdaex_fill_treemodel_from_datamodel (GdaEx *gdaex, + GtkTreeModel *store, + GdaDataModel *dm, + guint *cols_formatted, + gchar *(*cols_format_func) (GdaDataModelIter *, guint)) +{ + gdaex_fill_treemodel_from_datamodel_with_missing_func (gdaex, store, dm, cols_formatted, cols_format_func, NULL, NULL); +} + +G_DEPRECATED_FOR (gdaex_fill_treemodel_from_sql_with_missing_func) +void +gdaex_fill_liststore_from_sql_with_missing_func (GdaEx *gdaex, + GtkListStore *lstore, + const gchar *sql, + guint *cols_formatted, + gchar *(*cols_format_func) (GdaDataModelIter *, guint), + GdaExFillListStoreMissingFunc missing_func, gpointer user_data) +{ + GdaDataModel *dm; + + gchar *_sql; + + g_return_if_fail (IS_GDAEX (gdaex)); + g_return_if_fail (sql != NULL); + + _sql = g_strstrip (g_strdup (sql)); + + g_return_if_fail (g_strcmp0 (_sql, "") != 0); + + dm = gdaex_query (gdaex, _sql); + g_free (_sql); + gdaex_fill_liststore_from_datamodel_with_missing_func (gdaex, lstore, dm, cols_formatted, cols_format_func, missing_func, user_data); + g_object_unref (dm); +} + +G_DEPRECATED_FOR (gdaex_fill_treemodel_from_datamodel_with_missing_func) +void +gdaex_fill_liststore_from_datamodel_with_missing_func (GdaEx *gdaex, + GtkListStore *lstore, + GdaDataModel *dm, + guint *cols_formatted, + gchar *(*cols_format_func) (GdaDataModelIter *, guint), + GdaExFillListStoreMissingFunc missing_func, gpointer user_data) +{ + gdaex_fill_treemodel_from_datamodel_with_missing_func (gdaex, GTK_TREE_MODEL (lstore), dm, cols_formatted, cols_format_func, missing_func, user_data); +} + +G_DEPRECATED_FOR (gdaex_fill_treemodel_from_sql) void gdaex_fill_liststore_from_sql (GdaEx *gdaex, GtkListStore *lstore, @@ -3169,6 +3249,7 @@ gdaex_fill_liststore_from_sql (GdaEx *gdaex, gdaex_fill_liststore_from_sql_with_missing_func (gdaex, lstore, sql, cols_formatted, cols_format_func, NULL, NULL); } +G_DEPRECATED_FOR (gdaex_fill_treemodel_from_datamodel) void gdaex_fill_liststore_from_datamodel (GdaEx *gdaex, GtkListStore *lstore, diff --git a/src/gdaex.h b/src/gdaex.h index 9808349..4ee5bbe 100644 --- a/src/gdaex.h +++ b/src/gdaex.h @@ -1,7 +1,7 @@ /* * gdaex.h * - * Copyright (C) 2005-2015 Andrea Zagli + * Copyright (C) 2005-2016 Andrea Zagli * * This file is part of libgdaex. * @@ -214,25 +214,58 @@ const gchar *gdaex_get_guifile (GdaEx *gdaex); GtkBuilder *gdaex_get_gtkbuilder (GdaEx *gdaex); +typedef void (*GdaExFillTreeModelMissingFunc) (GtkTreeModel *store, GtkTreeIter *iter, gpointer user_data); + +void gdaex_fill_treemodel_from_sql_with_missing_func (GdaEx *gdaex, + GtkTreeModel *store, + const gchar *sql, + guint *cols_formatted, + gchar *(*cols_format_func) (GdaDataModelIter *, guint), + GdaExFillTreeModelMissingFunc missing_func, gpointer user_data); +void gdaex_fill_treemodel_from_datamodel_with_missing_func (GdaEx *gdaex, + GtkTreeModel *store, + GdaDataModel *dm, + guint *cols_formatted, + gchar *(*cols_format_func) (GdaDataModelIter *, guint), + GdaExFillTreeModelMissingFunc missing_func, gpointer user_data); +void gdaex_fill_treemodel_from_sql (GdaEx *gdaex, + GtkTreeModel *store, + const gchar *sql, + guint *cols_formatted, + gchar *(*cols_format_func) (GdaDataModelIter *, guint)); +void gdaex_fill_treemodel_from_datamodel (GdaEx *gdaex, + GtkTreeModel *store, + GdaDataModel *dm, + guint *cols_formatted, + gchar *(*cols_format_func) (GdaDataModelIter *, guint)); + +G_DEPRECATED_FOR (GdaExFillTreeModelMissingFunc) typedef void (*GdaExFillListStoreMissingFunc) (GtkListStore *lstore, GtkTreeIter *iter, gpointer user_data); +G_DEPRECATED_FOR (gdaex_fill_treemodel_from_sql_with_missing_func) void gdaex_fill_liststore_from_sql_with_missing_func (GdaEx *gdaex, GtkListStore *lstore, const gchar *sql, guint *cols_formatted, gchar *(*cols_format_func) (GdaDataModelIter *, guint), GdaExFillListStoreMissingFunc missing_func, gpointer user_data); + +G_DEPRECATED_FOR (gdaex_fill_treemodel_from_datamodel_with_missing_func) void gdaex_fill_liststore_from_datamodel_with_missing_func (GdaEx *gdaex, GtkListStore *lstore, GdaDataModel *dm, guint *cols_formatted, gchar *(*cols_format_func) (GdaDataModelIter *, guint), GdaExFillListStoreMissingFunc missing_func, gpointer user_data); + +G_DEPRECATED_FOR (gdaex_fill_treemodel_from_sql) void gdaex_fill_liststore_from_sql (GdaEx *gdaex, GtkListStore *lstore, const gchar *sql, guint *cols_formatted, gchar *(*cols_format_func) (GdaDataModelIter *, guint)); + +G_DEPRECATED_FOR (gdaex_fill_treemodel_from_datamodel) void gdaex_fill_liststore_from_datamodel (GdaEx *gdaex, GtkListStore *lstore, GdaDataModel *dm, diff --git a/tests/grid.db b/tests/grid.db new file mode 100644 index 0000000000000000000000000000000000000000..abc326726d73d1644a721264e69033ea3d3952b4 GIT binary patch literal 2048 zcmeHIzfS@&6mIDyFenQlM3Lkf7$CVzt`I@CL&L_RGCA4f%29H64dpN~PP%E_jQ@x~ z{tNsE93A~DED@rEx;T1Y`tn}Cer;a9ql+}^au>#S> z*F9bx{F1ZCdfi;t0!)sPUI`Kh{)qz@Wt=V)i}GdJLaK=3G@E>mj%u-oZ(q2Jl- zbzww{-!}Dh`f+Ta;=L5i35oPe|6yG#|H{V25%Jf9L0v7xU(q> zco_1$kEEUKRpFg7tUa9a{jv}op)AnvlODtM Date: Sun, 12 Feb 2017 10:31:39 +0100 Subject: [PATCH 13/16] SqlBuilder: don't add table with empty name. --- src/sqlbuilder.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/sqlbuilder.c b/src/sqlbuilder.c index feaf3d6..e37c840 100644 --- a/src/sqlbuilder.c +++ b/src/sqlbuilder.c @@ -162,14 +162,21 @@ static GdaExSqlBuilderTable if (t == NULL && add) { t = g_new0 (GdaExSqlBuilderTable, 1); - if (priv->stmt_type == GDA_SQL_STATEMENT_SELECT) + if (g_strcmp0 (table_name, "") == 0) { - t->id = gda_sql_builder_select_add_target_id (priv->sqlb, gda_sql_builder_add_id (priv->sqlb, table_name), table_alias); + t->id = 0; } else { - t->id = 0; - gda_sql_builder_set_table (priv->sqlb, table_name); + if (priv->stmt_type == GDA_SQL_STATEMENT_SELECT) + { + t->id = gda_sql_builder_select_add_target_id (priv->sqlb, gda_sql_builder_add_id (priv->sqlb, table_name), table_alias); + } + else + { + t->id = 0; + gda_sql_builder_set_table (priv->sqlb, table_name); + } } t->name = g_strdup (table_name); if (table_alias != NULL) @@ -862,7 +869,6 @@ gint gdaex_sql_builder_execute (GdaExSqlBuilder *sqlb, GdaEx *gdaex, GdaSet *params) { gchar *sql; - GdaDataModel *dm; gint ret; g_return_val_if_fail (IS_GDAEX (gdaex), -1); -- 2.49.0 From 0b79feca32645331e827a53bbc7599ed9d6d88fa Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Mon, 8 May 2017 16:40:20 +0200 Subject: [PATCH 14/16] Added function save_data_in_blob. --- src/gdaex.c | 73 ++++++++++++++++++++++++++++++-------- src/gdaex.h | 100 ++++++++++++++++++++++++++++------------------------ 2 files changed, 112 insertions(+), 61 deletions(-) diff --git a/src/gdaex.c b/src/gdaex.c index ae68ed6..fc6938e 100644 --- a/src/gdaex.c +++ b/src/gdaex.c @@ -3530,20 +3530,13 @@ gchar return ret; } -/** - * gdaex_save_file_in_blob: - * @gdaex: - * @sql: - * @blob_field_name: - * @filename: - * - * Returns: - */ gboolean -gdaex_save_file_in_blob (GdaEx *gdaex, - const gchar *sql, - const gchar *blob_field_name, - const gchar *filename) +_gdaex_save_data_file_in_blob (GdaEx *gdaex, + const gchar *sql, + const gchar *blob_field_name, + const guchar *data, + glong size, + const gchar *filename) { GdaConnection *gda_con; GdaSqlParser *parser; @@ -3578,7 +3571,16 @@ gdaex_save_file_in_blob (GdaEx *gdaex, gda_connection_begin_transaction (gda_con, NULL, 0, NULL); param = gda_set_get_holder (plist, blob_field_name); - value = gda_value_new_blob_from_file (filename); + + if (data != NULL) + { + value = gda_value_new_blob (data, size); + } + else + { + value = gda_value_new_blob_from_file (filename); + } + error = NULL; if (!gda_holder_take_value (param, value, &error)) { @@ -3611,9 +3613,52 @@ gdaex_save_file_in_blob (GdaEx *gdaex, gda_connection_commit_transaction (gda_con, NULL, NULL); } + if (value != NULL) + { + g_value_unset (value); + } + return TRUE; } +/** + * gdaex_save_file_in_blob: + * @gdaex: + * @sql: + * @blob_field_name: + * @data: + * @size: + * + * Returns: + */ +gboolean +gdaex_save_data_in_blob (GdaEx *gdaex, + const gchar *sql, + const gchar *blob_field_name, + const guchar *data, + glong size) +{ + return _gdaex_save_data_file_in_blob (gdaex, sql, blob_field_name, data, size, NULL); +} + +/** + * gdaex_save_file_in_blob: + * @gdaex: + * @sql: + * @blob_field_name: + * @filename: + * + * Returns: + */ +gboolean +gdaex_save_file_in_blob (GdaEx *gdaex, + const gchar *sql, + const gchar *blob_field_name, + const gchar *filename) +{ + return _gdaex_save_data_file_in_blob (gdaex, sql, blob_field_name, NULL, 0, filename); +} + /** * gdaex_get_blob: * @gdaex: diff --git a/src/gdaex.h b/src/gdaex.h index 4ee5bbe..555c9b5 100644 --- a/src/gdaex.h +++ b/src/gdaex.h @@ -1,7 +1,7 @@ /* * gdaex.h * - * Copyright (C) 2005-2016 Andrea Zagli + * Copyright (C) 2005-2017 Andrea Zagli * * This file is part of libgdaex. * @@ -110,81 +110,81 @@ GDateTime *gdaex_data_model_get_field_value_gdatetime_at (GdaDataModel *data_mod gint row, const gchar *field_name); struct tm *gdaex_data_model_get_field_value_tm_at (GdaDataModel *data_model, - gint row, - const gchar *field_name); + gint row, + const gchar *field_name); gchar *gdaex_data_model_get_value_stringify_at (GdaDataModel *data_model, - gint row, - gint col); + gint row, + gint col); gchar *gdaex_data_model_get_value_stringify_escaped_at (GdaDataModel *data_model, - gint row, - gint col); + gint row, + gint col); gint gdaex_data_model_get_value_integer_at (GdaDataModel *data_model, - gint row, - gint col); + gint row, + gint col); gfloat gdaex_data_model_get_value_float_at (GdaDataModel *data_model, - gint row, - gint col); + gint row, + gint col); gdouble gdaex_data_model_get_value_double_at (GdaDataModel *data_model, - gint row, - gint col); + gint row, + gint col); gboolean gdaex_data_model_get_value_boolean_at (GdaDataModel *data_model, - gint row, - gint col); + gint row, + gint col); GdaTimestamp *gdaex_data_model_get_value_gdatimestamp_at (GdaDataModel *data_model, gint row, gint col); GDate *gdaex_data_model_get_value_gdate_at (GdaDataModel *data_model, - gint row, - gint col); + gint row, + gint col); GDateTime *gdaex_data_model_get_value_gdatetime_at (GdaDataModel *data_model, - gint row, - gint col); + gint row, + gint col); struct tm *gdaex_data_model_get_value_tm_at (GdaDataModel *data_model, - gint row, - gint col); + gint row, + gint col); gchar *gdaex_data_model_iter_get_field_value_stringify_at (GdaDataModelIter *iter, - const gchar *field_name); + const gchar *field_name); gchar *gdaex_data_model_iter_get_field_value_stringify_escaped_at (GdaDataModelIter *iter, - const gchar *field_name); + const gchar *field_name); gint gdaex_data_model_iter_get_field_value_integer_at (GdaDataModelIter *iter, - const gchar *field_name); + const gchar *field_name); gfloat gdaex_data_model_iter_get_field_value_float_at (GdaDataModelIter *iter, - const gchar *field_name); + const gchar *field_name); gdouble gdaex_data_model_iter_get_field_value_double_at (GdaDataModelIter *iter, - const gchar *field_name); + const gchar *field_name); gboolean gdaex_data_model_iter_get_field_value_boolean_at (GdaDataModelIter *iter, - const gchar *field_name); + const gchar *field_name); GdaTimestamp *gdaex_data_model_iter_get_field_value_gdatimestamp_at (GdaDataModelIter *iter, - const gchar *field_name); + const gchar *field_name); GDate *gdaex_data_model_iter_get_field_value_gdate_at (GdaDataModelIter *iter, - const gchar *field_name); + const gchar *field_name); GDateTime *gdaex_data_model_iter_get_field_value_gdatetime_at (GdaDataModelIter *iter, - const gchar *field_name); + const gchar *field_name); struct tm *gdaex_data_model_iter_get_field_value_tm_at (GdaDataModelIter *iter, - const gchar *field_name); + const gchar *field_name); gchar *gdaex_data_model_iter_get_value_stringify_at (GdaDataModelIter *iter, - gint col); + gint col); gchar *gdaex_data_model_iter_get_value_stringify_escaped_at (GdaDataModelIter *iter, - gint col); + gint col); gint gdaex_data_model_iter_get_value_integer_at (GdaDataModelIter *iter, - gint col); + gint col); gfloat gdaex_data_model_iter_get_value_float_at (GdaDataModelIter *iter, - gint col); + gint col); gdouble gdaex_data_model_iter_get_value_double_at (GdaDataModelIter *iter, - gint col); + gint col); gboolean gdaex_data_model_iter_get_value_boolean_at (GdaDataModelIter *iter, - gint col); + gint col); GdaTimestamp *gdaex_data_model_iter_get_value_gdatimestamp_at (GdaDataModelIter *iter, - gint col); + gint col); GDate *gdaex_data_model_iter_get_value_gdate_at (GdaDataModelIter *iter, - gint col); + gint col); GDateTime *gdaex_data_model_iter_get_value_gdatetime_at (GdaDataModelIter *iter, - gint col); + gint col); struct tm *gdaex_data_model_iter_get_value_tm_at (GdaDataModelIter *iter, - gint col); + gint col); GHashTable *gdaex_data_model_columns_to_hashtable (GdaDataModel *dm); GHashTable *gdaex_data_model_row_to_hashtable (GdaDataModel *dm, guint row); @@ -295,15 +295,21 @@ gchar *gdaex_format_money (gdouble number, gint decimals, gboolean with_currency_symbol); +gboolean gdaex_save_data_in_blob (GdaEx *gdaex, + const gchar *sql, + const gchar *blob_field_name, + const guchar *data, + glong size); + gboolean gdaex_save_file_in_blob (GdaEx *gdaex, - const gchar *sql, - const gchar *blob_field_name, - const gchar *filename); + const gchar *sql, + const gchar *blob_field_name, + const gchar *filename); const gchar *gdaex_get_blob (GdaEx *gdaex, - const gchar *sql, - const gchar *filename_field_name, - const gchar *blob_field_name); + const gchar *sql, + const gchar *filename_field_name, + const gchar *blob_field_name); G_END_DECLS -- 2.49.0 From cdb485ab04f55e436d160897e63248bb9f6d4ea4 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sat, 10 Jun 2017 14:32:58 +0200 Subject: [PATCH 15/16] Enabled gir. --- .gitignore | 2 ++ Makefile.am | 2 +- configure.ac | 7 +++++-- src/Makefile.am | 26 ++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 2505b7a..cd1690d 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,5 @@ tests/select tests/getsql tests/sqlbuilder *~ +*.gir +*.typelib \ No newline at end of file diff --git a/Makefile.am b/Makefile.am index 8ed654a..462f209 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc +DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection SUBDIRS = data po src gdaex2gettext docs tests diff --git a/configure.ac b/configure.ac index 0f4b99a..e859d9a 100644 --- a/configure.ac +++ b/configure.ac @@ -28,6 +28,9 @@ AC_PROG_LIBTOOL AC_PROG_RANLIB GTK_DOC_CHECK(1.0) + +GOBJECT_INTROSPECTION_CHECK([1.30.0]) + IT_PROG_INTLTOOL dnl ****************************** @@ -49,8 +52,8 @@ PKG_CHECK_MODULES(GDAEX, [gmodule-2.0 >= 2 libgda-5.0 >= 5 gio-2.0 >= 2.36 gtk+-3.0 >= 3 - libxml-2.0 >= 2 - libzakutils]) + libxml-2.0 >= 2 + libzakutils]) AC_SUBST(GDAEX_CFLAGS) AC_SUBST(GDAEX_LIBS) diff --git a/src/Makefile.am b/src/Makefile.am index 5fe63c0..bd00197 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -47,3 +47,29 @@ install-exec-hook: uninstall-hook: rm -rf "$(libdir)/$(PACKAGE)" + +CLEANFILES = + +-include $(INTROSPECTION_MAKEFILE) +INTROSPECTION_GIRS = +INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir) --warn-all --accept-unprefixed --identifier-prefix="" +INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir) + +if HAVE_INTROSPECTION +introspection_sources = $(libgdaex_la_SOURCES) $(libgdaex_include_HEADERS) + +Gdaex-1.0.gir: libgdaex.la +Gdaex_1_0_gir_INCLUDES = GObject-2.0 GLib-2.0 Gda-5.0 +Gdaex_1_0_gir_CFLAGS = $(AM_CPPFLAGS) +Gdaex_1_0_gir_LIBS = libgdaex.la +Gdaex_1_0_gir_FILES = $(introspection_sources) +INTROSPECTION_GIRS += Gdaex-1.0.gir + +girdir = $(datadir)/gir-1.0 +gir_DATA = $(INTROSPECTION_GIRS) + +typelibdir = $(libdir)/girepository-1.0 +typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) + +CLEANFILES += $(gir_DATA) $(typelib_DATA) +endif -- 2.49.0 From efa1f2cd54dfa351980358a15b472e14e082d1e7 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sat, 26 Aug 2017 21:18:31 +0200 Subject: [PATCH 16/16] Setted version 0.7.0. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index e859d9a..cbaf3a2 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT([libgdaex], [0.6.0], [azagli@libero.it]) +AC_INIT([libgdaex], [0.7.0], [azagli@libero.it]) AC_CONFIG_SRCDIR([src/gdaex.c]) AM_CONFIG_HEADER([config.h]) -- 2.49.0