[libgda/gtk3] Merged master, up to fb8a1153b2c71bcef21e135e71a37e35be469631



commit 867c1654a5d4d59fde22a36f59db5b2d20a80562
Author: Vivien Malerba <malerba gnome-db org>
Date:   Thu Oct 21 20:47:27 2010 +0200

    Merged master, up to fb8a1153b2c71bcef21e135e71a37e35be469631

 ChangeLog                                          |   14 +
 doc/C/libgda-sections.txt                          |    1 +
 doc/C/tmpl/gda-server-operation-sequences.sgml     |    2 +-
 doc/C/tmpl/gda-sql-builder.sgml                    |    2 +-
 doc/C/tmpl/gda-xa-transaction.sgml                 |    1 +
 .../DocBook/gda-report-docbook-document.c          |    6 +-
 libgda-report/RML/gda-report-rml-document.c        |    6 +-
 libgda-report/engine/gda-report-engine.c           |    6 +-
 libgda-report/gda-report-document.c                |    6 +-
 libgda-ui/Makefile.am                              |    2 +-
 libgda-ui/data-entries/gdaui-entry-combo.c         |   10 +-
 libgda-ui/data-entries/gdaui-entry-wrapper.c       |   10 +-
 libgda-ui/gdaui-basic-form.c                       |    1 -
 libgda-ui/gdaui-data-store.c                       |   10 +-
 libgda-ui/gdaui-data-store.h                       |    4 +-
 libgda-ui/gdaui-tree-store.c                       |   10 +-
 libgda-ui/internal/gdaui-dsn-selector.c            |   10 +-
 libgda-ui/internal/gdaui-provider-auth-editor.c    |   14 +-
 libgda-ui/internal/gdaui-provider-spec-editor.c    |   10 +-
 libgda-ui/internal/popup-container.c               |   12 +-
 libgda/binreloc/binreloc.c                         |   18 +-
 libgda/binreloc/gda-binreloc.c                     |    8 +-
 libgda/dir-blob-op.c                               |    4 +-
 libgda/gda-attributes-manager.c                    |    8 +-
 libgda/gda-batch.c                                 |    4 +-
 libgda/gda-column.c                                |   12 +-
 libgda/gda-config.c                                |   18 +-
 libgda/gda-connection.c                            |   81 +-
 libgda/gda-data-access-wrapper.c                   |   10 +-
 libgda/gda-data-comparator.c                       |   14 +-
 libgda/gda-data-handler.c                          |   46 +-
 libgda/gda-data-meta-wrapper.c                     |   15 +-
 libgda/gda-data-model-array.c                      |    6 +-
 libgda/gda-data-model-bdb.c                        |   15 +-
 libgda/gda-data-model-dir.c                        |   16 +-
 libgda/gda-data-model-import.c                     |   32 +-
 libgda/gda-data-model-iter.c                       |   12 +-
 libgda/gda-data-model.c                            |   28 +-
 libgda/gda-data-proxy.c                            |   14 +-
 libgda/gda-data-select.c                           |   22 +-
 libgda/gda-easy.c                                  |   14 +-
 libgda/gda-holder.c                                |   14 +-
 libgda/gda-init.c                                  |    2 +-
 libgda/gda-meta-store.c                            |   28 +-
 libgda/gda-meta-struct.c                           |   14 +-
 libgda/gda-mutex.c                                 |    2 +-
 libgda/gda-quark-list.c                            |    6 +-
 libgda/gda-row.c                                   |    8 +-
 libgda/gda-server-operation.c                      |   24 +-
 libgda/gda-server-operation.h                      |    2 +-
 libgda/gda-server-provider-extra.c                 |    8 +-
 libgda/gda-server-provider.c                       |   18 +-
 libgda/gda-sql-builder.c                           |   30 +-
 libgda/gda-sql-builder.h                           |    2 +-
 libgda/gda-statement.c                             |    8 +-
 libgda/gda-transaction-status.c                    |   23 +-
 libgda/gda-tree-manager.c                          |   22 +-
 libgda/gda-tree-mgr-columns.c                      |   10 +-
 libgda/gda-tree-mgr-label.c                        |   10 +-
 libgda/gda-tree-mgr-schemas.c                      |   10 +-
 libgda/gda-tree-mgr-select.c                       |   10 +-
 libgda/gda-tree-mgr-tables.c                       |   10 +-
 libgda/gda-tree-node.c                             |   13 +-
 libgda/gda-tree.c                                  |   22 +-
 libgda/gda-util.c                                  |  363 ++-
 libgda/gda-value.c                                 |   74 +-
 libgda/gda-xa-transaction.c                        |   61 +-
 libgda/gda-xa-transaction.h                        |    4 +-
 libgda/handlers/gda-handler-bin.c                  |    4 +-
 libgda/handlers/gda-handler-boolean.c              |    4 +-
 libgda/handlers/gda-handler-numerical.c            |  100 +-
 libgda/handlers/gda-handler-string.c               |   10 +-
 libgda/handlers/gda-handler-time.c                 |  320 ++-
 libgda/handlers/gda-handler-type.c                 |    4 +-
 libgda/libgda.symbols                              |    1 +
 libgda/providers-support/gda-pstmt.c               |    4 +-
 libgda/sql-parser/LemonPatch                       |  125 +-
 libgda/sql-parser/Makefile.am                      |    4 +-
 libgda/sql-parser/gda-sql-parser.c                 |    6 +-
 libgda/sql-parser/gda-statement-struct-compound.c  |    2 +-
 libgda/sql-parser/gda-statement-struct-delete.c    |    8 +-
 libgda/sql-parser/gda-statement-struct-insert.c    |   24 +-
 libgda/sql-parser/gda-statement-struct-pspec.c     |   16 +-
 libgda/sql-parser/gda-statement-struct-select.c    |   30 +-
 libgda/sql-parser/gda-statement-struct-trans.c     |    8 +-
 libgda/sql-parser/gda-statement-struct-unknown.c   |    4 +-
 libgda/sql-parser/gda-statement-struct-update.c    |   14 +-
 libgda/sql-parser/gda-statement-struct.c           |    6 +-
 libgda/sql-parser/lemon.c                          | 1343 +++++----
 libgda/sql-parser/lempar.c                         |  141 +-
 libgda/sql-parser/parser.y                         |    2 +-
 libgda/sqlite/gda-sqlite-recordset.c               |    4 +-
 libgda/sqlite/gen_emb_string.c                     |    2 +
 libgda/sqlite/sqlite-src/sqlite3.c                 |    8 +-
 libgda/sqlite/virtual/gda-vconnection-data-model.c |    6 +-
 libgda/sqlite/virtual/gda-vconnection-hub.c        |    6 +-
 libgda/sqlite/virtual/gda-virtual-provider.c       |    6 +-
 libgda/sqlite/virtual/gda-vprovider-data-model.c   |   10 +-
 libgda/sqlite/virtual/gda-vprovider-hub.c          |    6 +-
 libgda/thread-wrapper/gda-thread-wrapper.c         |   24 +-
 po/es.po                                           | 3017 ++++++++++----------
 providers/bdb/gda-bdb-provider.c                   |    3 -
 providers/bdb/gda-bdb-test.c                       |    3 -
 providers/firebird/Makefile.am                     |    2 +-
 providers/firebird/parser.y                        |    2 +-
 providers/mysql/gda-mysql-recordset.c              |   18 +-
 providers/oracle/Makefile.am                       |    2 +-
 providers/oracle/parser.y                          |    2 +-
 providers/postgres/gda-postgres-recordset.c        |   14 +-
 providers/reuseable/mysql/Makefile.am              |    2 +-
 providers/reuseable/mysql/parser.y                 |    2 +-
 providers/reuseable/postgres/Makefile.am           |    2 +-
 providers/reuseable/postgres/parser.y              |    2 +-
 providers/skel-implementation/capi/Makefile.am     |    2 +-
 providers/skel-implementation/capi/parser.y        |    2 +-
 samples/XSLT/transform.c                           |    2 +-
 tests/.gitignore                                   |    1 +
 tests/Makefile.am                                  |    8 +-
 tests/gda-ddl-creator.c                            |   10 +-
 tests/meta-store/common.c                          |    2 +-
 tests/providers/README                             |   32 +-
 tests/test-cnc-utils.c                             |    2 +-
 tests/test-connection-string-split.c               |   96 +-
 tests/test-input-parsers.c                         |  522 ++++
 tools/Makefile.am                                  |    4 +-
 tools/browser/auth-dialog.c                        |    2 +-
 tools/browser/browser-connection.c                 |   12 +-
 tools/browser/browser-virtual-connection.c         |   10 +-
 tools/browser/browser-window.c                     |    2 +-
 tools/browser/canvas/browser-canvas-column.c       |   10 +-
 tools/browser/canvas/browser-canvas-db-relations.c |   12 +-
 tools/browser/canvas/browser-canvas-fkey.c         |    9 +-
 tools/browser/canvas/browser-canvas-item.c         |    5 +-
 tools/browser/canvas/browser-canvas-table.c        |   10 +-
 tools/browser/canvas/browser-canvas-text.c         |    9 +-
 tools/browser/canvas/browser-canvas.c              |   10 +-
 tools/browser/common/Makefile.am                   |    3 -
 tools/browser/common/objects-cloud.c               |    2 +-
 tools/browser/common/popup-container.c             |    1 -
 tools/browser/common/popup-container.h             |    1 -
 tools/browser/data-manager/data-console.c          |    4 +-
 .../browser/data-manager/data-favorite-selector.c  |    2 +-
 tools/browser/data-manager/data-widget.c           |  108 +-
 tools/browser/doc/tmpl/popup-container.sgml        |   42 -
 tools/browser/main.c                               |    2 +-
 tools/browser/mgr-favorites.c                      |   10 +-
 tools/browser/query-exec/query-console.c           |    2 +-
 tools/browser/query-exec/query-editor.c            |    2 +-
 tools/browser/query-exec/query-favorite-selector.c |    2 +-
 tools/browser/schema-browser/mgr-columns.c         |   10 +-
 tools/browser/schema-browser/objects-index.c       |    2 +-
 tools/browser/schema-browser/relations-diagram.c   |   12 +-
 tools/browser/schema-browser/table-info.c          |   14 +-
 tools/gda-list-server-op.c                         |   39 +-
 tools/gda-tree-mgr-xml.c                           |  205 ++
 tools/gda-tree-mgr-xml.h                           |   56 +
 156 files changed, 4750 insertions(+), 3198 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 9fc0f8d..5009e0f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,2 +1,16 @@
+2010-10-16  Murray Cumming  <murrayc murrayc-x61>
+
+	reviewed by: <delete if not using a buddy>
+
+	* libgda/gda-meta-store.c:
+	* libgda/sql-parser/gda-statement-struct-compound.c:
+	* libgda/sql-parser/gda-statement-struct-delete.c:
+	* libgda/sql-parser/gda-statement-struct-insert.c:
+	* libgda/sql-parser/gda-statement-struct-pspec.c:
+	* libgda/sql-parser/gda-statement-struct-select.c:
+	* libgda/sql-parser/gda-statement-struct-trans.c:
+	* libgda/sql-parser/gda-statement-struct-unknown.c:
+	* libgda/sql-parser/gda-statement-struct-update.c:
+
 The ChangeLog is auto-generated when releasing. If you
 are seeing this, use 'git log' for a detailed list of changes.
diff --git a/doc/C/libgda-sections.txt b/doc/C/libgda-sections.txt
index 378f50d..8dd5256 100644
--- a/doc/C/libgda-sections.txt
+++ b/doc/C/libgda-sections.txt
@@ -851,6 +851,7 @@ GdaHandlerTimePriv
 gda_handler_time_new
 gda_handler_time_new_no_locale
 gda_handler_time_set_sql_spec
+gda_handler_time_set_str_spec
 gda_handler_time_get_format
 <SUBSECTION Standard>
 GDA_HANDLER_TIME
diff --git a/doc/C/tmpl/gda-server-operation-sequences.sgml b/doc/C/tmpl/gda-server-operation-sequences.sgml
index f097153..422070d 100644
--- a/doc/C/tmpl/gda-server-operation-sequences.sgml
+++ b/doc/C/tmpl/gda-server-operation-sequences.sgml
@@ -80,7 +80,7 @@ Manipulating sequences
 </para>
 
 @op: 
- path: 
+ seq_path: 
 @Returns: 
 
 
diff --git a/doc/C/tmpl/gda-sql-builder.sgml b/doc/C/tmpl/gda-sql-builder.sgml
index 79636d8..1bce525 100644
--- a/doc/C/tmpl/gda-sql-builder.sgml
+++ b/doc/C/tmpl/gda-sql-builder.sgml
@@ -369,7 +369,7 @@ guint id_cond_and = gda_sql_builder_add_cond (b, GDA_SQL_OPERATOR_TYPE_AND, id_c
 
 @builder: 
 @limit_count_expr_id: 
- limit_offest_expr_id: 
+ limit_offset_expr_id: 
 
 
 <!-- ##### FUNCTION gda_sql_builder_select_set_having ##### -->
diff --git a/doc/C/tmpl/gda-xa-transaction.sgml b/doc/C/tmpl/gda-xa-transaction.sgml
index 67f4cae..ea75a39 100644
--- a/doc/C/tmpl/gda-xa-transaction.sgml
+++ b/doc/C/tmpl/gda-xa-transaction.sgml
@@ -59,6 +59,7 @@ Distributed transaction manager
 
 @GDA_XA_TRANSACTION_ALREADY_REGISTERED_ERROR: 
 @GDA_XA_TRANSACTION_DTP_NOT_SUPPORTED_ERROR: 
+ GDA_XA_TRANSACTION_CONNECTION_BRANCH_LENGTH_ERROR: 
 
 <!-- ##### STRUCT GdaXaTransactionId ##### -->
 <para>
diff --git a/libgda-report/DocBook/gda-report-docbook-document.c b/libgda-report/DocBook/gda-report-docbook-document.c
index 9457843..39e60d7 100644
--- a/libgda-report/DocBook/gda-report-docbook-document.c
+++ b/libgda-report/DocBook/gda-report-docbook-document.c
@@ -164,7 +164,7 @@ static void
 gda_report_docbook_document_set_property (GObject *object,
 				guint param_id,
 				const GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
         GdaReportDocbookDocument *doc;
 
@@ -204,6 +204,7 @@ gda_report_docbook_document_set_property (GObject *object,
 				doc->priv->fop_path = g_strdup (g_value_get_string (value));
 			break;
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
                 }
         }
@@ -213,7 +214,7 @@ static void
 gda_report_docbook_document_get_property (GObject *object,
 				guint param_id,
 				GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
         GdaReportDocbookDocument *doc;
 
@@ -233,6 +234,7 @@ gda_report_docbook_document_get_property (GObject *object,
 			g_value_set_string (value, doc->priv->fop_path);
 			break;
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
         }
diff --git a/libgda-report/RML/gda-report-rml-document.c b/libgda-report/RML/gda-report-rml-document.c
index 955731c..7aa906c 100644
--- a/libgda-report/RML/gda-report-rml-document.c
+++ b/libgda-report/RML/gda-report-rml-document.c
@@ -137,7 +137,7 @@ static void
 gda_report_rml_document_set_property (GObject *object,
 				guint param_id,
 				G_GNUC_UNUSED const GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
         GdaReportRmlDocument *doc;
 
@@ -145,6 +145,7 @@ gda_report_rml_document_set_property (GObject *object,
         if (doc->priv) {
                 switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
                 }
         }
@@ -154,7 +155,7 @@ static void
 gda_report_rml_document_get_property (GObject *object,
 				guint param_id,
 				G_GNUC_UNUSED GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
         GdaReportRmlDocument *doc;
 
@@ -162,6 +163,7 @@ gda_report_rml_document_get_property (GObject *object,
         if (doc->priv) {
 		switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
         }
diff --git a/libgda-report/engine/gda-report-engine.c b/libgda-report/engine/gda-report-engine.c
index 5887ce0..5b14d66 100644
--- a/libgda-report/engine/gda-report-engine.c
+++ b/libgda-report/engine/gda-report-engine.c
@@ -165,7 +165,7 @@ static void
 gda_report_engine_set_property (GObject *object,
 				guint param_id,
 				const GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
         GdaReportEngine *eng;
 
@@ -211,6 +211,7 @@ gda_report_engine_set_property (GObject *object,
 			break;
 		}
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
                 }
         }
@@ -220,7 +221,7 @@ static void
 gda_report_engine_get_property (GObject *object,
 				guint param_id,
 				GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
         GdaReportEngine *eng;
 
@@ -231,6 +232,7 @@ gda_report_engine_get_property (GObject *object,
 			g_value_set_pointer (value, eng->priv->spec);
 			break;
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
         }
diff --git a/libgda-report/gda-report-document.c b/libgda-report/gda-report-document.c
index e4c6065..76aa41f 100644
--- a/libgda-report/gda-report-document.c
+++ b/libgda-report/gda-report-document.c
@@ -147,7 +147,7 @@ static void
 gda_report_document_set_property (GObject *object,
 				guint param_id,
 				const GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
         GdaReportDocument *doc;
 
@@ -167,6 +167,7 @@ gda_report_document_set_property (GObject *object,
 			doc->priv->doc = xmlParseFile (g_value_get_string (value));
 			break;
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
                 }
         }
@@ -176,7 +177,7 @@ static void
 gda_report_document_get_property (GObject *object,
 				guint param_id,
 				GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
         GdaReportDocument *doc;
 
@@ -189,6 +190,7 @@ gda_report_document_get_property (GObject *object,
 			g_value_set_object (value, doc->priv->engine);
 			break;
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
         }
diff --git a/libgda-ui/Makefile.am b/libgda-ui/Makefile.am
index 2685ae2..da18d74 100644
--- a/libgda-ui/Makefile.am
+++ b/libgda-ui/Makefile.am
@@ -210,7 +210,7 @@ introspection_sources = \
 Gdaui-5.0.gir: $(lib_LTLIBRARIES)
 Gdaui_5_0_gir_INCLUDES = Gtk-3.0 Gda-5.0
 Gdaui_5_0_gir_CFLAGS = $(AM_CPPFLAGS)
-Gdaui_5_0_gir_LIBS = $(lib_LTLIBRARIES)
+Gdaui_5_0_gir_LIBS = $(lib_LTLIBRARIES) ../libgda/libgda-5.0.la
 Gdaui_5_0_gir_FILES = $(addprefix $(srcdir)/,$(introspection_sources))
 INTROSPECTION_COMPILER_ARGS = --includedir=$(top_builddir)/libgda
 INTROSPECTION_GIRS += Gdaui-5.0.gir
diff --git a/libgda-ui/data-entries/gdaui-entry-combo.c b/libgda-ui/data-entries/gdaui-entry-combo.c
index 7cfac6e..5d9b69a 100644
--- a/libgda-ui/data-entries/gdaui-entry-combo.c
+++ b/libgda-ui/data-entries/gdaui-entry-combo.c
@@ -379,7 +379,7 @@ static void
 gdaui_entry_combo_set_property (GObject *object,
 				guint param_id,
 				const GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
 	GdauiEntryCombo *combo = GDAUI_ENTRY_COMBO (object);
 	if (combo->priv) {
@@ -395,6 +395,9 @@ gdaui_entry_combo_set_property (GObject *object,
 					choose_auto_default_value (combo);
 			}
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -403,7 +406,7 @@ static void
 gdaui_entry_combo_get_property (GObject *object,
 				guint param_id,
 				GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
 	GdauiEntryCombo *combo = GDAUI_ENTRY_COMBO (object);
 	if (combo->priv) {
@@ -411,6 +414,9 @@ gdaui_entry_combo_get_property (GObject *object,
 		case PROP_SET_DEFAULT_IF_INVALID:
 			g_value_set_boolean (value, combo->priv->set_default_if_invalid);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
diff --git a/libgda-ui/data-entries/gdaui-entry-wrapper.c b/libgda-ui/data-entries/gdaui-entry-wrapper.c
index 4d9ed81..90e7546 100644
--- a/libgda-ui/data-entries/gdaui-entry-wrapper.c
+++ b/libgda-ui/data-entries/gdaui-entry-wrapper.c
@@ -285,7 +285,7 @@ static void
 gdaui_entry_wrapper_set_property (GObject *object,
 				  guint param_id,
 				  const GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
 	GdauiEntryWrapper *mgwrap = GDAUI_ENTRY_WRAPPER (object);
 	if (mgwrap->priv) {
@@ -310,6 +310,9 @@ gdaui_entry_wrapper_set_property (GObject *object,
 					gda_value_free (sane_value);
 			}
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 		}
 	}
@@ -319,7 +322,7 @@ static void
 gdaui_entry_wrapper_get_property (GObject *object,
 				  guint param_id,
 				  GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
 	GdauiEntryWrapper *mgwrap = GDAUI_ENTRY_WRAPPER (object);
 	if (mgwrap->priv) {
@@ -327,6 +330,9 @@ gdaui_entry_wrapper_get_property (GObject *object,
 		case PROP_SET_DEFAULT_IF_INVALID:
 			g_value_set_boolean (value, mgwrap->priv->set_default_if_invalid);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
diff --git a/libgda-ui/gdaui-basic-form.c b/libgda-ui/gdaui-basic-form.c
index e772999..28cb534 100644
--- a/libgda-ui/gdaui-basic-form.c
+++ b/libgda-ui/gdaui-basic-form.c
@@ -727,7 +727,6 @@ create_text_label_for_sentry (SingleEntry *sentry, gchar **out_title)
 
 	}
 	else {
-		gchar *label;
 		GSList *params;
 		gchar *title = NULL;
 
diff --git a/libgda-ui/gdaui-data-store.c b/libgda-ui/gdaui-data-store.c
index 13e0caa..6af472c 100644
--- a/libgda-ui/gdaui-data-store.c
+++ b/libgda-ui/gdaui-data-store.c
@@ -248,7 +248,7 @@ static void
 gdaui_data_store_set_property (GObject *object,
 			       guint param_id,
 			       const GValue *value,
-			       G_GNUC_UNUSED GParamSpec *pspec)
+			       GParamSpec *pspec)
 {
 	GdauiDataStore *store;
 
@@ -290,6 +290,9 @@ gdaui_data_store_set_property (GObject *object,
 				      g_value_get_boolean (value), NULL);
 			store->priv->stamp = g_random_int ();
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -298,7 +301,7 @@ static void
 gdaui_data_store_get_property (GObject *object,
 			       guint param_id,
 			       GValue *value,
-			       G_GNUC_UNUSED GParamSpec *pspec)
+			       GParamSpec *pspec)
 {
 	GdauiDataStore *store;
 
@@ -320,6 +323,9 @@ gdaui_data_store_get_property (GObject *object,
 			g_value_set_boolean (value, prop);
 			break;
 		}
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
diff --git a/libgda-ui/gdaui-data-store.h b/libgda-ui/gdaui-data-store.h
index 47184a3..52d6f19 100644
--- a/libgda-ui/gdaui-data-store.h
+++ b/libgda-ui/gdaui-data-store.h
@@ -41,7 +41,7 @@ enum {
 	DATA_STORE_COL_MODEL_POINTER = -3, /* pointer to the GdaDataModel */
 	DATA_STORE_COL_MODEL_ROW = -4, /* row number in the GdaDataModel, or -1 for new rows */
 	DATA_STORE_COL_MODIFIED = -5, /* TRUE if row has been modified */
-	DATA_STORE_COL_TO_DELETE = -6, /* TRUE if row is marked to be deleted */
+	DATA_STORE_COL_TO_DELETE = -6 /* TRUE if row is marked to be deleted */
 };
 
 /* struct for the object's data */
@@ -63,7 +63,7 @@ GType           gdaui_data_store_get_type             (void) G_GNUC_CONST;
 GtkTreeModel   *gdaui_data_store_new                  (GdaDataModel *model);
 
 GdaDataProxy   *gdaui_data_store_get_proxy            (GdauiDataStore *store);
-gint            gdaui_data_store_get_row_from_iter    (GdauiDataStore *store, GtkTreeIter *iter);       
+gint            gdaui_data_store_get_row_from_iter    (GdauiDataStore *store, GtkTreeIter *iter);
 gboolean        gdaui_data_store_get_iter_from_values (GdauiDataStore *store, GtkTreeIter *iter,
 						       GSList *values, gint *cols_index);
 
diff --git a/libgda-ui/gdaui-tree-store.c b/libgda-ui/gdaui-tree-store.c
index a289fd6..7587837 100644
--- a/libgda-ui/gdaui-tree-store.c
+++ b/libgda-ui/gdaui-tree-store.c
@@ -330,7 +330,7 @@ static void
 gdaui_tree_store_set_property (GObject *object,
 			       guint param_id,
 			       const GValue *value,
-			       G_GNUC_UNUSED GParamSpec *pspec)
+			       GParamSpec *pspec)
 {
 	GdauiTreeStore *store;
 
@@ -357,6 +357,9 @@ gdaui_tree_store_set_property (GObject *object,
 			/* connect to row changes */
 			store->priv->stamp = g_random_int_range (1, G_MAXINT);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -365,7 +368,7 @@ static void
 gdaui_tree_store_get_property (GObject *object,
 				  guint param_id,
 				  GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
 	GdauiTreeStore *store;
 
@@ -375,6 +378,9 @@ gdaui_tree_store_get_property (GObject *object,
 		case PROP_TREE:
 			g_value_set_pointer (value, store->priv->tree);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
diff --git a/libgda-ui/internal/gdaui-dsn-selector.c b/libgda-ui/internal/gdaui-dsn-selector.c
index 3753b90..1c48de8 100644
--- a/libgda-ui/internal/gdaui-dsn-selector.c
+++ b/libgda-ui/internal/gdaui-dsn-selector.c
@@ -109,7 +109,7 @@ static void
 gdaui_dsn_selector_set_property (GObject *object,
 				 guint param_id,
 				 const GValue *value,
-				 G_GNUC_UNUSED GParamSpec *pspec)
+				 GParamSpec *pspec)
 {
 	GdauiDsnSelector *selector;
 	GSList *list;
@@ -122,6 +122,9 @@ gdaui_dsn_selector_set_property (GObject *object,
 		_gdaui_combo_set_selected_ext (GDAUI_COMBO (selector), list, cols_index);
 		g_slist_free (list);
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
@@ -129,7 +132,7 @@ static void
 gdaui_dsn_selector_get_property (GObject *object,
 				 guint param_id,
 				 GValue *value,
-				 G_GNUC_UNUSED GParamSpec *pspec)
+				 GParamSpec *pspec)
 {
 	GdauiDsnSelector *selector;
 	GSList *list;
@@ -146,6 +149,9 @@ gdaui_dsn_selector_get_property (GObject *object,
 		else
 			g_value_set_string (value, NULL);
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
diff --git a/libgda-ui/internal/gdaui-provider-auth-editor.c b/libgda-ui/internal/gdaui-provider-auth-editor.c
index 4af2dee..3b2cb7b 100644
--- a/libgda-ui/internal/gdaui-provider-auth-editor.c
+++ b/libgda-ui/internal/gdaui-provider-auth-editor.c
@@ -45,11 +45,11 @@ static void gdaui_provider_auth_editor_finalize   (GObject *object);
 static void gdaui_provider_auth_editor_set_property (GObject *object,
 							guint param_id,
 							const GValue *value,
-							GParamSpec *pauth);
+							GParamSpec *pspec);
 static void gdaui_provider_auth_editor_get_property (GObject *object,
 							guint param_id,
 							GValue *value,
-							GParamSpec *pauth);
+							GParamSpec *pspec);
 
 enum {
 	PROP_0,
@@ -147,7 +147,7 @@ static void
 gdaui_provider_auth_editor_set_property (GObject *object,
                                             guint param_id,
                                             const GValue *value,
-                                            G_GNUC_UNUSED GParamSpec *pauth)
+                                            GParamSpec *pspec)
 {
 	GdauiProviderAuthEditor *auth;
 	auth = GDAUI_PROVIDER_AUTH_EDITOR (object);
@@ -156,6 +156,9 @@ gdaui_provider_auth_editor_set_property (GObject *object,
 	case PROP_PROVIDER:
 		_gdaui_provider_auth_editor_set_provider (auth, g_value_get_string (value));
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
@@ -163,7 +166,7 @@ static void
 gdaui_provider_auth_editor_get_property (GObject *object,
                                             guint param_id,
                                             GValue *value,
-                                            G_GNUC_UNUSED GParamSpec *pauth)
+                                            GParamSpec *pspec)
 {
 	GdauiProviderAuthEditor *auth;
 	auth = GDAUI_PROVIDER_AUTH_EDITOR (object);
@@ -172,6 +175,9 @@ gdaui_provider_auth_editor_get_property (GObject *object,
 	case PROP_PROVIDER:
 		g_value_set_string (value, auth->priv->provider);
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
diff --git a/libgda-ui/internal/gdaui-provider-spec-editor.c b/libgda-ui/internal/gdaui-provider-spec-editor.c
index ed60fe3..48aea64 100644
--- a/libgda-ui/internal/gdaui-provider-spec-editor.c
+++ b/libgda-ui/internal/gdaui-provider-spec-editor.c
@@ -284,7 +284,7 @@ static void
 gdaui_provider_spec_editor_set_property (GObject *object,
                                             guint param_id,
                                             const GValue *value,
-                                            G_GNUC_UNUSED GParamSpec *pspec)
+                                            GParamSpec *pspec)
 {
 	GdauiProviderSpecEditor *spec;
 	spec = GDAUI_PROVIDER_SPEC_EDITOR (object);
@@ -294,6 +294,9 @@ gdaui_provider_spec_editor_set_property (GObject *object,
 		_gdaui_provider_spec_editor_set_provider (spec,
 		                                g_value_get_string (value));
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
@@ -301,7 +304,7 @@ static void
 gdaui_provider_spec_editor_get_property (GObject *object,
                                             guint param_id,
                                             GValue *value,
-                                            G_GNUC_UNUSED GParamSpec *pspec)
+                                            GParamSpec *pspec)
 {
 	GdauiProviderSpecEditor *spec;
 	spec = GDAUI_PROVIDER_SPEC_EDITOR (object);
@@ -310,6 +313,9 @@ gdaui_provider_spec_editor_get_property (GObject *object,
 	case PROP_PROVIDER:
 		g_value_set_string (value, spec->priv->provider);
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
diff --git a/libgda-ui/internal/popup-container.c b/libgda-ui/internal/popup-container.c
index 6d893d7..475d0f8 100644
--- a/libgda-ui/internal/popup-container.c
+++ b/libgda-ui/internal/popup-container.c
@@ -244,13 +244,11 @@ popup_container_get_type (void)
 			(GInstanceInitFunc) popup_container_init,
 			0
 		};
-#ifdef PRIV_OBJ_PREFIX
-		type = g_type_register_static (GTK_TYPE_WINDOW, PRIV_OBJ_PREFIX "GdauiPopupContainer",
-					       &info, 0);
-#else
-		type = g_type_register_static (GTK_TYPE_WINDOW, "GdauiPopupContainer",
-					       &info, 0);
-#endif
+
+		type = g_type_from_name ("GdauiPopupContainer");
+		if (!type)
+			type = g_type_register_static (GTK_TYPE_WINDOW, "GdauiPopupContainer",
+						       &info, 0);
 	}
 	return type;
 }
diff --git a/libgda/binreloc/binreloc.c b/libgda/binreloc/binreloc.c
index a4eac8c..0151246 100644
--- a/libgda/binreloc/binreloc.c
+++ b/libgda/binreloc/binreloc.c
@@ -72,7 +72,7 @@ _br_find_exe (GbrInitError *error)
 	while (1) {
 		int i;
 
-		size = readlink (path2, path, buf_size - 1);
+		size = readlink (path2, path, buf_size - 1); /* Flawfinder: ignore */
 		if (size == -1) {
 			/* Error. */
 			g_free (path2);
@@ -116,7 +116,7 @@ _br_find_exe (GbrInitError *error)
 		return NULL;
 	}
 
-	f = fopen ("/proc/self/maps", "r");
+	f = fopen ("/proc/self/maps", "r"); /* Flawfinder: ignore */
 	if (f == NULL) {
 		g_free (line);
 		if (error)
@@ -187,12 +187,12 @@ _br_find_exe_for_symbol (
 	#define SIZE PATH_MAX + 100
 	FILE *f;
 	size_t address_string_len;
-	char *address_string, line[SIZE], *found;
+	char *address_string, line[SIZE], *found; /* Flawfinder: ignore */
 
 	if (symbol == NULL)
 		return (char *) NULL;
 
-	f = fopen ("/proc/self/maps", "r");
+	f = fopen ("/proc/self/maps", "r"); /* Flawfinder: ignore */
 	if (f == NULL)
 		return (char *) NULL;
 
@@ -249,16 +249,16 @@ _br_find_exe_for_symbol (
 		 * then transform that into a pointer. */
 		if (address_string_len < len + 3) {
 			address_string_len = len + 3;
-			address_string = (char *) g_try_realloc (address_string, address_string_len);
+			address_string = (char *) g_realloc (address_string, address_string_len);
 		}
 
-		memcpy (address_string, "0x", 2);
-		memcpy (address_string + 2, start_addr, len);
+		memcpy (address_string, "0x", 2); /* Flawfinder: ignore */
+		memcpy (address_string + 2, start_addr, len); /* Flawfinder: ignore */
 		address_string[2 + len] = '\0';
 		sscanf (address_string, "%p", &start_addr_p);
 
-		memcpy (address_string, "0x", 2);
-		memcpy (address_string + 2, end_addr, len);
+		memcpy (address_string, "0x", 2); /* Flawfinder: ignore */
+		memcpy (address_string + 2, end_addr, len); /* Flawfinder: ignore */
 		address_string[2 + len] = '\0';
 		sscanf (address_string, "%p", &end_addr_p);
 
diff --git a/libgda/binreloc/gda-binreloc.c b/libgda/binreloc/gda-binreloc.c
index 809ec17..a64c43f 100644
--- a/libgda/binreloc/gda-binreloc.c
+++ b/libgda/binreloc/gda-binreloc.c
@@ -86,7 +86,7 @@ gda_gbr_get_file_path (GdaPrefixDir where, ...)
 	*/
 
 #ifdef G_OS_WIN32
-	wchar_t path[MAX_PATH];
+	wchar_t path[MAX_PATH]; /* Flawfinder: ignore */
 	gchar* p;
 #endif
 
@@ -197,7 +197,7 @@ gda_gbr_get_file_path (GdaPrefixDir where, ...)
     #define MAXLEN 500
 		ProcessSerialNumber myProcess;
 		FSRef bundleLocation;
-		unsigned char bundlePath[MAXLEN];
+		unsigned char bundlePath[MAXLEN]; /* Flawfinder: ignore */
 		
 		if ((GetCurrentProcess (&myProcess) == noErr) &&
 		    (GetProcessBundleLocation (&myProcess, &bundleLocation) == noErr) &&
@@ -229,8 +229,10 @@ gda_gbr_get_file_path (GdaPrefixDir where, ...)
 #endif
 	}
 
-	if (!prefix || !*prefix)
+	if (!prefix || !*prefix) {
+		g_free (prefix);
 		return NULL;
+	}
        
 	/* filename part */
 	size = 10;
diff --git a/libgda/dir-blob-op.c b/libgda/dir-blob-op.c
index b8da5b0..6a67bf4 100644
--- a/libgda/dir-blob-op.c
+++ b/libgda/dir-blob-op.c
@@ -190,7 +190,7 @@ gda_dir_blob_op_read (GdaBlobOp *op, GdaBlob *blob, glong offset, glong size)
 	g_return_val_if_fail (blob, -1);
 
 	/* open file */
-	file = fopen (dirop->priv->complete_filename, "r");
+	file = fopen (dirop->priv->complete_filename, "r"); /* Flawfinder: ignore */
 	if (!file)
 		return -1;
 	
@@ -229,7 +229,7 @@ gda_dir_blob_op_write (GdaBlobOp *op, GdaBlob *blob, glong offset)
 	g_return_val_if_fail (blob, -1);
 
 	/* open file */
-	file = fopen (dirop->priv->complete_filename, "w+");
+	file = fopen (dirop->priv->complete_filename, "w+"); /* Flawfinder: ignore */
 	if (!file)
 		return -1;
 	
diff --git a/libgda/gda-attributes-manager.c b/libgda/gda-attributes-manager.c
index a94b769..2e59734 100644
--- a/libgda/gda-attributes-manager.c
+++ b/libgda/gda-attributes-manager.c
@@ -91,7 +91,7 @@ objattrs_unref (ObjAttrs *attrs)
 }
 
 /**
- * gda_attributes_manager_new:
+ * gda_attributes_manager_new: (skip):
  * @for_objects: set to TRUE if attributes will be set on objects.
  * @signal_func: a function to be called whenever an attribute changes on an object (if @for_objects is TRUE), or %NULL
  * @signal_data: user data passed as last argument of @signal_func when it is called
@@ -291,7 +291,7 @@ gda_attributes_manager_set_full (GdaAttributesManager *mgr, gpointer ptr,
  * gda_attributes_manager_get:
  * @mgr: a #GdaAttributesManager
  * @ptr: a pointer to the resources to which the attribute will apply
- * @att_name: an attribute's name, as a *static* string
+ * @att_name: an attribute's name
  *
  * Retrieves the value of an attribute previously set using gda_attributes_manager_set().
  *
@@ -408,8 +408,8 @@ static void foreach_foreach_func (AttName *attname, const GValue *value, FData *
  * gda_attributes_manager_foreach:
  * @mgr: a #GdaAttributesManager
  * @ptr: a pointer to the resources for which all the attributes used
- * @func: a #GdaAttributesManagerFunc function
- * @data: user data to be passed as last argument of @func each time it is called
+ * @func: (scope call): a #GdaAttributesManagerFunc function
+ * @data: (closure): user data to be passed as last argument of @func each time it is called
  *
  * Calls @func for every attribute set to @ptr.
  */
diff --git a/libgda/gda-batch.c b/libgda/gda-batch.c
index b92f320..86421ac 100644
--- a/libgda/gda-batch.c
+++ b/libgda/gda-batch.c
@@ -169,7 +169,7 @@ gda_batch_new (void)
  * 
  * Copy constructor
  *
- * Returns: a the new copy of @orig
+ * Returns: (transfer full): a the new copy of @orig
  */
 GdaBatch *
 gda_batch_copy (GdaBatch *orig)
@@ -387,7 +387,7 @@ gda_batch_get_statements (GdaBatch *batch)
 /**
  * gda_batch_get_parameters:
  * @batch: a #GdaBatch object
- * @out_params: (out) (tranfer full) (allow-none): a place to store a new #GdaSet object, or %NULL
+ * @out_params: (out) (transfer full) (allow-none): a place to store a new #GdaSet object, or %NULL
  * @error: a place to store errors, or %NULL
  *
  * Get a new #GdaSet object which groups all the execution parameters
diff --git a/libgda/gda-column.c b/libgda/gda-column.c
index fbebf62..671a0be 100644
--- a/libgda/gda-column.c
+++ b/libgda/gda-column.c
@@ -207,7 +207,7 @@ static void
 gda_column_set_property (GObject *object,
                                    guint param_id,
                                    const GValue *value,
-                                   G_GNUC_UNUSED GParamSpec *pspec)
+                                   GParamSpec *pspec)
 {
         GdaColumn *col;
 
@@ -222,7 +222,8 @@ gda_column_set_property (GObject *object,
 				col->priv->id = NULL;
 			break;
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -231,7 +232,7 @@ static void
 gda_column_get_property (GObject *object,
 			 guint param_id,
 			 GValue *value,
-			 G_GNUC_UNUSED GParamSpec *pspec)
+			 GParamSpec *pspec)
 {
 	GdaColumn *col;
 
@@ -242,7 +243,8 @@ gda_column_get_property (GObject *object,
 			g_value_set_string (value, col->priv->id);
 			break;
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -268,7 +270,7 @@ gda_column_new (void)
  * 	 
  * Creates a new #GdaColumn object from an existing one.
  *
- * Returns: a newly allocated #GdaColumn with a copy of the data 	 
+ * Returns: (transfer full): a newly allocated #GdaColumn with a copy of the data 	 
  * in @column. 	 
  */ 	 
 GdaColumn * 	 
diff --git a/libgda/gda-config.c b/libgda/gda-config.c
index f5503c3..86c629c 100644
--- a/libgda/gda-config.c
+++ b/libgda/gda-config.c
@@ -527,7 +527,7 @@ gda_config_constructor (GType type,
 
 			if (!g_file_test (confdir, G_FILE_TEST_EXISTS)) {
 				gchar *old_path;
-				old_path = g_build_path (G_DIR_SEPARATOR_S, g_get_home_dir (), ".libgda", NULL);
+				old_path = g_build_path (G_DIR_SEPARATOR_S, g_get_home_dir (), ".libgda", NULL); /* Flawfinder: ignore */
 				if (g_file_test (old_path, G_FILE_TEST_EXISTS)) {
 					/* using $HOME/.libgda because it exists */
 					g_free (confdir);
@@ -616,7 +616,7 @@ gda_config_constructor (GType type,
 		unique_instance->priv->system_config_allowed = FALSE;
 		if (unique_instance->priv->system_file) {
 			FILE *file;
-                        file = fopen (unique_instance->priv->system_file, "a");
+                        file = fopen (unique_instance->priv->system_file, "a");  /* Flawfinder: ignore */
                         if (file) {
                                 unique_instance->priv->system_config_allowed = TRUE;
                                 fclose (file);
@@ -731,7 +731,7 @@ static void
 gda_config_set_property (GObject *object,
 			 guint param_id,
 			 const GValue *value,
-			 G_GNUC_UNUSED GParamSpec *pspec)
+			 GParamSpec *pspec)
 {
 	GdaConfig *conf;
 
@@ -750,6 +750,9 @@ gda_config_set_property (GObject *object,
 			if (g_value_get_string (value))
 				conf->priv->system_file = g_strdup (g_value_get_string (value));
                         break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}	
 	}
 }
@@ -758,7 +761,7 @@ static void
 gda_config_get_property (GObject *object,
 			 guint param_id,
 			 GValue *value,
-			 G_GNUC_UNUSED GParamSpec *pspec)
+			 GParamSpec *pspec)
 {
 	GdaConfig *conf;
 	
@@ -771,6 +774,9 @@ gda_config_get_property (GObject *object,
 		case PROP_SYSTEM_FILE:
 			g_value_set_string (value, conf->priv->system_file);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}	
 }
@@ -1089,7 +1095,7 @@ gda_config_dsn_needs_authentication (const gchar *dsn_name)
  *  <listitem><para>Username if it exists</para></listitem>
  * </itemizedlist>
  *
- * Returns: a new #GdaDataModel
+ * Returns: (transfer full): a new #GdaDataModel
  */
 GdaDataModel *
 gda_config_list_dsn (void)
@@ -1311,7 +1317,7 @@ gda_config_get_provider (const gchar *provider_name, GError **error)
  *  <listitem><para>File name of the plugin</para></listitem>
  * </itemizedlist>
  *
- * Returns: a new #GdaDataModel
+ * Returns: (transfer full): a new #GdaDataModel
  */
 GdaDataModel *
 gda_config_list_providers (void)
diff --git a/libgda/gda-connection.c b/libgda/gda-connection.c
index dc93bd7..75fa8d7 100644
--- a/libgda/gda-connection.c
+++ b/libgda/gda-connection.c
@@ -380,7 +380,7 @@ gda_connection_class_init (GdaConnectionClass *klass)
 	if (debug_level == -1) {
 		const gchar *str;
 		debug_level = 0;
-		str = getenv ("GDA_CONNECTION_EVENTS_SHOW");
+		str = getenv ("GDA_CONNECTION_EVENTS_SHOW"); /* Flawfinder: ignore */
 		if (str) {
 			gchar **array;
 			guint i;
@@ -792,7 +792,7 @@ static void
 gda_connection_get_property (GObject *object,
 			     guint param_id,
 			     GValue *value,
-			     G_GNUC_UNUSED GParamSpec *pspec)
+			     GParamSpec *pspec)
 {
 	GdaConnection *cnc;
 
@@ -827,6 +827,9 @@ gda_connection_get_property (GObject *object,
 		case PROP_EVENTS_HISTORY_SIZE:
 			g_value_set_int (value, cnc->priv->events_array_size);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }	
 }
@@ -850,12 +853,13 @@ cnc_task_new (guint id, GdaStatement *stmt, GdaStatementModelUsage model_usage,
 	task->model_usage = model_usage;
 	if (col_types) {
 		gint i;
-		for (i = 0; ; i++) {
+		for (i = 0; i < 32768; i++) {
 			if (col_types [i] == G_TYPE_NONE)
 				break;
 		}
-		task->col_types = g_new (GType, i+1);
-		memcpy (task->col_types, col_types, (i+1) * sizeof (GType));
+		i++;
+		task->col_types = g_new (GType, i);
+		memcpy (task->col_types, col_types, i * sizeof (GType)); /* Flawfinder: ignore */
 	}
 	if (params)
 		task->params = gda_set_copy (params);
@@ -945,7 +949,7 @@ _gda_connection_get_internal_thread_provider (void)
  * This method may fail with a GDA_CONNECTION_ERROR domain error (see the #GdaConnectionError error codes) 
  * or a %GDA_CONFIG_ERROR domain error (see the #GdaConfigError error codes).
  *
- * Returns: a new #GdaConnection if connection opening was sucessfull or %NULL if there was an error.
+ * Returns: (transfer full) (allow-none): a new #GdaConnection if connection opening was sucessfull or %NULL if there was an error.
  */
 GdaConnection *
 gda_connection_open_from_dsn (const gchar *dsn, const gchar *auth_string, 
@@ -1099,7 +1103,7 @@ gda_connection_open_from_dsn (const gchar *dsn, const gchar *auth_string,
  * This method may fail with a GDA_CONNECTION_ERROR domain error (see the #GdaConnectionError error codes) 
  * or a %GDA_CONFIG_ERROR domain error (see the #GdaConfigError error codes).
  *
- * Returns: a new #GdaConnection if connection opening was sucessfull or %NULL if there was an error.
+ * Returns: (transfer full) (allow-none): a new #GdaConnection if connection opening was sucessfull or %NULL if there was an error.
  */
 GdaConnection *
 gda_connection_open_from_string (const gchar *provider_name, const gchar *cnc_string, const gchar *auth_string,
@@ -1200,6 +1204,7 @@ gda_connection_open_from_string (const gchar *provider_name, const gchar *cnc_st
 		}
 	}
 
+	g_free (real_auth_string);
 	g_free (real_cnc);
 	g_free (user);
 	g_free (pass);
@@ -1264,8 +1269,7 @@ sqlite_connection_closed_cb (GdaConnection *cnc, G_GNUC_UNUSED gpointer data)
 
 /**
  * gda_connection_open_sqlite:
- * @cnc_string: a connection string
- * @directory: the directory the database file will be in, or %NULL for the default TMP directory
+ * @directory: (allow-none): the directory the database file will be in, or %NULL for the default TMP directory
  * @filename: the database file name
  * @auto_unlink: if %TRUE, then the database file will be removed afterwards
  *
@@ -1273,7 +1277,7 @@ sqlite_connection_closed_cb (GdaConnection *cnc, G_GNUC_UNUSED gpointer data)
  * to be used by database providers which need a temporary database to store
  * some information.
  *
- * Returns: a new #GdaConnection, or %NULL if an error occurred
+ * Returns: (transfer full) (allow-none): a new #GdaConnection, or %NULL if an error occurred
  */
 GdaConnection *
 gda_connection_open_sqlite (const gchar *directory, const gchar *filename, gboolean auto_unlink)
@@ -1283,7 +1287,7 @@ gda_connection_open_sqlite (const gchar *directory, const gchar *filename, gbool
 	gint fd;
 
 	if (!directory)
-		directory = g_get_tmp_dir();
+		directory = g_get_tmp_dir(); /* Flawfinder: ignore */
 	else
 		g_return_val_if_fail (*directory, NULL);
 	g_return_val_if_fail (filename && *filename, NULL);
@@ -1739,7 +1743,7 @@ gda_connection_get_authentication (GdaConnection *cnc)
 }
 
 /**
- * gda_connection_point_available_event
+ * gda_connection_point_available_event:
  * @cnc: a #GdaConnection object
  * @type: a #GdaConnectionEventType
  *
@@ -1748,7 +1752,7 @@ gda_connection_get_authentication (GdaConnection *cnc)
  * for gda_connection_event_new() which improves performances by reusing as much as possible
  * #GdaConnectionEvent objects. Newly written database providers should use this method.
  *
- * Returns: (transfer full): a pointer to the next available connection event, or %NULL if event should
+ * Returns: (transfer full) (allow-none): a pointer to the next available connection event, or %NULL if event should
  * be ignored
  *
  * Since: 4.2
@@ -1895,7 +1899,7 @@ gda_connection_add_event_string (GdaConnection *cnc, const gchar *str, ...)
 
 	/* build the message string */
 	va_start (args, str);
-	vsprintf (sz, str, args);
+	g_vsnprintf (sz, 2048, str, args);
 	va_end (args);
 	
 	error = gda_connection_point_available_event (cnc, GDA_CONNECTION_EVENT_ERROR);
@@ -1945,7 +1949,7 @@ gda_connection_clear_events_list (GdaConnection *cnc)
  * to perform the type type of action. It is a wrapper around the gda_server_provider_create_operation()
  * method.
  *
- * Returns: a new #GdaServerOperation object, or %NULL in the connection's provider does not support the @type type
+ * Returns: (transfer full) (allow-none): a new #GdaServerOperation object, or %NULL in the connection's provider does not support the @type type
  * of operation or if an error occurred
  */
 GdaServerOperation*
@@ -1993,7 +1997,7 @@ gda_connection_perform_operation (GdaConnection *cnc, GdaServerOperation *op, GE
  * then %NULL is returned, and a general SQL parser can be obtained
  * using gda_sql_parser_new().
  *
- * Returns: a new #GdaSqlParser object, or %NULL
+ * Returns: (transfer full) (allow-none): a new #GdaSqlParser object, or %NULL
  */
 GdaSqlParser *
 gda_connection_create_parser (GdaConnection *cnc)
@@ -2051,7 +2055,7 @@ change_events_array_max_size (GdaConnection *cnc, gint size)
  * the list of #GObject created by the correct execution of the previous statements. If a transaction is required,
  * then it should be started before calling this method.
  *
- * Returns: (element-type GObject): a new list of #GObject objects
+ * Returns: (transfer full) (element-type GObject): a new list of #GObject objects
  */
 GSList *
 gda_connection_batch_execute (GdaConnection *cnc, GdaBatch *batch, GdaSet *params,
@@ -2446,7 +2450,7 @@ gda_connection_async_statement_execute (GdaConnection *cnc, GdaStatement *stmt,
  * would have if the statement had been
  * executed synchronously.
  *
- * Returns: a #GObject, or %NULL if an error occurred
+ * Returns: (transfer full) (allow-none): a #GObject, or %NULL if an error occurred
  *
  * Since: 4.2
  */
@@ -2685,7 +2689,7 @@ gda_connection_statement_execute_v (GdaConnection *cnc, GdaStatement *stmt, GdaS
  * Also see the <link linkend="limitations">provider's limitations</link>, and the
  * <link linkend="data-select">Advanced GdaDataSelect usage</link> sections.
  *
- * Returns: a #GObject, or %NULL if an error occurred 
+ * Returns: (transfer full) (allow-none): a #GObject, or %NULL if an error occurred 
  */
 GObject *
 gda_connection_statement_execute (GdaConnection *cnc, GdaStatement *stmt, GdaSet *params, 
@@ -2793,7 +2797,7 @@ gda_connection_statement_execute_non_select (GdaConnection *cnc, GdaStatement *s
  * See the documentation of the gda_connection_statement_execute() for information
  * about the @params list of parameters.
  *
- * Returns: a #GdaDataModel containing the data returned by the
+ * Returns: (transfer full) (allow-none): a #GdaDataModel containing the data returned by the
  * data source, or %NULL if an error occurred
  */
 GdaDataModel *
@@ -2840,7 +2844,7 @@ gda_connection_statement_execute_select (GdaConnection *cnc, GdaStatement *stmt,
  * See the documentation of the gda_connection_statement_execute() for information
  * about the @params list of parameters.
  *
- * Returns: a #GdaDataModel containing the data returned by the
+ * Returns: (transfer full) (allow-none): a #GdaDataModel containing the data returned by the
  * data source, or %NULL if an error occurred
  */
 GdaDataModel *
@@ -2918,7 +2922,7 @@ gda_connection_statement_execute_select_fullv (GdaConnection *cnc, GdaStatement
  * See the documentation of the gda_connection_statement_execute() for information
  * about the @params list of parameters.
  *
- * Returns: a #GdaDataModel containing the data returned by the
+ * Returns: (transfer full) (allow-none): a #GdaDataModel containing the data returned by the
  * data source, or %NULL if an error occurred
  */
 GdaDataModel *
@@ -4105,6 +4109,8 @@ suggest_update_cb_downstream (G_GNUC_UNUSED GdaMetaStore *store, GdaMetaContext
 
 	GdaMetaContext *templ_context;
 	GdaMetaContext loc_suggest;
+	gchar *column_names[MAX_CONTEXT_SIZE];
+	GValue *column_values[MAX_CONTEXT_SIZE];
 
 	/* if there is no context with the same table name in the templates, then exit right now */
 	templ_context = g_hash_table_lookup (data->context_templates_hash, suggest->table_name);
@@ -4113,9 +4119,6 @@ suggest_update_cb_downstream (G_GNUC_UNUSED GdaMetaStore *store, GdaMetaContext
 	
 	if (templ_context->size > 0) {
 		/* setup @loc_suggest */
-
-		gchar *column_names[MAX_CONTEXT_SIZE];
-		GValue *column_values[MAX_CONTEXT_SIZE];
 		gint i, j;
 
 		if (suggest->size > MAX_CONTEXT_SIZE) {
@@ -4127,8 +4130,8 @@ suggest_update_cb_downstream (G_GNUC_UNUSED GdaMetaStore *store, GdaMetaContext
 		loc_suggest.table_name = suggest->table_name;
 		loc_suggest.column_names = column_names;
 		loc_suggest.column_values = column_values;
-		memcpy (loc_suggest.column_names, suggest->column_names, sizeof (gchar *) * suggest->size);
-		memcpy (loc_suggest.column_values, suggest->column_values, sizeof (GValue *) * suggest->size);	
+		memcpy (loc_suggest.column_names, suggest->column_names, sizeof (gchar *) * suggest->size); /* Flawfinder: ignore */
+		memcpy (loc_suggest.column_values, suggest->column_values, sizeof (GValue *) * suggest->size); /* Flawfinder: ignore */
 		
 		/* check that any @suggest's columns which is in @templ_context's has the same values */
 		for (j = 0; j < suggest->size; j++) {
@@ -4648,7 +4651,7 @@ prepare_meta_statements_hash (void)
  * meta data section about SQL identifiers</link> for more information, and the documentation about the
  * gda_sql_identifier_quote() function which will be most useful.
  * 
- * Returns: a #GdaDataModel containing the data required. The caller is responsible
+ * Returns: (transfer full): a #GdaDataModel containing the data required. The caller is responsible
  * for freeing the returned model using g_object_unref().
  */
 GdaDataModel *
@@ -4701,7 +4704,7 @@ gda_connection_get_meta_store_data (GdaConnection *cnc,
  *
  * see #gda_connection_get_meta_store_data
  * 
- * Returns: a #GdaDataModel containing the data required. The caller is responsible
+ * Returns: (transfer full): a #GdaDataModel containing the data required. The caller is responsible
  * for freeing the returned model using g_object_unref().
  */
 GdaDataModel *
@@ -4842,8 +4845,8 @@ gda_connection_value_to_sql_string (GdaConnection *cnc, GValue *from)
 /**
  * gda_connection_internal_transaction_started: (skip)
  * @cnc: a #GdaConnection
- * @parent_trans: (allow-null): name of the parent transaction, or %NULL
- * @trans_name: (allow-null): transaction's name, or %NULL
+ * @parent_trans: name of the parent transaction, or %NULL
+ * @trans_name: transaction's name, or %NULL
  * @isol_level: isolation level.
  *
  * Internal functions to be called by database providers when a transaction has been started
@@ -4892,7 +4895,7 @@ gda_connection_internal_transaction_started (GdaConnection *cnc, const gchar *pa
 /**
  * gda_connection_internal_transaction_rolledback: (skip)
  * @cnc: a #GdaConnection
- * @trans_name: (allow-null): transaction's name, or %NULL
+ * @trans_name: transaction's name, or %NULL
  *
  * Internal functions to be called by database providers when a transaction has been rolled
  * back to keep track of the transaction status of the connection
@@ -4945,7 +4948,7 @@ gda_connection_internal_transaction_rolledback (GdaConnection *cnc, const gchar
 /**
  * gda_connection_internal_transaction_committed: (skip)
  * @cnc: a #GdaConnection
- * @trans_name: (allow-null): transaction's name, or %NULL
+ * @trans_name: transaction's name, or %NULL
  *
  * Internal functions to be called by database providers when a transaction has been committed
  * to keep track of the transaction status of the connection
@@ -4998,8 +5001,8 @@ gda_connection_internal_transaction_committed (GdaConnection *cnc, const gchar *
 /**
  * gda_connection_internal_savepoint_added: (skip)
  * @cnc: a #GdaConnection
- * @parent_trans: (allow-null): name of the parent transaction, or %NULL
- * @svp_name: (allow-null): savepoint's name, or %NULL
+ * @parent_trans: name of the parent transaction, or %NULL
+ * @svp_name: savepoint's name, or %NULL
  *
  * Internal functions to be called by database providers when a savepoint has been added
  * to keep track of the transaction status of the connection
@@ -5042,7 +5045,7 @@ gda_connection_internal_savepoint_added (GdaConnection *cnc, const gchar *parent
 /**
  * gda_connection_internal_savepoint_rolledback: (skip)
  * @cnc: a #GdaConnection
- * @svp_name: (allow-null): savepoint's name, or %NULL
+ * @svp_name: savepoint's name, or %NULL
  *
  * Internal functions to be called by database providers when a savepoint has been rolled back
  * to keep track of the transaction status of the connection
@@ -5086,7 +5089,7 @@ gda_connection_internal_savepoint_rolledback (GdaConnection *cnc, const gchar *s
 /**
  * gda_connection_internal_savepoint_removed: (skip)
  * @cnc: a #GdaConnection
- * @svp_name: (allow-null): savepoint's name, or %NULL
+ * @svp_name: savepoint's name, or %NULL
  *
  * Internal functions to be called by database providers when a savepoint has been removed
  * to keep track of the transaction status of the connection
@@ -5131,7 +5134,7 @@ gda_connection_internal_savepoint_removed (GdaConnection *cnc, const gchar *svp_
  * gda_connection_internal_statement_executed: (skip)
  * @cnc: a #GdaConnection
  * @stmt: a #GdaStatement which has been executed
- * @params: (allow-null): execution's parameters
+ * @params: execution's parameters
  * @error: a #GdaConnectionEvent if the execution failed, or %NULL
  *
  * Internal functions to be called by database providers when a statement has been executed
@@ -5434,7 +5437,7 @@ gda_connection_internal_get_provider_data (GdaConnection *cnc)
  *
  * Get or initializes the #GdaMetaStore associated to @cnc
  *
- * Returns: a #GdaMetaStore object
+ * Returns: (transfer full): a #GdaMetaStore object
  */
 GdaMetaStore *
 gda_connection_get_meta_store (GdaConnection *cnc)
diff --git a/libgda/gda-data-access-wrapper.c b/libgda/gda-data-access-wrapper.c
index 6a0fac7..3590711 100644
--- a/libgda/gda-data-access-wrapper.c
+++ b/libgda/gda-data-access-wrapper.c
@@ -282,7 +282,7 @@ static void
 gda_data_access_wrapper_set_property (GObject *object,
 				      guint param_id,
 				      const GValue *value,
-				      G_GNUC_UNUSED GParamSpec *pspec)
+				      GParamSpec *pspec)
 {
 	GdaDataAccessWrapper *model;
 
@@ -324,7 +324,7 @@ gda_data_access_wrapper_set_property (GObject *object,
 			break;
 		}
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
 	}
@@ -334,7 +334,7 @@ static void
 gda_data_access_wrapper_get_property (GObject *object,
 					guint param_id,
 					GValue *value,
-					G_GNUC_UNUSED GParamSpec *pspec)
+					GParamSpec *pspec)
 {
 	GdaDataAccessWrapper *model;
 
@@ -345,7 +345,7 @@ gda_data_access_wrapper_get_property (GObject *object,
 			g_value_set_object (value, G_OBJECT (model->priv->model));
 			break;
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
 	}
@@ -358,7 +358,7 @@ gda_data_access_wrapper_get_property (GObject *object,
  * Creates a new #GdaDataModel object which buffers the rows of @model. This object is useful
  * only if @model can only be accessed using cursor based method.
  *
- * Returns: a pointer to the newly created #GdaDataModel.
+ * Returns: (transfer full): a pointer to the newly created #GdaDataModel.
  */
 GdaDataModel *
 gda_data_access_wrapper_new (GdaDataModel *model)
diff --git a/libgda/gda-data-comparator.c b/libgda/gda-data-comparator.c
index 03cbd2c..7d3dc03 100644
--- a/libgda/gda-data-comparator.c
+++ b/libgda/gda-data-comparator.c
@@ -261,7 +261,7 @@ static void
 gda_data_comparator_set_property (GObject *object,
 				  guint param_id,
 				  const GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
 	GdaDataComparator *comparator;
 	comparator = GDA_DATA_COMPARATOR (object);
@@ -295,6 +295,9 @@ gda_data_comparator_set_property (GObject *object,
 			if (model)
 				g_object_ref (model);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -303,7 +306,7 @@ static void
 gda_data_comparator_get_property (GObject *object,
 				  guint param_id,
 				  GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
 	GdaDataComparator *comparator;
 
@@ -316,6 +319,9 @@ gda_data_comparator_get_property (GObject *object,
 		case PROP_NEW_MODEL:
 			g_value_set_object (value, comparator->priv->new_model);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -346,8 +352,8 @@ gda_data_comparator_set_key_columns (GdaDataComparator *comp, const gint *col_nu
 	comp->priv->key_columns = NULL;
 	if (nb_cols > 0) {
 		comp->priv->nb_key_columns = nb_cols;
-		comp->priv->key_columns = g_new0 (gint, nb_cols);
-		memcpy (comp->priv->key_columns, col_numbers, sizeof (gint) * nb_cols);
+		comp->priv->key_columns = g_new (gint, nb_cols);
+		memcpy (comp->priv->key_columns, col_numbers, sizeof (gint) * nb_cols); /* Flawfinder: ignore */
 	}
 }
 
diff --git a/libgda/gda-data-handler.c b/libgda/gda-data-handler.c
index e68c013..585392e 100644
--- a/libgda/gda-data-handler.c
+++ b/libgda/gda-data-handler.c
@@ -1,6 +1,6 @@
 /* gda-data-handler.c
  *
- * Copyright (C) 2003 - 2006 Vivien Malerba
+ * Copyright (C) 2003 - 2010 Vivien Malerba
  *
  * This Library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public License as
@@ -66,7 +66,7 @@ gda_data_handler_iface_init (G_GNUC_UNUSED gpointer g_class)
 }
 
 /**
- * gda_data_handler_get_sql_from_value
+ * gda_data_handler_get_sql_from_value:
  * @dh: an object which implements the #GdaDataHandler interface
  * @value: the value to be converted to a string
  *
@@ -78,7 +78,7 @@ gda_data_handler_iface_init (G_GNUC_UNUSED gpointer g_class)
  *
  * If the value is NULL or is of type GDA_TYPE_NULL, the returned string is "NULL".
  *
- * Returns: the new string, or %NULL if an error occurred
+ * Returns: (transfer full): the new string, or %NULL if an error occurred
  */
 gchar *
 gda_data_handler_get_sql_from_value (GdaDataHandler *dh, const GValue *value)
@@ -96,7 +96,7 @@ gda_data_handler_get_sql_from_value (GdaDataHandler *dh, const GValue *value)
 }
 
 /**
- * gda_data_handler_get_str_from_value
+ * gda_data_handler_get_str_from_value:
  * @dh: an object which implements the #GdaDataHandler interface
  * @value: the value to be converted to a string
  *
@@ -104,7 +104,7 @@ gda_data_handler_get_sql_from_value (GdaDataHandler *dh, const GValue *value)
  * (in the user's locale, specially for the dates). If the value is 
  * NULL or is of type GDA_TYPE_NULL, the returned string is a copy of "" (empty string).
  *
- * Returns: the new string, or %NULL if an error occurred
+ * Returns: (transfer full): the new string, or %NULL if an error occurred
  */
 gchar *
 gda_data_handler_get_str_from_value (GdaDataHandler *dh, const GValue *value)
@@ -122,7 +122,7 @@ gda_data_handler_get_str_from_value (GdaDataHandler *dh, const GValue *value)
 }
 
 /**
- * gda_data_handler_get_value_from_sql
+ * gda_data_handler_get_value_from_sql:
  * @dh: an object which implements the #GdaDataHandler interface
  * @sql: an SQL string
  * @type: a GType
@@ -131,11 +131,11 @@ gda_data_handler_get_str_from_value (GdaDataHandler *dh, const GValue *value)
  * the opposite of the function gda_data_handler_get_sql_from_value(). The type argument
  * is used to determine the real data type requested for the returned value.
  *
- * If the sql string is NULL, then the returned GValue is of type GDA_TYPE_NULL;
- * if the sql string does not correspond to a valid SQL string for the requested type, then
- * the "NULL" string is returned.
+ * If the @sql string is %NULL, then the returned GValue is of type GDA_TYPE_NULL;
+ * if the @sql string does not correspond to a valid SQL string for the requested type, then
+ * the %NULL is returned.
  *
- * Returns: the new GValue or NULL on error
+ * Returns: (transfer full): the new #GValue or %NULL on error
  */
 GValue *
 gda_data_handler_get_value_from_sql (GdaDataHandler *dh, const gchar *sql, GType type)
@@ -154,20 +154,20 @@ gda_data_handler_get_value_from_sql (GdaDataHandler *dh, const gchar *sql, GType
 
 
 /**
- * gda_data_handler_get_value_from_str
+ * gda_data_handler_get_value_from_str:
  * @dh: an object which implements the #GdaDataHandler interface
  * @str: a string
  * @type: a GType
  *
- * Creates a new GValue which represents the STR value given as argument. This is
+ * Creates a new GValue which represents the @str value given as argument. This is
  * the opposite of the function gda_data_handler_get_str_from_value(). The type argument
  * is used to determine the real data type requested for the returned value.
  *
- * If the str string is NULL, then the returned GValue is of type GDA_TYPE_NULL;
- * if the str string does not correspond to a valid STR string for the requested type, then
- * NULL is returned.
+ * If the @str string is %NULL, then the returned GValue is of type GDA_TYPE_NULL;
+ * if the @str string does not correspond to a valid string for the requested type, then
+ * %NULL is returned.
  *
- * Returns: the new GValue or NULL on error
+ * Returns: (transfer full): the new #GValue or %NULL on error
  */
 GValue *
 gda_data_handler_get_value_from_str (GdaDataHandler *dh, const gchar *str, GType type)
@@ -192,14 +192,14 @@ gda_data_handler_get_value_from_str (GdaDataHandler *dh, const gchar *str, GType
 
 
 /**
- * gda_data_handler_get_sane_init_value
+ * gda_data_handler_get_sane_init_value:
  * @dh: an object which implements the #GdaDataHandler interface
- * @type: a GTYpe
+ * @type: a #GType
  *
  * Creates a new GValue which holds a sane initial value to be used if no value is specifically
  * provided. For example for a simple string, this would return a new value containing the "" string.
  *
- * Returns: the new GValue, or %NULL if no such value can be created.
+ * Returns: (transfer full): the new #GValue, or %NULL if no such value can be created.
  */
 GValue *
 gda_data_handler_get_sane_init_value (GdaDataHandler *dh, GType type)
@@ -214,13 +214,13 @@ gda_data_handler_get_sane_init_value (GdaDataHandler *dh, GType type)
 }
 
 /**
- * gda_data_handler_accepts_g_type
+ * gda_data_handler_accepts_g_type:
  * @dh: an object which implements the #GdaDataHandler interface
  * @type: a #GType
  *
  * Checks wether the GdaDataHandler is able to handle the gda type given as argument.
  *
- * Returns: TRUE if the gda type can be handled
+ * Returns: %TRUE if the gda type can be handled
  */
 gboolean
 gda_data_handler_accepts_g_type (GdaDataHandler *dh, GType type)
@@ -234,12 +234,12 @@ gda_data_handler_accepts_g_type (GdaDataHandler *dh, GType type)
 }
 
 /**
- * gda_data_handler_get_descr
+ * gda_data_handler_get_descr:
  * @dh: an object which implements the #GdaDataHandler interface
  *
  * Get a short description of the GdaDataHandler
  *
- * Returns: the description
+ * Returns: (transfer none): the description
  */
 const gchar *
 gda_data_handler_get_descr (GdaDataHandler *dh)
diff --git a/libgda/gda-data-meta-wrapper.c b/libgda/gda-data-meta-wrapper.c
index ae25184..02b9894 100644
--- a/libgda/gda-data-meta-wrapper.c
+++ b/libgda/gda-data-meta-wrapper.c
@@ -275,7 +275,7 @@ static void
 gda_data_meta_wrapper_set_property (GObject *object,
 				      guint param_id,
 				      const GValue *value,
-				      G_GNUC_UNUSED GParamSpec *pspec)
+				      GParamSpec *pspec)
 {
 	GdaDataMetaWrapper *model;
 
@@ -301,7 +301,7 @@ gda_data_meta_wrapper_set_property (GObject *object,
 			break;
 		}
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
 	}
@@ -311,7 +311,7 @@ static void
 gda_data_meta_wrapper_get_property (GObject *object,
 					guint param_id,
 					GValue *value,
-					G_GNUC_UNUSED GParamSpec *pspec)
+					GParamSpec *pspec)
 {
 	GdaDataMetaWrapper *model;
 
@@ -322,7 +322,7 @@ gda_data_meta_wrapper_get_property (GObject *object,
 			g_value_set_object (value, G_OBJECT (model->priv->model));
 			break;
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
 	}
@@ -338,7 +338,8 @@ gda_data_meta_wrapper_get_property (GObject *object,
  * Returns: a pointer to the newly created #GdaDataModel.
  */
 GdaDataModel *
-_gda_data_meta_wrapper_new (GdaDataModel *model, gboolean reusable, gint *cols, gint size, GdaSqlIdentifierStyle mode,
+_gda_data_meta_wrapper_new (GdaDataModel *model, gboolean reusable, gint *cols,
+			    gint size, GdaSqlIdentifierStyle mode,
 			    GdaSqlReservedKeywordsFunc reserved_keyword_func)
 {
 	GdaDataMetaWrapper *retmodel;
@@ -348,8 +349,8 @@ _gda_data_meta_wrapper_new (GdaDataModel *model, gboolean reusable, gint *cols,
 	retmodel = g_object_new (GDA_TYPE_DATA_META_WRAPPER,
 				 "model", model, NULL);
 			      
-	retmodel->priv->cols_to_wrap = g_new0 (gint, size);
-	memcpy (retmodel->priv->cols_to_wrap, cols, sizeof (gint) * size);
+	retmodel->priv->cols_to_wrap = g_new (gint, size);
+	memcpy (retmodel->priv->cols_to_wrap, cols, sizeof (gint) * size); /* Flawfinder: ignore */
 	retmodel->priv->cols_to_wrap_size = size;
 	retmodel->priv->mode = mode;
 	retmodel->priv->reserved_keyword_func = reserved_keyword_func;
diff --git a/libgda/gda-data-model-array.c b/libgda/gda-data-model-array.c
index d659e7b..4cc00ea 100644
--- a/libgda/gda-data-model-array.c
+++ b/libgda/gda-data-model-array.c
@@ -271,7 +271,7 @@ gda_data_model_array_get_property (GObject *object, guint prop_id, GValue *value
  * Creates a new #GdaDataModel object without initializing the column
  * types. Using gda_data_model_array_new_with_g_types() is usually better.
  *
- * Returns: a pointer to the newly created #GdaDataModel.
+ * Returns: (transfer full): a pointer to the newly created #GdaDataModel.
  */
 GdaDataModel *
 gda_data_model_array_new (gint cols)
@@ -290,7 +290,7 @@ gda_data_model_array_new (gint cols)
  * Creates a new #GdaDataModel object with the column types as
  * specified.
  *
- * Returns: a pointer to the newly created #GdaDataModel.
+ * Returns: (transfer full): a pointer to the newly created #GdaDataModel.
  */
 GdaDataModel *
 gda_data_model_array_new_with_g_types (gint cols, ...)
@@ -323,7 +323,7 @@ gda_data_model_array_new_with_g_types (gint cols, ...)
  *
  * Makes a copy of @src into a new #GdaDataModelArray object
  *
- * Returns: a new data model, or %NULL if an error occurred
+ * Returns: (transfer full) (allow-none): a new data model, or %NULL if an error occurred
  */
 GdaDataModelArray *
 gda_data_model_array_copy_model (GdaDataModel *src, GError **error)
diff --git a/libgda/gda-data-model-bdb.c b/libgda/gda-data-model-bdb.c
index 82d5475..4d8da52 100644
--- a/libgda/gda-data-model-bdb.c
+++ b/libgda/gda-data-model-bdb.c
@@ -21,9 +21,6 @@
  * Boston, MA 02111-1307, USA.
  */
 
-#ifdef USING_MINGW
-#define _NO_OLDNAMES
-#endif
 #include <string.h>
 #include <glib/gi18n-lib.h>
 #include <libgda/gda-data-model.h>
@@ -325,7 +322,7 @@ static void
 gda_data_model_bdb_set_property (GObject *object,
 				 guint param_id,
 				 const GValue *value,
-				 G_GNUC_UNUSED GParamSpec *pspec)
+				 GParamSpec *pspec)
 {
         GdaDataModelBdb *model;
         const gchar *string;
@@ -352,6 +349,9 @@ gda_data_model_bdb_set_property (GObject *object,
 				model->priv->db_name = g_strdup (string);
 			model->priv->db_name_set = TRUE;
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 
@@ -373,7 +373,7 @@ gda_data_model_bdb_set_property (GObject *object,
 		}
 		
 		model->priv->dbp = dbp;
-		ret = dbp->open (dbp,
+		ret = dbp->open (dbp, /* Flawfinder: ignore */
 #if BDB_VERSION >= 40124 
 				 NULL,
 #endif
@@ -441,7 +441,7 @@ static void
 gda_data_model_bdb_get_property (GObject *object,
                                     guint param_id,
                                     GValue *value,
-                                    G_GNUC_UNUSED GParamSpec *pspec)
+                                    GParamSpec *pspec)
 {
         GdaDataModelBdb *model;
 
@@ -454,6 +454,9 @@ gda_data_model_bdb_get_property (GObject *object,
                 case PROP_DB_NAME:
 			g_value_set_string (value, model->priv->db_name);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
diff --git a/libgda/gda-data-model-dir.c b/libgda/gda-data-model-dir.c
index 1687e11..6dd9f4b 100644
--- a/libgda/gda-data-model-dir.c
+++ b/libgda/gda-data-model-dir.c
@@ -297,7 +297,7 @@ static void
 gda_data_model_dir_set_property (GObject *object,
 				 guint param_id,
 				 const GValue *value,
-				 G_GNUC_UNUSED GParamSpec *pspec)
+				 GParamSpec *pspec)
 {
         GdaDataModelDir *model;
         const gchar *string;
@@ -314,6 +314,9 @@ gda_data_model_dir_set_property (GObject *object,
 			if (string) 
 				model->priv->basedir = g_strdup (string);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 
 		if (model->priv->basedir) {
@@ -501,7 +504,7 @@ update_file_md5sum (FileRow *row, const gchar *complete_filename)
 	length = g_value_get_uint (row->size_value);
 	if (length == 0)
 		goto md5end;
-	fd = open (complete_filename, O_RDONLY);
+	fd = open (complete_filename, O_RDONLY); /* Flawfinder: ignore */
 	if (fd < 0)
 		goto md5end;
 #ifndef G_OS_WIN32
@@ -526,7 +529,7 @@ update_file_md5sum (FileRow *row, const gchar *complete_filename)
 
 	/* MD5 computation */
 	MD5_CTX context;
-	unsigned char digest[16];
+	unsigned char digest[16]; /* Flawfinder: ignore */
 	GString *md5str;
 	gint i;
 
@@ -640,7 +643,7 @@ static void
 gda_data_model_dir_get_property (GObject *object,
 				 guint param_id,
 				 GValue *value,
-				 G_GNUC_UNUSED GParamSpec *pspec)
+				 GParamSpec *pspec)
 {
 	GdaDataModelDir *model;
 
@@ -650,6 +653,9 @@ gda_data_model_dir_get_property (GObject *object,
 		case PROP_BASEDIR:
 			g_value_set_string (value, model->priv->basedir);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -660,7 +666,7 @@ gda_data_model_dir_get_property (GObject *object,
  *
  * Creates a new #GdaDataModel object to list all the files starting from @basedir
  *
- * Returns: a new #GdaDataModel
+ * Returns: (transfer full): a new #GdaDataModel
  */
 GdaDataModel *
 gda_data_model_dir_new (const gchar *basedir)
diff --git a/libgda/gda-data-model-import.c b/libgda/gda-data-model-import.c
index 1105be2..b913c22 100644
--- a/libgda/gda-data-model-import.c
+++ b/libgda/gda-data-model-import.c
@@ -478,7 +478,7 @@ static void
 gda_data_model_import_set_property (GObject *object,
 				    guint param_id,
 				    const GValue *value,
-				    G_GNUC_UNUSED GParamSpec *pspec)
+				    GParamSpec *pspec)
 {
 	GdaDataModelImport *model;
 	const gchar *string;
@@ -500,7 +500,7 @@ gda_data_model_import_set_property (GObject *object,
 			model->priv->src.mapped.filename = g_strdup (g_value_get_string (value));
 
 			/* file opening */
-			model->priv->src.mapped.fd = open (model->priv->src.mapped.filename, O_RDONLY);
+			model->priv->src.mapped.fd = open (model->priv->src.mapped.filename, O_RDONLY); /* Flawfinder: ignore */
 			if (model->priv->src.mapped.fd < 0) {
 				/* error */
 				add_error (model, strerror(errno));
@@ -578,7 +578,7 @@ gda_data_model_import_set_property (GObject *object,
 			}
 			return;
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
 	}
@@ -638,7 +638,7 @@ static void
 gda_data_model_import_get_property (GObject *object,
 				    guint param_id,
 				    GValue *value,
-				    G_GNUC_UNUSED GParamSpec *pspec)
+				    GParamSpec *pspec)
 {
 	GdaDataModelImport *model;
 
@@ -661,7 +661,7 @@ gda_data_model_import_get_property (GObject *object,
 				g_value_set_string (value, model->priv->src.string);
 			break;
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
 	}
@@ -689,7 +689,7 @@ gda_data_model_import_get_property (GObject *object,
  *   <listitem><para>Other formats: no option</para></listitem>
  * </itemizedlist>
  *
- * Returns: a pointer to the newly created #GdaDataModel.
+ * Returns: (transfer full): a pointer to the newly created #GdaDataModel.
  */
 GdaDataModel *
 gda_data_model_import_new_file   (const gchar *filename, gboolean random_access, GdaSet *options)
@@ -717,7 +717,7 @@ gda_data_model_import_new_file   (const gchar *filename, gboolean random_access,
  * Important note: the @data string is not copied for memory efficiency reasons and should not
  * therefore be altered in any way as long as the returned data model exists.
  *
- * Returns: a pointer to the newly created #GdaDataModel.
+ * Returns: (transfer full): a pointer to the newly created #GdaDataModel.
  */
 GdaDataModel *
 gda_data_model_import_new_mem (const gchar *data, gboolean random_access, GdaSet *options)
@@ -739,7 +739,7 @@ gda_data_model_import_new_mem (const gchar *data, gboolean random_access, GdaSet
  * Creates a new #GdaDataModel and loads the data in @node. The resulting data model
  * can be accessed in a random way.
  *
- * Returns: a pointer to the newly created #GdaDataModel.
+ * Returns: (transfer full): a pointer to the newly created #GdaDataModel.
  */
 GdaDataModel *
 gda_data_model_import_new_xml_node (xmlNodePtr node)
@@ -1170,12 +1170,16 @@ init_xml_import (GdaDataModelImport *model)
 			}
 			str = (gchar*)xmlTextReaderGetAttribute (reader, (xmlChar*)"size");
 			if (str) {
-				spec->size = atoi (str);
+				spec->size = atoi (str); /* Flawfinder: ignore */
+				if (spec->size < 0)
+					spec->size = 0;
 				xmlFree (str);
 			}
 			str = (gchar*)xmlTextReaderGetAttribute (reader, (xmlChar*)"scale");
 			if (str) {
-				spec->scale = atoi (str);
+				spec->scale = atoi (str); /* Flawfinder: ignore */
+				if (spec->scale < 0)
+					spec->scale = 0;
 				xmlFree (str);
 			}
 			str = (gchar*)xmlTextReaderGetAttribute (reader, (xmlChar*)"pkey");
@@ -1488,12 +1492,16 @@ init_node_import (GdaDataModelImport *model)
 			}
 			str = (gchar*)xmlGetProp (cur, (xmlChar*)"size");
 			if (str) {
-				spec->size = atoi (str);
+				spec->size = atoi (str); /* Flawfinder: ignore */
+				if (spec->size < 0)
+					spec->size = 0;
 				xmlFree (str);
 			}
 			str = (gchar*)xmlGetProp (cur, (xmlChar*)"scale");
 			if (str) {
-				spec->scale = atoi (str);
+				spec->scale = atoi (str); /* Flawfinder: ignore */
+				if (spec->scale < 0)
+					spec->scale = 0;
 				xmlFree (str);
 			}
 			str = (gchar*)xmlGetProp (cur, (xmlChar*)"pkey");
diff --git a/libgda/gda-data-model-iter.c b/libgda/gda-data-model-iter.c
index 883a208..bf01102 100644
--- a/libgda/gda-data-model-iter.c
+++ b/libgda/gda-data-model-iter.c
@@ -409,7 +409,7 @@ static void
 gda_data_model_iter_set_property (GObject *object,
 				  guint param_id,
 				  const GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
 	GdaDataModelIter *iter;
 
@@ -534,6 +534,9 @@ gda_data_model_iter_set_property (GObject *object,
 		case PROP_UPDATE_MODEL:
 			iter->priv->keep_param_changes = ! g_value_get_boolean (value);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -542,7 +545,7 @@ static void
 gda_data_model_iter_get_property (GObject *object,
 				  guint param_id,
 				  GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
 	GdaDataModelIter *iter = GDA_DATA_MODEL_ITER (object);
 	
@@ -558,7 +561,10 @@ gda_data_model_iter_get_property (GObject *object,
 		case PROP_UPDATE_MODEL:
 			g_value_set_boolean (value, ! iter->priv->keep_param_changes);
 			break;
-		}	
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
+		}
 	}
 }
 
diff --git a/libgda/gda-data-model.c b/libgda/gda-data-model.c
index 0533888..4e37536 100644
--- a/libgda/gda-data-model.c
+++ b/libgda/gda-data-model.c
@@ -641,7 +641,7 @@ gda_data_model_get_value_at (GdaDataModel *model, gint col, gint row, GError **e
  *
  * Note: the same limitations and usage instructions apply as for gda_data_model_get_value_at().
  *
- * Upon errors FALSE will be returned and @error will be assigned a
+ * Upon errors %NULL will be returned and @error will be assigned a
  * #GError from the #GDA_DATA_MODEL_ERROR domain.
  *
  * Returns: a #GValue containing the value stored in the given
@@ -1155,6 +1155,8 @@ gda_data_model_export_to_string (GdaDataModel *model, GdaDataModelIOFormat forma
 							g_string_append_c (retstring, quote);
 						}
 						g_string_append_c (retstring, '\n');
+						if (!cols)
+							g_free (rcols);
 					}
 				}
 				else
@@ -1480,9 +1482,13 @@ find_column_from_id (GdaDataModel *model, const gchar *colid, gint *pos)
 
 	/* if no column has been found, assumr @colid is like "_%d" where %d is a column number */
 	if (!column && (*colid == '_')) {
-		column = gda_data_model_describe_column (model, atoi (colid + 1));
-		if (column)
-			*pos = atoi (colid + 1);
+		gint i;
+		i = atoi (colid + 1); /* Flawfinder: ignore */
+		if (i >= 0) {
+			column = gda_data_model_describe_column (model, i);
+			if (column)
+				*pos = i;
+		}
 	}
 
 	return column;
@@ -2008,13 +2014,13 @@ gda_data_model_dump (GdaDataModel *model, FILE *to_stream)
 	if (!to_stream)
 		to_stream = stdout;
 
-	if (getenv ("GDA_DATA_MODEL_DUMP_ATTRIBUTES")) 
+	if (getenv ("GDA_DATA_MODEL_DUMP_ATTRIBUTES")) /* Flawfinder: ignore */
 		dump_attrs = TRUE;
-	if (getenv ("GDA_DATA_MODEL_DUMP_ROW_NUMBERS"))
+	if (getenv ("GDA_DATA_MODEL_DUMP_ROW_NUMBERS")) /* Flawfinder: ignore */
 		dump_rows = TRUE;
-	if (getenv ("GDA_DATA_MODEL_DUMP_TITLE")) 
+	if (getenv ("GDA_DATA_MODEL_DUMP_TITLE")) /* Flawfinder: ignore */
 		dump_title = TRUE;
-	if (getenv ("GDA_DATA_MODEL_NULL_AS_EMPTY")) 
+	if (getenv ("GDA_DATA_MODEL_NULL_AS_EMPTY")) /* Flawfinder: ignore */
 		null_as_empty = TRUE;
 
 	str = real_gda_data_model_dump_as_string (model, FALSE, dump_rows, dump_title, null_as_empty, &error);
@@ -2066,11 +2072,11 @@ gda_data_model_dump_as_string (GdaDataModel *model)
 
 	g_return_val_if_fail (GDA_IS_DATA_MODEL (model), NULL);
 
-	if (getenv ("GDA_DATA_MODEL_DUMP_ROW_NUMBERS"))
+	if (getenv ("GDA_DATA_MODEL_DUMP_ROW_NUMBERS")) /* Flawfinder: ignore */
 		dump_rows = TRUE;
-	if (getenv ("GDA_DATA_MODEL_DUMP_TITLE")) 
+	if (getenv ("GDA_DATA_MODEL_DUMP_TITLE")) /* Flawfinder: ignore */
 		dump_title = TRUE;
-	if (getenv ("GDA_DATA_MODEL_NULL_AS_EMPTY")) 
+	if (getenv ("GDA_DATA_MODEL_NULL_AS_EMPTY")) /* Flawfinder: ignore */
 		null_as_empty = TRUE;
 
 	return real_gda_data_model_dump_as_string (model, FALSE, dump_rows, dump_title, null_as_empty, NULL);
diff --git a/libgda/gda-data-proxy.c b/libgda/gda-data-proxy.c
index 9022c2d..901d2ee 100644
--- a/libgda/gda-data-proxy.c
+++ b/libgda/gda-data-proxy.c
@@ -759,7 +759,7 @@ static void proxied_model_reset_cb (GdaDataModel *model, GdaDataProxy *proxy);
  *
  * Creates a new proxy for @model
  *
- * Returns: a new #GdaDataProxy object
+ * Returns: (transfer full): a new #GdaDataProxy object
  */
 GObject *
 gda_data_proxy_new (GdaDataModel *model)
@@ -894,7 +894,7 @@ static void
 gda_data_proxy_set_property (GObject *object,
 			     guint param_id,
 			     const GValue *value,
-			     G_GNUC_UNUSED GParamSpec *pspec)
+			     GParamSpec *pspec)
 {
 	GdaDataProxy *proxy;
 
@@ -982,6 +982,9 @@ gda_data_proxy_set_property (GObject *object,
 				proxy->priv->chunk = NULL;
 			}
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 		gda_mutex_unlock (proxy->priv->mutex);
 	}
@@ -991,7 +994,7 @@ static void
 gda_data_proxy_get_property (GObject *object,
 			     guint param_id,
 			     GValue *value,
-			     G_GNUC_UNUSED GParamSpec *pspec)
+			     GParamSpec *pspec)
 {
 	GdaDataProxy *proxy;
 
@@ -1008,6 +1011,9 @@ gda_data_proxy_get_property (GObject *object,
 		case PROP_SAMPLE_SIZE:
 			g_value_set_int (value, proxy->priv->sample_size);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 		gda_mutex_unlock (proxy->priv->mutex);
 	}
@@ -2877,7 +2883,7 @@ sql_where_foreach (GdaSqlAnyPart *part, GdaDataProxy *proxy, G_GNUC_UNUSED GErro
 				if (!*ptr) {
 					/* column name is "_<number>", use column: <number> - 1 */
 					gint colnum;
-					colnum = atoi (cstr+1) - 1;
+					colnum = atoi (cstr+1) - 1; /* Flawfinder: ignore */
 					if (colnum >= 0) {
 						GdaColumn *col = gda_data_model_describe_column ((GdaDataModel*) proxy,
 												 colnum);
diff --git a/libgda/gda-data-select.c b/libgda/gda-data-select.c
index 32d2457..2e7f7b9 100644
--- a/libgda/gda-data-select.c
+++ b/libgda/gda-data-select.c
@@ -621,7 +621,7 @@ static void
 gda_data_select_set_property (GObject *object,
 			 guint param_id,
 			 const GValue *value,
-			 G_GNUC_UNUSED GParamSpec *pspec)
+			 GParamSpec *pspec)
 {
 	GdaDataSelect *model = (GdaDataSelect *) object;
 	if (model->priv) {
@@ -701,6 +701,7 @@ gda_data_select_set_property (GObject *object,
 			model->priv->sh->reset_with_ext_params_change = g_value_get_boolean (value);
 			break;
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
 	}
@@ -710,7 +711,7 @@ static void
 gda_data_select_get_property (GObject *object,
 			 guint param_id,
 			 GValue *value,
-			 G_GNUC_UNUSED GParamSpec *pspec)
+			 GParamSpec *pspec)
 {
 	GdaDataSelect *model = (GdaDataSelect *) object;
 	if (model->priv) {
@@ -752,6 +753,7 @@ gda_data_select_get_property (GObject *object,
 			g_value_set_boolean (value, model->priv->sh->reset_with_ext_params_change);
 			break;
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
 	}
@@ -788,7 +790,7 @@ gda_data_select_take_row (GdaDataSelect *model, GdaRow *row, gint rownum)
  *
  * Get the #GdaRow object stored within @model at row @rownum (without taking care of removed rows)
  *
- * Returns: (tranfer none): the requested #GdaRow, or %NULL if not found
+ * Returns: (transfer none): the requested #GdaRow, or %NULL if not found
  */
 GdaRow *
 gda_data_select_get_stored_row (GdaDataSelect *model, gint rownum)
@@ -811,7 +813,7 @@ gda_data_select_get_stored_row (GdaDataSelect *model, gint rownum)
  * Get a pointer to the #GdaConnection object which was used when @model was created
  * (and which may be used internally by @model).
  *
- * Returns: (tranfer none): a pointer to the #GdaConnection, or %NULL
+ * Returns: (transfer none): a pointer to the #GdaConnection, or %NULL
  */
 GdaConnection *
 gda_data_select_get_connection (GdaDataSelect *model)
@@ -1726,7 +1728,8 @@ gda_data_select_get_value_at (GdaDataModel *model, gint col, gint row, GError **
 			GType *types = NULL;
 			if (imodel->prep_stmt && imodel->prep_stmt->types) {
 				types = g_new (GType, imodel->prep_stmt->ncols + 1);
-				memcpy (types, imodel->prep_stmt->types, sizeof (GType) * imodel->prep_stmt->ncols);
+				memcpy (types, imodel->prep_stmt->types, /* Flawfinder: ignore */
+					sizeof (GType) * imodel->prep_stmt->ncols);
 				types [imodel->prep_stmt->ncols] = G_TYPE_NONE;
 			}
 			tmpmodel = gda_connection_statement_execute_select_full (imodel->priv->cnc,
@@ -3357,7 +3360,8 @@ gda_data_select_rerun (GdaDataSelect *model, GError **error)
 	GType *types = NULL;
 	if (model->prep_stmt->types) {
 		types = g_new (GType, model->prep_stmt->ncols + 1);
-		memcpy (types, model->prep_stmt->types, sizeof (GType) * model->prep_stmt->ncols);
+		memcpy (types, model->prep_stmt->types, /* Flawfinder: ignore */
+			sizeof (GType) * model->prep_stmt->ncols);
 		types [model->prep_stmt->ncols] = G_TYPE_NONE;
 	}
 	new_model = (GdaDataSelect*) gda_connection_statement_execute_select_full (model->priv->cnc, select, 
@@ -3393,9 +3397,9 @@ gda_data_select_rerun (GdaDataSelect *model, GError **error)
 	g_type_query (G_OBJECT_TYPE (model), &tq);
 	size = tq.instance_size - offset;
 	copy = g_malloc (size);
-	memcpy (copy, (gint8*) new_model + offset, size);
-	memcpy ((gint8*) new_model + offset, (gint8*) model + offset, size);
-	memcpy ((gint8*) model + offset, copy, size);
+	memcpy (copy, (gint8*) new_model + offset, size); /* Flawfinder: ignore */
+	memcpy ((gint8*) new_model + offset, (gint8*) model + offset, size); /* Flawfinder: ignore */
+	memcpy ((gint8*) model + offset, copy, size); /* Flawfinder: ignore */
 		
 	/* we need to keep some data from the old model */
 	GdaDataSelectInternals *mi;
diff --git a/libgda/gda-easy.c b/libgda/gda-easy.c
index eb82717..f310286 100644
--- a/libgda/gda-easy.c
+++ b/libgda/gda-easy.c
@@ -52,7 +52,7 @@ GQuark gda_easy_error_quark (void)
  * If @db_name is left %NULL, then the name of the database to create will have to be set in the
  * returned #GdaServerOperation using gda_server_operation_set_value_at().
  *
- * Returns: new #GdaServerOperation object, or %NULL if the provider does not support database
+ * Returns: (transfer full) (allow-none): new #GdaServerOperation object, or %NULL if the provider does not support database
  * creation
  */
 GdaServerOperation *
@@ -121,7 +121,7 @@ gda_perform_create_database (const gchar *provider, GdaServerOperation *op, GErr
  * If @db_name is left %NULL, then the name of the database to drop will have to be set in the
  * returned #GdaServerOperation using gda_server_operation_set_value_at().
  *
- * Returns: new #GdaServerOperation object, or %NULL if the provider does not support database
+ * Returns: (transfer full) (allow-none): new #GdaServerOperation object, or %NULL if the provider does not support database
  * destruction
  */
 GdaServerOperation *
@@ -185,7 +185,7 @@ gda_perform_drop_database (const gchar *provider, GdaServerOperation *op, GError
  * 
  * Execute a SQL SELECT command over an opened connection.
  *
- * Returns: a new #GdaDataModel if successful, NULL otherwise
+ * Returns: (transfer full) (allow-none): a new #GdaDataModel if successful, NULL otherwise
  */
 GdaDataModel *          
 gda_execute_select_command (GdaConnection *cnc, const gchar *sql, GError **error)
@@ -278,7 +278,7 @@ gda_execute_non_select_command (GdaConnection *cnc, const gchar *sql, GError **e
  * or #gda_server_operation_perform_operation
  * in order to execute the operation.
  * 
- * Returns: a #GdaServerOperation if no errors; NULL and set @error otherwise
+ * Returns: (transfer full) (allow-none): a #GdaServerOperation if no errors; NULL and set @error otherwise
  */
 GdaServerOperation*
 gda_prepare_create_table (GdaConnection *cnc, const gchar *table_name, GError **error, ...)
@@ -469,7 +469,7 @@ gda_perform_create_table (GdaServerOperation *op, GError **error)
  * This is just a convenient function to create a #GdaServerOperation to drop a 
  * table in an opened connection.
  *
- * Returns: a new #GdaServerOperation or NULL if couldn't create the opereration.
+ * Returns: (transfer full) (allow-none): a new #GdaServerOperation or NULL if couldn't create the opereration.
  */
 GdaServerOperation*
 gda_prepare_drop_table (GdaConnection *cnc, const gchar *table_name, GError **error)
@@ -1051,7 +1051,7 @@ gda_delete_row_from_table (GdaConnection *cnc, const gchar *table,
 }
 
 /**
- * gda_parse_sql_string
+ * gda_parse_sql_string:
  * @cnc: (allow-none): a #GdaConnection object, or %NULL
  * @sql: an SQL command to parse, not %NULL
  * @params: (out) (allow-none) (transfer full): a place to store a new #GdaSet, for parameters used in SQL command, or %NULL
@@ -1059,7 +1059,7 @@ gda_delete_row_from_table (GdaConnection *cnc, const gchar *table,
  *
  * This function helps to parse a SQL witch use paramenters and store them at @params.
  *
- * Returns: a #GdaStatement representing the SQL command, or %NULL if an error occurred
+ * Returns: (transfer full) (allow-none): a #GdaStatement representing the SQL command, or %NULL if an error occurred
  *
  * Since: 4.2
  */
diff --git a/libgda/gda-holder.c b/libgda/gda-holder.c
index d089163..7d1eeb9 100644
--- a/libgda/gda-holder.c
+++ b/libgda/gda-holder.c
@@ -343,7 +343,7 @@ gda_holder_new (GType type)
  * Note1: if @orig is set with a static value (see gda_holder_take_static_value()) 
  * its copy will have a fresh new allocated GValue, so that user should free it when done.
  *
- * Returns: a new #GdaHolder object
+ * Returns: (transfer full): a new #GdaHolder object
  */
 GdaHolder *
 gda_holder_copy (GdaHolder *orig)
@@ -557,7 +557,7 @@ static void
 gda_holder_set_property (GObject *object,
 			 guint param_id,
 			 const GValue *value,
-			 G_GNUC_UNUSED GParamSpec *pspec)
+			 GParamSpec *pspec)
 {
 	GdaHolder *holder;
 
@@ -616,6 +616,9 @@ gda_holder_set_property (GObject *object,
 		case PROP_SOURCE_COLUMN:
 			holder->priv->source_col = g_value_get_int (value);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -624,7 +627,7 @@ static void
 gda_holder_get_property (GObject *object,
 			 guint param_id,
 			 GValue *value,
-			 G_GNUC_UNUSED GParamSpec *pspec)
+			 GParamSpec *pspec)
 {
 	GdaHolder *holder;
 	const GValue *cvalue;
@@ -667,6 +670,9 @@ gda_holder_get_property (GObject *object,
 		case PROP_SOURCE_COLUMN:
 			g_value_set_int (value, holder->priv->source_col);
 			break;	
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -677,7 +683,7 @@ gda_holder_get_property (GObject *object,
  * 
  * Get @holder's type
  *
- * Returns: (tranfer none): the data type
+ * Returns: (transfer none): the data type
  */
 GType
 gda_holder_get_g_type (GdaHolder *holder)
diff --git a/libgda/gda-init.c b/libgda/gda-init.c
index 1fb9eea..d204d6b 100644
--- a/libgda/gda-init.c
+++ b/libgda/gda-init.c
@@ -80,7 +80,7 @@ gda_init (void)
 	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
 
 	/* Threading support if possible */
-	if (!getenv ("LIBGDA_NO_THREADS")) {
+	if (!getenv ("LIBGDA_NO_THREADS")) { /* Flawfinder: ignore */
 #ifdef G_THREADS_ENABLED
 #ifndef G_THREADS_IMPL_NONE
 		if (! g_thread_supported ())
diff --git a/libgda/gda-meta-store.c b/libgda/gda-meta-store.c
index 1cea7e5..3098463 100644
--- a/libgda/gda-meta-store.c
+++ b/libgda/gda-meta-store.c
@@ -734,7 +734,7 @@ static void
 gda_meta_store_set_property (GObject *object,
 			     guint param_id,
 			     const GValue *value,
-			     G_GNUC_UNUSED GParamSpec *pspec)
+			     GParamSpec *pspec)
 {
 	GdaMetaStore *store;
 	const gchar *cnc_string;
@@ -779,6 +779,9 @@ gda_meta_store_set_property (GObject *object,
 			else
 				store->priv->schema = NULL;
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -787,7 +790,7 @@ static void
 gda_meta_store_get_property (GObject *object,
 			     guint param_id,
 			     GValue *value,
-			     G_GNUC_UNUSED GParamSpec *pspec)
+			     GParamSpec *pspec)
 {
 	GdaMetaStore *store;
 	store = GDA_META_STORE (object);
@@ -806,6 +809,9 @@ gda_meta_store_get_property (GObject *object,
 		case PROP_SCHEMA:
 			g_value_set_string (value, store->priv->schema);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -830,7 +836,7 @@ gda_meta_store_set_identifiers_style (GdaMetaStore *store, GdaSqlIdentifierStyle
 /**
  * gda_meta_store_set_reserved_keywords_func:
  * @store: a #GdaMetaStore object
- * @func: (allow-none): a #GdaSqlReservedKeywordsFunc function, or %NULL
+ * @func: (allow-none) (scope call): a #GdaSqlReservedKeywordsFunc function, or %NULL
  *
  * Specifies a function which @store will use to determine if a keyword is an SQL reserved
  * keyword or not.
@@ -2039,7 +2045,7 @@ update_schema_version (GdaMetaStore *store, G_GNUC_UNUSED const gchar *version,
 
 
 	/* update version */
-	store->priv->version = atoi (CURRENT_SCHEMA_VERSION);
+	store->priv->version = atoi (CURRENT_SCHEMA_VERSION); /* Flawfinder: ignore */
 	return TRUE;
 }
 
@@ -2156,8 +2162,10 @@ handle_schema_version (GdaMetaStore *store, gboolean *schema_present, GError **e
 			g_object_unref (model);
 			return FALSE;
 		}
-		store->priv->version = atoi (g_value_get_string (version));
-		if (store->priv->version != atoi (CURRENT_SCHEMA_VERSION)) {
+		store->priv->version = atoi (g_value_get_string (version)); /* Flawfinder: ignore */
+		if (store->priv->version < 1)
+			store->priv->version = 1;
+		if (store->priv->version != atoi (CURRENT_SCHEMA_VERSION)) { /* Flawfinder: ignore */
 			switch (store->priv->version) {
 			case 1:
 				migrate_schema_from_v1_to_v2 (store, error);
@@ -2171,7 +2179,7 @@ handle_schema_version (GdaMetaStore *store, gboolean *schema_present, GError **e
 				break;
 			}
 			
-			if (store->priv->version != atoi (CURRENT_SCHEMA_VERSION)) {
+			if (store->priv->version != atoi (CURRENT_SCHEMA_VERSION)) { /* Flawfinder: ignore */
 				/* it's an error */
 				g_object_unref (model);
 				return FALSE;
@@ -3241,7 +3249,7 @@ gda_meta_store_create_modify_data_model (GdaMetaStore *store, const gchar *table
  * are respected: if table B has a foreign key on table A, then table A will be listed before table B in the returned
  * list.
  *
- * Returns: (transfer container) (element type gchar*): a new list of tables names (as gchar*), the list must be freed when no longer needed, but the strings present in the list must not be modified.
+ * Returns: (transfer container) (element-type utf8): a new list of tables names (as gchar*), the list must be freed when no longer needed, but the strings present in the list must not be modified.
  */
 GSList *
 gda_meta_store_schema_get_all_tables (GdaMetaStore *store)
@@ -3281,7 +3289,7 @@ gda_meta_store_schema_get_all_tables (GdaMetaStore *store)
  * are respected: if table B has a foreign key on table A, then table A will be listed before table B in the returned
  * list.
  *
- * Returns: (transfer container) (element type gchar*): a new list of tables names (as gchar*), the list must be freed when no longer needed, but the strings present in the list must not be modified.
+ * Returns: (transfer container) (element-type utf8): a new list of tables names (as gchar*), the list must be freed when no longer needed, but the strings present in the list must not be modified.
  */
 GSList *
 gda_meta_store_schema_get_depend_tables (GdaMetaStore *store, const gchar *table_name)
@@ -3438,7 +3446,7 @@ gda_meta_store_schema_get_structure (GdaMetaStore *store, GError **error)
  * method allows the user to add, set or remove attributes specific to their usage.
  * 
  * This method allows to get the value of a attribute stored in @store. The returned attribute value is 
- * placed at @att_value, the caller is responsible to free that string. 
+ * placed at @att_value, the caller is responsible for free that string. 
  *
  * If there is no attribute named @att_name then @att_value is set to %NULL
  * and @error will contain the GDA_META_STORE_ATTRIBUTE_NOT_FOUND_ERROR error code, and FALSE is returned.
diff --git a/libgda/gda-meta-struct.c b/libgda/gda-meta-struct.c
index 5081c51..ebbe372 100644
--- a/libgda/gda-meta-struct.c
+++ b/libgda/gda-meta-struct.c
@@ -221,7 +221,7 @@ static void
 gda_meta_struct_set_property (GObject *object,
 			      guint param_id,
 			      const GValue *value,
-			      G_GNUC_UNUSED GParamSpec *pspec)
+			      GParamSpec *pspec)
 {
         GdaMetaStruct *mstruct;
 
@@ -242,6 +242,7 @@ gda_meta_struct_set_property (GObject *object,
 			mstruct->priv->features = g_value_get_uint (value);
 			break;
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
 	}
@@ -251,7 +252,7 @@ static void
 gda_meta_struct_get_property (GObject *object,
 			      guint param_id,
 			      GValue *value,
-			      G_GNUC_UNUSED GParamSpec *pspec)
+			      GParamSpec *pspec)
 {
         GdaMetaStruct *mstruct;
         mstruct = GDA_META_STRUCT (object);
@@ -265,6 +266,7 @@ gda_meta_struct_get_property (GObject *object,
 			g_value_set_uint (value, mstruct->priv->features);
 			break;
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
 	}
@@ -1608,7 +1610,7 @@ gda_meta_struct_get_db_object (GdaMetaStruct *mstruct, const GValue *catalog, co
 }
 
 /**
- * gda_meta_struct_get_table_column
+ * gda_meta_struct_get_table_column: (skip):
  * @mstruct: a #GdaMetaStruct object
  * @table: the #GdaMetaTable structure to find the column for
  * @col_name: the name of the column to find (as a G_TYPE_STRING GValue)
@@ -2240,7 +2242,7 @@ copyerror:
  * @error: (allow-none): a place to store errors, or %NULL
  *
  * Adds @dbo to the database objects known to @mstruct. In any case (whether an error occured or not)
- * @dbo's responsibility is then transferred to @smtruct and should
+ * @dbo's ownership is then transferred to @smtruct and should
  * not be used after calling this function (it may have been destroyed). If you need a pointer to the #GdaMetaDbObject
  * for a database object, use gda_meta_struct_get_db_object().
  *
@@ -2342,8 +2344,8 @@ gda_meta_table_column_set_attribute (GdaMetaTableColumn *tcol, const gchar *attr
 /**
  * gda_meta_table_column_foreach_attribute:
  * @tcol: a #GdaMetaTableColumn
- * @func: a #GdaAttributesManagerFunc function
- * @data: user data to be passed as last argument of @func each time it is called
+ * @func: (scope call): a #GdaAttributesManagerFunc function
+ * @data: (closure): user data to be passed as last argument of @func each time it is called
  *
  * Calls @func for each attribute set to tcol
  */
diff --git a/libgda/gda-mutex.c b/libgda/gda-mutex.c
index 37e31ba..09823d8 100644
--- a/libgda/gda-mutex.c
+++ b/libgda/gda-mutex.c
@@ -36,7 +36,7 @@ struct _GdaMutex {
 };
 
 /**
- * gda_mutex_new:
+ * gda_mutex_new: (skip):
  *
  * Creates a new #GdaMutex.
  *
diff --git a/libgda/gda-quark-list.c b/libgda/gda-quark-list.c
index afcade3..fae89be 100644
--- a/libgda/gda-quark-list.c
+++ b/libgda/gda-quark-list.c
@@ -252,10 +252,10 @@ gda_quark_list_remove (GdaQuarkList *qlist, const gchar *name)
 }
 
 /**
- * gda_quark_list_foreach
+ * gda_quark_list_foreach:
  * @qlist: a #GdaQuarkList structure.
- * @func: the function to call for each key/value pair
- * @user_data: user data to pass to the function
+ * @func: (scope call): the function to call for each key/value pair
+ * @user_data: (closure): user data to pass to the function
  *
  * Calls the given function for each of the key/value pairs in @qlist. The function is passed the key and value 
  * of each pair, and the given user_data parameter. @qlist may not be modified while iterating over it.
diff --git a/libgda/gda-row.c b/libgda/gda-row.c
index e76a36b..77bbd42 100644
--- a/libgda/gda-row.c
+++ b/libgda/gda-row.c
@@ -124,7 +124,7 @@ static void
 gda_row_set_property (GObject *object,
 		      guint param_id,
 		      const GValue *value,
-		      G_GNUC_UNUSED GParamSpec *pspec)
+		      GParamSpec *pspec)
 {
         GdaRow *row;
 
@@ -138,7 +138,7 @@ gda_row_set_property (GObject *object,
 			row->priv->fields = g_new0 (GValue, row->priv->nfields);			
 			break;
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
                 }
         }
@@ -148,7 +148,7 @@ static void
 gda_row_get_property (GObject *object,
 		      guint param_id,
 		      GValue *value,
-		      G_GNUC_UNUSED GParamSpec *pspec)
+		      GParamSpec *pspec)
 {
         GdaRow *row;
 
@@ -159,7 +159,7 @@ gda_row_get_property (GObject *object,
 			g_value_set_int (value, row->priv->nfields);
 			break;
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
                 }
         }
diff --git a/libgda/gda-server-operation.c b/libgda/gda-server-operation.c
index 6eafdd2..1be9968 100644
--- a/libgda/gda-server-operation.c
+++ b/libgda/gda-server-operation.c
@@ -526,7 +526,7 @@ static void
 gda_server_operation_set_property (GObject *object,
 				   guint param_id,
 				   const GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
 	GdaServerOperation *op;
 
@@ -602,7 +602,8 @@ gda_server_operation_set_property (GObject *object,
 			break;
 		}
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 
@@ -623,7 +624,7 @@ static void
 gda_server_operation_get_property (GObject *object,
 				   guint param_id,
 				   GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
 	GdaServerOperation *op;
 
@@ -639,6 +640,9 @@ gda_server_operation_get_property (GObject *object,
 		case PROP_OP_TYPE:
 			g_value_set_int (value, op->priv->op_type);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -892,13 +896,17 @@ load_xml_spec (GdaServerOperation *op, xmlNodePtr specnode, const gchar *root, G
 			
 			prop = xmlGetProp(node, (xmlChar*)"minitems");
 			if (prop) {
-				opnode->d.seq.min_items = atoi ((gchar*)prop);
+				opnode->d.seq.min_items = atoi ((gchar*)prop); /* Flawfinder: ignore */
+				if (opnode->d.seq.min_items < 0)
+					opnode->d.seq.min_items = 0;
 				xmlFree (prop);
 			}
 
 			prop = xmlGetProp(node, (xmlChar*)"maxitems");
 			if (prop) {
-				opnode->d.seq.max_items = atoi ((gchar*)prop);
+				opnode->d.seq.max_items = atoi ((gchar*)prop); /* Flawfinder: ignore */
+				if (opnode->d.seq.max_items < opnode->d.seq.min_items)
+					opnode->d.seq.max_items = opnode->d.seq.min_items;
 				xmlFree (prop);
 			}
 
@@ -1052,7 +1060,7 @@ gda_server_operation_new (GdaServerOperationType op_type, const gchar *xml_file)
 }
 
 /**
- * gda_server_operation_get_node_info:
+ * gda_server_operation_get_node_info: (skip):
  * @op: a #GdaServerOperation object
  * @path_format: a complete path to a node (starting with "/") as a format string, similar to g_strdup_printf()'s argument
  * @...: the arguments to insert into the format string
@@ -1060,7 +1068,7 @@ gda_server_operation_new (GdaServerOperationType op_type, const gchar *xml_file)
  * Get information about the node identified by @path. The returned #GdaServerOperationNode structure can be 
  * copied but not modified; it may change or cease to exist if @op changes
  *
- * Returns: (transfer none): a #GdaServerOperationNode structure, or %NULL if the node was not found
+ * Returns: (transfer none) (allow-none): a #GdaServerOperationNode structure, or %NULL if the node was not found
  */
 GdaServerOperationNode *
 gda_server_operation_get_node_info (GdaServerOperation *op, const gchar *path_format, ...)
@@ -1293,7 +1301,7 @@ gda_server_operation_string_to_op_type (const gchar *str)
 static gboolean node_save (GdaServerOperation *op, Node *opnode, xmlNodePtr parent);
 
 /**
- * gda_server_operation_save_data_to_xml:
+ * gda_server_operation_save_data_to_xml: (skip):
  * @op: a #GdaServerOperation object
  * @error: (allow-none): a place to store errors or %NULL
  * 
diff --git a/libgda/gda-server-operation.h b/libgda/gda-server-operation.h
index 42ce83f..eb39d1d 100644
--- a/libgda/gda-server-operation.h
+++ b/libgda/gda-server-operation.h
@@ -143,7 +143,7 @@ guint                      gda_server_operation_get_sequence_max_size   (GdaServ
 guint                      gda_server_operation_get_sequence_min_size   (GdaServerOperation *op, const gchar *path);
 gchar                    **gda_server_operation_get_sequence_item_names (GdaServerOperation *op, const gchar *path); 
 
-guint                      gda_server_operation_add_item_to_sequence    (GdaServerOperation *op, const gchar *path);
+guint                      gda_server_operation_add_item_to_sequence    (GdaServerOperation *op, const gchar *seq_path);
 gboolean                   gda_server_operation_del_item_from_sequence  (GdaServerOperation *op, const gchar *item_path);
 
 gboolean                   gda_server_operation_is_valid                (GdaServerOperation *op, const gchar *xml_file, GError **error);
diff --git a/libgda/gda-server-provider-extra.c b/libgda/gda-server-provider-extra.c
index d899400..6e958e5 100644
--- a/libgda/gda-server-provider-extra.c
+++ b/libgda/gda-server-provider-extra.c
@@ -112,7 +112,7 @@ GdaDataHandler *
 gda_server_provider_get_data_handler_default (GdaServerProvider *provider, G_GNUC_UNUSED GdaConnection *cnc,
 					      GType type, G_GNUC_UNUSED const gchar *dbms_type)
 {
-	GdaDataHandler *dh;
+	GdaDataHandler *dh = NULL;
 	if ((type == G_TYPE_INT64) ||
 	    (type == G_TYPE_UINT64) ||
 	    (type == G_TYPE_DOUBLE) ||
@@ -566,6 +566,12 @@ gda_server_provider_test_schema_model (GdaDataModel *model, GdaConnectionSchema
 	return TRUE;
 }
 
+/**
+ * gda_server_provider_handler_find:
+ *
+ * Returns: (transfer none):
+ *
+ */
 GdaDataHandler *
 gda_server_provider_handler_find (GdaServerProvider *prov, GdaConnection *cnc, 
 				  GType g_type, const gchar *dbms_type)
diff --git a/libgda/gda-server-provider.c b/libgda/gda-server-provider.c
index 20ff1e1..f650300 100644
--- a/libgda/gda-server-provider.c
+++ b/libgda/gda-server-provider.c
@@ -222,14 +222,15 @@ static void
 gda_server_provider_set_property (GObject *object,
 				  guint param_id,
 				  G_GNUC_UNUSED const GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec) {
+				  GParamSpec *pspec) {
         GdaServerProvider *prov;
 
         prov = GDA_SERVER_PROVIDER (object);
         if (prov->priv) {
                 switch (param_id) {
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -238,14 +239,15 @@ static void
 gda_server_provider_get_property (GObject *object,
 				  guint param_id,
 				  G_GNUC_UNUSED GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec) {
+				  GParamSpec *pspec) {
         GdaServerProvider *prov;
 
         prov = GDA_SERVER_PROVIDER (object);
         if (prov->priv) {
                 switch (param_id) {
 		default:
-			g_assert_not_reached ();
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -452,7 +454,7 @@ static OpReq op_req_CREATE_USER [] = {
  *  <listitem>named values which may change the contents of the GdaServerOperation, see <link linkend="gda-server-op-information-std">this section</link> for more information</listitem>
  * </itemizedlist>
  *
- * Returns: (transfer full): a new #GdaServerOperation object, or %NULL in the provider does not support the @type type of operation or if an error occurred
+ * Returns: (transfer full) (allow-none): a new #GdaServerOperation object, or %NULL in the provider does not support the @type type of operation or if an error occurred
  */
 GdaServerOperation *
 gda_server_provider_create_operation (GdaServerProvider *provider, GdaConnection *cnc, 
@@ -560,7 +562,7 @@ gda_server_provider_create_operation (GdaServerProvider *provider, GdaConnection
  * This function's purpose is mainly informative to get the actual SQL code which would be executed to perform
  * the operation; to actually perform the operation, use gda_server_provider_perform_operation().
  *
- * Returns: (transfer full): a new string, or %NULL if an error occurred or operation cannot be rendered as SQL.
+ * Returns: (transfer full) (allow-none): a new string, or %NULL if an error occurred or operation cannot be rendered as SQL.
  */
 gchar *
 gda_server_provider_render_operation (GdaServerProvider *provider, GdaConnection *cnc, 
@@ -735,7 +737,7 @@ gda_server_provider_get_data_handler_dbms (GdaServerProvider *provider, GdaConne
 /**
  * gda_server_provider_get_default_dbms_type:
  * @provider: a server provider.
- * @cnc:(allow-none):  a #GdaConnection object or %NULL
+ * @cnc: (allow-none):  a #GdaConnection object or %NULL
  * @type: a #GType value type
  *
  * Get the name of the most common data type which has @type type.
@@ -744,7 +746,7 @@ gda_server_provider_get_data_handler_dbms (GdaServerProvider *provider, GdaConne
  * there is no DBMS data type which could contain data of the @g_type type (for example %NULL may be
  * returned if a DBMS has integers only up to 4 bytes and a G_TYPE_INT64 is requested).
  *
- * Returns: (transfer none): the name of the DBMS type, or %NULL
+ * Returns: (transfer none) (allow-none): the name of the DBMS type, or %NULL
  */
 const gchar *
 gda_server_provider_get_default_dbms_type (GdaServerProvider *provider, GdaConnection *cnc, GType type)
diff --git a/libgda/gda-sql-builder.c b/libgda/gda-sql-builder.c
index 1494058..97cd129 100644
--- a/libgda/gda-sql-builder.c
+++ b/libgda/gda-sql-builder.c
@@ -221,7 +221,7 @@ static void
 gda_sql_builder_set_property (GObject *object,
 			     guint param_id,
 			     const GValue *value,
-			     G_GNUC_UNUSED GParamSpec *pspec)
+			     GParamSpec *pspec)
 {
 	GdaSqlBuilder *builder;
 	GdaSqlStatementType stmt_type;
@@ -243,6 +243,9 @@ gda_sql_builder_set_property (GObject *object,
 			if (stmt_type == GDA_SQL_STATEMENT_COMPOUND)
 				gda_sql_builder_compound_set_type (builder, GDA_SQL_STATEMENT_COMPOUND_UNION);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -251,13 +254,16 @@ static void
 gda_sql_builder_get_property (GObject *object,
 			     guint param_id,
 			     G_GNUC_UNUSED GValue *value,
-			     G_GNUC_UNUSED GParamSpec *pspec)
+			     GParamSpec *pspec)
 {
 	GdaSqlBuilder *builder;
 	builder = GDA_SQL_BUILDER (object);
 
 	if (builder->priv) {
 		switch (param_id) {
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -344,14 +350,13 @@ gda_sql_builder_get_statement (GdaSqlBuilder *builder, GError **error)
 /**
  * gda_sql_builder_get_sql_statement:
  * @builder: a #GdaSqlBuilder object
- * @copy_it: set to %TRUE to be able to reuse @builder
  *
  * Creates a new #GdaSqlStatement structure from @builder's contents.
  *
  * The returned pointer belongs to @builder's internal representation.
  * Use gda_sql_statement_copy() if you need to keep it.
  *
- * Returns: (transfer none): a #GdaSqlStatement pointer
+ * Returns: (transfer none) (allow-none): a #GdaSqlStatement pointer
  *
  * Since: 4.2
  */
@@ -948,7 +953,7 @@ 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: (allow-null): a table name, or %NULL
+ * @table_name: (allow-none): a table name, or %NULL
  *
  * Defines an expression representing a field in @builder,
  * which may be reused to build other parts of a statement,
@@ -1031,7 +1036,7 @@ gda_sql_builder_add_param (GdaSqlBuilder *builder, const gchar *param_name, GTyp
  * @op2: the ID of the 2nd argument (may be %0 if @op needs only one operand)
  * @op3: the ID of the 3rd argument (may be %0 if @op needs only one or two operand)
  *
- * Builds a new expression which reprenents a condition (or operation).
+ * Builds a new expression which represents a condition (or operation).
  *
  * Returns: the ID of the new expression, or %0 if there was an error
  *
@@ -1074,7 +1079,7 @@ gda_sql_builder_add_cond (GdaSqlBuilder *builder, GdaSqlOperatorType op, GdaSqlB
  * @op_ids: (array length=op_ids_size): an array of ID for the arguments (not %0)
  * @op_ids_size: size of @ops_ids
  *
- * Builds a new expression which reprenents a condition (or operation).
+ * Builds a new expression which represents a condition (or operation).
  *
  * As a side case, if @ops_ids_size is 1,
  * then @op is ignored, and the returned ID represents @op_ids[0] (this avoids any problem for example
@@ -1356,8 +1361,8 @@ gda_sql_builder_select_join_targets (GdaSqlBuilder *builder,
  * @join_id: the ID of the join to modify (not %0)
  * @field_name: the name of the field to use in the join condition (not %NULL)
  *
- * Alter a joins in a SELECT statement to make its condition on the field which name
- * is @field_name
+ * Alter a join in a SELECT statement to make its condition use equal field 
+ * values in the fields named @field_name in both tables, via the USING keyword.
  *
  * Returns: the ID of the new join, or %0 if there was an error
  *
@@ -1622,10 +1627,10 @@ gda_sql_builder_select_group_by (GdaSqlBuilder *builder, GdaSqlBuilderId expr_id
 /**
  * gda_sql_builder_add_function:
  * @builder: a #GdaSqlBuilder object
- * @function_id: the ID of the functions's name
+ * @func_name: 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
+ * Builds a new expression which represents a function applied to some arguments
  *
  * Returns: the ID of the new expression, or %0 if there was an error
  *
@@ -1667,7 +1672,7 @@ gda_sql_builder_add_function (GdaSqlBuilder *builder, const gchar *func_name, ..
 /**
  * gda_sql_builder_add_function_v:
  * @builder: a #GdaSqlBuilder object
- * @function_id: the ID of the functions's name
+ * @func_name: the functions's name
  * @args: (array length=args_size): an array of IDs representing the function's arguments
  * @args_size: @args's size
  *
@@ -1711,7 +1716,6 @@ gda_sql_builder_add_function_v (GdaSqlBuilder *builder, const gchar *func_name,
  * gda_sql_builder_add_sub_select:
  * @builder: a #GdaSqlBuilder object
  * @sqlst: a pointer to a #GdaSqlStatement, which has to be a SELECT or compound SELECT. This will be copied.
- * @steal: if %TRUE, then @sqlst will be "stolen" by @b and should not be used anymore
  *
  * Adds an expression which is a subselect.
  *
diff --git a/libgda/gda-sql-builder.h b/libgda/gda-sql-builder.h
index 8c07794..90d6eb3 100644
--- a/libgda/gda-sql-builder.h
+++ b/libgda/gda-sql-builder.h
@@ -117,7 +117,7 @@ void              gda_sql_builder_select_order_by (GdaSqlBuilder *builder, GdaSq
 void              gda_sql_builder_select_set_distinct (GdaSqlBuilder *builder,
 						       gboolean distinct, GdaSqlBuilderId expr_id);
 void              gda_sql_builder_select_set_limit (GdaSqlBuilder *builder,
-						    GdaSqlBuilderId limit_count_expr_id, GdaSqlBuilderId limit_offest_expr_id);
+						    GdaSqlBuilderId limit_count_expr_id, GdaSqlBuilderId limit_offset_expr_id);
 
 void              gda_sql_builder_select_set_having (GdaSqlBuilder *builder, GdaSqlBuilderId cond_id);
 void              gda_sql_builder_select_group_by (GdaSqlBuilder *builder, GdaSqlBuilderId expr_id);
diff --git a/libgda/gda-statement.c b/libgda/gda-statement.c
index d562f4c..b19e27b 100644
--- a/libgda/gda-statement.c
+++ b/libgda/gda-statement.c
@@ -205,7 +205,7 @@ _gda_statement_get_internal_struct (GdaStatement *stmt)
  * 
  * Copy constructor
  *
- * Returns: a the new copy of @orig
+ * Returns: (transfer full): a the new copy of @orig
  */
 GdaStatement *
 gda_statement_copy (GdaStatement *orig)
@@ -710,8 +710,8 @@ default_render_value (const GValue *value, GdaSqlRenderingContext *context, GErr
 /**
  * gda_statement_to_sql_extended:
  * @stmt: a #GdaStatement object
- * @cnc: a #GdaConnection object, or %NULL
- * @params: parameters contained in a single #GdaSet object
+ * @cnc: (allow-none): a #GdaConnection object, or %NULL
+ * @params: (allow-none): parameters contained in a single #GdaSet object, or %NULL
  * @flags: a set of flags to control the rendering
  * @params_used: (element-type GdaHolder) (out) (transfer container) (allow-none):a place to store the list of actual #GdaHolder objects in @params used to do the rendering, or %NULL
  * @error: a place to store errors, or %NULL
@@ -722,7 +722,7 @@ default_render_value (const GValue *value, GdaSqlRenderingContext *context, GErr
  * it may include some SQL tweaks and/or proprietary extensions specific to the database engine used by @cnc):
  * in this case the result is similar to calling gda_connection_statement_to_sql().
  *
- * Returns: a new string if no error occurred
+ * Returns: (transfer full): a new string if no error occurred
  */
 gchar *
 gda_statement_to_sql_extended (GdaStatement *stmt, GdaConnection *cnc, GdaSet *params,
diff --git a/libgda/gda-transaction-status.c b/libgda/gda-transaction-status.c
index 29d2369..4aad698 100644
--- a/libgda/gda-transaction-status.c
+++ b/libgda/gda-transaction-status.c
@@ -151,6 +151,10 @@ gda_transaction_status_new (const gchar *name)
 	return tstatus;
 }
 
+/**
+ * gda_transaction_status_add_event_svp: (skip):
+ *
+ */
 GdaTransactionStatusEvent *
 gda_transaction_status_add_event_svp (GdaTransactionStatus *tstatus, const gchar *svp_name)
 {
@@ -168,6 +172,10 @@ gda_transaction_status_add_event_svp (GdaTransactionStatus *tstatus, const gchar
 	return ev;
 }
 
+/**
+ * gda_transaction_status_add_event_sql: (skip):
+ *
+ */
 GdaTransactionStatusEvent *
 gda_transaction_status_add_event_sql (GdaTransactionStatus *tstatus, const gchar *sql, GdaConnectionEvent *conn_event)
 {
@@ -189,6 +197,10 @@ gda_transaction_status_add_event_sql (GdaTransactionStatus *tstatus, const gchar
 	return ev;
 }
 
+/**
+ * gda_transaction_status_add_event_sub: (skip)
+ *
+ */
 GdaTransactionStatusEvent *
 gda_transaction_status_add_event_sub (GdaTransactionStatus *tstatus, GdaTransactionStatus *sub_trans)
 {
@@ -231,6 +243,11 @@ gda_transaction_status_free_events (GdaTransactionStatus *tstatus, GdaTransactio
 	tstatus->events = g_list_delete_link (tstatus->events, node);
 }
 
+/**
+ * gda_transaction_status_find:
+ *
+ * Returns: (transfer full) (allow-none):
+ */
 GdaTransactionStatus *
 gda_transaction_status_find (GdaTransactionStatus *tstatus, const gchar *str, GdaTransactionStatusEvent **destev)
 {
@@ -274,9 +291,13 @@ gda_transaction_status_find (GdaTransactionStatus *tstatus, const gchar *str, Gd
 	return trans;
 }
 
-/*
+/**
+ * gda_transaction_status_find_current:
+ *
  * Find a pointer to the "current" _unnamed_ transaction, which is the last
  * transaction if there are several nested transactions
+ *
+ * Returns: (transfer full) (allow-none):
  */
 GdaTransactionStatus *
 gda_transaction_status_find_current (GdaTransactionStatus *tstatus, GdaTransactionStatusEvent **destev, gboolean unnamed_only)
diff --git a/libgda/gda-tree-manager.c b/libgda/gda-tree-manager.c
index 4b391cd..8024b7b 100644
--- a/libgda/gda-tree-manager.c
+++ b/libgda/gda-tree-manager.c
@@ -197,7 +197,7 @@ static void
 gda_tree_manager_set_property (GObject *object,
 			       guint param_id,
 			       const GValue *value,
-			       G_GNUC_UNUSED GParamSpec *pspec)
+			       GParamSpec *pspec)
 {
 	GdaTreeManager *manager;
 
@@ -210,6 +210,9 @@ gda_tree_manager_set_property (GObject *object,
 		case PROP_FUNC:
 			manager->priv->update_func = g_value_get_pointer (value);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}	
 	}
 }
@@ -218,7 +221,7 @@ static void
 gda_tree_manager_get_property (GObject *object,
 			       guint param_id,
 			       GValue *value,
-			       G_GNUC_UNUSED GParamSpec *pspec)
+			       GParamSpec *pspec)
 {
 	GdaTreeManager *manager;
 	
@@ -231,6 +234,9 @@ gda_tree_manager_get_property (GObject *object,
 		case PROP_FUNC:
 			g_value_set_pointer (value, manager->priv->update_func);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}	
 }
@@ -303,7 +309,7 @@ _gda_tree_manager_update_children (GdaTreeManager *manager, GdaTreeNode *node, c
 
 /**
  * gda_tree_manager_new_with_func:
- * @update_func: the function to call when the manager object is requested to create or update its list of
+ * @update_func: (scope call): the function to call when the manager object is requested to create or update its list of
  * #GdaTreeNode nodes
  *
  * Use this method to create a new #GdaTreeManager if it's more convenient than subclassing; all is needed
@@ -406,6 +412,9 @@ gda_tree_manager_create_node (GdaTreeManager *manager, GdaTreeNode *parent, cons
  * of a #GdaTree. Note that a single #GdaTreeManager can be used by several #GdaTree objects
  * or several times in the same #GdaTree's structure.
  *
+ * Please note that it's possible for @mgr and @sub to be the same object, but beware of the possible
+ * infinite recursive behaviour in this case (depending on the actual implementation of the #GdaTreeManager)
+ *
  * Since: 4.2
  */
 void
@@ -413,7 +422,6 @@ gda_tree_manager_add_manager (GdaTreeManager *manager, GdaTreeManager *sub)
 {
 	g_return_if_fail (GDA_IS_TREE_MANAGER (manager));
 	g_return_if_fail (GDA_IS_TREE_MANAGER (sub));
-	g_return_if_fail (manager != sub);
 
 	manager->priv->sub_managers = g_slist_append (manager->priv->sub_managers, sub);
 	g_object_ref (sub);
@@ -439,7 +447,7 @@ gda_tree_manager_get_managers (GdaTreeManager *manager)
 /**
  * gda_tree_manager_set_node_create_func:
  * @manager: a #GdaTreeManager tree manager object
- * @func: (allow-none): a #GdaTreeManagerNodeFunc function pointer, or %NULL
+ * @func: (allow-none) (scope call): a #GdaTreeManagerNodeFunc function pointer, or %NULL
  *
  * Sets the function to be called when a new node is being created by @manager. If @func is %NULL
  * then each created node will be a #GdaTreeNode object.
@@ -457,12 +465,12 @@ gda_tree_manager_set_node_create_func (GdaTreeManager *manager, GdaTreeManagerNo
 }
 
 /**
- * gda_tree_manager_get_node_create_func:
+ * gda_tree_manager_get_node_create_func: (skip):
  * @manager: a #GdaTreeManager tree manager object
  *
  * Get the function used by @manager when creating new #GdaTreeNode nodes
  *
- * Returns: (transfer none): the #GdaTreeManagerNodeFunc function, or %NULL if the default function is used
+ * Returns: the #GdaTreeManagerNodeFunc function, or %NULL if the default function is used
  *
  * Since: 4.2
  */
diff --git a/libgda/gda-tree-mgr-columns.c b/libgda/gda-tree-mgr-columns.c
index 7ece97b..59daa6a 100644
--- a/libgda/gda-tree-mgr-columns.c
+++ b/libgda/gda-tree-mgr-columns.c
@@ -178,7 +178,7 @@ static void
 gda_tree_mgr_columns_set_property (GObject *object,
 				   guint param_id,
 				   const GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         GdaTreeMgrColumns *mgr;
 
@@ -196,6 +196,9 @@ gda_tree_mgr_columns_set_property (GObject *object,
 		case PROP_TABLE:
 			mgr->priv->table_name = g_value_dup_string (value);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
@@ -204,7 +207,7 @@ static void
 gda_tree_mgr_columns_get_property (GObject *object,
 				   guint param_id,
 				   GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         GdaTreeMgrColumns *mgr;
 
@@ -220,6 +223,9 @@ gda_tree_mgr_columns_get_property (GObject *object,
 		case PROP_TABLE:
 			g_value_set_string (value, mgr->priv->table_name);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
diff --git a/libgda/gda-tree-mgr-label.c b/libgda/gda-tree-mgr-label.c
index 22367a5..899e4ee 100644
--- a/libgda/gda-tree-mgr-label.c
+++ b/libgda/gda-tree-mgr-label.c
@@ -141,7 +141,7 @@ static void
 gda_tree_mgr_label_set_property (GObject *object,
 				   guint param_id,
 				   const GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         GdaTreeMgrLabel *mgr;
 
@@ -151,6 +151,9 @@ gda_tree_mgr_label_set_property (GObject *object,
 		case PROP_LABEL:
 			mgr->priv->label = g_value_dup_string (value);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
@@ -159,7 +162,7 @@ static void
 gda_tree_mgr_label_get_property (GObject *object,
 				   guint param_id,
 				   GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         GdaTreeMgrLabel *mgr;
 
@@ -169,6 +172,9 @@ gda_tree_mgr_label_get_property (GObject *object,
 		case PROP_LABEL:
 			g_value_set_string (value, mgr->priv->label);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
diff --git a/libgda/gda-tree-mgr-schemas.c b/libgda/gda-tree-mgr-schemas.c
index 5d39afb..26b891c 100644
--- a/libgda/gda-tree-mgr-schemas.c
+++ b/libgda/gda-tree-mgr-schemas.c
@@ -147,7 +147,7 @@ static void
 gda_tree_mgr_schemas_set_property (GObject *object,
 				   guint param_id,
 				   const GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         GdaTreeMgrSchemas *mgr;
 
@@ -159,6 +159,9 @@ gda_tree_mgr_schemas_set_property (GObject *object,
 			if (mgr->priv->cnc)
 				g_object_ref (mgr->priv->cnc);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
@@ -167,7 +170,7 @@ static void
 gda_tree_mgr_schemas_get_property (GObject *object,
 				   guint param_id,
 				   GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         GdaTreeMgrSchemas *mgr;
 
@@ -177,6 +180,9 @@ gda_tree_mgr_schemas_get_property (GObject *object,
 		case PROP_CNC:
 			g_value_set_object (value, mgr->priv->cnc);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
diff --git a/libgda/gda-tree-mgr-select.c b/libgda/gda-tree-mgr-select.c
index 0778c5a..3f8b3b3 100644
--- a/libgda/gda-tree-mgr-select.c
+++ b/libgda/gda-tree-mgr-select.c
@@ -167,7 +167,7 @@ static void
 gda_tree_mgr_select_set_property (GObject *object,
 				  guint param_id,
 				  const GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
         GdaTreeMgrSelect *mgr;
 
@@ -199,6 +199,9 @@ gda_tree_mgr_select_set_property (GObject *object,
 			if (mgr->priv->params)
 				g_object_ref (mgr->priv->params);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 
@@ -235,7 +238,7 @@ static void
 gda_tree_mgr_select_get_property (GObject *object,
 				   guint param_id,
 				   GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         GdaTreeMgrSelect *mgr;
 
@@ -251,6 +254,9 @@ gda_tree_mgr_select_get_property (GObject *object,
 		case PROP_PARAMS:
 			g_value_set_object (value, mgr->priv->params);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
diff --git a/libgda/gda-tree-mgr-tables.c b/libgda/gda-tree-mgr-tables.c
index 2cb7362..6ecb4f0 100644
--- a/libgda/gda-tree-mgr-tables.c
+++ b/libgda/gda-tree-mgr-tables.c
@@ -170,7 +170,7 @@ static void
 gda_tree_mgr_tables_set_property (GObject *object,
 				   guint param_id,
 				   const GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         GdaTreeMgrTables *mgr;
 
@@ -185,6 +185,9 @@ gda_tree_mgr_tables_set_property (GObject *object,
 		case PROP_SCHEMA:
 			mgr->priv->schema = g_value_dup_string (value);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
@@ -193,7 +196,7 @@ static void
 gda_tree_mgr_tables_get_property (GObject *object,
 				   guint param_id,
 				   GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         GdaTreeMgrTables *mgr;
 
@@ -206,6 +209,9 @@ gda_tree_mgr_tables_get_property (GObject *object,
 		case PROP_SCHEMA:
 			g_value_set_string (value, mgr->priv->schema);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
diff --git a/libgda/gda-tree-node.c b/libgda/gda-tree-node.c
index bf676ab..8fa0413 100644
--- a/libgda/gda-tree-node.c
+++ b/libgda/gda-tree-node.c
@@ -338,7 +338,7 @@ static void
 gda_tree_node_set_property (GObject *object,
 			    guint param_id,
 			    const GValue *value,
-			    G_GNUC_UNUSED GParamSpec *pspec)
+			    GParamSpec *pspec)
 {
 	GdaTreeNode *tnode;
 
@@ -348,6 +348,9 @@ gda_tree_node_set_property (GObject *object,
 		case PROP_NAME:
 			gda_attributes_manager_set (gda_tree_node_attributes_manager, tnode, GDA_ATTRIBUTE_NAME, value);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}	
 	}
 }
@@ -356,7 +359,7 @@ static void
 gda_tree_node_get_property (GObject *object,
 			    guint param_id,
 			    GValue *value,
-			    G_GNUC_UNUSED GParamSpec *pspec)
+			    GParamSpec *pspec)
 {
 	GdaTreeNode *tnode;
 	
@@ -369,6 +372,9 @@ gda_tree_node_get_property (GObject *object,
 			g_value_set_string (value, cvalue ? g_value_get_string (cvalue): NULL);
 			break;
 		}
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}	
 }
@@ -721,7 +727,8 @@ gda_tree_node_get_node_attribute (GdaTreeNode *node, const gchar *attribute)
  * @value: a #GValue, or %NULL
  * @destroy: a function to be called when @attribute is not needed anymore, or %NULL
  *
- * Set the value associated to a named attribute. The @attribute string is 'stolen' by this method, and
+ * Set the value associated to a named attribute. The @attribute string is used AS IT IS by this method (eg.
+ * no copy of it is made), and
  * the memory it uses will be freed using the @destroy function when no longer needed (if @destroy is %NULL,
  * then the string will not be freed at all).
  *
diff --git a/libgda/gda-tree.c b/libgda/gda-tree.c
index 7952303..7f957c5 100644
--- a/libgda/gda-tree.c
+++ b/libgda/gda-tree.c
@@ -170,6 +170,10 @@ gda_tree_class_init (GdaTreeClass *klass)
         object_class->set_property = gda_tree_set_property;
         object_class->get_property = gda_tree_get_property;
 
+	/**
+	 * GdaTree:is-list:
+	 * Tells if the GdaTree is a list or a tree.
+	 */
 	g_object_class_install_property (object_class, PROP_IS_LIST,
                                          g_param_spec_boolean ("is-list", _("Tells if the GdaTree is a list or a tree"), NULL,
 							       FALSE, G_PARAM_READABLE));
@@ -263,13 +267,16 @@ static void
 gda_tree_set_property (GObject *object,
 			 guint param_id,
 			 G_GNUC_UNUSED const GValue *value,
-			 G_GNUC_UNUSED GParamSpec *pspec)
+			 GParamSpec *pspec)
 {
 	GdaTree *tree;
 
         tree = GDA_TREE (object);
         if (tree->priv) {
                 switch (param_id) {
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}	
 	}
 }
@@ -278,7 +285,7 @@ static void
 gda_tree_get_property (GObject *object,
 			 guint param_id,
 			 GValue *value,
-			 G_GNUC_UNUSED GParamSpec *pspec)
+			 GParamSpec *pspec)
 {
 	GdaTree *tree;
 	
@@ -297,6 +304,9 @@ gda_tree_get_property (GObject *object,
 			g_value_set_boolean (value, is_list);
 			break;
 		}
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}	
 }
@@ -538,7 +548,7 @@ real_gda_tree_get_nodes_in_path (GdaTree *tree, GSList *segments, gboolean use_n
 		if (use_names)
 			node = gda_tree_node_get_child_name (parent, (gchar *) seglist->data);
 		else
-			node = gda_tree_node_get_child_index (parent, atoi ((gchar *) seglist->data));
+			node = gda_tree_node_get_child_index (parent, atoi ((gchar *) seglist->data)); /* Flawfinder: ignore */
 		if (!node && tree->priv->update_on_searching) {
 			/* update level if necessary */
 			mgrlist = _gda_tree_node_get_managers_for_children (parent);
@@ -552,7 +562,7 @@ real_gda_tree_get_nodes_in_path (GdaTree *tree, GSList *segments, gboolean use_n
 			if (use_names)
 				node = gda_tree_node_get_child_name (parent, (gchar *) seglist->data);
 			else
-				node = gda_tree_node_get_child_index (parent, atoi ((gchar *) seglist->data));
+				node = gda_tree_node_get_child_index (parent, atoi ((gchar *) seglist->data)); /* Flawfinder: ignore */
 		}
 		if (!node) 
 			return NULL;
@@ -637,7 +647,7 @@ build_node_path (GdaTree *tree, GdaTreeNode *node, GArray *array)
 }
 
 /**
- * gda_tree_get_node
+ * gda_tree_get_node:
  * @tree: a #GdaTree object
  * @tree_path: full path to the required nodes (if @use_names is %TRUE, then it must start with '/')
  * @use_names: if %TRUE, then @tree_path will be interpreted as a unix style path, and if %FALSE,
@@ -645,7 +655,7 @@ build_node_path (GdaTree *tree, GdaTreeNode *node, GArray *array)
  *
  * Locates a #GdaTreeNode using the @tree_path path.
  *
- * Returns: (transfer none): the requested #GdaTreeNode pointer, or %NULL if not found
+ * Returns: (transfer none) (allow-none): the requested #GdaTreeNode pointer, or %NULL if not found
  *
  * Since: 4.2
  */
diff --git a/libgda/gda-util.c b/libgda/gda-util.c
index 536dbd7..cfa3384 100644
--- a/libgda/gda-util.c
+++ b/libgda/gda-util.c
@@ -27,6 +27,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <ctype.h>
 #include <string.h>
 #include <glib/gi18n-lib.h>
 #include <libgda/gda-log.h>
@@ -590,7 +591,7 @@ gda_utility_holder_load_attributes (GdaHolder *holder, xmlNodePtr node, GSList *
 			if (model) {
 				gint fno;
 				
-				fno = atoi (ptr2);
+				fno = atoi (ptr2); /* Flawfinder: ignore */
 				if ((fno < 0) ||
 				    (fno >= gda_data_model_get_n_columns (model))) 
 					g_warning (_("Field number %d not found in source named '%s'"), fno, ptr1); 
@@ -1071,8 +1072,6 @@ gda_compute_dml_statements (GdaConnection *cnc, GdaStatement *select_stmt, gbool
 			continue;
 		g_hash_table_insert (fields_hash, selfield->field_name, GINT_TO_POINTER (1));
 
-		gchar *str;
-		str = gda_sql_identifier_quote (selfield->field_name, cnc, NULL, FALSE, FALSE);
 		if (insert_stmt) {
 			GdaSqlField *field;
 			field = gda_sql_field_new (GDA_SQL_ANY_PART (ist));
@@ -1573,7 +1572,7 @@ cmp_func (gconstpointer a, gconstpointer b)
 }
 
 /**
- * gda_completion_list_get
+ * gda_completion_list_get:
  * @cnc: a #GdaConnection object
  * @sql: a partial SQL statement which is the context of the completion proposal
  * @start: starting position within @sql of the "token" to complete (starts at 0)
@@ -1583,7 +1582,7 @@ cmp_func (gconstpointer a, gconstpointer b)
  * If no completion is available, then the returned array contains just one NULL entry, and
  * if it was not possible to try to compute a completions list, then %NULL is returned.
  *
- * Returns: a new array of strings, or %NULL (use g_strfreev() to free the returned array)
+ * Returns: (transfer full) (array zero-terminated=1) (allow-none): a new array of strings, or %NULL (use g_strfreev() to free the returned array)
  */
 gchar **
 gda_completion_list_get (GdaConnection *cnc, const gchar *sql, gint start, gint end)
@@ -1602,8 +1601,8 @@ gda_completion_list_get (GdaConnection *cnc, const gchar *sql, gint start, gint
 
 	/* init */
 	compl = g_array_new (TRUE, TRUE, sizeof (gchar *));
-	text = g_new0 (gchar, end - start + 2);
-	memcpy (text, sql + start, end - start + 1);
+	text = g_new (gchar, end - start + 2);
+	memcpy (text, sql + start, end - start + 1); /* Flawfinder: ignore */
 	text [end - start + 1] = 0;
 
 	if (start == 0) {
@@ -1826,17 +1825,17 @@ concat_ident (const char *prefix, const gchar *ident)
 
 	str = malloc (sizeof (char) * (plen + tlen + 1));
 	if (prefix) {
-		strcpy (str, prefix);
+		strcpy (str, prefix); /* Flawfinder: ignore */
 		str [plen - 1] = '.';
-		strcpy (str + plen, ident);
+		strcpy (str + plen, ident); /* Flawfinder: ignore */
 	}
 	else
-		strcpy (str, ident);
+		strcpy (str, ident); /* Flawfinder: ignore */
 	return str;
 }
 
 /**
- * gda_sql_identifier_split
+ * gda_sql_identifier_split:
  * @id: an SQL identifier
  * 
  * Splits @id into an array of it sub parts. @id's format has to be "&lt;part&gt;[.&lt;part&gt;[...]]" where
@@ -1845,7 +1844,7 @@ concat_ident (const char *prefix, const gchar *ident)
  *
  * For example the <![CDATA["test.\"ATable\""]]> string will result in the array: <![CDATA[{"test", "\"ATable\"", NULL}]]>
  *
- * Returns: a new %NULL-terminated array of strings, or NULL (use g_strfreev() to free the returned array)
+ * Returns: (transfer full) (array zero-terminated=1) (allow-none): a new %NULL-terminated array of strings, or NULL (use g_strfreev() to free the returned array)
  */
 gchar **
 gda_sql_identifier_split (const gchar *id)
@@ -2205,7 +2204,7 @@ static char rfc1738_reserved_chars[] =
  * <constant>&quot;%%ab&quot;</constant> where
  * <constant>ab</constant> is the hexadecimal number corresponding to the character.
  *
- * Returns: a new string
+ * Returns: (transfer full): a new string
  */
 gchar *
 gda_rfc1738_encode (const gchar *string)
@@ -2255,7 +2254,7 @@ gda_rfc1738_encode (const gchar *string)
 		}
 
 		if (enc) {
-			sprintf (wptr, "%%%02x", (unsigned char) *rptr);
+			sprintf (wptr, "%%%02x", (unsigned char) *rptr); /* Flawfinder: ignore */
 			wptr += 3;
 		}
 		else {
@@ -2268,7 +2267,7 @@ gda_rfc1738_encode (const gchar *string)
 
 /**
  * gda_rfc1738_decode
- * @string: a string to encode 
+ * @string: a string to decode
  *
  * Decodes @string using the RFC 1738 recommendations: the
  * <constant>&lt;&gt;&quot;#%{}|\^~[]&apos;`;/?:@=&amp;</constant> and space characters are replaced by 
@@ -2465,40 +2464,50 @@ gda_connection_string_split (const gchar *string, gchar **out_cnc_params, gchar
 	if (*out_cnc_params) {
 		gchar *pos;
 
-		pos = g_strrstr (*out_cnc_params, "USERNAME=");
-		if (pos) {
-			for (ptr = pos + 9; ptr && *ptr != '\0' && *ptr != ';'; ptr++);
-			if (ptr != pos + 9)
-				*out_username = g_strndup (pos + 9, ptr - (pos + 9));
-
-			if (*ptr)
-				g_memmove (pos, ptr + 1, strlen (ptr));
-			else
-				*pos = 0;
-			gchar *tmp;
-			gint len;
-			tmp = *out_cnc_params;
-			len = strlen (tmp) - 1;
-			if (tmp [len] == ';')
-				tmp [len] = 0;
+		pos = strstr (*out_cnc_params, "USERNAME=");
+		while (pos) {
+			if (((pos > *out_cnc_params) && (*(pos-1) == ';')) ||
+			    (pos  == *out_cnc_params)) {
+				for (ptr = pos + 9; ptr && *ptr != '\0' && *ptr != ';'; ptr++);
+				if (ptr != pos + 9)
+					*out_username = g_strndup (pos + 9, ptr - (pos + 9));
+				
+				if (*ptr)
+					g_memmove (pos, ptr + 1, strlen (ptr));
+				else
+					*pos = 0;
+				gchar *tmp;
+				gint len;
+				tmp = *out_cnc_params;
+				len = strlen (tmp) - 1;
+				if (tmp [len] == ';')
+					tmp [len] = 0;
+				break;
+			}
+			pos = strstr (pos + 9, "USERNAME=");
 		}
 
-		pos = g_strrstr (*out_cnc_params, "PASSWORD=");
-		if (pos) {
-			for (ptr = pos + 9; ptr && *ptr != '\0' && *ptr != ';'; ptr++);
-			if (ptr != pos + 9)
-				*out_password = g_strndup (pos + 9, ptr - (pos + 9));
-
-			if (*ptr)
-				g_memmove (pos, ptr + 1, strlen (ptr));
-			else
-				*pos = 0;
-			gchar *tmp;
-			gint len;
-			tmp = *out_cnc_params;
-			len = strlen (tmp) - 1;
-			if (tmp [len] == ';')
-				tmp [len] = 0;
+		pos = strstr (*out_cnc_params, "PASSWORD=");
+		while (pos) {
+			if (((pos > *out_cnc_params) && (*(pos-1) == ';')) ||
+			    (pos  == *out_cnc_params)) {
+				for (ptr = pos + 9; ptr && *ptr != '\0' && *ptr != ';'; ptr++);
+				if (ptr != pos + 9)
+					*out_password = g_strndup (pos + 9, ptr - (pos + 9));
+				
+				if (*ptr)
+					g_memmove (pos, ptr + 1, strlen (ptr));
+				else
+					*pos = 0;
+				gchar *tmp;
+				gint len;
+				tmp = *out_cnc_params;
+				len = strlen (tmp) - 1;
+				if (tmp [len] == ';')
+					tmp [len] = 0;
+				break;
+			}
+			pos = strstr (pos +  9, "PASSWORD=");
 		}
 	}
 
@@ -2508,6 +2517,56 @@ gda_connection_string_split (const gchar *string, gchar **out_cnc_params, gchar
 	gda_rfc1738_decode (*out_password);
 }
 
+static gboolean
+_parse_iso8601_date (GDate *gdate, const gchar *value, char **out_endptr)
+{
+	GDateYear year;
+	GDateMonth month;
+	GDateDay day;
+	unsigned long int tmp;
+	char *endptr;
+
+	g_date_clear (gdate, 1);
+
+	if (! isdigit (*value))
+		return FALSE;
+	tmp = strtoul (value, &endptr, 10);
+	if (tmp <= G_MAXUINT16)
+		year = tmp;
+	else
+		return FALSE;
+	if (*endptr != '-')
+		return FALSE;
+
+	value = endptr + 1;
+	if (! isdigit (*value))
+		return FALSE;
+	tmp = strtoul (value, &endptr, 10);
+	month = tmp > 0 ? (tmp <= G_DATE_DECEMBER ? tmp : G_DATE_BAD_MONTH) : G_DATE_BAD_MONTH;
+	if (month == G_DATE_BAD_MONTH)
+		return FALSE;
+	if (*endptr != '-')
+		return FALSE;
+
+	value = endptr + 1;
+	if (! isdigit (*value))
+		return FALSE;
+	tmp = strtoul (value, &endptr, 10);
+	day = tmp > 0 ? (tmp <= G_MAXUINT8 ? tmp : G_DATE_BAD_DAY) : G_DATE_BAD_DAY;
+	if (day == G_DATE_BAD_DAY)
+		return FALSE;
+
+	if (g_date_valid_dmy (day, month, year)) {
+		g_date_set_dmy (gdate, day, month, year);
+		*out_endptr = endptr;
+		return TRUE;
+	}
+	else {
+		memset (gdate, 0, sizeof (GDate));
+		return FALSE;
+	}
+}
+
 /**
  * gda_parse_iso8601_date
  * @gdate: a pointer to a #GDate structure which will be filled
@@ -2515,30 +2574,94 @@ gda_connection_string_split (const gchar *string, gchar **out_cnc_params, gchar
  *
  * Extracts date parts from @value, and sets @gdate's contents
  *
- * Accepted date format is "YYYY-MM-DD".
+ * Accepted date format is "YYYY-MM-DD" (more or less than 4 digits for years and
+ * less than 2 digits for month and day are accepted). Years must be in the 1-65535 range,
+ * a limitation imposed by #GDate.
  *
- * Returns: TRUE if no error occurred
+ * Returns: %TRUE if no error occurred
  */
 gboolean
 gda_parse_iso8601_date (GDate *gdate, const gchar *value)
 {
-	GDateYear year;
-	GDateMonth month;
-	GDateDay day;
+	g_return_val_if_fail (gdate, FALSE);
+
+	char *endptr;
+	if (!value)
+		return FALSE;
 
-	year = atoi (value);
-	value += 5;
-	month = atoi (value);
-	value += 3;
-	day = atoi (value);
+	if (! _parse_iso8601_date (gdate, value, &endptr))
+		return FALSE;
+	if (*endptr)
+		return FALSE;
+	return TRUE;
+}
+
+static gboolean
+_parse_iso8601_time (GdaTime *timegda, const gchar *value, char **out_endptr)
+{
+	unsigned long int tmp;
+	char *endptr;
+
+	memset (timegda, 0, sizeof (GdaTime));
+	timegda->timezone = GDA_TIMEZONE_INVALID;
+
+	if (! isdigit (*value))
+		return FALSE;
+	tmp = strtoul (value, &endptr, 10);
+	if (tmp <= 23)
+		timegda->hour = tmp;
+	else
+		return FALSE;
+	if (*endptr != ':')
+		return FALSE;
 	
-	g_date_clear (gdate, 1);
-	if (g_date_valid_dmy (day, month, year)) {
-		g_date_set_dmy (gdate, day, month, year);
-		return TRUE;
-	}
+	value = endptr + 1;
+	if (! isdigit (*value))
+		return FALSE;
+	tmp = strtoul (value, &endptr, 10);
+	if (tmp < 60)
+		timegda->minute = tmp;
+	else
+		return FALSE;
+	if (*endptr != ':')
+		return FALSE;
+
+	value = endptr + 1;
+	if (! isdigit (*value))
+		return FALSE;
+	tmp = strtoul (value, &endptr, 10);
+	if (tmp < 60)
+		timegda->second = tmp;
 	else
 		return FALSE;
+
+	if (*endptr && (*endptr != '.') && (*endptr != '+') && (*endptr != '-')) {
+		*out_endptr = endptr;
+		return TRUE; /* end of the parsing */
+	}
+
+	if (*endptr == '.') {
+		value = endptr + 1;
+		if (! isdigit (*value))
+			return FALSE;
+		tmp = strtoul (value, &endptr, 10);
+		if (tmp < G_MAXULONG)
+			timegda->fraction = tmp;
+		else
+			return FALSE;
+	}
+	if ((*endptr == '+') || (*endptr == '-')) {
+		long int stmp;
+		value = endptr;
+		stmp = strtol (value, &endptr, 10);
+		if ((stmp >= -24) && (stmp <= 24))
+			timegda->timezone = stmp * 60 * 60;
+		else
+			return FALSE;
+	}
+
+	*out_endptr = endptr;
+	return TRUE;
 }
 
 /**
@@ -2555,38 +2678,16 @@ gda_parse_iso8601_date (GDate *gdate, const gchar *value)
 gboolean
 gda_parse_iso8601_time (GdaTime *timegda, const gchar *value)
 {
-	timegda->hour = atoi (value);
-	value += 3;
-	timegda->minute = atoi (value);
-	value += 3;
-	timegda->second = atoi (value);
-	value += 2;
-	if (*value != '.') {
-		timegda->fraction = 0;
-	} else {
-		gint ndigits = 0;
-		gint64 fraction;
-
-		value++;
-		fraction = atol (value);
-		while (*value && *value != '+') {
-			value++;
-			ndigits++;
-		}
+	g_return_val_if_fail (timegda, FALSE);
 
-		while (fraction > 0 && ndigits > 3) {
-			fraction /= 10;
-			ndigits--;
-		}
-		
-		timegda->fraction = fraction;
-	}
-
-	if (*value)
-		timegda->timezone = atol (value) * 60 * 60;
-	else
-		timegda->timezone = 0;
+	char *endptr;
+	if (!value)
+		return FALSE;
 
+	if (! _parse_iso8601_time (timegda, value, &endptr))
+		return FALSE;
+	if (*endptr)
+		return FALSE;
 	return TRUE;
 }
 
@@ -2604,43 +2705,51 @@ gda_parse_iso8601_time (GdaTime *timegda, const gchar *value)
 gboolean
 gda_parse_iso8601_timestamp (GdaTimestamp *timestamp, const gchar *value)
 {
-	timestamp->year = atoi (value);
-	value += 5;
-	timestamp->month = atoi (value);
-	value += 3;
-	timestamp->day = atoi (value);
-	value += 3;
-	timestamp->hour = atoi (value);
-	value += 3;
-	timestamp->minute = atoi (value);
-	value += 3;
-	timestamp->second = atoi (value);
-	value += 2;
-	if (*value != '.') {
-		timestamp->fraction = 0;
-	} else {
-		gint ndigits = 0;
-		gint64 fraction;
-
-		value++;
-		fraction = atol (value);
-		while (*value && *value != '+') {
-			value++;
-			ndigits++;
-		}
+	g_return_val_if_fail (timestamp, FALSE);
 
-		while (fraction > 0 && ndigits > 3) {
-			fraction /= 10;
-			ndigits--;
-		}
-		
-		timestamp->fraction = fraction;
+	gboolean retval = TRUE;
+	char *endptr;
+	GDate gdate;
+	GdaTime timegda;
+
+	memset (timestamp, 0, sizeof (GdaTimestamp));
+	memset (&timegda, 0, sizeof (GdaTime));
+	timegda.timezone = GDA_TIMEZONE_INVALID;
+
+	if (!value)
+		return FALSE;
+
+	/* date part */
+	if (! _parse_iso8601_date (&gdate, value, &endptr)) {
+		retval = FALSE;
+		goto out;
 	}
+	timestamp->year = g_date_get_year (&gdate);
+	timestamp->month = g_date_get_month (&gdate);
+	timestamp->day = g_date_get_day (&gdate);
 
-	if (*value)
-		timestamp->timezone = atol (value) * 60 * 60;
-	else
-		timestamp->timezone = 0;
+	/* separator */
+	if (!*endptr)
+		goto out;
 
-	return TRUE;
+	if (*endptr != ' ') {
+		retval = FALSE;
+		goto out;
+	}
+	value = endptr + 1;
+	if (!*value)
+		goto out;
+
+	/* time part */
+	if (! _parse_iso8601_time (&timegda, value, &endptr) ||
+	    *endptr) 
+		retval = FALSE;
+ out:
+	timestamp->hour = timegda.hour;
+	timestamp->minute = timegda.minute;
+	timestamp->second = timegda.second;
+	timestamp->fraction = timegda.fraction;
+	timestamp->timezone = timegda.timezone;
+
+	return retval;
 }
diff --git a/libgda/gda-value.c b/libgda/gda-value.c
index 6d10850..cf0e1b7 100644
--- a/libgda/gda-value.c
+++ b/libgda/gda-value.c
@@ -73,7 +73,7 @@ set_from_string (GValue *value, const gchar *as_string)
 		}
 		else {
 			gint i;
-			i = atoi (as_string);
+			i = atoi (as_string); /* Flawfinder: ignore */
 			g_value_set_boolean (value, i ? TRUE : FALSE);
 			retval = TRUE;
 		}
@@ -542,6 +542,11 @@ gda_geometricpoint_get_type (void)
 	return type;
 }
 
+/**
+ * gda_geometricpoint_copy:
+ *
+ * Returns: (transfer full):
+ */
 gpointer 
 gda_geometricpoint_copy (gpointer boxed)
 {
@@ -591,8 +596,13 @@ numeric_to_int (const GValue *src, GValue *dest)
 			  GDA_VALUE_HOLDS_NUMERIC (src));
 
 	numeric = gda_value_get_numeric (src);
-	if (numeric)
-		g_value_set_int (dest, atol (numeric->number));
+	if (numeric) {
+		glong tmp;
+		tmp = atol (numeric->number); /* Flawfinder: ignore */
+		if ((tmp < G_MININT) || (tmp > G_MAXINT))
+			g_warning ("Integer overflow for value %ld", tmp);
+		g_value_set_int (dest, tmp);
+	}
 	else
 		g_value_set_int (dest, 0);
 }
@@ -606,8 +616,13 @@ numeric_to_uint (const GValue *src, GValue *dest)
 			  GDA_VALUE_HOLDS_NUMERIC (src));
 
 	numeric = gda_value_get_numeric (src);
-	if (numeric)
-		g_value_set_uint (dest, atol (numeric->number));
+	if (numeric) {
+		glong tmp;
+		tmp = atol (numeric->number); /* Flawfinder: ignore */
+		if ((tmp < 0) || (tmp > G_MAXUINT))
+			g_warning ("Unsigned integer overflow for value %ld", tmp);
+		g_value_set_uint (dest, tmp);
+	}
 	else
 		g_value_set_uint (dest, 0);
 }
@@ -622,7 +637,7 @@ numeric_to_boolean (const GValue *src, GValue *dest)
 
 	numeric = gda_value_get_numeric (src);
 	if (numeric)
-		g_value_set_boolean (dest, atoi (numeric->number));
+		g_value_set_boolean (dest, atoi (numeric->number)); /* Flawfinder: ignore */
 	else
 		g_value_set_boolean (dest, 0);
 }
@@ -835,6 +850,11 @@ gda_time_get_type(void)
 	return type;
 }
 
+/**
+ * gda_time_copy:
+ *
+ * Returns: (transfer full):
+ */
 gpointer
 gda_time_copy (gpointer boxed)
 {
@@ -890,37 +910,14 @@ static void
 string_to_timestamp (const GValue *src, GValue *dest)
 {
 	/* FIXME: add more checks*/
-	GdaTimestamp *timestamp;
-	const gchar *as_string;
+	GdaTimestamp timestamp;
 	
 	g_return_if_fail (G_VALUE_HOLDS_STRING (src) &&
 			  GDA_VALUE_HOLDS_TIMESTAMP (dest));
-	
-	timestamp = g_new0 (GdaTimestamp, 1);
-	
-	as_string = g_value_get_string (src);
-	
-	timestamp->year = atoi (as_string);
-	as_string += 5;
-	timestamp->month = atoi (as_string);
-	as_string += 3;
-	timestamp->day = atoi (as_string);
-	as_string += 3;
-	timestamp->hour = atoi (as_string);
-	as_string += 3;
-	timestamp->minute = atoi (as_string);
-	as_string += 3;
-	timestamp->second = atoi (as_string);
-	if (strlen(as_string)>=3) {
-		as_string += 3;
-		timestamp->fraction = atol (as_string) * 10; /* I have only hundredths of second */
-		if (strlen(as_string)>=3) {
-			as_string += 3;
-			timestamp->timezone = atol (as_string) * 60 * 60;
-		}
-	}
-	gda_value_set_timestamp (dest, timestamp);
-	g_free (timestamp);
+
+	if (! gda_parse_iso8601_timestamp (&timestamp, g_value_get_string (src)))
+		g_warning ("Can't convert '%s' to a timestamp", g_value_get_string (src));
+	gda_value_set_timestamp (dest, &timestamp);
 }
 
 static void 
@@ -968,6 +965,11 @@ gda_timestamp_get_type (void)
 	return type;
 }
 
+/**
+ * gda_timestamp_copy:
+ *
+ * Returns: (transfer full):
+ */
 gpointer 
 gda_timestamp_copy (gpointer boxed)
 {
@@ -1101,7 +1103,7 @@ gda_value_new_blob (const guchar *val, glong size)
 	blob = g_new0 (GdaBlob, 1);
 	bin = (GdaBinary*)(blob);
 	bin->data = g_new (guchar, size);
-        memcpy ((gpointer) bin->data, (gpointer) val, size);
+        memcpy ((gpointer) bin->data, (gpointer) val, size); /* Flawfinder: ignore */
         bin->binary_length = size;
 	blob->op = NULL;
 
@@ -2255,7 +2257,7 @@ to_string (const GValue *value)
 
 
 /**
- * gda_value_to_xml:
+ * gda_value_to_xml: (skip):
  * @value: a #GValue.
  *
  * Serializes the given #GValue to an XML node string.
diff --git a/libgda/gda-xa-transaction.c b/libgda/gda-xa-transaction.c
index a62c60f..42ca710 100644
--- a/libgda/gda-xa-transaction.c
+++ b/libgda/gda-xa-transaction.c
@@ -149,8 +149,9 @@ gda_xa_transaction_set_property (GObject *object,
 				gchar *dtmp;
 				dtmp = g_strdup_printf ("gda_global_transaction_%p", xa_trans);
 				len = strlen (dtmp);
+				g_assert (len <= 64);
 				xa_trans->priv->xid.gtrid_length = len;
-				memcpy (xa_trans->priv->xid.data, dtmp, len);
+				memcpy (xa_trans->priv->xid.data, dtmp, len); /* Flawfinder: ignore */
 				g_free (dtmp);
 			}
 			else {
@@ -159,7 +160,7 @@ gda_xa_transaction_set_property (GObject *object,
 					g_warning (_("Global transaction ID can not have more than 64 bytes"));
 				else {
 					xa_trans->priv->xid.gtrid_length = len;
-					memcpy (xa_trans->priv->xid.data, tmp, len);
+					memcpy (xa_trans->priv->xid.data, tmp, len); /* Flawfinder: ignore */
 				}
 			}
                         break;
@@ -188,8 +189,9 @@ gda_xa_transaction_get_property (GObject *object,
                 case PROP_TRANSACT_ID: {
 			gchar *tmp;
 
-			tmp = g_new0 (gchar, xa_trans->priv->xid.gtrid_length + 1);
-			memcpy (tmp, xa_trans->priv->xid.data, xa_trans->priv->xid.gtrid_length);
+			tmp = g_new (gchar, xa_trans->priv->xid.gtrid_length + 1);
+			memcpy (tmp, xa_trans->priv->xid.data, xa_trans->priv->xid.gtrid_length); /* Flawfinder: ignore */
+			tmp [xa_trans->priv->xid.gtrid_length] = 0;
 			g_value_take_string (value, tmp);
                         break;
 		}
@@ -279,6 +281,12 @@ gda_xa_transaction_register_connection  (GdaXaTransaction *xa_trans, GdaConnecti
 	g_return_val_if_fail (GDA_IS_XA_TRANSACTION (xa_trans), FALSE);
 	g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
 	g_return_val_if_fail (branch && *branch, FALSE);
+	if (strlen (branch) >= 64) {
+		g_set_error (error, GDA_XA_TRANSACTION_ERROR,
+			     GDA_XA_TRANSACTION_CONNECTION_BRANCH_LENGTH_ERROR,
+			     "%s", _("Connection branch cannot exceed 63 bytes"));
+		return FALSE;
+	}
 
 	const GdaBinary *ebranch = g_hash_table_lookup (xa_trans->priv->cnc_hash, cnc);
 	if (ebranch) {
@@ -374,7 +382,6 @@ gda_xa_transaction_begin  (GdaXaTransaction *xa_trans, GError **error)
 		cnc = GDA_CONNECTION (list->data);
 		prov = gda_connection_get_provider (cnc);
 		if (cnc != xa_trans->priv->non_xa_cnc) {
-		       
 			if (!PROV_CLASS (prov)->xa_funcs->xa_start) {
 				g_warning (_("Provider error: %s method not implemented for provider %s"),
 					   "xa_start()", gda_server_provider_get_name (prov));
@@ -383,7 +390,7 @@ gda_xa_transaction_begin  (GdaXaTransaction *xa_trans, GError **error)
 			else {
 				const GdaBinary *branch;
 				branch = g_hash_table_lookup (xa_trans->priv->cnc_hash, cnc);
-				memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length,
+				memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length, /* Flawfinder: ignore */
 					branch->data, branch->binary_length);
 				if (!PROV_CLASS (prov)->xa_funcs->xa_start (prov, cnc, &(xa_trans->priv->xid), error))
 					break;
@@ -412,7 +419,7 @@ gda_xa_transaction_begin  (GdaXaTransaction *xa_trans, GError **error)
 				else {
 					const GdaBinary *branch;
 					branch = g_hash_table_lookup (xa_trans->priv->cnc_hash, cnc);
-					memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length,
+					memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length, /* Flawfinder: ignore */
 						branch->data, branch->binary_length);
 					PROV_CLASS (prov)->xa_funcs->xa_rollback (prov, cnc, &(xa_trans->priv->xid), NULL);
 				}
@@ -470,7 +477,7 @@ gda_xa_transaction_commit (GdaXaTransaction *xa_trans, GSList **cnc_to_recover,
 		prov = gda_connection_get_provider (cnc);
 
 		branch = g_hash_table_lookup (xa_trans->priv->cnc_hash, cnc);
-		memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length,
+		memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length, /* Flawfinder: ignore */
 			branch->data, branch->binary_length);
 
 		if (PROV_CLASS (prov)->xa_funcs->xa_end && 
@@ -504,7 +511,7 @@ gda_xa_transaction_commit (GdaXaTransaction *xa_trans, GSList **cnc_to_recover,
 				cnc = GDA_CONNECTION (list->data);
 				prov = gda_connection_get_provider (cnc);
 				branch = g_hash_table_lookup (xa_trans->priv->cnc_hash, cnc);
-				memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length,
+				memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length, /* Flawfinder: ignore */
 					branch->data, branch->binary_length);
 
 				if (PROV_CLASS (prov)->xa_funcs->xa_rollback)
@@ -534,7 +541,7 @@ gda_xa_transaction_commit (GdaXaTransaction *xa_trans, GSList **cnc_to_recover,
 				cnc = GDA_CONNECTION (list->data);
 				prov = gda_connection_get_provider (cnc);
 				branch = g_hash_table_lookup (xa_trans->priv->cnc_hash, cnc);
-				memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length,
+				memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length, /* Flawfinder: ignore */
 					branch->data, branch->binary_length);
 
 				if (PROV_CLASS (prov)->xa_funcs->xa_rollback)
@@ -558,7 +565,7 @@ gda_xa_transaction_commit (GdaXaTransaction *xa_trans, GSList **cnc_to_recover,
 		cnc = GDA_CONNECTION (list->data);
 		prov = gda_connection_get_provider (cnc);
 		branch = g_hash_table_lookup (xa_trans->priv->cnc_hash, cnc);
-		memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length,
+		memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length, /* Flawfinder: ignore */
 			branch->data, branch->binary_length);
 		if (!PROV_CLASS (prov)->xa_funcs->xa_commit (prov, cnc, &(xa_trans->priv->xid), error) &&
 		    cnc_to_recover)
@@ -595,8 +602,8 @@ gda_xa_transaction_rollback (GdaXaTransaction *xa_trans, GError **error)
 		else {
 			const GdaBinary *branch;
 			branch = g_hash_table_lookup (xa_trans->priv->cnc_hash, cnc);
-			memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length,
-			branch->data, branch->binary_length);
+			memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length, /* Flawfinder: ignore */
+				branch->data, branch->binary_length);
 			if (!PROV_CLASS (prov)->xa_funcs->xa_rollback) 
 				g_warning (_("Provider error: %s method not implemented for provider %s"),
 					   "xa_prepare()", gda_server_provider_get_name (prov));
@@ -655,7 +662,7 @@ gda_xa_transaction_commit_recovered (GdaXaTransaction *xa_trans, GSList **cnc_to
 					continue;
 
 				branch = g_hash_table_lookup (xa_trans->priv->cnc_hash, cnc);
-				memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length,
+				memcpy (xa_trans->priv->xid.data + xa_trans->priv->xid.gtrid_length, /* Flawfinder: ignore */
 					branch->data, branch->binary_length);
 				for (xlist = recov_xid_list; xlist; xlist = xlist->next) {
 					GdaXaTransactionId *xid = (GdaXaTransactionId*) xlist->data;
@@ -722,7 +729,7 @@ gda_xa_transaction_id_to_string (const GdaXaTransactionId *xid)
 			index++;
 		}
 		else 
-			index += sprintf (str+index, "%%%02x", xid->data[i]);
+			index += sprintf (str+index, "%%%02x", xid->data[i]); /* Flawfinder: ignore */
 	}
 
 	/* branch qualifier */
@@ -733,24 +740,24 @@ gda_xa_transaction_id_to_string (const GdaXaTransactionId *xid)
 			index++;
 		}
 		else 
-			index += sprintf (str+index, "%%%02x", xid->data[xid->gtrid_length + i]);
+			index += sprintf (str+index, "%%%02x", xid->data[xid->gtrid_length + i]); /* Flawfinder: ignore */
 	}
 
 	/* Format ID */
 	str [index++] = ',';
-	sprintf (str, "%d", xid->format);
+	sprintf (str, "%d", xid->format); /* Flawfinder: ignore */
 
 	return str;
 }
 
 /**
- * gda_xa_transaction_string_to_id:
+ * gda_xa_transaction_string_to_id: (skip):
  * @str: a string representation of a #GdaXaTransactionId, in the "gtrid,bqual,formatID" format
  *
  * Creates a new #GdaXaTransactionId structure from its string representation, it's the opposite
  * of gda_xa_transaction_id_to_string().
  *
- * Returns: (transfer full): a new #GdaXaTransactionId structure, or %NULL in @str has a wrong format
+ * Returns: a new #GdaXaTransactionId structure, or %NULL in @str has a wrong format
  *
  * Free-function: g_free
  */
@@ -767,6 +774,9 @@ gda_xa_transaction_string_to_id (const gchar *str)
 
 	/* global transaction ID */
 	for (ptr = str; *ptr && (*ptr != ','); ptr++, index++) {
+		if (index >= 64)
+			goto onerror;
+
 		if (*ptr == '%') {
 			ptr++;
 			if (*ptr && (((*ptr >= 'a') && (*ptr <= 'f')) ||
@@ -792,8 +802,7 @@ gda_xa_transaction_string_to_id (const gchar *str)
 		else if (g_ascii_isalnum (*ptr))
 			xid->data [index] = *ptr;
 		else
-			goto onerror;
-			 
+			goto onerror;			 
 	}
 	xid->gtrid_length = index;
 
@@ -801,6 +810,9 @@ gda_xa_transaction_string_to_id (const gchar *str)
 	if (*ptr != ',') 
 		goto onerror;
 	for (ptr++; *ptr && (*ptr != ','); ptr++, index++) {
+		if (index >= 128)
+			goto onerror;
+
 		if (*ptr == '%') {
 			ptr++;
 			if (*ptr && (((*ptr >= 'a') && (*ptr <= 'f')) ||
@@ -827,7 +839,6 @@ gda_xa_transaction_string_to_id (const gchar *str)
 			xid->data [index] = *ptr;
 		else
 			goto onerror;
-			 
 	}
 	xid->bqual_length = index - xid->gtrid_length;
 
@@ -835,7 +846,11 @@ gda_xa_transaction_string_to_id (const gchar *str)
 	if (*ptr != ',') 
 		goto onerror;
 	ptr++;
-	xid->format = atoi (ptr);
+	gint tmp = atoi (ptr); /* Flawfinder: ignore */
+	if ((tmp < 0) || (tmp >= G_MAXUINT32))
+		goto onerror;
+
+	xid->format = tmp;
 	
 	return xid;
 
diff --git a/libgda/gda-xa-transaction.h b/libgda/gda-xa-transaction.h
index 87cc348..8ba5698 100644
--- a/libgda/gda-xa-transaction.h
+++ b/libgda/gda-xa-transaction.h
@@ -47,7 +47,8 @@ extern GQuark gda_xa_transaction_error_quark (void);
 typedef enum
 {
         GDA_XA_TRANSACTION_ALREADY_REGISTERED_ERROR,
-	GDA_XA_TRANSACTION_DTP_NOT_SUPPORTED_ERROR
+	GDA_XA_TRANSACTION_DTP_NOT_SUPPORTED_ERROR,
+	GDA_XA_TRANSACTION_CONNECTION_BRANCH_LENGTH_ERROR
 } GdaXaTransactionError;
 
 struct _GdaXaTransaction {
@@ -58,6 +59,7 @@ struct _GdaXaTransaction {
 struct _GdaXaTransactionClass {
 	GObjectClass             parent_class;
 
+	/*< private >*/
 	/* Padding for future expansion */
 	void (*_gda_reserved1) (void);
 	void (*_gda_reserved2) (void);
diff --git a/libgda/handlers/gda-handler-bin.c b/libgda/handlers/gda-handler-bin.c
index 6c4ccf2..3ba2453 100644
--- a/libgda/handlers/gda-handler-bin.c
+++ b/libgda/handlers/gda-handler-bin.c
@@ -148,11 +148,11 @@ gda_handler_bin_dispose (GObject   * object)
 }
 
 /**
- * gda_handler_bin_new
+ * gda_handler_bin_new:
  *
  * Creates a data handler for binary values
  *
- * Returns: the new object
+ * Returns: (transfer full): the new object
  */
 GdaDataHandler *
 gda_handler_bin_new (void)
diff --git a/libgda/handlers/gda-handler-boolean.c b/libgda/handlers/gda-handler-boolean.c
index aecceda..9f3f87c 100644
--- a/libgda/handlers/gda-handler-boolean.c
+++ b/libgda/handlers/gda-handler-boolean.c
@@ -146,11 +146,11 @@ gda_handler_boolean_dispose (GObject *object)
 }
 
 /**
- * gda_handler_boolean_new
+ * gda_handler_boolean_new:
  *
  * Creates a data handler for booleans
  *
- * Returns: the new object
+ * Returns: (transfer full): the new object
  */
 GdaDataHandler *
 gda_handler_boolean_new (void)
diff --git a/libgda/handlers/gda-handler-numerical.c b/libgda/handlers/gda-handler-numerical.c
index 065271e..625aa68 100644
--- a/libgda/handlers/gda-handler-numerical.c
+++ b/libgda/handlers/gda-handler-numerical.c
@@ -160,11 +160,11 @@ gda_handler_numerical_dispose (GObject *object)
 }
 
 /**
- * gda_handler_numerical_new
+ * gda_handler_numerical_new:
  *
  * Creates a data handler for numerical values
  *
- * Returns: the new object
+ * Returns: (transfer full): the new object
  */
 GdaDataHandler *
 gda_handler_numerical_new (void)
@@ -228,22 +228,34 @@ gda_handler_numerical_get_value_from_str (GdaDataHandler *iface, const gchar *st
 {
 	GdaHandlerNumerical *hdl;
 	GValue *value = NULL;
+	long long int llint;
+	char *endptr = NULL;
 
 	g_return_val_if_fail (iface && GDA_IS_HANDLER_NUMERICAL (iface), NULL);
 	hdl = GDA_HANDLER_NUMERICAL (iface);
 	g_return_val_if_fail (hdl->priv, NULL);
 
+	llint = strtoll (str, &endptr, 10);
+
 	if (type == G_TYPE_INT64) {
-		value = g_value_init (g_new0 (GValue, 1), G_TYPE_INT64);
-		g_value_set_int64 (value, atoll (str));
+		if (!*endptr && (llint >= G_MININT64) && (llint <= G_MAXINT64)) {
+			value = g_value_init (g_new0 (GValue, 1), G_TYPE_INT64);
+			g_value_set_int64 (value, (gint64) llint);
+		}
 	}
 	else if (type == G_TYPE_DOUBLE) {
-		value = g_value_init (g_new0 (GValue, 1), G_TYPE_DOUBLE);
-		g_value_set_double (value, atof (str));
+		gdouble dble;
+		dble = g_strtod (str, &endptr);
+		if (!*endptr) {
+			value = g_value_init (g_new0 (GValue, 1), G_TYPE_DOUBLE);
+			g_value_set_double (value, dble);
+		}
 	}
 	else if (type == G_TYPE_INT) {
-		value = g_value_init (g_new0 (GValue, 1), G_TYPE_INT);
-		g_value_set_int (value, atoi (str));
+		if (!*endptr && (llint >= G_MININT) && (llint <= G_MAXINT)) {
+			value = g_value_init (g_new0 (GValue, 1), G_TYPE_INT);
+			g_value_set_int (value, (gint) llint);
+		}
 	}
 	else if (type == GDA_TYPE_NUMERIC) {
 		GdaNumeric numeric;
@@ -278,40 +290,76 @@ gda_handler_numerical_get_value_from_str (GdaDataHandler *iface, const gchar *st
 		}
 	}
 	else if (type == G_TYPE_FLOAT) {
-		value = g_value_init (g_new0 (GValue, 1), G_TYPE_FLOAT);
-		g_value_set_float (value, atof (str));
+		gfloat flt;
+		flt = strtof (str, &endptr);
+		if (!*endptr) {
+			value = g_value_init (g_new0 (GValue, 1), G_TYPE_FLOAT);
+			g_value_set_float (value, flt);
+		}
 	}
 	else if (type == GDA_TYPE_SHORT) {
-		value = g_value_init (g_new0 (GValue, 1), GDA_TYPE_SHORT);
-		gda_value_set_short (value, atoi (str));
+		if (!*endptr && (llint >= G_MINSHORT) && (llint <= G_MAXSHORT)) {
+			value = g_value_init (g_new0 (GValue, 1), GDA_TYPE_SHORT);
+			gda_value_set_short (value, (gshort) llint);
+		}
 	}
 	else if (type == G_TYPE_CHAR) {
-		value = g_value_init (g_new0 (GValue, 1), G_TYPE_CHAR);
-		g_value_set_char (value, atoi (str));
+		if (!*endptr && (llint >= G_MININT8) && (llint <= G_MAXINT8)) {
+			value = g_value_init (g_new0 (GValue, 1), G_TYPE_CHAR);
+			g_value_set_char (value, (gchar) llint);
+		}
 	}
 	else if (type == G_TYPE_UINT64) {
-		value = g_value_init (g_new0 (GValue, 1), G_TYPE_UINT64);
-		g_value_set_uint64 (value, strtoull (str, NULL, 10));
+		if (!*endptr && (llint >= 0) && (llint <= G_MAXUINT64)) {
+			value = g_value_init (g_new0 (GValue, 1), G_TYPE_UINT64);
+			g_value_set_uint64 (value, (guint64) llint);
+		}
+		else {
+			unsigned long long int lluint;
+			lluint = strtoull (str, &endptr, 10);
+			if (!*endptr && (lluint <= G_MAXUINT64)) {
+				value = g_value_init (g_new0 (GValue, 1), G_TYPE_UINT64);
+				g_value_set_uint64 (value, (guint64) lluint);
+			}
+		}
 	}
 	else if (type == GDA_TYPE_USHORT) {
-		value = g_value_init (g_new0 (GValue, 1), GDA_TYPE_USHORT);
-		gda_value_set_ushort (value, atoi (str));
+		if (!*endptr && (llint >= 0) && (llint <= G_MAXUSHORT)) {
+			value = g_value_init (g_new0 (GValue, 1), GDA_TYPE_USHORT);
+			gda_value_set_ushort (value, (gushort) llint);
+		}
 	}
 	else if (type == G_TYPE_UCHAR) {
-		value = g_value_init (g_new0 (GValue, 1), G_TYPE_UCHAR);
-		g_value_set_uchar (value, atoi (str));
+		if (!*endptr && (llint >= 0) && (llint <= G_MAXUINT8)) {
+			value = g_value_init (g_new0 (GValue, 1), G_TYPE_UCHAR);
+			g_value_set_uchar (value, (guchar) llint);
+		}
 	}
 	else if (type == G_TYPE_UINT) {
-		value = g_value_init (g_new0 (GValue, 1), G_TYPE_UINT);
-		g_value_set_uint (value, strtoul (str, NULL, 10));
+		if (!*endptr && (llint >= 0) && (llint <= G_MAXUINT)) {
+			value = g_value_init (g_new0 (GValue, 1), G_TYPE_UINT);
+			g_value_set_uint (value, (guint) llint);
+		}
 	}
 	else if (type == G_TYPE_ULONG) {
-		value = g_value_init (g_new0 (GValue, 1), G_TYPE_ULONG);
-		g_value_set_ulong (value, strtoul (str, NULL, 10));
+		if (!*endptr && (llint >= 0) && (llint <= G_MAXULONG)) {
+			value = g_value_init (g_new0 (GValue, 1), G_TYPE_ULONG);
+			g_value_set_ulong (value, (gulong) llint);
+		}
+		else {
+			unsigned long long int lluint;
+			lluint = strtoull (str, &endptr, 10);
+			if (!*endptr && (lluint <= G_MAXULONG)) {
+				value = g_value_init (g_new0 (GValue, 1), G_TYPE_ULONG);
+				g_value_set_ulong (value, (gulong) lluint);
+			}
+		}
 	}
 	else if (type == G_TYPE_LONG) {
-		value = g_value_init (g_new0 (GValue, 1), G_TYPE_LONG);
-		g_value_set_long (value, strtol (str, NULL, 10));
+		if (!*endptr && (llint >= G_MINLONG) && (llint <= G_MAXLONG)) {
+			value = g_value_init (g_new0 (GValue, 1), G_TYPE_LONG);
+			g_value_set_long (value, (glong) llint);
+		}
 	}
 	else
 		g_assert_not_reached ();
diff --git a/libgda/handlers/gda-handler-string.c b/libgda/handlers/gda-handler-string.c
index bb330b0..ef3e583 100644
--- a/libgda/handlers/gda-handler-string.c
+++ b/libgda/handlers/gda-handler-string.c
@@ -156,11 +156,11 @@ gda_handler_string_dispose (GObject   * object)
 }
 
 /**
- * gda_handler_string_new
+ * gda_handler_string_new:
  *
  * Creates a data handler for strings
  *
- * Returns: the new object
+ * Returns: (transfer full): the new object
  */
 GdaDataHandler *
 gda_handler_string_new (void)
@@ -173,14 +173,14 @@ gda_handler_string_new (void)
 }
 
 /**
- * gda_handler_string_new_with_provider
+ * gda_handler_string_new_with_provider:
  * @prov: a #GdaServerProvider object
- * @cnc: a #GdaConnection object, or %NULL
+ * @cnc: (allow-none): a #GdaConnection object, or %NULL
  *
  * Creates a data handler for strings, which will use some specific methods implemented
  * by the @prov object (possibly also @cnc).
  *
- * Returns: the new object
+ * Returns: (transfer full): the new object
  */
 GdaDataHandler *
 gda_handler_string_new_with_provider (GdaServerProvider *prov, GdaConnection *cnc)
diff --git a/libgda/handlers/gda-handler-time.c b/libgda/handlers/gda-handler-time.c
index 4f6fa7c..39e54af 100644
--- a/libgda/handlers/gda-handler-time.c
+++ b/libgda/handlers/gda-handler-time.c
@@ -1,6 +1,6 @@
 /* gda-handler-time.c
  *
- * Copyright (C) 2003 - 2009 Vivien Malerba
+ * Copyright (C) 2003 - 2010 Vivien Malerba
  *
  * This Library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public License as
@@ -20,6 +20,7 @@
 
 #include "gda-handler-time.h"
 #include <string.h>
+#include <ctype.h>
 #include <glib/gi18n-lib.h>
 
 static void gda_handler_time_class_init (GdaHandlerTimeClass *class);
@@ -195,11 +196,11 @@ gda_handler_time_dispose (GObject *object)
 }
 
 /**
- * gda_handler_time_new
+ * gda_handler_time_new:
  *
  * Creates a data handler for time values
  *
- * Returns: the new object
+ * Returns: (transfer full): the new object
  */
 GdaDataHandler *
 gda_handler_time_new (void)
@@ -213,12 +214,12 @@ gda_handler_time_new (void)
 }
 
 /**
- * gda_handler_time_new_no_locale
+ * gda_handler_time_new_no_locale:
  *
  * Creates a data handler for time values, but using the default C locale
  * instead of the current user locale.
  *
- * Returns: the new object
+ * Returns: (transfer full): the new object
  */
 GdaDataHandler *
 gda_handler_time_new_no_locale (void)
@@ -263,6 +264,41 @@ gda_handler_time_set_sql_spec  (GdaHandlerTime *dh, GDateDMY first, GDateDMY sec
 	dh->priv->sql_locale->separator = separator;
 }
 
+/**
+ * gda_handler_time_set_str_spec
+ * @dh: a #GdaHandlerTime object
+ * @first: what comes first in the date representation
+ * @sec: what comes second in the date representation
+ * @third: what comes third in the date representation
+ * @separator: separator character used between year, month and day
+ * @twodigits_years: TRUE if year part of date must be rendered on 2 digits
+ *
+ * Specifies the human readable output style of the @dh data handler.
+ * The general format is "FIRSTsSECsTHIRD"
+ * where FIRST, SEC and THIRD are specified by @first, @sec and @trird and 's' is the separator,
+ * specified by @separator.
+ *
+ * The default implementation depends on the current locale, except if @dh was created
+ * using gda_handler_time_new_no_locale().
+ *
+ * Since: 4.2.1
+ */
+void
+gda_handler_time_set_str_spec  (GdaHandlerTime *dh, GDateDMY first, GDateDMY sec,
+				GDateDMY third, gchar separator, gboolean twodigits_years)
+{
+	g_return_if_fail (GDA_IS_HANDLER_TIME (dh));
+	g_return_if_fail (dh->priv);
+	g_return_if_fail (first != sec);
+	g_return_if_fail (sec != third);
+	g_return_if_fail (first != third);
+
+	dh->priv->str_locale->dmy_order[0] = first;
+	dh->priv->str_locale->dmy_order[1] = sec;
+	dh->priv->str_locale->dmy_order[2] = third;
+	dh->priv->str_locale->twodigit_years = twodigits_years;
+	dh->priv->str_locale->separator = separator;
+}
 
 static void
 handler_compute_locale (GdaHandlerTime *hdl)
@@ -284,9 +320,10 @@ handler_compute_locale (GdaHandlerTime *hdl)
 	if (*ptr) {
 		hdl->priv->str_locale->separator = *ptr;
 		*ptr = 0;
-		nums[0] = atoi (numstart);
+		nums[0] = atoi (numstart); /* Flawfinder: ignore */
 	}
-	else error = TRUE;
+	else
+		error = TRUE;
 
 	/* 2nd number */
 	if (!error) {
@@ -296,9 +333,10 @@ handler_compute_locale (GdaHandlerTime *hdl)
 			ptr++;
 		if (*ptr) {
 			*ptr = 0;
-			nums[1] = atoi (numstart);
+			nums[1] = atoi (numstart); /* Flawfinder: ignore */
 		}
-		else error = TRUE;
+		else
+			error = TRUE;
 	}
 
 	/* 3rd number */
@@ -308,7 +346,7 @@ handler_compute_locale (GdaHandlerTime *hdl)
 		while (*ptr && g_ascii_isdigit (*ptr))
 			ptr++;
 		*ptr = 0;
-		nums[2] = atoi (numstart);
+		nums[2] = atoi (numstart); /* Flawfinder: ignore */
 	}
 	
 	/* computations */
@@ -742,7 +780,8 @@ gda_handler_time_get_value_from_str (GdaDataHandler *iface, const gchar *sql, GT
 
 static gboolean make_timestamp (GdaHandlerTime *hdl, GdaTimestamp *timestamp, 
 				const gchar *value, LocaleSetting *locale);
-static gboolean make_date (GdaHandlerTime *hdl, GDate *date, const gchar *value, LocaleSetting *locale);
+static gboolean make_date (GdaHandlerTime *hdl, GDate *date, const gchar *value,
+			   LocaleSetting *locale, const gchar **out_endptr);
 static gboolean make_time (GdaHandlerTime *hdl, GdaTime *timegda, const gchar *value);
 static GValue *
 gda_handler_time_get_value_from_locale (GdaDataHandler *iface, const gchar *sql, 
@@ -760,7 +799,7 @@ gda_handler_time_get_value_from_locale (GdaDataHandler *iface, const gchar *sql,
 	g_return_val_if_fail (hdl->priv, NULL);
 
 	if (type == G_TYPE_DATE) {
-		if (make_date (hdl, &date, sql, locale)) {
+		if (make_date (hdl, &date, sql, locale, NULL)) {
 			value = g_value_init (g_new0 (GValue, 1), G_TYPE_DATE);
 			g_value_set_boxed (value, (gconstpointer) &date);
 		}
@@ -791,47 +830,69 @@ static gboolean
 make_timestamp (GdaHandlerTime *hdl, GdaTimestamp *timestamp, const gchar *value, LocaleSetting *locale)
 {
 	gboolean retval;
-	gchar *str, *ptr;
+	const gchar *end_ptr;
 	GDate vdate;
 	GdaTime vtime;
-	char *buff;
+	memset (&vtime, 0, sizeof (GdaTime));
+	vtime.timezone = GDA_TIMEZONE_INVALID;
+
+	retval = make_date (hdl, &vdate, value, locale, &end_ptr);
+	timestamp->day = vdate.day;
+	timestamp->month = vdate.month;
+	timestamp->year = vdate.year;
 
-	str = g_strdup (value);
-	ptr = strtok_r (str, " ", &buff);
-	retval = make_date (hdl, &vdate, ptr, locale);
 	if (retval) {
-		ptr = strtok_r (NULL, " ", &buff);
-		retval = make_time (hdl, &vtime, ptr);
-		if (retval) {
-			timestamp->day = vdate.day;
-			timestamp->month = vdate.month;
-			timestamp->year = vdate.year;
-
-			timestamp->hour = vtime.hour;
-			timestamp->minute = vtime.minute;
-			timestamp->second = vtime.second;
-			timestamp->fraction = vtime.fraction;
-			timestamp->timezone = vtime.timezone;
-		}
+		if (*end_ptr != ' ')
+			retval = FALSE;
+		else
+			retval = make_time (hdl, &vtime, end_ptr + 1);
 	}
-	g_free (str);
+
+	timestamp->hour = vtime.hour;
+	timestamp->minute = vtime.minute;
+	timestamp->second = vtime.second;
+	timestamp->fraction = vtime.fraction;
+	timestamp->timezone = vtime.timezone;
 
 	/*g_print ("Value #%s# => %d\n", value, retval);*/
 
 	return retval;
 }
 
+static gboolean
+get_uint_from_string (const gchar *str, guint16 *out_int)
+{
+	long int li;
+	char *endptr = NULL;
+	li = strtol (str, &endptr, 10);
+	if (!*endptr && (li >= 0) && (li <= G_MAXUINT16)) {
+		*out_int = (guint16) li;
+		return TRUE;
+	}
+	else {
+		*out_int = 0;
+		return FALSE;
+	}
+}
 
-/* Makes a GDate from a string like "24-12-2003" */
+/* Makes a GDate from a string like "24-12-2003"
+ * If @out_endptr is %NULL, then all the @value has to be consumed and there must not
+ * be any character left. If it's not %NULL, then it will point on the first unused character
+ * of @value.
+ */
 static gboolean
-make_date (G_GNUC_UNUSED GdaHandlerTime *hdl, GDate *date, const gchar *value, LocaleSetting *locale)
+make_date (G_GNUC_UNUSED GdaHandlerTime *hdl, GDate *date, const gchar *value,
+	   LocaleSetting *locale, const gchar **out_endptr)
 {
 	gboolean retval = TRUE;
-	gushort nums[3];
+	guint16 nums[3];
 	gboolean error = FALSE;
 	gchar *ptr, *numstart, *tofree;
 	gint i;
 
+	if (out_endptr)
+		*out_endptr = NULL;
+
 	if (!value)
 		return FALSE;
 
@@ -846,47 +907,70 @@ make_date (G_GNUC_UNUSED GdaHandlerTime *hdl, GDate *date, const gchar *value, L
 		ptr++;
 	if ((ptr != numstart) && *ptr) {
 		*ptr = 0;
-		nums[0] = atoi (numstart);
+		if (! get_uint_from_string (numstart, &(nums[0])))
+			error = TRUE;
 	}
-	else error = TRUE;
+	else
+		error = TRUE;
 
 	/* 2nd number */
 	if (!error) {
-		ptr++;
-		numstart = ptr;
-		while (*ptr && g_ascii_isdigit (*ptr))
+		if (value [ptr-tofree] != locale->separator)
+			error = TRUE;
+		else {
 			ptr++;
-		if ((ptr != numstart) && *ptr) {
-			*ptr = 0;
-			nums[1] = atoi (numstart);
+			numstart = ptr;
+			while (*ptr && g_ascii_isdigit (*ptr))
+				ptr++;
+			if ((ptr != numstart) && *ptr) {
+				*ptr = 0;
+				if (! get_uint_from_string (numstart, &(nums[1])))
+					error = TRUE;
+			}
+			else
+				error = TRUE;
 		}
-		else error = TRUE;
 	}
 
 	/* 3rd number */
 	if (!error) {
-		ptr++;
-		numstart = ptr;
-		while (*ptr && g_ascii_isdigit (*ptr))
+		if (value [ptr-tofree] != locale->separator)
+			error = TRUE;
+		else {
 			ptr++;
-		*ptr = 0;
-		if (ptr != numstart)
-			nums[2] = atoi (numstart);
-		else
+			numstart = ptr;
+			while (*ptr && g_ascii_isdigit (*ptr))
+				ptr++;
+			*ptr = 0;
+			if (ptr != numstart) {
+				if (! get_uint_from_string (numstart, &(nums[2])))
+					error = TRUE;
+			}
+			else
+				error = TRUE;
+		}
+	}
+
+	/* test if there are some characters left */
+	if (!error) {
+		if (out_endptr)
+			*out_endptr = value + (ptr-tofree);
+		else if (value [ptr-tofree])
 			error = TRUE;
 	}
 
+	/* analyse what's parsed */
 	if (!error) {
 		for (i=0; i<3; i++) {
 			switch (locale->dmy_order[i]) {
 			case G_DATE_DAY:
-				if (g_date_valid_day (nums[i]))
+				if ((nums[i] <= G_MAXUINT8) && g_date_valid_day ((GDateDay) nums[i]))
 					g_date_set_day (date, nums[i]);
 				else
 					retval = FALSE;
 				break;
 			case G_DATE_MONTH:
-				if (g_date_valid_month (nums[i]))
+				if ((nums[i] <= 12) && g_date_valid_month ((GDateMonth) nums[i]))
 					g_date_set_month (date, nums[i]);
 				else
 					retval = FALSE;
@@ -928,101 +1012,95 @@ make_time (G_GNUC_UNUSED GdaHandlerTime *hdl, GdaTime *timegda, const gchar *val
 {
 	const gchar *ptr;
 
+	memset (timegda, 0, sizeof (GdaTime));
+	timegda->timezone = GDA_TIMEZONE_INVALID;
+
 	if (!value)
 		return FALSE;
 
 	/* hour */
-	timegda->fraction = 0;
-	timegda->timezone = GDA_TIMEZONE_INVALID;
 	ptr = value;
-	if ((*ptr >= '0') && (*ptr <= '9') &&
-	    (*(ptr+1) >= '0') && (*(ptr+1) <= '9')) {
-		timegda->hour = (*ptr - '0') * 10 + *(ptr+1) - '0';
-		ptr += 2;
-	}
-	else if ((*ptr >= '0') && (*ptr <= '9') && (ptr[1] == ':')) {
-		timegda->hour = *ptr - '0';
+	if (!isdigit (*ptr))
+		return FALSE;
+
+	timegda->hour = *ptr - '0';
+	ptr++;
+	if (isdigit (*ptr)) {
+		timegda->hour = timegda->hour * 10 + (*ptr - '0');
 		ptr++;
 	}
-	else if (*ptr == ':')
-		timegda->hour = 0;
-	else
+	if (timegda->hour >= 24)
 		return FALSE;
 
-	/* minute */
-	if (! *ptr)
-		return FALSE;
 	if (*ptr == ':')
 		ptr++;
-	if ((*ptr >= '0') && (*ptr <= '9') &&
-	    (*(ptr+1) >= '0') && (*(ptr+1) <= '9')) {
-		timegda->minute = (*ptr - '0') * 10 + *(ptr+1) - '0';
-		ptr += 2;
-	}
-	else if ((*ptr >= '0') && (*ptr <= '9') && (ptr[1] == ':')) {
-		timegda->minute = *ptr - '0';
-		ptr++;
-	}
-	else if (*ptr == ':')
-		timegda->minute = 0;
-	else
+	else if (!isdigit (*ptr))
 		return FALSE;
 
-	/* second */
-	timegda->second = 0;
-	if (! *ptr) {
-		if ((timegda->hour > 24) || (timegda->minute > 60))
-			return FALSE;
-		else
-			return TRUE;
+	/* minute */
+	timegda->minute = *ptr - '0';
+	ptr++;
+	if (isdigit (*ptr)) {
+		timegda->minute = timegda->minute * 10 + (*ptr - '0');
+		ptr++;
 	}
+	if (timegda->minute >= 60)
+		return FALSE;
 	if (*ptr == ':')
 		ptr++;
-	if ((*ptr >= '0') && (*ptr <= '9') &&
-	    (*(ptr+1) >= '0') && (*(ptr+1) <= '9')) {
-		timegda->second = (*ptr - '0') * 10 + *(ptr+1) - '0';
-		ptr += 2;
-	}
-	else if ((*ptr >= '0') && (*ptr <= '9')) {
-		timegda->second = *ptr - '0';
+	else if (!isdigit (*ptr))
+		return FALSE;
+
+	/* second */
+	timegda->second = *ptr - '0';
+	ptr++;
+	if (isdigit (*ptr)) {
+		timegda->second = timegda->second * 10 + (*ptr - '0');
 		ptr++;
 	}
-	else if (*ptr == ':')
-		timegda->second = 0;
-	
-	/* extra */
-	if (! *ptr) {
-		if ((timegda->hour > 24) || (timegda->minute > 60) || 
-		    (timegda->second > 60))
-			return FALSE;
-		else
-			return TRUE;
-	}
+	if (timegda->second >= 60)
+		return FALSE;
 
+	/* fraction */
+	if (*ptr && (*ptr != '.') && (*ptr != '+') && (*ptr != '-'))
+		return FALSE;
 	if (*ptr == '.') {
-		ptr ++;
-		while (*ptr && (*ptr >= '0') && (*ptr <= '9')) {
-			timegda->fraction = timegda->fraction * 10 + *ptr - '0';
+		ptr++;
+		if (!isdigit (*ptr))
+			return FALSE;
+		while (isdigit (*ptr)) {
+			unsigned long long lu;
+			lu = timegda->fraction * 10 + (*ptr - '0');
+			if (lu < G_MAXULONG)
+				timegda->fraction = lu;
+			else
+				return FALSE;
 			ptr++;
 		}
 	}
-
-	if ((*ptr == '+') || (*ptr == '-')) {
-		glong sign = (*ptr == '+') ? 1 : -1;
-		ptr ++;
-		timegda->timezone = 0;
-		while (*ptr && (*ptr >= '0') && (*ptr <= '9')) {
-			timegda->timezone = timegda->timezone * 10 + sign * ((*ptr) - '0');
+	
+	/* timezone */
+	if ((*ptr == '-') || (*ptr == '+')) {
+		gint sign = (*ptr == '+') ? 1 : -1;
+		ptr++;
+		if (!isdigit (*ptr))
+			return FALSE;
+		timegda->timezone = sign * (*ptr - '0');
+		ptr++;
+		if (isdigit (*ptr)) {
+			timegda->timezone = timegda->minute * 10 + sign * (*ptr - '0');
 			ptr++;
 		}
-		timegda->timezone *= 3600;
+		if (*ptr)
+			return FALSE;
+		if ((timegda->timezone >= -24) && (timegda->timezone <= 24))
+			timegda->timezone *= 60*60;
+		else {
+			timegda->timezone = 0;
+			return FALSE;
+		}
 	}
-	
-	/* checks */
-	if ((timegda->hour > 24) || (timegda->minute > 60) || (timegda->second > 60))
-		return FALSE;
-	else
-		return TRUE;
+	return TRUE;
 }
 
 
diff --git a/libgda/handlers/gda-handler-type.c b/libgda/handlers/gda-handler-type.c
index f6a13e8..6be3885 100644
--- a/libgda/handlers/gda-handler-type.c
+++ b/libgda/handlers/gda-handler-type.c
@@ -145,11 +145,11 @@ gda_handler_type_dispose (GObject   * object)
 }
 
 /**
- * gda_handler_type_new
+ * gda_handler_type_new:
  *
  * Creates a data handler for Gda types
  *
- * Returns: the new object
+ * Returns: (transfer full): the new object
  */
 GdaDataHandler *
 gda_handler_type_new (void)
diff --git a/libgda/libgda.symbols b/libgda/libgda.symbols
index c9f886e..a3f4d05 100644
--- a/libgda/libgda.symbols
+++ b/libgda/libgda.symbols
@@ -353,6 +353,7 @@
 	gda_handler_time_new
 	gda_handler_time_new_no_locale
 	gda_handler_time_set_sql_spec
+	gda_handler_time_set_str_spec
 	gda_handler_type_get_type
 	gda_handler_type_new
 	gda_holder_attributes_manager
diff --git a/libgda/providers-support/gda-pstmt.c b/libgda/providers-support/gda-pstmt.c
index 17a977f..de28add 100644
--- a/libgda/providers-support/gda-pstmt.c
+++ b/libgda/providers-support/gda-pstmt.c
@@ -200,7 +200,7 @@ gda_pstmt_copy_contents (GdaPStmt *src, GdaPStmt *dest)
 	dest->types = NULL;
 	if (src->types) {
 		dest->types = g_new (GType, dest->ncols);
-		memcpy (dest->types, src->types, sizeof (GType) * dest->ncols);
+		memcpy (dest->types, src->types, sizeof (GType) * dest->ncols); /* Flawfinder: ignore */
 	}
 	if (src->tmpl_columns) {
 		GSList *list;
@@ -213,7 +213,7 @@ gda_pstmt_copy_contents (GdaPStmt *src, GdaPStmt *dest)
 }
 
 /**
- * gda_pstmt_get_gda_statement
+ * gda_pstmt_get_gda_statement:
  * @pstmt: a #GdaPStmt object
  *
  * Get a pointer to the #GdaStatement which led to the creation of this prepared statement.
diff --git a/libgda/sql-parser/LemonPatch b/libgda/sql-parser/LemonPatch
index 550d609..cc00c0c 100644
--- a/libgda/sql-parser/LemonPatch
+++ b/libgda/sql-parser/LemonPatch
@@ -1,114 +1,57 @@
---- lemon.c.3.5.7
-+++ lemon.c
-@@ -266,6 +266,8 @@
-   char *vardest;           /* Code for the default non-terminal destructor */
-   int  vardestln;          /* Line number for default non-term destructor code*/
-   char *filename;          /* Name of the input file */
-+  char *base_filename;     /* Name of the input file, without the path part */
-+  char *tmplname;          /* Name of the template file */
-   char *outname;           /* Name of the current output file */
-   char *tokenprefix;       /* A prefix added to token names in the .h file */
-   int nconflict;           /* Number of parsing conflicts */
-@@ -1402,6 +1404,7 @@
-   static int quiet = 0;
-   static int statistics = 0;
-   static int mhflag = 0;
-+  static int local_out_dir = 0;
+--- lemon.c.3.7.3	2010-10-10 23:22:50.000000000 +0200
++++ lemon.c	2010-10-10 23:25:13.000000000 +0200
+@@ -1394,6 +1394,8 @@
+   strcpy(user_templatename, z);
+ }
+ 
++int local_out_dir = 0;
++
+ /* The main program.  Parse the command line and do it... */
+ int main(int argc, char **argv)
+ {
+@@ -1409,6 +1411,7 @@
    static struct s_options options[] = {
      {OPT_FLAG, "b", (char*)&basisflag, "Print only the basis in report."},
      {OPT_FLAG, "c", (char*)&compress, "Don't compress the action table."},
-@@ -1411,19 +1414,21 @@
-     {OPT_FLAG, "q", (char*)&quiet, "(Quiet) Don't print the report file."},
-     {OPT_FLAG, "s", (char*)&statistics,
-                                    "Print parser stats to standard output."},
 +    {OPT_FLAG, "d", (char*)&local_out_dir, "Output files in the current directory."},
-     {OPT_FLAG, "x", (char*)&version, "Print the version number."},
-     {OPT_FLAG,0,0,0}
-   };
-   int i;
+     {OPT_FSTR, "D", (char*)handle_D_option, "Define an %ifdef macro."},
+     {OPT_FSTR, "T", (char*)handle_T_option, "Specify a template file."},
+     {OPT_FLAG, "g", (char*)&rpflag, "Print grammar without actions."},
+@@ -1427,7 +1430,7 @@
+   int exitcode;
    struct lemon lem;
-+  char *def_tmpl_name = "lempar.c";
+ 
+-  atexit(LemonAtExit);
++  /*atexit(LemonAtExit);*/
  
    OptInit(argv,options,stderr);
    if( version ){
-      printf("Lemon version 1.0\n");
-      exit(0); 
-   }
--  if( OptNArgs()!=1 ){
--    fprintf(stderr,"Exactly one filename argument is required.\n");
-+  if( (OptNArgs() != 1) && (OptNArgs() != 2) ){
-+    fprintf(stderr,"Usage: %s file.y [path to lempar.c file].\n", argv[0]);
-     exit(1);
-   }
-   memset(&lem, 0, sizeof(lem));
-@@ -1435,6 +1440,21 @@
-   State_init();
-   lem.argv0 = argv[0];
-   lem.filename = OptArg(0);
+@@ -2724,13 +2727,26 @@
+ {
+   char *name;
+   char *cp;
++  char *filename;
++
++  filename = lemp->filename;
 +  if (local_out_dir) {
 +    char *ptr;
-+    lem.base_filename = malloc (sizeof (char) * strlen (lem.filename) + 1);
-+    memcpy (lem.base_filename, lem.filename, sizeof (char) * strlen (lem.filename) + 1);
 +#ifdef __WIN32__
-+    for (ptr = lem.base_filename + strlen (lem.filename) - 1; (ptr > lem.base_filename) && (*ptr != '\\'); ptr--);
++    for (ptr = lemp->filename + strlen (lemp->filename) - 1; (ptr > lemp->filename) && (*ptr != '\\'); ptr--);
 +#else
-+    for (ptr = lem.base_filename + strlen (lem.filename) - 1; (ptr > lem.base_filename) && (*ptr != '/'); ptr--);
++    for (ptr = lemp->filename + strlen (lemp->filename) - 1; (ptr > lemp->filename) && (*ptr != '/'); ptr--);
 +#endif
-+    if (ptr > lem.base_filename)
-+     lem.base_filename = ptr + 1;
++    if (ptr > lemp->filename)
++     filename = ptr + 1;
 +  }
-+  else
-+    lem.base_filename = OptArg(0);
-+  lem.tmplname = (OptNArgs() == 2) ? OptArg(1) : def_tmpl_name;
-   lem.basisflag = basisflag;
-   Symbol_new("$");
-   lem.errsym = Symbol_new("error");
-@@ -2677,12 +2697,12 @@
-   char *name;
-   char *cp;
  
--  name = malloc( strlen(lemp->filename) + strlen(suffix) + 5 );
-+  name = malloc( strlen(lemp->base_filename) + strlen(suffix) + 5 );
+-  name = (char*)malloc( lemonStrlen(lemp->filename) + lemonStrlen(suffix) + 5 );
++  name = (char*)malloc( lemonStrlen(filename) + lemonStrlen(suffix) + 5 );
    if( name==0 ){
      fprintf(stderr,"Can't allocate space for a filename.\n");
      exit(1);
    }
 -  strcpy(name,lemp->filename);
-+  strcpy(name,lemp->base_filename);
++  strcpy(name,filename);
    cp = strrchr(name,'.');
    if( cp ) *cp = 0;
    strcat(name,suffix);
-@@ -3023,7 +3043,6 @@
- PRIVATE FILE *tplt_open(lemp)
- struct lemon *lemp;
- {
--  static char templatename[] = "lempar.c";
-   char buf[1000];
-   FILE *in;
-   char *tpltname;
-@@ -3037,20 +3056,20 @@
-   }
-   if( access(buf,004)==0 ){
-     tpltname = buf;
--  }else if( access(templatename,004)==0 ){
--    tpltname = templatename;
-+  }else if( access(lemp->tmplname,004)==0 ){
-+    tpltname = lemp->tmplname;
-   }else{
--    tpltname = pathsearch(lemp->argv0,templatename,0);
-+    tpltname = pathsearch(lemp->argv0,lemp->tmplname,0);
-   }
-   if( tpltname==0 ){
-     fprintf(stderr,"Can't find the parser driver template file \"%s\".\n",
--    templatename);
-+    lemp->tmplname);
-     lemp->errorcnt++;
-     return 0;
-   }
-   in = fopen(tpltname,"rb");
-   if( in==0 ){
--    fprintf(stderr,"Can't open the template file \"%s\".\n",templatename);
-+    fprintf(stderr,"Can't open the template file \"%s\".\n",lemp->tmplname);
-     lemp->errorcnt++;
-     return 0;
-   }
diff --git a/libgda/sql-parser/Makefile.am b/libgda/sql-parser/Makefile.am
index 8ae365f..d8a6333 100644
--- a/libgda/sql-parser/Makefile.am
+++ b/libgda/sql-parser/Makefile.am
@@ -13,10 +13,10 @@ gen_def$(EXEEXT_FOR_BUILD): gen_def.c
 	 $(CC_FOR_BUILD) -o gen_def$(EXEEXT_FOR_BUILD) -DSRCDIR=\"$(srcdir)\" $(srcdir)/gen_def.c
 
 parser.c parser.h: parser.y lemon$(EXEEXT_FOR_BUILD)
-	- ./lemon$(EXEEXT_FOR_BUILD) -q -d $(srcdir)/parser.y $(srcdir)/lempar.c
+	- ./lemon$(EXEEXT_FOR_BUILD) -d -T$(srcdir)/lempar.c $(srcdir)/parser.y
 
 delimiter.c delimiter.h: delimiter.y lemon$(EXEEXT_FOR_BUILD)
-	./lemon$(EXEEXT_FOR_BUILD) -q -d $(srcdir)/delimiter.y $(srcdir)/lempar.c
+	./lemon$(EXEEXT_FOR_BUILD) -q -d -T$(srcdir)/lempar.c $(srcdir)/delimiter.y
 
 token_types.h: gen_def$(EXEEXT_FOR_BUILD) delimiter.h parser.h
 	./gen_def$(EXEEXT_FOR_BUILD) > token_types.h
diff --git a/libgda/sql-parser/gda-sql-parser.c b/libgda/sql-parser/gda-sql-parser.c
index 41679c0..36490b0 100644
--- a/libgda/sql-parser/gda-sql-parser.c
+++ b/libgda/sql-parser/gda-sql-parser.c
@@ -429,7 +429,7 @@ gda_sql_parser_get_property (GObject *object,
  * To include variables in the @sql string, see the
  * <link linkend="GdaSqlParser.description">GdaSqlParser's object description</link>.
  *
- * Returns: a new #GdaStatement object, or %NULL if an error occurred
+ * Returns: (transfer full) (allow-none): a new #GdaStatement object, or %NULL if an error occurred
  */
 GdaStatement *
 gda_sql_parser_parse_string (GdaSqlParser *parser, const gchar *sql, const gchar **remain, GError **error)
@@ -666,7 +666,7 @@ gda_sql_parser_parse_string (GdaSqlParser *parser, const gchar *sql, const gchar
  * To include variables in the @sql string, see the
  * <link linkend="GdaSqlParser.description">GdaSqlParser's object description</link>.
  *
- * Returns: a new #GdaBatch object, or %NULL if an error occurred
+ * Returns: (transfer full) (allow-none): a new #GdaBatch object, or %NULL if an error occurred
  */
 GdaBatch *
 gda_sql_parser_parse_string_as_batch (GdaSqlParser *parser, const gchar *sql, const gchar **remain,
@@ -752,7 +752,7 @@ gda_sql_parser_parse_string_as_batch (GdaSqlParser *parser, const gchar *sql, co
  *
  * if @sql is %NULL, then the returned #GdaBatch object will contain no statement.
  *
- * Returns: a new #GdaBatch object, or %NULL if an error occurred
+ * Returns: (transfer full) (allow-none): a new #GdaBatch object, or %NULL if an error occurred
  */
 GdaBatch *
 gda_sql_parser_parse_file_as_batch (GdaSqlParser *parser, const gchar *filename, GError **error)
diff --git a/libgda/sql-parser/gda-statement-struct-compound.c b/libgda/sql-parser/gda-statement-struct-compound.c
index bc3d8c8..6fe2fdc 100644
--- a/libgda/sql-parser/gda-statement-struct-compound.c
+++ b/libgda/sql-parser/gda-statement-struct-compound.c
@@ -145,7 +145,7 @@ _gda_sql_statement_compound_serialize (gpointer stmt)
  * @s: a #GdaSqlStatement pointer
  *
  * Adds the @s sub-statement to the @stmt compound statement. @s's reference is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_compound_take_stmt (GdaSqlStatement *stmt, GdaSqlStatement *s)
diff --git a/libgda/sql-parser/gda-statement-struct-delete.c b/libgda/sql-parser/gda-statement-struct-delete.c
index 6db0ddf..ba326c4 100644
--- a/libgda/sql-parser/gda-statement-struct-delete.c
+++ b/libgda/sql-parser/gda-statement-struct-delete.c
@@ -126,8 +126,8 @@ gda_sql_statement_delete_serialize (gpointer stmt)
  * @stmt: a #GdaSqlStatement pointer
  * @value: a table name as a G_TYPE_STRING #GValue 
  *
- * Sets the name of the table to delete from in @stmt. @value's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * Sets the name of the table to delete from in @stmt. @value's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_delete_take_table_name (GdaSqlStatement *stmt, GValue *value)
@@ -144,8 +144,8 @@ gda_sql_statement_delete_take_table_name (GdaSqlStatement *stmt, GValue *value)
  * @stmt: a #GdaSqlStatement pointer
  * @cond: the WHERE condition of the DELETE statement, as a #GdaSqlExpr 
  *
- * Sets the WHERE condition of @stmt. @cond's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * Sets the WHERE condition of @stmt. @cond's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void 
 gda_sql_statement_delete_take_condition (GdaSqlStatement *stmt, GdaSqlExpr *cond)
diff --git a/libgda/sql-parser/gda-statement-struct-insert.c b/libgda/sql-parser/gda-statement-struct-insert.c
index 8635b81..467ac4c 100644
--- a/libgda/sql-parser/gda-statement-struct-insert.c
+++ b/libgda/sql-parser/gda-statement-struct-insert.c
@@ -226,8 +226,8 @@ gda_sql_statement_insert_serialize (gpointer stmt)
  * @stmt: a #GdaSqlStatement pointer
  * @value: name of the table to insert into, as a G_TYPE_STRING #GValue
  *
- * Sets the name of the table to insert into in @stmt. @value's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * Sets the name of the table to insert into in @stmt. @value's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_insert_take_table_name (GdaSqlStatement *stmt, GValue *value)
@@ -244,8 +244,8 @@ gda_sql_statement_insert_take_table_name (GdaSqlStatement *stmt, GValue *value)
  * @stmt: a #GdaSqlStatement pointer
  * @value: name of the resolution conflict algorithm, as a G_TYPE_STRING #GValue
  *
- * Sets the name of the resolution conflict algorithm used by @stmt. @value's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * Sets the name of the resolution conflict algorithm used by @stmt. @value's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_insert_take_on_conflict (GdaSqlStatement *stmt, GValue *value)
@@ -264,8 +264,8 @@ gda_sql_statement_insert_take_on_conflict (GdaSqlStatement *stmt, GValue *value)
  * @list: a list of #GdaSqlField pointers
  *
  * Sets the list of fields for which values will be specified in @stmt. @list's 
- * responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_insert_take_fields_list (GdaSqlStatement *stmt, GSList *list)
@@ -284,8 +284,8 @@ gda_sql_statement_insert_take_fields_list (GdaSqlStatement *stmt, GSList *list)
  * @list: a list of #GdaSqlExpr pointers
  *
  * Sets a list of values to be inserted by @stmt. @list's 
- * responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_insert_take_1_values_list (GdaSqlStatement *stmt, GSList *list)
@@ -304,8 +304,8 @@ gda_sql_statement_insert_take_1_values_list (GdaSqlStatement *stmt, GSList *list
  * @list: a list of #GSQliet of #GdaSqlExpr pointers
  *
  * Sets a list of list of values to be inserted by @stmt. @list's 
- * responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_insert_take_extra_values_list (GdaSqlStatement *stmt, GSList *list)
@@ -326,8 +326,8 @@ gda_sql_statement_insert_take_extra_values_list (GdaSqlStatement *stmt, GSList *
  * @select: a SELECT #GdaSqlStatement pointer
  *
  * Specifies a SELECT statement, the values inserted will be the result set of @select. @select's 
- * responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_insert_take_select (GdaSqlStatement *stmt, GdaSqlStatement *select)
diff --git a/libgda/sql-parser/gda-statement-struct-pspec.c b/libgda/sql-parser/gda-statement-struct-pspec.c
index efac75b..10eaadb 100644
--- a/libgda/sql-parser/gda-statement-struct-pspec.c
+++ b/libgda/sql-parser/gda-statement-struct-pspec.c
@@ -28,8 +28,8 @@
  * @pspec: a #GdaSqlParamSpec pointer
  * @value: a G_TYPE_STRING #GValue
  *
- * Sets @pspec's name. @value's responsibility is transferred to
- * @pspec (which means @pspec is then responsible to freeing it when no longer needed).
+ * Sets @pspec's name. @value's ownership is transferred to
+ * @pspec (which means @pspec is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_param_spec_take_name (GdaSqlParamSpec *pspec, GValue *value)
@@ -50,8 +50,8 @@ gda_sql_param_spec_take_name (GdaSqlParamSpec *pspec, GValue *value)
  * @pspec: a #GdaSqlParamSpec pointer
  * @value: a G_TYPE_STRING #GValue
  *
- * Sets @pspec's description. @value's responsibility is transferred to
- * @pspec (which means @pspec is then responsible to freeing it when no longer needed).
+ * Sets @pspec's description. @value's ownership is transferred to
+ * @pspec (which means @pspec is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_param_spec_take_descr (GdaSqlParamSpec *pspec, GValue *value)
@@ -72,8 +72,8 @@ gda_sql_param_spec_take_descr (GdaSqlParamSpec *pspec, GValue *value)
  * @pspec: a #GdaSqlParamSpec pointer
  * @value: a G_TYPE_STRING #GValue. 
  *
- * Sets @pspec's ability of being NULL. @value's responsibility is transferred to
- * @pspec (which means @pspec is then responsible to freeing it when no longer needed).
+ * Sets @pspec's ability of being NULL. @value's ownership is transferred to
+ * @pspec (which means @pspec is then responsible for freeing it when no longer needed).
  *
  * If @value's string starts by 't' or 'T' then @pspec will be allowed to be %NULL
  */
@@ -98,8 +98,8 @@ gda_sql_param_spec_take_nullok (GdaSqlParamSpec *pspec, GValue *value)
  * @pspec: a #GdaSqlParamSpec pointer
  * @value: a G_TYPE_STRING #GValue
  *
- * Sets @pspec's data type. @value's responsibility is transferred to
- * @pspec (which means @pspec is then responsible to freeing it when no longer needed).
+ * Sets @pspec's data type. @value's ownership is transferred to
+ * @pspec (which means @pspec is then responsible for freeing it when no longer needed).
  *
  * @value must represent a data type, as understood by gda_g_type_from_string().
  */
diff --git a/libgda/sql-parser/gda-statement-struct-select.c b/libgda/sql-parser/gda-statement-struct-select.c
index 48e9163..f772fed 100644
--- a/libgda/sql-parser/gda-statement-struct-select.c
+++ b/libgda/sql-parser/gda-statement-struct-select.c
@@ -248,8 +248,8 @@ _gda_sql_statement_select_serialize (gpointer stmt)
  *
  * Sets the DISTINCT clause of @stmt. 
  *
- * @distinct_expr's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @distinct_expr's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_select_take_distinct (GdaSqlStatement *stmt, gboolean distinct, GdaSqlExpr *distinct_expr)
@@ -267,8 +267,8 @@ gda_sql_statement_select_take_distinct (GdaSqlStatement *stmt, gboolean distinct
  *
  * Sets list of expressions selected by @stmt
  *
- * @expr_list's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @expr_list's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_select_take_expr_list (GdaSqlStatement *stmt, GSList *expr_list)
@@ -287,8 +287,8 @@ gda_sql_statement_select_take_expr_list (GdaSqlStatement *stmt, GSList *expr_lis
  *
  * Sets the FROM clause of @stmt
  *
- * @from's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @from's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_select_take_from (GdaSqlStatement *stmt, GdaSqlSelectFrom *from)
@@ -305,8 +305,8 @@ gda_sql_statement_select_take_from (GdaSqlStatement *stmt, GdaSqlSelectFrom *fro
  *
  * Sets the WHERE clause of @stmt
  *
- * @expr's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @expr's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_select_take_where_cond (GdaSqlStatement *stmt, GdaSqlExpr *expr)
@@ -323,8 +323,8 @@ gda_sql_statement_select_take_where_cond (GdaSqlStatement *stmt, GdaSqlExpr *exp
  *
  * Sets the GROUP BY clause of @stmt
  *
- * @group_by's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @group_by's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_select_take_group_by (GdaSqlStatement *stmt, GSList *group_by)
@@ -343,8 +343,8 @@ gda_sql_statement_select_take_group_by (GdaSqlStatement *stmt, GSList *group_by)
  *
  * Sets the HAVING clause of @stmt
  *
- * @expr's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @expr's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_select_take_having_cond (GdaSqlStatement *stmt, GdaSqlExpr *expr)
@@ -361,8 +361,8 @@ gda_sql_statement_select_take_having_cond (GdaSqlStatement *stmt, GdaSqlExpr *ex
  *
  * Sets the ORDER BY clause of @stmt
  *
- * @order_by's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @order_by's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_select_take_order_by (GdaSqlStatement *stmt, GSList *order_by)
@@ -383,7 +383,7 @@ gda_sql_statement_select_take_order_by (GdaSqlStatement *stmt, GSList *order_by)
  * Sets the LIMIT clause of @stmt
  *
  * @count and @offset's responsibility are transferred to
- * @stmt (which means @stmt is then responsible to freeing them when no longer needed).
+ * @stmt (which means @stmt is then responsible for freeing them when no longer needed).
  */
 void
 gda_sql_statement_select_take_limits (GdaSqlStatement *stmt, GdaSqlExpr *count, GdaSqlExpr *offset)
diff --git a/libgda/sql-parser/gda-statement-struct-trans.c b/libgda/sql-parser/gda-statement-struct-trans.c
index adcd199..d49e1b0 100644
--- a/libgda/sql-parser/gda-statement-struct-trans.c
+++ b/libgda/sql-parser/gda-statement-struct-trans.c
@@ -253,8 +253,8 @@ gda_sql_statement_trans_serialize (gpointer stmt)
  *
  * Sets the name of the transaction
  *
- * @value's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @value's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_trans_take_name (GdaSqlStatement *stmt, GValue *value)
@@ -278,8 +278,8 @@ gda_sql_statement_trans_take_name (GdaSqlStatement *stmt, GValue *value)
  *
  * Sets the model of the transaction
  *
- * @value's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @value's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_trans_take_mode (GdaSqlStatement *stmt, GValue *value)
diff --git a/libgda/sql-parser/gda-statement-struct-unknown.c b/libgda/sql-parser/gda-statement-struct-unknown.c
index ea6bcd6..3c0e6f7 100644
--- a/libgda/sql-parser/gda-statement-struct-unknown.c
+++ b/libgda/sql-parser/gda-statement-struct-unknown.c
@@ -116,8 +116,8 @@ gda_sql_statement_unknown_serialize (gpointer stmt)
  * Sets @stmt's list of expressions
  *
  * @expressions's 
- * responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_unknown_take_expressions (GdaSqlStatement *stmt, GSList *expressions)
diff --git a/libgda/sql-parser/gda-statement-struct-update.c b/libgda/sql-parser/gda-statement-struct-update.c
index 29d4068..8d588de 100644
--- a/libgda/sql-parser/gda-statement-struct-update.c
+++ b/libgda/sql-parser/gda-statement-struct-update.c
@@ -195,8 +195,8 @@ gda_sql_statement_update_serialize (gpointer stmt)
  *
  * Sets the name of the table to delete from in @stmt.
  *
- * @value's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @value's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_update_take_table_name (GdaSqlStatement *stmt, GValue *value)
@@ -213,8 +213,8 @@ gda_sql_statement_update_take_table_name (GdaSqlStatement *stmt, GValue *value)
  * @stmt: a #GdaSqlStatement pointer
  * @value: name of the resolution conflict algorithm, as a G_TYPE_STRING #GValue
  *
- * Sets the name of the resolution conflict algorithm used by @stmt. @value's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * Sets the name of the resolution conflict algorithm used by @stmt. @value's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void
 gda_sql_statement_update_take_on_conflict (GdaSqlStatement *stmt, GValue *value)
@@ -234,8 +234,8 @@ gda_sql_statement_update_take_on_conflict (GdaSqlStatement *stmt, GValue *value)
  *
  * Sets the WHERE clause of @stmt
  *
- * @expr's responsibility is transferred to
- * @stmt (which means @stmt is then responsible to freeing it when no longer needed).
+ * @expr's ownership is transferred to
+ * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
  */
 void 
 gda_sql_statement_update_take_condition (GdaSqlStatement *stmt, GdaSqlExpr *cond)
@@ -255,7 +255,7 @@ gda_sql_statement_update_take_condition (GdaSqlStatement *stmt, GdaSqlExpr *cond
  * Specifies that the field named @fname will be updated with the expression @expr.
  *
  * @fname and @expr's responsibility are transferred to
- * @stmt (which means @stmt is then responsible to freeing them when no longer needed).
+ * @stmt (which means @stmt is then responsible for freeing them when no longer needed).
  */
 void
 gda_sql_statement_update_take_set_value (GdaSqlStatement *stmt, GValue *fname, GdaSqlExpr *expr)
diff --git a/libgda/sql-parser/gda-statement-struct.c b/libgda/sql-parser/gda-statement-struct.c
index d4ef6d4..4b27b5f 100644
--- a/libgda/sql-parser/gda-statement-struct.c
+++ b/libgda/sql-parser/gda-statement-struct.c
@@ -1172,10 +1172,10 @@ gda_sql_any_part_check_structure (GdaSqlAnyPart *node, GError **error)
 }
 
 /**
- * gda_sql_any_part_foreach
+ * gda_sql_any_part_foreach:
  * @node: the stat node
- * @func: function to call for each sub node
- * @data: data to pass to @func each time it is called
+ * @func: (scope call): function to call for each sub node
+ * @data: (closure): data to pass to @func each time it is called
  * @error: a place to store errors, or %NULL (is also passed to @func)
  *
  * Calls a function for each element of a #GdaSqlAnyPart node
diff --git a/libgda/sql-parser/lemon.c b/libgda/sql-parser/lemon.c
index 67dcbb8..afab40f 100644
--- a/libgda/sql-parser/lemon.c
+++ b/libgda/sql-parser/lemon.c
@@ -34,8 +34,38 @@ extern int access();
 #define MAXRHS 1000
 #endif
 
+static int showPrecedenceConflict = 0;
+static const char **made_files = NULL;
+static int made_files_count = 0;
+static int successful_exit = 0;
+static void LemonAtExit(void)
+{
+    /* if we failed, delete (most) files we made, to unconfuse build tools. */
+    int i;
+    for (i = 0; i < made_files_count; i++) {
+        if (!successful_exit) {
+            remove(made_files[i]);
+        }
+    }
+    free(made_files);
+    made_files_count = 0;
+    made_files = NULL;
+}
+
 static char *msort(char*,char**,int(*)(const char*,const char*));
 
+/*
+** Compilers are getting increasingly pedantic about type conversions
+** as C evolves ever closer to Ada....  To work around the latest problems
+** we have to define the following variant of strlen().
+*/
+#define lemonStrlen(X)   ((int)strlen(X))
+
+/* a few forward declarations... */
+struct rule;
+struct lemon;
+struct action;
+
 static struct action *Action_new(void);
 static struct action *Action_sort(struct action *);
 
@@ -48,59 +78,60 @@ void FindFollowSets();
 void FindActions();
 
 /********* From the file "configlist.h" *********************************/
-void Configlist_init(/* void */);
-struct config *Configlist_add(/* struct rule *, int */);
-struct config *Configlist_addbasis(/* struct rule *, int */);
-void Configlist_closure(/* void */);
-void Configlist_sort(/* void */);
-void Configlist_sortbasis(/* void */);
-struct config *Configlist_return(/* void */);
-struct config *Configlist_basis(/* void */);
-void Configlist_eat(/* struct config * */);
-void Configlist_reset(/* void */);
+void Configlist_init(void);
+struct config *Configlist_add(struct rule *, int);
+struct config *Configlist_addbasis(struct rule *, int);
+void Configlist_closure(struct lemon *);
+void Configlist_sort(void);
+void Configlist_sortbasis(void);
+struct config *Configlist_return(void);
+struct config *Configlist_basis(void);
+void Configlist_eat(struct config *);
+void Configlist_reset(void);
 
 /********* From the file "error.h" ***************************************/
 void ErrorMsg(const char *, int,const char *, ...);
 
 /****** From the file "option.h" ******************************************/
+enum option_type { OPT_FLAG=1,  OPT_INT,  OPT_DBL,  OPT_STR,
+         OPT_FFLAG, OPT_FINT, OPT_FDBL, OPT_FSTR};
 struct s_options {
-  enum { OPT_FLAG=1,  OPT_INT,  OPT_DBL,  OPT_STR,
-         OPT_FFLAG, OPT_FINT, OPT_FDBL, OPT_FSTR} type;
-  char *label;
+  enum option_type type;
+  const char *label;
   char *arg;
-  char *message;
+  const char *message;
 };
-int    OptInit(/* char**,struct s_options*,FILE* */);
-int    OptNArgs(/* void */);
-char  *OptArg(/* int */);
-void   OptErr(/* int */);
-void   OptPrint(/* void */);
+int    OptInit(char**,struct s_options*,FILE*);
+int    OptNArgs(void);
+char  *OptArg(int);
+void   OptErr(int);
+void   OptPrint(void);
 
 /******** From the file "parse.h" *****************************************/
-void Parse(/* struct lemon *lemp */);
+void Parse(struct lemon *lemp);
 
 /********* From the file "plink.h" ***************************************/
-struct plink *Plink_new(/* void */);
-void Plink_add(/* struct plink **, struct config * */);
-void Plink_copy(/* struct plink **, struct plink * */);
-void Plink_delete(/* struct plink * */);
+struct plink *Plink_new(void);
+void Plink_add(struct plink **, struct config *);
+void Plink_copy(struct plink **, struct plink *);
+void Plink_delete(struct plink *);
 
 /********** From the file "report.h" *************************************/
-void Reprint(/* struct lemon * */);
-void ReportOutput(/* struct lemon * */);
-void ReportTable(/* struct lemon * */);
-void ReportHeader(/* struct lemon * */);
-void CompressTables(/* struct lemon * */);
-void ResortStates(/* struct lemon * */);
+void Reprint(struct lemon *);
+void ReportOutput(struct lemon *);
+void ReportTable(struct lemon *, int);
+void ReportHeader(struct lemon *);
+void CompressTables(struct lemon *);
+void ResortStates(struct lemon *);
 
 /********** From the file "set.h" ****************************************/
-void  SetSize(/* int N */);             /* All sets will be of size N */
-char *SetNew(/* void */);               /* A new set for element 0..N */
-void  SetFree(/* char* */);             /* Deallocate a set */
-
-int SetAdd(/* char*,int */);            /* Add element to a set */
-int SetUnion(/* char *A,char *B */);    /* A <- A U B, thru element N */
+void  SetSize(int);             /* All sets will be of size N */
+char *SetNew(void);               /* A new set for element 0..N */
+void  SetFree(char*);             /* Deallocate a set */
 
+char *SetNew(void);               /* A new set for element 0..N */
+int SetAdd(char*,int);            /* Add element to a set */
+int SetUnion(char *,char *);    /* A <- A U B, thru element N */
 #define SetFind(X,Y) (X[Y])       /* True if Y is in set X */
 
 /********** From the file "struct.h" *************************************/
@@ -112,29 +143,31 @@ typedef enum {LEMON_FALSE=0, LEMON_TRUE} Boolean;
 
 /* Symbols (terminals and nonterminals) of the grammar are stored
 ** in the following: */
+enum symbol_type {
+  TERMINAL,
+  NONTERMINAL,
+  MULTITERMINAL
+};
+enum e_assoc {
+    LEFT,
+    RIGHT,
+    NONE,
+    UNK
+};
 struct symbol {
-  char *name;              /* Name of the symbol */
+  const char *name;        /* Name of the symbol */
   int index;               /* Index number for this symbol */
-  enum {
-    TERMINAL,
-    NONTERMINAL,
-    MULTITERMINAL
-  } type;                  /* Symbols are all either TERMINALS or NTs */
+  enum symbol_type type;   /* Symbols are all either TERMINALS or NTs */
   struct rule *rule;       /* Linked list of rules of this (if an NT) */
   struct symbol *fallback; /* fallback token in case this token doesn't parse */
   int prec;                /* Precedence if defined (-1 otherwise) */
-  enum e_assoc {
-    LEFT,
-    RIGHT,
-    NONE,
-    UNK
-  } assoc;                 /* Associativity if predecence is defined */
+  enum e_assoc assoc;      /* Associativity if precedence is defined */
   char *firstset;          /* First-set for all rules of this symbol */
   Boolean lambda;          /* True if NT and can generate an empty string */
   int useCnt;              /* Number of times used */
   char *destructor;        /* Code which executes whenever this symbol is
                            ** popped from the stack during error processing */
-  int destructorln;        /* Line number of destructor code */
+  int destLineno;          /* Line number for start of destructor */
   char *datatype;          /* The data type of information held by this
                            ** object. Only used if type==NONTERMINAL */
   int dtnum;               /* The data type number.  In the parser, the value
@@ -149,14 +182,14 @@ struct symbol {
 ** structure.  */
 struct rule {
   struct symbol *lhs;      /* Left-hand side of the rule */
-  char *lhsalias;          /* Alias for the LHS (NULL if none) */
+  const char *lhsalias;    /* Alias for the LHS (NULL if none) */
   int lhsStart;            /* True if left-hand side is the start symbol */
   int ruleline;            /* Line number for the rule */
   int nrhs;                /* Number of RHS symbols */
   struct symbol **rhs;     /* The RHS symbols */
-  char **rhsalias;         /* An alias for each RHS symbol (NULL if none) */
+  const char **rhsalias;   /* An alias for each RHS symbol (NULL if none) */
   int line;                /* Line number at which code begins */
-  char *code;              /* The code executed when this rule is reduced */
+  const char *code;        /* The code executed when this rule is reduced */
   struct symbol *precsym;  /* Precedence symbol for this rule */
   int index;               /* An index number for this rule */
   Boolean canReduce;       /* True if this rule is ever reduced */
@@ -169,6 +202,10 @@ struct rule {
 ** Configurations also contain a follow-set which is a list of terminal
 ** symbols which are allowed to immediately follow the end of the rule.
 ** Every configuration is recorded as an instance of the following: */
+enum cfgstatus {
+  COMPLETE,
+  INCOMPLETE
+};
 struct config {
   struct rule *rp;         /* The rule upon which the configuration is based */
   int dot;                 /* The parse point */
@@ -176,29 +213,28 @@ struct config {
   struct plink *fplp;      /* Follow-set forward propagation links */
   struct plink *bplp;      /* Follow-set backwards propagation links */
   struct state *stp;       /* Pointer to state which contains this */
-  enum {
-    COMPLETE,              /* The status is used during followset and */
-    INCOMPLETE             /*    shift computations */
-  } status;
+  enum cfgstatus status;   /* used during followset and shift computations */
   struct config *next;     /* Next configuration in the state */
   struct config *bp;       /* The next basis configuration */
 };
 
+enum e_action {
+  SHIFT,
+  ACCEPT,
+  REDUCE,
+  ERROR,
+  SSCONFLICT,              /* A shift/shift conflict */
+  SRCONFLICT,              /* Was a reduce, but part of a conflict */
+  RRCONFLICT,              /* Was a reduce, but part of a conflict */
+  SH_RESOLVED,             /* Was a shift.  Precedence resolved conflict */
+  RD_RESOLVED,             /* Was reduce.  Precedence resolved conflict */
+  NOT_USED                 /* Deleted by compression */
+};
+
 /* Every shift or reduce operation is stored as one of the following */
 struct action {
   struct symbol *sp;       /* The look-ahead symbol */
-  enum e_action {
-    SHIFT,
-    ACCEPT,
-    REDUCE,
-    ERROR,
-    SSCONFLICT,              /* A shift/shift conflict */
-    SRCONFLICT,              /* Was a reduce, but part of a conflict */
-    RRCONFLICT,              /* Was a reduce, but part of a conflict */
-    SH_RESOLVED,             /* Was a shift.  Precedence resolved conflict */
-    RD_RESOLVED,             /* Was reduce.  Precedence resolved conflict */
-    NOT_USED                 /* Deleted by compression */
-  } type;
+  enum e_action type;
   union {
     struct state *stp;     /* The new state, if a shift */
     struct rule *rp;       /* The rule, if a reduce */
@@ -212,7 +248,7 @@ struct action {
 struct state {
   struct config *bp;       /* The basis configurations for this state */
   struct config *cfp;      /* All configurations in this set */
-  int statenum;            /* Sequencial number for this state */
+  int statenum;            /* Sequential number for this state */
   struct action *ap;       /* Array of actions for this state */
   int nTknAct, nNtAct;     /* Number of actions on terminals and nonterminals */
   int iTknOfst, iNtOfst;   /* yy_action[] offset for terminals and nonterms */
@@ -250,30 +286,21 @@ struct lemon {
   char *start;             /* Name of the start symbol for the grammar */
   char *stacksize;         /* Size of the parser stack */
   char *include;           /* Code to put at the start of the C file */
-  int  includeln;          /* Line number for start of include code */
   char *error;             /* Code to execute when an error is seen */
-  int  errorln;            /* Line number for start of error code */
   char *overflow;          /* Code to execute on a stack overflow */
-  int  overflowln;         /* Line number for start of overflow code */
   char *failure;           /* Code to execute on parser failure */
-  int  failureln;          /* Line number for start of failure code */
   char *accept;            /* Code to execute when the parser excepts */
-  int  acceptln;           /* Line number for the start of accept code */
   char *extracode;         /* Code appended to the generated file */
-  int  extracodeln;        /* Line number for the start of the extra code */
   char *tokendest;         /* Code to execute to destroy token data */
-  int  tokendestln;        /* Line number for token destroyer code */
   char *vardest;           /* Code for the default non-terminal destructor */
-  int  vardestln;          /* Line number for default non-term destructor code*/
   char *filename;          /* Name of the input file */
-  char *base_filename;     /* Name of the input file, without the path part */
-  char *tmplname;          /* Name of the template file */
   char *outname;           /* Name of the current output file */
   char *tokenprefix;       /* A prefix added to token names in the .h file */
   int nconflict;           /* Number of parsing conflicts */
   int tablesize;           /* Size of the parse tables */
   int basisflag;           /* Print only basis configurations */
-  int has_fallback;        /* True if any %fallback is seen in the grammer */
+  int has_fallback;        /* True if any %fallback is seen in the grammar */
+  int nolinenosflag;       /* True if #line statements should not be printed */
   char *argv0;             /* Name of the program */
 };
 
@@ -294,41 +321,41 @@ struct lemon {
 /*
 ** Code for processing tables in the LEMON parser generator.
 */
-
 /* Routines for handling a strings */
 
-char *Strsafe();
+const char *Strsafe(const char *);
 
-void Strsafe_init(/* void */);
-int Strsafe_insert(/* char * */);
-char *Strsafe_find(/* char * */);
+void Strsafe_init(void);
+int Strsafe_insert(const char *);
+const char *Strsafe_find(const char *);
 
 /* Routines for handling symbols of the grammar */
 
-struct symbol *Symbol_new();
-int Symbolcmpp(/* struct symbol **, struct symbol ** */);
-void Symbol_init(/* void */);
-int Symbol_insert(/* struct symbol *, char * */);
-struct symbol *Symbol_find(/* char * */);
-struct symbol *Symbol_Nth(/* int */);
-int Symbol_count(/*  */);
-struct symbol **Symbol_arrayof(/*  */);
+struct symbol *Symbol_new(const char *);
+int Symbolcmpp(const void *, const void *);
+void Symbol_init(void);
+int Symbol_insert(struct symbol *, const char *);
+struct symbol *Symbol_find(const char *);
+struct symbol *Symbol_Nth(int);
+int Symbol_count(void);
+struct symbol **Symbol_arrayof(void);
 
 /* Routines to manage the state table */
 
-int Configcmp(/* struct config *, struct config * */);
-struct state *State_new();
-void State_init(/* void */);
-int State_insert(/* struct state *, struct config * */);
-struct state *State_find(/* struct config * */);
+int Configcmp(const char *, const char *);
+struct state *State_new(void);
+void State_init(void);
+int State_insert(struct state *, struct config *);
+struct state *State_find(struct config *);
 struct state **State_arrayof(/*  */);
 
 /* Routines used for efficiency in Configlist_add */
 
-void Configtable_init(/* void */);
-int Configtable_insert(/* struct config * */);
-struct config *Configtable_find(/* struct config * */);
-void Configtable_clear(/* int(*)(struct config *) */);
+void Configtable_init(void);
+int Configtable_insert(struct config *);
+struct config *Configtable_find(struct config *);
+void Configtable_clear(int(*)(struct config *));
+
 /****************** From the file "action.c" *******************************/
 /*
 ** Routines processing parser actions in the LEMON parser generator.
@@ -337,7 +364,7 @@ void Configtable_clear(/* int(*)(struct config *) */);
 /* Allocate a new parser action */
 static struct action *Action_new(void){
   static struct action *freelist = 0;
-  struct action *new;
+  struct action *newaction;
 
   if( freelist==0 ){
     int i;
@@ -350,9 +377,9 @@ static struct action *Action_new(void){
     for(i=0; i<amt-1; i++) freelist[i].next = &freelist[i+1];
     freelist[amt-1].next = 0;
   }
-  new = freelist;
+  newaction = freelist;
   freelist = freelist->next;
-  return new;
+  return newaction;
 }
 
 /* Compare two actions for sorting purposes.  Return negative, zero, or
@@ -371,6 +398,9 @@ static int actioncmp(
   if( rc==0 && ap1->type==REDUCE ){
     rc = ap1->x.rp->index - ap2->x.rp->index;
   }
+  if( rc==0 ){
+    rc = (int) (ap2 - ap1);
+  }
   return rc;
 }
 
@@ -383,22 +413,22 @@ static struct action *Action_sort(
   return ap;
 }
 
-void Action_add(app,type,sp,arg)
-struct action **app;
-enum e_action type;
-struct symbol *sp;
-char *arg;
-{
-  struct action *new;
-  new = Action_new();
-  new->next = *app;
-  *app = new;
-  new->type = type;
-  new->sp = sp;
+void Action_add(
+  struct action **app,
+  enum e_action type,
+  struct symbol *sp,
+  char *arg
+){
+  struct action *newaction;
+  newaction = Action_new();
+  newaction->next = *app;
+  *app = newaction;
+  newaction->type = type;
+  newaction->sp = sp;
   if( type==SHIFT ){
-    new->x.stp = (struct state *)arg;
+    newaction->x.stp = (struct state *)arg;
   }else{
-    new->x.rp = (struct rule *)arg;
+    newaction->x.rp = (struct rule *)arg;
   }
 }
 /********************** New code to implement the "acttab" module ***********/
@@ -408,16 +438,34 @@ char *arg;
 
 /*
 ** The state of the yy_action table under construction is an instance of
-** the following structure
+** the following structure.
+**
+** The yy_action table maps the pair (state_number, lookahead) into an
+** action_number.  The table is an array of integers pairs.  The state_number
+** determines an initial offset into the yy_action array.  The lookahead
+** value is then added to this initial offset to get an index X into the
+** yy_action array. If the aAction[X].lookahead equals the value of the
+** of the lookahead input, then the value of the action_number output is
+** aAction[X].action.  If the lookaheads do not match then the
+** default action for the state_number is returned.
+**
+** All actions associated with a single state_number are first entered
+** into aLookahead[] using multiple calls to acttab_action().  Then the 
+** actions for that single state_number are placed into the aAction[] 
+** array with a single call to acttab_insert().  The acttab_insert() call
+** also resets the aLookahead[] array in preparation for the next
+** state number.
 */
+struct lookahead_action {
+  int lookahead;             /* Value of the lookahead token */
+  int action;                /* Action to take on the given lookahead */
+};
 typedef struct acttab acttab;
 struct acttab {
   int nAction;                 /* Number of used slots in aAction[] */
   int nActionAlloc;            /* Slots allocated for aAction[] */
-  struct {
-    int lookahead;             /* Value of the lookahead token */
-    int action;                /* Action to take on the given lookahead */
-  } *aAction,                  /* The yy_action[] table under construction */
+  struct lookahead_action
+    *aAction,                  /* The yy_action[] table under construction */
     *aLookahead;               /* A single new transaction set */
   int mnLookahead;             /* Minimum aLookahead[].lookahead */
   int mnAction;                /* Action associated with mnLookahead */
@@ -444,7 +492,7 @@ void acttab_free(acttab *p){
 
 /* Allocate a new acttab structure */
 acttab *acttab_alloc(void){
-  acttab *p = calloc( 1, sizeof(*p) );
+  acttab *p = (acttab *) calloc( 1, sizeof(*p) );
   if( p==0 ){
     fprintf(stderr,"Unable to allocate memory for a new acttab.");
     exit(1);
@@ -453,12 +501,15 @@ acttab *acttab_alloc(void){
   return p;
 }
 
-/* Add a new action to the current transaction set
+/* Add a new action to the current transaction set.  
+**
+** This routine is called once for each lookahead for a particular
+** state.
 */
 void acttab_action(acttab *p, int lookahead, int action){
   if( p->nLookahead>=p->nLookaheadAlloc ){
     p->nLookaheadAlloc += 25;
-    p->aLookahead = realloc( p->aLookahead,
+    p->aLookahead = (struct lookahead_action *) realloc( p->aLookahead,
                              sizeof(p->aLookahead[0])*p->nLookaheadAlloc );
     if( p->aLookahead==0 ){
       fprintf(stderr,"malloc failed\n");
@@ -500,7 +551,7 @@ int acttab_insert(acttab *p){
   if( p->nAction + n >= p->nActionAlloc ){
     int oldAlloc = p->nActionAlloc;
     p->nActionAlloc = p->nAction + n + p->nActionAlloc + 20;
-    p->aAction = realloc( p->aAction,
+    p->aAction = (struct lookahead_action *) realloc( p->aAction,
                           sizeof(p->aAction[0])*p->nActionAlloc);
     if( p->aAction==0 ){
       fprintf(stderr,"malloc failed\n");
@@ -512,28 +563,16 @@ int acttab_insert(acttab *p){
     }
   }
 
-  /* Scan the existing action table looking for an offset where we can
-  ** insert the current transaction set.  Fall out of the loop when that
-  ** offset is found.  In the worst case, we fall out of the loop when
-  ** i reaches p->nAction, which means we append the new transaction set.
+  /* Scan the existing action table looking for an offset that is a 
+  ** duplicate of the current transaction set.  Fall out of the loop
+  ** if and when the duplicate is found.
   **
   ** i is the index in p->aAction[] where p->mnLookahead is inserted.
   */
-  for(i=0; i<p->nAction+p->mnLookahead; i++){
-    if( p->aAction[i].lookahead<0 ){
-      for(j=0; j<p->nLookahead; j++){
-        k = p->aLookahead[j].lookahead - p->mnLookahead + i;
-        if( k<0 ) break;
-        if( p->aAction[k].lookahead>=0 ) break;
-      }
-      if( j<p->nLookahead ) continue;
-      for(j=0; j<p->nAction; j++){
-        if( p->aAction[j].lookahead==j+p->mnLookahead-i ) break;
-      }
-      if( j==p->nAction ){
-        break;  /* Fits in empty slots */
-      }
-    }else if( p->aAction[i].lookahead==p->mnLookahead ){
+  for(i=p->nAction-1; i>=0; i--){
+    if( p->aAction[i].lookahead==p->mnLookahead ){
+      /* All lookaheads and actions in the aLookahead[] transaction
+      ** must match against the candidate aAction[i] entry. */
       if( p->aAction[i].action!=p->mnAction ) continue;
       for(j=0; j<p->nLookahead; j++){
         k = p->aLookahead[j].lookahead - p->mnLookahead + i;
@@ -542,13 +581,43 @@ int acttab_insert(acttab *p){
         if( p->aLookahead[j].action!=p->aAction[k].action ) break;
       }
       if( j<p->nLookahead ) continue;
+
+      /* No possible lookahead value that is not in the aLookahead[]
+      ** transaction is allowed to match aAction[i] */
       n = 0;
       for(j=0; j<p->nAction; j++){
         if( p->aAction[j].lookahead<0 ) continue;
         if( p->aAction[j].lookahead==j+p->mnLookahead-i ) n++;
       }
       if( n==p->nLookahead ){
-        break;  /* Same as a prior transaction set */
+        break;  /* An exact match is found at offset i */
+      }
+    }
+  }
+
+  /* If no existing offsets exactly match the current transaction, find an
+  ** an empty offset in the aAction[] table in which we can add the
+  ** aLookahead[] transaction.
+  */
+  if( i<0 ){
+    /* Look for holes in the aAction[] table that fit the current
+    ** aLookahead[] transaction.  Leave i set to the offset of the hole.
+    ** If no holes are found, i is left at p->nAction, which means the
+    ** transaction will be appended. */
+    for(i=0; i<p->nActionAlloc - p->mxLookahead; i++){
+      if( p->aAction[i].lookahead<0 ){
+        for(j=0; j<p->nLookahead; j++){
+          k = p->aLookahead[j].lookahead - p->mnLookahead + i;
+          if( k<0 ) break;
+          if( p->aAction[k].lookahead>=0 ) break;
+        }
+        if( j<p->nLookahead ) continue;
+        for(j=0; j<p->nAction; j++){
+          if( p->aAction[j].lookahead==j+p->mnLookahead-i ) break;
+        }
+        if( j==p->nAction ){
+          break;  /* Fits in empty slots */
+        }
       }
     }
   }
@@ -580,8 +649,7 @@ int acttab_insert(acttab *p){
 ** are not RHS symbols with a defined precedence, the precedence
 ** symbol field is left blank.
 */
-void FindRulePrecedences(xp)
-struct lemon *xp;
+void FindRulePrecedences(struct lemon *xp)
 {
   struct rule *rp;
   for(rp=xp->rule; rp; rp=rp->next){
@@ -610,8 +678,7 @@ struct lemon *xp;
 ** The first set is the set of all terminal symbols which can begin
 ** a string generated by that nonterminal.
 */
-void FindFirstSets(lemp)
-struct lemon *lemp;
+void FindFirstSets(struct lemon *lemp)
 {
   int i, j;
   struct rule *rp;
@@ -672,9 +739,8 @@ struct lemon *lemp;
 ** are added to between some states so that the LR(1) follow sets
 ** can be computed later.
 */
-PRIVATE struct state *getstate(/* struct lemon * */);  /* forward reference */
-void FindStates(lemp)
-struct lemon *lemp;
+PRIVATE struct state *getstate(struct lemon *);  /* forward reference */
+void FindStates(struct lemon *lemp)
 {
   struct symbol *sp;
   struct rule *rp;
@@ -732,9 +798,8 @@ does not work properly.",sp->name);
 /* Return a pointer to a state which is described by the configuration
 ** list which has been built from calls to Configlist_add.
 */
-PRIVATE void buildshifts(/* struct lemon *, struct state * */); /* Forwd ref */
-PRIVATE struct state *getstate(lemp)
-struct lemon *lemp;
+PRIVATE void buildshifts(struct lemon *, struct state *); /* Forwd ref */
+PRIVATE struct state *getstate(struct lemon *lemp)
 {
   struct config *cfp, *bp;
   struct state *stp;
@@ -778,9 +843,7 @@ struct lemon *lemp;
 /*
 ** Return true if two symbols are the same.
 */
-int same_symbol(a,b)
-struct symbol *a;
-struct symbol *b;
+int same_symbol(struct symbol *a, struct symbol *b)
 {
   int i;
   if( a==b ) return 1;
@@ -796,13 +859,11 @@ struct symbol *b;
 /* Construct all successor states to the given state.  A "successor"
 ** state is any state which can be reached by a shift action.
 */
-PRIVATE void buildshifts(lemp,stp)
-struct lemon *lemp;
-struct state *stp;     /* The state from which successors are computed */
+PRIVATE void buildshifts(struct lemon *lemp, struct state *stp)
 {
   struct config *cfp;  /* For looping thru the config closure of "stp" */
   struct config *bcfp; /* For the inner loop on config closure of "stp" */
-  struct config *new;  /* */
+  struct config *newcfg;  /* */
   struct symbol *sp;   /* Symbol following the dot in configuration "cfp" */
   struct symbol *bsp;  /* Symbol following the dot in configuration "bcfp" */
   struct state *newstp; /* A pointer to a successor state */
@@ -827,8 +888,8 @@ struct state *stp;     /* The state from which successors are computed */
       bsp = bcfp->rp->rhs[bcfp->dot];           /* Get symbol after dot */
       if( !same_symbol(bsp,sp) ) continue;      /* Must be same as for "cfp" */
       bcfp->status = COMPLETE;                  /* Mark this config as used */
-      new = Configlist_addbasis(bcfp->rp,bcfp->dot+1);
-      Plink_add(&new->bplp,bcfp);
+      newcfg = Configlist_addbasis(bcfp->rp,bcfp->dot+1);
+      Plink_add(&newcfg->bplp,bcfp);
     }
 
     /* Get a pointer to the state described by the basis configuration set
@@ -851,8 +912,7 @@ struct state *stp;     /* The state from which successors are computed */
 /*
 ** Construct the propagation links
 */
-void FindLinks(lemp)
-struct lemon *lemp;
+void FindLinks(struct lemon *lemp)
 {
   int i;
   struct config *cfp, *other;
@@ -887,8 +947,7 @@ struct lemon *lemp;
 ** A followset is the set of all symbols which can come immediately
 ** after a configuration.
 */
-void FindFollowSets(lemp)
-struct lemon *lemp;
+void FindFollowSets(struct lemon *lemp)
 {
   int i;
   struct config *cfp;
@@ -920,12 +979,11 @@ struct lemon *lemp;
   }while( progress );
 }
 
-static int resolve_conflict();
+static int resolve_conflict(struct action *,struct action *, struct symbol *);
 
 /* Compute the reduce actions, and resolve conflicts.
 */
-void FindActions(lemp)
-struct lemon *lemp;
+void FindActions(struct lemon *lemp)
 {
   int i,j;
   struct config *cfp;
@@ -996,7 +1054,7 @@ struct lemon *lemp;
 }
 
 /* Resolve a conflict between the two given actions.  If the
-** conflict can't be resolve, return non-zero.
+** conflict can't be resolved, return non-zero.
 **
 ** NO LONGER TRUE:
 **   To resolve a conflict, first look to see if either action
@@ -1008,11 +1066,11 @@ struct lemon *lemp;
 ** If either action is a SHIFT, then it must be apx.  This
 ** function won't work if apx->type==REDUCE and apy->type==SHIFT.
 */
-static int resolve_conflict(apx,apy,errsym)
-struct action *apx;
-struct action *apy;
-struct symbol *errsym;   /* The error symbol (if defined.  NULL otherwise) */
-{
+static int resolve_conflict(
+  struct action *apx,
+  struct action *apy,
+  struct symbol *errsym   /* The error symbol (if defined.  NULL otherwise) */
+){
   struct symbol *spx, *spy;
   int errcnt = 0;
   assert( apx->sp==apy->sp );  /* Otherwise there would be no conflict */
@@ -1027,7 +1085,7 @@ struct symbol *errsym;   /* The error symbol (if defined.  NULL otherwise) */
       /* Not enough precedence information. */
       apy->type = SRCONFLICT;
       errcnt++;
-    }else if( spx->prec>spy->prec ){    /* Lower precedence wins */
+    }else if( spx->prec>spy->prec ){    /* higher precedence wins */
       apy->type = RD_RESOLVED;
     }else if( spx->prec<spy->prec ){
       apx->type = SH_RESOLVED;
@@ -1085,7 +1143,7 @@ static struct config **basisend = 0;     /* End of list of basis configs */
 
 /* Return a pointer to a new configuration */
 PRIVATE struct config *newconfig(){
-  struct config *new;
+  struct config *newcfg;
   if( freelist==0 ){
     int i;
     int amt = 3;
@@ -1097,14 +1155,13 @@ PRIVATE struct config *newconfig(){
     for(i=0; i<amt-1; i++) freelist[i].next = &freelist[i+1];
     freelist[amt-1].next = 0;
   }
-  new = freelist;
+  newcfg = freelist;
   freelist = freelist->next;
-  return new;
+  return newcfg;
 }
 
 /* The configuration "old" is no longer used */
-PRIVATE void deleteconfig(old)
-struct config *old;
+PRIVATE void deleteconfig(struct config *old)
 {
   old->next = freelist;
   freelist = old;
@@ -1131,10 +1188,10 @@ void Configlist_reset(){
 }
 
 /* Add another configuration to the configuration list */
-struct config *Configlist_add(rp,dot)
-struct rule *rp;    /* The rule */
-int dot;            /* Index into the RHS of the rule where the dot goes */
-{
+struct config *Configlist_add(
+  struct rule *rp,    /* The rule */
+  int dot             /* Index into the RHS of the rule where the dot goes */
+){
   struct config *cfp, model;
 
   assert( currentend!=0 );
@@ -1158,9 +1215,7 @@ int dot;            /* Index into the RHS of the rule where the dot goes */
 }
 
 /* Add a basis configuration to the configuration list */
-struct config *Configlist_addbasis(rp,dot)
-struct rule *rp;
-int dot;
+struct config *Configlist_addbasis(struct rule *rp, int dot)
 {
   struct config *cfp, model;
 
@@ -1188,8 +1243,7 @@ int dot;
 }
 
 /* Compute the closure of the configuration list */
-void Configlist_closure(lemp)
-struct lemon *lemp;
+void Configlist_closure(struct lemon *lemp)
 {
   struct config *cfp, *newcfp;
   struct rule *rp, *newrp;
@@ -1268,8 +1322,7 @@ struct config *Configlist_basis(){
 }
 
 /* Free all elements of the given configuration list */
-void Configlist_eat(cfp)
-struct config *cfp;
+void Configlist_eat(struct config *cfp)
 {
   struct config *nextcfp;
   for(; cfp; cfp=nextcfp){
@@ -1286,72 +1339,13 @@ struct config *cfp;
 ** Code for printing error message.
 */
 
-/* Find a good place to break "msg" so that its length is at least "min"
-** but no more than "max".  Make the point as close to max as possible.
-*/
-static int findbreak(msg,min,max)
-char *msg;
-int min;
-int max;
-{
-  int i,spot;
-  char c;
-  for(i=spot=min; i<=max; i++){
-    c = msg[i];
-    if( c=='\t' ) msg[i] = ' ';
-    if( c=='\n' ){ msg[i] = ' '; spot = i; break; }
-    if( c==0 ){ spot = i; break; }
-    if( c=='-' && i<max-1 ) spot = i+1;
-    if( c==' ' ) spot = i;
-  }
-  return spot;
-}
-
-/*
-** The error message is split across multiple lines if necessary.  The
-** splits occur at a space, if there is a space available near the end
-** of the line.
-*/
-#define ERRMSGSIZE  10000 /* Hope this is big enough.  No way to error check */
-#define LINEWIDTH      79 /* Max width of any output line */
-#define PREFIXLIMIT    30 /* Max width of the prefix on each line */
 void ErrorMsg(const char *filename, int lineno, const char *format, ...){
-  char errmsg[ERRMSGSIZE];
-  char prefix[PREFIXLIMIT+10];
-  int errmsgsize;
-  int prefixsize;
-  int availablewidth;
   va_list ap;
-  int end, restart, base;
-
+  fprintf(stderr, "%s:%d: ", filename, lineno);
   va_start(ap, format);
-  /* Prepare a prefix to be prepended to every output line */
-  if( lineno>0 ){
-    sprintf(prefix,"%.*s:%d: ",PREFIXLIMIT-10,filename,lineno);
-  }else{
-    sprintf(prefix,"%.*s: ",PREFIXLIMIT-10,filename);
-  }
-  prefixsize = strlen(prefix);
-  availablewidth = LINEWIDTH - prefixsize;
-
-  /* Generate the error message */
-  vsprintf(errmsg,format,ap);
+  vfprintf(stderr,format,ap);
   va_end(ap);
-  errmsgsize = strlen(errmsg);
-  /* Remove trailing '\n's from the error message. */
-  while( errmsgsize>0 && errmsg[errmsgsize-1]=='\n' ){
-     errmsg[--errmsgsize] = 0;
-  }
-
-  /* Print the error message */
-  base = 0;
-  while( errmsg[base]!=0 ){
-    end = restart = findbreak(&errmsg[base],0,availablewidth);
-    restart += base;
-    while( errmsg[restart]==' ' ) restart++;
-    fprintf(stdout,"%s%.*s\n",prefix,end,&errmsg[base]);
-    base = restart;
-  }
+  fprintf(stderr, "\n");
 }
 /**************** From the file "main.c" ************************************/
 /*
@@ -1375,13 +1369,13 @@ static char **azDefine = 0;  /* Name of the -D macros */
 static void handle_D_option(char *z){
   char **paz;
   nDefine++;
-  azDefine = realloc(azDefine, sizeof(azDefine[0])*nDefine);
+  azDefine = (char **) realloc(azDefine, sizeof(azDefine[0])*nDefine);
   if( azDefine==0 ){
     fprintf(stderr,"out of memory\n");
     exit(1);
   }
   paz = &azDefine[nDefine-1];
-  *paz = malloc( strlen(z)+1 );
+  *paz = (char *) malloc( lemonStrlen(z)+1 );
   if( *paz==0 ){
     fprintf(stderr,"out of memory\n");
     exit(1);
@@ -1391,11 +1385,19 @@ static void handle_D_option(char *z){
   *z = 0;
 }
 
+static char *user_templatename = NULL;
+static void handle_T_option(char *z){
+  user_templatename = (char *) malloc( lemonStrlen(z)+1 );
+  if( user_templatename==0 ){
+    memory_error();
+  }
+  strcpy(user_templatename, z);
+}
+
+int local_out_dir = 0;
 
 /* The main program.  Parse the command line and do it... */
-int main(argc,argv)
-int argc;
-char **argv;
+int main(int argc, char **argv)
 {
   static int version = 0;
   static int rpflag = 0;
@@ -1404,31 +1406,39 @@ char **argv;
   static int quiet = 0;
   static int statistics = 0;
   static int mhflag = 0;
-  static int local_out_dir = 0;
+  static int nolinenosflag = 0;
+  static int noResort = 0;
   static struct s_options options[] = {
     {OPT_FLAG, "b", (char*)&basisflag, "Print only the basis in report."},
     {OPT_FLAG, "c", (char*)&compress, "Don't compress the action table."},
+    {OPT_FLAG, "d", (char*)&local_out_dir, "Output files in the current directory."},
     {OPT_FSTR, "D", (char*)handle_D_option, "Define an %ifdef macro."},
+    {OPT_FSTR, "T", (char*)handle_T_option, "Specify a template file."},
     {OPT_FLAG, "g", (char*)&rpflag, "Print grammar without actions."},
-    {OPT_FLAG, "m", (char*)&mhflag, "Output a makeheaders compatible file"},
+    {OPT_FLAG, "m", (char*)&mhflag, "Output a makeheaders compatible file."},
+    {OPT_FLAG, "l", (char*)&nolinenosflag, "Do not print #line statements."},
+    {OPT_FLAG, "p", (char*)&showPrecedenceConflict,
+                    "Show conflicts resolved by precedence rules"},
     {OPT_FLAG, "q", (char*)&quiet, "(Quiet) Don't print the report file."},
+    {OPT_FLAG, "r", (char*)&noResort, "Do not sort or renumber states"},
     {OPT_FLAG, "s", (char*)&statistics,
                                    "Print parser stats to standard output."},
-    {OPT_FLAG, "d", (char*)&local_out_dir, "Output files in the current directory."},
     {OPT_FLAG, "x", (char*)&version, "Print the version number."},
     {OPT_FLAG,0,0,0}
   };
   int i;
+  int exitcode;
   struct lemon lem;
-  char *def_tmpl_name = "lempar.c";
+
+  /*atexit(LemonAtExit);*/
 
   OptInit(argv,options,stderr);
   if( version ){
      printf("Lemon version 1.0\n");
      exit(0); 
   }
-  if( (OptNArgs() != 1) && (OptNArgs() != 2) ){
-    fprintf(stderr,"Usage: %s file.y [path to lempar.c file].\n", argv[0]);
+  if( OptNArgs()!=1 ){
+    fprintf(stderr,"Exactly one filename argument is required.\n");
     exit(1);
   }
   memset(&lem, 0, sizeof(lem));
@@ -1440,22 +1450,8 @@ char **argv;
   State_init();
   lem.argv0 = argv[0];
   lem.filename = OptArg(0);
-  if (local_out_dir) {
-    char *ptr;
-    lem.base_filename = malloc (sizeof (char) * strlen (lem.filename) + 1);
-    memcpy (lem.base_filename, lem.filename, sizeof (char) * strlen (lem.filename) + 1);
-#ifdef __WIN32__
-    for (ptr = lem.base_filename + strlen (lem.filename) - 1; (ptr > lem.base_filename) && (*ptr != '\\'); ptr--);
-#else
-    for (ptr = lem.base_filename + strlen (lem.filename) - 1; (ptr > lem.base_filename) && (*ptr != '/'); ptr--);
-#endif
-    if (ptr > lem.base_filename)
-     lem.base_filename = ptr + 1;
-  }
-  else
-    lem.base_filename = OptArg(0);
-  lem.tmplname = (OptNArgs() == 2) ? OptArg(1) : def_tmpl_name;
   lem.basisflag = basisflag;
+  lem.nolinenosflag = nolinenosflag;
   Symbol_new("$");
   lem.errsym = Symbol_new("error");
   lem.errsym->useCnt = 0;
@@ -1473,8 +1469,7 @@ char **argv;
   Symbol_new("{default}");
   lem.symbols = Symbol_arrayof();
   for(i=0; i<=lem.nsymbol; i++) lem.symbols[i]->index = i;
-  qsort(lem.symbols,lem.nsymbol+1,sizeof(struct symbol*),
-        (int(*)())Symbolcmpp);
+  qsort(lem.symbols,lem.nsymbol+1,sizeof(struct symbol*), Symbolcmpp);
   for(i=0; i<=lem.nsymbol; i++) lem.symbols[i]->index = i;
   for(i=1; isupper(lem.symbols[i]->name[0]); i++);
   lem.nterminal = i;
@@ -1512,8 +1507,9 @@ char **argv;
     if( compress==0 ) CompressTables(&lem);
 
     /* Reorder and renumber the states so that states with fewer choices
-    ** occur at the end. */
-    ResortStates(&lem);
+    ** occur at the end.  This is an optimization that helps make the
+    ** generated parser tables smaller. */
+    if( noResort==0 ) ResortStates(&lem);
 
     /* Generate a report of the parser generated.  (the "y.output" file) */
     if( !quiet ) ReportOutput(&lem);
@@ -1532,11 +1528,15 @@ char **argv;
     printf("                   %d states, %d parser table entries, %d conflicts\n",
       lem.nstate, lem.tablesize, lem.nconflict);
   }
-  if( lem.nconflict ){
+  if( lem.nconflict > 0 ){
     fprintf(stderr,"%d parsing conflicts.\n",lem.nconflict);
   }
-  exit(lem.errorcnt + lem.nconflict);
-  return (lem.errorcnt + lem.nconflict);
+
+  /* return 0 on success, 1 on failure. */
+  exitcode = ((lem.errorcnt > 0) || (lem.nconflict > 0)) ? 1 : 0;
+  successful_exit = (exitcode == 0);
+  exit(exitcode);
+  return (exitcode);
 }
 /******************** From the file "msort.c" *******************************/
 /*
@@ -1595,7 +1595,7 @@ static char *merge(
   }else if( b==0 ){
     head = a;
   }else{
-    if( (*cmp)(a,b)<0 ){
+    if( (*cmp)(a,b)<=0 ){
       ptr = a;
       a = NEXT(a);
     }else{
@@ -1604,7 +1604,7 @@ static char *merge(
     }
     head = ptr;
     while( a && b ){
-      if( (*cmp)(a,b)<0 ){
+      if( (*cmp)(a,b)<=0 ){
         NEXT(ptr) = a;
         ptr = a;
         a = NEXT(a);
@@ -1656,7 +1656,7 @@ static char *msort(
     set[i] = ep;
   }
   ep = 0;
-  for(i=0; i<LISTSIZE; i++) if( set[i] ) ep = merge(ep,set[i],cmp,offset);
+  for(i=0; i<LISTSIZE; i++) if( set[i] ) ep = merge(set[i],ep,cmp,offset);
   return ep;
 }
 /************************ From the file "option.c" **************************/
@@ -1670,17 +1670,14 @@ static FILE *errstream;
 ** Print the command line with a carrot pointing to the k-th character
 ** of the n-th field.
 */
-static void errline(n,k,err)
-int n;
-int k;
-FILE *err;
+static void errline(int n, int k, FILE *err)
 {
   int spcnt, i;
   if( argv[0] ) fprintf(err,"%s",argv[0]);
-  spcnt = strlen(argv[0]) + 1;
+  spcnt = lemonStrlen(argv[0]) + 1;
   for(i=1; i<n && argv[i]; i++){
     fprintf(err," %s",argv[i]);
-    spcnt += strlen(argv[i])+1;
+    spcnt += lemonStrlen(argv[i])+1;
   }
   spcnt += k;
   for(; argv[i]; i++) fprintf(err," %s",argv[i]);
@@ -1695,8 +1692,7 @@ FILE *err;
 ** Return the index of the N-th non-switch argument.  Return -1
 ** if N is out of range.
 */
-static int argindex(n)
-int n;
+static int argindex(int n)
 {
   int i;
   int dashdash = 0;
@@ -1717,15 +1713,13 @@ static char emsg[] = "Command line syntax error: ";
 /*
 ** Process a flag command line argument.
 */
-static int handleflags(i,err)
-int i;
-FILE *err;
+static int handleflags(int i, FILE *err)
 {
   int v;
   int errcnt = 0;
   int j;
   for(j=0; op[j].label; j++){
-    if( strncmp(&argv[i][1],op[j].label,strlen(op[j].label))==0 ) break;
+    if( strncmp(&argv[i][1],op[j].label,lemonStrlen(op[j].label))==0 ) break;
   }
   v = argv[i][0]=='-' ? 1 : 0;
   if( op[j].label==0 ){
@@ -1737,9 +1731,9 @@ FILE *err;
   }else if( op[j].type==OPT_FLAG ){
     *((int*)op[j].arg) = v;
   }else if( op[j].type==OPT_FFLAG ){
-    (*(void(*)())(op[j].arg))(v);
+    (*(void(*)(int))(op[j].arg))(v);
   }else if( op[j].type==OPT_FSTR ){
-    (*(void(*)())(op[j].arg))(&argv[i][2]);
+    (*(void(*)(char *))(op[j].arg))(&argv[i][2]);
   }else{
     if( err ){
       fprintf(err,"%smissing argument on switch.\n",emsg);
@@ -1753,9 +1747,7 @@ FILE *err;
 /*
 ** Process a command line switch which has an argument.
 */
-static int handleswitch(i,err)
-int i;
-FILE *err;
+static int handleswitch(int i, FILE *err)
 {
   int lv = 0;
   double dv = 0.0;
@@ -1822,29 +1814,26 @@ FILE *err;
         *(double*)(op[j].arg) = dv;
         break;
       case OPT_FDBL:
-        (*(void(*)())(op[j].arg))(dv);
+        (*(void(*)(double))(op[j].arg))(dv);
         break;
       case OPT_INT:
         *(int*)(op[j].arg) = lv;
         break;
       case OPT_FINT:
-        (*(void(*)())(op[j].arg))((int)lv);
+        (*(void(*)(int))(op[j].arg))((int)lv);
         break;
       case OPT_STR:
         *(char**)(op[j].arg) = sv;
         break;
       case OPT_FSTR:
-        (*(void(*)())(op[j].arg))(sv);
+        (*(void(*)(char *))(op[j].arg))(sv);
         break;
     }
   }
   return errcnt;
 }
 
-int OptInit(a,o,err)
-char **a;
-struct s_options *o;
-FILE *err;
+int OptInit(char **a, struct s_options *o, FILE *err)
 {
   int errcnt = 0;
   argv = a;
@@ -1881,16 +1870,14 @@ int OptNArgs(){
   return cnt;
 }
 
-char *OptArg(n)
-int n;
+char *OptArg(int n)
 {
   int i;
   i = argindex(n);
   return i>=0 ? argv[i] : 0;
 }
 
-void OptErr(n)
-int n;
+void OptErr(int n)
 {
   int i;
   i = argindex(n);
@@ -1902,7 +1889,7 @@ void OptPrint(){
   int max, len;
   max = 0;
   for(i=0; op[i].label; i++){
-    len = strlen(op[i].label) + 1;
+    len = lemonStrlen(op[i].label) + 1;
     switch( op[i].type ){
       case OPT_FLAG:
       case OPT_FFLAG:
@@ -1931,17 +1918,17 @@ void OptPrint(){
       case OPT_INT:
       case OPT_FINT:
         fprintf(errstream,"  %s=<integer>%*s  %s\n",op[i].label,
-          (int)(max-strlen(op[i].label)-9),"",op[i].message);
+          (int)(max-lemonStrlen(op[i].label)-9),"",op[i].message);
         break;
       case OPT_DBL:
       case OPT_FDBL:
         fprintf(errstream,"  %s=<real>%*s  %s\n",op[i].label,
-          (int)(max-strlen(op[i].label)-6),"",op[i].message);
+          (int)(max-lemonStrlen(op[i].label)-6),"",op[i].message);
         break;
       case OPT_STR:
       case OPT_FSTR:
         fprintf(errstream,"  %s=<string>%*s  %s\n",op[i].label,
-          (int)(max-strlen(op[i].label)-8),"",op[i].message);
+          (int)(max-lemonStrlen(op[i].label)-8),"",op[i].message);
         break;
     }
   }
@@ -1952,44 +1939,46 @@ void OptPrint(){
 */
 
 /* The state of the parser */
+enum e_state {
+  INITIALIZE,
+  WAITING_FOR_DECL_OR_RULE,
+  WAITING_FOR_DECL_KEYWORD,
+  WAITING_FOR_DECL_ARG,
+  WAITING_FOR_PRECEDENCE_SYMBOL,
+  WAITING_FOR_ARROW,
+  IN_RHS,
+  LHS_ALIAS_1,
+  LHS_ALIAS_2,
+  LHS_ALIAS_3,
+  RHS_ALIAS_1,
+  RHS_ALIAS_2,
+  PRECEDENCE_MARK_1,
+  PRECEDENCE_MARK_2,
+  RESYNC_AFTER_RULE_ERROR,
+  RESYNC_AFTER_DECL_ERROR,
+  WAITING_FOR_DESTRUCTOR_SYMBOL,
+  WAITING_FOR_DATATYPE_SYMBOL,
+  WAITING_FOR_FALLBACK_ID,
+  WAITING_FOR_WILDCARD_ID
+};
 struct pstate {
   char *filename;       /* Name of the input file */
   int tokenlineno;      /* Linenumber at which current token starts */
   int errorcnt;         /* Number of errors so far */
   char *tokenstart;     /* Text of current token */
   struct lemon *gp;     /* Global state vector */
-  enum e_state {
-    INITIALIZE,
-    WAITING_FOR_DECL_OR_RULE,
-    WAITING_FOR_DECL_KEYWORD,
-    WAITING_FOR_DECL_ARG,
-    WAITING_FOR_PRECEDENCE_SYMBOL,
-    WAITING_FOR_ARROW,
-    IN_RHS,
-    LHS_ALIAS_1,
-    LHS_ALIAS_2,
-    LHS_ALIAS_3,
-    RHS_ALIAS_1,
-    RHS_ALIAS_2,
-    PRECEDENCE_MARK_1,
-    PRECEDENCE_MARK_2,
-    RESYNC_AFTER_RULE_ERROR,
-    RESYNC_AFTER_DECL_ERROR,
-    WAITING_FOR_DESTRUCTOR_SYMBOL,
-    WAITING_FOR_DATATYPE_SYMBOL,
-    WAITING_FOR_FALLBACK_ID,
-    WAITING_FOR_WILDCARD_ID
-  } state;                   /* The state of the parser */
+  enum e_state state;        /* The state of the parser */
   struct symbol *fallback;   /* The fallback token */
   struct symbol *lhs;        /* Left-hand side of current rule */
-  char *lhsalias;            /* Alias for the LHS */
+  const char *lhsalias;      /* Alias for the LHS */
   int nrhs;                  /* Number of right-hand side symbols seen */
   struct symbol *rhs[MAXRHS];  /* RHS symbols */
-  char *alias[MAXRHS];       /* Aliases for each RHS symbol (or NULL) */
+  const char *alias[MAXRHS]; /* Aliases for each RHS symbol (or NULL) */
   struct rule *prevrule;     /* Previous rule parsed */
-  char *declkeyword;         /* Keyword of a declaration */
+  const char *declkeyword;   /* Keyword of a declaration */
   char **declargslot;        /* Where the declaration argument should be put */
-  int *decllnslot;           /* Where the declaration linenumber is put */
+  int insertLineMacro;       /* Add #line before declaration insert */
+  int *decllinenoslot;       /* Where to write declaration line number */
   enum e_assoc declassoc;    /* Assign this association to decl arguments */
   int preccounter;           /* Assign this precedence to decl arguments */
   struct rule *firstrule;    /* Pointer to first rule in the grammar */
@@ -1997,10 +1986,9 @@ struct pstate {
 };
 
 /* Parse a single token */
-static void parseonetoken(psp)
-struct pstate *psp;
+static void parseonetoken(struct pstate *psp)
 {
-  char *x;
+  const char *x;
   x = Strsafe(psp->tokenstart);     /* Save the token permanently */
 #if 0
   printf("%s:%d: Token=[%s] state=%d\n",psp->filename,psp->tokenlineno,
@@ -2024,7 +2012,7 @@ struct pstate *psp;
       }else if( x[0]=='{' ){
         if( psp->prevrule==0 ){
           ErrorMsg(psp->filename,psp->tokenlineno,
-"There is not prior rule opon which to attach the code \
+"There is no prior rule opon which to attach the code \
 fragment which begins on this line.");
           psp->errorcnt++;
 	}else if( psp->prevrule->code!=0 ){
@@ -2132,7 +2120,7 @@ to follow the previous rule.");
           int i;
           rp->ruleline = psp->tokenlineno;
           rp->rhs = (struct symbol**)&rp[1];
-          rp->rhsalias = (char**)&(rp->rhs[psp->nrhs]);
+          rp->rhsalias = (const char**)&(rp->rhs[psp->nrhs]);
           for(i=0; i<psp->nrhs; i++){
             rp->rhs[i] = psp->rhs[i];
             rp->rhsalias[i] = psp->alias[i];
@@ -2171,17 +2159,18 @@ to follow the previous rule.");
         struct symbol *msp = psp->rhs[psp->nrhs-1];
         if( msp->type!=MULTITERMINAL ){
           struct symbol *origsp = msp;
-          msp = calloc(1,sizeof(*msp));
+          msp = (struct symbol *) calloc(1,sizeof(*msp));
           memset(msp, 0, sizeof(*msp));
           msp->type = MULTITERMINAL;
           msp->nsubsym = 1;
-          msp->subsym = calloc(1,sizeof(struct symbol*));
+          msp->subsym = (struct symbol **) calloc(1,sizeof(struct symbol*));
           msp->subsym[0] = origsp;
           msp->name = origsp->name;
           psp->rhs[psp->nrhs-1] = msp;
         }
         msp->nsubsym++;
-        msp->subsym = realloc(msp->subsym, sizeof(struct symbol*)*msp->nsubsym);
+        msp->subsym = (struct symbol **) realloc(msp->subsym,
+          sizeof(struct symbol*)*msp->nsubsym);
         msp->subsym[msp->nsubsym-1] = Symbol_new(&x[1]);
         if( islower(x[1]) || islower(msp->subsym[0]->name[0]) ){
           ErrorMsg(psp->filename,psp->tokenlineno,
@@ -2223,46 +2212,46 @@ to follow the previous rule.");
       if( isalpha(x[0]) ){
         psp->declkeyword = x;
         psp->declargslot = 0;
-        psp->decllnslot = 0;
+        psp->decllinenoslot = 0;
+        psp->insertLineMacro = 1;
         psp->state = WAITING_FOR_DECL_ARG;
         if( strcmp(x,"name")==0 ){
           psp->declargslot = &(psp->gp->name);
+          psp->insertLineMacro = 0;
 	}else if( strcmp(x,"include")==0 ){
           psp->declargslot = &(psp->gp->include);
-          psp->decllnslot = &psp->gp->includeln;
 	}else if( strcmp(x,"code")==0 ){
           psp->declargslot = &(psp->gp->extracode);
-          psp->decllnslot = &psp->gp->extracodeln;
 	}else if( strcmp(x,"token_destructor")==0 ){
           psp->declargslot = &psp->gp->tokendest;
-          psp->decllnslot = &psp->gp->tokendestln;
 	}else if( strcmp(x,"default_destructor")==0 ){
           psp->declargslot = &psp->gp->vardest;
-          psp->decllnslot = &psp->gp->vardestln;
 	}else if( strcmp(x,"token_prefix")==0 ){
           psp->declargslot = &psp->gp->tokenprefix;
+          psp->insertLineMacro = 0;
 	}else if( strcmp(x,"syntax_error")==0 ){
           psp->declargslot = &(psp->gp->error);
-          psp->decllnslot = &psp->gp->errorln;
 	}else if( strcmp(x,"parse_accept")==0 ){
           psp->declargslot = &(psp->gp->accept);
-          psp->decllnslot = &psp->gp->acceptln;
 	}else if( strcmp(x,"parse_failure")==0 ){
           psp->declargslot = &(psp->gp->failure);
-          psp->decllnslot = &psp->gp->failureln;
 	}else if( strcmp(x,"stack_overflow")==0 ){
           psp->declargslot = &(psp->gp->overflow);
-          psp->decllnslot = &psp->gp->overflowln;
         }else if( strcmp(x,"extra_argument")==0 ){
           psp->declargslot = &(psp->gp->arg);
+          psp->insertLineMacro = 0;
         }else if( strcmp(x,"token_type")==0 ){
           psp->declargslot = &(psp->gp->tokentype);
+          psp->insertLineMacro = 0;
         }else if( strcmp(x,"default_type")==0 ){
           psp->declargslot = &(psp->gp->vartype);
+          psp->insertLineMacro = 0;
         }else if( strcmp(x,"stack_size")==0 ){
           psp->declargslot = &(psp->gp->stacksize);
+          psp->insertLineMacro = 0;
         }else if( strcmp(x,"start_symbol")==0 ){
           psp->declargslot = &(psp->gp->start);
+          psp->insertLineMacro = 0;
         }else if( strcmp(x,"left")==0 ){
           psp->preccounter++;
           psp->declassoc = LEFT;
@@ -2300,27 +2289,38 @@ to follow the previous rule.");
     case WAITING_FOR_DESTRUCTOR_SYMBOL:
       if( !isalpha(x[0]) ){
         ErrorMsg(psp->filename,psp->tokenlineno,
-          "Symbol name missing after %destructor keyword");
+          "Symbol name missing after %%destructor keyword");
         psp->errorcnt++;
         psp->state = RESYNC_AFTER_DECL_ERROR;
       }else{
         struct symbol *sp = Symbol_new(x);
         psp->declargslot = &sp->destructor;
-        psp->decllnslot = &sp->destructorln;
+        psp->decllinenoslot = &sp->destLineno;
+        psp->insertLineMacro = 1;
         psp->state = WAITING_FOR_DECL_ARG;
       }
       break;
     case WAITING_FOR_DATATYPE_SYMBOL:
       if( !isalpha(x[0]) ){
         ErrorMsg(psp->filename,psp->tokenlineno,
-          "Symbol name missing after %destructor keyword");
+          "Symbol name missing after %%type keyword");
         psp->errorcnt++;
         psp->state = RESYNC_AFTER_DECL_ERROR;
       }else{
-        struct symbol *sp = Symbol_new(x);
-        psp->declargslot = &sp->datatype;
-        psp->decllnslot = 0;
-        psp->state = WAITING_FOR_DECL_ARG;
+        struct symbol *sp = Symbol_find(x);
+        if((sp) && (sp->datatype)){
+          ErrorMsg(psp->filename,psp->tokenlineno,
+            "Symbol %%type \"%s\" already defined", x);
+          psp->errorcnt++;
+          psp->state = RESYNC_AFTER_DECL_ERROR;
+        }else{
+          if (!sp){
+            sp = Symbol_new(x);
+          }
+          psp->declargslot = &sp->datatype;
+          psp->insertLineMacro = 0;
+          psp->state = WAITING_FOR_DECL_ARG;
+        }
       }
       break;
     case WAITING_FOR_PRECEDENCE_SYMBOL:
@@ -2344,18 +2344,57 @@ to follow the previous rule.");
       }
       break;
     case WAITING_FOR_DECL_ARG:
-      if( (x[0]=='{' || x[0]=='\"' || isalnum(x[0])) ){
-        if( *(psp->declargslot)!=0 ){
-          ErrorMsg(psp->filename,psp->tokenlineno,
-            "The argument \"%s\" to declaration \"%%%s\" is not the first.",
-            x[0]=='\"' ? &x[1] : x,psp->declkeyword);
-          psp->errorcnt++;
-          psp->state = RESYNC_AFTER_DECL_ERROR;
-	}else{
-          *(psp->declargslot) = (x[0]=='\"' || x[0]=='{') ? &x[1] : x;
-          if( psp->decllnslot ) *psp->decllnslot = psp->tokenlineno;
-          psp->state = WAITING_FOR_DECL_OR_RULE;
-	}
+      if( x[0]=='{' || x[0]=='\"' || isalnum(x[0]) ){
+        const char *zOld, *zNew;
+        char *zBuf, *z;
+        int nOld, n, nLine, nNew, nBack;
+        int addLineMacro;
+        char zLine[50];
+        zNew = x;
+        if( zNew[0]=='"' || zNew[0]=='{' ) zNew++;
+        nNew = lemonStrlen(zNew);
+        if( *psp->declargslot ){
+          zOld = *psp->declargslot;
+        }else{
+          zOld = "";
+        }
+        nOld = lemonStrlen(zOld);
+        n = nOld + nNew + 20;
+        addLineMacro = !psp->gp->nolinenosflag && psp->insertLineMacro &&
+                        (psp->decllinenoslot==0 || psp->decllinenoslot[0]!=0);
+        if( addLineMacro ){
+          for(z=psp->filename, nBack=0; *z; z++){
+            if( *z=='\\' ) nBack++;
+          }
+          sprintf(zLine, "#line %d ", psp->tokenlineno);
+          nLine = lemonStrlen(zLine);
+          n += nLine + lemonStrlen(psp->filename) + nBack;
+        }
+        *psp->declargslot = (char *) realloc(*psp->declargslot, n);
+        zBuf = *psp->declargslot + nOld;
+        if( addLineMacro ){
+          if( nOld && zBuf[-1]!='\n' ){
+            *(zBuf++) = '\n';
+          }
+          memcpy(zBuf, zLine, nLine);
+          zBuf += nLine;
+          *(zBuf++) = '"';
+          for(z=psp->filename; *z; z++){
+            if( *z=='\\' ){
+              *(zBuf++) = '\\';
+            }
+            *(zBuf++) = *z;
+          }
+          *(zBuf++) = '"';
+          *(zBuf++) = '\n';
+        }
+        if( psp->decllinenoslot && psp->decllinenoslot[0]==0 ){
+          psp->decllinenoslot[0] = psp->tokenlineno;
+        }
+        memcpy(zBuf, zNew, nNew);
+        zBuf += nNew;
+        *zBuf = 0;
+        psp->state = WAITING_FOR_DECL_OR_RULE;
       }else{
         ErrorMsg(psp->filename,psp->tokenlineno,
           "Illegal argument to %%%s: %s",psp->declkeyword,x);
@@ -2412,7 +2451,7 @@ to follow the previous rule.");
   }
 }
 
-/* Run the proprocessor over the input file text.  The global variables
+/* Run the preprocessor over the input file text.  The global variables
 ** azDefine[0] through azDefine[nDefine-1] contains the names of all defined
 ** macros.  This routine looks for "%ifdef" and "%ifndef" and "%endif" and
 ** comments them out.  Text in between is also commented out as appropriate.
@@ -2443,7 +2482,7 @@ static void preprocess_input(char *z){
         for(n=0; z[j+n] && !isspace(z[j+n]); n++){}
         exclude = 1;
         for(k=0; k<nDefine; k++){
-          if( strncmp(azDefine[k],&z[j],n)==0 && strlen(azDefine[k])==n ){
+          if( strncmp(azDefine[k],&z[j],n)==0 && lemonStrlen(azDefine[k])==n ){
             exclude = 0;
             break;
           }
@@ -2468,8 +2507,7 @@ static void preprocess_input(char *z){
 ** token is passed to the function "parseonetoken" which builds all
 ** the appropriate data structures in the global state vector "gp".
 */
-void Parse(gp)
-struct lemon *gp;
+void Parse(struct lemon *gp)
 {
   struct pstate ps;
   FILE *fp;
@@ -2623,7 +2661,7 @@ static struct plink *plink_freelist = 0;
 
 /* Allocate a new plink */
 struct plink *Plink_new(){
-  struct plink *new;
+  struct plink *newlink;
 
   if( plink_freelist==0 ){
     int i;
@@ -2637,27 +2675,23 @@ struct plink *Plink_new(){
     for(i=0; i<amt-1; i++) plink_freelist[i].next = &plink_freelist[i+1];
     plink_freelist[amt-1].next = 0;
   }
-  new = plink_freelist;
+  newlink = plink_freelist;
   plink_freelist = plink_freelist->next;
-  return new;
+  return newlink;
 }
 
 /* Add a plink to a plink list */
-void Plink_add(plpp,cfp)
-struct plink **plpp;
-struct config *cfp;
+void Plink_add(struct plink **plpp, struct config *cfp)
 {
-  struct plink *new;
-  new = Plink_new();
-  new->next = *plpp;
-  *plpp = new;
-  new->cfp = cfp;
+  struct plink *newlink;
+  newlink = Plink_new();
+  newlink->next = *plpp;
+  *plpp = newlink;
+  newlink->cfp = cfp;
 }
 
 /* Transfer every plink on the list "from" to the list "to" */
-void Plink_copy(to,from)
-struct plink **to;
-struct plink *from;
+void Plink_copy(struct plink **to, struct plink *from)
 {
   struct plink *nextpl;
   while( from ){
@@ -2669,8 +2703,7 @@ struct plink *from;
 }
 
 /* Delete every plink on the list */
-void Plink_delete(plp)
-struct plink *plp;
+void Plink_delete(struct plink *plp)
 {
   struct plink *nextpl;
 
@@ -2690,19 +2723,30 @@ struct plink *plp;
 ** name comes from malloc() and must be freed by the calling
 ** function.
 */
-PRIVATE char *file_makename(lemp,suffix)
-struct lemon *lemp;
-char *suffix;
+PRIVATE char *file_makename(struct lemon *lemp, const char *suffix)
 {
   char *name;
   char *cp;
+  char *filename;
+
+  filename = lemp->filename;
+  if (local_out_dir) {
+    char *ptr;
+#ifdef __WIN32__
+    for (ptr = lemp->filename + strlen (lemp->filename) - 1; (ptr > lemp->filename) && (*ptr != '\\'); ptr--);
+#else
+    for (ptr = lemp->filename + strlen (lemp->filename) - 1; (ptr > lemp->filename) && (*ptr != '/'); ptr--);
+#endif
+    if (ptr > lemp->filename)
+     filename = ptr + 1;
+  }
 
-  name = malloc( strlen(lemp->base_filename) + strlen(suffix) + 5 );
+  name = (char*)malloc( lemonStrlen(filename) + lemonStrlen(suffix) + 5 );
   if( name==0 ){
     fprintf(stderr,"Can't allocate space for a filename.\n");
     exit(1);
   }
-  strcpy(name,lemp->base_filename);
+  strcpy(name,filename);
   cp = strrchr(name,'.');
   if( cp ) *cp = 0;
   strcat(name,suffix);
@@ -2712,11 +2756,11 @@ char *suffix;
 /* Open a file with a name based on the name of the input file,
 ** but with a different (specified) suffix, and return a pointer
 ** to the stream */
-PRIVATE FILE *file_open(lemp,suffix,mode)
-struct lemon *lemp;
-char *suffix;
-char *mode;
-{
+PRIVATE FILE *file_open(
+  struct lemon *lemp,
+  const char *suffix,
+  const char *mode
+){
   FILE *fp;
 
   if( lemp->outname ) free(lemp->outname);
@@ -2727,13 +2771,29 @@ char *mode;
     lemp->errorcnt++;
     return 0;
   }
+
+  /* Add files we create to a list, so we can delete them if we fail. This
+  ** is to keep makefiles from getting confused. We don't include .out files,
+  ** though: this is debug information, and you don't want it deleted if there
+  ** was an error you need to track down.
+  */
+  if(( *mode=='w' ) && (strcmp(suffix, ".out") != 0)){
+    const char **ptr = (const char **)
+        realloc(made_files, sizeof (const char **) * (made_files_count + 1));
+    const char *fname = Strsafe(lemp->outname);
+    if ((ptr == NULL) || (fname == NULL)) {
+        free(ptr);
+        memory_error();
+    }
+    made_files = ptr;
+    made_files[made_files_count++] = fname;
+  }
   return fp;
 }
 
 /* Duplicate the input file without comments and without actions 
 ** on rules */
-void Reprint(lemp)
-struct lemon *lemp;
+void Reprint(struct lemon *lemp)
 {
   struct rule *rp;
   struct symbol *sp;
@@ -2742,7 +2802,7 @@ struct lemon *lemp;
   maxlen = 10;
   for(i=0; i<lemp->nsymbol; i++){
     sp = lemp->symbols[i];
-    len = strlen(sp->name);
+    len = lemonStrlen(sp->name);
     if( len>maxlen ) maxlen = len;
   }
   ncolumns = 76/(maxlen+5);
@@ -2778,9 +2838,7 @@ struct lemon *lemp;
   }
 }
 
-void ConfigPrint(fp,cfp)
-FILE *fp;
-struct config *cfp;
+void ConfigPrint(FILE *fp, struct config *cfp)
 {
   struct rule *rp;
   struct symbol *sp;
@@ -2860,11 +2918,25 @@ int PrintAction(struct action *ap, FILE *fp, int indent){
         indent,ap->sp->name,ap->x.rp->index);
       break;
     case SSCONFLICT:
-      fprintf(fp,"%*s shift  %d ** Parsing conflict **", 
+      fprintf(fp,"%*s shift  %-3d ** Parsing conflict **", 
         indent,ap->sp->name,ap->x.stp->statenum);
       break;
     case SH_RESOLVED:
+      if( showPrecedenceConflict ){
+        fprintf(fp,"%*s shift  %-3d -- dropped by precedence",
+                indent,ap->sp->name,ap->x.stp->statenum);
+      }else{
+        result = 0;
+      }
+      break;
     case RD_RESOLVED:
+      if( showPrecedenceConflict ){
+        fprintf(fp,"%*s reduce %-3d -- dropped by precedence",
+                indent,ap->sp->name,ap->x.rp->index);
+      }else{
+        result = 0;
+      }
+      break;
     case NOT_USED:
       result = 0;
       break;
@@ -2873,8 +2945,7 @@ int PrintAction(struct action *ap, FILE *fp, int indent){
 }
 
 /* Generate the "y.output" log file */
-void ReportOutput(lemp)
-struct lemon *lemp;
+void ReportOutput(struct lemon *lemp)
 {
   int i;
   struct state *stp;
@@ -2940,12 +3011,11 @@ struct lemon *lemp;
 
 /* Search for the file "name" which is in the same directory as
 ** the exacutable */
-PRIVATE char *pathsearch(argv0,name,modemask)
-char *argv0;
-char *name;
-int modemask;
+PRIVATE char *pathsearch(char *argv0, char *name, int modemask)
 {
-  char *pathlist;
+  const char *pathlist;
+  char *pathbufptr;
+  char *pathbuf;
   char *path,*cp;
   char c;
 
@@ -2957,26 +3027,29 @@ int modemask;
   if( cp ){
     c = *cp;
     *cp = 0;
-    path = (char *)malloc( strlen(argv0) + strlen(name) + 2 );
+    path = (char *)malloc( lemonStrlen(argv0) + lemonStrlen(name) + 2 );
     if( path ) sprintf(path,"%s/%s",argv0,name);
     *cp = c;
   }else{
-    extern char *getenv();
     pathlist = getenv("PATH");
     if( pathlist==0 ) pathlist = ".:/bin:/usr/bin";
-    path = (char *)malloc( strlen(pathlist)+strlen(name)+2 );
-    if( path!=0 ){
-      while( *pathlist ){
-        cp = strchr(pathlist,':');
-        if( cp==0 ) cp = &pathlist[strlen(pathlist)];
+    pathbuf = (char *) malloc( lemonStrlen(pathlist) + 1 );
+    path = (char *)malloc( lemonStrlen(pathlist)+lemonStrlen(name)+2 );
+    if( (pathbuf != 0) && (path!=0) ){
+      pathbufptr = pathbuf;
+      strcpy(pathbuf, pathlist);
+      while( *pathbuf ){
+        cp = strchr(pathbuf,':');
+        if( cp==0 ) cp = &pathbuf[lemonStrlen(pathbuf)];
         c = *cp;
         *cp = 0;
-        sprintf(path,"%s/%s",pathlist,name);
+        sprintf(path,"%s/%s",pathbuf,name);
         *cp = c;
-        if( c==0 ) pathlist = "";
-        else pathlist = &cp[1];
+        if( c==0 ) pathbuf[0] = 0;
+        else pathbuf = &cp[1];
         if( access(path,modemask)==0 ) break;
       }
+      free(pathbufptr);
     }
   }
   return path;
@@ -2986,9 +3059,7 @@ int modemask;
 ** which is to be put in the action table of the generated machine.
 ** Return negative if no action should be generated.
 */
-PRIVATE int compute_action(lemp,ap)
-struct lemon *lemp;
-struct action *ap;
+PRIVATE int compute_action(struct lemon *lemp, struct action *ap)
 {
   int act;
   switch( ap->type ){
@@ -3011,11 +3082,7 @@ struct action *ap;
 ** if name!=0, then any word that begin with "Parse" is changed to
 ** begin with *name instead.
 */
-PRIVATE void tplt_xfer(name,in,out,lineno)
-char *name;
-FILE *in;
-FILE *out;
-int *lineno;
+PRIVATE void tplt_xfer(char *name, FILE *in, FILE *out, int *lineno)
 {
   int i, iStart;
   char line[LINESIZE];
@@ -3040,14 +3107,31 @@ int *lineno;
 
 /* The next function finds the template file and opens it, returning
 ** a pointer to the opened file. */
-PRIVATE FILE *tplt_open(lemp)
-struct lemon *lemp;
+PRIVATE FILE *tplt_open(struct lemon *lemp)
 {
+  static char templatename[] = "lempar.c";
   char buf[1000];
   FILE *in;
   char *tpltname;
   char *cp;
 
+  /* first, see if user specified a template filename on the command line. */
+  if (user_templatename != 0) {
+    if( access(user_templatename,004)==-1 ){
+      fprintf(stderr,"Can't find the parser driver template file \"%s\".\n",
+        user_templatename);
+      lemp->errorcnt++;
+      return 0;
+    }
+    in = fopen(user_templatename,"rb");
+    if( in==0 ){
+      fprintf(stderr,"Can't open the template file \"%s\".\n",user_templatename);
+      lemp->errorcnt++;
+      return 0;
+    }
+    return in;
+  }
+
   cp = strrchr(lemp->filename,'.');
   if( cp ){
     sprintf(buf,"%.*s.lt",(int)(cp-lemp->filename),lemp->filename);
@@ -3056,20 +3140,20 @@ struct lemon *lemp;
   }
   if( access(buf,004)==0 ){
     tpltname = buf;
-  }else if( access(lemp->tmplname,004)==0 ){
-    tpltname = lemp->tmplname;
+  }else if( access(templatename,004)==0 ){
+    tpltname = templatename;
   }else{
-    tpltname = pathsearch(lemp->argv0,lemp->tmplname,0);
+    tpltname = pathsearch(lemp->argv0,templatename,0);
   }
   if( tpltname==0 ){
     fprintf(stderr,"Can't find the parser driver template file \"%s\".\n",
-    lemp->tmplname);
+    templatename);
     lemp->errorcnt++;
     return 0;
   }
   in = fopen(tpltname,"rb");
   if( in==0 ){
-    fprintf(stderr,"Can't open the template file \"%s\".\n",lemp->tmplname);
+    fprintf(stderr,"Can't open the template file \"%s\".\n",templatename);
     lemp->errorcnt++;
     return 0;
   }
@@ -3077,10 +3161,7 @@ struct lemon *lemp;
 }
 
 /* Print a #line directive line to the output file. */
-PRIVATE void tplt_linedir(out,lineno,filename)
-FILE *out;
-int lineno;
-char *filename;
+PRIVATE void tplt_linedir(FILE *out, int lineno, char *filename)
 {
   fprintf(out,"#line %d \"",lineno);
   while( *filename ){
@@ -3092,27 +3173,21 @@ char *filename;
 }
 
 /* Print a string to the file and keep the linenumber up to date */
-PRIVATE void tplt_print(out,lemp,str,strln,lineno)
-FILE *out;
-struct lemon *lemp;
-char *str;
-int strln;
-int *lineno;
+PRIVATE void tplt_print(FILE *out, struct lemon *lemp, char *str, int *lineno)
 {
   if( str==0 ) return;
-  tplt_linedir(out,strln,lemp->filename);
-  (*lineno)++;
   while( *str ){
-    if( *str=='\n' ) (*lineno)++;
     putc(*str,out);
+    if( *str=='\n' ) (*lineno)++;
     str++;
   }
   if( str[-1]!='\n' ){
     putc('\n',out);
     (*lineno)++;
   }
-  tplt_linedir(out,*lineno+2,lemp->outname); 
-  (*lineno)+=2;
+  if (!lemp->nolinenosflag) {
+    (*lineno)++; tplt_linedir(out,*lineno,lemp->outname); 
+  }
   return;
 }
 
@@ -3120,29 +3195,26 @@ int *lineno;
 ** The following routine emits code for the destructor for the
 ** symbol sp
 */
-void emit_destructor_code(out,sp,lemp,lineno)
-FILE *out;
-struct symbol *sp;
-struct lemon *lemp;
-int *lineno;
-{
+void emit_destructor_code(
+  FILE *out,
+  struct symbol *sp,
+  struct lemon *lemp,
+  int *lineno
+){
  char *cp = 0;
 
- int linecnt = 0;
  if( sp->type==TERMINAL ){
    cp = lemp->tokendest;
    if( cp==0 ) return;
-   tplt_linedir(out,lemp->tokendestln,lemp->filename);
-   fprintf(out,"{");
+   fprintf(out,"{\n"); (*lineno)++;
  }else if( sp->destructor ){
    cp = sp->destructor;
-   tplt_linedir(out,sp->destructorln,lemp->filename);
-   fprintf(out,"{");
+   fprintf(out,"{\n"); (*lineno)++;
+   if (!lemp->nolinenosflag) { (*lineno)++; tplt_linedir(out,sp->destLineno,lemp->filename); }
  }else if( lemp->vardest ){
    cp = lemp->vardest;
    if( cp==0 ) return;
-   tplt_linedir(out,lemp->vardestln,lemp->filename);
-   fprintf(out,"{");
+   fprintf(out,"{\n"); (*lineno)++;
  }else{
    assert( 0 );  /* Cannot happen */
  }
@@ -3152,21 +3224,21 @@ int *lineno;
      cp++;
      continue;
    }
-   if( *cp=='\n' ) linecnt++;
+   if( *cp=='\n' ) (*lineno)++;
    fputc(*cp,out);
  }
- (*lineno) += 3 + linecnt;
- fprintf(out,"}\n");
- tplt_linedir(out,*lineno,lemp->outname);
+ fprintf(out,"\n"); (*lineno)++;
+ if (!lemp->nolinenosflag) { 
+   (*lineno)++; tplt_linedir(out,*lineno,lemp->outname); 
+ }
+ fprintf(out,"}\n"); (*lineno)++;
  return;
 }
 
 /*
 ** Return TRUE (non-zero) if the given symbol has a destructor.
 */
-int has_destructor(sp, lemp)
-struct symbol *sp;
-struct lemon *lemp;
+int has_destructor(struct symbol *sp, struct lemon *lemp)
 {
   int ret;
   if( sp->type==TERMINAL ){
@@ -3189,13 +3261,13 @@ struct lemon *lemp;
 **
 ** If n==-1, then the previous character is overwritten.
 */
-PRIVATE char *append_str(char *zText, int n, int p1, int p2){
+PRIVATE char *append_str(const char *zText, int n, int p1, int p2){
+  static char empty[1] = { 0 };
   static char *z = 0;
   static int alloced = 0;
   static int used = 0;
   int c;
   char zInt[40];
-
   if( zText==0 ){
     used = 0;
     return z;
@@ -3205,20 +3277,20 @@ PRIVATE char *append_str(char *zText, int n, int p1, int p2){
       used += n;
       assert( used>=0 );
     }
-    n = strlen(zText);
+    n = lemonStrlen(zText);
   }
   if( n+sizeof(zInt)*2+used >= alloced ){
     alloced = n + sizeof(zInt)*2 + used + 200;
-    z = realloc(z,  alloced);
+    z = (char *) realloc(z,  alloced);
   }
-  if( z==0 ) return "";
+  if( z==0 ) return empty;
   while( n-- > 0 ){
     c = *(zText++);
     if( c=='%' && n>0 && zText[0]=='d' ){
       sprintf(zInt, "%d", p1);
       p1 = p2;
       strcpy(&z[used], zInt);
-      used += strlen(&z[used]);
+      used += lemonStrlen(&z[used]);
       zText++;
       n--;
     }else{
@@ -3244,12 +3316,15 @@ PRIVATE void translate_code(struct lemon *lemp, struct rule *rp){
   lhsused = 0;
 
   if( rp->code==0 ){
-    rp->code = "\n";
+    static char newlinestr[2] = { '\n', '\0' };
+    rp->code = newlinestr;
     rp->line = rp->ruleline;
   }
 
   append_str(0,0,0,0);
-  for(cp=rp->code; *cp; cp++){
+
+  /* This const cast is wrong but harmless, if we're careful. */
+  for(cp=(char *)rp->code; *cp; cp++){
     if( isalpha(*cp) && (cp==rp->code || (!isalnum(cp[-1]) && cp[-1]!='_')) ){
       char saved;
       for(xp= &cp[1]; isalnum(*xp) || *xp=='_'; xp++);
@@ -3305,7 +3380,7 @@ PRIVATE void translate_code(struct lemon *lemp, struct rule *rp){
       lemp->errorcnt++;
     }else if( rp->rhsalias[i]==0 ){
       if( has_destructor(rp->rhs[i],lemp) ){
-        append_str("  yy_destructor(%d,&yymsp[%d].minor);\n", 0,
+        append_str("  yy_destructor(yypParser,%d,&yymsp[%d].minor);\n", 0,
            rp->rhs[i]->index,i-rp->nrhs+1);
       }else{
         /* No destructor defined for this term */
@@ -3322,25 +3397,23 @@ PRIVATE void translate_code(struct lemon *lemp, struct rule *rp){
 ** Generate code which executes when the rule "rp" is reduced.  Write
 ** the code to "out".  Make sure lineno stays up-to-date.
 */
-PRIVATE void emit_code(out,rp,lemp,lineno)
-FILE *out;
-struct rule *rp;
-struct lemon *lemp;
-int *lineno;
-{
- char *cp;
- int linecnt = 0;
+PRIVATE void emit_code(
+  FILE *out,
+  struct rule *rp,
+  struct lemon *lemp,
+  int *lineno
+){
+ const char *cp;
 
  /* Generate code to do the reduce action */
  if( rp->code ){
-   tplt_linedir(out,rp->line,lemp->filename);
+   if (!lemp->nolinenosflag) { (*lineno)++; tplt_linedir(out,rp->line,lemp->filename); }
    fprintf(out,"{%s",rp->code);
    for(cp=rp->code; *cp; cp++){
-     if( *cp=='\n' ) linecnt++;
+     if( *cp=='\n' ) (*lineno)++;
    } /* End loop */
-   (*lineno) += 3 + linecnt;
-   fprintf(out,"}\n");
-   tplt_linedir(out,*lineno,lemp->outname);
+   fprintf(out,"}\n"); (*lineno)++;
+   if (!lemp->nolinenosflag) { (*lineno)++; tplt_linedir(out,*lineno,lemp->outname); }
  } /* End if( rp->code ) */
 
  return;
@@ -3353,12 +3426,12 @@ int *lineno;
 ** union, also set the ".dtnum" field of every terminal and nonterminal
 ** symbol.
 */
-void print_stack_union(out,lemp,plineno,mhflag)
-FILE *out;                  /* The output stream */
-struct lemon *lemp;         /* The main info structure for this parser */
-int *plineno;               /* Pointer to the line number */
-int mhflag;                 /* True if generating makeheaders output */
-{
+void print_stack_union(
+  FILE *out,                  /* The output stream */
+  struct lemon *lemp,         /* The main info structure for this parser */
+  int *plineno,               /* Pointer to the line number */
+  int mhflag                  /* True if generating makeheaders output */
+){
   int lineno = *plineno;    /* The line number of the output */
   char **types;             /* A hash table of datatypes */
   int arraysize;            /* Size of the "types" array */
@@ -3366,7 +3439,7 @@ int mhflag;                 /* True if generating makeheaders output */
   char *stddt;              /* Standardized name for a datatype */
   int i,j;                  /* Loop counters */
   int hash;                 /* For hashing the name of a type */
-  char *name;               /* Name of the parser */
+  const char *name;         /* Name of the parser */
 
   /* Allocate and initialize types[] and allocate stddt[] */
   arraysize = lemp->nsymbol * 2;
@@ -3374,13 +3447,13 @@ int mhflag;                 /* True if generating makeheaders output */
   for(i=0; i<arraysize; i++) types[i] = 0;
   maxdtlength = 0;
   if( lemp->vartype ){
-    maxdtlength = strlen(lemp->vartype);
+    maxdtlength = lemonStrlen(lemp->vartype);
   }
   for(i=0; i<lemp->nsymbol; i++){
     int len;
     struct symbol *sp = lemp->symbols[i];
     if( sp->datatype==0 ) continue;
-    len = strlen(sp->datatype);
+    len = lemonStrlen(sp->datatype);
     if( len>maxdtlength ) maxdtlength = len;
   }
   stddt = (char*)malloc( maxdtlength*2 + 1 );
@@ -3413,6 +3486,10 @@ int mhflag;                 /* True if generating makeheaders output */
     while( *cp ) stddt[j++] = *cp++;
     while( j>0 && isspace(stddt[j-1]) ) j--;
     stddt[j] = 0;
+    if( lemp->tokentype && strcmp(stddt, lemp->tokentype)==0 ){
+      sp->dtnum = 0;
+      continue;
+    }
     hash = 0;
     for(j=0; stddt[j]; j++){
       hash = hash*53 + stddt[j];
@@ -3428,7 +3505,7 @@ int mhflag;                 /* True if generating makeheaders output */
     }
     if( types[hash]==0 ){
       sp->dtnum = hash + 1;
-      types[hash] = (char*)malloc( strlen(stddt)+1 );
+      types[hash] = (char*)malloc( lemonStrlen(stddt)+1 );
       if( types[hash]==0 ){
         fprintf(stderr,"Out of memory.\n");
         exit(1);
@@ -3445,6 +3522,7 @@ int mhflag;                 /* True if generating makeheaders output */
     lemp->tokentype?lemp->tokentype:"void*");  lineno++;
   if( mhflag ){ fprintf(out,"#endif\n"); lineno++; }
   fprintf(out,"typedef union {\n"); lineno++;
+  fprintf(out,"  int yyinit;\n"); lineno++;
   fprintf(out,"  %sTOKENTYPE yy0;\n",name); lineno++;
   for(i=0; i<arraysize; i++){
     if( types[i]==0 ) continue;
@@ -3492,6 +3570,7 @@ struct axset {
   struct state *stp;   /* A pointer to a state */
   int isTkn;           /* True to use tokens.  False for non-terminals */
   int nAction;         /* Number of actions */
+  int iOrder;          /* Original order of action sets */
 };
 
 /*
@@ -3500,7 +3579,13 @@ struct axset {
 static int axset_compare(const void *a, const void *b){
   struct axset *p1 = (struct axset*)a;
   struct axset *p2 = (struct axset*)b;
-  return p2->nAction - p1->nAction;
+  int c;
+  c = p2->nAction - p1->nAction;
+  if( c==0 ){
+    c = p2->iOrder - p1->iOrder;
+  }
+  assert( c!=0 || p1==p2 );
+  return c;
 }
 
 /*
@@ -3523,10 +3608,10 @@ static void writeRuleText(FILE *out, struct rule *rp){
 
 
 /* Generate C source code for the parser */
-void ReportTable(lemp, mhflag)
-struct lemon *lemp;
-int mhflag;     /* Output in makeheaders format if true */
-{
+void ReportTable(
+  struct lemon *lemp,
+  int mhflag     /* Output in makeheaders format if true */
+){
   FILE *out, *in;
   char line[LINESIZE];
   int  lineno;
@@ -3535,7 +3620,7 @@ int mhflag;     /* Output in makeheaders format if true */
   struct rule *rp;
   struct acttab *pActtab;
   int i, j, n;
-  char *name;
+  const char *name;
   int mnTknOfst, mxTknOfst;
   int mnNtOfst, mxNtOfst;
   struct axset *ax;
@@ -3551,7 +3636,7 @@ int mhflag;     /* Output in makeheaders format if true */
   tplt_xfer(lemp->name,in,out,&lineno);
 
   /* Generate the include code, if any */
-  tplt_print(out,lemp,lemp->include,lemp->includeln,&lineno);
+  tplt_print(out,lemp,lemp->include,&lineno);
   if( mhflag ){
     char *name = file_makename(lemp, ".h");
     fprintf(out,"#include \"%s\"\n", name); lineno++;
@@ -3561,7 +3646,7 @@ int mhflag;     /* Output in makeheaders format if true */
 
   /* Generate #defines for all tokens */
   if( mhflag ){
-    char *prefix;
+    const char *prefix;
     fprintf(out,"#if INTERFACE\n"); lineno++;
     if( lemp->tokenprefix ) prefix = lemp->tokenprefix;
     else                    prefix = "";
@@ -3575,7 +3660,7 @@ int mhflag;     /* Output in makeheaders format if true */
 
   /* Generate the defines */
   fprintf(out,"#define YYCODETYPE %s\n",
-    minimum_size_type(0, lemp->nsymbol+5)); lineno++;
+    minimum_size_type(0, lemp->nsymbol+1)); lineno++;
   fprintf(out,"#define YYNOCODE %d\n",lemp->nsymbol+1);  lineno++;
   fprintf(out,"#define YYACTIONTYPE %s\n",
     minimum_size_type(0, lemp->nstate+lemp->nrule+5));  lineno++;
@@ -3597,7 +3682,7 @@ int mhflag;     /* Output in makeheaders format if true */
   name = lemp->name ? lemp->name : "Parse";
   if( lemp->arg && lemp->arg[0] ){
     int i;
-    i = strlen(lemp->arg);
+    i = lemonStrlen(lemp->arg);
     while( i>=1 && isspace(lemp->arg[i-1]) ) i--;
     while( i>=1 && (isalnum(lemp->arg[i-1]) || lemp->arg[i-1]=='_') ) i--;
     fprintf(out,"#define %sARG_SDECL %s;\n",name,lemp->arg);  lineno++;
@@ -3639,7 +3724,7 @@ int mhflag;     /* Output in makeheaders format if true */
   */
 
   /* Compute the actions on all states and count them up */
-  ax = calloc(lemp->nstate*2, sizeof(ax[0]));
+  ax = (struct axset *) calloc(lemp->nstate*2, sizeof(ax[0]));
   if( ax==0 ){
     fprintf(stderr,"malloc failed\n");
     exit(1);
@@ -3660,6 +3745,7 @@ int mhflag;     /* Output in makeheaders format if true */
   ** action table to a minimum, the heuristic of placing the largest action
   ** sets first is used.
   */
+  for(i=0; i<lemp->nstate*2; i++) ax[i].iOrder = i;
   qsort(ax, lemp->nstate*2, sizeof(ax[0]), axset_compare);
   pActtab = acttab_alloc();
   for(i=0; i<lemp->nstate*2 && ax[i].nAction>0; i++){
@@ -3692,8 +3778,9 @@ int mhflag;     /* Output in makeheaders format if true */
   free(ax);
 
   /* Output the yy_action table */
-  fprintf(out,"static const YYACTIONTYPE yy_action[] = {\n"); lineno++;
   n = acttab_size(pActtab);
+  fprintf(out,"#define YY_ACTTAB_COUNT (%d)\n", n); lineno++;
+  fprintf(out,"static const YYACTIONTYPE yy_action[] = {\n"); lineno++;
   for(i=j=0; i<n; i++){
     int action = acttab_yyaction(pActtab, i);
     if( action<0 ) action = lemp->nstate + lemp->nrule + 2;
@@ -3728,7 +3815,9 @@ int mhflag;     /* Output in makeheaders format if true */
   fprintf(out, "#define YY_SHIFT_USE_DFLT (%d)\n", mnTknOfst-1); lineno++;
   n = lemp->nstate;
   while( n>0 && lemp->sorted[n-1]->iTknOfst==NO_OFFSET ) n--;
-  fprintf(out, "#define YY_SHIFT_MAX %d\n", n-1); lineno++;
+  fprintf(out, "#define YY_SHIFT_COUNT (%d)\n", n-1); lineno++;
+  fprintf(out, "#define YY_SHIFT_MIN   (%d)\n", mnTknOfst); lineno++;
+  fprintf(out, "#define YY_SHIFT_MAX   (%d)\n", mxTknOfst); lineno++;
   fprintf(out, "static const %s yy_shift_ofst[] = {\n", 
           minimum_size_type(mnTknOfst-1, mxTknOfst)); lineno++;
   for(i=j=0; i<n; i++){
@@ -3751,7 +3840,9 @@ int mhflag;     /* Output in makeheaders format if true */
   fprintf(out, "#define YY_REDUCE_USE_DFLT (%d)\n", mnNtOfst-1); lineno++;
   n = lemp->nstate;
   while( n>0 && lemp->sorted[n-1]->iNtOfst==NO_OFFSET ) n--;
-  fprintf(out, "#define YY_REDUCE_MAX %d\n", n-1); lineno++;
+  fprintf(out, "#define YY_REDUCE_COUNT (%d)\n", n-1); lineno++;
+  fprintf(out, "#define YY_REDUCE_MIN   (%d)\n", mnNtOfst); lineno++;
+  fprintf(out, "#define YY_REDUCE_MAX   (%d)\n", mxNtOfst); lineno++;
   fprintf(out, "static const %s yy_reduce_ofst[] = {\n", 
           minimum_size_type(mnNtOfst-1, mxNtOfst)); lineno++;
   for(i=j=0; i<n; i++){
@@ -3790,7 +3881,9 @@ int mhflag;     /* Output in makeheaders format if true */
   /* Generate the table of fallback tokens.
   */
   if( lemp->has_fallback ){
-    for(i=0; i<lemp->nterminal; i++){
+    int mx = lemp->nterminal - 1;
+    while( mx>0 && lemp->symbols[mx]->fallback==0 ){ mx--; }
+    for(i=0; i<=mx; i++){
       struct symbol *p = lemp->symbols[i];
       if( p->fallback==0 ){
         fprintf(out, "    0,  /* %10s => nothing */\n", p->name);
@@ -3814,7 +3907,7 @@ int mhflag;     /* Output in makeheaders format if true */
   tplt_xfer(lemp->name,in,out,&lineno);
 
   /* Generate a table containing a text string that describes every
-  ** rule in the rule set of the grammer.  This information is used
+  ** rule in the rule set of the grammar.  This information is used
   ** when tracing REDUCE actions.
   */
   for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){
@@ -3830,11 +3923,15 @@ int mhflag;     /* Output in makeheaders format if true */
   ** (In other words, generate the %destructor actions)
   */
   if( lemp->tokendest ){
+    int once = 1;
     for(i=0; i<lemp->nsymbol; i++){
       struct symbol *sp = lemp->symbols[i];
       if( sp==0 || sp->type!=TERMINAL ) continue;
-      fprintf(out,"    case %d: /* %s */\n",
-              sp->index, sp->name); lineno++;
+      if( once ){
+        fprintf(out, "      /* TERMINAL Destructor */\n"); lineno++;
+        once = 0;
+      }
+      fprintf(out,"    case %d: /* %s */\n", sp->index, sp->name); lineno++;
     }
     for(i=0; i<lemp->nsymbol && lemp->symbols[i]->type!=TERMINAL; i++);
     if( i<lemp->nsymbol ){
@@ -3844,24 +3941,27 @@ int mhflag;     /* Output in makeheaders format if true */
   }
   if( lemp->vardest ){
     struct symbol *dflt_sp = 0;
+    int once = 1;
     for(i=0; i<lemp->nsymbol; i++){
       struct symbol *sp = lemp->symbols[i];
       if( sp==0 || sp->type==TERMINAL ||
           sp->index<=0 || sp->destructor!=0 ) continue;
-      fprintf(out,"    case %d: /* %s */\n",
-              sp->index, sp->name); lineno++;
+      if( once ){
+        fprintf(out, "      /* Default NON-TERMINAL Destructor */\n"); lineno++;
+        once = 0;
+      }
+      fprintf(out,"    case %d: /* %s */\n", sp->index, sp->name); lineno++;
       dflt_sp = sp;
     }
     if( dflt_sp!=0 ){
       emit_destructor_code(out,dflt_sp,lemp,&lineno);
-      fprintf(out,"      break;\n"); lineno++;
     }
+    fprintf(out,"      break;\n"); lineno++;
   }
   for(i=0; i<lemp->nsymbol; i++){
     struct symbol *sp = lemp->symbols[i];
     if( sp==0 || sp->type==TERMINAL || sp->destructor==0 ) continue;
-    fprintf(out,"    case %d: /* %s */\n",
-            sp->index, sp->name); lineno++;
+    fprintf(out,"    case %d: /* %s */\n", sp->index, sp->name); lineno++;
 
     /* Combine duplicate destructors into a single case */
     for(j=i+1; j<lemp->nsymbol; j++){
@@ -3881,7 +3981,7 @@ int mhflag;     /* Output in makeheaders format if true */
   tplt_xfer(lemp->name,in,out,&lineno);
 
   /* Generate code which executes whenever the parser stack overflows */
-  tplt_print(out,lemp,lemp->overflow,lemp->overflowln,&lineno);
+  tplt_print(out,lemp,lemp->overflow,&lineno);
   tplt_xfer(lemp->name,in,out,&lineno);
 
   /* Generate the table of rule information 
@@ -3898,9 +3998,11 @@ int mhflag;     /* Output in makeheaders format if true */
   for(rp=lemp->rule; rp; rp=rp->next){
     translate_code(lemp, rp);
   }
+  /* First output rules other than the default: rule */
   for(rp=lemp->rule; rp; rp=rp->next){
-    struct rule *rp2;
+    struct rule *rp2;               /* Other rules with the same action */
     if( rp->code==0 ) continue;
+    if( rp->code[0]=='\n' && rp->code[1]==0 ) continue; /* Will be default: */
     fprintf(out,"      case %d: /* ", rp->index);
     writeRuleText(out, rp);
     fprintf(out, " */\n"); lineno++;
@@ -3908,29 +4010,41 @@ int mhflag;     /* Output in makeheaders format if true */
       if( rp2->code==rp->code ){
         fprintf(out,"      case %d: /* ", rp2->index);
         writeRuleText(out, rp2);
-        fprintf(out," */\n"); lineno++;
+        fprintf(out," */ yytestcase(yyruleno==%d);\n", rp2->index); lineno++;
         rp2->code = 0;
       }
     }
     emit_code(out,rp,lemp,&lineno);
     fprintf(out,"        break;\n"); lineno++;
+    rp->code = 0;
+  }
+  /* Finally, output the default: rule.  We choose as the default: all
+  ** empty actions. */
+  fprintf(out,"      default:\n"); lineno++;
+  for(rp=lemp->rule; rp; rp=rp->next){
+    if( rp->code==0 ) continue;
+    assert( rp->code[0]=='\n' && rp->code[1]==0 );
+    fprintf(out,"      /* (%d) ", rp->index);
+    writeRuleText(out, rp);
+    fprintf(out, " */ yytestcase(yyruleno==%d);\n", rp->index); lineno++;
   }
+  fprintf(out,"        break;\n"); lineno++;
   tplt_xfer(lemp->name,in,out,&lineno);
 
   /* Generate code which executes if a parse fails */
-  tplt_print(out,lemp,lemp->failure,lemp->failureln,&lineno);
+  tplt_print(out,lemp,lemp->failure,&lineno);
   tplt_xfer(lemp->name,in,out,&lineno);
 
   /* Generate code which executes when a syntax error occurs */
-  tplt_print(out,lemp,lemp->error,lemp->errorln,&lineno);
+  tplt_print(out,lemp,lemp->error,&lineno);
   tplt_xfer(lemp->name,in,out,&lineno);
 
   /* Generate code which executes when the parser accepts its input */
-  tplt_print(out,lemp,lemp->accept,lemp->acceptln,&lineno);
+  tplt_print(out,lemp,lemp->accept,&lineno);
   tplt_xfer(lemp->name,in,out,&lineno);
 
   /* Append any addition code the user desires */
-  tplt_print(out,lemp,lemp->extracode,lemp->extracodeln,&lineno);
+  tplt_print(out,lemp,lemp->extracode,&lineno);
 
   fclose(in);
   fclose(out);
@@ -3938,11 +4052,10 @@ int mhflag;     /* Output in makeheaders format if true */
 }
 
 /* Generate a header file for the parser */
-void ReportHeader(lemp)
-struct lemon *lemp;
+void ReportHeader(struct lemon *lemp)
 {
   FILE *out, *in;
-  char *prefix;
+  const char *prefix;
   char line[LINESIZE];
   char pattern[LINESIZE];
   int i;
@@ -3978,8 +4091,7 @@ struct lemon *lemp;
 ** it the default.  Except, there is no default if the wildcard token
 ** is a possible look-ahead.
 */
-void CompressTables(lemp)
-struct lemon *lemp;
+void CompressTables(struct lemon *lemp)
 {
   struct state *stp;
   struct action *ap, *ap2;
@@ -4050,7 +4162,11 @@ static int stateResortCompare(const void *a, const void *b){
   n = pB->nNtAct - pA->nNtAct;
   if( n==0 ){
     n = pB->nTknAct - pA->nTknAct;
+    if( n==0 ){
+      n = pB->statenum - pA->statenum;
+    }
   }
+  assert( n!=0 );
   return n;
 }
 
@@ -4059,8 +4175,7 @@ static int stateResortCompare(const void *a, const void *b){
 ** Renumber and resort states so that states with fewer choices
 ** occur at the end.  Except, keep state 0 as the first state.
 */
-void ResortStates(lemp)
-struct lemon *lemp;
+void ResortStates(struct lemon *lemp)
 {
   int i;
   struct state *stp;
@@ -4100,8 +4215,7 @@ struct lemon *lemp;
 static int size = 0;
 
 /* Set the set size */
-void SetSize(n)
-int n;
+void SetSize(int n)
 {
   size = n+1;
 }
@@ -4118,17 +4232,14 @@ char *SetNew(){
 }
 
 /* Deallocate a set */
-void SetFree(s)
-char *s;
+void SetFree(char *s)
 {
   free(s);
 }
 
 /* Add a new element to the set.  Return TRUE if the element was added
 ** and FALSE if it was already there. */
-int SetAdd(s,e)
-char *s;
-int e;
+int SetAdd(char *s, int e)
 {
   int rv;
   assert( e>=0 && e<size );
@@ -4138,9 +4249,7 @@ int e;
 }
 
 /* Add every element of s2 to s1.  Return TRUE if s1 changes. */
-int SetUnion(s1,s2)
-char *s1;
-char *s2;
+int SetUnion(char *s1, char *s2)
 {
   int i, progress;
   progress = 0;
@@ -4166,8 +4275,7 @@ char *s2;
 ** Code for processing tables in the LEMON parser generator.
 */
 
-PRIVATE int strhash(x)
-char *x;
+PRIVATE int strhash(const char *x)
 {
   int h = 0;
   while( *x) h = h*13 + *(x++);
@@ -4178,15 +4286,16 @@ char *x;
 ** keep strings in a table so that the same string is not in more
 ** than one place.
 */
-char *Strsafe(y)
-char *y;
+const char *Strsafe(const char *y)
 {
-  char *z;
+  const char *z;
+  char *cpy;
 
   if( y==0 ) return 0;
   z = Strsafe_find(y);
-  if( z==0 && (z=malloc( strlen(y)+1 ))!=0 ){
-    strcpy(z,y);
+  if( z==0 && (cpy=(char *)malloc( lemonStrlen(y)+1 ))!=0 ){
+    strcpy(cpy,y);
+    z = cpy;
     Strsafe_insert(z);
   }
   MemoryCheck(z);
@@ -4209,7 +4318,7 @@ struct s_x1 {
 ** in an associative array of type "x1".
 */
 typedef struct s_x1node {
-  char *data;                  /* The data */
+  const char *data;        /* The data */
   struct s_x1node *next;   /* Next entry with the same hash */
   struct s_x1node **from;  /* Previous link */
 } x1node;
@@ -4238,8 +4347,7 @@ void Strsafe_init(){
 }
 /* Insert a new record into the array.  Return TRUE if successful.
 ** Prior data with the same key is NOT overwritten */
-int Strsafe_insert(data)
-char *data;
+int Strsafe_insert(const char *data)
 {
   x1node *np;
   int h;
@@ -4295,8 +4403,7 @@ char *data;
 
 /* Return a pointer to data assigned to the given key.  Return NULL
 ** if no such key. */
-char *Strsafe_find(key)
-char *key;
+const char *Strsafe_find(const char *key)
 {
   int h;
   x1node *np;
@@ -4314,8 +4421,7 @@ char *key;
 /* Return a pointer to the (terminal or nonterminal) symbol "x".
 ** Create a new symbol if this is the first time "x" has been seen.
 */
-struct symbol *Symbol_new(x)
-char *x;
+struct symbol *Symbol_new(const char *x)
 {
   struct symbol *sp;
 
@@ -4332,6 +4438,7 @@ char *x;
     sp->firstset = 0;
     sp->lambda = LEMON_FALSE;
     sp->destructor = 0;
+    sp->destLineno = 0;
     sp->datatype = 0;
     sp->useCnt = 0;
     Symbol_insert(sp,sp->name);
@@ -4350,9 +4457,13 @@ char *x;
 ** order (the order they appeared in the grammar file) gives the
 ** smallest parser tables in SQLite.
 */
-int Symbolcmpp(struct symbol **a, struct symbol **b){
+int Symbolcmpp(const void *_a, const void *_b)
+{
+  const struct symbol **a = (const struct symbol **) _a;
+  const struct symbol **b = (const struct symbol **) _b;
   int i1 = (**a).index + 10000000*((**a).name[0]>'Z');
   int i2 = (**b).index + 10000000*((**b).name[0]>'Z');
+  assert( i1!=i2 || strcmp((**a).name,(**b).name)==0 );
   return i1-i2;
 }
 
@@ -4372,8 +4483,8 @@ struct s_x2 {
 ** in an associative array of type "x2".
 */
 typedef struct s_x2node {
-  struct symbol *data;                  /* The data */
-  char *key;                   /* The key */
+  struct symbol *data;     /* The data */
+  const char *key;         /* The key */
   struct s_x2node *next;   /* Next entry with the same hash */
   struct s_x2node **from;  /* Previous link */
 } x2node;
@@ -4402,9 +4513,7 @@ void Symbol_init(){
 }
 /* Insert a new record into the array.  Return TRUE if successful.
 ** Prior data with the same key is NOT overwritten */
-int Symbol_insert(data,key)
-struct symbol *data;
-char *key;
+int Symbol_insert(struct symbol *data, const char *key)
 {
   x2node *np;
   int h;
@@ -4462,8 +4571,7 @@ char *key;
 
 /* Return a pointer to data assigned to the given key.  Return NULL
 ** if no such key. */
-struct symbol *Symbol_find(key)
-char *key;
+struct symbol *Symbol_find(const char *key)
 {
   int h;
   x2node *np;
@@ -4479,8 +4587,7 @@ char *key;
 }
 
 /* Return the n-th data.  Return NULL if n is out of range. */
-struct symbol *Symbol_Nth(n)
-int n;
+struct symbol *Symbol_Nth(int n)
 {
   struct symbol *data;
   if( x2a && n>0 && n<=x2a->count ){
@@ -4514,10 +4621,10 @@ struct symbol **Symbol_arrayof()
 }
 
 /* Compare two configurations */
-int Configcmp(a,b)
-struct config *a;
-struct config *b;
+int Configcmp(const char *_a,const char *_b)
 {
+  const struct config *a = (struct config *) _a;
+  const struct config *b = (struct config *) _b;
   int x;
   x = a->rp->index - b->rp->index;
   if( x==0 ) x = a->dot - b->dot;
@@ -4525,9 +4632,7 @@ struct config *b;
 }
 
 /* Compare two states */
-PRIVATE int statecmp(a,b)
-struct config *a;
-struct config *b;
+PRIVATE int statecmp(struct config *a, struct config *b)
 {
   int rc;
   for(rc=0; rc==0 && a && b;  a=a->bp, b=b->bp){
@@ -4542,8 +4647,7 @@ struct config *b;
 }
 
 /* Hash a state */
-PRIVATE int statehash(a)
-struct config *a;
+PRIVATE int statehash(struct config *a)
 {
   int h=0;
   while( a ){
@@ -4556,10 +4660,10 @@ struct config *a;
 /* Allocate a new state structure */
 struct state *State_new()
 {
-  struct state *new;
-  new = (struct state *)calloc(1, sizeof(struct state) );
-  MemoryCheck(new);
-  return new;
+  struct state *newstate;
+  newstate = (struct state *)calloc(1, sizeof(struct state) );
+  MemoryCheck(newstate);
+  return newstate;
 }
 
 /* There is one instance of the following structure for each
@@ -4608,9 +4712,7 @@ void State_init(){
 }
 /* Insert a new record into the array.  Return TRUE if successful.
 ** Prior data with the same key is NOT overwritten */
-int State_insert(data,key)
-struct state *data;
-struct config *key;
+int State_insert(struct state *data, struct config *key)
 {
   x3node *np;
   int h;
@@ -4668,8 +4770,7 @@ struct config *key;
 
 /* Return a pointer to data assigned to the given key.  Return NULL
 ** if no such key. */
-struct state *State_find(key)
-struct config *key;
+struct state *State_find(struct config *key)
 {
   int h;
   x3node *np;
@@ -4701,8 +4802,7 @@ struct state **State_arrayof()
 }
 
 /* Hash a configuration */
-PRIVATE int confighash(a)
-struct config *a;
+PRIVATE int confighash(struct config *a)
 {
   int h=0;
   h = h*571 + a->rp->index*37 + a->dot;
@@ -4754,8 +4854,7 @@ void Configtable_init(){
 }
 /* Insert a new record into the array.  Return TRUE if successful.
 ** Prior data with the same key is NOT overwritten */
-int Configtable_insert(data)
-struct config *data;
+int Configtable_insert(struct config *data)
 {
   x4node *np;
   int h;
@@ -4766,7 +4865,7 @@ struct config *data;
   h = ph & (x4a->size-1);
   np = x4a->ht[h];
   while( np ){
-    if( Configcmp(np->data,data)==0 ){
+    if( Configcmp((const char *) np->data,(const char *) data)==0 ){
       /* An existing entry with the same key is found. */
       /* Fail because overwrite is not allows. */
       return 0;
@@ -4811,8 +4910,7 @@ struct config *data;
 
 /* Return a pointer to data assigned to the given key.  Return NULL
 ** if no such key. */
-struct config *Configtable_find(key)
-struct config *key;
+struct config *Configtable_find(struct config *key)
 {
   int h;
   x4node *np;
@@ -4821,7 +4919,7 @@ struct config *key;
   h = confighash(key) & (x4a->size-1);
   np = x4a->ht[h];
   while( np ){
-    if( Configcmp(np->data,key)==0 ) break;
+    if( Configcmp((const char *) np->data,(const char *) key)==0 ) break;
     np = np->next;
   }
   return np ? np->data : 0;
@@ -4829,8 +4927,7 @@ struct config *key;
 
 /* Remove all data from the table.  Pass each data to the function "f"
 ** as it is removed.  ("f" may be null to avoid this step.) */
-void Configtable_clear(f)
-int(*f)(/* struct config * */);
+void Configtable_clear(int(*f)(struct config *))
 {
   int i;
   if( x4a==0 || x4a->count==0 ) return;
diff --git a/libgda/sql-parser/lempar.c b/libgda/sql-parser/lempar.c
index cca91ad..fe56d2d 100644
--- a/libgda/sql-parser/lempar.c
+++ b/libgda/sql-parser/lempar.c
@@ -1,8 +1,8 @@
 /* Driver template for the LEMON parser generator.
 ** The author disclaims copyright to this source code.
 */
-/* First off, code is include which follows the "include" declaration
-** in the input file. */
+/* First off, code is included that follows the "include" declaration
+** in the input grammar file. */
 #include <stdio.h>
 %%
 /* Next is all token values, in a form suitable for use by makeheaders.
@@ -60,7 +60,24 @@
 #define YY_ACCEPT_ACTION  (YYNSTATE+YYNRULE+1)
 #define YY_ERROR_ACTION   (YYNSTATE+YYNRULE)
 
-/* Next are that tables used to determine what action to take based on the
+/* The yyzerominor constant is used to initialize instances of
+** YYMINORTYPE objects to zero. */
+static const YYMINORTYPE yyzerominor = { 0 };
+
+/* Define the yytestcase() macro to be a no-op if is not already defined
+** otherwise.
+**
+** Applications can choose to define yytestcase() in the %include section
+** to a macro that can assist in verifying code coverage.  For production
+** code the yytestcase() macro should be turned off.  But it is useful
+** for testing.
+*/
+#ifndef yytestcase
+# define yytestcase(X)
+#endif
+
+
+/* Next are the tables used to determine what action to take based on the
 ** current state and lookahead token.  These tables are used to implement
 ** functions that take a state number and lookahead value and return an
 ** action integer.  
@@ -108,14 +125,13 @@
 **  yy_default[]       Default action for each state.
 */
 %%
-#define YY_SZ_ACTTAB (int)(sizeof(yy_action)/sizeof(yy_action[0]))
 
 /* The next table maps tokens into fallback tokens.  If a construct
 ** like the following:
 ** 
 **      %fallback ID X Y Z.
 **
-** appears in the grammer, then ID becomes a fallback token for X, Y,
+** appears in the grammar, then ID becomes a fallback token for X, Y,
 ** and Z.  Whenever one of the tokens X, Y, or Z is input to the parser
 ** but it does not parse, the type of the token is changed to ID and
 ** the parse is retried before an error is thrown.
@@ -139,11 +155,11 @@ static const YYCODETYPE yyFallback[] = {
 **      It is sometimes called the "minor" token.
 */
 struct yyStackEntry {
-  int stateno;       /* The state-number */
-  int major;         /* The major token value.  This is the code
-                     ** number for the token at this stack level */
-  YYMINORTYPE minor; /* The user-supplied minor token value.  This
-                     ** is the value of the token  */
+  YYACTIONTYPE stateno;  /* The state-number */
+  YYCODETYPE major;      /* The major token value.  This is the code
+                         ** number for the token at this stack level */
+  YYMINORTYPE minor;     /* The user-supplied minor token value.  This
+                         ** is the value of the token  */
 };
 typedef struct yyStackEntry yyStackEntry;
 
@@ -151,6 +167,9 @@ typedef struct yyStackEntry yyStackEntry;
 ** the following structure */
 struct yyParser {
   int yyidx;                    /* Index of top element in stack */
+#ifdef YYTRACKMAXSTACKDEPTH
+  int yyidxMax;                 /* Maximum value of yyidx */
+#endif
   int yyerrcnt;                 /* Shifts left before out of the error */
   ParseARG_SDECL                /* A place to hold %extra_argument */
 #if YYSTACKDEPTH<=0
@@ -251,7 +270,12 @@ void *ParseAlloc(void *(*mallocProc)(size_t)){
   pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser) );
   if( pParser ){
     pParser->yyidx = -1;
+#ifdef YYTRACKMAXSTACKDEPTH
+    pParser->yyidxMax = 0;
+#endif
 #if YYSTACKDEPTH<=0
+    pParser->yystack = NULL;
+    pParser->yystksz = 0;
     yyGrowStack(pParser);
 #endif
   }
@@ -263,7 +287,12 @@ void *ParseAlloc(void *(*mallocProc)(size_t)){
 ** "yymajor" is the symbol code, and "yypminor" is a pointer to
 ** the value.
 */
-static void yy_destructor(YYCODETYPE yymajor, YYMINORTYPE *yypminor){
+static void yy_destructor(
+  yyParser *yypParser,    /* The parser */
+  YYCODETYPE yymajor,     /* Type code for object to destroy */
+  YYMINORTYPE *yypminor   /* The object to be destroyed */
+){
+  ParseARG_FETCH;
   switch( yymajor ){
     /* Here is inserted the actions which take place when a
     ** terminal or non-terminal is destroyed.  This can happen
@@ -301,7 +330,7 @@ static int yy_pop_parser_stack(yyParser *pParser){
   }
 #endif
   yymajor = yytos->major;
-  yy_destructor( yymajor, &yytos->minor);
+  yy_destructor(pParser, yymajor, &yytos->minor);
   pParser->yyidx--;
   return yymajor;
 }
@@ -332,6 +361,16 @@ void ParseFree(
 }
 
 /*
+** Return the peak depth of the stack for a parser.
+*/
+#ifdef YYTRACKMAXSTACKDEPTH
+int ParseStackPeak(void *p){
+  yyParser *pParser = (yyParser*)p;
+  return pParser->yyidxMax;
+}
+#endif
+
+/*
 ** Find the appropriate action for a parser given the terminal
 ** look-ahead token iLookAhead.
 **
@@ -346,15 +385,16 @@ static int yy_find_shift_action(
   int i;
   int stateno = pParser->yystack[pParser->yyidx].stateno;
  
-  if( stateno>YY_SHIFT_MAX || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){
+  if( stateno>YY_SHIFT_COUNT
+   || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){
     return yy_default[stateno];
   }
   assert( iLookAhead!=YYNOCODE );
   i += iLookAhead;
-  if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){
+  if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
     if( iLookAhead>0 ){
 #ifdef YYFALLBACK
-      int iFallback;            /* Fallback token */
+      YYCODETYPE iFallback;            /* Fallback token */
       if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0])
              && (iFallback = yyFallback[iLookAhead])!=0 ){
 #ifndef NDEBUG
@@ -369,7 +409,15 @@ static int yy_find_shift_action(
 #ifdef YYWILDCARD
       {
         int j = i - iLookAhead + YYWILDCARD;
-        if( j>=0 && j<YY_SZ_ACTTAB && yy_lookahead[j]==YYWILDCARD ){
+        if( 
+#if YY_SHIFT_MIN+YYWILDCARD<0
+          j>=0 &&
+#endif
+#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT
+          j<YY_ACTTAB_COUNT &&
+#endif
+          yy_lookahead[j]==YYWILDCARD
+        ){
 #ifndef NDEBUG
           if( yyTraceFILE ){
             fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n",
@@ -400,13 +448,25 @@ static int yy_find_reduce_action(
   YYCODETYPE iLookAhead     /* The look-ahead token */
 ){
   int i;
-  assert( stateno<=YY_REDUCE_MAX );
+#ifdef YYERRORSYMBOL
+  if( stateno>YY_REDUCE_COUNT ){
+    return yy_default[stateno];
+  }
+#else
+  assert( stateno<=YY_REDUCE_COUNT );
+#endif
   i = yy_reduce_ofst[stateno];
   assert( i!=YY_REDUCE_USE_DFLT );
   assert( iLookAhead!=YYNOCODE );
   i += iLookAhead;
-  assert( i>=0 && i<YY_SZ_ACTTAB );
+#ifdef YYERRORSYMBOL
+  if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
+    return yy_default[stateno];
+  }
+#else
+  assert( i>=0 && i<YY_ACTTAB_COUNT );
   assert( yy_lookahead[i]==iLookAhead );
+#endif
   return yy_action[i];
 }
 
@@ -435,10 +495,15 @@ static void yy_shift(
   yyParser *yypParser,          /* The parser to be shifted */
   int yyNewState,               /* The new state to shift in */
   int yyMajor,                  /* The major token to shift in */
-  YYMINORTYPE *yypMinor         /* Pointer ot the minor token to shift in */
+  YYMINORTYPE *yypMinor         /* Pointer to the minor token to shift in */
 ){
   yyStackEntry *yytos;
   yypParser->yyidx++;
+#ifdef YYTRACKMAXSTACKDEPTH
+  if( yypParser->yyidx>yypParser->yyidxMax ){
+    yypParser->yyidxMax = yypParser->yyidx;
+  }
+#endif
 #if YYSTACKDEPTH>0 
   if( yypParser->yyidx>=YYSTACKDEPTH ){
     yyStackOverflow(yypParser, yypMinor);
@@ -454,8 +519,8 @@ static void yy_shift(
   }
 #endif
   yytos = &yypParser->yystack[yypParser->yyidx];
-  yytos->stateno = yyNewState;
-  yytos->major = yyMajor;
+  yytos->stateno = (YYACTIONTYPE)yyNewState;
+  yytos->major = (YYCODETYPE)yyMajor;
   yytos->minor = *yypMinor;
 #ifndef NDEBUG
   if( yyTraceFILE && yypParser->yyidx>0 ){
@@ -518,7 +583,8 @@ static void yy_reduce(
   ** from wireshark this week.  Clearly they are stressing Lemon in ways
   ** that it has not been previously stressed...  (SQLite ticket #2172)
   */
-  memset(&yygotominor, 0, sizeof(yygotominor));
+  /*memset(&yygotominor, 0, sizeof(yygotominor));*/
+  yygotominor = yyzerominor;
 
 
   switch( yyruleno ){
@@ -535,7 +601,7 @@ static void yy_reduce(
   yygoto = yyRuleInfo[yyruleno].lhs;
   yysize = yyRuleInfo[yyruleno].nrhs;
   yypParser->yyidx -= yysize;
-  yyact = yy_find_reduce_action(yymsp[-yysize].stateno,yygoto);
+  yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto);
   if( yyact < YYNSTATE ){
 #ifdef NDEBUG
     /* If we are not debugging and the reduce action popped at least
@@ -545,8 +611,8 @@ static void yy_reduce(
     if( yysize ){
       yypParser->yyidx++;
       yymsp -= yysize-1;
-      yymsp->stateno = yyact;
-      yymsp->major = yygoto;
+      yymsp->stateno = (YYACTIONTYPE)yyact;
+      yymsp->major = (YYCODETYPE)yygoto;
       yymsp->minor = yygotominor;
     }else
 #endif
@@ -562,6 +628,7 @@ static void yy_reduce(
 /*
 ** The following code executes when the parse fails
 */
+#ifndef YYNOERRORRECOVERY
 static void yy_parse_failed(
   yyParser *yypParser           /* The parser */
 ){
@@ -577,6 +644,7 @@ static void yy_parse_failed(
 %%
   ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
 }
+#endif /* YYNOERRORRECOVERY */
 
 /*
 ** The following code executes when a syntax error first occurs.
@@ -649,7 +717,8 @@ void Parse(
   if( yypParser->yyidx<0 ){
 #if YYSTACKDEPTH<=0
     if( yypParser->yystksz <=0 ){
-      memset(&yyminorunion, 0, sizeof(yyminorunion));
+      /*memset(&yyminorunion, 0, sizeof(yyminorunion));*/
+      yyminorunion = yyzerominor;
       yyStackOverflow(yypParser, &yyminorunion);
       return;
     }
@@ -670,7 +739,7 @@ void Parse(
 #endif
 
   do{
-    yyact = yy_find_shift_action(yypParser,yymajor);
+    yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
     if( yyact<YYNSTATE ){
       assert( !yyendofinput );  /* Impossible to shift the $ token */
       yy_shift(yypParser,yyact,yymajor,&yyminorunion);
@@ -719,7 +788,7 @@ void Parse(
              yyTracePrompt,yyTokenName[yymajor]);
         }
 #endif
-        yy_destructor(yymajor,&yyminorunion);
+        yy_destructor(yypParser, (YYCODETYPE)yymajor,&yyminorunion);
         yymajor = YYNOCODE;
       }else{
          while(
@@ -732,7 +801,7 @@ void Parse(
           yy_pop_parser_stack(yypParser);
         }
         if( yypParser->yyidx < 0 || yymajor==0 ){
-          yy_destructor(yymajor,&yyminorunion);
+          yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
           yy_parse_failed(yypParser);
           yymajor = YYNOCODE;
         }else if( yymx!=YYERRORSYMBOL ){
@@ -743,6 +812,18 @@ void Parse(
       }
       yypParser->yyerrcnt = 3;
       yyerrorhit = 1;
+#elif defined(YYNOERRORRECOVERY)
+      /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to
+      ** do any kind of error recovery.  Instead, simply invoke the syntax
+      ** error routine and continue going as if nothing had happened.
+      **
+      ** Applications can set this macro (for example inside %include) if
+      ** they intend to abandon the parse upon the first syntax error seen.
+      */
+      yy_syntax_error(yypParser,yymajor,yyminorunion);
+      yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
+      yymajor = YYNOCODE;
+      
 #else  /* YYERRORSYMBOL is not defined */
       /* This is what we do if the grammar does not define ERROR:
       **
@@ -757,7 +838,7 @@ void Parse(
         yy_syntax_error(yypParser,yymajor,yyminorunion);
       }
       yypParser->yyerrcnt = 3;
-      yy_destructor(yymajor,&yyminorunion);
+      yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
       if( yyendofinput ){
         yy_parse_failed(yypParser);
       }
diff --git a/libgda/sql-parser/parser.y b/libgda/sql-parser/parser.y
index 45de76d..d675ac3 100644
--- a/libgda/sql-parser/parser.y
+++ b/libgda/sql-parser/parser.y
@@ -206,7 +206,7 @@ create_uni_expr (GdaSqlOperatorType op, GdaSqlExpr *expr) {
 
 static GdaSqlStatement *
 compose_multiple_compounds (GdaSqlStatementCompoundType ctype, GdaSqlStatement *left, GdaSqlStatement *right) {
-	GdaSqlStatement *ret;
+	GdaSqlStatement *ret = NULL;
 	GdaSqlStatementCompound *lc = (GdaSqlStatementCompound*) left->contents;
 	if (lc->compound_type == ctype) {
 		GdaSqlStatementCompound *rc = (GdaSqlStatementCompound*) right->contents;
diff --git a/libgda/sqlite/gda-sqlite-recordset.c b/libgda/sqlite/gda-sqlite-recordset.c
index 6f596fd..9f06d47 100644
--- a/libgda/sqlite/gda-sqlite-recordset.c
+++ b/libgda/sqlite/gda-sqlite-recordset.c
@@ -419,8 +419,8 @@ fetch_next_sqlite_row (GdaSqliteRecordset *model, gboolean do_store, GError **er
 					bin->binary_length = SQLITE3_CALL (sqlite3_column_bytes) (ps->sqlite_stmt, real_col);
 					if (bin->binary_length > 0) {
 						bin->data = g_new (guchar, bin->binary_length);
-						memcpy (bin->data, SQLITE3_CALL (sqlite3_column_blob) (ps->sqlite_stmt,
-											real_col),
+						memcpy (bin->data, SQLITE3_CALL (sqlite3_column_blob) (ps->sqlite_stmt, /* Flawfinder: ignore */
+												       real_col),
 							bin->binary_length);
 					}
 					else
diff --git a/libgda/sqlite/gen_emb_string.c b/libgda/sqlite/gen_emb_string.c
index b4f26f8..12f0af8 100644
--- a/libgda/sqlite/gen_emb_string.c
+++ b/libgda/sqlite/gen_emb_string.c
@@ -101,6 +101,7 @@ main (int argc,char** argv)
 		rewind (file);
 		if (fsize + buffer_index >= maxlen) {
 			fprintf (stderr, "Max buffer size reached\nIncrease MAXSIZE constant and re-run\n");
+			fclose (file);
 			return 1;
 		}
 		
@@ -108,6 +109,7 @@ main (int argc,char** argv)
 		n_read = fread (buffer + buffer_index, 1, fsize, file);
 		if (n_read != fsize) {
 			fprintf (stderr, "Reading error");
+			fclose (file);
 			return 1;
 		}
 
diff --git a/libgda/sqlite/sqlite-src/sqlite3.c b/libgda/sqlite/sqlite-src/sqlite3.c
index 8ba9cf9..ac21c1a 100644
--- a/libgda/sqlite/sqlite-src/sqlite3.c
+++ b/libgda/sqlite/sqlite-src/sqlite3.c
@@ -8992,7 +8992,7 @@ struct CollSeq {
 ** connection handle passed to it via the xConnect() or xCreate() method
 ** during initialization internally. This database connection handle may
 ** then used by the virtual table implementation to access real tables 
-** within the database. So that they appear as part of the callers 
+** within the database. So that they appear as part of the caller's 
 ** transaction, these accesses need to be made via the same database 
 ** connection as that used to execute SQL operations on the virtual table.
 **
@@ -38143,7 +38143,7 @@ static int openSubJournal(Pager *pPager){
 
 /*
 ** Append a record of the current state of page pPg to the sub-journal. 
-** It is the callers responsibility to use subjRequiresPage() to check 
+** It is the caller's responsibility to use subjRequiresPage() to check 
 ** that it is really required before calling this function.
 **
 ** If successful, set the bit corresponding to pPg->pgno in the bitvecs
@@ -54776,7 +54776,7 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
   /* Return true if hasAbort==mayAbort. Or if a malloc failure occured.
   ** If malloc failed, then the while() loop above may not have iterated
   ** through all opcodes and hasAbort may be set incorrectly. Return
-  ** true for this case to prevent the assert() in the callers frame
+  ** true for this case to prevent the assert() in the caller's frame
   ** from failing.  */
   return ( v->db->mallocFailed || hasAbort==mayAbort );
 }
@@ -54842,7 +54842,7 @@ SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){
 
 /*
 ** This function returns a pointer to the array of opcodes associated with
-** the Vdbe passed as the first argument. It is the callers responsibility
+** the Vdbe passed as the first argument. It is the caller's responsibility
 ** to arrange for the returned array to be eventually freed using the 
 ** vdbeFreeOpArray() function.
 **
diff --git a/libgda/sqlite/virtual/gda-vconnection-data-model.c b/libgda/sqlite/virtual/gda-vconnection-data-model.c
index 66f495a..4e90571 100644
--- a/libgda/sqlite/virtual/gda-vconnection-data-model.c
+++ b/libgda/sqlite/virtual/gda-vconnection-data-model.c
@@ -132,7 +132,7 @@ static void
 gda_vconnection_data_model_set_property (GObject *object,
 					 guint param_id,
 					 G_GNUC_UNUSED const GValue *value,
-					 G_GNUC_UNUSED GParamSpec *pspec)
+					 GParamSpec *pspec)
 {
         GdaVconnectionDataModel *cnc;
 
@@ -140,6 +140,7 @@ gda_vconnection_data_model_set_property (GObject *object,
         if (cnc->priv) {
                 switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
                 }
         }
@@ -149,7 +150,7 @@ static void
 gda_vconnection_data_model_get_property (GObject *object,
 					 guint param_id,
 					 G_GNUC_UNUSED GValue *value,
-					 G_GNUC_UNUSED GParamSpec *pspec)
+					 GParamSpec *pspec)
 {
         GdaVconnectionDataModel *cnc;
 
@@ -157,6 +158,7 @@ gda_vconnection_data_model_get_property (GObject *object,
         if (cnc->priv) {
 		switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
         }
diff --git a/libgda/sqlite/virtual/gda-vconnection-hub.c b/libgda/sqlite/virtual/gda-vconnection-hub.c
index 741ef0a..a242e07 100644
--- a/libgda/sqlite/virtual/gda-vconnection-hub.c
+++ b/libgda/sqlite/virtual/gda-vconnection-hub.c
@@ -148,7 +148,7 @@ static void
 gda_vconnection_hub_set_property (GObject *object,
 					 guint param_id,
 					 G_GNUC_UNUSED const GValue *value,
-					 G_GNUC_UNUSED GParamSpec *pspec)
+					 GParamSpec *pspec)
 {
         GdaVconnectionHub *cnc;
 
@@ -156,6 +156,7 @@ gda_vconnection_hub_set_property (GObject *object,
         if (cnc->priv) {
                 switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
                 }
         }
@@ -165,7 +166,7 @@ static void
 gda_vconnection_hub_get_property (GObject *object,
 					 guint param_id,
 					 G_GNUC_UNUSED GValue *value,
-					 G_GNUC_UNUSED GParamSpec *pspec)
+					 GParamSpec *pspec)
 {
         GdaVconnectionHub *cnc;
 
@@ -173,6 +174,7 @@ gda_vconnection_hub_get_property (GObject *object,
         if (cnc->priv) {
 		switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
         }
diff --git a/libgda/sqlite/virtual/gda-virtual-provider.c b/libgda/sqlite/virtual/gda-virtual-provider.c
index 991373e..f70ec59 100644
--- a/libgda/sqlite/virtual/gda-virtual-provider.c
+++ b/libgda/sqlite/virtual/gda-virtual-provider.c
@@ -138,7 +138,7 @@ static void
 gda_virtual_provider_set_property (GObject *object,
 				   guint param_id,
 				   G_GNUC_UNUSED const GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         GdaVirtualProvider *prov;
 
@@ -146,6 +146,7 @@ gda_virtual_provider_set_property (GObject *object,
         if (prov->priv) {
                 switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
                 }
         }
@@ -155,7 +156,7 @@ static void
 gda_virtual_provider_get_property (GObject *object,
 				 guint param_id,
 				 G_GNUC_UNUSED GValue *value,
-				 G_GNUC_UNUSED GParamSpec *pspec)
+				 GParamSpec *pspec)
 {
         GdaVirtualProvider *prov;
 
@@ -163,6 +164,7 @@ gda_virtual_provider_get_property (GObject *object,
         if (prov->priv) {
 		switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
         }
diff --git a/libgda/sqlite/virtual/gda-vprovider-data-model.c b/libgda/sqlite/virtual/gda-vprovider-data-model.c
index 222a158..116dfc3 100644
--- a/libgda/sqlite/virtual/gda-vprovider-data-model.c
+++ b/libgda/sqlite/virtual/gda-vprovider-data-model.c
@@ -150,7 +150,7 @@ static void
 gda_vprovider_data_model_set_property (GObject *object,
 				       guint param_id,
 				       G_GNUC_UNUSED const GValue *value,
-				       G_GNUC_UNUSED GParamSpec *pspec)
+				       GParamSpec *pspec)
 {
         GdaVproviderDataModel *prov;
 
@@ -158,6 +158,7 @@ gda_vprovider_data_model_set_property (GObject *object,
         if (prov->priv) {
                 switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
                 }
         }
@@ -167,7 +168,7 @@ static void
 gda_vprovider_data_model_get_property (GObject *object,
 				       guint param_id,
 				       G_GNUC_UNUSED GValue *value,
-				       G_GNUC_UNUSED GParamSpec *pspec)
+				       GParamSpec *pspec)
 {
         GdaVproviderDataModel *prov;
 
@@ -175,6 +176,7 @@ gda_vprovider_data_model_get_property (GObject *object,
         if (prov->priv) {
 		switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
         }
@@ -397,7 +399,7 @@ virtualCreate (sqlite3 *db, void *pAux, int argc, const char *const *argv, sqlit
 			if (error && error->message) {
 				int len = strlen (error->message) + 1;
 				*pzErr = SQLITE3_CALL (sqlite3_malloc) (sizeof (gchar) * len);
-				memcpy (*pzErr, error->message, len);
+				memcpy (*pzErr, error->message, len); /* Flawfinder: ignore */
 			}
 			else 
 				*pzErr = SQLITE3_CALL (sqlite3_mprintf) (_("Could not compute virtual table's columns"));
@@ -583,7 +585,7 @@ virtualOpen (sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor)
 	cursor = g_new0 (VirtualCursor, 1);
 	cursor->iter = gda_data_model_create_iter (vtable->wrapper);
 	cursor->ncols = gda_data_model_get_n_columns (GDA_DATA_MODEL (vtable->td->real_model));
-	*ppCursor = &(cursor->base);
+	*ppCursor = (sqlite3_vtab_cursor*) cursor;
 	return SQLITE_OK;
 }
 
diff --git a/libgda/sqlite/virtual/gda-vprovider-hub.c b/libgda/sqlite/virtual/gda-vprovider-hub.c
index fe68343..2a4190b 100644
--- a/libgda/sqlite/virtual/gda-vprovider-hub.c
+++ b/libgda/sqlite/virtual/gda-vprovider-hub.c
@@ -133,7 +133,7 @@ static void
 gda_vprovider_hub_set_property (GObject *object,
 				       guint param_id,
 				       G_GNUC_UNUSED const GValue *value,
-				       G_GNUC_UNUSED GParamSpec *pspec)
+				       GParamSpec *pspec)
 {
         GdaVproviderHub *prov;
 
@@ -141,6 +141,7 @@ gda_vprovider_hub_set_property (GObject *object,
         if (prov->priv) {
                 switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
                 }
         }
@@ -150,7 +151,7 @@ static void
 gda_vprovider_hub_get_property (GObject *object,
 				       guint param_id,
 				       G_GNUC_UNUSED GValue *value,
-				       G_GNUC_UNUSED GParamSpec *pspec)
+				       GParamSpec *pspec)
 {
         GdaVproviderHub *prov;
 
@@ -158,6 +159,7 @@ gda_vprovider_hub_get_property (GObject *object,
         if (prov->priv) {
 		switch (param_id) {
 		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 			break;
 		}
         }
diff --git a/libgda/thread-wrapper/gda-thread-wrapper.c b/libgda/thread-wrapper/gda-thread-wrapper.c
index 8c87e07..4c9b7c4 100644
--- a/libgda/thread-wrapper/gda-thread-wrapper.c
+++ b/libgda/thread-wrapper/gda-thread-wrapper.c
@@ -458,14 +458,17 @@ static void
 gda_thread_wrapper_set_property (GObject *object,
 			       guint param_id,
 			       G_GNUC_UNUSED const GValue *value,
-			       G_GNUC_UNUSED GParamSpec *pspec)
+			       GParamSpec *pspec)
 {
 	GdaThreadWrapper *wrapper;
 
         wrapper = GDA_THREAD_WRAPPER (object);
         if (wrapper->priv) {
                 switch (param_id) {
-		}	
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
+		}
 	}
 }
 
@@ -473,15 +476,18 @@ static void
 gda_thread_wrapper_get_property (GObject *object,
 			       guint param_id,
 			       G_GNUC_UNUSED GValue *value,
-			       G_GNUC_UNUSED GParamSpec *pspec)
+			       GParamSpec *pspec)
 {
 	GdaThreadWrapper *wrapper;
 	
 	wrapper = GDA_THREAD_WRAPPER (object);
 	if (wrapper->priv) {
 		switch (param_id) {
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
-	}	
+	}
 }
 
 /**
@@ -777,7 +783,7 @@ gda_thread_wrapper_iterate (GdaThreadWrapper *wrapper, gboolean may_block)
 }
 
 /**
- * gda_thread_wrapper_fetch_result
+ * gda_thread_wrapper_fetch_result:
  * @wrapper: a #GdaThreadWrapper object
  * @may_lock: TRUE if this funct must lock the caller untill a result is available
  * @exp_id: ID of the job for which a result is expected
@@ -786,7 +792,7 @@ gda_thread_wrapper_iterate (GdaThreadWrapper *wrapper, gboolean may_block)
  * Use this method to check if the execution of a function is finished. The function's execution must have
  * been requested using gda_thread_wrapper_execute().
  *
- * Returns: the pointer returned by the execution, or %NULL if no result is available
+ * Returns: (transfer none) (allow-none): the pointer returned by the execution, or %NULL if no result is available
  *
  * Since: 4.2
  */
@@ -993,7 +999,7 @@ worker_thread_closure_marshal_anythread (GClosure *closure,
 }
 
 /**
- * gda_thread_wrapper_connect_raw
+ * gda_thread_wrapper_connect_raw:
  * @wrapper: a #GdaThreadWrapper object
  * @instance: the instance to connect to
  * @sig_name: a string of the form "signal-name::detail"
@@ -1006,8 +1012,8 @@ worker_thread_closure_marshal_anythread (GClosure *closure,
  *    been emitted when a job created for the calling thread is being executed, and to %FALSE
  *    if @callback has to be called whenever the @sig_name signal is emitted by @instance. Note that
  *    this argument is not taken into account if @private_thread is set to %FALSE.
- * @callback: a #GdaThreadWrapperCallback function
- * @data: data to pass to @callback's calls
+ * @callback: (scope call): a #GdaThreadWrapperCallback function
+ * @data: (closure): data to pass to @callback's calls
  *
  * Connects a callback function to a signal for a particular object. The difference with g_signal_connect() and
  * similar functions are:
diff --git a/po/es.po b/po/es.po
index 5351329..993bdf3 100644
--- a/po/es.po
+++ b/po/es.po
@@ -11,8 +11,8 @@ msgstr ""
 "Project-Id-Version: libgda.master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?";
 "product=libgda&component=general\n"
-"POT-Creation-Date: 2010-09-26 11:21+0000\n"
-"PO-Revision-Date: 2010-10-07 11:47+0200\n"
+"POT-Creation-Date: 2010-10-18 19:18+0000\n"
+"PO-Revision-Date: 2010-10-20 08:58+0200\n"
 "Last-Translator: Jorge González <jorgegonz svn gnome org>\n"
 "Language-Team: Español <gnome-es-list gnome org>\n"
 "MIME-Version: 1.0\n"
@@ -95,7 +95,7 @@ msgstr "No se pudo abrir la conexión"
 
 #: ../control-center/dsn-properties-dialog.c:239
 #: ../control-center/gdaui-dsn-assistant.c:141
-#: ../libgda-ui/gdaui-raw-form.c:606
+#: ../libgda-ui/gdaui-raw-form.c:607
 msgid "Unknown error"
 msgstr "Error desconocido"
 
@@ -105,24 +105,24 @@ msgstr "No se pudo ejecutar el programa del examinador"
 
 #. FIXME: add a notice somewhere in the UI
 #: ../control-center/dsn-properties-dialog.c:283
-#: ../libgda/gda-connection.c:1529 ../libgda/gda-data-model.c:2031
-#: ../libgda/gda-data-model.c:2039 ../libgda/gda-data-model-dir.c:382
-#: ../libgda/gda-data-model-import.c:1574
-#: ../libgda/gda-data-model-import.c:1857
-#: ../libgda/gda-data-model-import.c:1930 ../libgda/gda-data-select.c:368
-#: ../libgda/gda-data-select.c:2032 ../libgda/gda-data-select.c:2041
-#: ../libgda/gda-data-select.c:2051 ../libgda/gda-data-select.c:3446
-#: ../libgda/gda-holder.c:488 ../libgda/gda-holder.c:1708
-#: ../libgda/gda-server-operation.c:614 ../libgda/gda-server-operation.c:1005
-#: ../libgda/gda-set.c:559 ../libgda/gda-tree-mgr-select.c:188
-#: ../libgda/gda-tree-mgr-select.c:220
-#: ../libgda/sqlite/gda-sqlite-provider.c:2198
-#: ../libgda/sqlite/gda-sqlite-provider.c:2210
-#: ../libgda/sqlite/gda-sqlite-provider.c:2232
-#: ../libgda/sqlite/gda-sqlite-provider.c:2422
-#: ../libgda/sqlite/gda-sqlite-provider.c:2707
-#: ../libgda/sqlite/gda-sqlite-provider.c:2719
-#: ../libgda/thread-wrapper/gda-thread-provider.c:454
+#: ../libgda/gda-connection.c:1535 ../libgda/gda-data-model.c:2034
+#: ../libgda/gda-data-model.c:2042 ../libgda/gda-data-model-dir.c:386
+#: ../libgda/gda-data-model-import.c:1575
+#: ../libgda/gda-data-model-import.c:1858
+#: ../libgda/gda-data-model-import.c:1931 ../libgda/gda-data-select.c:370
+#: ../libgda/gda-data-select.c:2036 ../libgda/gda-data-select.c:2045
+#: ../libgda/gda-data-select.c:2055 ../libgda/gda-data-select.c:3452
+#: ../libgda/gda-holder.c:490 ../libgda/gda-holder.c:1716
+#: ../libgda/gda-server-operation.c:616 ../libgda/gda-server-operation.c:1010
+#: ../libgda/gda-set.c:561 ../libgda/gda-tree-mgr-select.c:189
+#: ../libgda/gda-tree-mgr-select.c:224
+#: ../libgda/sqlite/gda-sqlite-provider.c:2199
+#: ../libgda/sqlite/gda-sqlite-provider.c:2211
+#: ../libgda/sqlite/gda-sqlite-provider.c:2233
+#: ../libgda/sqlite/gda-sqlite-provider.c:2423
+#: ../libgda/sqlite/gda-sqlite-provider.c:2708
+#: ../libgda/sqlite/gda-sqlite-provider.c:2720
+#: ../libgda/thread-wrapper/gda-thread-provider.c:456
 #: ../libgda-ui/data-entries/common-bin.c:79
 #: ../libgda-ui/data-entries/common-bin.c:156
 #: ../libgda-ui/data-entries/plugins/common-pict.c:212
@@ -130,66 +130,66 @@ msgstr "No se pudo ejecutar el programa del examinador"
 #: ../libgda-ui/data-entries/plugins/common-pict.c:265
 #: ../libgda-ui/data-entries/plugins/common-pict.c:400
 #: ../libgda-ui/data-entries/plugins/common-pict.c:509
-#: ../libgda-ui/demos/main.c:772 ../libgda-ui/gdaui-data-filter.c:167
-#: ../libgda-ui/gdaui-init.c:496 ../libgda-ui/gdaui-login.c:421
-#: ../providers/jdbc/gda-jdbc-provider.c:388
-#: ../providers/jdbc/gda-jdbc-provider.c:1334
-#: ../providers/jdbc/gda-jdbc-provider.c:1363
-#: ../providers/jdbc/gda-jdbc-provider.c:1412
+#: ../libgda-ui/demos/main.c:774 ../libgda-ui/gdaui-data-filter.c:168
+#: ../libgda-ui/gdaui-init.c:496 ../libgda-ui/gdaui-login.c:422
+#: ../providers/jdbc/gda-jdbc-provider.c:390
+#: ../providers/jdbc/gda-jdbc-provider.c:1339
+#: ../providers/jdbc/gda-jdbc-provider.c:1368
+#: ../providers/jdbc/gda-jdbc-provider.c:1417
 #: ../providers/jdbc/gda-jdbc-util.c:46 ../providers/jdbc/libmain.c:155
 #: ../providers/jdbc/libmain.c:165 ../providers/jdbc/libmain.c:478
 #: ../providers/mdb/gda-mdb-provider.c:353
 #: ../providers/mysql/gda-mysql-provider.c:1956
 #: ../providers/mysql/gda-mysql-provider.c:1971
 #: ../providers/mysql/gda-mysql-util.c:73
-#: ../providers/postgres/gda-postgres-provider.c:1673
-#: ../providers/postgres/gda-postgres-provider.c:1688
+#: ../providers/postgres/gda-postgres-provider.c:1678
+#: ../providers/postgres/gda-postgres-provider.c:1693
 #: ../providers/postgres/gda-postgres-util.c:108
 #: ../providers/postgres/gda-postgres-util.c:111
-#: ../tools/browser/auth-dialog.c:678 ../tools/browser/auth-dialog.c:681
-#: ../tools/browser/browser-connection.c:356
-#: ../tools/browser/browser-connection.c:422
-#: ../tools/browser/browser-connection.c:442
-#: ../tools/browser/browser-connection.c:626
-#: ../tools/browser/browser-connection.c:646
-#: ../tools/browser/browser-connection.c:854
-#: ../tools/browser/browser-window.c:887 ../tools/browser/browser-window.c:901
-#: ../tools/browser/browser-window.c:915
-#: ../tools/browser/browser-window.c:1145
-#: ../tools/browser/browser-window.c:1186
-#: ../tools/browser/browser-window.c:1457 ../tools/browser/login-dialog.c:239
+#: ../tools/browser/auth-dialog.c:679 ../tools/browser/auth-dialog.c:682
+#: ../tools/browser/browser-connection.c:358
+#: ../tools/browser/browser-connection.c:424
+#: ../tools/browser/browser-connection.c:444
+#: ../tools/browser/browser-connection.c:634
+#: ../tools/browser/browser-connection.c:654
+#: ../tools/browser/browser-connection.c:862
+#: ../tools/browser/browser-window.c:888 ../tools/browser/browser-window.c:902
+#: ../tools/browser/browser-window.c:916
+#: ../tools/browser/browser-window.c:1147
+#: ../tools/browser/browser-window.c:1188
+#: ../tools/browser/browser-window.c:1459 ../tools/browser/login-dialog.c:240
 #: ../tools/browser/main.c:96 ../tools/browser/main.c:110
 #: ../tools/browser/main.c:136
-#: ../tools/browser/data-manager/data-console.c:559
-#: ../tools/browser/data-manager/data-favorite-selector.c:201
-#: ../tools/browser/data-manager/data-favorite-selector.c:259
-#: ../tools/browser/data-manager/data-favorite-selector.c:627
-#: ../tools/browser/data-manager/data-widget.c:344
-#: ../tools/browser/data-manager/data-widget.c:612
-#: ../tools/browser/query-exec/query-console.c:684
-#: ../tools/browser/query-exec/query-console.c:823
-#: ../tools/browser/query-exec/query-console.c:868
-#: ../tools/browser/query-exec/query-console.c:922
-#: ../tools/browser/query-exec/query-console.c:973
-#: ../tools/browser/query-exec/query-favorite-selector.c:191
-#: ../tools/browser/query-exec/query-favorite-selector.c:243
-#: ../tools/browser/query-exec/query-favorite-selector.c:598
-#: ../tools/browser/query-exec/query-result.c:258
-#: ../tools/browser/query-exec/query-result.c:432
-#: ../tools/browser/schema-browser/favorite-selector.c:170
-#: ../tools/browser/schema-browser/favorite-selector.c:357
-#: ../tools/browser/schema-browser/relations-diagram.c:235
-#: ../tools/browser/schema-browser/table-info.c:469
-#: ../tools/browser/schema-browser/table-info.c:522
-#: ../tools/browser/schema-browser/table-info.c:549
-#: ../tools/browser/schema-browser/table-info.c:843
-#: ../tools/browser/schema-browser/table-preferences.c:699
-#: ../tools/browser/schema-browser/table-preferences.c:772
+#: ../tools/browser/data-manager/data-console.c:560
+#: ../tools/browser/data-manager/data-favorite-selector.c:202
+#: ../tools/browser/data-manager/data-favorite-selector.c:260
+#: ../tools/browser/data-manager/data-favorite-selector.c:628
+#: ../tools/browser/data-manager/data-widget.c:346
+#: ../tools/browser/data-manager/data-widget.c:614
+#: ../tools/browser/query-exec/query-console.c:685
+#: ../tools/browser/query-exec/query-console.c:825
+#: ../tools/browser/query-exec/query-console.c:870
+#: ../tools/browser/query-exec/query-console.c:924
+#: ../tools/browser/query-exec/query-console.c:975
+#: ../tools/browser/query-exec/query-favorite-selector.c:192
+#: ../tools/browser/query-exec/query-favorite-selector.c:244
+#: ../tools/browser/query-exec/query-favorite-selector.c:599
+#: ../tools/browser/query-exec/query-result.c:260
+#: ../tools/browser/query-exec/query-result.c:434
+#: ../tools/browser/schema-browser/favorite-selector.c:171
+#: ../tools/browser/schema-browser/favorite-selector.c:358
+#: ../tools/browser/schema-browser/relations-diagram.c:242
+#: ../tools/browser/schema-browser/table-info.c:476
+#: ../tools/browser/schema-browser/table-info.c:529
+#: ../tools/browser/schema-browser/table-info.c:556
+#: ../tools/browser/schema-browser/table-info.c:850
+#: ../tools/browser/schema-browser/table-preferences.c:700
+#: ../tools/browser/schema-browser/table-preferences.c:773
 #: ../tools/gda-list-server-op.c:47 ../tools/gda-list-server-op.c:90
 #: ../tools/gda-sql.c:269 ../tools/gda-sql.c:286 ../tools/gda-sql.c:425
 #: ../tools/gda-sql.c:1467 ../tools/gda-sql.c:1482 ../tools/gda-sql.c:1619
-#: ../tools/gda-sql.c:3051 ../tools/tools-input.c:129
-#: ../tools/web-server.c:2018
+#: ../tools/gda-sql.c:3057 ../tools/tools-input.c:130
+#: ../tools/web-server.c:2020
 msgid "No detail"
 msgstr "Sin detalles"
 
@@ -232,7 +232,7 @@ msgstr ""
 
 #: ../control-center/gdaui-dsn-assistant.c:437
 msgid "Add a new data source..."
-msgstr "Agregar una nueva fuente de datos..."
+msgstr "Añadir una fuente de datos nueva �"
 
 #: ../control-center/gdaui-dsn-assistant.c:455
 msgid ""
@@ -367,14 +367,14 @@ msgstr ""
 "la edición de los atributos de la fuente de datos está desactivada</span>"
 
 #. connection's authentication
-#: ../control-center/gdaui-dsn-editor.c:223 ../libgda/gda-config.c:1337
-#: ../tools/browser/auth-dialog.c:281
+#: ../control-center/gdaui-dsn-editor.c:223 ../libgda/gda-config.c:1344
+#: ../tools/browser/auth-dialog.c:282
 msgid "Authentication"
 msgstr "Autenticación"
 
 #: ../control-center/gdaui-login-dialog.c:79
 #: ../control-center/gdaui-login-dialog.c:87
-#: ../tools/browser/auth-dialog.c:233 ../tools/browser/login-dialog.c:192
+#: ../tools/browser/auth-dialog.c:234 ../tools/browser/login-dialog.c:193
 msgid "Connection opening"
 msgstr "Abriendo conexión"
 
@@ -406,7 +406,7 @@ msgstr "No se pudo declarar el nuevo origen de datos"
 msgid "No valid data source info was created"
 msgstr "No se creó una información válida para la fuente de datos"
 
-#: ../control-center/main.c:184 ../tools/browser/browser-window.c:1228
+#: ../control-center/main.c:184 ../tools/browser/browser-window.c:1230
 msgid "Database access services for the GNOME Desktop"
 msgstr "Servicios de acceso a bases de datos para el Escritorio GNOME"
 
@@ -427,11 +427,11 @@ msgstr ""
 "Los proveedores son complementos que implementan el acceso con cada base de "
 "datos usando los medios proporcionados por cada fabricante de bases de datos."
 
-#: ../libgda/gda-batch.c:316
+#: ../libgda/gda-batch.c:317
 msgid "Statement could not be found in batch's statements"
 msgstr "La declaración no se pudo encontrar en las declaraciones batch"
 
-#: ../libgda/gda-batch.c:441
+#: ../libgda/gda-batch.c:442
 #, c-format
 msgid "Conflicting parameter '%s'"
 msgstr "Parámetro «%s» en conflicto"
@@ -455,87 +455,87 @@ msgstr ""
 "El directorio de configuración específico del usuario «%s» ya existe y no es "
 "un directorio"
 
-#: ../libgda/gda-config.c:818
+#: ../libgda/gda-config.c:825
 #, c-format
 msgid "Malformed data source name '%s'"
 msgstr "El nombre de la fuente de datos está mal formado «%s»"
 
-#: ../libgda/gda-config.c:842
+#: ../libgda/gda-config.c:849
 #, c-format
 msgid "Couldn't save authentification information for DSN '%s': %s"
 msgstr ""
 "No se pudo guardar la información de autenticación para el DNS «%s»: «%s»"
 
-#: ../libgda/gda-config.c:874 ../libgda/gda-config.c:1002
+#: ../libgda/gda-config.c:881 ../libgda/gda-config.c:1009
 msgid "Can't manage system-wide configuration"
 msgstr "No se puede gestionar la configuración amplia del sistema"
 
-#: ../libgda/gda-config.c:929
+#: ../libgda/gda-config.c:936
 #, c-format
 msgid "Authentification for the '%s' DSN"
 msgstr "Autenticación para el DNS «%s»"
 
-#: ../libgda/gda-config.c:964
+#: ../libgda/gda-config.c:971
 #, c-format
 msgid "Couldn't delete authentication information for DSN '%s': %s"
 msgstr ""
 "No se pudo eliminar la información de autenticación para el DNS «%s»: %s"
 
-#: ../libgda/gda-config.c:996 ../libgda-ui/gdaui-login.c:632
+#: ../libgda/gda-config.c:1003 ../libgda-ui/gdaui-login.c:633
 #, c-format
 msgid "Unknown DSN '%s'"
 msgstr "DNS «%s» desconocido"
 
-#: ../libgda/gda-config.c:1067
+#: ../libgda/gda-config.c:1074
 #, c-format
 msgid "Provider '%s' not found"
 msgstr "No se encontró al proveedor «%s»"
 
-#: ../libgda/gda-config.c:1252 ../libgda/gda-connection.c:1016
-#: ../libgda/gda-connection.c:1173
+#: ../libgda/gda-config.c:1259 ../libgda/gda-connection.c:1022
+#: ../libgda/gda-connection.c:1179
 #, c-format
 msgid "No provider '%s' installed"
 msgstr "No hay un proveedor «%s» instalado"
 
-#: ../libgda/gda-config.c:1267
+#: ../libgda/gda-config.c:1274
 #, c-format
 msgid "Can't load provider: %s"
 msgstr "No se puede cargar el proveedor «%s»"
 
-#: ../libgda/gda-config.c:1290
+#: ../libgda/gda-config.c:1297
 #, c-format
 msgid "Can't instantiate provider '%s'"
 msgstr "No se puede instanciar el proveedor «%s»"
 
-#: ../libgda/gda-config.c:1334 ../libgda/gda-data-model-dsn-list.c:111
-#: ../libgda/gda-data-model-dsn-list.c:112 ../tools/gda-sql.c:1852
-#: ../tools/gda-sql.c:2700 ../tools/gda-sql.c:2872 ../tools/gda-sql.c:3089
+#: ../libgda/gda-config.c:1341 ../libgda/gda-data-model-dsn-list.c:111
+#: ../libgda/gda-data-model-dsn-list.c:112 ../tools/gda-sql.c:1853
+#: ../tools/gda-sql.c:2702 ../tools/gda-sql.c:2877 ../tools/gda-sql.c:3095
 msgid "Provider"
 msgstr "Proveedor"
 
-#: ../libgda/gda-config.c:1335 ../libgda/gda-data-model-dsn-list.c:117
+#: ../libgda/gda-config.c:1342 ../libgda/gda-data-model-dsn-list.c:117
 #: ../libgda/gda-data-model-dsn-list.c:118
 #: ../libgda/gda-server-provider-extra.c:382
 #: ../libgda/gda-server-provider-extra.c:405
-#: ../tools/browser/data-manager/data-source-editor.c:130
-#: ../tools/gda-sql.c:1853 ../tools/gda-sql.c:2699 ../tools/gda-sql.c:2873
+#: ../tools/browser/data-manager/data-source-editor.c:131
+#: ../tools/gda-sql.c:1854 ../tools/gda-sql.c:2701 ../tools/gda-sql.c:2878
 msgid "Description"
 msgstr "Descripción"
 
-#: ../libgda/gda-config.c:1336
+#: ../libgda/gda-config.c:1343
 msgid "DSN parameters"
 msgstr "Parámetros DSN"
 
-#: ../libgda/gda-config.c:1338
+#: ../libgda/gda-config.c:1345
 msgid "File"
 msgstr "Archivo"
 
-#: ../libgda/gda-config.c:1339
+#: ../libgda/gda-config.c:1346
 msgid "List of installed providers"
 msgstr "Lista de todos los proveedores instalados"
 
-#: ../libgda/gda-config.c:1503 ../libgda/gda-data-model-dsn-list.c:131
-#: ../libgda/gda-data-model-dsn-list.c:132 ../tools/gda-sql.c:3091
+#: ../libgda/gda-config.c:1510 ../libgda/gda-data-model-dsn-list.c:131
+#: ../libgda/gda-data-model-dsn-list.c:132 ../tools/gda-sql.c:3097
 msgid "Username"
 msgstr "Usuario"
 
@@ -544,7 +544,7 @@ msgstr "Usuario"
 #. This file contains the CREATE ROLE operation's parameters, which is
 #. available since PostgreSQL 8.1
 #.
-#: ../libgda/gda-config.c:1505
+#: ../libgda/gda-config.c:1512
 #: ../providers/mysql/mysql_specs_create_table.xml.in.h:147
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:60
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:10
@@ -552,7 +552,7 @@ msgstr "Usuario"
 msgid "Password"
 msgstr "Contraseña"
 
-#: ../libgda/gda-config.c:1575
+#: ../libgda/gda-config.c:1582
 #, c-format
 msgid "Error loading provider '%s': %s"
 msgstr "Error al cargar el proveedor «%s»: %s"
@@ -575,7 +575,7 @@ msgstr "Cadena de autenticación que usar"
 
 #: ../libgda/gda-connection.c:321 ../libgda/gda-server-provider-extra.c:414
 #: ../libgda-ui/data/server_operation.glade.h:5
-#: ../libgda-ui/gdaui-server-operation.c:792
+#: ../libgda-ui/gdaui-server-operation.c:793
 #: ../providers/postgres/postgres_specs_create_db.xml.in.h:55
 #: ../providers/postgres/postgres_specs_drop_db.xml.in.h:33
 #: ../providers/postgres/postgres_specs_dsn.xml.in.h:6
@@ -611,266 +611,266 @@ msgstr ""
 "Hacer que la conexión establezca una función de monitorización en el bucle "
 "principal para monitorizar la conexión envuelta"
 
-#: ../libgda/gda-connection.c:645 ../libgda/gda-connection.c:673
-#: ../libgda/gda-connection.c:687 ../libgda/gda-connection.c:702
+#: ../libgda/gda-connection.c:648 ../libgda/gda-connection.c:676
+#: ../libgda/gda-connection.c:690 ../libgda/gda-connection.c:705
 #, c-format
 msgid "Could not set the '%s' property when the connection is opened"
 msgstr ""
 "No se puede configurar la propiedad «%s» cuando la conexión está abierta"
 
-#: ../libgda/gda-connection.c:653
+#: ../libgda/gda-connection.c:656
 #, c-format
 msgid "No DSN named '%s' defined"
 msgstr "No hay definido ningún DSN llamado «%s»"
 
-#: ../libgda/gda-connection.c:723
+#: ../libgda/gda-connection.c:726
 #, c-format
 msgid "Can't set the '%s' property once the connection is opened"
 msgstr ""
 "No se puede configurar la propiedad «%s» cuando la conexión está abierta"
 
-#: ../libgda/gda-connection.c:961 ../libgda/gda-connection.c:1114
-#: ../libgda/thread-wrapper/gda-thread-provider.c:428
-#: ../libgda/thread-wrapper/gda-thread-provider.c:513
+#: ../libgda/gda-connection.c:967 ../libgda/gda-connection.c:1120
+#: ../libgda/thread-wrapper/gda-thread-provider.c:430
+#: ../libgda/thread-wrapper/gda-thread-provider.c:515
 msgid "Multi threading is not supported or enabled"
 msgstr "El procesado multihilo no se soporta o no está activado "
 
-#: ../libgda/gda-connection.c:970
+#: ../libgda/gda-connection.c:976
 #, c-format
 msgid "Malformed data source specification '%s'"
 msgstr "Especificación de origen de datos «%s» mal formada"
 
-#: ../libgda/gda-connection.c:978 ../libgda/gda-connection.c:1361
-#: ../libgda/gda-connection.c:1363
+#: ../libgda/gda-connection.c:984 ../libgda/gda-connection.c:1367
+#: ../libgda/gda-connection.c:1369
 #, c-format
 msgid "Data source %s not found in configuration"
 msgstr "Origen de datos %s no encontrado en la configuración"
 
-#: ../libgda/gda-connection.c:1044
+#: ../libgda/gda-connection.c:1050
 msgid "Datasource configuration error: no provider specified"
 msgstr ""
 "Error de configuración de la fuente de datos: no se especificó el proveedor"
 
-#: ../libgda/gda-connection.c:1124 ../tools/browser/auth-dialog.c:417
-#: ../tools/browser/auth-dialog.c:453 ../tools/gda-sql.c:1311
+#: ../libgda/gda-connection.c:1130 ../tools/browser/auth-dialog.c:418
+#: ../tools/browser/auth-dialog.c:454 ../tools/gda-sql.c:1311
 #, c-format
 msgid "Malformed connection string '%s'"
 msgstr "Cadena de conexión «%s» mal formada"
 
-#: ../libgda/gda-connection.c:1130 ../libgda/gda-connection.c:1385
+#: ../libgda/gda-connection.c:1136 ../libgda/gda-connection.c:1391
 msgid "No provider specified"
 msgstr "No se especificó ningún proveedor"
 
-#: ../libgda/gda-connection.c:1373 ../libgda/gda-connection.c:1375
+#: ../libgda/gda-connection.c:1379 ../libgda/gda-connection.c:1381
 msgid "No DSN or connection string specified"
 msgstr "Sin DSN o cadena de conexión especificada"
 
-#: ../libgda/gda-connection.c:1405
+#: ../libgda/gda-connection.c:1411
 msgid "Provider does not allow usage from this thread"
 msgstr "El proveedor no permite uso desde este hilo"
 
-#: ../libgda/gda-connection.c:1419
+#: ../libgda/gda-connection.c:1425
 msgid ""
 "Internal error: provider does not implement the open_connection() virtual "
 "method"
 msgstr ""
 "Error interno: el proveedor no implementa el método virtual open_connection()"
 
-#: ../libgda/gda-connection.c:1528
+#: ../libgda/gda-connection.c:1534
 #, c-format
 msgid "Error while maintaining the meta data up to date: %s"
 msgstr "Error al mantener los metadatos actualizados: %s"
 
-#: ../libgda/gda-connection.c:2179
+#: ../libgda/gda-connection.c:2185
 msgid "Provider does not support statement preparation"
 msgstr "El proveedor no soporta la preparación de declaraciones"
 
-#: ../libgda/gda-connection.c:2374 ../libgda/gda-connection.c:2460
-#: ../libgda/gda-connection.c:2530 ../libgda/gda-meta-store.c:659
+#: ../libgda/gda-connection.c:2380 ../libgda/gda-connection.c:2466
+#: ../libgda/gda-connection.c:2536 ../libgda/gda-meta-store.c:660
 #, c-format
 msgid "Can't obtain connection lock"
 msgstr "No se puede abrir la conexión virtual"
 
-#: ../libgda/gda-connection.c:2381 ../libgda/gda-connection.c:2597
-#: ../libgda/gda-connection.c:2868 ../libgda/gda-connection.c:2938
-#: ../libgda/gda-connection.c:3008
-#: ../libgda/sqlite/virtual/gda-vconnection-hub.c:217
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1619
+#: ../libgda/gda-connection.c:2387 ../libgda/gda-connection.c:2603
+#: ../libgda/gda-connection.c:2874 ../libgda/gda-connection.c:2944
+#: ../libgda/gda-connection.c:3014
+#: ../libgda/sqlite/virtual/gda-vconnection-hub.c:220
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1626
 #, c-format
 msgid "Connection is closed"
 msgstr "La conexión está cerrada"
 
-#: ../libgda/gda-connection.c:2475 ../libgda/gda-connection.c:2565
+#: ../libgda/gda-connection.c:2481 ../libgda/gda-connection.c:2571
 #, c-format
 msgid "Can't find task %u"
 msgstr "No se puede encontrar la tarea %u"
 
-#: ../libgda/gda-connection.c:2553 ../libgda/sqlite/gda-sqlite-provider.c:1096
-#: ../libgda/thread-wrapper/gda-thread-provider.c:917
-#: ../providers/jdbc/gda-jdbc-provider.c:575
+#: ../libgda/gda-connection.c:2559 ../libgda/sqlite/gda-sqlite-provider.c:1097
+#: ../libgda/thread-wrapper/gda-thread-provider.c:924
+#: ../providers/jdbc/gda-jdbc-provider.c:580
 #: ../providers/mysql/gda-mysql-provider.c:963
-#: ../providers/postgres/gda-postgres-provider.c:863
-#: ../providers/web/gda-web-provider.c:674
+#: ../providers/postgres/gda-postgres-provider.c:867
+#: ../providers/web/gda-web-provider.c:678
 msgid "Provider does not support asynchronous server operation"
 msgstr "El proveedor no soporta operaciones asíncronas de servidor"
 
-#: ../libgda/gda-connection.c:2739 ../libgda/gda-connection.c:2754
+#: ../libgda/gda-connection.c:2745 ../libgda/gda-connection.c:2760
 msgid "Statement is a selection statement"
 msgstr "La declaración es una declaración de seleccion"
 
-#: ../libgda/gda-connection.c:2812 ../libgda/gda-connection.c:2888
-#: ../libgda/gda-connection.c:2958
+#: ../libgda/gda-connection.c:2818 ../libgda/gda-connection.c:2894
+#: ../libgda/gda-connection.c:2964
 msgid "Statement is not a selection statement"
 msgstr "La declaración no es una declaración de selección"
 
-#: ../libgda/gda-connection.c:3417
+#: ../libgda/gda-connection.c:3423
 msgid "Invalid argument"
 msgstr "Argumento inválido"
 
-#: ../libgda/gda-connection.c:3426
+#: ../libgda/gda-connection.c:3432
 #, c-format
 msgid "Missing or wrong arguments for table '%s': %s"
 msgstr "Faltan argumentos o son erróneos para la tabla «%s»: %s"
 
-#: ../libgda/gda-connection.c:4181
+#: ../libgda/gda-connection.c:4187
 msgid "Meta update error"
 msgstr "Error en la metaactualización"
 
-#: ../libgda/gda-connection.c:4744
+#: ../libgda/gda-connection.c:4750
 msgid "Wrong filter arguments"
 msgstr "Argumentos de filtrado erróneos"
 
-#: ../libgda/gda-connection.c:4932 ../libgda/gda-connection.c:4985
-#: ../libgda/gda-connection.c:5029 ../libgda/gda-connection.c:5073
-#: ../libgda/gda-connection.c:5117
+#: ../libgda/gda-connection.c:4938 ../libgda/gda-connection.c:4991
+#: ../libgda/gda-connection.c:5035 ../libgda/gda-connection.c:5079
+#: ../libgda/gda-connection.c:5123
 #, c-format
 msgid "Connection transaction status tracking: no transaction exists for %s"
 msgstr ""
 "Siguiendo el estado de la transacción de la conexión: no existe ninguna "
 "transacción para %s"
 
-#: ../libgda/gda-connection.c:5422
-#: ../libgda/sqlite/virtual/gda-virtual-connection.c:235
+#: ../libgda/gda-connection.c:5429
+#: ../libgda/sqlite/virtual/gda-virtual-connection.c:236
 msgid "Internal error: invalid provider handle"
 msgstr "Error interno: manejo del proveedor no válido"
 
-#: ../libgda/gda-data-access-wrapper.c:486
-#: ../libgda/gda-data-meta-wrapper.c:577 ../libgda/gda-data-model-array.c:544
-#: ../libgda/gda-data-model-bdb.c:652 ../libgda/gda-data-model-bdb.c:756
-#: ../libgda/gda-data-model-bdb.c:785 ../libgda/gda-data-model-dir.c:776
-#: ../libgda/gda-data-model-dir.c:875 ../libgda/gda-data-model-dir.c:917
-#: ../libgda/gda-data-model-dsn-list.c:311 ../libgda/gda-data-model-iter.c:295
-#: ../libgda/gda-data-model-iter.c:1018 ../libgda/gda-data-proxy.c:3495
-#: ../libgda/gda-data-select.c:1197 ../libgda/gda-data-select.c:1693
-#: ../libgda/gda-data-select.c:2588 ../libgda/gda-data-select.c:2655
-#: ../libgda-ui/gdaui-combo.c:789
+#: ../libgda/gda-data-access-wrapper.c:487
+#: ../libgda/gda-data-meta-wrapper.c:578 ../libgda/gda-data-model-array.c:548
+#: ../libgda/gda-data-model-bdb.c:659 ../libgda/gda-data-model-bdb.c:763
+#: ../libgda/gda-data-model-bdb.c:792 ../libgda/gda-data-model-dir.c:784
+#: ../libgda/gda-data-model-dir.c:883 ../libgda/gda-data-model-dir.c:925
+#: ../libgda/gda-data-model-dsn-list.c:312 ../libgda/gda-data-model-iter.c:296
+#: ../libgda/gda-data-model-iter.c:1025 ../libgda/gda-data-proxy.c:3508
+#: ../libgda/gda-data-select.c:1201 ../libgda/gda-data-select.c:1697
+#: ../libgda/gda-data-select.c:2592 ../libgda/gda-data-select.c:2659
+#: ../libgda-ui/gdaui-combo.c:790
 #, c-format
 msgid "Column %d out of range (0-%d)"
 msgstr "Columna %d fuera de rango (0 - %d)"
 
-#: ../libgda/gda-data-access-wrapper.c:519
+#: ../libgda/gda-data-access-wrapper.c:520
 msgid "Can't set iterator's position"
 msgstr "No se puede establecer la posición del iterador"
 
-#: ../libgda/gda-data-access-wrapper.c:592
+#: ../libgda/gda-data-access-wrapper.c:593
 msgid "Can't access data"
 msgstr "No se puede acceder a los datos"
 
-#: ../libgda/gda-data-comparator.c:160
+#: ../libgda/gda-data-comparator.c:161
 msgid "Old data model"
 msgstr "Modelo de datos antiguo"
 
-#: ../libgda/gda-data-comparator.c:164
+#: ../libgda/gda-data-comparator.c:165
 msgid "New data model"
 msgstr "Modelo de datos nuevo"
 
-#: ../libgda/gda-data-comparator.c:441
+#: ../libgda/gda-data-comparator.c:448
 msgid "Missing original data model"
 msgstr "Falta el modelo de datos original"
 
-#: ../libgda/gda-data-comparator.c:446
+#: ../libgda/gda-data-comparator.c:453
 msgid "Missing new data model"
 msgstr "Falta el modelo de datos nuevo"
 
-#: ../libgda/gda-data-comparator.c:452
+#: ../libgda/gda-data-comparator.c:459
 msgid "Data models must support random access model"
 msgstr "Los modelos de datos deben soportar el modelo de acceso aleatorio"
 
-#: ../libgda/gda-data-comparator.c:461
+#: ../libgda/gda-data-comparator.c:468
 msgid "Data models to compare don't have the same number of columns"
 msgstr ""
 "Los modelos de datos para comparar no tienen el mismo número de columnas"
 
-#: ../libgda/gda-data-comparator.c:472
+#: ../libgda/gda-data-comparator.c:479
 #, c-format
 msgid "Type mismatch for column %d: '%s' and '%s'"
 msgstr "El tipo no coincide para la columna %d: «%s» y «%s»"
 
-#: ../libgda/gda-data-comparator.c:561 ../libgda/gda-data-comparator.c:597
+#: ../libgda/gda-data-comparator.c:568 ../libgda/gda-data-comparator.c:604
 msgid "Differences computation cancelled on signal handling"
 msgstr "Se cancelaron las diferencias de computación al manejar una señal"
 
-#: ../libgda/gda-data-model-array.c:170
+#: ../libgda/gda-data-model-array.c:171
 msgid "Whether data model can be modified"
 msgstr "Indica si el modelo de datos se puede modificar"
 
-#: ../libgda/gda-data-model-array.c:388 ../libgda/gda-data-model-array.c:535
-#: ../libgda/gda-data-model-array.c:622 ../libgda/gda-data-model-dir.c:787
-#: ../libgda/gda-data-model-dir.c:959 ../libgda/gda-data-model-dir.c:1313
-#: ../libgda/gda-data-model-dsn-list.c:319 ../libgda/gda-data-proxy.c:3444
-#: ../libgda/gda-data-proxy.c:3482 ../libgda/gda-data-select.c:1649
-#: ../libgda/gda-data-select.c:1703
+#: ../libgda/gda-data-model-array.c:390 ../libgda/gda-data-model-array.c:539
+#: ../libgda/gda-data-model-array.c:626 ../libgda/gda-data-model-dir.c:795
+#: ../libgda/gda-data-model-dir.c:968 ../libgda/gda-data-model-dir.c:1323
+#: ../libgda/gda-data-model-dsn-list.c:320 ../libgda/gda-data-proxy.c:3457
+#: ../libgda/gda-data-proxy.c:3495 ../libgda/gda-data-select.c:1653
+#: ../libgda/gda-data-select.c:1707
 #, c-format
 msgid "Row %d out of range (0-%d)"
 msgstr "Fila %d fuera de rango (0 - %d)"
 
-#: ../libgda/gda-data-model-array.c:392 ../libgda/gda-data-model-array.c:538
-#: ../libgda/gda-data-model-array.c:625 ../libgda/gda-data-model-dir.c:790
-#: ../libgda/gda-data-model-dir.c:962 ../libgda/gda-data-model-dir.c:1316
-#: ../libgda/gda-data-model-dsn-list.c:322 ../libgda/gda-data-proxy.c:3447
-#: ../libgda/gda-data-proxy.c:3485 ../libgda/gda-data-select.c:1652
-#: ../libgda/gda-data-select.c:1706
+#: ../libgda/gda-data-model-array.c:394 ../libgda/gda-data-model-array.c:542
+#: ../libgda/gda-data-model-array.c:629 ../libgda/gda-data-model-dir.c:798
+#: ../libgda/gda-data-model-dir.c:971 ../libgda/gda-data-model-dir.c:1326
+#: ../libgda/gda-data-model-dsn-list.c:323 ../libgda/gda-data-proxy.c:3460
+#: ../libgda/gda-data-proxy.c:3498 ../libgda/gda-data-select.c:1656
+#: ../libgda/gda-data-select.c:1710
 #, c-format
 msgid "Row %d not found (empty data model)"
 msgstr "No se encontró la fila %d (modelo de datos vacío)"
 
-#: ../libgda/gda-data-model-array.c:528
+#: ../libgda/gda-data-model-array.c:532
 msgid "No row in data model"
 msgstr "No hay ninguna fila en el modelo de datos"
 
-#: ../libgda/gda-data-model-array.c:560
+#: ../libgda/gda-data-model-array.c:564
 msgid "Data model has no data"
 msgstr "El modelo de datos no tiene datos"
 
-#: ../libgda/gda-data-model-array.c:615 ../libgda/gda-data-model-array.c:659
-#: ../libgda/gda-data-model-array.c:698 ../libgda/gda-data-model-array.c:733
+#: ../libgda/gda-data-model-array.c:619 ../libgda/gda-data-model-array.c:663
+#: ../libgda/gda-data-model-array.c:702 ../libgda/gda-data-model-array.c:737
 msgid "Attempting to modify a read-only data model"
 msgstr "Intentando modificar un modelo de datos de sólo lectura"
 
-#: ../libgda/gda-data-model-array.c:665 ../libgda/gda-data-model-array.c:704
+#: ../libgda/gda-data-model-array.c:669 ../libgda/gda-data-model-array.c:708
 msgid "Too many values in list"
 msgstr "Demasiados valores en la lista"
 
-#: ../libgda/gda-data-model-array.c:758
+#: ../libgda/gda-data-model-array.c:762
 msgid "Row not found in data model"
 msgstr "No se encontró la fila en el modelo de datos"
 
-#: ../libgda/gda-data-model-bdb.c:263
+#: ../libgda/gda-data-model-bdb.c:264
 #, c-format
 msgid "Could not load the Berkeley DB library: %s"
 msgstr "No se pudo cargar el archivo «%s»"
 
-#: ../libgda/gda-data-model-bdb.c:267 ../libgda/gda-data-model-bdb.c:271
+#: ../libgda/gda-data-model-bdb.c:268 ../libgda/gda-data-model-bdb.c:272
 #, c-format
 msgid "Could not load the '%s' symbol from the Berkeley DB library"
 msgstr "No se pudo cargar el símbolo «%s» de la biblioteca Berkely DB"
 
-#: ../libgda/gda-data-model-bdb.c:294 ../libgda/gda-data-model-bdb.c:365
+#: ../libgda/gda-data-model-bdb.c:295 ../libgda/gda-data-model-bdb.c:369
 msgid "Berkeley DB library not loaded"
 msgstr "La biblioteca Berkeley DB no está cargada"
 
-#: ../libgda/gda-data-model-bdb.c:690 ../libgda/gda-data-model-bdb.c:723
-#: ../libgda/gda-data-model-bdb.c:827 ../libgda/gda-data-model-bdb.c:915
+#: ../libgda/gda-data-model-bdb.c:697 ../libgda/gda-data-model-bdb.c:730
+#: ../libgda/gda-data-model-bdb.c:834 ../libgda/gda-data-model-bdb.c:922
 #, c-format
 msgid ""
 "Custom BDB model implementation is not complete: the '%s' method is missing"
@@ -878,102 +878,102 @@ msgstr ""
 "La implementación del modelo personalizado BDB no está completa: falta el "
 "método «%s»"
 
-#: ../libgda/gda-data-model-bdb.c:854 ../libgda/gda-data-model-bdb.c:940
+#: ../libgda/gda-data-model-bdb.c:861 ../libgda/gda-data-model-bdb.c:947
 #, c-format
 msgid "Expected GdaBinary value, got %s"
 msgstr "Se esperaba un valor GdaBinary, se obtuvo %s"
 
-#: ../libgda/gda-data-model-bdb.c:900
+#: ../libgda/gda-data-model-bdb.c:907
 msgid "Key modification is not supported"
 msgstr "No se soporta la modificación de claves"
 
-#: ../libgda/gda-data-model.c:620
+#: ../libgda/gda-data-model.c:621
 msgid "Data model does not support getting individual value"
 msgstr "El modelo de datos no soporta la obtención de un valor individual"
 
-#: ../libgda/gda-data-model.c:663 ../libgda/gda-data-model.c:673
+#: ../libgda/gda-data-model.c:664 ../libgda/gda-data-model.c:674
 #, c-format
 msgid "Data model returned value of invalid '%s' type"
 msgstr "El modelo de datos devolvió un valor de tipo «%s» no válido"
 
-#: ../libgda/gda-data-model.c:670
+#: ../libgda/gda-data-model.c:671
 msgid "Data model returned invalid NULL value"
 msgstr "El modelo de datos devolvió un valor NULL no válido"
 
-#: ../libgda/gda-data-model.c:730
+#: ../libgda/gda-data-model.c:731
 msgid "Data model does not support setting individual value"
 msgstr "El modelo de datos no soporta establecer un valor individual"
 
-#: ../libgda/gda-data-model.c:763
+#: ../libgda/gda-data-model.c:764
 msgid "Data model does not support setting values"
 msgstr "El modelo de datos no soporta los valores configurados"
 
-#: ../libgda/gda-data-model.c:826 ../libgda/gda-data-model.c:860
+#: ../libgda/gda-data-model.c:827 ../libgda/gda-data-model.c:861
 msgid "Data model does not support row append"
 msgstr "El modelo de datos no soporta agregación de filas"
 
-#: ../libgda/gda-data-model.c:851
+#: ../libgda/gda-data-model.c:852
 msgid "Model does not allow row insertion"
 msgstr "El modelo no permite inserción de filas"
 
-#: ../libgda/gda-data-model.c:886
+#: ../libgda/gda-data-model.c:887
 msgid "Model does not allow row deletion"
 msgstr "El modelo no permite borrado de filas"
 
-#: ../libgda/gda-data-model.c:895
+#: ../libgda/gda-data-model.c:896
 msgid "Data model does not support row removal"
 msgstr "El modelo de datos no soporta la eliminación de filas"
 
-#: ../libgda/gda-data-model.c:1038 ../libgda/gda-data-model.c:1079
-#: ../libgda/gda-data-model.c:1093
+#: ../libgda/gda-data-model.c:1039 ../libgda/gda-data-model.c:1080
+#: ../libgda/gda-data-model.c:1094
 #, c-format
 msgid "The '%s' parameter must hold a string value, ignored."
 msgstr "El parámetro «%s» debe contener un valor de cadena, ignorado."
 
-#: ../libgda/gda-data-model.c:1102 ../libgda/gda-data-model.c:1112
-#: ../libgda/gda-data-model.c:1122 ../libgda/gda-data-model.c:1160
-#: ../libgda/gda-data-model.c:1253
+#: ../libgda/gda-data-model.c:1103 ../libgda/gda-data-model.c:1113
+#: ../libgda/gda-data-model.c:1123 ../libgda/gda-data-model.c:1163
+#: ../libgda/gda-data-model.c:1256
 #, c-format
 msgid "The '%s' parameter must hold a boolean value, ignored."
 msgstr "El parámetro «%s» debe contener un valor booleano, ignorado."
 
-#: ../libgda/gda-data-model.c:1261
+#: ../libgda/gda-data-model.c:1264
 #, c-format
 msgid "File '%s' already exists"
 msgstr "El archivo «%s» ya existe"
 
-#: ../libgda/gda-data-model.c:1401
+#: ../libgda/gda-data-model.c:1404
 msgid "Exported Data"
 msgstr "Datos exportados"
 
-#: ../libgda/gda-data-model.c:1518
+#: ../libgda/gda-data-model.c:1521
 #, c-format
 msgid "Expected tag <gda_value> or <gda_array_value>, got <%s>, ignoring"
 msgstr ""
 "Se esperaba la etiqueta <gda_value> o <gda_array_value>, se obtuvo <%s>, "
 "ignorando"
 
-#: ../libgda/gda-data-model.c:1549
+#: ../libgda/gda-data-model.c:1552
 msgid "Cannot retrieve column data type (type is UNKNOWN or not specified)"
 msgstr ""
 "No puede recuperar el tipo de datos de la columna (el tipo es DESCONOCIDO o "
 "no ha sido especificado)"
 
-#: ../libgda/gda-data-model.c:1635
+#: ../libgda/gda-data-model.c:1638
 #, c-format
 msgid "Expected tag <gda_array_data>, got <%s>"
 msgstr "Se esperaba la etiqueta <gda_array_data>, se obtuvo <%s>"
 
-#: ../libgda/gda-data-model.c:1698
+#: ../libgda/gda-data-model.c:1701
 msgid "Could not get an iterator for source data model"
 msgstr "No se ha pudo obtener un iterador para el modelo de datos de origen"
 
-#: ../libgda/gda-data-model.c:1715
+#: ../libgda/gda-data-model.c:1718
 #, c-format
 msgid "Inexistent column in source data model: %d"
 msgstr "Columna inexistente en el modelo de datos origen: %d"
 
-#: ../libgda/gda-data-model.c:1729
+#: ../libgda/gda-data-model.c:1732
 #, c-format
 msgid ""
 "Destination column %d can't be NULL but has no correspondence in the source "
@@ -982,7 +982,7 @@ msgstr ""
 "La columna de destino %d no puede ser NULL pero no tiene ninguna "
 "correspondencia en el modelo de datos origen"
 
-#: ../libgda/gda-data-model.c:1739
+#: ../libgda/gda-data-model.c:1742
 #, c-format
 msgid ""
 "Destination column %d has a gda type (%s) incompatible with source column %d "
@@ -991,90 +991,90 @@ msgstr ""
 "La columna de destino %d tiene un tipo gda (%s) incompatible con el  de la "
 "columna de origen %d (tipo %s)"
 
-#: ../libgda/gda-data-model.c:1836
+#: ../libgda/gda-data-model.c:1839
 #, c-format
 msgid "Can't transform '%s' from GDA type %s to GDA type %s"
 msgstr "No se puede transformar «%s» del tipo GDA %s al tipo GDA %s"
 
-#: ../libgda/gda-data-model.c:2030
+#: ../libgda/gda-data-model.c:2033
 #, c-format
 msgid "Could not dump data model's attributes: %s"
 msgstr "No se pudo añadir el modelo de datos BDB a la conexión: %s"
 
-#: ../libgda/gda-data-model.c:2038
+#: ../libgda/gda-data-model.c:2041
 #, c-format
 msgid "Could not dump data model's contents: %s"
 msgstr "No se pudo volcar el contenido del modelo de datos: %s"
 
-#: ../libgda/gda-data-model.c:2286
+#: ../libgda/gda-data-model.c:2289
 msgid "Data model does not support backward cursor move, not displaying data"
 msgstr ""
 "El modelo de datos no soporta acceso hacia atrás, no se mostrarán los datos"
 
-#: ../libgda/gda-data-model.c:2405
+#: ../libgda/gda-data-model.c:2408
 #, c-format
 msgid "(%d row)\n"
 msgid_plural "(%d rows)\n"
 msgstr[0] "(%d fila)\n"
 msgstr[1] "(%d fila)\n"
 
-#: ../libgda/gda-data-model-dir.c:859
+#: ../libgda/gda-data-model-dir.c:867
 msgid "Row not found"
 msgstr "Fila no encontrada"
 
-#: ../libgda/gda-data-model-dir.c:984 ../libgda/gda-data-model-dir.c:986
+#: ../libgda/gda-data-model-dir.c:993 ../libgda/gda-data-model-dir.c:995
 msgid "Column cannot be modified"
 msgstr "La columna no se puede modificar"
 
-#: ../libgda/gda-data-model-dir.c:999 ../libgda/gda-data-model-dir.c:1001
-#: ../libgda/gda-data-model-dir.c:1210 ../libgda/gda-data-model-dir.c:1212
+#: ../libgda/gda-data-model-dir.c:1008 ../libgda/gda-data-model-dir.c:1010
+#: ../libgda/gda-data-model-dir.c:1219 ../libgda/gda-data-model-dir.c:1221
 msgid "New path must be a subpath of the base directory"
 msgstr "La nueva ruta debe ser una subruta del directorio base"
 
-#: ../libgda/gda-data-model-dir.c:1045 ../libgda/gda-data-model-dir.c:1089
+#: ../libgda/gda-data-model-dir.c:1054 ../libgda/gda-data-model-dir.c:1098
 #, c-format
 msgid "Could not rename file '%s' to '%s'"
 msgstr "No se pudo renombrar el archivo «%s» a «%s»"
 
-#: ../libgda/gda-data-model-dir.c:1069
+#: ../libgda/gda-data-model-dir.c:1078
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "No se pudo crear el directorio «%s»"
 
-#: ../libgda/gda-data-model-dir.c:1138
+#: ../libgda/gda-data-model-dir.c:1147
 #, c-format
 msgid "Could not overwrite contents of file '%s'"
 msgstr "No se pudo sobreescribir el contenido del archivo «%s»"
 
-#: ../libgda/gda-data-model-dir.c:1156 ../libgda/gda-data-model-dir.c:1157
+#: ../libgda/gda-data-model-dir.c:1165 ../libgda/gda-data-model-dir.c:1166
 msgid "Wrong type of data"
 msgstr "Tipo de dato erróneo"
 
-#: ../libgda/gda-data-model-dir.c:1198 ../libgda/gda-data-model-dir.c:1200
+#: ../libgda/gda-data-model-dir.c:1207 ../libgda/gda-data-model-dir.c:1209
 msgid "Column cannot be set"
 msgstr "No se puede establecer la columna"
 
-#: ../libgda/gda-data-model-dir.c:1271
+#: ../libgda/gda-data-model-dir.c:1280
 #, c-format
 msgid "Cannot set contents of filename '%s'"
 msgstr "No se puede establecer el contenido del archivo «%s»"
 
-#: ../libgda/gda-data-model-dir.c:1282
+#: ../libgda/gda-data-model-dir.c:1291
 #, c-format
 msgid "Cannot create directory '%s'"
 msgstr "No se puede crear el directorio «%s»"
 
-#: ../libgda/gda-data-model-dir.c:1290 ../libgda/gda-data-model-dir.c:1292
+#: ../libgda/gda-data-model-dir.c:1299 ../libgda/gda-data-model-dir.c:1301
 msgid "Cannot add row: filename missing"
 msgstr "No se puede añadir una fila: falta el nombre de archivo"
 
-#: ../libgda/gda-data-model-dir.c:1332
+#: ../libgda/gda-data-model-dir.c:1342
 #, c-format
 msgid "Cannot remove file '%s'"
 msgstr "No se puede eliminar el archivo «%s»"
 
 #: ../libgda/gda-data-model-dsn-list.c:105
-#: ../libgda/gda-data-model-dsn-list.c:106 ../tools/gda-sql.c:2698
+#: ../libgda/gda-data-model-dsn-list.c:106 ../tools/gda-sql.c:2700
 msgid "DSN"
 msgstr "DSN"
 
@@ -1094,141 +1094,142 @@ msgstr "Global"
 msgid "List of defined data sources"
 msgstr "Lista de las fuentes de datos definidas"
 
-#: ../libgda/gda-data-model-import.c:447
+#: ../libgda/gda-data-model-import.c:448
 #, c-format
 msgid "The '%s' option must hold a string value, ignored."
 msgstr "La opción «%s» debe mantener una cadena de valor, ignorado."
 
-#: ../libgda/gda-data-model-import.c:463
+#: ../libgda/gda-data-model-import.c:464
 #, c-format
 msgid "The '%s' option must hold a boolean value, ignored."
 msgstr "La opción «%s» debe mantener un valor booleano, ignorado."
 
-#: ../libgda/gda-data-model-import.c:572
+#: ../libgda/gda-data-model-import.c:573
 msgid "\"options\" property is not a GdaSet object"
 msgstr "La propiedad \"options\" no es un objeto GdaSet"
 
-#: ../libgda/gda-data-model-import.c:835
+#: ../libgda/gda-data-model-import.c:836
 #, c-format
 msgid "The '%s' option must hold a GType value, ignored."
 msgstr "La opción «%s» debe mantener un valor GType, ignorado."
 
-#: ../libgda/gda-data-model-import.c:901
+#: ../libgda/gda-data-model-import.c:902
 #, c-format
 msgid "Character conversion at line %d, error: %s"
 msgstr "La conversión de caracteres en la línea %d, error: %s"
 
-#: ../libgda/gda-data-model-import.c:904
-#: ../libgda/sqlite/gda-sqlite-provider.c:778
-#: ../providers/bdb/gda-bdb-provider.c:210
-#: ../tools/browser/common/gdaui-data-import.c:177
+#: ../libgda/gda-data-model-import.c:905
+#: ../libgda/sqlite/gda-sqlite-provider.c:779
+#: ../providers/bdb/gda-bdb-provider.c:212
+#: ../tools/browser/common/gdaui-data-import.c:178
+#: ../tools/browser/data-manager/data-widget.c:837
 msgid "no detail"
 msgstr "Sin detalles"
 
-#: ../libgda/gda-data-model-import.c:942
+#: ../libgda/gda-data-model-import.c:943
 #, c-format
 msgid "Could not convert string '%s' to a '%s' value"
 msgstr "No se puede convertir la cadena «%s» a un valor «%s»"
 
-#: ../libgda/gda-data-model-import.c:998
+#: ../libgda/gda-data-model-import.c:999
 #, c-format
 msgid "Error while parsing CSV file: %s"
 msgstr "Error al analizar el archivo CSV: %s"
 
 #. error
-#: ../libgda/gda-data-model-import.c:1101
+#: ../libgda/gda-data-model-import.c:1102
 msgid "Failed to read node in XML file"
 msgstr "Falló al leer el nodo en el archivo XML"
 
-#: ../libgda/gda-data-model-import.c:1120
+#: ../libgda/gda-data-model-import.c:1121
 #, c-format
 msgid "Expected <gda_array> node in XML file, got <%s>"
 msgstr "Se esperaba un nodo <gda_array> en el archivo XML, se obtuvo <%s>"
 
-#: ../libgda/gda-data-model-import.c:1164
-#: ../libgda/gda-data-model-import.c:1483
+#: ../libgda/gda-data-model-import.c:1165
+#: ../libgda/gda-data-model-import.c:1484
 msgid "No \"gdatype\" attribute specified in <gda_array_field>"
 msgstr "No hay un atributo \"gdatype\" especificado en <gda_array_field>"
 
-#: ../libgda/gda-data-model-import.c:1211
+#: ../libgda/gda-data-model-import.c:1212
 msgid "Expected <gda_array_field> in <gda_array>"
 msgstr "Se esperaba <gda_array_field> en <gda_array>"
 
-#: ../libgda/gda-data-model-import.c:1245
+#: ../libgda/gda-data-model-import.c:1246
 #, c-format
 msgid "Expected <gda_array_data> in <gda_array>, got <%s>"
 msgstr "Se esperaba <gda_array_data> en <gda_array>, se obtuvo <%s>"
 
-#: ../libgda/gda-data-model-import.c:1247
+#: ../libgda/gda-data-model-import.c:1248
 msgid "Expected <gda_array_data> in <gda_array>"
 msgstr "Se esperaba <gda_array_data>, en <gda_array>"
 
-#: ../libgda/gda-data-model-import.c:1259
+#: ../libgda/gda-data-model-import.c:1260
 msgid "Can't read the contents of the <gda_array_data> node"
 msgstr "No se puede leer el contenido del nodo <gda_array_data>"
 
-#: ../libgda/gda-data-model-import.c:1308
+#: ../libgda/gda-data-model-import.c:1309
 #, c-format
 msgid "Expected <gda_array_row> in <gda_array_data>, got <%s>"
 msgstr "Se esperaba <gda_array_row> en <gda_array_data>, se obtuvo <%s>"
 
-#: ../libgda/gda-data-model-import.c:1332
+#: ../libgda/gda-data-model-import.c:1333
 msgid "Row has too many values (which are ignored)"
 msgstr "La fila tiene demasiados valores (los cuales se ignoran)"
 
-#: ../libgda/gda-data-model-import.c:1379
+#: ../libgda/gda-data-model-import.c:1380
 #, c-format
 msgid "Could not convert '%s' to a value of type %s"
 msgstr "No se puede convertir '%s' a un valor de tipo %s"
 
-#: ../libgda/gda-data-model-import.c:1452
+#: ../libgda/gda-data-model-import.c:1453
 #, c-format
 msgid "Expected <gda_array> node but got <%s>"
 msgstr "Se esperaba <gda_array> pero se obtuvo <%s>"
 
-#: ../libgda/gda-data-model-import.c:1530
+#: ../libgda/gda-data-model-import.c:1531
 msgid "No <gda_array_field> specified in <gda_array>"
 msgstr ""
 "No hay especificado ningún <gda_array_field> especificado en <gda_array>"
 
-#: ../libgda/gda-data-model-import.c:1708
+#: ../libgda/gda-data-model-import.c:1709
 msgid "Data model does not support random access"
 msgstr "El modelo de datos no soporta acceso aleatorio"
 
-#: ../libgda/gda-data-model-import.c:1764
+#: ../libgda/gda-data-model-import.c:1765
 #, c-format
 msgid "Row at line %d does not have enough values, completed with NULL values"
 msgstr ""
 "La fila en la línea %d no tiene valores suficientes, se completaron con "
 "valores NULL"
 
-#: ../libgda/gda-data-model-import.c:1784
+#: ../libgda/gda-data-model-import.c:1785
 #, c-format
 msgid "Row at line %d does not have enough values (which are thus ignored)"
 msgstr ""
 "La fila en la línea %d no tiene suficientes valores (los cuales se ignoran)"
 
-#: ../libgda/gda-data-model-import.c:1856
-#: ../libgda/gda-data-model-import.c:1929
+#: ../libgda/gda-data-model-import.c:1857
+#: ../libgda/gda-data-model-import.c:1930
 #, c-format
 msgid "Could not set iterator's value: %s"
 msgstr "No se puede establecer el valor del iterador: %s"
 
-#: ../libgda/gda-data-model-iter.c:301 ../libgda/gda-data-model-iter.c:308
+#: ../libgda/gda-data-model-iter.c:302 ../libgda/gda-data-model-iter.c:309
 msgid "GdaDataModel refused value change"
 msgstr "GdaDataModel rechazó el cambio de valor"
 
-#: ../libgda/gda-data-proxy.c:912
+#: ../libgda/gda-data-proxy.c:914
 msgid "GdaDataProxy can't handle non random access data models"
 msgstr ""
 "GdaDataProxy no puede manipular modelos de acceso a datos no aleatorios"
 
-#: ../libgda/gda-data-proxy.c:1538 ../libgda/gda-data-proxy.c:3900
+#: ../libgda/gda-data-proxy.c:1550 ../libgda/gda-data-proxy.c:3913
 msgid ""
 "The first row is an empty row artificially prepended and cannot be removed"
 msgstr "La primera fila es una fila vacía al comienzo y no se puede eliminar"
 
-#: ../libgda/gda-data-proxy.c:2048
+#: ../libgda/gda-data-proxy.c:2062
 #, c-format
 msgid ""
 "Proxied data model reports the modifications as accepted, yet did not emit "
@@ -1236,11 +1237,11 @@ msgid ""
 "signal. This is a bug of the %s's implementation (please report a bug)."
 msgstr ""
 "El modelo de datos representado informa de las modificaciones como aceptadas "
-"aunque no emitió la correspondiente señal «fila insertada», «fila actualizada» "
-"o «fila eliminada». Esto es un error de la implementación de %s (informe del "
-"error)."
+"aunque no emitió la correspondiente señal «fila insertada», «fila "
+"actualizada» o «fila eliminada». Esto es un error de la implementación de %s "
+"(informe del error)."
 
-#: ../libgda/gda-data-proxy.c:2084
+#: ../libgda/gda-data-proxy.c:2098
 #, c-format
 msgid ""
 "Proxied data model reports the modifications as accepted, yet did not emit "
@@ -1248,133 +1249,133 @@ msgid ""
 "signal. This may be a bug of the %s's implementation (please report a bug)."
 msgstr ""
 "El modelo de datos representado informa de las modificaciones como aceptadas "
-"aunque no emitió la correspondiente señal «fila insertada», «fila actualizada» "
-"o «fila eliminada». Esto puede ser un error de la implementación de %s "
-"(informe del error)."
+"aunque no emitió la correspondiente señal «fila insertada», «fila "
+"actualizada» o «fila eliminada». Esto puede ser un error de la "
+"implementación de %s (informe del error)."
 
-#: ../libgda/gda-data-proxy.c:2931 ../tools/gda-sql.c:3253
+#: ../libgda/gda-data-proxy.c:2944 ../tools/gda-sql.c:3261
 msgid "Could not create virtual connection"
 msgstr "No se pudo crear la conexión virtual"
 
-#: ../libgda/gda-data-proxy.c:2972 ../libgda/gda-data-proxy.c:2985
+#: ../libgda/gda-data-proxy.c:2985 ../libgda/gda-data-proxy.c:2998
 msgid "Error in filter expression"
 msgstr "Error en la expresión de filtrado"
 
-#: ../libgda/gda-data-proxy.c:3099 ../libgda/gda-data-select.c:1445
+#: ../libgda/gda-data-proxy.c:3112 ../libgda/gda-data-select.c:1449
 msgid "Incorrect filter expression"
 msgstr "Expresión de filtrado incorrecta"
 
-#: ../libgda/gda-data-proxy.c:3655
+#: ../libgda/gda-data-proxy.c:3668
 msgid ""
 "The first row is an empty row artificially prepended and cannot be altered"
 msgstr "La primera fila es una fila vacía al comienzo y no se puede alterar"
 
-#: ../libgda/gda-data-proxy.c:3677
+#: ../libgda/gda-data-proxy.c:3690
 #, c-format
 msgid "Wrong value type: expected '%s' and got '%s'"
 msgstr "Tipo de valor erróneo: se esperaba «%s» y se obtuvo «%s»"
 
-#: ../libgda/gda-data-proxy.c:3763
+#: ../libgda/gda-data-proxy.c:3776
 #, c-format
 msgid "Trying to change read-only column: %d"
 msgstr "intentando cambiar una columna de sólo lectura: %d"
 
-#: ../libgda/gda-data-proxy.c:3800
+#: ../libgda/gda-data-proxy.c:3813
 #, c-format
 msgid "Value type mismatch %s instead of %s"
 msgstr "El tipo del valor no coincide %s en lugar de %s"
 
-#: ../libgda/gda-data-select.c:367
+#: ../libgda/gda-data-select.c:369
 #, c-format
 msgid "Could not re-run SELECT statement: %s"
 msgstr "No se pudo volver a ejecutar la declaración SELECT: %s"
 
-#: ../libgda/gda-data-select.c:953
+#: ../libgda/gda-data-select.c:957
 msgid "Incorrect SQL expression"
 msgstr "Expresión SQL incorrecta"
 
-#: ../libgda/gda-data-select.c:978
+#: ../libgda/gda-data-select.c:982
 msgid "Internal error: the \"prepared-stmt\" property has not been set"
 msgstr "Error interno: la propiedad «prepared-stmt» no se ha establecido"
 
-#: ../libgda/gda-data-select.c:985
+#: ../libgda/gda-data-select.c:989
 msgid "Can't get the prepared statement's actual statement"
 msgstr "No se puede obtener la declaración preparada de la declaración actual"
 
-#: ../libgda/gda-data-select.c:991
+#: ../libgda/gda-data-select.c:995
 msgid "Unsupported type of SELECT statement"
 msgstr "Tipo de declaración SELECT no soportada"
 
-#: ../libgda/gda-data-select.c:1060
+#: ../libgda/gda-data-select.c:1064
 msgid "INSERT statement must contain values to insert"
 msgstr "La declaración INSERT necesita valores que insertar"
 
-#: ../libgda/gda-data-select.c:1066
+#: ../libgda/gda-data-select.c:1070
 msgid "INSERT statement must insert only one row"
 msgstr "La declaración INSERT debe insertar solo una fila"
 
-#: ../libgda/gda-data-select.c:1093
+#: ../libgda/gda-data-select.c:1097
 msgid "DELETE statement must have a WHERE part"
 msgstr "La declaración DELETE debe contener una condición WHERE"
 
-#: ../libgda/gda-data-select.c:1133
+#: ../libgda/gda-data-select.c:1137
 msgid "UPDATE statement must have a WHERE part"
 msgstr "La declaración UPDATE debe contener una condición WHERE"
 
-#: ../libgda/gda-data-select.c:1187
+#: ../libgda/gda-data-select.c:1191
 #, c-format
 msgid "Modification statement uses an unknown '%s' parameter"
 msgstr "La modificación de la declaración usa un parámetro «%s» desconocido"
 
-#: ../libgda/gda-data-select.c:1209
+#: ../libgda/gda-data-select.c:1213
 #, c-format
 msgid "Modification statement's  '%s' parameter is a %s when it should be a %s"
 msgstr ""
-"La modificación del parámetro «%s» de la declaración es %s cuando debería ser "
-"%s"
+"La modificación del parámetro «%s» de la declaración es %s cuando debería "
+"ser %s"
 
-#: ../libgda/gda-data-select.c:1246
+#: ../libgda/gda-data-select.c:1250
 msgid "Modification statement must be an INSERT, UPDATE or DELETE statement"
 msgstr ""
 "La declaración de modificación debe ser una declaración INSERT, UPDATE o "
 "DELETE"
 
-#: ../libgda/gda-data-select.c:1294 ../libgda/gda-data-select.c:1500
-#: ../libgda/gda-data-select.c:3320
+#: ../libgda/gda-data-select.c:1298 ../libgda/gda-data-select.c:1504
+#: ../libgda/gda-data-select.c:3326
 msgid "No connection to use"
 msgstr "No hay conexión para usar"
 
-#: ../libgda/gda-data-select.c:1340
+#: ../libgda/gda-data-select.c:1344
 msgid "Invalid unique row condition (only equal operators are allowed)"
 msgstr ""
 "Condición de fila única no válida (solo se permiten operadores iguales)"
 
-#: ../libgda/gda-data-select.c:1372 ../libgda/gda-data-select.c:1427
+#: ../libgda/gda-data-select.c:1376 ../libgda/gda-data-select.c:1431
 msgid "Unique row condition has already been specified"
 msgstr "La condición de fila única ya ha sido especificada"
 
-#: ../libgda/gda-data-select.c:1509 ../libgda/gda-data-select.c:1520
+#: ../libgda/gda-data-select.c:1513 ../libgda/gda-data-select.c:1524
 msgid "No table to select from in SELECT statement"
 msgstr "No hay tabla para seleccionar en la declaración SELECT"
 
-#: ../libgda/gda-data-select.c:1514
+#: ../libgda/gda-data-select.c:1518
 msgid "SELECT statement uses more than one table to select from"
 msgstr ""
 "La declaración SELECT involucra más de una tabla o expresión de la que "
 "seleccionar"
 
-#: ../libgda/gda-data-select.c:1686 ../libgda/gda-data-select.c:2405
-#: ../libgda/gda-data-select.c:2575 ../libgda/gda-data-select.c:2727
-#: ../libgda/gda-data-select.c:2815 ../libgda/gda-data-select.c:3009
+#: ../libgda/gda-data-select.c:1690 ../libgda/gda-data-select.c:2409
+#: ../libgda/gda-data-select.c:2579 ../libgda/gda-data-select.c:2731
+#: ../libgda/gda-data-select.c:2819 ../libgda/gda-data-select.c:3014
 msgid "Data model does only support random access"
 msgstr "Los modelos de datos soportan acceso aleatorio"
 
-#: ../libgda/gda-data-select.c:1721
+#: ../libgda/gda-data-select.c:1725
 msgid "Unable to retrieve data after modifications"
 msgstr "No se pudieron obtener los datos después de las modificaciones"
 
-#: ../libgda/gda-data-select.c:1740 ../libgda/gda-data-select.c:1748
-#: ../libgda/gda-data-select.c:1770
+#: ../libgda/gda-data-select.c:1744 ../libgda/gda-data-select.c:1752
+#: ../libgda/gda-data-select.c:1774
 msgid ""
 "Unable to retrieve data after modifications, no further modification will be "
 "allowed"
@@ -1382,85 +1383,85 @@ msgstr ""
 "No se pudieron obtener los datos después de las modificaciones, no se "
 "permitirán futuras modificaciones"
 
-#: ../libgda/gda-data-select.c:1805
+#: ../libgda/gda-data-select.c:1809
 #, c-format
 msgid "Unable to get value for row %d and column %d"
 msgstr "No se pudo obtener el valor para la fila %d y columna %d"
 
-#: ../libgda/gda-data-select.c:2031 ../libgda/gda-data-select.c:2040
-#: ../libgda/gda-data-select.c:2050
+#: ../libgda/gda-data-select.c:2035 ../libgda/gda-data-select.c:2044
+#: ../libgda/gda-data-select.c:2054
 #, c-format
 msgid "Could not change iter's value for column %d: %s"
 msgstr "No se pudo cambiar el valor de iteración para la columna %d: %s"
 
-#: ../libgda/gda-data-select.c:2045
+#: ../libgda/gda-data-select.c:2049
 msgid "Allowed GdaHolder's value to be NULL for the iterator to be updated"
 msgstr ""
 "Permitir que el valor del GdaHolder sea nulo (NULL) para la actualización "
 "del iterador"
 
-#: ../libgda/gda-data-select.c:2125 ../libgda/gda-data-select.c:2218
+#: ../libgda/gda-data-select.c:2129 ../libgda/gda-data-select.c:2222
 msgid "Some columns can't be modified"
 msgstr "Algunas columnas no se pueden modificar"
 
-#: ../libgda/gda-data-select.c:2272
+#: ../libgda/gda-data-select.c:2276
 msgid "Internal error: can't get the prepared statement's actual statement"
 msgstr ""
 "Error interno: no se puede obtener la consulta actual de la consulta "
 "preparada"
 
-#: ../libgda/gda-data-select.c:2312
+#: ../libgda/gda-data-select.c:2316
 msgid "Unable to identify a way to fetch a single row"
 msgstr "No se pudo identificar una manera de conseguir una sola fila"
 
-#: ../libgda/gda-data-select.c:2319
+#: ../libgda/gda-data-select.c:2323
 msgid "Can only operate on non compound SELECT statements"
 msgstr "Sólo se puede operar con declaraciones SELECT no compuestas"
 
-#: ../libgda/gda-data-select.c:2400 ../libgda/gda-data-select.c:2570
-#: ../libgda/gda-data-select.c:2641 ../libgda/gda-data-select.c:2722
-#: ../libgda/gda-data-select.c:2810 ../libgda/gda-data-select.c:3004
+#: ../libgda/gda-data-select.c:2404 ../libgda/gda-data-select.c:2574
+#: ../libgda/gda-data-select.c:2645 ../libgda/gda-data-select.c:2726
+#: ../libgda/gda-data-select.c:2814 ../libgda/gda-data-select.c:3009
 msgid "Modifications are not allowed anymore"
 msgstr "Ya no se soportan modificaciones"
 
-#: ../libgda/gda-data-select.c:2410 ../libgda/gda-data-select.c:2580
-#: ../libgda/gda-data-select.c:2646 ../libgda/gda-data-select.c:2732
+#: ../libgda/gda-data-select.c:2414 ../libgda/gda-data-select.c:2584
+#: ../libgda/gda-data-select.c:2650 ../libgda/gda-data-select.c:2736
 msgid "No UPDATE statement provided"
 msgstr "No se ha proporcionado de una declaración UPDATE"
 
-#: ../libgda/gda-data-select.c:2450
+#: ../libgda/gda-data-select.c:2454
 msgid "Could not get iterator's value"
 msgstr "No se pudo obtener el valor del iterador"
 
-#: ../libgda/gda-data-select.c:2607 ../libgda/gda-data-select.c:2674
+#: ../libgda/gda-data-select.c:2611 ../libgda/gda-data-select.c:2678
 #, c-format
 msgid "Column %d can't be modified"
 msgstr "No se puede modificar la columna %d"
 
-#: ../libgda/gda-data-select.c:2740
+#: ../libgda/gda-data-select.c:2744
 #, c-format
 msgid "Too many values (%d as maximum)"
 msgstr "Demasiados valores (%d es el máximo)"
 
-#: ../libgda/gda-data-select.c:2820
+#: ../libgda/gda-data-select.c:2824
 msgid "No INSERT statement provided"
 msgstr "No se ha proporcionado una declaración INSERT"
 
-#: ../libgda/gda-data-select.c:2825
+#: ../libgda/gda-data-select.c:2829
 msgid "Cannot add a row because the number of rows in unknown"
 msgstr "No se puede insertar una fila porque se desconoce el número de filas"
 
-#: ../libgda/gda-data-select.c:2854
-#: ../libgda/sql-parser/gda-statement-struct-insert.c:385
-#: ../libgda/sql-parser/gda-statement-struct-insert.c:394
+#: ../libgda/gda-data-select.c:2858
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:391
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:400
 msgid "Missing values to insert in INSERT statement"
 msgstr "Faltan los valores para insertar en la declaración INSERT"
 
-#: ../libgda/gda-data-select.c:3014
+#: ../libgda/gda-data-select.c:3019
 msgid "No DELETE statement provided"
 msgstr "No se ha proporcionado una declaración DELETE"
 
-#: ../libgda/gda-data-select.c:3444
+#: ../libgda/gda-data-select.c:3450
 #, c-format
 msgid ""
 "An error has occurred, the value returned by the \"exec-params\" property "
@@ -1481,33 +1482,33 @@ msgstr "Tipo no válido"
 msgid "CREATE TABLE operation is not supported by the database server"
 msgstr "El servidor de la base de datos no soporta la operación CREATE TABLE"
 
-#: ../libgda/gda-holder.c:487 ../libgda/gda-set.c:558
+#: ../libgda/gda-holder.c:489 ../libgda/gda-set.c:560
 #, c-format
 msgid "Unable to set holder's value: %s"
 msgstr "No se pudo establecer el valor del mantenedor: %s"
 
-#: ../libgda/gda-holder.c:581
+#: ../libgda/gda-holder.c:583
 msgid "The 'g-type' property cannot be changed"
 msgstr "No se puede modificar la propiedad «g-type»"
 
-#: ../libgda/gda-holder.c:848
+#: ../libgda/gda-holder.c:856
 #, c-format
 msgid "Unable to convert string to '%s' type"
 msgstr "No se puede convertir la cadena al tipo «%s»"
 
-#: ../libgda/gda-holder.c:908
+#: ../libgda/gda-holder.c:916
 msgid ""
 "Can't use this method to set value because there is already a static value"
 msgstr ""
 "No se puede usar este método para modificar el valor porque ya existe un "
 "valor estático"
 
-#: ../libgda/gda-holder.c:927 ../libgda/gda-holder.c:1061
+#: ../libgda/gda-holder.c:935 ../libgda/gda-holder.c:1069
 #, c-format
 msgid "(%s): Holder does not allow NULL values"
 msgstr "(%s): El mantenedor no permite valores nulos (NULL)"
 
-#: ../libgda/gda-holder.c:934
+#: ../libgda/gda-holder.c:942
 #, c-format
 msgid ""
 "(%s): Wrong Holder value type, expected type '%s' when value's type is '%s'"
@@ -1515,14 +1516,14 @@ msgstr ""
 "(%s): Tipo de valor del mantenedor erróneo, se esperaba el tipo «%s» cuando "
 "el tipo de valor es «%s»"
 
-#: ../libgda/gda-holder.c:1068
+#: ../libgda/gda-holder.c:1076
 #, c-format
 msgid "(%s): Wrong value type: expected type '%s' when value's type is '%s'"
 msgstr ""
 "(%s): Tipo de parámetro erróneo: se esperaba el tipo «%s» y se obtuvo «%s»"
 
 #. break holder's binding because type differ
-#: ../libgda/gda-holder.c:1522
+#: ../libgda/gda-holder.c:1530
 #, c-format
 msgid ""
 "Cannot bind holders if their type is not the same, breaking existing bind "
@@ -1531,11 +1532,11 @@ msgstr ""
 "No se pueden vincular los mantenedores si su tipo no es el mismo, rompiendo "
 "el vínculo existente donde «%s» estaba vinculado a «%s»"
 
-#: ../libgda/gda-holder.c:1567
+#: ../libgda/gda-holder.c:1575
 msgid "Cannot bind holders if their type is not the same"
 msgstr "No se pueden vincular los mantenedores si su tipo no es el mismo"
 
-#: ../libgda/gda-holder.c:1707
+#: ../libgda/gda-holder.c:1715
 #, c-format
 msgid "Could not change GdaHolder to match value change in bound GdaHolder: %s"
 msgstr ""
@@ -1568,163 +1569,164 @@ msgstr ""
 "No se pudo analizar «%s»: La validación para los archivos XML de operaciones "
 "del servidor no será efectuada (podrían ocurrir algunos errores raros)"
 
-#: ../libgda/gda-meta-store.c:427
+#: ../libgda/gda-meta-store.c:428
 msgid "Connection string for the internal connection to use"
 msgstr "Cadena de conexión que usar para la conexión internar"
 
-#: ../libgda/gda-meta-store.c:430
+#: ../libgda/gda-meta-store.c:431
 msgid "Connection object internally used"
 msgstr "Objeto de conexión interna que usar"
 
-#: ../libgda/gda-meta-store.c:433
+#: ../libgda/gda-meta-store.c:434
 msgid "Catalog in which the database objects will be created"
 msgstr "Catálogo donde se crearán los objetos de la base de datos"
 
-#: ../libgda/gda-meta-store.c:436
+#: ../libgda/gda-meta-store.c:437
 msgid "Schema in which the database objects will be created"
 msgstr "Esquema donde se crearán los parámetros de la base de datos"
 
-#: ../libgda/gda-meta-store.c:579
+#: ../libgda/gda-meta-store.c:580
 msgid "Catalog specified but no schema specified, store will not be usable"
 msgstr ""
 "Se especificó el catálogo pero no el esquema, el almacenamiento no será "
 "usable"
 
-#: ../libgda/gda-meta-store.c:899 ../libgda/gda-meta-store.c:908
-#: ../libgda/gda-meta-store.c:2024 ../libgda/gda-meta-store.c:2033
+#: ../libgda/gda-meta-store.c:906 ../libgda/gda-meta-store.c:915
+#: ../libgda/gda-meta-store.c:2032 ../libgda/gda-meta-store.c:2041
 msgid "Could not set the internal schema's version"
 msgstr "No se pudo establecer la versión interna del esquema"
 
-#: ../libgda/gda-meta-store.c:1213
+#: ../libgda/gda-meta-store.c:1220
 msgid "Missing view name from <view> node"
 msgstr "Falta el nombre de la vista en el nodo <view>"
 
-#: ../libgda/gda-meta-store.c:1253
+#: ../libgda/gda-meta-store.c:1260
 msgid "Missing view definition from <view> node"
 msgstr "Falta la definición de la vista en el nodo <view>"
 
-#: ../libgda/gda-meta-store.c:1267
+#: ../libgda/gda-meta-store.c:1274
 #, c-format
 msgid "View definition contains more than one statement (for view '%s')"
 msgstr ""
-"La definición de la vista contiene más de una declaración (para la vista «%s»)"
+"La definición de la vista contiene más de una declaración (para la vista "
+"«%s»)"
 
-#: ../libgda/gda-meta-store.c:1294
+#: ../libgda/gda-meta-store.c:1301
 #, c-format
 msgid "View definition is not a selection statement (for view '%s')"
 msgstr ""
-"La definición de la vista no es una declaración de selección (para la vista «%"
-"s»)"
+"La definición de la vista no es una declaración de selección (para la vista "
+"«%s»)"
 
 #. FIXME
-#: ../libgda/gda-meta-store.c:1321 ../libgda/gda-meta-struct-io.c:176
+#: ../libgda/gda-meta-store.c:1328 ../libgda/gda-meta-struct-io.c:176
 msgid "Missing table name from <table> node"
 msgstr "Falta el nombre de la tabla del nodo <table>"
 
-#: ../libgda/gda-meta-store.c:1550
+#: ../libgda/gda-meta-store.c:1557
 #, c-format
 msgid "Column '%s' already exists and has different characteristics"
 msgstr "La columna «%s» ya existe y tiene características diferentes"
 
-#: ../libgda/gda-meta-store.c:1584
+#: ../libgda/gda-meta-store.c:1591
 #, c-format
 msgid "Missing foreign key's referenced table name (for table '%s')"
 msgstr ""
 "Falta el nombre de la tabla referenciada por las claves externas (para la "
 "tabla «%s»)"
 
-#: ../libgda/gda-meta-store.c:1637
+#: ../libgda/gda-meta-store.c:1644
 #, c-format
 msgid "Missing foreign key's column name (for table '%s')"
 msgstr "Falta el nombre de la columna de claves externas (para la tabla «%s»)"
 
-#: ../libgda/gda-meta-store.c:1648
+#: ../libgda/gda-meta-store.c:1655
 #, c-format
 msgid "Column '%s' not found in table '%s'"
 msgstr "No se encontró la columna «%s» en la tabla «%s»"
 
-#: ../libgda/gda-meta-store.c:1901 ../libgda/gda-meta-struct.c:1026
+#: ../libgda/gda-meta-store.c:1909 ../libgda/gda-meta-struct.c:1029
 #, c-format
 msgid "Foreign key column '%s' not found in table '%s'"
 msgstr "La clave de la columna externa «%s» no se encontró en la tabla «%s»"
 
-#: ../libgda/gda-meta-store.c:2081
+#: ../libgda/gda-meta-store.c:2089
 #, c-format
 msgid "Schema description does not contain the object '%s', check installation"
 msgstr ""
 "La descripción del esquema no contiene el objeto «%s», compruebe la "
 "instalación"
 
-#: ../libgda/gda-meta-store.c:2142 ../libgda/gda-meta-store.c:2153
-#: ../libgda/gda-meta-store.c:2183
+#: ../libgda/gda-meta-store.c:2150 ../libgda/gda-meta-store.c:2161
+#: ../libgda/gda-meta-store.c:2191
 msgid "Could not get the internal schema's version"
 msgstr "No se pudo obtener la versión interna del esquema"
 
-#: ../libgda/gda-meta-store.c:2167
+#: ../libgda/gda-meta-store.c:2175
 #, c-format
 msgid "Unknown internal schema's version: '%s'"
 msgstr "Versión interna del esquema desconocida: «%s»"
 
-#: ../libgda/gda-meta-store.c:2307 ../tools/gda-sql.c:967
+#: ../libgda/gda-meta-store.c:2315 ../tools/gda-sql.c:967
 msgid "More than one SQL statement"
 msgstr "Más de una declaración SQL"
 
-#: ../libgda/gda-meta-store.c:2336
+#: ../libgda/gda-meta-store.c:2344
 #, c-format
 msgid "Parameter '%s' is not present in statement"
 msgstr "El parámetro «%s» no está presente en la declaración"
 
-#: ../libgda/gda-meta-store.c:2353
+#: ../libgda/gda-meta-store.c:2361
 #, c-format
 msgid "No value set for parameter '%s'"
 msgstr "No se estableció un valor para el parámetro «%s»"
 
-#: ../libgda/gda-meta-store.c:2912
+#: ../libgda/gda-meta-store.c:2920
 msgid "Data models should have the same number of columns"
 msgstr "El modelo de datos debería tener el mismo número de columnas"
 
-#: ../libgda/gda-meta-store.c:2973 ../libgda/gda-meta-store.c:4025
-#: ../libgda/gda-meta-store.c:4128
+#: ../libgda/gda-meta-store.c:2981 ../libgda/gda-meta-store.c:4033
+#: ../libgda/gda-meta-store.c:4136
 #, c-format
 msgid "Unknown database object '%s'"
 msgstr "Objeto de la base de datos «%s» desconocido"
 
-#: ../libgda/gda-meta-store.c:2989
+#: ../libgda/gda-meta-store.c:2997
 #, c-format
 msgid "Could not set value for parameter '%s'"
 msgstr "No se pudo establecer el valor para el parámetro «%s»"
 
-#: ../libgda/gda-meta-store.c:3018
+#: ../libgda/gda-meta-store.c:3026
 msgid "Could not create SELECT statement"
 msgstr "No se pudo crear la declaración SELECT"
 
-#: ../libgda/gda-meta-store.c:3033
+#: ../libgda/gda-meta-store.c:3041
 msgid "Could not create DELETE statement"
 msgstr "No se pudo crear la declaración DELETE"
 
-#: ../libgda/gda-meta-store.c:3083
+#: ../libgda/gda-meta-store.c:3091
 msgid "A transaction has already been started"
 msgstr "Ya se ha iniciado una transacción"
 
-#: ../libgda/gda-meta-store.c:3475
+#: ../libgda/gda-meta-store.c:3483
 #, c-format
 msgid "Attribute '%s' not found"
 msgstr "No se encontró el atributo «%s»"
 
-#: ../libgda/gda-meta-store.c:3478
+#: ../libgda/gda-meta-store.c:3486
 #, c-format
 msgid "Attribute '%s' has %d value"
 msgid_plural "Attribute '%s' has %d values"
 msgstr[0] "El atributo «%s» tiene %d valor"
 msgstr[1] "El atributo «%s» tiene %d valor"
 
-#: ../libgda/gda-meta-store.c:3525
+#: ../libgda/gda-meta-store.c:3533
 msgid "Attributes names starting with a '_' are reserved for internal usage"
 msgstr ""
 "Los atributos con nombres que empiezan por «_» están reservados para uso "
 "interno"
 
-#: ../libgda/gda-meta-store.c:3553
+#: ../libgda/gda-meta-store.c:3561
 msgid ""
 "Could not start a transaction because one already started, this could lead "
 "to GdaMetaStore attributes problems"
@@ -1732,17 +1734,17 @@ msgstr ""
 "No se pudo iniciar una transacción porque ya hay una iniciada, esto podría "
 "llevar a problemas con los atributos de GdaMetaStore"
 
-#: ../libgda/gda-meta-store.c:3667
+#: ../libgda/gda-meta-store.c:3675
 msgid "Could not parse XML description of custom database object to add"
 msgstr ""
 "No se pudo analizar la descripción XML del objeto personalizado de la base "
 "de datos que añadir"
 
-#: ../libgda/gda-meta-store.c:3681
+#: ../libgda/gda-meta-store.c:3689
 msgid "Missing custom database object name"
 msgstr "Falta el nombre personalizado del objeto de la base de datos"
 
-#: ../libgda/gda-meta-store.c:3686
+#: ../libgda/gda-meta-store.c:3694
 msgid ""
 "Custom database object names starting with a '_' are reserved for internal "
 "usage"
@@ -1750,58 +1752,58 @@ msgstr ""
 "Los nombres personalizados de objetos de la base de datos que comienzan por "
 "«_» están reservados para uso interno"
 
-#: ../libgda/gda-meta-store.c:3784
+#: ../libgda/gda-meta-store.c:3792
 msgid "Another object with the same name already exists"
 msgstr "Ya existe un objeto con el mismo nombre"
 
-#: ../libgda/gda-meta-store.c:3887
+#: ../libgda/gda-meta-store.c:3895
 #, c-format
 msgid "Missing table name in meta data context"
 msgstr "Falta el nombre de la tabla en el contexto de los metadatos"
 
-#: ../libgda/gda-meta-store.c:3914
+#: ../libgda/gda-meta-store.c:3922
 #, c-format
 msgid "Missing column name in meta data context"
 msgstr "Falta el nombre de la columna en el contexto de los metadatos"
 
-#: ../libgda/gda-meta-store.c:3930
+#: ../libgda/gda-meta-store.c:3938
 #, c-format
 msgid "Missing condition in meta data context"
 msgstr "Falta la condición en el contexto de los metadatos"
 
-#: ../libgda/gda-meta-store.c:3955
+#: ../libgda/gda-meta-store.c:3963
 #, c-format
 msgid "Malformed condition in meta data context"
 msgstr "Condición malformada en el contexto de los metadatos"
 
-#: ../libgda/gda-meta-store.c:3972
+#: ../libgda/gda-meta-store.c:3980
 #, c-format
 msgid "Unknown column name '%s' in meta data context"
 msgstr "Nombre de columna «%s» desconocido en el contexto de los metadatos"
 
-#: ../libgda/gda-meta-store.c:3994
+#: ../libgda/gda-meta-store.c:4002
 #, c-format
 msgid "Unknown table in meta data context"
 msgstr "Tabla desconocida en el contexto de los metadatos"
 
-#: ../libgda/gda-meta-struct.c:128
+#: ../libgda/gda-meta-struct.c:129
 msgid "GdaMetaStore object to fetch information from"
 msgstr "Obejto GdaMetaStore del que obtener la información"
 
 #. To translators: The GdaMetaStruct object computes lists of tables, views,
 #. * and some other information, the "Features to compute" allows one to avoid
 #. * computing some features which won't be used
-#: ../libgda/gda-meta-struct.c:136
+#: ../libgda/gda-meta-struct.c:137
 msgid "Features to compute"
 msgstr "Características que computar"
 
-#: ../libgda/gda-meta-struct.c:498 ../libgda/gda-meta-struct.c:513
-#: ../libgda/gda-meta-struct.c:530
+#: ../libgda/gda-meta-struct.c:501 ../libgda/gda-meta-struct.c:516
+#: ../libgda/gda-meta-struct.c:533
 #, c-format
 msgid "Could not find object named '%s'"
 msgstr "No se pudo encontrar el objeto llamado «%s»"
 
-#: ../libgda/gda-meta-struct.c:579
+#: ../libgda/gda-meta-struct.c:582
 #, c-format
 msgid ""
 "Object %s.%s.%s already exists in GdaMetaStruct and has a different object "
@@ -1810,22 +1812,22 @@ msgstr ""
 "El objeto %s.%s.%s ya existe en GdaMetaStruct y tiene un tipo de objeto "
 "diferente"
 
-#: ../libgda/gda-meta-struct.c:605
+#: ../libgda/gda-meta-struct.c:608
 #, c-format
 msgid "View %s.%s.%s not found in meta store object"
 msgstr "No se encontró la vista %s.%s.%s en el objeto de meta almacenamiento"
 
-#: ../libgda/gda-meta-struct.c:687
+#: ../libgda/gda-meta-struct.c:690
 #, c-format
 msgid "Table %s.%s.%s not found (or missing columns information)"
 msgstr "No se encontró la tabla %s.%s.%s (o falta información de las columnas)"
 
-#: ../libgda/gda-meta-struct.c:813
+#: ../libgda/gda-meta-struct.c:816
 #, c-format
 msgid "Internal GdaMetaStore error: column %s not found"
 msgstr "Error interno de GdaMetaStore: no se encontró la cadena %s"
 
-#: ../libgda/gda-meta-struct.c:943
+#: ../libgda/gda-meta-struct.c:946
 #, c-format
 msgid ""
 "Meta data incoherence in foreign key constraint for table %s.%s.%s "
@@ -1834,11 +1836,11 @@ msgstr ""
 "Incoherencia en los metadatos de restricción de la clave externa para la "
 "tabla %s.%s.%s referenciando la tabla %s.%s.%s"
 
-#: ../libgda/gda-meta-struct.c:2257
+#: ../libgda/gda-meta-struct.c:2261
 msgid "Missing object name in GdaMetaDbObject structure"
 msgstr "Falta el nombre del objeto en la estructura GdaMetaDbObject"
 
-#: ../libgda/gda-meta-struct.c:2282
+#: ../libgda/gda-meta-struct.c:2286
 #, c-format
 msgid "Database object '%s' already exists"
 msgstr "El objeto de la base de datos «%s» ya existe"
@@ -1882,22 +1884,22 @@ msgstr "El nombre de ta tabla referenciada «%s» no es válido"
 msgid "Missing foreign key's column name for table '%s'"
 msgstr "Falta el nombre de la columna de la clave externa para la tabla «%s»"
 
-#: ../libgda/gda-server-operation.c:587
+#: ../libgda/gda-server-operation.c:588
 #, c-format
 msgid "GdaServerOperation: could not find file '%s'"
 msgstr "GdaServerOperation: no se pudo encontrar el archivo «%s»"
 
-#: ../libgda/gda-server-operation.c:598
+#: ../libgda/gda-server-operation.c:599
 #, c-format
 msgid "GdaServerOperation: could not load file '%s'"
 msgstr "GdaServerOperation: no se pudo cargar el archivo «%s»"
 
-#: ../libgda/gda-server-operation.c:613 ../libgda/gda-server-operation.c:1004
+#: ../libgda/gda-server-operation.c:615 ../libgda/gda-server-operation.c:1009
 #, c-format
 msgid "Could not load XML specifications: %s"
 msgstr "No se pudieron cargar las especificaciones: %s"
 
-#: ../libgda/gda-server-operation.c:680
+#: ../libgda/gda-server-operation.c:685
 #, c-format
 msgid ""
 "GdaServerOperation: file '%s' does not conform to DTD:\n"
@@ -1906,7 +1908,7 @@ msgstr ""
 "GdaServerOperation: el archivo «%s» no se ajusta al DTD:\n"
 "%s"
 
-#: ../libgda/gda-server-operation.c:683
+#: ../libgda/gda-server-operation.c:688
 #, c-format
 msgid ""
 "GdaServerOperation specification does not conform to DTD:\n"
@@ -1915,16 +1917,16 @@ msgstr ""
 "La especificación GdaServerOperation no se ajusta al DTD:\n"
 "%s"
 
-#: ../libgda/gda-server-operation.c:690
+#: ../libgda/gda-server-operation.c:695
 #, c-format
 msgid "GdaServerOperation: file '%s' does not conform to DTD"
 msgstr "GdaServerOperation: el archivo «%s» no se ajusta a DTD"
 
-#: ../libgda/gda-server-operation.c:693
+#: ../libgda/gda-server-operation.c:698
 msgid "GdaServerOperation specification does not conform to DTD\n"
 msgstr "La especificación GdaServerOperation no se ajusta a DTD \n"
 
-#: ../libgda/gda-server-operation.c:1233
+#: ../libgda/gda-server-operation.c:1238
 msgid ""
 "Non handled GdaServerOperationType, please report error to http://bugzilla.";
 "gnome.org/ for the \"libgda\" product"
@@ -1932,40 +1934,40 @@ msgstr ""
 "No existe el manejador GdaServerOperationType, por favor informe del error "
 "en http://bugzilla.gnome.org/ para el producto «libgda»"
 
-#: ../libgda/gda-server-operation.c:1467 ../libgda/gda-server-operation.c:1481
+#: ../libgda/gda-server-operation.c:1472 ../libgda/gda-server-operation.c:1486
 #, c-format
 msgid "Expected tag <%s>, got <%s>"
 msgstr "Se esperaba la etiqueta <%s>, se obtuvo <%s>"
 
-#: ../libgda/gda-server-operation.c:1512 ../libgda/gda-server-operation.c:2198
+#: ../libgda/gda-server-operation.c:1517 ../libgda/gda-server-operation.c:2203
 msgid ""
 "Parameterlist values can only be set for individual parameters within it"
 msgstr ""
 "Los valores de la lista de parámetros sólo se pueden establecer para "
 "parámetros individuales dentro de ella"
 
-#: ../libgda/gda-server-operation.c:1569
+#: ../libgda/gda-server-operation.c:1574
 msgid "Missing attribute named 'path'"
 msgstr "Falta el atributo llamado «path»"
 
-#: ../libgda/gda-server-operation.c:2327
+#: ../libgda/gda-server-operation.c:2332
 #, c-format
 msgid "Missing required value for '%s'"
 msgstr "Falta el valor requerido para «%s»"
 
-#: ../libgda/gda-server-provider.c:507
+#: ../libgda/gda-server-provider.c:510
 #, c-format
 msgid "Provider %s created a GdaServerOperation without node for '%s'"
 msgstr "El proveedor %s creó un GdaServerOperation sin un nodo para «%s»"
 
-#: ../libgda/gda-server-provider.c:511
+#: ../libgda/gda-server-provider.c:514
 #, c-format
 msgid "Provider %s created a GdaServerOperation with wrong node type for '%s'"
 msgstr ""
-"El proveedor %s creó un GdaServerOperation con un tipo de nodo erróneo para «%"
-"s»"
+"El proveedor %s creó un GdaServerOperation con un tipo de nodo erróneo para "
+"«%s»"
 
-#: ../libgda/gda-server-provider.c:935 ../libgda/gda-server-provider.c:969
+#: ../libgda/gda-server-provider.c:938 ../libgda/gda-server-provider.c:972
 #, c-format
 msgid ""
 "GdaServerProvider object implements the %s virtual method but does not "
@@ -1983,7 +1985,7 @@ msgstr "Agregado"
 
 #: ../libgda/gda-server-provider-extra.c:318
 #: ../libgda/gda-server-provider-extra.c:362
-#: ../tools/browser/data-manager/data-source-editor.c:123
+#: ../tools/browser/data-manager/data-source-editor.c:124
 msgid "Id"
 msgstr "Id"
 
@@ -1994,7 +1996,7 @@ msgstr "Id"
 #: ../libgda/gda-server-provider-extra.c:392
 #: ../libgda/gda-server-provider-extra.c:404
 #: ../providers/postgres/postgres_specs_create_db.xml.in.h:56
-#: ../tools/command-exec.c:650
+#: ../tools/command-exec.c:655
 msgid "Owner"
 msgstr "Propietario"
 
@@ -2144,8 +2146,8 @@ msgstr "Atributos adicionales"
 #: ../providers/postgres/postgres_specs_drop_index.xml.in.h:2
 #: ../providers/sqlcipher/sqlcipher_specs_drop_index.xml.in.h:3
 #: ../providers/sqlite/sqlite_specs_drop_index.xml.in.h:3
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:166
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:172
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:167
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:173
 msgid "Index"
 msgstr "Ã?ndice"
 
@@ -2178,7 +2180,7 @@ msgstr "Espacio de nombres"
 #: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:11
 #: ../providers/sqlite/sqlite_specs_drop_table.xml.in.h:3
 #: ../providers/sqlite/sqlite_specs_rename_table.xml.in.h:3
-#: ../tools/browser/data-manager/data-source-editor.c:134
+#: ../tools/browser/data-manager/data-source-editor.c:135
 msgid "Table"
 msgstr "Tabla"
 
@@ -2214,8 +2216,8 @@ msgstr "Disparador"
 #: ../providers/mysql/mysql_specs_create_index.xml.in.h:17
 #: ../providers/sqlcipher/sqlcipher_specs_create_index.xml.in.h:17
 #: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:17
-#: ../tools/command-exec.c:649 ../tools/command-exec.c:723
-#: ../tools/web-server.c:926
+#: ../tools/command-exec.c:654 ../tools/command-exec.c:728
+#: ../tools/web-server.c:927
 msgid "Type"
 msgstr "Tipo"
 
@@ -2267,9 +2269,9 @@ msgstr "Ver"
 #: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:12
 #: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:26
 #: ../providers/sqlite/sqlite_specs_create_view.xml.in.h:3
-#: ../tools/browser/data-manager/data-favorite-selector.c:304
-#: ../tools/browser/query-exec/query-favorite-selector.c:288
-#: ../tools/command-exec.c:648 ../tools/gda-sql.c:3088 ../tools/gda-sql.c:4014
+#: ../tools/browser/data-manager/data-favorite-selector.c:305
+#: ../tools/browser/query-exec/query-favorite-selector.c:289
+#: ../tools/command-exec.c:653 ../tools/gda-sql.c:3094 ../tools/gda-sql.c:4023
 msgid "Name"
 msgstr "Nombre"
 
@@ -2303,43 +2305,43 @@ msgstr ""
 #, c-format
 msgid "Data model for schema has a wrong gda type: %s instead of %s"
 msgstr ""
-"El modelo de datos para el esquema tiene un tipo gda erróneo: «%s» en vez de «%"
-"s»"
+"El modelo de datos para el esquema tiene un tipo gda erróneo: «%s» en vez de "
+"«%s»"
 
-#: ../libgda/gda-set.c:550 ../libgda/gda-set.c:651
+#: ../libgda/gda-set.c:552 ../libgda/gda-set.c:653
 #, c-format
 msgid "%s() does not handle values of type '%s'."
 msgstr "%s() no puede manejar valores de tipo «%s»."
 
-#: ../libgda/gda-set.c:605
+#: ../libgda/gda-set.c:607
 #, c-format
 msgid "GdaHolder with ID '%s' not found in set"
 msgstr "No se encontró el GdaHolder con ID %s en el conjunto"
 
-#: ../libgda/gda-set.c:785
+#: ../libgda/gda-set.c:787
 #, c-format
 msgid "Spec's root node != 'data-set-spec': '%s'"
 msgstr "Nodo raíz de las especificaciones != 'data-set-spec': «%s»"
 
-#: ../libgda/gda-set.c:824
+#: ../libgda/gda-set.c:826
 #, c-format
 msgid "Missing node <parameters>: '%s'"
 msgstr "Faltan <parameters> del nodo: «%s»"
 
-#: ../libgda/gda-set.c:1036
+#: ../libgda/gda-set.c:1038
 #, c-format
 msgid "Data set does not allow modifications"
 msgstr "El conjunto de datos no permite modificaciones"
 
-#: ../libgda/gda-set.c:1301
+#: ../libgda/gda-set.c:1303
 msgid "GdaHolder needs to have an ID"
 msgstr "GdaGolder necesita tener un ID"
 
-#: ../libgda/gda-set.c:1414
+#: ../libgda/gda-set.c:1416
 msgid "One or more values are invalid"
 msgstr "Uno o más valores no son válidos"
 
-#: ../libgda/gda-set.c:1631 ../libgda/gda-set.c:1644
+#: ../libgda/gda-set.c:1635 ../libgda/gda-set.c:1648
 msgid ""
 "Replacing data model must have the same characteristics as the data model it "
 "replaces"
@@ -2347,155 +2349,156 @@ msgstr ""
 "Reemplazar el modelo de datos debe tener las mismas características que el "
 "modelo de datos al que reemplaza"
 
-#: ../libgda/gda-sql-builder.c:286 ../libgda/gda-sql-builder.c:1391
+#: ../libgda/gda-sql-builder.c:293 ../libgda/gda-sql-builder.c:1397
 #, c-format
 msgid "Unknown part ID %u"
 msgstr "La parte con ID %u es desconocida"
 
-#: ../libgda/gda-sql-builder.c:290
+#: ../libgda/gda-sql-builder.c:297
 msgid "Unknown part type"
 msgstr "Tipo de parte desconocido"
 
-#: ../libgda/gda-sql-builder.c:334
+#: ../libgda/gda-sql-builder.c:341
 #, c-format
 msgid "SqlBuilder is empty"
 msgstr "El constructor SQL (SqlBuilder) está vacío"
 
-#: ../libgda/gda-sql-builder.c:410 ../libgda/gda-sql-builder.c:467
-#: ../libgda/gda-sql-builder.c:496 ../libgda/gda-sql-builder.c:617
-#: ../libgda/gda-sql-builder.c:659 ../libgda/gda-sql-builder.c:721
-#: ../libgda/gda-sql-builder.c:781 ../libgda/gda-sql-builder.c:1153
-#: ../libgda/gda-sql-builder.c:1237 ../libgda/gda-sql-builder.c:1282
-#: ../libgda/gda-sql-builder.c:1373 ../libgda/gda-sql-builder.c:1424
-#: ../libgda/gda-sql-builder.c:1466 ../libgda/gda-sql-builder.c:1513
-#: ../libgda/gda-sql-builder.c:1563 ../libgda/gda-sql-builder.c:1599
-#: ../libgda/gda-sql-builder.c:1765 ../libgda/gda-sql-builder.c:1791
+#: ../libgda/gda-sql-builder.c:416 ../libgda/gda-sql-builder.c:473
+#: ../libgda/gda-sql-builder.c:502 ../libgda/gda-sql-builder.c:623
+#: ../libgda/gda-sql-builder.c:665 ../libgda/gda-sql-builder.c:727
+#: ../libgda/gda-sql-builder.c:787 ../libgda/gda-sql-builder.c:1159
+#: ../libgda/gda-sql-builder.c:1243 ../libgda/gda-sql-builder.c:1288
+#: ../libgda/gda-sql-builder.c:1379 ../libgda/gda-sql-builder.c:1430
+#: ../libgda/gda-sql-builder.c:1472 ../libgda/gda-sql-builder.c:1519
+#: ../libgda/gda-sql-builder.c:1569 ../libgda/gda-sql-builder.c:1605
+#: ../libgda/gda-sql-builder.c:1770 ../libgda/gda-sql-builder.c:1796
 msgid "Wrong statement type"
 msgstr "Tipo de declaración erróneo"
 
-#: ../libgda/gda-sql-builder.c:588
+#: ../libgda/gda-sql-builder.c:594
 #, c-format
 msgid "Could not convert value to type '%s', value not defined"
 msgstr "No se pudo convertir el valor al tipo «%s», el valor no está definido"
 
-#: ../libgda/gda-sql-builder.c:712
+#: ../libgda/gda-sql-builder.c:718
 msgid "Wrong field format"
 msgstr "Formato de campo erróneo"
 
-#: ../libgda/gda-sql-builder.c:815 ../libgda/gda-sql-builder.c:820
+#: ../libgda/gda-sql-builder.c:821 ../libgda/gda-sql-builder.c:826
 #, c-format
 msgid "Unhandled data type '%s'"
 msgstr "Tipo de dato «%s» no manejado"
 
-#: ../libgda/gda-sql-builder.c:836
+#: ../libgda/gda-sql-builder.c:842
 #, c-format
 msgid "Could not convert value to type '%s'"
 msgstr "No se pudo convertir el valor al tipo «%s»"
 
-#: ../libgda/gda-sql-builder.c:1304
+#: ../libgda/gda-sql-builder.c:1310
 #, c-format
 msgid "Unknown left part target ID %u"
 msgstr "Se desconoce el ID de destino de la parte izquierda %u"
 
-#: ../libgda/gda-sql-builder.c:1309
+#: ../libgda/gda-sql-builder.c:1315
 #, c-format
 msgid "Unknown right part target ID %u"
 msgstr "Se desconoce el ID de destino de la parte derecha %u"
 
-#: ../libgda/gda-statement.c:483
+#: ../libgda/gda-statement.c:484
 #, c-format
 msgid "Could not determine GType for parameter '%s'"
 msgstr "No se pudo encontrar el tipo para el parámetro «%s»"
 
-#: ../libgda/gda-statement.c:484
+#: ../libgda/gda-statement.c:485
 msgid "Unnamed"
 msgstr "Sin nombre"
 
-#: ../libgda/gda-statement.c:683
+#: ../libgda/gda-statement.c:684
 msgid "Missing SQL code"
 msgstr "Falta código SQL"
 
-#: ../libgda/gda-statement.c:700
+#: ../libgda/gda-statement.c:701
 #, c-format
 msgid "No data handler for type '%s'"
 msgstr "No existe un manejador de datos para el tipo «%s»"
 
-#: ../libgda/gda-statement.c:1219
+#: ../libgda/gda-statement.c:1220
 #, c-format
 msgid "Wrong parameter type for '%s': expected type '%s' and got '%s'"
 msgstr ""
-"Tipo de parámetro erróneo para «%s»: se esperaba el tipo «%s» y se obtuvo «%s»"
+"Tipo de parámetro erróneo para «%s»: se esperaba el tipo «%s» y se obtuvo "
+"«%s»"
 
-#: ../libgda/gda-statement.c:1231
+#: ../libgda/gda-statement.c:1232
 #, c-format
 msgid "Missing parameter '%s'"
 msgstr "Falta el parámetro «%s»"
 
-#: ../libgda/gda-statement.c:1243 ../libgda/sqlite/gda-sqlite-provider.c:2600
-#: ../providers/jdbc/gda-jdbc-provider.c:1347
+#: ../libgda/gda-statement.c:1244 ../libgda/sqlite/gda-sqlite-provider.c:2601
+#: ../providers/jdbc/gda-jdbc-provider.c:1352
 #: ../providers/mysql/gda-mysql-provider.c:2188
-#: ../providers/postgres/gda-postgres-provider.c:1949
-#: ../providers/web/gda-web-provider.c:1508
+#: ../providers/postgres/gda-postgres-provider.c:1954
+#: ../providers/web/gda-web-provider.c:1512
 #, c-format
 msgid "Parameter '%s' is invalid"
 msgstr "El parámetro «%s» no es válido"
 
-#: ../libgda/gda-statement.c:1289
+#: ../libgda/gda-statement.c:1290
 msgid "Unnamed parameter"
 msgstr "Parámetro sin nombre"
 
-#: ../libgda/gda-statement.c:1507
+#: ../libgda/gda-statement.c:1508
 msgid "Malformed table name"
 msgstr "El nombre de la tabla está mal formado"
 
-#: ../libgda/gda-statement.c:1956
+#: ../libgda/gda-statement.c:1957
 msgid "Join is not in a FROM statement"
 msgstr "La parte «JOIN» no está en una declaración «FROM»"
 
-#: ../libgda/gda-statement.c:1963
+#: ../libgda/gda-statement.c:1964
 msgid "Could not find target the join is for"
 msgstr "No se pudo encontrar el destino para la unión («JOIN»)"
 
-#: ../libgda/gda-tree-mgr-columns.c:264 ../libgda/gda-tree-mgr-schemas.c:217
-#: ../libgda/gda-tree-mgr-select.c:294 ../libgda/gda-tree-mgr-tables.c:248
-#: ../libgda-report/engine/gda-report-engine.c:586
-#: ../libgda-report/engine/gda-report-engine.c:613 ../tools/gda-sql.c:762
+#: ../libgda/gda-tree-mgr-columns.c:271 ../libgda/gda-tree-mgr-schemas.c:225
+#: ../libgda/gda-tree-mgr-select.c:302 ../libgda/gda-tree-mgr-tables.c:256
+#: ../libgda-report/engine/gda-report-engine.c:589
+#: ../libgda-report/engine/gda-report-engine.c:616 ../tools/gda-sql.c:762
 #: ../tools/gda-sql.c:947
 #, c-format
 msgid "No connection specified"
 msgstr "No se especificó una conexión"
 
-#: ../libgda/gda-tree-mgr-columns.c:347
+#: ../libgda/gda-tree-mgr-columns.c:354
 #, c-format
 msgid "No schema specified"
 msgstr "No se especificó un esquema"
 
-#: ../libgda/gda-tree-mgr-columns.c:355
+#: ../libgda/gda-tree-mgr-columns.c:362
 #, c-format
 msgid "No table specified"
 msgstr "No se especificó una tabla"
 
-#: ../libgda/gda-tree-mgr-columns.c:384
+#: ../libgda/gda-tree-mgr-columns.c:391
 #, c-format
 msgid "Unable to get column name"
 msgstr "No se pudo obtener el nombre de la columna"
 
-#: ../libgda/gda-tree-mgr-label.c:207
-#: ../tools/browser/canvas/browser-canvas-table.c:309
+#: ../libgda/gda-tree-mgr-label.c:214
+#: ../tools/browser/canvas/browser-canvas-table.c:316
 msgid "No name"
 msgstr "Sin nombre"
 
-#: ../libgda/gda-tree-mgr-schemas.c:269
+#: ../libgda/gda-tree-mgr-schemas.c:277
 #, c-format
 msgid "Unable to get schema name"
 msgstr "No se pudo obtener el nombre del esquema"
 
-#: ../libgda/gda-tree-mgr-select.c:187
+#: ../libgda/gda-tree-mgr-select.c:188
 #, c-format
 msgid "Could not get SELECT statement's parameters: %s"
 msgstr "No se pudieron obtener los parámetros de la declaración SELECT: %s"
 
-#: ../libgda/gda-tree-mgr-select.c:217
+#: ../libgda/gda-tree-mgr-select.c:221
 #, c-format
 msgid ""
 "Could not bind SELECT statement's parameter '%s' to provided parameters: %s"
@@ -2503,22 +2506,22 @@ msgstr ""
 "No se pudieron vincular los parámetros «%s» de la declaración SELECT con los "
 "parámetros proporcionados: %s"
 
-#: ../libgda/gda-tree-mgr-select.c:302
+#: ../libgda/gda-tree-mgr-select.c:310
 #, c-format
 msgid "No SELECT statement specified"
 msgstr "No se especificó una declaración SELECT"
 
-#: ../libgda/gda-tree-mgr-select.c:324
+#: ../libgda/gda-tree-mgr-select.c:332
 #, c-format
 msgid "No value specified for parameter '%s'"
 msgstr "No se especificó un valor para el parámetro «%s»"
 
-#: ../libgda/gda-tree-mgr-select.c:358
+#: ../libgda/gda-tree-mgr-select.c:366
 #, c-format
 msgid "Unable to get iterator's value"
 msgstr "No se pudo obtener el valor del iterador"
 
-#: ../libgda/gda-tree-mgr-tables.c:349
+#: ../libgda/gda-tree-mgr-tables.c:357
 #, c-format
 msgid "Unable to get table name"
 msgstr "No se pudo obtener el nombre de la tabla"
@@ -2527,7 +2530,7 @@ msgstr "No se pudo obtener el nombre de la tabla"
 msgid "Tells if the GdaTree is a list or a tree"
 msgstr "Dice si el GdaTree es una lista o un árbol"
 
-#: ../libgda/gda-tree.c:737 ../libgda/gda-tree.c:745
+#: ../libgda/gda-tree.c:744 ../libgda/gda-tree.c:752
 #, c-format
 msgid "Path format error: %s"
 msgstr "Error de formato de ruta: %s"
@@ -2557,27 +2560,27 @@ msgstr "La tabla no tiene ninguna clave primaria"
 msgid "Table's primary key is not selected"
 msgstr "No se seleccionó la clave primaria de la tabla"
 
-#: ../libgda/gda-util.c:1122
+#: ../libgda/gda-util.c:1120
 msgid "Could not compute any field to insert into"
 msgstr "No se pudo computar ningún campo en el que introducir"
 
-#: ../libgda/gda-util.c:1185
+#: ../libgda/gda-util.c:1183
 msgid "Missing table name in UPDATE statement"
 msgstr "Falta el nombre de la tabla en la declaración UPDATE"
 
-#: ../libgda/gda-util.c:1266
+#: ../libgda/gda-util.c:1264
 #, c-format
 msgid "Can't rewrite UPDATE statement to handle default values"
 msgstr ""
 "No se puede escribir la declaración UPDATE para gestionar los valores "
 "predeterminados"
 
-#: ../libgda/gda-util.c:1318 ../libgda/gda-util.c:1375
-#: ../libgda/gda-util.c:1415 ../libgda/sqlite/gda-sqlite-provider.c:2581
-#: ../providers/jdbc/gda-jdbc-provider.c:1318
+#: ../libgda/gda-util.c:1316 ../libgda/gda-util.c:1373
+#: ../libgda/gda-util.c:1413 ../libgda/sqlite/gda-sqlite-provider.c:2582
+#: ../providers/jdbc/gda-jdbc-provider.c:1323
 #: ../providers/mysql/gda-mysql-provider.c:2168
-#: ../providers/postgres/gda-postgres-provider.c:1931
-#: ../providers/web/gda-web-provider.c:1488
+#: ../providers/postgres/gda-postgres-provider.c:1936
+#: ../providers/web/gda-web-provider.c:1492
 #, c-format
 msgid "Missing parameter '%s' to execute query"
 msgstr "Falta el parámetro «%s» para ejecutar la consulta"
@@ -2586,78 +2589,78 @@ msgstr "Falta el parámetro «%s» para ejecutar la consulta"
 msgid "Global transaction ID can not have more than 64 bytes"
 msgstr "El ID de transacción global no puede tener más de 64 bytes"
 
-#: ../libgda/gda-xa-transaction.c:295
+#: ../libgda/gda-xa-transaction.c:296
 msgid "Connection already registered with another GdaXaTransaction object"
 msgstr "La conexión ya está registrada con otro objeto GdaXaTransaction"
 
-#: ../libgda/gda-xa-transaction.c:308
+#: ../libgda/gda-xa-transaction.c:309
 msgid "Connection does not support distributed transaction"
 msgstr "La conexión no soporta transacciones distribuidas"
 
-#: ../libgda/gda-xa-transaction.c:342
+#: ../libgda/gda-xa-transaction.c:343
 msgid ""
 "Cannot unregister connection not registered with GdaXaTransaction object"
 msgstr ""
 "No se puede destruir la conexión, no se registró con un objeto "
 "GdaXaTransaction"
 
-#: ../libgda/gda-xa-transaction.c:378 ../libgda/gda-xa-transaction.c:409
-#: ../libgda/gda-xa-transaction.c:480 ../libgda/gda-xa-transaction.c:485
-#: ../libgda/gda-xa-transaction.c:512 ../libgda/gda-xa-transaction.c:542
-#: ../libgda/gda-xa-transaction.c:600 ../libgda/gda-xa-transaction.c:645
-#: ../libgda/gda-xa-transaction.c:679
+#: ../libgda/gda-xa-transaction.c:379 ../libgda/gda-xa-transaction.c:410
+#: ../libgda/gda-xa-transaction.c:481 ../libgda/gda-xa-transaction.c:486
+#: ../libgda/gda-xa-transaction.c:513 ../libgda/gda-xa-transaction.c:543
+#: ../libgda/gda-xa-transaction.c:601 ../libgda/gda-xa-transaction.c:646
+#: ../libgda/gda-xa-transaction.c:680
 #, c-format
 msgid "Provider error: %s method not implemented for provider %s"
 msgstr ""
 "Error de proveedor: El método %s no está implementado por el proveedor %s"
 
-#: ../libgda/handlers/gda-handler-bin.c:117
+#: ../libgda/handlers/gda-handler-bin.c:118
 msgid "Binary handler"
 msgstr "Manejador binario"
 
-#: ../libgda/handlers/gda-handler-bin.c:124
+#: ../libgda/handlers/gda-handler-bin.c:125
 msgid "Binary representation"
 msgstr "Representación binaria"
 
-#: ../libgda/handlers/gda-handler-boolean.c:117
-#: ../libgda/sqlite/gda-sqlite-handler-boolean.c:117
+#: ../libgda/handlers/gda-handler-boolean.c:118
+#: ../libgda/sqlite/gda-sqlite-handler-boolean.c:118
 #: ../providers/mysql/gda-mysql-handler-boolean.c:117
 msgid "Boolean values handler"
 msgstr "Manejador de valores booleanos"
 
-#: ../libgda/handlers/gda-handler-boolean.c:123
+#: ../libgda/handlers/gda-handler-boolean.c:124
 msgid "Boolean representation"
 msgstr "Representación de booleanos"
 
-#: ../libgda/handlers/gda-handler-numerical.c:136
+#: ../libgda/handlers/gda-handler-numerical.c:137
 msgid "Numerical representation"
 msgstr "Representación numérica"
 
-#: ../libgda/handlers/gda-handler-string.c:121
+#: ../libgda/handlers/gda-handler-string.c:122
 msgid "Strings handler"
 msgstr "Manipulador de cadenas"
 
-#: ../libgda/handlers/gda-handler-string.c:126
+#: ../libgda/handlers/gda-handler-string.c:127
 msgid "InternalString"
 msgstr "CadenaInterna"
 
-#: ../libgda/handlers/gda-handler-string.c:127
+#: ../libgda/handlers/gda-handler-string.c:128
 msgid "Strings representation"
 msgstr "Representación de cadenas"
 
-#: ../libgda/handlers/gda-handler-time.c:143
+#: ../libgda/handlers/gda-handler-time.c:144
 msgid "Time and Date handler"
 msgstr "Manipulador de hora y fecha"
 
-#: ../libgda/handlers/gda-handler-time.c:168
+#: ../libgda/handlers/gda-handler-time.c:169
 msgid "Time, Date and TimeStamp representation"
 msgstr "Representación de hora, fecha y marca temporal"
 
-#: ../libgda/handlers/gda-handler-type.c:115
+#: ../libgda/handlers/gda-handler-type.c:116
 msgid "Gda type handler"
 msgstr "Manipulador de tipo Gda"
 
-#: ../libgda/handlers/gda-handler-type.c:121
+#: ../libgda/handlers/gda-handler-type.c:122
 msgid "Gda type representation"
 msgstr "Representación de tipo Gda"
 
@@ -2669,15 +2672,15 @@ msgstr "Representación de tipo Gda"
 msgid "Table to create must have at least one row"
 msgstr "La tabla para crear debe tener al menos una fila"
 
-#: ../libgda/sqlite/gda-sqlite-handler-bin.c:115
+#: ../libgda/sqlite/gda-sqlite-handler-bin.c:116
 msgid "SQlite binary handler"
 msgstr "Manejador binario SQlite"
 
-#: ../libgda/sqlite/gda-sqlite-handler-bin.c:121
+#: ../libgda/sqlite/gda-sqlite-handler-bin.c:122
 msgid "SQlite binary representation"
 msgstr "Representación binaria SQlite"
 
-#: ../libgda/sqlite/gda-sqlite-handler-boolean.c:123
+#: ../libgda/sqlite/gda-sqlite-handler-boolean.c:124
 msgid "Sqlite boolean representation"
 msgstr "Representación de booleanos de SQLite"
 
@@ -2692,7 +2695,6 @@ msgstr "El parámetro «%s» no está presente en la declaración"
 #: ../libgda/sqlite/gda-sqlite-provider.c:183
 #: ../libgda/sqlite/gda-sqlite-provider.c:199
 #, c-format
-#| msgid "No value set for parameter '%s'"
 msgid "No column name to associate to parameter '%s'"
 msgstr "No existe el nombre de la columna para asociar con el parámetro «%s»"
 
@@ -2701,29 +2703,29 @@ msgid "Binding a BLOB for this type of statement is not supported"
 msgstr ""
 "No está soportada la vinculación de un BLOB para este tipo de declaración"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:581
+#: ../libgda/sqlite/gda-sqlite-provider.c:582
 msgid "Can't find libsqlite3."
 msgstr "No se puede encontrar libsqlite3."
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:633
-#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:264
-#: ../libgda/thread-wrapper/gda-thread-provider.c:389
-#: ../providers/bdb/gda-bdb-provider.c:155
-#: ../providers/jdbc/gda-jdbc-provider.c:354
+#: ../libgda/sqlite/gda-sqlite-provider.c:634
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:267
+#: ../libgda/thread-wrapper/gda-thread-provider.c:391
+#: ../providers/bdb/gda-bdb-provider.c:157
+#: ../providers/jdbc/gda-jdbc-provider.c:356
 #: ../providers/mdb/gda-mdb-provider.c:230
 #: ../providers/mysql/gda-mysql-provider.c:578
-#: ../providers/postgres/gda-postgres-provider.c:398
-#: ../providers/web/gda-web-provider.c:341
+#: ../providers/postgres/gda-postgres-provider.c:400
+#: ../providers/web/gda-web-provider.c:343
 msgid "Provider does not support asynchronous connection open"
 msgstr "El proveedor no soporta la apertura de conexiones asíncronas"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:657
+#: ../libgda/sqlite/gda-sqlite-provider.c:658
 #: ../providers/mdb/gda-mdb-provider.c:246
 msgid "The connection string must contain DB_DIR and DB_NAME values"
 msgstr "La cadena de conexión debe contener los valores DB_DIR y DB_NAME"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:684
-#: ../libgda/sqlite/gda-sqlite-provider.c:692
+#: ../libgda/sqlite/gda-sqlite-provider.c:685
+#: ../libgda/sqlite/gda-sqlite-provider.c:693
 #, c-format
 msgid ""
 "The connection string format has changed: replace URI with DB_DIR (the path "
@@ -2734,24 +2736,24 @@ msgstr ""
 "(la ruta al archivo de la base de datos) y DB_NAME (el archivo de la base de "
 "datos sin el «%s» al final)."
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:707
+#: ../libgda/sqlite/gda-sqlite-provider.c:708
 #: ../providers/mdb/gda-mdb-provider.c:288
 msgid ""
 "The DB_DIR part of the connection string must point to a valid directory"
 msgstr ""
 "La parte DB_DIR de la cadena de conexión debe apuntar a un directorio válido"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:749
+#: ../libgda/sqlite/gda-sqlite-provider.c:750
 msgid "Wrong encryption passphrase"
 msgstr "Contraseña de cifrado errónea"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:777
+#: ../libgda/sqlite/gda-sqlite-provider.c:778
 #, c-format
 msgid "Could not set empty_result_callbacks SQLite option: %s"
 msgstr "No se pudo establecer la opción de SQLite empty_result_callbacks: %s"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:992
-#: ../libgda/sqlite/gda-sqlite-provider.c:1032
+#: ../libgda/sqlite/gda-sqlite-provider.c:993
+#: ../libgda/sqlite/gda-sqlite-provider.c:1033
 #: ../libgda-ui/data-entries/plugins/libmain.c:85
 #: ../libgda-ui/data-entries/plugins/libmain.c:123
 #: ../libgda-ui/data-entries/plugins/libmain.c:151
@@ -2760,88 +2762,87 @@ msgstr "No se pudo establecer la opción de SQLite empty_result_callbacks: %s"
 #: ../libgda-ui/data-entries/plugins/libmain.c:257
 #: ../providers/mysql/gda-mysql-provider.c:847
 #: ../providers/mysql/gda-mysql-provider.c:888
-#: ../providers/postgres/gda-postgres-provider.c:736
-#: ../providers/postgres/gda-postgres-provider.c:792
+#: ../providers/postgres/gda-postgres-provider.c:739
+#: ../providers/postgres/gda-postgres-provider.c:795
 #, c-format
 msgid "Missing spec. file '%s'"
 msgstr "Falta el archivo spec. «%s»"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:1154
-#: ../libgda/sqlite/gda-sqlite-provider.c:1163
-#: ../libgda/sqlite/gda-sqlite-provider.c:1175
-#: ../libgda/sqlite/gda-sqlite-provider.c:1184
-#| msgid "Error while analysing database schema: %s"
+#: ../libgda/sqlite/gda-sqlite-provider.c:1155
+#: ../libgda/sqlite/gda-sqlite-provider.c:1164
+#: ../libgda/sqlite/gda-sqlite-provider.c:1176
+#: ../libgda/sqlite/gda-sqlite-provider.c:1185
 msgid "Error initializing database with passphrase"
 msgstr "Error al inicializar la base de datos con contraseña"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:1226
+#: ../libgda/sqlite/gda-sqlite-provider.c:1227
 msgid "Missing database name or directory"
 msgstr "Falta el nombre o el directorio de la base de datos"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:1252
-#: ../providers/postgres/gda-postgres-provider.c:992
-#: ../providers/postgres/gda-postgres-provider.c:993
+#: ../libgda/sqlite/gda-sqlite-provider.c:1253
+#: ../providers/postgres/gda-postgres-provider.c:996
+#: ../providers/postgres/gda-postgres-provider.c:997
 msgid "Transactions are not supported in read-only mode"
 msgstr "Las transacciones no están soportadas en el modo de sólo lectura"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2085
-#: ../providers/jdbc/gda-jdbc-provider.c:1115
-#: ../providers/postgres/gda-postgres-provider.c:1528
-#: ../providers/web/gda-web-provider.c:1259
+#: ../libgda/sqlite/gda-sqlite-provider.c:2086
+#: ../providers/jdbc/gda-jdbc-provider.c:1120
+#: ../providers/postgres/gda-postgres-provider.c:1533
+#: ../providers/web/gda-web-provider.c:1263
 msgid "Unnamed parameter is not allowed in prepared statements"
 msgstr "No se permite un parámetro si nombre en las declaraciones preparadas"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2197
-#: ../libgda/sqlite/gda-sqlite-provider.c:2209
+#: ../libgda/sqlite/gda-sqlite-provider.c:2198
+#: ../libgda/sqlite/gda-sqlite-provider.c:2210
 #: ../providers/mysql/gda-mysql-provider.c:1955
-#: ../providers/postgres/gda-postgres-provider.c:1672
+#: ../providers/postgres/gda-postgres-provider.c:1677
 #, c-format
 msgid "Can't build SELECT statement to get last inserted row: %s)"
 msgstr ""
 "No se puede construir una declaración SELECT para obtener la última fila "
 "insertada: %s)"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2231
+#: ../libgda/sqlite/gda-sqlite-provider.c:2232
 #: ../providers/mysql/gda-mysql-provider.c:1970
-#: ../providers/postgres/gda-postgres-provider.c:1687
+#: ../providers/postgres/gda-postgres-provider.c:1692
 #, c-format
 msgid "Can't execute SELECT statement to get last inserted row: %s"
 msgstr ""
 "No se puede ejecutar la declaración SELECT para obtener la última fila "
 "insertada: %s"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2244
+#: ../libgda/sqlite/gda-sqlite-provider.c:2245
 #: ../providers/mysql/gda-mysql-provider.c:1983
-#: ../providers/postgres/gda-postgres-provider.c:1700
+#: ../providers/postgres/gda-postgres-provider.c:1705
 msgid "SELECT statement to get last inserted row did not return any row"
 msgstr ""
 "La declaración SELECT para obtener la última fila insertada no devolvió "
 "ningún valor"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2248
+#: ../libgda/sqlite/gda-sqlite-provider.c:2249
 #: ../providers/mysql/gda-mysql-provider.c:1987
-#: ../providers/postgres/gda-postgres-provider.c:1704
+#: ../providers/postgres/gda-postgres-provider.c:1709
 #, c-format
 msgid "SELECT statement to get last inserted row returned too many (%d) rows"
 msgstr ""
 "La declaración SELECT para obtener la última fila insertada devolvió "
 "demasiadas (%d) filas"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2313
+#: ../libgda/sqlite/gda-sqlite-provider.c:2314
 msgid "Prepared statement has no associated GdaStatement"
 msgstr "La declaración preparada no tiene una GdaStatement asociada"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2353
-#: ../libgda/sqlite/gda-sqlite-provider.c:2390
+#: ../libgda/sqlite/gda-sqlite-provider.c:2354
+#: ../libgda/sqlite/gda-sqlite-provider.c:2391
 msgid "Can't create SQLite BLOB handle"
 msgstr "No se puede crear el manejador BLOB de SQLite"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2357
-#: ../libgda/sqlite/gda-sqlite-provider.c:2395
+#: ../libgda/sqlite/gda-sqlite-provider.c:2358
+#: ../libgda/sqlite/gda-sqlite-provider.c:2396
 msgid "Can't write to SQLite's BLOB"
 msgstr "No se puede escribir en el BLOB de SQLite"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2380
+#: ../libgda/sqlite/gda-sqlite-provider.c:2381
 #, c-format
 msgid ""
 "Can't obtain SQLite BLOB handle (reported type is '%s'), please report this "
@@ -2850,139 +2851,138 @@ msgstr ""
 "No se puede obtener el manejador de SQLite BLOB (el tipo informado es «%s»), "
 "informe del error en http://bugzilla.gnome.org/ para el producto «libgda»."
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2405
+#: ../libgda/sqlite/gda-sqlite-provider.c:2406
 msgid "Can't identify the ROWID of the blob to fill"
 msgstr "No se puede identificar el id de fila (ROWID) del BLOB que rellenar"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2453
-#: ../providers/jdbc/gda-jdbc-provider.c:1213
+#: ../libgda/sqlite/gda-sqlite-provider.c:2454
+#: ../providers/jdbc/gda-jdbc-provider.c:1218
 #: ../providers/mysql/gda-mysql-provider.c:2076
-#: ../providers/postgres/gda-postgres-provider.c:1799
-#: ../providers/web/gda-web-provider.c:1392
+#: ../providers/postgres/gda-postgres-provider.c:1804
+#: ../providers/web/gda-web-provider.c:1396
 msgid "Provider does not support asynchronous statement execution"
 msgstr "El proveedor no soporta la ejecución de conexiones asíncronas"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2521
-#: ../tools/browser/mgr-favorites.c:217 ../tools/browser/mgr-favorites.c:259
+#: ../libgda/sqlite/gda-sqlite-provider.c:2522
+#: ../tools/browser/mgr-favorites.c:224 ../tools/browser/mgr-favorites.c:266
 msgid "Empty statement"
 msgstr "Declaración vacía"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2563
-#: ../libgda/sqlite/gda-sqlite-provider.c:2566
-#: ../providers/jdbc/gda-jdbc-provider.c:1300
-#: ../providers/jdbc/gda-jdbc-provider.c:1303
+#: ../libgda/sqlite/gda-sqlite-provider.c:2564
+#: ../libgda/sqlite/gda-sqlite-provider.c:2567
+#: ../providers/jdbc/gda-jdbc-provider.c:1305
+#: ../providers/jdbc/gda-jdbc-provider.c:1308
 #: ../providers/mysql/gda-mysql-provider.c:2150
 #: ../providers/mysql/gda-mysql-provider.c:2153
-#: ../providers/postgres/gda-postgres-provider.c:1913
-#: ../providers/postgres/gda-postgres-provider.c:1916
-#: ../providers/web/gda-web-provider.c:1470
-#: ../providers/web/gda-web-provider.c:1473
+#: ../providers/postgres/gda-postgres-provider.c:1918
+#: ../providers/postgres/gda-postgres-provider.c:1921
+#: ../providers/web/gda-web-provider.c:1474
+#: ../providers/web/gda-web-provider.c:1477
 #, c-format
 msgid "Missing parameter(s) to execute query"
 msgstr "Falta(n) parámetro(s) para ejecutar la consulta"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2625
-#: ../providers/jdbc/gda-jdbc-provider.c:1382
+#: ../libgda/sqlite/gda-sqlite-provider.c:2626
+#: ../providers/jdbc/gda-jdbc-provider.c:1387
 #: ../providers/mysql/gda-mysql-provider.c:2214
-#: ../providers/postgres/gda-postgres-provider.c:1974
-#: ../providers/web/gda-web-provider.c:1537
+#: ../providers/postgres/gda-postgres-provider.c:1979
+#: ../providers/web/gda-web-provider.c:1541
 msgid "Can't rewrite statement handle default values"
 msgstr ""
 "No se puede reescribir la declaración para gestionar los valores "
 "predeterminados"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2689
+#: ../libgda/sqlite/gda-sqlite-provider.c:2690
 #: ../providers/mysql/gda-mysql-provider.c:2346
 msgid "Can't get BLOB's length"
 msgstr "No se puede obtener la longitud del BLOB"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2691
+#: ../libgda/sqlite/gda-sqlite-provider.c:2692
 #: ../providers/mysql/gda-mysql-provider.c:2348
 msgid "BLOB is too big"
 msgstr "El BLOB es demasiado grande"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2773
+#: ../libgda/sqlite/gda-sqlite-provider.c:2774
 #, c-format
 msgid "Non handled data type '%s'"
 msgstr "No existe un manejador del tipo de datos «%s»"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2829
-#| msgid "Could not set the XA transaction ID parameter"
+#: ../libgda/sqlite/gda-sqlite-provider.c:2830
 msgid "Could not start transaction to create BLOB"
 msgstr "No se pudo iniciar la transacción para crear el BLOB"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2991
-#: ../libgda/sqlite/gda-sqlite-provider.c:3012
-#: ../libgda/sqlite/gda-sqlite-provider.c:3078
+#: ../libgda/sqlite/gda-sqlite-provider.c:2992
+#: ../libgda/sqlite/gda-sqlite-provider.c:3013
+#: ../libgda/sqlite/gda-sqlite-provider.c:3079
 msgid "Function requires one argument"
 msgstr "La función requiere un argumento"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:3044
-#: ../libgda/sqlite/gda-sqlite-provider.c:3110
+#: ../libgda/sqlite/gda-sqlite-provider.c:3045
+#: ../libgda/sqlite/gda-sqlite-provider.c:3111
 msgid "Function requires two arguments"
 msgstr "La función requiere dos argumento"
 
-#: ../libgda/sqlite/gda-sqlite-recordset.c:234
-#: ../providers/jdbc/gda-jdbc-recordset.c:278
-#: ../providers/mysql/gda-mysql-recordset.c:427
-#: ../providers/postgres/gda-postgres-recordset.c:277
-#: ../providers/web/gda-web-recordset.c:217
+#: ../libgda/sqlite/gda-sqlite-recordset.c:235
+#: ../providers/jdbc/gda-jdbc-recordset.c:279
+#: ../providers/mysql/gda-mysql-recordset.c:429
+#: ../providers/postgres/gda-postgres-recordset.c:280
+#: ../providers/web/gda-web-recordset.c:218
 #, c-format
 msgid "Column %d out of range (0-%d), ignoring its specified type"
 msgstr "Columna %d fuera de rango (0 - %d), ignorando el tipo especificado"
 
-#: ../libgda/sqlite/gda-sqlite-recordset.c:385
-#: ../libgda/sqlite/gda-sqlite-recordset.c:397
+#: ../libgda/sqlite/gda-sqlite-recordset.c:386
+#: ../libgda/sqlite/gda-sqlite-recordset.c:398
 msgid "Integer value is too big"
 msgstr "El valor entero es demasiado grande"
 
-#: ../libgda/sqlite/gda-sqlite-recordset.c:462
+#: ../libgda/sqlite/gda-sqlite-recordset.c:463
 msgid "Unable to open BLOB"
 msgstr "No se puede abrir el BLOB"
 
-#: ../libgda/sqlite/gda-sqlite-recordset.c:482
-#: ../providers/postgres/gda-postgres-recordset.c:620
+#: ../libgda/sqlite/gda-sqlite-recordset.c:483
+#: ../providers/postgres/gda-postgres-recordset.c:624
 #, c-format
 msgid "Invalid date '%s' (date format should be YYYY-MM-DD)"
 msgstr "Fecha «%s» no válida (el formato debe ser AAAA-MM-DD)"
 
-#: ../libgda/sqlite/gda-sqlite-recordset.c:496
-#: ../providers/postgres/gda-postgres-recordset.c:631
+#: ../libgda/sqlite/gda-sqlite-recordset.c:497
+#: ../providers/postgres/gda-postgres-recordset.c:635
 #, c-format
 msgid "Invalid time '%s' (time format should be HH:MM:SS[.ms])"
 msgstr "Hora «%s» no válida (el formato debe ser HH:MM:SS[.ms])"
 
-#: ../libgda/sqlite/gda-sqlite-recordset.c:510
-#: ../providers/postgres/gda-postgres-recordset.c:675
+#: ../libgda/sqlite/gda-sqlite-recordset.c:511
+#: ../providers/postgres/gda-postgres-recordset.c:679
 #, c-format
 msgid "Invalid timestamp '%s' (format should be YYYY-MM-DD HH:MM:SS[.ms])"
 msgstr ""
 "Marca de tiempo «%s» no válida (el formato debe ser AAAA-MM-DD HH:MM:SS[.ms])"
 
-#: ../libgda/sqlite/gda-sqlite-recordset.c:544
+#: ../libgda/sqlite/gda-sqlite-recordset.c:545
 msgid "SQLite provider fatal internal error"
 msgstr "Error interno fatal del proveedor SQLite"
 
-#: ../libgda/sqlite/gda-sqlite-recordset.c:592
-#: ../providers/jdbc/gda-jdbc-recordset.c:490
+#: ../libgda/sqlite/gda-sqlite-recordset.c:593
+#: ../providers/jdbc/gda-jdbc-recordset.c:491
 #, c-format
 msgid "Row %d not found"
 msgstr "No se encontró la fila %d"
 
-#: ../libgda/sqlite/virtual/gda-vconnection-data-model.c:305
+#: ../libgda/sqlite/virtual/gda-vconnection-data-model.c:308
 msgid "Table to remove not found"
 msgstr "No se encontró la tabla para eliminar"
 
-#: ../libgda/sqlite/virtual/gda-vconnection-hub.c:208
+#: ../libgda/sqlite/virtual/gda-vconnection-hub.c:211
 msgid "Namespace must be specified"
 msgstr "Se debe especificar el nombre de espacio"
 
-#: ../libgda/sqlite/virtual/gda-vconnection-hub.c:258
+#: ../libgda/sqlite/virtual/gda-vconnection-hub.c:261
 msgid "Connection was not represented in hub"
 msgstr "La conexión no estaba representada en el concentrador"
 
-#: ../libgda/sqlite/virtual/gda-virtual-connection.c:153
-#: ../libgda/sqlite/virtual/gda-virtual-connection.c:190
+#: ../libgda/sqlite/virtual/gda-virtual-connection.c:154
+#: ../libgda/sqlite/virtual/gda-virtual-connection.c:191
 msgid ""
 "Internal error: virtual provider does not implement the create_operation() "
 "virtual method"
@@ -2990,47 +2990,47 @@ msgstr ""
 "Error interno: el proveedor virtual no implementa el método virtual "
 "create_operation()"
 
-#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:384
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:387
 msgid "Data model must have at least one column"
 msgstr "El modelo de datos debe tener al menos una columna"
 
-#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:402
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:405
 msgid "Could not compute virtual table's columns"
 msgstr "No se pudieron computar las tablas de la tabla virtual"
 
-#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:427
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:430
 #, c-format
 msgid "Can't get data model description for column %d"
 msgstr ""
 "No se puede obtener la descripción del modelo de datos para la columna %d"
 
-#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:441
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:444
 #, c-format
 msgid "Can't get data model's column type or type for column %d"
 msgstr ""
 "No se puede obtener el tipo de la columna del modelo de datos o el tipo para "
 "la columna %d"
 
-#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:489
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:492
 #, c-format
 msgid "Can't declare virtual table (%s)"
 msgstr "No se puede declarar la tabla virtual (%s)"
 
-#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:649
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:652
 msgid "Column not found"
 msgstr "No se encontró la columna"
 
-#: ../libgda/sql-parser/gda-sql-parser.c:635
-#: ../libgda/sql-parser/gda-sql-parser.c:726
+#: ../libgda/sql-parser/gda-sql-parser.c:636
+#: ../libgda/sql-parser/gda-sql-parser.c:727
 msgid "SQL code does not contain any statement"
 msgstr "El código SQL no contiene ninguna declaración"
 
-#: ../libgda/sql-parser/gda-sql-parser.c:809
+#: ../libgda/sql-parser/gda-sql-parser.c:810
 #, c-format
 msgid "Syntax error at line %d, column %d"
 msgstr "Error de sintaxis en la línea %d, columna %d"
 
-#: ../libgda/sql-parser/gda-sql-parser.c:822
+#: ../libgda/sql-parser/gda-sql-parser.c:823
 #, c-format
 msgid "Overflow error at line %d, column %d"
 msgstr "Error de sobrecarga en la línea %d, columna %d"
@@ -3126,8 +3126,8 @@ msgstr ""
 #: ../libgda/sql-parser/gda-statement-struct.c:1143
 msgid "Cross join can't have a join condition or a list of fields to join on"
 msgstr ""
-"El «JOIN» cruzado no puede tener una condición de «JOIN» o una lista de campos "
-"que unir"
+"El «JOIN» cruzado no puede tener una condición de «JOIN» o una lista de "
+"campos que unir"
 
 #: ../libgda/sql-parser/gda-statement-struct.c:1152
 msgid "Empty FROM clause"
@@ -3137,54 +3137,54 @@ msgstr "Cláusula FROM vacía"
 msgid "Select field is not in a SELECT statement"
 msgstr "El campo SELECT no está en una declaración SELECT"
 
-#: ../libgda/sql-parser/gda-statement-struct-compound.c:220
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:224
 msgid "COMPOUND statement contains an undefined COMPOUND statement"
 msgstr "La declaración COMPOUND contiene una declaración COMPOUND no definida"
 
-#: ../libgda/sql-parser/gda-statement-struct-compound.c:229
-#: ../libgda/sql-parser/gda-statement-struct-compound.c:268
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:233
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:272
 msgid "COMPOUND statement contains an undefined SELECT statement"
 msgstr "La declaración COMPOUND contiene una declaración SELECT no definida"
 
-#: ../libgda/sql-parser/gda-statement-struct-compound.c:238
-#: ../libgda/sql-parser/gda-statement-struct-compound.c:280
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:242
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:284
 msgid "COMPOUND statement contains a non SELECT statement"
 msgstr "La declaración COMPOUND contiene una declaración que no es SELECT"
 
-#: ../libgda/sql-parser/gda-statement-struct-compound.c:252
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:256
 msgid "COMPOUND statement does not contain any SELECT statement"
 msgstr "La declaración COMPOUND no contiene ninguna declaración SELECT"
 
-#: ../libgda/sql-parser/gda-statement-struct-compound.c:258
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:262
 msgid "COMPOUND statement only contains one SELECT statement"
 msgstr "La declaración COMPOUND ya contiene una declaración SELECT"
 
-#: ../libgda/sql-parser/gda-statement-struct-compound.c:288
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:292
 msgid "COMPOUND statement contains an empty SELECT statement"
 msgstr "La declaración COMPOUND contiene una declaración SELECT vacía"
 
-#: ../libgda/sql-parser/gda-statement-struct-compound.c:294
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:298
 msgid "All statements in a COMPOUND must have the same number of columns"
 msgstr ""
 "Todas las declaraciones en una declaración COMPOUND deben tener el mismo "
 "número de columnas"
 
-#: ../libgda/sql-parser/gda-statement-struct-delete.c:160
+#: ../libgda/sql-parser/gda-statement-struct-delete.c:164
 msgid "DELETE statement needs a table to delete from"
 msgstr "La declaración DELETE necesita una tabla de la que borrar"
 
-#: ../libgda/sql-parser/gda-statement-struct-insert.c:351
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:355
 msgid "INSERT statement needs a table to insert into"
 msgstr "La declaración INSERT necesita una tabla en la que insertar"
 
-#: ../libgda/sql-parser/gda-statement-struct-insert.c:357
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:361
 msgid "Can't specify values to insert and SELECT statement in INSERT statement"
 msgstr ""
 "No se pueden especificar valores para insertar y una declaración SELECT en "
 "una declaración INSERT"
 
-#: ../libgda/sql-parser/gda-statement-struct-insert.c:376
-#: ../libgda/sql-parser/gda-statement-struct-insert.c:402
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:382
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:408
 msgid ""
 "INSERT statement does not have the same number of target columns and "
 "expressions"
@@ -3192,40 +3192,40 @@ msgstr ""
 "La declaración INSERT no tiene el mismo número de columnas objetivo y "
 "expresiones"
 
-#: ../libgda/sql-parser/gda-statement-struct-insert.c:405
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:411
 msgid "VALUES lists must all be the same length in INSERT statement"
 msgstr ""
 "Las listas VALUES deben tener todas la misma longitud en las declaraciones "
 "INSERT"
 
-#: ../libgda/sql-parser/gda-statement-struct-select.c:400
+#: ../libgda/sql-parser/gda-statement-struct-select.c:404
 msgid "SELECT does not contain any expression"
 msgstr "SELECT no contiene ninguna expresion"
 
-#: ../libgda/sql-parser/gda-statement-struct-select.c:406
+#: ../libgda/sql-parser/gda-statement-struct-select.c:410
 msgid "SELECT can't have a DISTINCT expression if DISTINCT is not set"
 msgstr ""
 "SELECT no puede tener una expresión DISTINCT si DISTINCT no está establecido"
 
-#: ../libgda/sql-parser/gda-statement-struct-select.c:412
+#: ../libgda/sql-parser/gda-statement-struct-select.c:416
 msgid "SELECT can't have a HAVING without GROUP BY"
 msgstr "SELECT no puede tener un HAVING sin un GROUP BY"
 
-#: ../libgda/sql-parser/gda-statement-struct-select.c:418
+#: ../libgda/sql-parser/gda-statement-struct-select.c:422
 msgid "SELECT can't have a limit offset without a limit"
 msgstr "SELECT no puede tener un «limit offset» sin un límite"
 
-#: ../libgda/sql-parser/gda-statement-struct-select.c:443
-#: ../libgda/sql-parser/gda-statement-struct-select.c:452
+#: ../libgda/sql-parser/gda-statement-struct-select.c:447
+#: ../libgda/sql-parser/gda-statement-struct-select.c:456
 #, c-format
 msgid "Multiple targets named or aliased '%s'"
 msgstr "Existen varios destinos llamados «%s»"
 
-#: ../libgda/sql-parser/gda-statement-struct-update.c:277
+#: ../libgda/sql-parser/gda-statement-struct-update.c:281
 msgid "UPDATE statement needs a table to update data"
 msgstr "La declaración UPDATE requiere una tabla para actualizar los datos"
 
-#: ../libgda/sql-parser/gda-statement-struct-update.c:283
+#: ../libgda/sql-parser/gda-statement-struct-update.c:287
 msgid ""
 "UPDATE statement does not have the same number of target columns and "
 "expressions"
@@ -3233,143 +3233,144 @@ msgstr ""
 "La declaración UPDATE no tiene el mismo número de columnas y expresiones de "
 "destino "
 
-#: ../libgda/sql-parser/gda-statement-struct-update.c:289
+#: ../libgda/sql-parser/gda-statement-struct-update.c:293
 msgid "UPDATE statement does not have any target columns to update"
 msgstr ""
 "La declaración UPDATE no tiene ninguna columna de destino para actualizar"
 
-#: ../libgda/thread-wrapper/gda-thread-provider.c:810
-#: ../libgda/thread-wrapper/gda-thread-provider.c:863
-#: ../libgda/thread-wrapper/gda-thread-provider.c:922
-#: ../libgda/thread-wrapper/gda-thread-provider.c:977
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1032
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1079
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1126
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1173
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1220
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1749
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1798
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1846
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1895
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1943
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1992
+#: ../libgda/thread-wrapper/gda-thread-provider.c:816
+#: ../libgda/thread-wrapper/gda-thread-provider.c:869
+#: ../libgda/thread-wrapper/gda-thread-provider.c:929
+#: ../libgda/thread-wrapper/gda-thread-provider.c:984
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1039
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1086
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1133
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1180
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1227
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1757
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1806
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1854
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1903
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1951
+#: ../libgda/thread-wrapper/gda-thread-provider.c:2000
 #, c-format
 msgid "A connection is required"
 msgstr "Se necesita una conexión"
 
-#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1059
-#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1153
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1066
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1160
 msgid "Signal does not exist\n"
 msgstr "La señal no existe\n"
 
-#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1068
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1075
 msgid "Signal to connect to must not have a return value\n"
 msgstr "La señal para conectar debe no tener un valor de retorno\n"
 
-#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1140
-#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1207
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1147
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1214
 #, c-format
 msgid "Signal %lu does not exist"
 msgstr "La señal %lu no existe"
 
-#: ../libgda-report/DocBook/gda-report-docbook-document.c:284
-#: ../libgda-report/DocBook/gda-report-docbook-document.c:353
-#: ../libgda-report/RML/gda-report-rml-document.c:209
-#: ../libgda-report/RML/gda-report-rml-document.c:240
+#: ../libgda-report/DocBook/gda-report-docbook-document.c:288
+#: ../libgda-report/DocBook/gda-report-docbook-document.c:357
+#: ../libgda-report/RML/gda-report-rml-document.c:212
+#: ../libgda-report/RML/gda-report-rml-document.c:243
 #, c-format
 msgid "Could not find the '%s' program"
 msgstr "No se pudo encontrar el programa «%s»"
 
-#: ../libgda-report/DocBook/gda-report-docbook-document.c:299
+#: ../libgda-report/DocBook/gda-report-docbook-document.c:303
 msgid "Could not find the DocBook XSL stylesheet for HTML"
 msgstr "No se pudo encontrar la hoja de estilos DocBook XSL para HTML"
 
-#: ../libgda-report/DocBook/gda-report-docbook-document.c:367
+#: ../libgda-report/DocBook/gda-report-docbook-document.c:371
 msgid "Could not find the DocBook XSL stylesheet for Formatting Objects"
 msgstr ""
 "No se pudo encontrar la hoja de estilos DocBook XSL para formatear objetos"
 
-#: ../libgda-report/engine/gda-report-engine.c:308
+#: ../libgda-report/engine/gda-report-engine.c:311
 #, c-format
 msgid "Object type '%s' cannot be declared in this context"
 msgstr "No se puede declarar el tipo de objeto «%s» en este contexto"
 
-#: ../libgda-report/engine/gda-report-engine.c:316
+#: ../libgda-report/engine/gda-report-engine.c:319
 #, c-format
 msgid "An object with the '%s' name has already been declared"
 msgstr "Ya se ha declarado un objeto con el nombre «%s»"
 
-#: ../libgda-report/engine/gda-report-engine.c:351
+#: ../libgda-report/engine/gda-report-engine.c:354
 #, c-format
 msgid "Object type '%s' cannot be requested in this context"
 msgstr "No se puede requerir el tipo de objeto «%s» en este contexto"
 
-#: ../libgda-report/engine/gda-report-engine.c:570
+#: ../libgda-report/engine/gda-report-engine.c:573
 #, c-format
 msgid "Unknown query '%s'"
 msgstr "Consulta «%s» desconocida"
 
-#: ../libgda-report/engine/gda-report-engine.c:581
-#: ../libgda-report/engine/gda-report-engine.c:608 ../tools/gda-sql.c:2983
-#: ../tools/gda-sql.c:3065 ../tools/gda-sql.c:3165 ../tools/gda-sql.c:3241
+#: ../libgda-report/engine/gda-report-engine.c:584
+#: ../libgda-report/engine/gda-report-engine.c:611 ../tools/gda-sql.c:2989
+#: ../tools/gda-sql.c:3071 ../tools/gda-sql.c:3172 ../tools/gda-sql.c:3249
 #, c-format
 msgid "No connection named '%s' found"
 msgstr "No se encontró ninguna conexión llamada «%s»"
 
-#: ../libgda-report/engine/gda-report-engine.c:653
+#: ../libgda-report/engine/gda-report-engine.c:656
 msgid "Query is not specified (not named and not defined)"
 msgstr "No se especificó la consulta (sin nombre y sin definición)"
 
-#: ../libgda-report/engine/gda-report-engine.c:817
-#: ../libgda-report/engine/gda-report-engine.c:959
-#: ../libgda-report/engine/gda-report-engine.c:1016
+#: ../libgda-report/engine/gda-report-engine.c:820
+#: ../libgda-report/engine/gda-report-engine.c:962
+#: ../libgda-report/engine/gda-report-engine.c:1019
 #, c-format
 msgid "Unknown parameter '%s'"
 msgstr "Parámetro «%s» desconocido"
 
-#: ../libgda-report/engine/gda-report-engine.c:834
+#: ../libgda-report/engine/gda-report-engine.c:837
 msgid "Parameter name not specified"
 msgstr "No se especificó el nombre del parámetro"
 
-#: ../libgda-report/engine/gda-report-engine.c:884
+#: ../libgda-report/engine/gda-report-engine.c:887
 msgid "No expression specified"
 msgstr "No se especificó una expresión"
 
-#: ../libgda-report/engine/gda-report-engine.c:907
+#: ../libgda-report/engine/gda-report-engine.c:910
 #, c-format
 msgid "Cannot cast value from type '%s' to type '%s'"
-msgstr "No se puede ejecutar un «cast» sobre el valor del tipo «%s» al tipo «%s»"
+msgstr ""
+"No se puede ejecutar un «cast» sobre el valor del tipo «%s» al tipo «%s»"
 
-#: ../libgda-report/engine/gda-report-engine.c:1045
+#: ../libgda-report/engine/gda-report-engine.c:1048
 #, c-format
 msgid "Cannot cast parameter from type '%s' to type '%s'"
 msgstr ""
 "No se puede ejecutar un «cast» sobre el parámetro del tipo «%s» al tipo «%s»"
 
-#: ../libgda-report/engine/gda-report-engine.c:1138
+#: ../libgda-report/engine/gda-report-engine.c:1141
 #, c-format
 msgid "Expression '%s' should return exactly one value"
 msgstr "La expresión «%s» debería devolver exactamente un valor"
 
-#: ../libgda-report/engine/gda-report-engine.c:1175
+#: ../libgda-report/engine/gda-report-engine.c:1178
 msgid "Binary data"
 msgstr "Dato binario"
 
-#: ../libgda-report/gda-report-document.c:254
+#: ../libgda-report/gda-report-document.c:257
 msgid "Document not specified"
 msgstr "No se ha especificado el documento"
 
-#: ../libgda-report/gda-report-document.c:281
+#: ../libgda-report/gda-report-document.c:284
 msgid "Cannot create temporary file"
 msgstr "No se pudo crear el archivo temporal"
 
-#: ../libgda-report/gda-report-document.c:308
+#: ../libgda-report/gda-report-document.c:311
 #, c-format
 msgid "Execution of the %s program failed: %s"
 msgstr "Falló la ejecución del programa %s: %s"
 
-#: ../libgda-report/gda-report-document.c:346
-#: ../libgda-report/gda-report-document.c:371
+#: ../libgda-report/gda-report-document.c:349
+#: ../libgda-report/gda-report-document.c:374
 #, c-format
 msgid "This report document does not handle %s output"
 msgstr "Este informe del documento no maneja salidas en %s"
@@ -3434,64 +3435,64 @@ msgid "Unknown"
 msgstr "Desconocido"
 
 #. FIXME: find a better label
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-bin.c:158
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c:155
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:187
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:167
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-pict.c:182
-#: ../libgda-ui/gdaui-basic-form.c:717 ../libgda-ui/gdaui-basic-form.c:753
-#: ../libgda-ui/gdaui-raw-grid.c:740 ../tools/gda-sql.c:2660
-#: ../tools/gda-sql.c:2835 ../tools/gda-sql.c:4015
-msgid "Value"
-msgstr "Valor"
-
 #: ../libgda-ui/data-entries/gdaui-data-cell-renderer-bin.c:159
 #: ../libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c:156
 #: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:188
 #: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:168
 #: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-pict.c:183
+#: ../libgda-ui/gdaui-basic-form.c:719 ../libgda-ui/gdaui-basic-form.c:754
+#: ../libgda-ui/gdaui-raw-grid.c:741 ../tools/gda-sql.c:2662
+#: ../tools/gda-sql.c:2840 ../tools/gda-sql.c:4024
+msgid "Value"
+msgstr "Valor"
+
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-bin.c:160
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c:157
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:189
+#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:169
+#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-pict.c:184
 msgid "GValue to render"
 msgstr "GValue para renderizar"
 
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-bin.c:171
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c:168
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-info.c:160
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-pict.c:195
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-bin.c:172
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c:169
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-info.c:161
+#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-pict.c:196
 msgid "Editable"
 msgstr "Editable"
 
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c:169
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-pict.c:196
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c:170
+#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-pict.c:197
 msgid "The toggle button can be activated"
 msgstr "El botón conmutable puede ser activado"
 
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:161
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:162
 msgid "Values limited to PK fields"
 msgstr "Valores limitados a campos PK"
 
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:162
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:163
 msgid "GList of GValue to render, limited to PK fields"
 msgstr "Glist de GValue para renderizar, limitado a los campos PK"
 
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:168
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:169
 msgid "Values"
 msgstr "Valores"
 
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:169
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:170
 msgid "GList of GValue to render, not limited to PK fields "
 msgstr "Glist del GValue a renderizar, no limitado a los campos PK"
 
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-info.c:161
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-info.c:162
 msgid "The information and status changer can be activated"
 msgstr "El cambiador de información y estado puede ser activado"
 
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:408
-#: ../libgda-ui/data-entries/gdaui-entry-string.c:399
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:409
+#: ../libgda-ui/data-entries/gdaui-entry-string.c:400
 msgid "<string cut because too long>"
 msgstr "<cadena cortada porque es demasiado larga>"
 
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:433
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:273
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:434
+#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:274
 #, c-format
 msgid ""
 "Data cell renderer's specified type (%s) differs from actual value to "
@@ -3500,8 +3501,8 @@ msgstr ""
 "El tipo especificado del renderizador de la celda de datos (%s) difiere del "
 "valor actual del tipo que mostrar (%s)"
 
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:440
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:279
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:441
+#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:280
 #, c-format
 msgid ""
 "Data cell renderer asked to display values of different data types, at least "
@@ -3511,40 +3512,41 @@ msgstr ""
 "diferentes, al menos %s y %s, lo que significa que el modelo de datos tiene "
 "algunas incoherencias"
 
-#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:490
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:298
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:491
+#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:299
 msgid "<non-printable>"
 msgstr "<no imprimible>"
 
-#: ../libgda-ui/data-entries/gdaui-entry.c:201
-#: ../libgda-ui/data-entries/gdaui-entry.c:220
-#: ../libgda-ui/data-entries/gdaui-formatted-entry.c:163
+#: ../libgda-ui/data-entries/gdaui-entry.c:202
+#: ../libgda-ui/data-entries/gdaui-entry.c:221
+#: ../libgda-ui/data-entries/gdaui-formatted-entry.c:164
 msgid "Invalid UTF-8 format!"
 msgstr "Formato UTF-8 no válido."
 
 #. format tooltip
-#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1053
+#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1055
 msgid "Format is hh:mm:ss"
 msgstr "El formato es hh:mm:ss"
 
-#: ../libgda-ui/data-entries/gdaui-entry-shell.c:245
+#: ../libgda-ui/data-entries/gdaui-entry-shell.c:246
 #, c-format
 msgid ""
 "Widget of class '%s' does not have any associated GdaDataHandler, (to be set "
 "using the 'handler' property) expect some mis-behaviours"
 msgstr ""
-"El widget de la clase «%s» no tiene asociado un GdaDataHandler, (a establecer "
-"usando la propiedad «manejador») espere algún comportamiento no deseado"
+"El widget de la clase «%s» no tiene asociado un GdaDataHandler, (a "
+"establecer usando la propiedad «manejador») espere algún comportamiento no "
+"deseado"
 
-#: ../libgda-ui/data-entries/gdaui-entry-shell.c:407
+#: ../libgda-ui/data-entries/gdaui-entry-shell.c:408
 msgid "Value is NULL"
 msgstr "El valor es NULL"
 
-#: ../libgda-ui/data-entries/gdaui-entry-shell.c:413
+#: ../libgda-ui/data-entries/gdaui-entry-shell.c:414
 msgid "Value will be determined by default"
 msgstr "El valor se determinará de forma predeterminada"
 
-#: ../libgda-ui/data-entries/gdaui-entry-shell.c:419
+#: ../libgda-ui/data-entries/gdaui-entry-shell.c:420
 msgid "Value is invalid"
 msgstr "El valor no es válido"
 
@@ -3601,29 +3603,29 @@ msgstr "Longitud máxima"
 msgid "Multiline"
 msgstr "Multilínea"
 
-#: ../libgda-ui/data-entries/gdaui-formatted-entry.c:274
+#: ../libgda-ui/data-entries/gdaui-formatted-entry.c:275
 #, c-format
 msgid "Unknown format character starting at %s"
 msgstr "Formato del carácter desconocido comenzando en %s"
 
-#: ../libgda-ui/data-entries/gdaui-numeric-entry.c:266
+#: ../libgda-ui/data-entries/gdaui-numeric-entry.c:267
 #, c-format
 msgid "Type %s is not numerical"
 msgstr "El tipo %s no es numérico"
 
-#: ../libgda-ui/data-entries/gdaui-numeric-entry.c:279
+#: ../libgda-ui/data-entries/gdaui-numeric-entry.c:280
 #, c-format
 msgid "Decimal separator cannot be the '%c' character"
 msgstr "El separador decimal no puede ser el carácter «%c»"
 
-#: ../libgda-ui/data-entries/gdaui-numeric-entry.c:288
+#: ../libgda-ui/data-entries/gdaui-numeric-entry.c:289
 #, c-format
 msgid "Decimal thousands cannot be the '%c' character"
 msgstr "El separador de miles no puede ser el carácter «%c»"
 
 #: ../libgda-ui/data-entries/plugins/common-pict.c:108
 #: ../libgda-ui/data-entries/plugins/common-pict.c:121
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict.c:415
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict.c:416
 #, c-format
 msgid "Empty data"
 msgstr "Datos vacíos"
@@ -3735,15 +3737,15 @@ msgstr "Cadena"
 msgid "Variable"
 msgstr "Variable"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cidr.c:257
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cidr.c:258
 msgid "Mask settings"
 msgstr "Configuración de máscaras"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cidr.c:263
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cidr.c:264
 msgid "Set to host mask"
 msgstr "Establecer a la máscara del equipo"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cidr.c:272
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cidr.c:273
 #, c-format
 msgid "Set to class %c network"
 msgstr "Establecer a clase de red %c"
@@ -3774,15 +3776,15 @@ msgstr "Modelo de selección"
 msgid "Specifies what the user will be allowed to select"
 msgstr "Especifica qué se le permite seleccionar al usuario"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel.c:194
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel.c:195
 msgid "Choose a file"
 msgstr "Elegir un archivo"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel.c:196
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel.c:197
 msgid "Choose a directory"
 msgstr "Elegir un directorio"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel.c:232
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel.c:233
 msgid "Choose"
 msgstr "Elegir"
 
@@ -3825,7 +3827,7 @@ msgstr "Base 64"
 msgid "Encoding used to convert binary data to the string"
 msgstr "Codificación usada para convertir datos binarios a la cadena"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict.c:258
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict.c:259
 msgid "No data to display"
 msgstr "No hay datos para mostrar"
 
@@ -3862,7 +3864,7 @@ msgid "break lines anywhere the cursor can appear"
 msgstr "Saltar líneas siempre que pueda aparecer el cursor"
 
 #: ../libgda-ui/data/server_operation.glade.h:1
-#: ../tools/browser/schema-browser/table-info.c:378
+#: ../tools/browser/schema-browser/table-info.c:385
 msgid "Columns"
 msgstr "Columnas"
 
@@ -3874,10 +3876,10 @@ msgstr "Restricciones"
 msgid "Foreign keys"
 msgstr "Claves externas"
 
-#: ../libgda-ui/data/server_operation.glade.h:4 ../tools/gda-sql.c:1998
-#: ../tools/gda-sql.c:2097 ../tools/gda-sql.c:2109 ../tools/gda-sql.c:2121
-#: ../tools/gda-sql.c:2229 ../tools/gda-sql.c:2241 ../tools/gda-sql.c:2253
-#: ../tools/gda-sql.c:2447
+#: ../libgda-ui/data/server_operation.glade.h:4 ../tools/gda-sql.c:1999
+#: ../tools/gda-sql.c:2098 ../tools/gda-sql.c:2110 ../tools/gda-sql.c:2122
+#: ../tools/gda-sql.c:2230 ../tools/gda-sql.c:2242 ../tools/gda-sql.c:2254
+#: ../tools/gda-sql.c:2448
 msgid "General"
 msgstr "General"
 
@@ -3885,13 +3887,13 @@ msgstr "General"
 msgid "hello"
 msgstr "hola"
 
-#: ../libgda-ui/demos/main.c:760
+#: ../libgda-ui/demos/main.c:762
 #, c-format
 msgid "Can't find demo database file: %s"
 msgstr ""
 "No se puede encontrar el archivo de base de datos de la demostración: %s"
 
-#: ../libgda-ui/demos/main.c:770
+#: ../libgda-ui/demos/main.c:772
 #, c-format
 msgid ""
 "Error opening the connection for file '%s':\n"
@@ -3900,11 +3902,11 @@ msgstr ""
 "Error al abrir la conexión para el archivo «%s»:\n"
 "%s\n"
 
-#: ../libgda-ui/demos/main.c:798
+#: ../libgda-ui/demos/main.c:800
 msgid "Libgda-ui Code Demos"
 msgstr "Demostraciones de código de libgda-ui"
 
-#: ../libgda-ui/demos/main.c:853
+#: ../libgda-ui/demos/main.c:855
 #, c-format
 msgid ""
 "<b><big>Note:\n"
@@ -3925,7 +3927,7 @@ msgstr ""
 "<i>demo_dict</i> los crea el «framework» y están disponibles\n"
 "para todos los elementos demostrados."
 
-#: ../libgda-ui/internal/gdaui-provider-auth-editor.c:406
+#: ../libgda-ui/internal/gdaui-provider-auth-editor.c:414
 msgid "Can't set authentification string: no authentication is needed"
 msgstr ""
 "No se puede establecer la cadena de autenticación: no se necesita "
@@ -4004,7 +4006,7 @@ msgstr "Descartar datos modificados"
 msgid "Correct data first"
 msgstr "Corregir datos primero"
 
-#: ../libgda-ui/gdaui-basic-form.c:260
+#: ../libgda-ui/gdaui-basic-form.c:261
 msgid ""
 "Pointer to an XML layout specification  (as an xmlNodePtr to a <gdaui_form> "
 "node)"
@@ -4012,46 +4014,46 @@ msgstr ""
 "Puntero a una especificación de distribución de datos XML (como un "
 "xmlNodePtr hacia un nodo <gdaui_form>)"
 
-#: ../libgda-ui/gdaui-basic-form.c:264
+#: ../libgda-ui/gdaui-basic-form.c:265
 msgid "List of parameters to show in the form"
 msgstr "Lista de parámetros para mostrar en el formulario"
 
-#: ../libgda-ui/gdaui-basic-form.c:268
+#: ../libgda-ui/gdaui-basic-form.c:269
 msgid "Entry headers are sensitive"
 msgstr "Las cabeceras de entrada son sensibles"
 
-#: ../libgda-ui/gdaui-basic-form.c:273
+#: ../libgda-ui/gdaui-basic-form.c:274
 msgid "Show Entry actions"
 msgstr "Mostrar acciones de las entradas"
 
-#: ../libgda-ui/gdaui-basic-form.c:278
+#: ../libgda-ui/gdaui-basic-form.c:279
 msgid "Entries Auto-default"
 msgstr "Entradas autopredeterminadas"
 
-#: ../libgda-ui/gdaui-basic-form.c:283
+#: ../libgda-ui/gdaui-basic-form.c:284
 msgid "TRUE if expanding the form vertically makes sense"
 msgstr "Cierto si tiene sentido expandir el formulario verticalmente"
 
-#: ../libgda-ui/gdaui-basic-form.c:839 ../libgda-ui/gdaui-raw-grid.c:781
-#: ../libgda-ui/gdaui-raw-grid.c:2614
+#: ../libgda-ui/gdaui-basic-form.c:840 ../libgda-ui/gdaui-raw-grid.c:782
+#: ../libgda-ui/gdaui-raw-grid.c:2615
 #, c-format
 msgid "The '%s' attribute should be a G_TYPE_STRING value"
 msgstr "El atributo «%s» debería ser un valor G_TYPE_STRING"
 
-#: ../libgda-ui/gdaui-basic-form.c:1738
+#: ../libgda-ui/gdaui-basic-form.c:1739
 msgid "Can't find data entry for GdaHolder"
 msgstr "No se puede encontrar la entrada para el GdaHolder"
 
-#: ../libgda-ui/gdaui-basic-form.c:2010
+#: ../libgda-ui/gdaui-basic-form.c:2011
 msgid "Values to be filled"
 msgstr "Valores para rellenar"
 
-#: ../libgda-ui/gdaui-basic-form.c:2091 ../libgda-ui/gdaui-raw-grid.c:2441
+#: ../libgda-ui/gdaui-basic-form.c:2093 ../libgda-ui/gdaui-raw-grid.c:2442
 #, c-format
 msgid "'%s' document not parsed successfully"
 msgstr "El documento «%s» no se analizó correctamente"
 
-#: ../libgda-ui/gdaui-basic-form.c:2101 ../libgda-ui/gdaui-raw-grid.c:2451
+#: ../libgda-ui/gdaui-basic-form.c:2103 ../libgda-ui/gdaui-raw-grid.c:2452
 #, c-format
 msgid ""
 "'%s' DTD not parsed successfully. XML data layout validation will not be "
@@ -4060,7 +4062,7 @@ msgstr ""
 "El DTD «%s» no se analizó correctamente. No se realizará la validación de la "
 "distribución de datos XML (podrían ocurrir algunos errores)"
 
-#: ../libgda-ui/gdaui-basic-form.c:2233
+#: ../libgda-ui/gdaui-basic-form.c:2235
 msgid ""
 "size group was not taken into account using "
 "gdaui_basic_form_add_to_size_group()"
@@ -4068,54 +4070,54 @@ msgstr ""
 "el tamaño del grupo no se tuvo en cuenta, usando "
 "gdaui_basic_form_add_to_size_group()"
 
-#: ../libgda-ui/gdaui-cloud.c:244 ../libgda-ui/gdaui-cloud.c:981
+#: ../libgda-ui/gdaui-cloud.c:245 ../libgda-ui/gdaui-cloud.c:982
 #, c-format
 msgid "Wrong column type for label: expecting a string and got a %s"
 msgstr ""
 "Tipo de columna incorrecto para la etiqueta: se esperaba una cadena y se "
 "obtuvo %s"
 
-#: ../libgda-ui/gdaui-cloud.c:1074 ../tools/browser/common/objects-cloud.c:457
+#: ../libgda-ui/gdaui-cloud.c:1075 ../tools/browser/common/objects-cloud.c:458
 msgid "Find:"
 msgstr "Buscar:"
 
-#: ../libgda-ui/gdaui-combo.c:128
+#: ../libgda-ui/gdaui-combo.c:129
 msgid "The data model to display"
 msgstr "El modelo de datos para mostrar"
 
-#: ../libgda-ui/gdaui-combo.c:132
+#: ../libgda-ui/gdaui-combo.c:133
 msgid "Display popup as list"
 msgstr "Mostrar las ventanas emergentes como una lista"
 
-#: ../libgda-ui/gdaui-data-store.c:135
+#: ../libgda-ui/gdaui-data-store.c:136
 msgid "Data model"
 msgstr "Modelo de datos"
 
-#: ../libgda-ui/gdaui-data-store.c:139
+#: ../libgda-ui/gdaui-data-store.c:140
 msgid "Internal GdaDataProxy data model"
 msgstr "Modelo de datos GdaDataProxy interno"
 
-#: ../libgda-ui/gdaui-data-store.c:382
+#: ../libgda-ui/gdaui-data-store.c:389
 msgid "Trying to modify a read-only row"
 msgstr "Intentando modificar una fila de sólo lectura"
 
-#: ../libgda-ui/gdaui-data-filter.c:182
+#: ../libgda-ui/gdaui-data-filter.c:183
 msgid "Filter failed:"
 msgstr "Falló el filtro:"
 
-#: ../libgda-ui/gdaui-data-filter.c:216
+#: ../libgda-ui/gdaui-data-filter.c:217
 msgid "Filter"
 msgstr "Filtro"
 
-#: ../libgda-ui/gdaui-data-filter.c:216
+#: ../libgda-ui/gdaui-data-filter.c:217
 msgid "any valid SQL expression"
 msgstr "cualquier expresión SQL válida"
 
-#: ../libgda-ui/gdaui-data-filter.c:232
+#: ../libgda-ui/gdaui-data-filter.c:233
 msgid "Set filter"
 msgstr "Activar filtro"
 
-#: ../libgda-ui/gdaui-data-filter.c:237
+#: ../libgda-ui/gdaui-data-filter.c:238
 msgid "Clear filter"
 msgstr "Limpiar filtro"
 
@@ -4130,11 +4132,11 @@ msgstr ""
 "cargado."
 
 #: ../libgda-ui/gdaui-init.c:485
-#: ../tools/browser/data-manager/data-widget.c:607
-#: ../tools/browser/data-manager/data-widget.c:612
+#: ../tools/browser/data-manager/data-widget.c:609
 #: ../tools/browser/data-manager/data-widget.c:614
-#: ../tools/browser/data-manager/xml-spec-editor.c:235
-#: ../tools/browser/query-exec/query-result.c:256 ../tools/web-server.c:2017
+#: ../tools/browser/data-manager/data-widget.c:616
+#: ../tools/browser/data-manager/xml-spec-editor.c:236
+#: ../tools/browser/query-exec/query-result.c:258 ../tools/web-server.c:2019
 #, c-format
 msgid "Error: %s"
 msgstr "Error: %s"
@@ -4142,7 +4144,7 @@ msgstr "Error: %s"
 #: ../libgda-ui/gdaui-init.c:492
 #, c-format
 msgid "Loading file %s...\n"
-msgstr "Cargando archivo %s...\n"
+msgstr "Cargando archivo %sâ?¦\n"
 
 #: ../libgda-ui/gdaui-init.c:495
 #, c-format
@@ -4161,22 +4163,22 @@ msgstr "Especificar conexión:"
 #. Create the DSN add button
 #: ../libgda-ui/gdaui-login.c:191
 msgid "Data sources..."
-msgstr "Fuentes de datos..."
+msgstr "Fuentes de datosâ?¦"
 
-#: ../libgda-ui/gdaui-login.c:420
+#: ../libgda-ui/gdaui-login.c:421
 msgid "Could not execute the Database access control center"
 msgstr "No se pudo ejecutar el centro de control de acceso a la base de datos"
 
-#: ../libgda-ui/gdaui-raw-form.c:179 ../libgda-ui/gdaui-raw-grid.c:285
+#: ../libgda-ui/gdaui-raw-form.c:180 ../libgda-ui/gdaui-raw-grid.c:286
 msgid "Data to display"
 msgstr "Datos para mostrar"
 
-#: ../libgda-ui/gdaui-raw-form.c:605
+#: ../libgda-ui/gdaui-raw-form.c:606
 #, c-format
 msgid "Can't append row to data model: %s"
 msgstr "No se pudo añadir la fila al modelo de datos: %s"
 
-#: ../libgda-ui/gdaui-raw-grid.c:290
+#: ../libgda-ui/gdaui-raw-grid.c:291
 msgid ""
 "Pointer to an XML layout specification (as an xmlNodePtr to a <gdaui_grid> "
 "node)"
@@ -4184,40 +4186,40 @@ msgstr ""
 "Puntero a una especificación de distribución de datos XML (como un "
 "xmlNodePtr hacia un nodo <gdaui_grid>)"
 
-#: ../libgda-ui/gdaui-raw-grid.c:293
+#: ../libgda-ui/gdaui-raw-grid.c:294
 msgid "Info cell visible"
 msgstr "Celda de información visible"
 
-#: ../libgda-ui/gdaui-raw-grid.c:297
+#: ../libgda-ui/gdaui-raw-grid.c:298
 msgid "Global Actions visible"
 msgstr "Acciones globales visibles"
 
 #. FIXME: if nullok is FALSE, then set the column title in bold
-#: ../libgda-ui/gdaui-raw-grid.c:743 ../libgda-ui/gdaui-raw-grid.c:766
+#: ../libgda-ui/gdaui-raw-grid.c:744 ../libgda-ui/gdaui-raw-grid.c:767
 msgid "Can't be NULL"
 msgstr "No puede ser nulo (NULL)"
 
-#: ../libgda-ui/gdaui-raw-grid.c:774
+#: ../libgda-ui/gdaui-raw-grid.c:775
 msgid "No title"
 msgstr "Sin título"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1754
+#: ../libgda-ui/gdaui-raw-grid.c:1755
 msgid "Select _All"
 msgstr "Seleccionar _todo"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1759
+#: ../libgda-ui/gdaui-raw-grid.c:1760
 msgid "_Clear Selection"
 msgstr "_Limpiar la selección"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1762
+#: ../libgda-ui/gdaui-raw-grid.c:1763
 msgid "Show Column _Titles"
 msgstr "Mostrar los _títulos de las columnas"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1767
+#: ../libgda-ui/gdaui-raw-grid.c:1768
 msgid "_Set filter"
 msgstr "_Activar filtro"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1770
+#: ../libgda-ui/gdaui-raw-grid.c:1771
 msgid "_Unset filter"
 msgstr "_Desactivar filtro"
 
@@ -4326,51 +4328,51 @@ msgstr ""
 msgid "If you choose yes, the contents will be lost."
 msgstr "Si elige sí, se perderá todo el contenido."
 
-#: ../libgda-ui/gdaui-server-operation.c:196
+#: ../libgda-ui/gdaui-server-operation.c:197
 msgid "The specification of the operation to implement"
 msgstr "La especificación de la operación para implementar"
 
-#: ../libgda-ui/gdaui-server-operation.c:202
+#: ../libgda-ui/gdaui-server-operation.c:203
 msgid "Request section header to be hidden if there is only one section"
 msgstr ""
 "Solicitar que la cabecera de la sección se oculte si sólo hay una sección"
 
 #. last row is for new entries
-#: ../libgda-ui/gdaui-server-operation.c:596
-#: ../tools/browser/data-manager/data-console.c:391
+#: ../libgda-ui/gdaui-server-operation.c:597
+#: ../tools/browser/data-manager/data-console.c:392
 msgid "Add"
 msgstr "Añadir"
 
-#: ../libgda-ui/gdaui-server-operation.c:1113
+#: ../libgda-ui/gdaui-server-operation.c:1114
 msgid "Server operation specification"
 msgstr "Especificación de operaciones del servidor"
 
-#: ../libgda-ui/gdaui-server-operation.c:1173
+#: ../libgda-ui/gdaui-server-operation.c:1175
 msgid "<b>Field properties:</b>"
 msgstr "<b>Propiedades del campo:</b>"
 
-#: ../libgda-ui/gdaui-server-operation.c:1192
+#: ../libgda-ui/gdaui-server-operation.c:1194
 msgid "<b>Fields:</b>"
 msgstr "<b>Campos:</b>"
 
-#: ../libgda-ui/gdaui-server-operation.c:1241
+#: ../libgda-ui/gdaui-server-operation.c:1243
 msgid "Add a new field"
 msgstr "Añadir un campo nuevo"
 
-#: ../libgda-ui/gdaui-server-operation.c:1243
+#: ../libgda-ui/gdaui-server-operation.c:1245
 msgid "Remove selected field"
 msgstr "Quitar campo seleccionado"
 
-#: ../libgda-ui/gdaui-tree-store.c:267
+#: ../libgda-ui/gdaui-tree-store.c:268
 msgid "GdaTree to use"
 msgstr "GdaTree que usar"
 
-#: ../libgda-ui/gdaui-tree-store.c:595
+#: ../libgda-ui/gdaui-tree-store.c:602
 #, c-format
 msgid "Unknown column number %d"
 msgstr "Número de columna %d desconocido"
 
-#: ../libgda-ui/gdaui-tree-store.c:611
+#: ../libgda-ui/gdaui-tree-store.c:618
 #, c-format
 msgid "Type mismatch: expected a value of type %s and got of type %s"
 msgstr ""
@@ -4433,25 +4435,25 @@ msgstr "Directorio donde se almacena el archivo con la base de datos"
 msgid "Name of the database in the database file to be used"
 msgstr "Nombre de la base de datos en el archivo de base de datos para usar"
 
-#: ../providers/bdb/gda-bdb-provider.c:164
+#: ../providers/bdb/gda-bdb-provider.c:166
 msgid "The DB_NAME parameter is not defined in the connection string."
 msgstr "El parámetro DB_NAME no está definido en la cadena de conexión."
 
-#: ../providers/bdb/gda-bdb-provider.c:194
+#: ../providers/bdb/gda-bdb-provider.c:196
 msgid "An error occurred while accessing the BDB database"
 msgstr "Ocurrió un error al acceder a la base de datos BDB"
 
-#: ../providers/bdb/gda-bdb-provider.c:202
+#: ../providers/bdb/gda-bdb-provider.c:204
 #: ../providers/mdb/gda-mdb-provider.c:315
 msgid "Can't open virtual connection"
 msgstr "No se puede abrir la conexión virtual"
 
-#: ../providers/bdb/gda-bdb-provider.c:209
+#: ../providers/bdb/gda-bdb-provider.c:211
 #, c-format
 msgid "Could not add BDB data model to connection: %s"
 msgstr "No se pudo añadir el modelo de datos BDB a la conexión: %s"
 
-#: ../providers/bdb/gda-bdb-provider.c:221
+#: ../providers/bdb/gda-bdb-provider.c:223
 msgid "-"
 msgstr "-"
 
@@ -4515,7 +4517,7 @@ msgstr "Descripción de la columna"
 #: ../providers/sqlcipher/sqlcipher_specs_create_table.xml.in.h:19
 #: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:5
 #: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:19
-#: ../tools/command-exec.c:725 ../tools/web-server.c:928
+#: ../tools/command-exec.c:730 ../tools/web-server.c:929
 msgid "Default"
 msgstr "Predeterminado"
 
@@ -4696,8 +4698,8 @@ msgstr "Tipo de ordenación"
 #: ../providers/postgres/postgres_specs_create_table.xml.in.h:2
 #: ../providers/sqlcipher/sqlcipher_specs_create_table.xml.in.h:2
 #: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:2
-#: ../tools/command-exec.c:588 ../tools/command-exec.c:591
-#: ../tools/web-server.c:898 ../tools/web-server.c:901
+#: ../tools/command-exec.c:593 ../tools/command-exec.c:596
+#: ../tools/web-server.c:899 ../tools/web-server.c:902
 msgid "Auto increment"
 msgstr "Autoincrementar"
 
@@ -4744,9 +4746,9 @@ msgstr "Restricciones globales"
 #: ../providers/postgres/postgres_specs_create_table.xml.in.h:52
 #: ../providers/sqlcipher/sqlcipher_specs_create_table.xml.in.h:31
 #: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:31
-#: ../tools/browser/schema-browser/mgr-columns.c:375
-#: ../tools/browser/schema-browser/table-columns.c:190
-#: ../tools/command-exec.c:816
+#: ../tools/browser/schema-browser/mgr-columns.c:382
+#: ../tools/browser/schema-browser/table-columns.c:191
+#: ../tools/command-exec.c:821
 msgid "Primary key"
 msgstr "Clave primaria"
 
@@ -4792,7 +4794,7 @@ msgstr "Tabla temporal"
 #: ../providers/postgres/postgres_specs_create_table.xml.in.h:73
 #: ../providers/sqlcipher/sqlcipher_specs_create_table.xml.in.h:42
 #: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:42
-#: ../tools/command-exec.c:939
+#: ../tools/command-exec.c:944
 msgid "Unique"
 msgstr "Ã?nico"
 
@@ -4958,10 +4960,10 @@ msgid "Provider for BDB SQL databases"
 msgstr "Proveedor para bases de datos SQL BDB"
 
 #: ../providers/jdbc/GdaInputStream.c:34
-#: ../providers/jdbc/GdaInputStream.c:108 ../providers/jdbc/GdaJValue.c:187
-#: ../providers/jdbc/GdaJValue.c:229 ../providers/jdbc/GdaJValue.c:276
-#: ../providers/jdbc/GdaJValue.c:322 ../providers/jdbc/GdaJValue.c:364
-#: ../providers/jdbc/GdaJValue.c:490
+#: ../providers/jdbc/GdaInputStream.c:108 ../providers/jdbc/GdaJValue.c:193
+#: ../providers/jdbc/GdaJValue.c:236 ../providers/jdbc/GdaJValue.c:284
+#: ../providers/jdbc/GdaJValue.c:331 ../providers/jdbc/GdaJValue.c:374
+#: ../providers/jdbc/GdaJValue.c:501
 msgid "Invalid argument: NULL"
 msgstr "Argumento no válido: nulo (NULL)"
 
@@ -4970,16 +4972,16 @@ msgstr "Argumento no válido: nulo (NULL)"
 msgid "Can't read BLOB"
 msgstr "No se puede leer el BLOB"
 
-#: ../providers/jdbc/GdaJValue.c:167
+#: ../providers/jdbc/GdaJValue.c:173
 #, c-format
 msgid "Invalid date: year %d, month %d and day %d"
 msgstr "Fecha no válida: año %d, mes %d y día %d"
 
-#: ../providers/jdbc/GdaJValue.c:385
+#: ../providers/jdbc/GdaJValue.c:395
 msgid "Can't get BLOB's size"
 msgstr "No se puede obtener el tamaño del BLOB"
 
-#: ../providers/jdbc/gda-jdbc-provider.c:363
+#: ../providers/jdbc/gda-jdbc-provider.c:365
 msgid "The connection string must contain the URL value"
 msgstr "La cadena de la conexión debe contener un valor URL"
 
@@ -5076,8 +5078,8 @@ msgid ""
 "Could not set client charset to UTF8. Using %s. It'll be problems with non "
 "UTF-8 characters"
 msgstr ""
-"No se pudo establecer el conjunto de caracteres del cliente a UTF-8. Usando %"
-"s. Existirán problemas con los caracteres que no sean UTF-8."
+"No se pudo establecer el conjunto de caracteres del cliente a UTF-8. Usando "
+"%s. Existirán problemas con los caracteres que no sean UTF-8."
 
 #: ../providers/mysql/gda-mysql-provider.c:588
 msgid "The connection string must contain the DB_NAME values"
@@ -5122,37 +5124,37 @@ msgstr "Número de filas obtenidas cada vez"
 msgid "Number of row chunks read since the object creation"
 msgstr "Número de trozos de la fila leídos desde la creación el objeto"
 
-#: ../providers/mysql/gda-mysql-recordset.c:515
-#: ../providers/mysql/gda-mysql-recordset.c:812
-#: ../providers/mysql/gda-mysql-recordset.c:825
-#: ../providers/mysql/gda-mysql-recordset.c:838
-#: ../providers/mysql/gda-mysql-recordset.c:857
+#: ../providers/mysql/gda-mysql-recordset.c:517
+#: ../providers/mysql/gda-mysql-recordset.c:814
+#: ../providers/mysql/gda-mysql-recordset.c:827
+#: ../providers/mysql/gda-mysql-recordset.c:840
+#: ../providers/mysql/gda-mysql-recordset.c:859
 #, c-format
 msgid "Invalid column bind data type. %d\n"
 msgstr "Tipo de datos de vinculación de la columna no válido. %d\n"
 
-#: ../providers/mysql/gda-mysql-recordset.c:666
+#: ../providers/mysql/gda-mysql-recordset.c:668
 #, c-format
 msgid "Type %s not mapped for value %d"
 msgstr "El tipo %s no está mapeado para el valor %d"
 
-#: ../providers/mysql/gda-mysql-recordset.c:683
+#: ../providers/mysql/gda-mysql-recordset.c:685
 #, c-format
 msgid "Type %s not mapped for value %lld"
 msgstr "El tipo %s no está mapeado para el valor %lld"
 
-#: ../providers/mysql/gda-mysql-recordset.c:729
+#: ../providers/mysql/gda-mysql-recordset.c:731
 #, c-format
 msgid "Type %s not mapped for value %d/%d/%d %d:%d:%d.%lu"
 msgstr "El tipo %s no está mapeado para el valor %d/%d/%d %d:%d:%d.%lu"
 
-#: ../providers/mysql/gda-mysql-recordset.c:745
-#: ../providers/mysql/gda-mysql-recordset.c:759
+#: ../providers/mysql/gda-mysql-recordset.c:747
+#: ../providers/mysql/gda-mysql-recordset.c:761
 #, c-format
 msgid "Type %s not mapped for value %f"
 msgstr "El tipo %s no está mapeado para el valor %f"
 
-#: ../providers/mysql/gda-mysql-recordset.c:847
+#: ../providers/mysql/gda-mysql-recordset.c:849
 #, c-format
 msgid "Type %s not mapped for value %s"
 msgstr "El tipo %s no está mapeado para el valor %s"
@@ -5655,8 +5657,8 @@ msgstr "Fijo"
 #. foreign key spec
 #: ../providers/mysql/mysql_specs_create_table.xml.in.h:83
 #: ../providers/postgres/postgres_specs_create_table.xml.in.h:29
-#: ../tools/browser/schema-browser/mgr-columns.c:381
-#: ../tools/command-exec.c:859
+#: ../tools/browser/schema-browser/mgr-columns.c:388
+#: ../tools/command-exec.c:864
 msgid "Foreign key"
 msgstr "Clave externa"
 
@@ -5806,7 +5808,7 @@ msgstr "Unión"
 #. other table options
 #: ../providers/mysql/mysql_specs_create_table.xml.in.h:199
 msgid "tbl_name[,tbl_name]...: only with MERGE engine"
-msgstr "nombre_tbl[,nombre_tbl]...: sólo con el motor MEZCLAR"
+msgstr "nombre_tbl[,nombre_tbl]�: sólo con el motor MEZCLAR"
 
 #: ../providers/mysql/mysql_specs_create_view.xml.in.h:1
 #: ../providers/postgres/postgres_specs_create_view.xml.in.h:1
@@ -5917,31 +5919,31 @@ msgstr "No se pudo reservar el localizador Lob"
 msgid "Could not copy Lob locator"
 msgstr "No se pudo copiar el localizador Lob"
 
-#: ../providers/postgres/gda-postgres-handler-bin.c:119
+#: ../providers/postgres/gda-postgres-handler-bin.c:120
 msgid "Postgresql binary handler"
 msgstr "Manejador binario PostgreSQL"
 
-#: ../providers/postgres/gda-postgres-handler-bin.c:125
+#: ../providers/postgres/gda-postgres-handler-bin.c:126
 msgid "PostgresqlBin"
 msgstr "PostgresqlBin"
 
-#: ../providers/postgres/gda-postgres-handler-bin.c:126
+#: ../providers/postgres/gda-postgres-handler-bin.c:127
 msgid "PostgreSQL binary representation"
 msgstr "Representación binaria de PostgreSQL"
 
-#: ../providers/postgres/gda-postgres-handler-bin.c:218
+#: ../providers/postgres/gda-postgres-handler-bin.c:219
 msgid "Insufficient memory to convert binary buffer to string"
 msgstr "Memoria insuficiente para convertir el búfer binario a una cadena"
 
-#: ../providers/postgres/gda-postgres-handler-bin.c:281
+#: ../providers/postgres/gda-postgres-handler-bin.c:282
 msgid "Insufficient memory to convert string to binary buffer"
 msgstr "Memoria insuficiente para convertir la cadena a un búfer binario"
 
-#: ../providers/postgres/gda-postgres-provider.c:423
+#: ../providers/postgres/gda-postgres-provider.c:425
 msgid "The connection string must contain a DB_NAME value"
 msgstr "La cadena de la conexión debe contener un valor DB_NAME"
 
-#: ../providers/postgres/gda-postgres-provider.c:427
+#: ../providers/postgres/gda-postgres-provider.c:429
 msgid ""
 "The connection string format has changed: replace DATABASE with DB_NAME and "
 "the same contents"
@@ -5949,54 +5951,54 @@ msgstr ""
 "El formato de la cadena de conexión ha cambiado, reemplace DATABASE con "
 "DB_NAME y el mismo contenido"
 
-#: ../providers/postgres/gda-postgres-provider.c:555
+#: ../providers/postgres/gda-postgres-provider.c:557
 #, c-format
 msgid "Could not set search_path to %s"
 msgstr "No se pudo establecer search_path a %s"
 
-#: ../providers/postgres/gda-postgres-provider.c:564
+#: ../providers/postgres/gda-postgres-provider.c:566
 #, c-format
 msgid "Search path %s is invalid"
 msgstr "La ruta de búsqueda %s no es válida"
 
-#: ../providers/postgres/gda-postgres-provider.c:1003
-#: ../providers/postgres/gda-postgres-provider.c:1005
+#: ../providers/postgres/gda-postgres-provider.c:1007
+#: ../providers/postgres/gda-postgres-provider.c:1009
 msgid "Transactions are not supported in read uncommitted isolation level"
 msgstr ""
 "Las transacciones no están soportadas en el nivel de aislamiento de lectura "
 "no efectuada"
 
-#: ../providers/postgres/gda-postgres-provider.c:1009
-#: ../providers/postgres/gda-postgres-provider.c:1011
+#: ../providers/postgres/gda-postgres-provider.c:1013
+#: ../providers/postgres/gda-postgres-provider.c:1015
 msgid "Transactions are not supported in repeatable read isolation level"
 msgstr ""
 "Las transacciones no están soportadas en el nivel de aislamiento de lectura "
 "repetible"
 
-#: ../providers/postgres/gda-postgres-provider.c:1028
-#: ../providers/postgres/gda-postgres-provider.c:1126
-#: ../providers/postgres/gda-postgres-provider.c:1176
-#: ../providers/postgres/gda-postgres-provider.c:1226
-#: ../providers/postgres/gda-postgres-recordset.c:431
-#: ../providers/postgres/gda-postgres-recordset.c:459
+#: ../providers/postgres/gda-postgres-provider.c:1032
+#: ../providers/postgres/gda-postgres-provider.c:1130
+#: ../providers/postgres/gda-postgres-provider.c:1180
+#: ../providers/postgres/gda-postgres-provider.c:1230
+#: ../providers/postgres/gda-postgres-recordset.c:434
+#: ../providers/postgres/gda-postgres-recordset.c:462
 msgid "Internal error"
 msgstr "Error interno"
 
-#: ../providers/postgres/gda-postgres-provider.c:1132
-#: ../providers/postgres/gda-postgres-provider.c:1182
-#: ../providers/postgres/gda-postgres-provider.c:1232
+#: ../providers/postgres/gda-postgres-provider.c:1136
+#: ../providers/postgres/gda-postgres-provider.c:1186
+#: ../providers/postgres/gda-postgres-provider.c:1236
 #, c-format
 msgid "Wrong savepoint name '%s'"
 msgstr "El nombre de punto de guardado «%s» es erróneo"
 
-#: ../providers/postgres/gda-postgres-provider.c:2010
-#: ../providers/postgres/gda-postgres-provider.c:2012
+#: ../providers/postgres/gda-postgres-provider.c:2015
+#: ../providers/postgres/gda-postgres-provider.c:2017
 msgid "Cannot start transaction"
 msgstr "No se pude iniciar la transacción"
 
-#: ../providers/postgres/gda-postgres-provider.c:2221
-#: ../providers/postgres/gda-postgres-provider.c:2257
-#: ../providers/postgres/gda-postgres-provider.c:2292
+#: ../providers/postgres/gda-postgres-provider.c:2226
+#: ../providers/postgres/gda-postgres-provider.c:2262
+#: ../providers/postgres/gda-postgres-provider.c:2297
 msgid "Could not set the XA transaction ID parameter"
 msgstr "No se pudo establecer la el parámetro ID de la transacción XA"
 
@@ -6648,30 +6650,26 @@ msgstr "Se requiere al menos la versión 5.0 de MySQL"
 #: ../providers/reuseable/mysql/gda-mysql-reuseable.c:177
 #: ../providers/reuseable/mysql/gda-mysql-reuseable.c:218
 #: ../providers/reuseable/postgres/gda-postgres-reuseable.c:203
-#: ../providers/web/gda-web-recordset.c:448
-#: ../providers/web/gda-web-recordset.c:469
+#: ../providers/web/gda-web-recordset.c:449
+#: ../providers/web/gda-web-recordset.c:470
 #: ../providers/web/gda-web-meta.c:107
 msgid "Can't import data from web server"
 msgstr "No se pueden importar los datos del servidor web"
 
-#: ../providers/reuseable/postgres/gda-postgres-meta.c:2108
+#: ../providers/reuseable/postgres/gda-postgres-meta.c:2115
 #, c-format
 msgid "could not determine the indexed columns for index"
 msgstr "no se pudieron determinar las columnas indexadas para el índice"
 
 #: ../providers/sqlcipher/libmain.c:72
-#, fuzzy
-#| msgid "Provider for SQLite databases"
 msgid "Provider for SQLCipher"
-msgstr "Proveedor para bases de datos SQLite"
+msgstr "Proveedor para SQLCipher"
 
 #. DSN parameters
 #: ../providers/sqlcipher/sqlcipher_specs_auth.xml.in.h:1
 #: ../providers/sqlcipher/sqlcipher_specs_create_db.xml.in.h:10
-#, fuzzy
-#| msgid "Encrypt password"
 msgid "Encryption passphrase"
-msgstr "Cifrar contraseña"
+msgstr "Cifrado de la contraseña"
 
 #. DSN parameters
 #: ../providers/sqlcipher/sqlcipher_specs_auth.xml.in.h:2
@@ -6683,55 +6681,55 @@ msgstr "Contraseña"
 msgid "Provider for SQLite databases"
 msgstr "Proveedor para bases de datos SQLite"
 
-#: ../providers/web/gda-web-provider.c:290 ../providers/web/gda-web-util.c:296
+#: ../providers/web/gda-web-provider.c:291 ../providers/web/gda-web-util.c:296
 #: ../providers/web/gda-web-util.c:414 ../providers/web/gda-web-util.c:567
 #, c-format
 msgid "Invalid HOST/SCRIPT '%s'"
 msgstr "Equipo y/o script «%s» no válido"
 
-#: ../providers/web/gda-web-provider.c:351
-#: ../providers/web/gda-web-provider.c:357
-#: ../providers/web/gda-web-provider.c:363
-#: ../providers/web/gda-web-provider.c:371
+#: ../providers/web/gda-web-provider.c:353
+#: ../providers/web/gda-web-provider.c:359
+#: ../providers/web/gda-web-provider.c:365
+#: ../providers/web/gda-web-provider.c:373
 #, c-format
 msgid "The connection string must contain the %s value"
 msgstr "La cadena de la conexión debe contener un valor %s"
 
-#: ../providers/web/gda-web-provider.c:627
-#: ../providers/web/gda-web-provider.c:652
+#: ../providers/web/gda-web-provider.c:630
+#: ../providers/web/gda-web-provider.c:655
 #, c-format
 msgid "Not supported"
 msgstr "No está soportado"
 
-#: ../providers/web/gda-web-provider.c:632
-#: ../providers/web/gda-web-provider.c:657
+#: ../providers/web/gda-web-provider.c:635
+#: ../providers/web/gda-web-provider.c:660
 #, c-format
 msgid "Server operations not yet implemented"
 msgstr "Las operaciones en el servidor aún no están implementadas"
 
-#: ../providers/web/gda-web-provider.c:707
-#: ../providers/web/gda-web-provider.c:772
-#: ../providers/web/gda-web-provider.c:832
+#: ../providers/web/gda-web-provider.c:711
+#: ../providers/web/gda-web-provider.c:776
+#: ../providers/web/gda-web-provider.c:836
 msgid "Named transaction is not supported"
 msgstr "No se soporta la transacción con nombre"
 
-#: ../providers/web/gda-web-provider.c:712
+#: ../providers/web/gda-web-provider.c:716
 msgid "Transaction level is not supported"
 msgstr "No se soporta el nivel de transacción"
 
-#: ../providers/web/gda-web-provider.c:892
-#: ../providers/web/gda-web-provider.c:953
+#: ../providers/web/gda-web-provider.c:896
+#: ../providers/web/gda-web-provider.c:957
 msgid "Unnamed savepoint is not supported"
 msgstr "No se soporta el punto de guardado sin nombre"
 
-#: ../providers/web/gda-web-recordset.c:183
+#: ../providers/web/gda-web-recordset.c:184
 #, c-format
 msgid "Can't create temporary file '%s'"
 msgstr "No se pudo crear el archivo temporal «%s»"
 
-#: ../providers/web/gda-web-recordset.c:365
-#: ../providers/web/gda-web-recordset.c:371
-#: ../providers/web/gda-web-recordset.c:381
+#: ../providers/web/gda-web-recordset.c:366
+#: ../providers/web/gda-web-recordset.c:372
+#: ../providers/web/gda-web-recordset.c:382
 msgid "Can't create temporary table to store data from web server"
 msgstr ""
 "No se puede crear una tabla temporal para almacenar los datos del servidor "
@@ -6824,35 +6822,35 @@ msgstr "No puede abrir la conexión especificada: %s\n"
 msgid "Connection successfully opened!\n"
 msgstr "Conexión abierta con éxito\n"
 
-#: ../testing/gdaui-test-data-entries.c:241
+#: ../testing/gdaui-test-data-entries.c:235
 msgid "_File"
 msgstr "_Archivo"
 
-#: ../testing/gdaui-test-data-entries.c:254
+#: ../testing/gdaui-test-data-entries.c:248
 msgid "_Tested Widgets"
 msgstr "Widgets p_robados"
 
-#: ../testing/gdaui-test-data-entries.c:261
+#: ../testing/gdaui-test-data-entries.c:255
 msgid "Default individual data entry widgets"
 msgstr "Widgets individuales de entrada de datos predeterminados"
 
-#: ../testing/gdaui-test-data-entries.c:268
+#: ../testing/gdaui-test-data-entries.c:262
 msgid "Default data entry widgets in a form"
 msgstr "Widgets de entrada de datos predeterminados en un formulario"
 
-#: ../testing/gdaui-test-data-entries.c:275
+#: ../testing/gdaui-test-data-entries.c:269
 msgid "Default data cell renderers in a grid"
 msgstr "Renderizador de la celda de datos predeterminado en una rejilla"
 
-#: ../testing/gdaui-test-data-entries.c:285
+#: ../testing/gdaui-test-data-entries.c:279
 msgid "Plugins individual data entry widgets"
 msgstr "Widgets de entrada individuales para los complementos"
 
-#: ../testing/gdaui-test-data-entries.c:292
+#: ../testing/gdaui-test-data-entries.c:286
 msgid "Plugins data entry widgets in a form"
 msgstr "Widgets de entrada para los complementos en formularios"
 
-#: ../testing/gdaui-test-data-entries.c:299
+#: ../testing/gdaui-test-data-entries.c:293
 msgid "Plugins data cell renderers in a grid"
 msgstr "Renderizadores de las celdas de datos para los complementos en rejilla"
 
@@ -6897,15 +6895,15 @@ msgstr "Establecer como original"
 msgid "Set as default"
 msgstr "Establecer como predeterminado"
 
-#: ../tools/browser/auth-dialog.c:522
+#: ../tools/browser/auth-dialog.c:523
 msgid "For connection"
 msgstr "Para la conexión"
 
-#: ../tools/browser/auth-dialog.c:523
+#: ../tools/browser/auth-dialog.c:524
 msgid "enter authentication information"
 msgstr "introducir información de autenticación"
 
-#: ../tools/browser/auth-dialog.c:679 ../tools/browser/login-dialog.c:238
+#: ../tools/browser/auth-dialog.c:680 ../tools/browser/login-dialog.c:239
 #, c-format
 msgid ""
 "Could not open connection:\n"
@@ -6914,131 +6912,131 @@ msgstr ""
 "No se pudo abrir la conexión:\n"
 "%s"
 
-#: ../tools/browser/browser-connection.c:262
+#: ../tools/browser/browser-connection.c:263
 #, c-format
 msgid "c%u"
 msgstr "c%u"
 
-#: ../tools/browser/browser-connection.c:353
-#: ../tools/browser/browser-connection.c:439
+#: ../tools/browser/browser-connection.c:355
+#: ../tools/browser/browser-connection.c:441
 msgid "Analysing database schema"
 msgstr "Analizando el esquema de la base de datos"
 
-#: ../tools/browser/browser-connection.c:355
-#: ../tools/browser/browser-connection.c:421
-#: ../tools/browser/browser-connection.c:441
-#: ../tools/browser/browser-connection.c:853
+#: ../tools/browser/browser-connection.c:357
+#: ../tools/browser/browser-connection.c:423
+#: ../tools/browser/browser-connection.c:443
+#: ../tools/browser/browser-connection.c:861
 #, c-format
 msgid "Error while fetching meta data from the connection: %s"
 msgstr "Error al obtener los metadatos de la conexión: %s"
 
-#: ../tools/browser/browser-connection.c:419
-#: ../tools/browser/browser-connection.c:851
+#: ../tools/browser/browser-connection.c:421
+#: ../tools/browser/browser-connection.c:859
 msgid "Getting database schema information"
 msgstr "Obteniendo la información de esquema de la base de datos"
 
-#: ../tools/browser/browser-connection.c:625
-#: ../tools/browser/browser-connection.c:645
+#: ../tools/browser/browser-connection.c:633
+#: ../tools/browser/browser-connection.c:653
 #, c-format
 msgid "Error while analysing database schema: %s"
 msgstr "Error al analizar el esquema de la base de datos: %s"
 
-#: ../tools/browser/browser-connection.c:1107
-#: ../tools/browser/browser-connection.c:1157
+#: ../tools/browser/browser-connection.c:1115
+#: ../tools/browser/browser-connection.c:1165
 msgid "Executing a query"
 msgstr "Ejecutando una consulta"
 
-#: ../tools/browser/browser-connection.c:1437
+#: ../tools/browser/browser-connection.c:1445
 #, c-format
 msgid "Connection not yet opened"
 msgstr "La conexión aún no está abierta"
 
-#: ../tools/browser/browser-connection.c:1443
+#: ../tools/browser/browser-connection.c:1451
 msgid "Can't initialize dictionary to store table preferences"
 msgstr ""
 "No se puede inicializar el diccionario para almacenar las preferencias de la "
 "tabla"
 
-#: ../tools/browser/browser-connection.c:1489
-#: ../tools/browser/browser-connection.c:1495
-#: ../tools/browser/browser-connection.c:1631
-#: ../tools/browser/browser-favorites.c:523
-#: ../tools/browser/browser-favorites.c:529
-#: ../tools/browser/browser-favorites.c:958
-#: ../tools/browser/browser-favorites.c:965
+#: ../tools/browser/browser-connection.c:1497
+#: ../tools/browser/browser-connection.c:1503
+#: ../tools/browser/browser-connection.c:1639
+#: ../tools/browser/browser-favorites.c:524
+#: ../tools/browser/browser-favorites.c:530
+#: ../tools/browser/browser-favorites.c:959
+#: ../tools/browser/browser-favorites.c:966
 msgid "Can't initialize transaction to access favorites"
 msgstr "No se puede inicializar la transacción para acceder a los favoritos"
 
-#: ../tools/browser/browser-connection.c:1576
-#: ../tools/browser/browser-favorites.c:702
-#: ../tools/browser/browser-favorites.c:1016
+#: ../tools/browser/browser-connection.c:1584
+#: ../tools/browser/browser-favorites.c:703
+#: ../tools/browser/browser-favorites.c:1017
 msgid "Can't commit transaction to access favorites"
 msgstr "No se puede efectuar la transacción para acceder a los favoritos"
 
-#: ../tools/browser/browser-connections-list.c:155
+#: ../tools/browser/browser-connections-list.c:156
 #, c-format
 msgid "DSN: %s"
 msgstr "DSN: %s"
 
-#: ../tools/browser/browser-connections-list.c:157
+#: ../tools/browser/browser-connections-list.c:158
 #, c-format
 msgid "Provider: %s"
 msgstr "Proveedor: %s"
 
-#: ../tools/browser/browser-connections-list.c:203
+#: ../tools/browser/browser-connections-list.c:204
 msgid "Database provider"
 msgstr "Proveedor de la base de datos"
 
-#: ../tools/browser/browser-connections-list.c:210
+#: ../tools/browser/browser-connections-list.c:211
 msgid "In memory"
 msgstr "En memoria"
 
-#: ../tools/browser/browser-connections-list.c:212
+#: ../tools/browser/browser-connections-list.c:213
 msgid "Dictionary file"
 msgstr "Archivo de diccionario"
 
-#: ../tools/browser/browser-connections-list.c:213
+#: ../tools/browser/browser-connections-list.c:214
 msgid ""
 "File used to store any information associated\n"
 "to this connection (favorites, descriptions, ...)"
 msgstr ""
 "Archivo usado para almacenar cualquier información\n"
-"asociada a esta conexión (favoritos, descripciones, ...)"
+"asociada a esta conexión (favoritos, descripciones, �)"
 
-#: ../tools/browser/browser-connections-list.c:326
+#: ../tools/browser/browser-connections-list.c:327
 msgid "Opened connections"
 msgstr "Conexiones abiertas"
 
-#: ../tools/browser/browser-connections-list.c:354 ../tools/gda-sql.c:3092
+#: ../tools/browser/browser-connections-list.c:355 ../tools/gda-sql.c:3098
 msgid "List of opened connections"
 msgstr "Lista de conexiones abiertas"
 
-#: ../tools/browser/browser-connections-list.c:363 ../tools/web-server.c:707
+#: ../tools/browser/browser-connections-list.c:364 ../tools/web-server.c:708
 msgid "Connections"
 msgstr "Conexiones"
 
-#: ../tools/browser/browser-connections-list.c:379
+#: ../tools/browser/browser-connections-list.c:380
 msgid "Connection's properties"
 msgstr "Propiedades de la conexión"
 
-#: ../tools/browser/browser-connections-list.c:390
+#: ../tools/browser/browser-connections-list.c:391
 msgid "Close connection"
 msgstr "Cerrar la conexión"
 
-#: ../tools/browser/browser-connections-list.c:394
+#: ../tools/browser/browser-connections-list.c:395
 msgid "Close selected connection"
 msgstr "Cerrar la conexión seleccionada"
 
-#: ../tools/browser/browser-connections-list.c:397
+#: ../tools/browser/browser-connections-list.c:398
 msgid "Connect"
 msgstr "Conectar"
 
-#: ../tools/browser/browser-connections-list.c:401
+#: ../tools/browser/browser-connections-list.c:402
 msgid "Open a new connection"
 msgstr "Abrir una conexión nueva"
 
-#: ../tools/browser/browser-favorites.c:181
-#: ../tools/browser/browser-favorites.c:190
+#: ../tools/browser/browser-favorites.c:182
+#: ../tools/browser/browser-favorites.c:191
 msgid "Can't initialize dictionary to store favorites"
 msgstr "No se puede inicializar el diccionario para almacenar los favoritos"
 
@@ -7051,17 +7049,17 @@ msgid "Bookmarks"
 msgstr "Marcadores"
 
 #: ../tools/browser/browser-stock-icons.c:47
-#: ../tools/browser/browser-window.c:297
+#: ../tools/browser/browser-window.c:298
 msgid "Begin"
 msgstr "Inicio"
 
 #: ../tools/browser/browser-stock-icons.c:48
-#: ../tools/browser/browser-window.c:299
+#: ../tools/browser/browser-window.c:300
 msgid "Commit"
 msgstr "Efectuar"
 
 #: ../tools/browser/browser-stock-icons.c:49
-#: ../tools/browser/browser-window.c:301
+#: ../tools/browser/browser-window.c:302
 msgid "Rollback"
 msgstr "Deshacer"
 
@@ -7069,27 +7067,27 @@ msgstr "Deshacer"
 msgid "Builder"
 msgstr "Constructor"
 
-#: ../tools/browser/browser-virtual-connection.c:88
+#: ../tools/browser/browser-virtual-connection.c:89
 msgid "Bound connection is used"
 msgstr "Se está usando una conexión vinculada"
 
-#: ../tools/browser/browser-virtual-connection.c:111
+#: ../tools/browser/browser-virtual-connection.c:112
 msgid "Virtual connection using this connection is busy"
 msgstr "La conexión virtual usando esta conexión está ocupada"
 
-#: ../tools/browser/browser-window.c:271
+#: ../tools/browser/browser-window.c:272
 msgid "_Fullscreen"
 msgstr "Pantalla _completa"
 
-#: ../tools/browser/browser-window.c:271
+#: ../tools/browser/browser-window.c:272
 msgid "Use the whole screen"
 msgstr "Usar la pantalla completa"
 
-#: ../tools/browser/browser-window.c:277
+#: ../tools/browser/browser-window.c:278
 msgid "_Bind connection"
 msgstr "_Vincular conexión"
 
-#: ../tools/browser/browser-window.c:277
+#: ../tools/browser/browser-window.c:278
 msgid ""
 "Use connection to create\n"
 "a new binding connection to access data\n"
@@ -7100,87 +7098,87 @@ msgstr ""
 "acceder a los datos desde varias\n"
 "bases de datos a la vez"
 
-#: ../tools/browser/browser-window.c:297
+#: ../tools/browser/browser-window.c:298
 msgid "Begin a new transaction"
 msgstr "Iniciar una transacción nueva"
 
-#: ../tools/browser/browser-window.c:299
+#: ../tools/browser/browser-window.c:300
 msgid "Commit current transaction"
 msgstr "Efectuar la transacción actual"
 
-#: ../tools/browser/browser-window.c:301
+#: ../tools/browser/browser-window.c:302
 msgid "Rollback current transaction"
 msgstr "Deshacer la transacción actual"
 
-#: ../tools/browser/browser-window.c:391
+#: ../tools/browser/browser-window.c:392
 msgid "unnamed"
 msgstr "sin nombre"
 
-#: ../tools/browser/browser-window.c:392
+#: ../tools/browser/browser-window.c:393
 #, c-format
 msgid "Connection: %s"
 msgstr "Conexión: %s"
 
-#: ../tools/browser/browser-window.c:785 ../tools/browser/support.c:83
+#: ../tools/browser/browser-window.c:786 ../tools/browser/support.c:83
 #, c-format
 msgid "Do you want to close the '%s' connection?"
 msgstr "¿Quiere cerrar la conexión «%s»?"
 
-#: ../tools/browser/browser-window.c:827 ../tools/browser/browser-window.c:834
+#: ../tools/browser/browser-window.c:828 ../tools/browser/browser-window.c:835
 msgid "Do you want to quit the application?"
 msgstr "¿Quiere salir de la aplicación?"
 
-#: ../tools/browser/browser-window.c:828
+#: ../tools/browser/browser-window.c:829
 msgid "all the connections will be closed."
 msgstr "se cerrarán todas las conexiones."
 
-#: ../tools/browser/browser-window.c:835
+#: ../tools/browser/browser-window.c:836
 msgid "the connection will be closed."
 msgstr "se cerrará la conexión."
 
-#: ../tools/browser/browser-window.c:886
+#: ../tools/browser/browser-window.c:887
 #, c-format
 msgid "Error starting transaction: %s"
 msgstr "Error al iniciar la transacción: %s"
 
-#: ../tools/browser/browser-window.c:900
+#: ../tools/browser/browser-window.c:901
 #, c-format
 msgid "Error committing transaction: %s"
 msgstr "Error al efectuar la transacción: %s"
 
-#: ../tools/browser/browser-window.c:914
+#: ../tools/browser/browser-window.c:915
 #, c-format
 msgid "Error rolling back transaction: %s"
 msgstr "Error al deshacer la transacción: %s"
 
-#: ../tools/browser/browser-window.c:998
+#: ../tools/browser/browser-window.c:1000
 msgid "Hit the Escape key to leave the fullscreen mode"
-msgstr ""
+msgstr "Pulsar la tecla Escape para salir del modo a pantalla completa"
 
-#: ../tools/browser/browser-window.c:1144
+#: ../tools/browser/browser-window.c:1146
 #, c-format
 msgid "Error updating bound connection: %s"
 msgstr "Error al actualizar la conexión vinculada: %s"
 
-#: ../tools/browser/browser-window.c:1185
+#: ../tools/browser/browser-window.c:1187
 #, c-format
 msgid "Could not open binding connection: %s"
 msgstr "No se pudo abrir la conexión de vinculación: %s"
 
-#: ../tools/browser/browser-window.c:1225
+#: ../tools/browser/browser-window.c:1227
 #: ../tools/browser/gda-browser-4.0.desktop.in.h:2
 msgid "Database browser"
 msgstr "Examinador de la base de datos"
 
-#: ../tools/browser/browser-window.c:1543
+#: ../tools/browser/browser-window.c:1545
 msgid "Don't show this message again"
 msgstr "No mostrar este mensaje de nuevo"
 
-#: ../tools/browser/browser-window.c:1589
+#: ../tools/browser/browser-window.c:1591
 msgid "Note:"
 msgstr "Nota:"
 
-#: ../tools/browser/browser-window.c:1701
+#: ../tools/browser/browser-window.c:1703
 #, c-format
 msgid ""
 "The current perspective has changed to the '%s' perspective, you can switch "
@@ -7188,18 +7186,19 @@ msgid ""
 "'%s' shortcut"
 msgstr ""
 "La perspectiva actual ha cambiado a la perspectiva «%s», puede volver a la "
-"perspectiva anterior a través del menú «Perspectiva/%s» o usando el atajo «%s»"
+"perspectiva anterior a través del menú «Perspectiva/%s» o usando el atajo "
+"«%s»"
 
-#: ../tools/browser/connection-binding-properties.c:142
+#: ../tools/browser/connection-binding-properties.c:143
 msgid "New virtual connection"
 msgstr "Conexión virtual nueva"
 
-#: ../tools/browser/connection-binding-properties.c:170
-#: ../tools/browser/connection-binding-properties.c:196
+#: ../tools/browser/connection-binding-properties.c:171
+#: ../tools/browser/connection-binding-properties.c:197
 msgid "Virtual connection's properties"
 msgstr "Propiedades de la conexión virtual"
 
-#: ../tools/browser/connection-binding-properties.c:197
+#: ../tools/browser/connection-binding-properties.c:198
 msgid ""
 "Define the sources of data for which tables will\n"
 "appear in the virtual connection"
@@ -7207,32 +7206,32 @@ msgstr ""
 "Definir los orígenes de los datos para los que\n"
 "las tablas aparecerán en la conexión virtual"
 
-#: ../tools/browser/connection-binding-properties.c:277
+#: ../tools/browser/connection-binding-properties.c:278
 msgid "Add binding"
 msgstr "Añadir vinculación"
 
-#: ../tools/browser/connection-binding-properties.c:328
+#: ../tools/browser/connection-binding-properties.c:329
 msgid "Bind a connection"
 msgstr "Vincular una conexión"
 
-#: ../tools/browser/connection-binding-properties.c:334
+#: ../tools/browser/connection-binding-properties.c:335
 msgid "Bind a data set"
 msgstr "Vincular un conjunto de datos"
 
-#: ../tools/browser/connection-binding-properties.c:413
+#: ../tools/browser/connection-binding-properties.c:415
 msgid "Table from a data set:"
 msgstr "Tabla desde un conjunto de datos:"
 
-#: ../tools/browser/connection-binding-properties.c:463
+#: ../tools/browser/connection-binding-properties.c:465
 #, c-format
 msgid "Invalid schema name"
 msgstr "El nombre del esquema no es válido"
 
-#: ../tools/browser/connection-binding-properties.c:510
+#: ../tools/browser/connection-binding-properties.c:512
 msgid "All tables of a connection:"
 msgstr "Todas las tablas de una conexión:"
 
-#: ../tools/browser/connection-binding-properties.c:514
+#: ../tools/browser/connection-binding-properties.c:516
 msgid ""
 "Each table in the selected connection will appear\n"
 "as a table in the virtual connection"
@@ -7240,7 +7239,7 @@ msgstr ""
 "Cada tabla en la conexión seleccionada aparecerá\n"
 "como una tabla en la conexión virtual"
 
-#: ../tools/browser/connection-binding-properties.c:539
+#: ../tools/browser/connection-binding-properties.c:541
 msgid ""
 "Name of the schema the\n"
 "tables will be in"
@@ -7252,11 +7251,11 @@ msgstr ""
 msgid "Browse your database's contents"
 msgstr "Examinar el contenido de su base de datos"
 
-#: ../tools/browser/login-dialog.c:142
+#: ../tools/browser/login-dialog.c:143
 msgid "Connection opening:"
 msgstr "Apertura de conexión:"
 
-#: ../tools/browser/login-dialog.c:143
+#: ../tools/browser/login-dialog.c:144
 msgid ""
 "Select a named data source, or specify\n"
 "parameters to open a connection to a \n"
@@ -7266,7 +7265,7 @@ msgstr ""
 "especificar parámetros para abrir una conexión\n"
 "con una fuente de datos no definida"
 
-#: ../tools/browser/login-dialog.c:252
+#: ../tools/browser/login-dialog.c:253
 #, c-format
 msgid "Cancelled by the user"
 msgstr "Cancelado por el usuario"
@@ -7275,67 +7274,67 @@ msgstr "Cancelado por el usuario"
 msgid "[DSN|connection string]..."
 msgstr "[DSN|cadena de conexión]�"
 
-#: ../tools/browser/mgr-favorites.c:219
+#: ../tools/browser/mgr-favorites.c:226
 msgid "Multiple statements"
 msgstr "Múltiples declaraciones"
 
-#: ../tools/browser/mgr-favorites.c:223
+#: ../tools/browser/mgr-favorites.c:230
 msgid "SELECT statement"
 msgstr "Declaración SELECT"
 
-#: ../tools/browser/mgr-favorites.c:226
+#: ../tools/browser/mgr-favorites.c:233
 msgid "INSERT statement"
 msgstr "Declaración INSERT"
 
-#: ../tools/browser/mgr-favorites.c:229
+#: ../tools/browser/mgr-favorites.c:236
 msgid "UPDATE statement"
 msgstr "Declaración UPDATE"
 
-#: ../tools/browser/mgr-favorites.c:232
+#: ../tools/browser/mgr-favorites.c:239
 msgid "DELETE statement"
 msgstr "Declaración DELETE"
 
-#: ../tools/browser/mgr-favorites.c:235
+#: ../tools/browser/mgr-favorites.c:242
 msgid "COMPOUND SELECT statement"
 msgstr "Declaración COMPOUND SELECT"
 
-#: ../tools/browser/mgr-favorites.c:238
+#: ../tools/browser/mgr-favorites.c:245
 msgid "BEGIN statement"
 msgstr "Declaración BEGIN"
 
-#: ../tools/browser/mgr-favorites.c:241
+#: ../tools/browser/mgr-favorites.c:248
 msgid "ROLLBACK statement"
 msgstr "Declaración ROLLBACK"
 
-#: ../tools/browser/mgr-favorites.c:244
+#: ../tools/browser/mgr-favorites.c:251
 msgid "COMMIT statement"
 msgstr "Declaración COMMIT"
 
-#: ../tools/browser/mgr-favorites.c:247
+#: ../tools/browser/mgr-favorites.c:254
 msgid "ADD SAVEPOINT statement"
 msgstr "Declaración ADD SAVEPOINT"
 
-#: ../tools/browser/mgr-favorites.c:250
+#: ../tools/browser/mgr-favorites.c:257
 msgid "ROLLBACK SAVEPOINT statement"
 msgstr "Declaración ROLLBACK SAVEPOINT"
 
-#: ../tools/browser/mgr-favorites.c:253
+#: ../tools/browser/mgr-favorites.c:260
 msgid "DELETE SAVEPOINT statement"
 msgstr "Declaración DELETE SAVEPOINT"
 
-#: ../tools/browser/mgr-favorites.c:256
+#: ../tools/browser/mgr-favorites.c:263
 msgid "Unknown statement"
 msgstr "Declaración desconocida"
 
-#: ../tools/browser/mgr-favorites.c:547
+#: ../tools/browser/mgr-favorites.c:554
 msgid ""
 "Getting\n"
 "favorites..."
 msgstr ""
 "Obteniendo\n"
-"favoritos..."
+"favoritosâ?¦"
 
-#: ../tools/browser/mgr-favorites.c:559
+#: ../tools/browser/mgr-favorites.c:566
 msgid ""
 "No favorite:\n"
 "drag item to\n"
@@ -7359,7 +7358,7 @@ msgstr "No se puede abrir el archivo de ayuda"
 
 #: ../tools/browser/support.c:242
 msgid "Help is being loaded, please wait..."
-msgstr ""
+msgstr "Se está cargando la ayuda, espere�"
 
 #: ../tools/browser/support.c:289
 msgid "Close tab"
@@ -7397,223 +7396,219 @@ msgstr ""
 "tt> y\n"
 "<tt>binary</tt></small>"
 
-#: ../tools/browser/canvas/browser-canvas-column.c:169
+#: ../tools/browser/canvas/browser-canvas-column.c:170
 #, c-format
 msgid "Type: %s"
 msgstr "Tipo: %s"
 
-#: ../tools/browser/canvas/browser-canvas-db-relations.c:299
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:306
 msgid "Remove"
 msgstr "Quitar"
 
-#: ../tools/browser/canvas/browser-canvas-db-relations.c:303
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:310
 msgid "Add referenced tables"
 msgstr "Añadir tablas referenciadas"
 
-#: ../tools/browser/canvas/browser-canvas-db-relations.c:307
-#, fuzzy
-#| msgid "Tables referencing this one"
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:314
 msgid "Add tables referencing this table"
-msgstr "Tablas que referencian a esta"
+msgstr "Añadir tablas referenciando esta tabla"
 
-#: ../tools/browser/canvas/browser-canvas-db-relations.c:505
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:512
 msgid "Add table"
 msgstr "Añadir tabla"
 
-#: ../tools/browser/canvas/browser-canvas-db-relations.c:525
-#, fuzzy
-#| msgid "Select a file to save the image to"
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:532
 msgid "Select tables to add to diagram"
-msgstr "Seleccionar un archivo donde guardar la imagen"
+msgstr "Seleccionar tablas para añadir al diagrama"
 
 #: ../tools/browser/canvas/browser-canvas-print.c:82
 msgid "Page size and zoom"
 msgstr "Tamaño de página y ampliación"
 
-#: ../tools/browser/canvas/browser-canvas-print.c:179
+#: ../tools/browser/canvas/browser-canvas-print.c:180
 #, c-format
 msgid "Page %d of %d horizontally and %d of %d vertically"
 msgstr "Página %d de %d horizontalmente y %d de %d verticalmente"
 
-#: ../tools/browser/canvas/browser-canvas-print.c:237
+#: ../tools/browser/canvas/browser-canvas-print.c:238
 msgid "Adjust page's size and orientation"
 msgstr "Ajuste del tamaño de página y orientación"
 
-#: ../tools/browser/canvas/browser-canvas-print.c:243
+#: ../tools/browser/canvas/browser-canvas-print.c:244
 msgid "<b>Zoom</b>"
 msgstr "<b>Ampliación</b>"
 
-#: ../tools/browser/canvas/browser-canvas-print.c:255
+#: ../tools/browser/canvas/browser-canvas-print.c:256
 msgid "Number of pages used:"
 msgstr "Número de páginas usadas:"
 
-#: ../tools/browser/canvas/browser-canvas-print.c:266
+#: ../tools/browser/canvas/browser-canvas-print.c:267
 msgid "horizontally"
 msgstr "horizontalmente"
 
-#: ../tools/browser/canvas/browser-canvas-print.c:277
+#: ../tools/browser/canvas/browser-canvas-print.c:278
 msgid "vertically"
 msgstr "verticalmente"
 
-#: ../tools/browser/canvas/browser-canvas-print.c:281
+#: ../tools/browser/canvas/browser-canvas-print.c:282
 msgid "Zoom factor:"
 msgstr "Factor de ampliación:"
 
-#: ../tools/browser/canvas/browser-canvas-print.c:294
+#: ../tools/browser/canvas/browser-canvas-print.c:295
 msgid "<b>Page numbers</b>"
 msgstr "<b>Números de página</b>"
 
-#: ../tools/browser/canvas/browser-canvas-print.c:307
+#: ../tools/browser/canvas/browser-canvas-print.c:308
 msgid "Print page numbers"
 msgstr "Imprimir números de página"
 
-#: ../tools/browser/canvas/browser-canvas.c:389
+#: ../tools/browser/canvas/browser-canvas.c:391
 msgid "Linear layout"
 msgstr "Distribución lineal"
 
-#: ../tools/browser/canvas/browser-canvas.c:394
+#: ../tools/browser/canvas/browser-canvas.c:396
 msgid "Radial layout"
 msgstr "Distribución radial"
 
-#: ../tools/browser/canvas/browser-canvas.c:508
+#: ../tools/browser/canvas/browser-canvas.c:510
 msgid "Save diagram as"
 msgstr "Guardar diagrama como"
 
-#: ../tools/browser/canvas/browser-canvas.c:514
+#: ../tools/browser/canvas/browser-canvas.c:516
 msgid "PNG Image"
 msgstr "Imagen PNG"
 
-#: ../tools/browser/canvas/browser-canvas.c:519
+#: ../tools/browser/canvas/browser-canvas.c:521
 msgid "SVG file"
 msgstr "Archivo SVG"
 
-#: ../tools/browser/canvas/browser-canvas.c:556
+#: ../tools/browser/canvas/browser-canvas.c:558
 msgid "Failed to create SVG file"
 msgstr "Falló al crear el archivo SVG"
 
-#: ../tools/browser/canvas/browser-canvas.c:564
+#: ../tools/browser/canvas/browser-canvas.c:566
 msgid "File format to save to is not recognized."
 msgstr "No se reconoce el formato de archivo en el que guardar."
 
-#: ../tools/browser/canvas/browser-canvas.c:584
+#: ../tools/browser/canvas/browser-canvas.c:586
 msgid "Failed to create PNG file"
 msgstr "Falló al crear el archivo PNG"
 
-#: ../tools/browser/common/gdaui-data-import.c:123
+#: ../tools/browser/common/gdaui-data-import.c:124
 msgid "Import specifications"
 msgstr "Importar especificaciones"
 
 #. file to import from
-#: ../tools/browser/common/gdaui-data-import.c:142
+#: ../tools/browser/common/gdaui-data-import.c:143
 msgid "File to import from:"
 msgstr "Archivo del que importar:"
 
-#: ../tools/browser/common/gdaui-data-import.c:146
+#: ../tools/browser/common/gdaui-data-import.c:147
 msgid "File to import data from"
 msgstr "Archivo del que importar los datos"
 
-#: ../tools/browser/common/gdaui-data-import.c:149
+#: ../tools/browser/common/gdaui-data-import.c:150
 msgid "Comma separated values"
 msgstr "Valores separados por comas"
 
-#: ../tools/browser/common/gdaui-data-import.c:154
+#: ../tools/browser/common/gdaui-data-import.c:155
 msgid "XML exported"
 msgstr "XML exportado"
 
-#: ../tools/browser/common/gdaui-data-import.c:158
+#: ../tools/browser/common/gdaui-data-import.c:159
 msgid "All files"
 msgstr "Todos los archivos"
 
 #. Encoding
-#: ../tools/browser/common/gdaui-data-import.c:166
+#: ../tools/browser/common/gdaui-data-import.c:167
 msgid "Encoding:"
 msgstr "Codificación:"
 
 #. first line as title
-#: ../tools/browser/common/gdaui-data-import.c:192
+#: ../tools/browser/common/gdaui-data-import.c:193
 msgid "First line as title:"
 msgstr "Primera línea como título:"
 
 #. separator
-#: ../tools/browser/common/gdaui-data-import.c:204
+#: ../tools/browser/common/gdaui-data-import.c:205
 msgid "Separator:"
 msgstr "Separador:"
 
-#: ../tools/browser/common/gdaui-data-import.c:208
+#: ../tools/browser/common/gdaui-data-import.c:209
 msgid "Comma"
 msgstr "Coma"
 
-#: ../tools/browser/common/gdaui-data-import.c:215
+#: ../tools/browser/common/gdaui-data-import.c:216
 msgid "Semi column"
 msgstr "Punto y coma"
 
-#: ../tools/browser/common/gdaui-data-import.c:222
+#: ../tools/browser/common/gdaui-data-import.c:223
 msgid "Tab"
 msgstr "Tabulación"
 
-#: ../tools/browser/common/gdaui-data-import.c:229
+#: ../tools/browser/common/gdaui-data-import.c:230
 msgid "Space"
 msgstr "Espacio"
 
-#: ../tools/browser/common/gdaui-data-import.c:236
+#: ../tools/browser/common/gdaui-data-import.c:237
 msgid "Pipe"
 msgstr "Barra vertical"
 
-#: ../tools/browser/common/gdaui-data-import.c:245
+#: ../tools/browser/common/gdaui-data-import.c:246
 msgid "Other:"
 msgstr "Otro:"
 
-#: ../tools/browser/common/gdaui-data-import.c:269
+#: ../tools/browser/common/gdaui-data-import.c:270
 msgid "Import preview"
 msgstr "Vista previa de la importación"
 
-#: ../tools/browser/common/gdaui-data-import.c:284
+#: ../tools/browser/common/gdaui-data-import.c:285
 msgid "No data."
 msgstr "Sin datos."
 
-#: ../tools/browser/common/gdaui-entry-import.c:172
+#: ../tools/browser/common/gdaui-entry-import.c:173
 msgid "Data set import from file"
 msgstr "Conjunto de datos importados de archivo"
 
-#: ../tools/browser/common/gdaui-entry-import.c:202
-#: ../tools/browser/query-exec/query-result.c:217
+#: ../tools/browser/common/gdaui-entry-import.c:203
+#: ../tools/browser/query-exec/query-result.c:219
 #, c-format
 msgid "%d row"
 msgid_plural "%d rows"
 msgstr[0] "%d fila"
 msgstr[1] "%d filas"
 
-#: ../tools/browser/common/gdaui-entry-import.c:203
-#: ../tools/browser/query-exec/query-result.c:218
+#: ../tools/browser/common/gdaui-entry-import.c:204
+#: ../tools/browser/query-exec/query-result.c:220
 #, c-format
 msgid "%d column"
 msgid_plural "%d columns"
 msgstr[0] "%d columna"
 msgstr[1] "%d columnas"
 
-#: ../tools/browser/common/gdaui-entry-import.c:204
-#: ../tools/browser/query-exec/query-result.c:220
+#: ../tools/browser/common/gdaui-entry-import.c:205
+#: ../tools/browser/query-exec/query-result.c:222
 #, c-format
 msgid "Data set with %s and %s"
 msgstr "Conjunto de datos con %s y %s"
 
-#: ../tools/browser/common/gdaui-entry-import.c:211
-#: ../tools/browser/common/gdaui-entry-import.c:234
+#: ../tools/browser/common/gdaui-entry-import.c:212
+#: ../tools/browser/common/gdaui-entry-import.c:235
 msgid "No data set"
 msgstr "Sin conjunto de datos"
 
-#: ../tools/browser/common/objects-cloud.c:249
+#: ../tools/browser/common/objects-cloud.c:250
 #, c-format
 msgid "%d table in current schema:"
 msgid_plural "%d tables in current schema:"
 msgstr[0] "%d tabla en el esquema actual:"
 msgstr[1] "%d tablas en el esquema actual:"
 
-#: ../tools/browser/common/objects-cloud.c:253
+#: ../tools/browser/common/objects-cloud.c:254
 msgid "Tables in current schema:"
 msgstr "Tablas en el esquema actual:"
 
-#: ../tools/browser/common/objects-cloud.c:256
+#: ../tools/browser/common/objects-cloud.c:257
 #, c-format
 msgid "%d Table in schema '%s':"
 msgid_plural "%d Tables in schema '%s':"
@@ -7621,69 +7616,61 @@ msgstr[0] "%d tabla en el esquema «%s»:"
 msgstr[1] "%d tablas en el esquema «%s»:"
 
 #. no connection at all or not authenticated
-#: ../tools/browser/common/objects-cloud.c:266 ../tools/web-server.c:712
+#: ../tools/browser/common/objects-cloud.c:267 ../tools/web-server.c:713
 msgid "None"
 msgstr "Ninguno"
 
-#: ../tools/browser/common/ui-formgrid.c:169
+#: ../tools/browser/common/ui-formgrid.c:170
 msgid "Toggle between grid and form presentations"
 msgstr "Conmutar entre las presentaciones de rejilla y formulario"
 
-#: ../tools/browser/data-manager/data-console.c:296
+#: ../tools/browser/data-manager/data-console.c:297
 msgid "Data Manager"
 msgstr "Gestor de datos"
 
-#: ../tools/browser/data-manager/data-console.c:296
-#: ../tools/browser/data-manager/data-console.c:515
-#: ../tools/browser/schema-browser/relations-diagram.c:321
-#: ../tools/browser/schema-browser/relations-diagram.c:469
+#: ../tools/browser/data-manager/data-console.c:297
+#: ../tools/browser/data-manager/data-console.c:516
+#: ../tools/browser/schema-browser/relations-diagram.c:328
+#: ../tools/browser/schema-browser/relations-diagram.c:476
 msgid "Unsaved"
 msgstr "Sin guardar"
 
-#: ../tools/browser/data-manager/data-console.c:327
-#: ../tools/browser/query-exec/query-console.c:330
+#: ../tools/browser/data-manager/data-console.c:328
+#: ../tools/browser/query-exec/query-console.c:331
 msgid "Variables' values:"
 msgstr "Valores de las variables:"
 
-#: ../tools/browser/data-manager/data-console.c:384
-#, fuzzy
-#| msgid "Test"
+#: ../tools/browser/data-manager/data-console.c:385
 msgid "Reset"
-msgstr "Prueba"
+msgstr "Restablecer"
 
-#: ../tools/browser/data-manager/data-console.c:385
-#, fuzzy
-#| msgid ""
-#| "Clear the editor's\n"
-#| "contents"
+#: ../tools/browser/data-manager/data-console.c:386
 msgid ""
 "Reset the editor's\n"
 "contents"
 msgstr ""
-"Limpiar el contenido\n"
+"Restablecer el contenido\n"
 "del editor"
 
-#: ../tools/browser/data-manager/data-console.c:392
-#, fuzzy
-#| msgid "Add a new data source..."
+#: ../tools/browser/data-manager/data-console.c:393
 msgid "Add a new data source"
-msgstr "Agregar una nueva fuente de datos..."
+msgstr "Añadir una fuente de datos nueva"
 
-#: ../tools/browser/data-manager/data-console.c:398
-#: ../tools/browser/query-exec/query-console.c:362
+#: ../tools/browser/data-manager/data-console.c:399
+#: ../tools/browser/query-exec/query-console.c:363
 msgid "Variables"
 msgstr "Variables"
 
-#: ../tools/browser/data-manager/data-console.c:398
+#: ../tools/browser/data-manager/data-console.c:399
 msgid "Show variables needed"
 msgstr "Mostrar las variables necesarias"
 
-#: ../tools/browser/data-manager/data-console.c:404
-#: ../tools/browser/query-exec/query-console.c:368
+#: ../tools/browser/data-manager/data-console.c:405
+#: ../tools/browser/query-exec/query-console.c:369
 msgid "Execute"
 msgstr "Ejecutar"
 
-#: ../tools/browser/data-manager/data-console.c:404
+#: ../tools/browser/data-manager/data-console.c:405
 msgid ""
 "Execute specified\n"
 "data manager"
@@ -7691,11 +7678,11 @@ msgstr ""
 "Ejecutar el gestor\n"
 "de datos especificado"
 
-#: ../tools/browser/data-manager/data-console.c:410
+#: ../tools/browser/data-manager/data-console.c:411
 msgid "View XML"
 msgstr "Ver XML"
 
-#: ../tools/browser/data-manager/data-console.c:410
+#: ../tools/browser/data-manager/data-console.c:411
 msgid ""
 "View specifications\n"
 "as XML (advanced)"
@@ -7703,318 +7690,309 @@ msgstr ""
 "Ver las especificaciones\n"
 "como XML (avanzado)"
 
-#: ../tools/browser/data-manager/data-console.c:418 ../tools/html-doc.c:95
+#: ../tools/browser/data-manager/data-console.c:419 ../tools/html-doc.c:95
 msgid "Help"
 msgstr "Ayuda"
 
-#: ../tools/browser/data-manager/data-console.c:431
+#: ../tools/browser/data-manager/data-console.c:432
 msgid "BBB:"
 msgstr "BBB:"
 
-#: ../tools/browser/data-manager/data-console.c:503
+#: ../tools/browser/data-manager/data-console.c:504
 #, c-format
 msgid "'%s' data manager"
 msgstr "Gestor de datos de «%s»"
 
-#: ../tools/browser/data-manager/data-console.c:504
-#: ../tools/browser/data-manager/data-console.c:515
-#: ../tools/browser/data-manager/data-console.c:548
-#: ../tools/browser/data-manager/data-console.c:942
+#: ../tools/browser/data-manager/data-console.c:505
+#: ../tools/browser/data-manager/data-console.c:516
+#: ../tools/browser/data-manager/data-console.c:549
+#: ../tools/browser/data-manager/data-console.c:944
 msgid "Data manager"
 msgstr "Gestor de datos"
 
-#: ../tools/browser/data-manager/data-console.c:558
+#: ../tools/browser/data-manager/data-console.c:559
 msgid "Could not save data manager"
 msgstr "No se pudo guardar el gestor de datos"
 
-#: ../tools/browser/data-manager/data-console.c:584
+#: ../tools/browser/data-manager/data-console.c:585
 msgid "Data manager's name"
 msgstr "Nombre del gestor de datos"
 
-#: ../tools/browser/data-manager/data-console.c:604
-#: ../tools/browser/schema-browser/relations-diagram.c:280
+#: ../tools/browser/data-manager/data-console.c:605
+#: ../tools/browser/schema-browser/relations-diagram.c:287
 msgid "Save"
 msgstr "Guardar"
 
-#: ../tools/browser/data-manager/data-console.c:724
-#, fuzzy, c-format
-#| msgid "Sources"
+#: ../tools/browser/data-manager/data-console.c:726
+#, c-format
 msgid "source%d"
-msgstr "Fuentes"
+msgstr "fuente %d"
 
-#: ../tools/browser/data-manager/data-console.c:767
-#, fuzzy
-#| msgid "Data source name"
+#: ../tools/browser/data-manager/data-console.c:769
 msgid "Data source from query"
-msgstr "Nombre de la fuente de datos"
+msgstr "Fuente de datos desde consulta"
 
-#: ../tools/browser/data-manager/data-console.c:805
-#, fuzzy, c-format
-#| msgid "Invalid schema name"
+#: ../tools/browser/data-manager/data-console.c:807
+#, c-format
 msgid "In schema %s"
-msgstr "El nombre del esquema no es válido"
+msgstr "En el esquema %s"
 
-#: ../tools/browser/data-manager/data-console.c:815
+#: ../tools/browser/data-manager/data-console.c:817
 #, c-format
 msgid "For table: %s"
-msgstr ""
+msgstr "Para la tabla: %s"
 
-#: ../tools/browser/data-manager/data-console.c:892
+#: ../tools/browser/data-manager/data-console.c:894
 msgid ""
 "Switching to execution mode. Hit the Escape key to return to the compose mode"
 msgstr ""
+"Cambiando al modo de ejecución. Pulsar la tecla Escape para volver al modo "
+"de edición."
 
-#: ../tools/browser/data-manager/data-console.c:898
+#: ../tools/browser/data-manager/data-console.c:900
 msgid "_Toggle mode"
 msgstr "C_onmutar modo"
 
-#: ../tools/browser/data-manager/data-console.c:898
+#: ../tools/browser/data-manager/data-console.c:900
 msgid "Switch between compose and execute modes"
 msgstr "Cambiar entre los modos de composición y ejecución"
 
-#: ../tools/browser/data-manager/data-favorite-selector.c:200
-#: ../tools/browser/query-exec/query-favorite-selector.c:190
-#: ../tools/browser/schema-browser/favorite-selector.c:169
+#: ../tools/browser/data-manager/data-favorite-selector.c:201
+#: ../tools/browser/query-exec/query-favorite-selector.c:191
+#: ../tools/browser/schema-browser/favorite-selector.c:170
 #, c-format
 msgid "Could not remove favorite: %s"
 msgstr "No se pudo quitar el favorito: %s"
 
-#: ../tools/browser/data-manager/data-favorite-selector.c:258
-#: ../tools/browser/data-manager/data-favorite-selector.c:626
-#: ../tools/browser/query-exec/query-console.c:683
-#: ../tools/browser/query-exec/query-favorite-selector.c:242
-#: ../tools/browser/query-exec/query-favorite-selector.c:597
-#: ../tools/browser/schema-browser/favorite-selector.c:356
-#: ../tools/browser/schema-browser/table-info.c:468
+#: ../tools/browser/data-manager/data-favorite-selector.c:259
+#: ../tools/browser/data-manager/data-favorite-selector.c:627
+#: ../tools/browser/query-exec/query-console.c:684
+#: ../tools/browser/query-exec/query-favorite-selector.c:243
+#: ../tools/browser/query-exec/query-favorite-selector.c:598
+#: ../tools/browser/schema-browser/favorite-selector.c:357
+#: ../tools/browser/schema-browser/table-info.c:475
 #, c-format
 msgid "Could not add favorite: %s"
 msgstr "No se pudo añadir el favorito: %s"
 
-#: ../tools/browser/data-manager/data-favorite-selector.c:289
-#: ../tools/browser/query-exec/query-favorite-selector.c:273
+#: ../tools/browser/data-manager/data-favorite-selector.c:290
+#: ../tools/browser/query-exec/query-favorite-selector.c:274
 msgid "Favorite's properties"
 msgstr "Propiedades de los favoritos"
 
-#: ../tools/browser/data-manager/data-favorite-selector.c:311
+#: ../tools/browser/data-manager/data-favorite-selector.c:312
 msgid "Specifications"
 msgstr "Especificaciones"
 
-#: ../tools/browser/data-manager/data-favorite-selector.c:482
-#: ../tools/browser/query-exec/query-favorite-selector.c:446
-#: ../tools/browser/schema-browser/favorite-selector.c:246
+#: ../tools/browser/data-manager/data-favorite-selector.c:483
+#: ../tools/browser/query-exec/query-favorite-selector.c:447
+#: ../tools/browser/schema-browser/favorite-selector.c:247
 msgid "Favorites"
 msgstr "Favoritos"
 
-#: ../tools/browser/data-manager/data-favorite-selector.c:612
+#: ../tools/browser/data-manager/data-favorite-selector.c:613
 msgid "Unnamed data manager"
 msgstr "Gestor de datos sin nombre"
 
-#: ../tools/browser/data-manager/data-manager-perspective.c:407
-#: ../tools/browser/query-exec/query-exec-perspective.c:385
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:317
+#: ../tools/browser/data-manager/data-manager-perspective.c:408
+#: ../tools/browser/query-exec/query-exec-perspective.c:387
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:318
 msgid "_Show favorites"
 msgstr "_Mostrar favoritos"
 
-#: ../tools/browser/data-manager/data-manager-perspective.c:407
-#: ../tools/browser/query-exec/query-exec-perspective.c:385
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:317
+#: ../tools/browser/data-manager/data-manager-perspective.c:408
+#: ../tools/browser/query-exec/query-exec-perspective.c:387
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:318
 msgid "Show or hide favorites"
 msgstr "Mostrar u ocultar los favoritos"
 
 #. Translators: Do not translate "table" nor "query"
-#: ../tools/browser/data-manager/data-source.c:401
+#: ../tools/browser/data-manager/data-source.c:402
 #, c-format
 msgid "Node must be \"table\" or \"query\", and is \"%s\""
 msgstr "El nodo debe ser «table» (tabla) o «query» (consulta) y es «%s»"
 
-#: ../tools/browser/data-manager/data-source.c:434
-#: ../tools/browser/schema-browser/mgr-columns.c:274
+#: ../tools/browser/data-manager/data-source.c:435
+#: ../tools/browser/schema-browser/mgr-columns.c:281
 #, c-format
 msgid "Not ready"
 msgstr "No está preparado"
 
-#: ../tools/browser/data-manager/data-source.c:441
+#: ../tools/browser/data-manager/data-source.c:442
 #, c-format
 msgid "Malformed table name \"%s\""
 msgstr "El nombre de la tabla «%s» está mal formado"
 
-#: ../tools/browser/data-manager/data-source.c:458
+#: ../tools/browser/data-manager/data-source.c:459
 #, c-format
 msgid "Could not find the \"%s\" table"
 msgstr "No se pudo encontrar la tabla «%s»"
 
-#: ../tools/browser/data-manager/data-source.c:463
+#: ../tools/browser/data-manager/data-source.c:464
 #, c-format
 msgid "The \"%s\" object is not a table"
 msgstr "El objeto «%s» no es una tabla"
 
 #. Translators: Do not translate "name"
-#: ../tools/browser/data-manager/data-source.c:482
+#: ../tools/browser/data-manager/data-source.c:483
 #, c-format
 msgid "Missing attribute \"name\" for table"
 msgstr "Falta el atributo «nombre» para la tabla"
 
-#: ../tools/browser/data-manager/data-source.c:622
+#: ../tools/browser/data-manager/data-source.c:623
 #, c-format
 msgid "Could not find any foreign key to \"%s\""
 msgstr "No se pudo encontrar ninguna clave externa hacia «%s»"
 
-#: ../tools/browser/data-manager/data-source.c:627
+#: ../tools/browser/data-manager/data-source.c:628
 #, c-format
 msgid "The fields involved in the foreign key to \"%s\" are not known"
 msgstr "Se desconocen los campos involucrados en la clave externa hacia «%s»"
 
-#: ../tools/browser/data-manager/data-source.c:808
+#: ../tools/browser/data-manager/data-source.c:809
 #, c-format
 msgid "Statement to execute is not a selection statement"
 msgstr "La declaración que ejecutar no es una declaración de selección"
 
-#: ../tools/browser/data-manager/data-source.c:948
+#: ../tools/browser/data-manager/data-source.c:949
 #, c-format
 msgid "No SELECT statement to execute"
 msgstr "Sin declaración SELECT para ejecutar"
 
-#: ../tools/browser/data-manager/data-source.c:1231
+#: ../tools/browser/data-manager/data-source.c:1232
 #, c-format
 msgid "Contents of '%s'"
 msgstr "Contenido de «%s»"
 
-#: ../tools/browser/data-manager/data-source.c:1242
+#: ../tools/browser/data-manager/data-source.c:1243
 #, c-format
 msgid "Could not build SELECT statement"
 msgstr "No se pudo construir la declaración SELECT"
 
-#: ../tools/browser/data-manager/data-source.c:1309
+#: ../tools/browser/data-manager/data-source.c:1310
 #, c-format
 msgid "Multiple statements detected, only the first will be used"
 msgstr "Se detectaron múltiples declaraciones, sólo se usará la primera"
 
-#: ../tools/browser/data-manager/data-source-editor.c:125
+#: ../tools/browser/data-manager/data-source-editor.c:126
 msgid ""
 "Data source's ID\n"
 "(as referenced by other data sources)"
 msgstr ""
+"ID de la fuente de datos\n"
+"(tal y como lo referencian otras fuentes de datos)"
 
-#: ../tools/browser/data-manager/data-source-editor.c:131
-#, fuzzy
-#| msgid "Database's description"
+#: ../tools/browser/data-manager/data-source-editor.c:132
 msgid "Data source's description"
-msgstr "Descripción de la base de datos"
+msgstr "Descripción de la fuente de datos"
 
-#: ../tools/browser/data-manager/data-source-editor.c:135
+#: ../tools/browser/data-manager/data-source-editor.c:136
 msgid ""
 "Table to display data from, leave empty\n"
 "to specify a SELECT statement instead"
 msgstr ""
+"Tabla de la que mostrar los datos, dejarlo vacío\n"
+"para especificar una declaración SELECT en su lugar"
 
-#: ../tools/browser/data-manager/data-source-editor.c:139
+#: ../tools/browser/data-manager/data-source-editor.c:140
 msgid ""
 "SELECT\n"
 "SQL"
 msgstr ""
+"SELECT\n"
+"SQL"
 
-#: ../tools/browser/data-manager/data-source-editor.c:140
+#: ../tools/browser/data-manager/data-source-editor.c:141
 msgid ""
 "Actual SQL executed\n"
 "to select data"
 msgstr ""
+"Actual código SQL ejecutado\n"
+"para seleccionar los datos"
 
-#: ../tools/browser/data-manager/data-source-editor.c:150
-#, fuzzy
-#| msgid "References"
+#: ../tools/browser/data-manager/data-source-editor.c:151
 msgid "Dependencies:"
-msgstr "Referencias"
+msgstr "Dependencias:"
 
-#: ../tools/browser/data-manager/data-source-editor.c:243
-#, fuzzy
-#| msgid "Require SSL"
+#: ../tools/browser/data-manager/data-source-editor.c:244
 msgid "Requires:"
-msgstr "Requiere SSL"
+msgstr "Requiere:"
 
-#: ../tools/browser/data-manager/data-source-editor.c:260
+#: ../tools/browser/data-manager/data-source-editor.c:261
 msgid "Exports:"
-msgstr ""
+msgstr "Exportaciones:"
 
-#: ../tools/browser/data-manager/data-widget.c:246
+#: ../tools/browser/data-manager/data-widget.c:248
 msgid "Link to other data"
-msgstr ""
+msgstr "Enlazar otros datos"
 
-#: ../tools/browser/data-manager/data-widget.c:342
-#, fuzzy, c-format
-#| msgid "Error creating database: %s"
+#: ../tools/browser/data-manager/data-widget.c:344
+#, c-format
 msgid "Error adding new data source: %s"
-msgstr "Error al crear la base de datos: %s"
+msgstr "Error al crear la fuente de datos nueva: %s"
 
-#: ../tools/browser/data-manager/data-widget.c:387
-#, fuzzy
-#| msgid "Use data source:"
+#: ../tools/browser/data-manager/data-widget.c:389
 msgid "Remove data source"
-msgstr "Usar fuente de datos:"
+msgstr "Quitar fuente de datos"
 
-#: ../tools/browser/data-manager/data-widget.c:393
-#, fuzzy
-#| msgid "Data Source Properties"
+#: ../tools/browser/data-manager/data-widget.c:395
 msgid "Show data source's properties"
-msgstr "Propiedades de la fuente de datos"
+msgstr "Mostrar las propiedades de la fuente de datos"
 
-#: ../tools/browser/data-manager/data-widget.c:531
-#, fuzzy
-#| msgid "Add referenced tables"
+#: ../tools/browser/data-manager/data-widget.c:533
 msgid "Obtain referenced data in table "
-msgstr "Añadir tablas referenciadas"
+msgstr "Obtener los datos referenciados en la tabla "
 
-#: ../tools/browser/data-manager/data-widget.c:548
-#, fuzzy
-#| msgid "Tables referencing this one"
+#: ../tools/browser/data-manager/data-widget.c:550
 msgid "List referencing data in "
-msgstr "Tablas que referencian a esta"
+msgstr "Lista referenciando datos en "
 
-#: ../tools/browser/data-manager/data-widget.c:614
+#: ../tools/browser/data-manager/data-widget.c:616
 msgid "No data source defined"
 msgstr "No se definió un origen de datos"
 
-#: ../tools/browser/data-manager/data-widget.c:849
-msgid "Error: no detail"
-msgstr "Error: sin detalles"
+#: ../tools/browser/data-manager/data-widget.c:1020
+#, c-format
+#| msgid "Cannot cast parameter from type '%s' to type '%s'"
+msgid "Can't bind parameter '%s' of type '%s' to a parameter of type '%s'"
+msgstr ""
+"No se puede vincular el parámetro «%s» del tipo «%s» a un parámetro de tipo "
+"«%s»"
 
 #: ../tools/browser/data-manager/ui-spec-editor.c:153
-#, fuzzy
-#| msgid "Data Sources"
 msgid "Data sources:"
-msgstr "Fuentes de datos"
+msgstr "Fuentes de datos:"
 
 #: ../tools/browser/data-manager/ui-spec-editor.c:204
-#, fuzzy
-#| msgid "Data Source Properties"
 msgid "Selected data source's properties:"
-msgstr "Propiedades de la fuente de datos"
+msgstr "Propiedades de la fuente de datos seleccionada:"
 
-#: ../tools/browser/data-manager/xml-spec-editor.c:171
+#: ../tools/browser/data-manager/xml-spec-editor.c:172
 #, c-format
 msgid "Error parsing XML specifications"
 msgstr "Error al analizar las especificaciones XML"
 
-#: ../tools/browser/data-manager/xml-spec-editor.c:185
+#: ../tools/browser/data-manager/xml-spec-editor.c:186
 #, c-format
 msgid "Expecting <%s> root node"
 msgstr "Esperando el nodo raíz <%s>"
 
-#: ../tools/browser/data-manager/xml-spec-editor.c:320
-#: ../tools/browser/query-exec/query-console.c:309
+#: ../tools/browser/data-manager/xml-spec-editor.c:321
+#: ../tools/browser/query-exec/query-console.c:310
 msgid "SQL code to execute:"
 msgstr "Código SQL que ejecutar:"
 
-#: ../tools/browser/query-exec/query-console.c:283
-#: ../tools/browser/query-exec/query-console.c:1078
+#: ../tools/browser/query-exec/query-console.c:284
+#: ../tools/browser/query-exec/query-console.c:1080
 msgid "Query editor"
 msgstr "Editor de consultas"
 
-#: ../tools/browser/query-exec/query-console.c:357
-#: ../tools/browser/query-exec/query-console.c:421
+#: ../tools/browser/query-exec/query-console.c:358
+#: ../tools/browser/query-exec/query-console.c:422
 msgid "Clear"
 msgstr "Limpiar"
 
-#: ../tools/browser/query-exec/query-console.c:357
+#: ../tools/browser/query-exec/query-console.c:358
 msgid ""
 "Clear the editor's\n"
 "contents"
@@ -8022,7 +8000,7 @@ msgstr ""
 "Limpiar el contenido\n"
 "del editor"
 
-#: ../tools/browser/query-exec/query-console.c:362
+#: ../tools/browser/query-exec/query-console.c:363
 msgid ""
 "Show variables needed\n"
 "to execute SQL"
@@ -8031,15 +8009,15 @@ msgstr ""
 "necesarias para ejecutar\n"
 "el SQL"
 
-#: ../tools/browser/query-exec/query-console.c:368
+#: ../tools/browser/query-exec/query-console.c:369
 msgid "Execute SQL in editor"
 msgstr "Ejecutar SQL en el editor"
 
-#: ../tools/browser/query-exec/query-console.c:374
+#: ../tools/browser/query-exec/query-console.c:375
 msgid "Indent"
 msgstr "Sangrar"
 
-#: ../tools/browser/query-exec/query-console.c:374
+#: ../tools/browser/query-exec/query-console.c:375
 msgid ""
 "Indent SQL in editor\n"
 "and make the code more readable\n"
@@ -8049,23 +8027,23 @@ msgstr ""
 "y hacer el código más legible\n"
 "(quita los comentarios)"
 
-#: ../tools/browser/query-exec/query-console.c:382
+#: ../tools/browser/query-exec/query-console.c:383
 msgid "Favorite"
 msgstr "Favorito"
 
-#: ../tools/browser/query-exec/query-console.c:382
+#: ../tools/browser/query-exec/query-console.c:383
 msgid "Add SQL to favorite"
 msgstr "Añadir SQL a los favoritos"
 
-#: ../tools/browser/query-exec/query-console.c:396
+#: ../tools/browser/query-exec/query-console.c:397
 msgid "Execution history:"
 msgstr "Histórico de ejecuciones:"
 
-#: ../tools/browser/query-exec/query-console.c:414
+#: ../tools/browser/query-exec/query-console.c:415
 msgid "Copy"
 msgstr "Copiar"
 
-#: ../tools/browser/query-exec/query-console.c:414
+#: ../tools/browser/query-exec/query-console.c:415
 msgid ""
 "Copy selected history\n"
 "to editor"
@@ -8073,34 +8051,34 @@ msgstr ""
 "Copiar el histórico\n"
 "seleccionado al editor"
 
-#: ../tools/browser/query-exec/query-console.c:421
+#: ../tools/browser/query-exec/query-console.c:422
 msgid "Clear history"
 msgstr "Limpiar histórico"
 
-#: ../tools/browser/query-exec/query-console.c:433
+#: ../tools/browser/query-exec/query-console.c:434
 msgid "Execution Results:"
 msgstr "Resultados de la ejecución:"
 
-#: ../tools/browser/query-exec/query-console.c:677
-#: ../tools/browser/query-exec/query-favorite-selector.c:583
+#: ../tools/browser/query-exec/query-console.c:678
+#: ../tools/browser/query-exec/query-favorite-selector.c:584
 msgid "Unnamed query"
 msgstr "Consulta sin nombre"
 
-#: ../tools/browser/query-exec/query-console.c:767
+#: ../tools/browser/query-exec/query-console.c:769
 msgid "Invalid variable's contents"
 msgstr "Contenido de la variable no válido"
 
-#: ../tools/browser/query-exec/query-console.c:768
-#: ../tools/browser/schema-browser/table-info.c:914
+#: ../tools/browser/query-exec/query-console.c:770
+#: ../tools/browser/schema-browser/table-info.c:921
 msgid "assign values to the following variables"
 msgstr "asignar valores a las siguientes variables"
 
-#: ../tools/browser/query-exec/query-console.c:822
+#: ../tools/browser/query-exec/query-console.c:824
 #, c-format
 msgid "Error while parsing code: %s"
 msgstr "Error al analizar el código: %s"
 
-#: ../tools/browser/query-exec/query-console.c:834
+#: ../tools/browser/query-exec/query-console.c:836
 msgid ""
 "A query is already being executed, to execute another query, open a new "
 "connection."
@@ -8108,15 +8086,15 @@ msgstr ""
 "Ya se está ejecutando una consulta, para ejecutar otra consulta abra una "
 "conexión nueva."
 
-#: ../tools/browser/query-exec/query-console.c:867
-#: ../tools/browser/schema-browser/table-info.c:548
+#: ../tools/browser/query-exec/query-console.c:869
+#: ../tools/browser/schema-browser/table-info.c:555
 #, c-format
 msgid "Error executing query: %s"
 msgstr "Error al ejecutar la consulta: %s"
 
-#: ../tools/browser/query-exec/query-console.c:920
-#: ../tools/browser/query-exec/query-console.c:971
-#: ../tools/browser/schema-browser/table-info.c:520
+#: ../tools/browser/query-exec/query-console.c:922
+#: ../tools/browser/query-exec/query-console.c:973
+#: ../tools/browser/schema-browser/table-info.c:527
 #, c-format
 msgid ""
 "Error executing query:\n"
@@ -8125,11 +8103,11 @@ msgstr ""
 "Error al ejecutar la consulta:\n"
 "%s"
 
-#: ../tools/browser/query-exec/query-console.c:931
+#: ../tools/browser/query-exec/query-console.c:933
 msgid "Statement executed"
 msgstr "Declaración ejecutada"
 
-#: ../tools/browser/query-exec/query-console.c:940
+#: ../tools/browser/query-exec/query-console.c:942
 msgid ""
 "A transaction has automatically been started\n"
 "during this statement's execution, this usually\n"
@@ -8145,106 +8123,106 @@ msgstr ""
 "estén accesibles, limpie el elemento correspondiente\n"
 "del histórico antes de cerrar la transacción)."
 
-#: ../tools/browser/query-exec/query-console.c:1028
+#: ../tools/browser/query-exec/query-console.c:1030
 msgid "_Execute"
 msgstr "_Ejecutar"
 
-#: ../tools/browser/query-exec/query-console.c:1028
+#: ../tools/browser/query-exec/query-console.c:1030
 msgid "Execute query"
 msgstr "Ejecutar consulta"
 
-#: ../tools/browser/query-exec/query-console.c:1031
+#: ../tools/browser/query-exec/query-console.c:1033
 msgid "_Undo"
 msgstr "_Deshacer"
 
-#: ../tools/browser/query-exec/query-console.c:1031
+#: ../tools/browser/query-exec/query-console.c:1033
 msgid "Undo last change"
 msgstr "Deshacer el último cambio"
 
-#: ../tools/browser/query-exec/query-editor.c:1186
+#: ../tools/browser/query-exec/query-editor.c:1187
 msgid "In the future:\n"
 msgstr "En el futuro:\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1190
+#: ../tools/browser/query-exec/query-editor.c:1191
 msgid "Less than a minute ago:\n"
 msgstr "Hace menos de un minuto:\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1195
+#: ../tools/browser/query-exec/query-editor.c:1196
 #, c-format
 msgid "%lu minute ago:\n"
 msgid_plural "%lu minutes ago:\n"
 msgstr[0] "hace %lu minuto:\n"
 msgstr[1] "hace %lu minutos:\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1202
+#: ../tools/browser/query-exec/query-editor.c:1203
 #, c-format
 msgid "%lu hour ago\n"
 msgid_plural "%lu hours ago\n"
 msgstr[0] "hace %lu hora\n"
 msgstr[1] "hace %lu horas\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1208
+#: ../tools/browser/query-exec/query-editor.c:1209
 #, c-format
 msgid "%lu day ago\n"
 msgid_plural "%lu days ago\n"
 msgstr[0] "hace %lu día\n"
 msgstr[1] "hace %lu días\n"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:389
+#: ../tools/browser/query-exec/query-exec-perspective.c:391
 msgid "_Query"
 msgstr "_Consultar"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:390
+#: ../tools/browser/query-exec/query-exec-perspective.c:392
 msgid "_New editor"
 msgstr "Editor _nuevo"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:390
+#: ../tools/browser/query-exec/query-exec-perspective.c:392
 msgid "Open a new query editor"
 msgstr "Abrir una consulta de edición nueva"
 
-#: ../tools/browser/query-exec/query-favorite-selector.c:295
+#: ../tools/browser/query-exec/query-favorite-selector.c:296
 msgid "SQL Code"
 msgstr "Código SQL"
 
-#: ../tools/browser/query-exec/query-result.c:207
+#: ../tools/browser/query-exec/query-result.c:209
 msgid "Statement:"
 msgstr "Declaración:"
 
-#: ../tools/browser/query-exec/query-result.c:241
+#: ../tools/browser/query-exec/query-result.c:243
 msgid "Number of rows impacted"
 msgstr "Número de filas afectadas"
 
-#: ../tools/browser/query-exec/query-result.c:265
+#: ../tools/browser/query-exec/query-result.c:267
 msgid "Execution Parameters"
 msgstr "Parámetros de ejecución"
 
-#: ../tools/browser/query-exec/query-result.c:327
+#: ../tools/browser/query-exec/query-result.c:329
 msgid "No result selected"
 msgstr "No se seleccionó ningún resultado"
 
-#: ../tools/browser/query-exec/query-result.c:386
+#: ../tools/browser/query-exec/query-result.c:388
 msgid "Number of rows impacted:"
 msgstr "Número de filas afectadas:"
 
-#: ../tools/browser/query-exec/query-result.c:425
+#: ../tools/browser/query-exec/query-result.c:427
 msgid "Execution error:\n"
 msgstr "Error de ejecución:\n"
 
-#: ../tools/browser/schema-browser/mgr-columns.c:292
+#: ../tools/browser/schema-browser/mgr-columns.c:299
 #, c-format
 msgid "Table not found"
 msgstr "No se encontró la tabla"
 
-#: ../tools/browser/schema-browser/mgr-columns.c:299
+#: ../tools/browser/schema-browser/mgr-columns.c:306
 #, c-format
 msgid "Requested object is not a table or view"
 msgstr "El objeto solicitado no es una tabla o una vista"
 
-#: ../tools/browser/schema-browser/mgr-columns.c:390
+#: ../tools/browser/schema-browser/mgr-columns.c:397
 msgid "Auto incremented"
 msgstr "Autoincrementar"
 
-#: ../tools/browser/schema-browser/objects-index.c:170
+#: ../tools/browser/schema-browser/objects-index.c:171
 msgid "Tables' index"
 msgstr "Ã?ndice de la tabla"
 
@@ -8252,76 +8230,76 @@ msgstr "Ã?ndice de la tabla"
 msgid "Schema browser"
 msgstr "Examinador de esquemas"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:224
-#: ../tools/browser/schema-browser/relations-diagram.c:561
+#: ../tools/browser/schema-browser/relations-diagram.c:231
+#: ../tools/browser/schema-browser/relations-diagram.c:568
 msgid "Diagram"
 msgstr "Diagrama"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:234
+#: ../tools/browser/schema-browser/relations-diagram.c:241
 msgid "Could not save diagram"
 msgstr "No se pudo guardar el diagrama"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:260
+#: ../tools/browser/schema-browser/relations-diagram.c:267
 msgid "Canvas's name"
 msgstr "Nombre del marco"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:321
-#: ../tools/browser/schema-browser/relations-diagram.c:378
-#: ../tools/browser/schema-browser/relations-diagram.c:458
-#: ../tools/browser/schema-browser/relations-diagram.c:469
+#: ../tools/browser/schema-browser/relations-diagram.c:328
+#: ../tools/browser/schema-browser/relations-diagram.c:385
+#: ../tools/browser/schema-browser/relations-diagram.c:465
+#: ../tools/browser/schema-browser/relations-diagram.c:476
 msgid "Relations diagram"
 msgstr "Diagrama de relaciones"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:368
+#: ../tools/browser/schema-browser/relations-diagram.c:375
 #, c-format
 msgid "Error parsing favorite's contents"
 msgstr "Error al analizar el contenido de los favoritos"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:377
-#: ../tools/browser/schema-browser/relations-diagram.c:457
+#: ../tools/browser/schema-browser/relations-diagram.c:384
+#: ../tools/browser/schema-browser/relations-diagram.c:464
 #, c-format
 msgid "'%s' diagram"
 msgstr "diagrama «%s»"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:427
+#: ../tools/browser/schema-browser/relations-diagram.c:434
 #, c-format
 msgid "Missing table attribute in favorite's contents"
 msgstr "Falta un atributo de la tabla en el contenido de los favoritos"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:513
-#: ../tools/browser/schema-browser/table-info.c:946
+#: ../tools/browser/schema-browser/relations-diagram.c:520
+#: ../tools/browser/schema-browser/table-info.c:953
 msgid "_Contents"
 msgstr "Ã?nd_ice"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:513
+#: ../tools/browser/schema-browser/relations-diagram.c:520
 msgid "View contents"
 msgstr "Ver contenido"
 
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:416
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:417
 msgid "Could not load diagram"
 msgstr "No se pudo cargar el diagrama"
 
-#: ../tools/browser/schema-browser/table-columns.c:228
+#: ../tools/browser/schema-browser/table-columns.c:229
 msgid "Foreign key on "
 msgstr "Clave externa en "
 
-#: ../tools/browser/schema-browser/table-columns.c:303
+#: ../tools/browser/schema-browser/table-columns.c:304
 msgid "Unique constraint"
 msgstr "Restricción única"
 
-#: ../tools/browser/schema-browser/table-columns.c:334
+#: ../tools/browser/schema-browser/table-columns.c:335
 msgid "Tables referencing this one"
 msgstr "Tablas que referencian a esta"
 
-#: ../tools/browser/schema-browser/table-columns.c:448
+#: ../tools/browser/schema-browser/table-columns.c:449
 msgid "Column Name"
 msgstr "Nombre de columna"
 
-#: ../tools/browser/schema-browser/table-columns.c:503
+#: ../tools/browser/schema-browser/table-columns.c:504
 msgid "Constraints and integrity rules"
 msgstr "Reglas de restricciones e integridad"
 
-#: ../tools/browser/schema-browser/table-info.c:357
+#: ../tools/browser/schema-browser/table-info.c:364
 msgid ""
 "Table not found. If you think this is an error,\n"
 "please refresh the meta data from the database\n"
@@ -8331,27 +8309,27 @@ msgstr ""
 "actualice los metadatos de la base de datos\n"
 "(menú Conexión/Obtener metadatos)."
 
-#: ../tools/browser/schema-browser/table-info.c:388
+#: ../tools/browser/schema-browser/table-info.c:395
 msgid "Relations"
 msgstr "Relaciones"
 
-#: ../tools/browser/schema-browser/table-info.c:398
+#: ../tools/browser/schema-browser/table-info.c:405
 msgid "Preferences"
 msgstr "Preferencias"
 
-#: ../tools/browser/schema-browser/table-info.c:527
+#: ../tools/browser/schema-browser/table-info.c:534
 msgid "Data successfully inserted"
 msgstr "Datos introducidos correctamente"
 
-#: ../tools/browser/schema-browser/table-info.c:666
+#: ../tools/browser/schema-browser/table-info.c:673
 msgid "Meta data not yet available"
 msgstr "Los metadatos aún no están disponibles"
 
-#: ../tools/browser/schema-browser/table-info.c:683
+#: ../tools/browser/schema-browser/table-info.c:690
 msgid "Can't find information about table"
 msgstr "No se puede encontrar información acerca de la tabla"
 
-#: ../tools/browser/schema-browser/table-info.c:719
+#: ../tools/browser/schema-browser/table-info.c:726
 #, c-format
 msgid ""
 "Internal error while building INSERT statement:\n"
@@ -8360,57 +8338,57 @@ msgstr ""
 "Error interno al construir la declaración INSERT:\n"
 "%s"
 
-#: ../tools/browser/schema-browser/table-info.c:765
+#: ../tools/browser/schema-browser/table-info.c:772
 #, c-format
 msgid "Default value: '%s'"
 msgstr "Valor predeterminado: «%s»"
 
-#: ../tools/browser/schema-browser/table-info.c:775
+#: ../tools/browser/schema-browser/table-info.c:782
 msgid "Default value: auto incremented value"
 msgstr "Valor predeterminado: valor autoincrementado"
 
-#: ../tools/browser/schema-browser/table-info.c:889
-#: ../tools/browser/schema-browser/table-info.c:913
+#: ../tools/browser/schema-browser/table-info.c:896
+#: ../tools/browser/schema-browser/table-info.c:920
 msgid "Values to insert into table"
 msgstr "Valores para insertar en la tabla"
 
-#: ../tools/browser/schema-browser/table-info.c:944
+#: ../tools/browser/schema-browser/table-info.c:951
 msgid "Add to _Favorites"
 msgstr "AnÌ?adir a _favoritos"
 
-#: ../tools/browser/schema-browser/table-info.c:944
+#: ../tools/browser/schema-browser/table-info.c:951
 msgid "Add table to favorites"
 msgstr "Añadir tabla a los favoritos"
 
-#: ../tools/browser/schema-browser/table-info.c:946
+#: ../tools/browser/schema-browser/table-info.c:953
 msgid "View table's contents"
 msgstr "Ver contenido de la tabla"
 
-#: ../tools/browser/schema-browser/table-info.c:948
+#: ../tools/browser/schema-browser/table-info.c:955
 msgid "_Insert data"
 msgstr "_Insertar datos"
 
-#: ../tools/browser/schema-browser/table-info.c:948
+#: ../tools/browser/schema-browser/table-info.c:955
 msgid "Insert data into table"
 msgstr "Insertar datos en la tabla"
 
-#: ../tools/browser/schema-browser/table-preferences.c:261
+#: ../tools/browser/schema-browser/table-preferences.c:262
 msgid "default"
 msgstr "predeterminado"
 
-#: ../tools/browser/schema-browser/table-preferences.c:338
+#: ../tools/browser/schema-browser/table-preferences.c:339
 msgid "Table's fields"
 msgstr "Campos de la tabla"
 
-#: ../tools/browser/schema-browser/table-preferences.c:382
+#: ../tools/browser/schema-browser/table-preferences.c:383
 msgid "Field's display preferences"
 msgstr "Preferencias de mostrado del campo"
 
-#: ../tools/browser/schema-browser/table-preferences.c:459
+#: ../tools/browser/schema-browser/table-preferences.c:460
 msgid "Data entry type:"
 msgstr "Entrada del tipo de datos:"
 
-#: ../tools/browser/schema-browser/table-preferences.c:460
+#: ../tools/browser/schema-browser/table-preferences.c:461
 msgid ""
 "Defines how data for the selected column\n"
 "will be displayed in forms. Leave 'Default' to have\n"
@@ -8421,20 +8399,20 @@ msgstr ""
 "Déjelo como «Predeterminado» para tener la\n"
 "pantalla predeterminada"
 
-#: ../tools/browser/schema-browser/table-preferences.c:469
-#: ../tools/browser/schema-browser/table-preferences.c:480
+#: ../tools/browser/schema-browser/table-preferences.c:470
+#: ../tools/browser/schema-browser/table-preferences.c:481
 msgid "none"
 msgstr "ninguna"
 
-#: ../tools/browser/schema-browser/table-preferences.c:473
+#: ../tools/browser/schema-browser/table-preferences.c:474
 msgid "Options:"
 msgstr "Opciones:"
 
-#: ../tools/browser/schema-browser/table-preferences.c:484
+#: ../tools/browser/schema-browser/table-preferences.c:485
 msgid "Preview:"
 msgstr "Vista previa:"
 
-#: ../tools/browser/schema-browser/table-preferences.c:485
+#: ../tools/browser/schema-browser/table-preferences.c:486
 msgid ""
 "Free form to test the configured\n"
 "data entry"
@@ -8442,68 +8420,68 @@ msgstr ""
 "Formulario libre para probar la\n"
 "entrada de datos configurada"
 
-#: ../tools/command-exec.c:336
+#: ../tools/command-exec.c:337
 msgid "History is not supported"
 msgstr "No se soporta el histórico"
 
-#: ../tools/command-exec.c:349 ../tools/command-exec.c:385
-#: ../tools/command-exec.c:428 ../tools/command-exec.c:470
-#: ../tools/command-exec.c:603 ../tools/gda-sql.c:2994 ../tools/gda-sql.c:4127
-#: ../tools/gda-sql.c:4217 ../tools/gda-sql.c:4442 ../tools/gda-sql.c:4543
+#: ../tools/command-exec.c:351 ../tools/command-exec.c:388
+#: ../tools/command-exec.c:432 ../tools/command-exec.c:475
+#: ../tools/command-exec.c:608 ../tools/gda-sql.c:3000 ../tools/gda-sql.c:4136
+#: ../tools/gda-sql.c:4226 ../tools/gda-sql.c:4451 ../tools/gda-sql.c:4552
 msgid "No current connection"
 msgstr "No existe una conexión actualmente"
 
-#: ../tools/command-exec.c:412
+#: ../tools/command-exec.c:415
 msgid "List of tables"
 msgstr "Lista de tablas"
 
-#: ../tools/command-exec.c:454
+#: ../tools/command-exec.c:458
 msgid "List of views"
 msgstr "Lista de vistas"
 
-#: ../tools/command-exec.c:494
+#: ../tools/command-exec.c:499
 msgid "List of schemas"
 msgstr "Lista de esquemas"
 
-#: ../tools/command-exec.c:568 ../tools/command-exec.c:693
+#: ../tools/command-exec.c:573 ../tools/command-exec.c:698
 msgid "No object found"
 msgstr "No se encontró ningún objeto"
 
-#: ../tools/command-exec.c:647
+#: ../tools/command-exec.c:652
 msgid "Schema"
 msgstr "Esquema"
 
-#: ../tools/command-exec.c:722 ../tools/web-server.c:925
+#: ../tools/command-exec.c:727 ../tools/web-server.c:926
 msgid "Column"
 msgstr "Columna"
 
-#: ../tools/command-exec.c:724 ../tools/web-server.c:927
+#: ../tools/command-exec.c:729 ../tools/web-server.c:928
 msgid "Nullable"
 msgstr "Que puede ser Null"
 
-#: ../tools/command-exec.c:726 ../tools/web-server.c:929
+#: ../tools/command-exec.c:731 ../tools/web-server.c:930
 msgid "Extra"
 msgstr "Extra"
 
-#: ../tools/command-exec.c:729
+#: ../tools/command-exec.c:734
 #, c-format
 msgid "List of columns for view '%s'"
 msgstr "Lista de columnas para la vista «%s»"
 
-#: ../tools/command-exec.c:733
+#: ../tools/command-exec.c:738
 #, c-format
 msgid "List of columns for table '%s'"
 msgstr "Lista de columnas para la tabla «%s»"
 
-#: ../tools/command-exec.c:745 ../tools/web-server.c:940
+#: ../tools/command-exec.c:750 ../tools/web-server.c:941
 msgid "yes"
 msgstr "sí"
 
-#: ../tools/command-exec.c:745 ../tools/web-server.c:940
+#: ../tools/command-exec.c:750 ../tools/web-server.c:941
 msgid "no"
 msgstr "no"
 
-#: ../tools/command-exec.c:777
+#: ../tools/command-exec.c:782
 #, c-format
 msgid "View definition: %s"
 msgstr "Definición de la vista: %s"
@@ -8649,7 +8627,7 @@ msgstr "No se puede abrir la tubería «%s»: %s\n"
 msgid "Can't open file '%s' for reading: %s\n"
 msgstr "No se puede abrir el archivo «%s» para lectura: %s\n"
 
-#: ../tools/gda-sql.c:1268 ../tools/gda-sql.c:3234
+#: ../tools/gda-sql.c:1268 ../tools/gda-sql.c:3242
 #, c-format
 msgid "Connection name '%s' is invalid"
 msgstr "El nombre de la conexión «%s» no es válido"
@@ -8677,8 +8655,8 @@ msgstr "Sin contraseña para «%s»"
 #: ../tools/gda-sql.c:1438
 #, c-format
 msgid ""
-"All the meta data associated to the '%s' connection will be stored in the '%"
-"s' file\n"
+"All the meta data associated to the '%s' connection will be stored in the "
+"'%s' file\n"
 msgstr ""
 "Todos los metadatos asociados con la conexión «%s» se almacenarán en el "
 "archivo «%s»\n"
@@ -8694,52 +8672,52 @@ msgid ""
 "Getting database schema information for connection '%s', this may take some "
 "time... "
 msgstr ""
-"Obteniendo la información de esquema para la conexión «%s», esto puede llevar "
-"algún tiempo� "
+"Obteniendo la información de esquema para la conexión «%s», esto puede "
+"llevar algún tiempo� "
 
-#: ../tools/gda-sql.c:1481 ../tools/gda-sql.c:1618 ../tools/gda-sql.c:3050
+#: ../tools/gda-sql.c:1481 ../tools/gda-sql.c:1618 ../tools/gda-sql.c:3056
 #, c-format
 msgid "error: %s\n"
 msgstr "error: %s\n"
 
-#: ../tools/gda-sql.c:1488 ../tools/gda-sql.c:1625 ../tools/gda-sql.c:3057
+#: ../tools/gda-sql.c:1488 ../tools/gda-sql.c:1625 ../tools/gda-sql.c:3063
 #, c-format
 msgid "Done.\n"
 msgstr "Hecho.\n"
 
-#: ../tools/gda-sql.c:1752
+#: ../tools/gda-sql.c:1753
 #, c-format
 msgid "(%d row)"
 msgid_plural "(%d rows)"
 msgstr[0] "(%d fila)"
 msgstr[1] "(%d filas)"
 
-#: ../tools/gda-sql.c:1854 ../tools/gda-sql.c:2874
+#: ../tools/gda-sql.c:1855 ../tools/gda-sql.c:2879
 msgid "Installed providers list"
 msgstr "Lista de proveedores instalados"
 
-#: ../tools/gda-sql.c:1999 ../tools/gda-sql.c:2194 ../tools/gda-sql.c:2266
-#: ../tools/gda-sql.c:2278
+#: ../tools/gda-sql.c:2000 ../tools/gda-sql.c:2195 ../tools/gda-sql.c:2267
+#: ../tools/gda-sql.c:2279
 #, c-format
 msgid "%s [FILE]"
 msgstr "[ARCHIVO] %s"
 
-#: ../tools/gda-sql.c:2000
+#: ../tools/gda-sql.c:2001
 msgid "Show commands history, or save it to file"
 msgstr "Mostrar el histórico de los comandos o guardarlo a un archivo"
 
-#: ../tools/gda-sql.c:2010 ../tools/gda-sql.c:2022 ../tools/gda-sql.c:2034
-#: ../tools/gda-sql.c:2046 ../tools/gda-sql.c:2058 ../tools/gda-sql.c:2070
-#: ../tools/gda-sql.c:2083
+#: ../tools/gda-sql.c:2011 ../tools/gda-sql.c:2023 ../tools/gda-sql.c:2035
+#: ../tools/gda-sql.c:2047 ../tools/gda-sql.c:2059 ../tools/gda-sql.c:2071
+#: ../tools/gda-sql.c:2084
 msgid "Information"
 msgstr "Información"
 
-#: ../tools/gda-sql.c:2011
+#: ../tools/gda-sql.c:2012
 #, c-format
 msgid "%s [META DATA TYPE]"
 msgstr "[TIPO DE METADATO] %s"
 
-#: ../tools/gda-sql.c:2012
+#: ../tools/gda-sql.c:2013
 msgid ""
 "Force reading the database meta data (or part of the meta data, ex:\"tables"
 "\")"
@@ -8747,284 +8725,284 @@ msgstr ""
 "Forzar la lectura de los metadatos de la base de datos (o parte de los "
 "metadatos, ej «tablas»)"
 
-#: ../tools/gda-sql.c:2023
+#: ../tools/gda-sql.c:2024
 #, c-format
 msgid "%s [TABLE]"
 msgstr "[TABLA] %s"
 
-#: ../tools/gda-sql.c:2024
+#: ../tools/gda-sql.c:2025
 msgid "List all tables (or named table)"
 msgstr "Lista de todas las tablas (o la tabla de nombre)"
 
-#: ../tools/gda-sql.c:2035
+#: ../tools/gda-sql.c:2036
 #, c-format
 msgid "%s [VIEW]"
 msgstr "[VISTA] %s"
 
-#: ../tools/gda-sql.c:2036
+#: ../tools/gda-sql.c:2037
 msgid "List all views (or named view)"
 msgstr "Lista de todas las vistas (o la vista de nombre)"
 
-#: ../tools/gda-sql.c:2047
+#: ../tools/gda-sql.c:2048
 #, c-format
 msgid "%s [SCHEMA]"
 msgstr "[ESQUEMA] %s"
 
-#: ../tools/gda-sql.c:2048
+#: ../tools/gda-sql.c:2049
 msgid "List all schemas (or named schema)"
 msgstr "Listar todos los esquemas (o el esquema de nombre)"
 
-#: ../tools/gda-sql.c:2059
+#: ../tools/gda-sql.c:2060
 #, c-format
 msgid "%s [OBJ_NAME|SCHEMA.*]"
 msgstr "[NOMBRE_OBJ|ESQUEMA.*] %s"
 
-#: ../tools/gda-sql.c:2060
+#: ../tools/gda-sql.c:2061
 msgid "Describe object or full list of objects"
 msgstr "Describir el objeto o lista completa de los objetos"
 
-#: ../tools/gda-sql.c:2071
+#: ../tools/gda-sql.c:2072
 #, c-format
 msgid "%s [TABLE1 [TABLE2...]]"
 msgstr "[TABLA1 [TABLA2â?¦]] %s"
 
-#: ../tools/gda-sql.c:2072
+#: ../tools/gda-sql.c:2073
 msgid "Create a graph of all or the listed tables"
 msgstr "Crear una gráfica de todas las tablas o de las listadas"
 
-#: ../tools/gda-sql.c:2084
+#: ../tools/gda-sql.c:2085
 #, c-format
 msgid "%s [port [authentication token]]"
 msgstr "[puerto [token de autenticación]] %s"
 
-#: ../tools/gda-sql.c:2085
+#: ../tools/gda-sql.c:2086
 msgid "Start/stop embedded HTTP server (on given port or on 12345 by default)"
 msgstr ""
 "Iniciar/parar el servidor HTTP empotrado (en el puerto predeterminado 12345)"
 
-#: ../tools/gda-sql.c:2098
+#: ../tools/gda-sql.c:2099
 #, c-format
 msgid "%s [CNC_NAME [DSN|CONNECTION STRING]]"
 msgstr "%s [NOMBRE_CNC [DSN|CADENA DE DONEXIÃ?N]]"
 
-#: ../tools/gda-sql.c:2099
+#: ../tools/gda-sql.c:2100
 msgid "Opens a new connection or lists opened connections"
 msgstr "Abre una conexión nueva o lista las conexiones abiertas"
 
-#: ../tools/gda-sql.c:2110
+#: ../tools/gda-sql.c:2111
 #, c-format
 msgid "%s [CNC_NAME]"
 msgstr "[NOMBRE_CNC] %s"
 
-#: ../tools/gda-sql.c:2111
+#: ../tools/gda-sql.c:2112
 msgid "Close a connection"
 msgstr "Cerrar una conexión"
 
-#: ../tools/gda-sql.c:2122
+#: ../tools/gda-sql.c:2123
 #, c-format
 msgid "%s CNC_NAME CNC_NAME1 CNC_NAME2 [CNC_NAME ...]"
 msgstr "NOMBRE_CNC NOMBRE1_CNC NOMBRE2_CNC [NOMBRE_CNC â?¦] %s"
 
-#: ../tools/gda-sql.c:2123
+#: ../tools/gda-sql.c:2124
 msgid "Bind several connections together into the CNC_NAME virtual connection"
 msgstr ""
 "Vincular varias conexiones juntas entro de la conexión virtual CNC_NOMBRE"
 
-#: ../tools/gda-sql.c:2133 ../tools/gda-sql.c:2145 ../tools/gda-sql.c:2157
-#: ../tools/gda-sql.c:2169
+#: ../tools/gda-sql.c:2134 ../tools/gda-sql.c:2146 ../tools/gda-sql.c:2158
+#: ../tools/gda-sql.c:2170
 msgid "DSN (data sources) management"
 msgstr "Gestión de los DSN (fuentes de datos)"
 
-#: ../tools/gda-sql.c:2134
+#: ../tools/gda-sql.c:2135
 #, c-format
 msgid "%s [DSN]"
 msgstr "[DSN] %s"
 
-#: ../tools/gda-sql.c:2135
+#: ../tools/gda-sql.c:2136
 msgid "List all DSN (or named DSN's attributes)"
 msgstr "Listar todos los DSN (o atributos del DSN con nombre)"
 
-#: ../tools/gda-sql.c:2146
+#: ../tools/gda-sql.c:2147
 #, c-format
 msgid "%s DSN_NAME DSN_DEFINITION [DESCRIPTION]"
 msgstr "NOMBRE_DEL_DSN DEFINICIÃ?N_DEL_DSN [DESCRIPCIÃ?N] %s"
 
-#: ../tools/gda-sql.c:2147
+#: ../tools/gda-sql.c:2148
 msgid "Create (or modify) a DSN"
 msgstr "Crear (o modificar) un DSN"
 
-#: ../tools/gda-sql.c:2158
+#: ../tools/gda-sql.c:2159
 #, c-format
 msgid "%s DSN_NAME [DSN_NAME...]"
-msgstr "NOMBRE_DEL_DSN [NOMBRE_DEL_DSN...] %s"
+msgstr "NOMBRE_DEL_DSN [NOMBRE_DEL_DSNâ?¦] %s"
 
-#: ../tools/gda-sql.c:2159
+#: ../tools/gda-sql.c:2160
 msgid "Remove a DSN"
 msgstr "Quitar un DSN"
 
-#: ../tools/gda-sql.c:2170
+#: ../tools/gda-sql.c:2171
 #, c-format
 msgid "%s [PROVIDER]"
 msgstr "[PROVEEDOR] %s"
 
-#: ../tools/gda-sql.c:2171
+#: ../tools/gda-sql.c:2172
 msgid "List all installed database providers (or named one's attributes)"
 msgstr "Listar todos los proveedores de bases de datos instalados"
 
-#: ../tools/gda-sql.c:2181 ../tools/gda-sql.c:2193 ../tools/gda-sql.c:2205
-#: ../tools/gda-sql.c:2217
+#: ../tools/gda-sql.c:2182 ../tools/gda-sql.c:2194 ../tools/gda-sql.c:2206
+#: ../tools/gda-sql.c:2218
 msgid "Input/Output"
 msgstr "Entrada/Salida"
 
-#: ../tools/gda-sql.c:2182 ../tools/gda-sql.c:2314
+#: ../tools/gda-sql.c:2183 ../tools/gda-sql.c:2315
 #, c-format
 msgid "%s FILE"
 msgstr "ARCHIVO %s"
 
-#: ../tools/gda-sql.c:2183
+#: ../tools/gda-sql.c:2184
 msgid "Execute commands from file"
 msgstr "Ejecutar los comandos del archivo"
 
-#: ../tools/gda-sql.c:2195
+#: ../tools/gda-sql.c:2196
 msgid "Send output to a file or |pipe"
 msgstr "Enviar la salida a un archivo o |tubería"
 
-#: ../tools/gda-sql.c:2206 ../tools/gda-sql.c:2218
+#: ../tools/gda-sql.c:2207 ../tools/gda-sql.c:2219
 #, c-format
 msgid "%s [TEXT]"
 msgstr "[TEXTO] %s"
 
-#: ../tools/gda-sql.c:2207
+#: ../tools/gda-sql.c:2208
 msgid "Send output to stdout"
 msgstr "Enviar la salida a stdout"
 
-#: ../tools/gda-sql.c:2219
+#: ../tools/gda-sql.c:2220
 msgid "Send output to output stream"
 msgstr "Enviar la salida al flujo de salida"
 
-#: ../tools/gda-sql.c:2231
+#: ../tools/gda-sql.c:2232
 msgid "Quit"
 msgstr "Salir"
 
-#: ../tools/gda-sql.c:2242
+#: ../tools/gda-sql.c:2243
 #, c-format
 msgid "%s [DIR]"
 msgstr "[DIR] %s"
 
-#: ../tools/gda-sql.c:2243
+#: ../tools/gda-sql.c:2244
 msgid "Change the current working directory"
 msgstr "Cambiar el directorio de trabajo actual"
 
-#: ../tools/gda-sql.c:2255
+#: ../tools/gda-sql.c:2256
 msgid "Show usage and distribution terms"
 msgstr "Mostrar el uso y distribución de los términos"
 
-#: ../tools/gda-sql.c:2265 ../tools/gda-sql.c:2277 ../tools/gda-sql.c:2289
-#: ../tools/gda-sql.c:2301 ../tools/gda-sql.c:2313 ../tools/gda-sql.c:2325
-#: ../tools/gda-sql.c:2337 ../tools/gda-sql.c:2349 ../tools/gda-sql.c:2361
-#: ../tools/gda-sql.c:2373 ../tools/gda-sql.c:2385 ../tools/gda-sql.c:2422
-#: ../tools/gda-sql.c:2434
+#: ../tools/gda-sql.c:2266 ../tools/gda-sql.c:2278 ../tools/gda-sql.c:2290
+#: ../tools/gda-sql.c:2302 ../tools/gda-sql.c:2314 ../tools/gda-sql.c:2326
+#: ../tools/gda-sql.c:2338 ../tools/gda-sql.c:2350 ../tools/gda-sql.c:2362
+#: ../tools/gda-sql.c:2374 ../tools/gda-sql.c:2386 ../tools/gda-sql.c:2423
+#: ../tools/gda-sql.c:2435
 msgid "Query buffer"
 msgstr "Búfer de consulta"
 
-#: ../tools/gda-sql.c:2267
+#: ../tools/gda-sql.c:2268
 msgid "Edit the query buffer (or file) with external editor"
 msgstr "Editar el búfer de la consulta (o archivo) con un editor externo"
 
-#: ../tools/gda-sql.c:2279
+#: ../tools/gda-sql.c:2280
 msgid "Reset the query buffer (fill buffer with contents of file)"
 msgstr ""
 "Limpiar el búfer de consulta (llenar el búfer de el contenido del archivo)"
 
-#: ../tools/gda-sql.c:2291
+#: ../tools/gda-sql.c:2292
 msgid "Show the contents of the query buffer"
 msgstr "Mostrar el contenido del búfer de la consulta"
 
-#: ../tools/gda-sql.c:2302
+#: ../tools/gda-sql.c:2303
 #, c-format
 msgid "%s [QUERY_BUFFER_NAME]"
 msgstr "[NOMBRE_DE_LA_CONSULTA] %s"
 
-#: ../tools/gda-sql.c:2303
+#: ../tools/gda-sql.c:2304
 msgid "Execute contents of query buffer, or named query buffer"
 msgstr ""
 "Ejecutar el contenido del búfer de consulta, o del nombre del búfer de "
 "consulta"
 
-#: ../tools/gda-sql.c:2315
+#: ../tools/gda-sql.c:2316
 msgid "Write query buffer to file"
 msgstr "Escribir el búfer de consulta en un archivo"
 
-#: ../tools/gda-sql.c:2326 ../tools/gda-sql.c:2338 ../tools/gda-sql.c:2350
+#: ../tools/gda-sql.c:2327 ../tools/gda-sql.c:2339 ../tools/gda-sql.c:2351
 #, c-format
 msgid "%s QUERY_BUFFER_NAME"
 msgstr "NOMBRE_DE_LA_CONSULTA %s"
 
-#: ../tools/gda-sql.c:2327
+#: ../tools/gda-sql.c:2328
 msgid "Save query buffer to dictionary"
 msgstr "Guardar el búfer de consulta al diccionario"
 
-#: ../tools/gda-sql.c:2339
+#: ../tools/gda-sql.c:2340
 msgid "Load query buffer from dictionary"
 msgstr "Cargar búfer de consulta del diccionario"
 
-#: ../tools/gda-sql.c:2351
+#: ../tools/gda-sql.c:2352
 msgid "Delete query buffer from dictionary"
 msgstr "Borrar búfer de consulta del diccionario"
 
-#: ../tools/gda-sql.c:2362
+#: ../tools/gda-sql.c:2363
 #, c-format
 msgid "%s"
 msgstr "%s"
 
-#: ../tools/gda-sql.c:2363
+#: ../tools/gda-sql.c:2364
 msgid "List all saved query buffers in dictionary"
 msgstr "Listar todos los búfer de consulta guardados en el diccionario"
 
-#: ../tools/gda-sql.c:2374
+#: ../tools/gda-sql.c:2375
 #, c-format
 msgid "%s [NAME [VALUE|_null_]]"
 msgstr "[NOMBRE [VALOR|_null_]] %s"
 
-#: ../tools/gda-sql.c:2375
+#: ../tools/gda-sql.c:2376
 msgid "Set or show internal parameter, or list all if no parameters"
 msgstr ""
 "Establecer o mostrar el parámetro interno, o una listar todos si no hay "
 "parámetros"
 
-#: ../tools/gda-sql.c:2386
+#: ../tools/gda-sql.c:2387
 #, c-format
 msgid "%s [NAME]"
 msgstr "[NOMBRE] %s"
 
-#: ../tools/gda-sql.c:2387
+#: ../tools/gda-sql.c:2388
 msgid "Unset (delete) internal named parameter (or all parameters)"
 msgstr "Borrar (unset) el parámetro interno (o todos los parámetros)"
 
-#: ../tools/gda-sql.c:2397
+#: ../tools/gda-sql.c:2398
 msgid "Formatting"
 msgstr "Formato"
 
-#: ../tools/gda-sql.c:2399
+#: ../tools/gda-sql.c:2400
 msgid "Set output format"
 msgstr "Establecer el formato de salida"
 
-#: ../tools/gda-sql.c:2423
+#: ../tools/gda-sql.c:2424
 #, c-format
 msgid "%s [NAME|TABLE COLUMN ROW_CONDITION] FILE"
 msgstr "[NOMBRE|CONDICIÃ?N_DE_FILA COLUMNA TABLA] ARCHIVO %s"
 
-#: ../tools/gda-sql.c:2424
+#: ../tools/gda-sql.c:2425
 msgid "Export internal parameter or table's value to the FILE file"
 msgstr ""
 "Exportar el parámetro interno o el valor de la tabla al archivo ARCHIVO"
 
-#: ../tools/gda-sql.c:2435
+#: ../tools/gda-sql.c:2436
 #, c-format
 msgid "%s NAME [FILE|TABLE COLUMN ROW_CONDITION]"
 msgstr "[ARCHIVO|CONDICIÃ?N_DE_FILA COLUMNA TABLA] ARCHIVO %s"
 
-#: ../tools/gda-sql.c:2436
+#: ../tools/gda-sql.c:2437
 msgid ""
 "Set internal parameter as the contents of the FILE file or from an existing "
 "table's value"
@@ -9032,191 +9010,191 @@ msgstr ""
 "Establecer el parámetro interno como el contenido del archivo ARCHIVO o "
 "desde un valor existente de la tabla"
 
-#: ../tools/gda-sql.c:2449
+#: ../tools/gda-sql.c:2450
 msgid "List all available commands"
 msgstr "Lista todos los comandos disponibles"
 
-#: ../tools/gda-sql.c:2514
+#: ../tools/gda-sql.c:2515
 #, c-format
 msgid "Unknown output format: '%s', reset to default"
 msgstr "Formato de salida desconocido: «%s», cambiando a predeterminado"
 
-#: ../tools/gda-sql.c:2659 ../tools/gda-sql.c:2834
+#: ../tools/gda-sql.c:2661 ../tools/gda-sql.c:2839
 msgid "Attribute"
 msgstr "Atributo"
 
-#: ../tools/gda-sql.c:2662
+#: ../tools/gda-sql.c:2664
 #, c-format
 msgid "DSN '%s' description"
 msgstr "Descripción «%s» de DSN"
 
-#: ../tools/gda-sql.c:2690
+#: ../tools/gda-sql.c:2692
 #, c-format
 msgid "Could not find any DSN named '%s'"
 msgstr "No se pudo encontrar ningún DNS llamado «%s»"
 
-#: ../tools/gda-sql.c:2701
+#: ../tools/gda-sql.c:2703
 msgid "DSN list"
 msgstr "Lista DSN"
 
-#: ../tools/gda-sql.c:2753 ../tools/gda-sql.c:4566
+#: ../tools/gda-sql.c:2756 ../tools/gda-sql.c:4575
 msgid "Missing arguments"
 msgstr "Faltan parámetros"
 
-#: ../tools/gda-sql.c:2774
+#: ../tools/gda-sql.c:2777
 msgid "Missing provider name"
 msgstr "Falta el nombre del proveedor"
 
-#: ../tools/gda-sql.c:2797
+#: ../tools/gda-sql.c:2801
 msgid "Missing DSN name"
 msgstr "Falta el nombre de la DSN"
 
-#: ../tools/gda-sql.c:2837
+#: ../tools/gda-sql.c:2842
 #, c-format
 msgid "Provider '%s' description"
 msgstr "Descripción del proveedor «%s»"
 
-#: ../tools/gda-sql.c:2865
+#: ../tools/gda-sql.c:2870
 #, c-format
 msgid "Could not find any provider named '%s'"
 msgstr "No se pudo encontrar ningún proveedor llamado «%s»"
 
-#: ../tools/gda-sql.c:2940 ../tools/gda-sql.c:3229
+#: ../tools/gda-sql.c:2946 ../tools/gda-sql.c:3237
 #, c-format
 msgid "A connection named '%s' already exists"
 msgstr "Ya existe una conexión con el nombre «%s»"
 
-#: ../tools/gda-sql.c:3044
+#: ../tools/gda-sql.c:3050
 #, c-format
 msgid "Getting database schema information, this may take some time... "
 msgstr ""
 "Obteniendo la información de esquema de la base de datos, esto puede llevar "
 "un tiempoâ?¦ "
 
-#: ../tools/gda-sql.c:3079
+#: ../tools/gda-sql.c:3085
 msgid "No opened connection"
 msgstr "No existe ninguna conexión abierta"
 
-#: ../tools/gda-sql.c:3090
+#: ../tools/gda-sql.c:3096
 msgid "DSN or connection string"
 msgstr "DSN o cadena de conexión"
 
-#: ../tools/gda-sql.c:3181
+#: ../tools/gda-sql.c:3188
 msgid "No connection currently opened"
 msgstr "No existe ninguna conexión abierta"
 
-#: ../tools/gda-sql.c:3221
+#: ../tools/gda-sql.c:3229
 msgid "Missing required connection names"
 msgstr "Faltan nombres de conexión requeridos"
 
 #. add existing connections to virtual connection
-#: ../tools/gda-sql.c:3258
+#: ../tools/gda-sql.c:3266
 msgid "Bound connections are as:"
 msgstr "Los rangos de las conexiones son:"
 
-#: ../tools/gda-sql.c:3361
+#: ../tools/gda-sql.c:3370
 #, c-format
 msgid "Could not get home directory: %s"
 msgstr "No se pudo obtener el directorio de inicio: %s"
 
-#: ../tools/gda-sql.c:3387
+#: ../tools/gda-sql.c:3396
 #, c-format
 msgid "Working directory is now: %s"
 msgstr "Ahora el directorio de trabajo es: %s"
 
-#: ../tools/gda-sql.c:3391
+#: ../tools/gda-sql.c:3400
 #, c-format
 msgid "Could not change working directory to '%s': %s"
 msgstr "No se pudo cambiar el directorio de trabajo a «%s»: %s"
 
-#: ../tools/gda-sql.c:3418 ../tools/gda-sql.c:3521 ../tools/gda-sql.c:3564
-#: ../tools/gda-sql.c:3593 ../tools/gda-sql.c:3634 ../tools/gda-sql.c:3685
-#: ../tools/gda-sql.c:3738 ../tools/gda-sql.c:3829 ../tools/gda-sql.c:3901
+#: ../tools/gda-sql.c:3427 ../tools/gda-sql.c:3530 ../tools/gda-sql.c:3573
+#: ../tools/gda-sql.c:3602 ../tools/gda-sql.c:3643 ../tools/gda-sql.c:3694
+#: ../tools/gda-sql.c:3747 ../tools/gda-sql.c:3838 ../tools/gda-sql.c:3910
 msgid "No connection opened"
 msgstr "No existe ninguna conexión abierta"
 
-#: ../tools/gda-sql.c:3436
+#: ../tools/gda-sql.c:3445
 #, c-format
 msgid "Could not write to temporary file '%s': %s"
 msgstr "No se pudo escribir en el archivo temporal «%s»: %s"
 
-#: ../tools/gda-sql.c:3472
+#: ../tools/gda-sql.c:3481
 #, c-format
 msgid "could not start editor '%s'"
 msgstr "no se pudo iniciar el editor «%s»"
 
-#: ../tools/gda-sql.c:3477
+#: ../tools/gda-sql.c:3486
 #, c-format
 msgid "Could not start /bin/sh"
 msgstr "No se pudo iniciar /bin/sh"
 
-#: ../tools/gda-sql.c:3642
+#: ../tools/gda-sql.c:3651
 msgid "Missing FILE to write to"
 msgstr "Falta el ARCHIVO al que escribir"
 
-#: ../tools/gda-sql.c:3694 ../tools/gda-sql.c:3760 ../tools/gda-sql.c:3842
-#: ../tools/gda-sql.c:3914
+#: ../tools/gda-sql.c:3703 ../tools/gda-sql.c:3769 ../tools/gda-sql.c:3851
+#: ../tools/gda-sql.c:3923
 msgid "Can't initialize dictionary to store query buffers"
 msgstr ""
 "No se puede inicializar el diccionario para almacenar los búfers de consulta"
 
-#: ../tools/gda-sql.c:3713
+#: ../tools/gda-sql.c:3722
 msgid "Query buffer name"
 msgstr "Búfer de consulta"
 
-#: ../tools/gda-sql.c:3714
+#: ../tools/gda-sql.c:3723
 msgid "SQL"
 msgstr "SQL"
 
-#: ../tools/gda-sql.c:3751 ../tools/gda-sql.c:3880 ../tools/gda-sql.c:3941
+#: ../tools/gda-sql.c:3760 ../tools/gda-sql.c:3889 ../tools/gda-sql.c:3950
 msgid "Missing query buffer name"
 msgstr "Falta el nombre de la consulta"
 
-#: ../tools/gda-sql.c:3808
+#: ../tools/gda-sql.c:3817
 msgid "Query buffer is empty"
 msgstr "El búfer de consulta está vacío"
 
-#: ../tools/gda-sql.c:3875
+#: ../tools/gda-sql.c:3884
 #, c-format
 msgid "Could not find query buffer named '%s'"
 msgstr "No se pudo encontrar la consulta llamada «%s»"
 
-#: ../tools/gda-sql.c:4005 ../tools/gda-sql.c:4255 ../tools/gda-sql.c:4333
+#: ../tools/gda-sql.c:4014 ../tools/gda-sql.c:4264 ../tools/gda-sql.c:4342
 #, c-format
 msgid "No parameter named '%s' defined"
 msgstr "No se ha definido ningún parametro de nombre «%s»"
 
-#: ../tools/gda-sql.c:4016
+#: ../tools/gda-sql.c:4025
 msgid "List of defined parameters"
 msgstr "Lista de los parámetros definidos"
 
-#: ../tools/gda-sql.c:4072 ../tools/gda-sql.c:4594
+#: ../tools/gda-sql.c:4081 ../tools/gda-sql.c:4603
 msgid "Wrong row condition"
 msgstr "Condición de fila errónea"
 
-#: ../tools/gda-sql.c:4100
+#: ../tools/gda-sql.c:4109
 msgid "No unique row identified"
 msgstr "No se identificó una fila única"
 
-#: ../tools/gda-sql.c:4141 ../tools/gda-sql.c:4233 ../tools/gda-sql.c:4557
+#: ../tools/gda-sql.c:4150 ../tools/gda-sql.c:4242 ../tools/gda-sql.c:4566
 #, c-format
 msgid "Too many arguments"
 msgstr "Demasiados argumentos"
 
-#: ../tools/gda-sql.c:4189 ../tools/gda-sql.c:4261
+#: ../tools/gda-sql.c:4198 ../tools/gda-sql.c:4270
 msgid "Wrong number of arguments"
 msgstr "Número erróneo de argumentos"
 
-#: ../tools/gda-sql.c:4273 ../tools/gda-sql.c:4287
+#: ../tools/gda-sql.c:4282 ../tools/gda-sql.c:4296
 msgid "Could not write file"
 msgstr "No se pudo escribir en el archivo"
 
-#: ../tools/gda-sql.c:4412
+#: ../tools/gda-sql.c:4421
 #, c-format
 msgid "Graph written to '%s'\n"
 msgstr "Gráfica escrita en «%s»\n"
 
-#: ../tools/gda-sql.c:4415
+#: ../tools/gda-sql.c:4424
 #, c-format
 msgid ""
 "Graph written to '%s'\n"
@@ -9231,23 +9209,23 @@ msgstr ""
 "Nota: active las variables de entorno GDA_SQL_VIEWER_PNG o "
 "GDA_SQL_VIEWER_PDF para ver la gráfica\n"
 
-#: ../tools/gda-sql.c:4486
+#: ../tools/gda-sql.c:4495
 msgid "HTTPD server stopped"
 msgstr "Servidor HTTPD parado"
 
-#: ../tools/gda-sql.c:4505
+#: ../tools/gda-sql.c:4514
 msgid "Could not start HTTPD server"
 msgstr "No se pudo iniciar el servidor HTTPD"
 
-#: ../tools/gda-sql.c:4509
+#: ../tools/gda-sql.c:4518
 msgid "HTTPD server started"
 msgstr "Servidor HTTPD iniciado"
 
-#: ../tools/gda-sql.c:4514
+#: ../tools/gda-sql.c:4523
 msgid "Invalid port specification"
 msgstr "Especificación de puertos no válida"
 
-#: ../tools/gda-sql.c:4728
+#: ../tools/gda-sql.c:4737
 #, c-format
 msgid "Command is incomplete"
 msgstr "El comando está incompleto"
@@ -9260,117 +9238,120 @@ msgstr "Generado por la consola GDA SQL"
 msgid "Console"
 msgstr "Consola"
 
-#: ../tools/tools-input.c:322
+#: ../tools/tools-input.c:323
 #, c-format
 msgid "Could not save history file to '%s': %s"
 msgstr "No se pudo guardar el archivo histórico en «%s»: %s"
 
-#: ../tools/web-server.c:566 ../tools/web-server.c:567
+#: ../tools/web-server.c:567 ../tools/web-server.c:568
 msgid "Authentication required"
 msgstr "Se necesita autenticación"
 
-#: ../tools/web-server.c:631
+#: ../tools/web-server.c:632
 msgid "Token:"
 msgstr "Token:"
 
-#: ../tools/web-server.c:772
+#: ../tools/web-server.c:773
 msgid "SQL console:"
 msgstr "Consola SQL:"
 
-#: ../tools/web-server.c:852 ../tools/web-server.c:1872
+#: ../tools/web-server.c:853 ../tools/web-server.c:1874
 msgid "Tables"
 msgstr "Tablas"
 
-#: ../tools/web-server.c:852
+#: ../tools/web-server.c:853
 #, c-format
 msgid "Tables in the '%s' schema"
 msgstr "Tablas en el esquema «%s»"
 
-#: ../tools/web-server.c:858 ../tools/web-server.c:1877
+#: ../tools/web-server.c:859 ../tools/web-server.c:1879
 msgid "Views"
 msgstr "Vistas"
 
-#: ../tools/web-server.c:858
+#: ../tools/web-server.c:859
 #, c-format
 msgid "Views in the '%s' schema"
 msgstr "Vistas en el esquema «%s»"
 
-#: ../tools/web-server.c:917
+#: ../tools/web-server.c:918
 #, c-format
 msgid "Columns for the '%s' table:"
 msgstr "Columnas para la tabla «%s»:"
 
-#: ../tools/web-server.c:963
+#: ../tools/web-server.c:964
 msgid "Primary key:"
 msgstr "Clave primaria:"
 
-#: ../tools/web-server.c:1068
+#: ../tools/web-server.c:1069
 msgid "Relations:"
 msgstr "Relaciones:"
 
-#: ../tools/web-server.c:1085
+#: ../tools/web-server.c:1086
 msgid "Foreign keys:"
 msgstr "Claves externas:"
 
-#: ../tools/web-server.c:1097
+#: ../tools/web-server.c:1098
 #, c-format
 msgid "To '%s':"
 msgstr "Hacia «%s»:"
 
-#: ../tools/web-server.c:1271
+#: ../tools/web-server.c:1273
 msgid "View definition:"
 msgstr "Definición de la vista:"
 
-#: ../tools/web-server.c:1346
+#: ../tools/web-server.c:1348
 #, c-format
 msgid "Trigger '%s' for the '%s.%s' table:"
 msgstr "Disparador «%s» para la tabla «%s.%s»:"
 
-#: ../tools/web-server.c:1366
+#: ../tools/web-server.c:1368
 #, c-format
 msgid "Trigger fired for: %s"
 msgstr "Disparador lanzado para: %s"
 
-#: ../tools/web-server.c:1370
+#: ../tools/web-server.c:1372
 #, c-format
 msgid "Time at which the trigger is fired: %s"
 msgstr "Hora a la que el disparador se lanza: %s"
 
-#: ../tools/web-server.c:1374
+#: ../tools/web-server.c:1376
 msgid "Action:"
 msgstr "Acción:"
 
-#: ../tools/web-server.c:1604
+#: ../tools/web-server.c:1606
 msgid "Triggers:"
 msgstr "Disparadores:"
 
-#: ../tools/web-server.c:1636 ../tools/web-server.c:1730
+#: ../tools/web-server.c:1638 ../tools/web-server.c:1732
 #, c-format
 msgid "For the '%s.%s' table:"
 msgstr "Para la tabla «%s.%s»:"
 
-#: ../tools/web-server.c:1702
+#: ../tools/web-server.c:1704
 #, c-format
 msgid "Triggers in the '%s' schema:"
 msgstr "Disparadores en el esquema «%s»:"
 
-#: ../tools/web-server.c:1856
+#: ../tools/web-server.c:1858
 #, c-format
 msgid "Database information for '%s'"
 msgstr "Información de la base de datos para «%s»"
 
-#: ../tools/web-server.c:1861
+#: ../tools/web-server.c:1863
 msgid "Database information"
 msgstr "Información de la base de datos"
 
-#: ../tools/web-server.c:1870
+#: ../tools/web-server.c:1872
 msgid "Objects"
 msgstr "Objetos"
 
-#: ../tools/web-server.c:1882
+#: ../tools/web-server.c:1884
 msgid "Triggers"
 msgstr "Disparadores"
 
+#~ msgid "Error: no detail"
+#~ msgstr "Error: sin detalles"
+
 #~ msgid "Parameter '%s' does not correspond to a table's column"
 #~ msgstr "El parámetro «%s» no se corresponde con una columna de la tabla"
 
@@ -9442,9 +9423,9 @@ msgstr "Disparadores"
 #~ msgstr "Conectar con otra fuente de datos definidos (DSN, vea \\l)"
 
 #~ msgid ""
-#~ "<small>The XML tree's root node must be a <span foreground=\"#4e9a06"
-#~ "\"><tt>&lt;data&gt;</tt></span>, which is allowed to contain one or more "
-#~ "data source definitions.\n"
+#~ "<small>The XML tree's root node must be a <span foreground="
+#~ "\"#4e9a06\"><tt>&lt;data&gt;</tt></span>, which is allowed to contain one "
+#~ "or more data source definitions.\n"
 #~ "Each data source is defined by <span foreground=\"#4e9a06\"><tt>&lt;"
 #~ "query&gt;</tt></span> or <span foreground=\"#4e9a06\"><tt>&lt;table&gt;</"
 #~ "tt></span> nodes, both accepting the following optional attributes:\n"
@@ -9471,15 +9452,15 @@ msgstr "Disparadores"
 #~ "   the aforementioned table.\n"
 #~ "</small>"
 #~ msgstr ""
-#~ "<small>Los nodos raíces del árbol XML deben ser <span foreground=\"#4e9a06"
-#~ "\"><tt>&lt;data&gt;</tt></span>, que permite contener una o más "
+#~ "<small>Los nodos raíces del árbol XML deben ser <span foreground="
+#~ "\"#4e9a06\"><tt>&lt;data&gt;</tt></span>, que permite contener una o más "
 #~ "definiciones de fuentes de datos.\n"
-#~ "Cada fuente de datos está definida por nodos <span foreground=\"#4e9a06"
-#~ "\"><tt>&lt;query&gt;</tt></span> o <span foreground=\"#4e9a06\"><tt>&lt;"
-#~ "table&gt;</tt></span>, ambos aceptan los siguientes atributos "
-#~ "opcionales:\n"
-#~ " - <span foreground=\"#4e9a06\">«id»</span> para especificar una cadena de "
-#~ "ID de fuente de datos, usado al enlazar fuentes de datos entre ellas;\n"
+#~ "Cada fuente de datos está definida por nodos <span foreground="
+#~ "\"#4e9a06\"><tt>&lt;query&gt;</tt></span> o <span foreground="
+#~ "\"#4e9a06\"><tt>&lt;table&gt;</tt></span>, ambos aceptan los siguientes "
+#~ "atributos opcionales:\n"
+#~ " - <span foreground=\"#4e9a06\">«id»</span> para especificar una cadena "
+#~ "de ID de fuente de datos, usado al enlazar fuentes de datos entre ellas;\n"
 #~ " - <span foreground=\"#4e9a06\">«title»</span> para especificar un "
 #~ "título.\n"
 #~ "\n"
diff --git a/providers/bdb/gda-bdb-provider.c b/providers/bdb/gda-bdb-provider.c
index 42600c3..4db1db1 100644
--- a/providers/bdb/gda-bdb-provider.c
+++ b/providers/bdb/gda-bdb-provider.c
@@ -20,9 +20,6 @@
  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#ifdef USING_MINGW
-#define _NO_OLDNAMES
-#endif
 #include <stdlib.h>
 #include <string.h>
 #include <glib/gi18n-lib.h>
diff --git a/providers/bdb/gda-bdb-test.c b/providers/bdb/gda-bdb-test.c
index 74ec25c..2a2a0aa 100644
--- a/providers/bdb/gda-bdb-test.c
+++ b/providers/bdb/gda-bdb-test.c
@@ -1,6 +1,3 @@
-#ifdef USING_MINGW
-#define _NO_OLDNAMES
-#endif
 #include <libgda/libgda.h>
 #include <sql-parser/gda-sql-parser.h>
 #include <string.h>
diff --git a/providers/firebird/Makefile.am b/providers/firebird/Makefile.am
index eb03d5a..7d56f66 100644
--- a/providers/firebird/Makefile.am
+++ b/providers/firebird/Makefile.am
@@ -12,7 +12,7 @@ AM_CPPFLAGS = \
 
 # parser generation
 parser.c parser.h: parser.y $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD)
-	- $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD) -q -d $(srcdir)/parser.y $(top_srcdir)/libgda/sql-parser/lempar.c
+	- $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD) -q -d -T$(top_srcdir)/libgda/sql-parser/lempar.c $(srcdir)/parser.y
 
 gen_def$(EXEEXT_FOR_BUILD): gen_def.c
 	$(CC_FOR_BUILD) -o gen_def$(EXEEXT_FOR_BUILD) -DIMPOSED_HEADER=\""$(top_srcdir)/libgda/sql-parser/token_types.h"\" $(srcdir)/gen_def.c
diff --git a/providers/firebird/parser.y b/providers/firebird/parser.y
index 6c4ecb3..5569c79 100644
--- a/providers/firebird/parser.y
+++ b/providers/firebird/parser.y
@@ -206,7 +206,7 @@ create_uni_expr (GdaSqlOperatorType op, GdaSqlExpr *expr) {
 
 static GdaSqlStatement *
 compose_multiple_compounds (GdaSqlStatementCompoundType ctype, GdaSqlStatement *left, GdaSqlStatement *right) {
-	GdaSqlStatement *ret;
+	GdaSqlStatement *ret = NULL;
 	GdaSqlStatementCompound *lc = (GdaSqlStatementCompound*) left->contents;
 	if (lc->compound_type == ctype) {
 		GdaSqlStatementCompound *rc = (GdaSqlStatementCompound*) right->contents;
diff --git a/providers/mysql/gda-mysql-recordset.c b/providers/mysql/gda-mysql-recordset.c
index 6fbc04d..6200245 100644
--- a/providers/mysql/gda-mysql-recordset.c
+++ b/providers/mysql/gda-mysql-recordset.c
@@ -296,8 +296,8 @@ gda_mysql_recordset_get_type (void)
 }
 
 static GType
-_gda_mysql_type_to_gda (MysqlConnectionData    *cdata,
-			enum enum_field_types   mysql_type)
+_gda_mysql_type_to_gda (MysqlConnectionData *cdata,
+			enum enum_field_types  mysql_type, unsigned int charsetnr)
 {
 	GType gtype = 0;
 	switch (mysql_type) {
@@ -319,10 +319,6 @@ _gda_mysql_type_to_gda (MysqlConnectionData    *cdata,
 	case MYSQL_TYPE_DOUBLE:
 		gtype = G_TYPE_DOUBLE;
 		break;
-	case MYSQL_TYPE_BIT:
-	case MYSQL_TYPE_BLOB:
-		gtype = GDA_TYPE_BLOB;
-		break;
 	case MYSQL_TYPE_TIMESTAMP:
 	case MYSQL_TYPE_DATETIME:
 		gtype = GDA_TYPE_TIMESTAMP;
@@ -341,8 +337,14 @@ _gda_mysql_type_to_gda (MysqlConnectionData    *cdata,
 	case MYSQL_TYPE_SET:
 	case MYSQL_TYPE_ENUM:
 	case MYSQL_TYPE_GEOMETRY:
+	case MYSQL_TYPE_BIT:
+	case MYSQL_TYPE_BLOB:
 	default:
-		gtype = G_TYPE_STRING;
+		if (charsetnr == 63)
+			gtype = GDA_TYPE_BLOB;
+		else
+			gtype = G_TYPE_STRING;
+		break;
 	}
 
 	/* g_print ("%s: ", __func__); */
@@ -464,7 +466,7 @@ gda_mysql_recordset_new (GdaConnection            *cnc,
 		
 		GType gtype = _GDA_PSTMT(ps)->types[i];
 		if (gtype == 0) {
-			gtype = _gda_mysql_type_to_gda (cdata, field->type);
+			gtype = _gda_mysql_type_to_gda (cdata, field->type, field->charsetnr);
 			_GDA_PSTMT(ps)->types[i] = gtype;
 		}
 		gda_column_set_g_type (column, gtype);
diff --git a/providers/oracle/Makefile.am b/providers/oracle/Makefile.am
index 1c2c925..e6089d0 100644
--- a/providers/oracle/Makefile.am
+++ b/providers/oracle/Makefile.am
@@ -22,7 +22,7 @@ keywords_hash.c: mkkeywordhash$(EXEEXT_FOR_BUILD) $(pkeyword_files)
 
 # parser generation
 parser.c parser.h: parser.y $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD)
-	- $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD) -q -d $(srcdir)/parser.y $(top_srcdir)/libgda/sql-parser/lempar.c
+	- $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD) -q -d -T$(top_srcdir)/libgda/sql-parser/lempar.c $(srcdir)/parser.y
 
 gen_def$(EXEEXT_FOR_BUILD): gen_def.c
 	$(CC_FOR_BUILD) -o gen_def$(EXEEXT_FOR_BUILD) -DIMPOSED_HEADER=\""$(top_builddir)/libgda/sql-parser/token_types.h"\" $(srcdir)/gen_def.c
diff --git a/providers/oracle/parser.y b/providers/oracle/parser.y
index 1df4145..cdd7390 100644
--- a/providers/oracle/parser.y
+++ b/providers/oracle/parser.y
@@ -206,7 +206,7 @@ create_uni_expr (GdaSqlOperatorType op, GdaSqlExpr *expr) {
 
 static GdaSqlStatement *
 compose_multiple_compounds (GdaSqlStatementCompoundType ctype, GdaSqlStatement *left, GdaSqlStatement *right) {
-	GdaSqlStatement *ret;
+	GdaSqlStatement *ret = NULL;
 	GdaSqlStatementCompound *lc = (GdaSqlStatementCompound*) left->contents;
 	if (lc->compound_type == ctype) {
 		GdaSqlStatementCompound *rc = (GdaSqlStatementCompound*) right->contents;
diff --git a/providers/postgres/gda-postgres-recordset.c b/providers/postgres/gda-postgres-recordset.c
index f5f026c..17560be 100644
--- a/providers/postgres/gda-postgres-recordset.c
+++ b/providers/postgres/gda-postgres-recordset.c
@@ -179,7 +179,7 @@ static void
 gda_postgres_recordset_set_property (GObject *object,
 				     guint param_id,
 				     const GValue *value,
-				     G_GNUC_UNUSED GParamSpec *pspec)
+				     GParamSpec *pspec)
 {
         GdaPostgresRecordset *model = (GdaPostgresRecordset *) object;
         if (model->priv) {
@@ -187,8 +187,9 @@ gda_postgres_recordset_set_property (GObject *object,
                 case PROP_CHUNCK_SIZE:
                         model->priv->chunk_size = g_value_get_int (value);
                         break;
-                default:
-                        break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
@@ -197,7 +198,7 @@ static void
 gda_postgres_recordset_get_property (GObject *object,
 				     guint param_id,
 				     GValue *value,
-				     G_GNUC_UNUSED GParamSpec *pspec)
+				     GParamSpec *pspec)
 {
         GdaPostgresRecordset *model = (GdaPostgresRecordset *) object;
         if (model->priv) {
@@ -208,8 +209,9 @@ gda_postgres_recordset_get_property (GObject *object,
                 case PROP_CHUNCKS_READ:
                         g_value_set_int (value, model->priv->chunks_read);
                         break;
-                default:
-                        break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
diff --git a/providers/reuseable/mysql/Makefile.am b/providers/reuseable/mysql/Makefile.am
index b01cc04..acb7c26 100644
--- a/providers/reuseable/mysql/Makefile.am
+++ b/providers/reuseable/mysql/Makefile.am
@@ -20,7 +20,7 @@ keywords_hash.c: mkkeywordhash$(EXEEXT_FOR_BUILD) $(pkeyword_files)
 
 # parser generation
 parser.c parser.h: parser.y $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD)
-	- $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD) -q -d $(srcdir)/parser.y $(top_srcdir)/libgda/sql-parser/lempar.c
+	- $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD) -q -d -T$(top_srcdir)/libgda/sql-parser/lempar.c $(srcdir)/parser.y
 
 gen_def$(EXEEXT_FOR_BUILD): gen_def.c
 	$(CC_FOR_BUILD) -o gen_def$(EXEEXT_FOR_BUILD) -DIMPOSED_HEADER=\""$(top_builddir)/libgda/sql-parser/token_types.h"\" $(srcdir)/gen_def.c
diff --git a/providers/reuseable/mysql/parser.y b/providers/reuseable/mysql/parser.y
index d98c080..fea08ee 100644
--- a/providers/reuseable/mysql/parser.y
+++ b/providers/reuseable/mysql/parser.y
@@ -206,7 +206,7 @@ create_uni_expr (GdaSqlOperatorType op, GdaSqlExpr *expr) {
 
 static GdaSqlStatement *
 compose_multiple_compounds (GdaSqlStatementCompoundType ctype, GdaSqlStatement *left, GdaSqlStatement *right) {
-	GdaSqlStatement *ret;
+	GdaSqlStatement *ret = NULL;
 	GdaSqlStatementCompound *lc = (GdaSqlStatementCompound*) left->contents;
 	if (lc->compound_type == ctype) {
 		GdaSqlStatementCompound *rc = (GdaSqlStatementCompound*) right->contents;
diff --git a/providers/reuseable/postgres/Makefile.am b/providers/reuseable/postgres/Makefile.am
index 84bc775..146a4a3 100644
--- a/providers/reuseable/postgres/Makefile.am
+++ b/providers/reuseable/postgres/Makefile.am
@@ -19,7 +19,7 @@ keywords_hash.c: mkkeywordhash$(EXEEXT_FOR_BUILD) $(pkeyword_files)
 
 # parser generation
 parser.c parser.h: parser.y $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD)
-	- $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD) -q -d $(srcdir)/parser.y $(top_srcdir)/libgda/sql-parser/lempar.c
+	- $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD) -q -d -T$(top_srcdir)/libgda/sql-parser/lempar.c $(srcdir)/parser.y
 
 gen_def$(EXEEXT_FOR_BUILD): gen_def.c
 	$(CC_FOR_BUILD) -o gen_def$(EXEEXT_FOR_BUILD) -DIMPOSED_HEADER=\""$(top_builddir)/libgda/sql-parser/token_types.h"\" $(srcdir)/gen_def.c
diff --git a/providers/reuseable/postgres/parser.y b/providers/reuseable/postgres/parser.y
index 4022c93..81f096e 100644
--- a/providers/reuseable/postgres/parser.y
+++ b/providers/reuseable/postgres/parser.y
@@ -206,7 +206,7 @@ create_uni_expr (GdaSqlOperatorType op, GdaSqlExpr *expr) {
 
 static GdaSqlStatement *
 compose_multiple_compounds (GdaSqlStatementCompoundType ctype, GdaSqlStatement *left, GdaSqlStatement *right) {
-	GdaSqlStatement *ret;
+	GdaSqlStatement *ret = NULL;
 	GdaSqlStatementCompound *lc = (GdaSqlStatementCompound*) left->contents;
 	if (lc->compound_type == ctype) {
 		GdaSqlStatementCompound *rc = (GdaSqlStatementCompound*) right->contents;
diff --git a/providers/skel-implementation/capi/Makefile.am b/providers/skel-implementation/capi/Makefile.am
index 85e9ec8..ed1a0a4 100644
--- a/providers/skel-implementation/capi/Makefile.am
+++ b/providers/skel-implementation/capi/Makefile.am
@@ -23,7 +23,7 @@ keywords_hash.c: mkkeywordhash$(EXEEXT_FOR_BUILD) $(pkeyword_files)
 
 # parser generation
 parser.c parser.h: parser.y $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD)
-	- $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD) -q -d $(srcdir)/parser.y $(top_srcdir)/libgda/sql-parser/lempar.c
+	- $(top_builddir)/libgda/sql-parser/lemon$(EXEEXT_FOR_BUILD) -q -d -T$(top_srcdir)/libgda/sql-parser/lempar.c $(srcdir)/parser.y
 
 gen_def$(EXEEXT_FOR_BUILD): gen_def.c
 	$(CC_FOR_BUILD) -o gen_def$(EXEEXT_FOR_BUILD) -DIMPOSED_HEADER=\""$(top_builddir)/libgda/sql-parser/token_types.h"\" $(srcdir)/gen_def.c
diff --git a/providers/skel-implementation/capi/parser.y b/providers/skel-implementation/capi/parser.y
index 4444ade..744022c 100644
--- a/providers/skel-implementation/capi/parser.y
+++ b/providers/skel-implementation/capi/parser.y
@@ -206,7 +206,7 @@ create_uni_expr (GdaSqlOperatorType op, GdaSqlExpr *expr) {
 
 static GdaSqlStatement *
 compose_multiple_compounds (GdaSqlStatementCompoundType ctype, GdaSqlStatement *left, GdaSqlStatement *right) {
-	GdaSqlStatement *ret;
+	GdaSqlStatement *ret = NULL;
 	GdaSqlStatementCompound *lc = (GdaSqlStatementCompound*) left->contents;
 	if (lc->compound_type == ctype) {
 		GdaSqlStatementCompound *rc = (GdaSqlStatementCompound*) right->contents;
diff --git a/samples/XSLT/transform.c b/samples/XSLT/transform.c
index 9ef7d75..49bf1e0 100644
--- a/samples/XSLT/transform.c
+++ b/samples/XSLT/transform.c
@@ -96,7 +96,7 @@ main (int argc, char *argv[])
 static int
 sqlxslt_process_xslt_file_ext (GdaXsltExCont *sql_ctx, const char *inputFile, 
 			       const char *xslFileName, const char *outputFileName) {
-	int ret;
+	int ret = 0;
 	xmlDocPtr doc,res;
 	xsltStylesheetPtr xsltdoc;
 	xsltTransformContextPtr ctxt;
diff --git a/tests/.gitignore b/tests/.gitignore
index 746b555..a56365c 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -4,3 +4,4 @@ test-sql-identifier
 test-identifiers-quotes
 test-sql-builder
 test-connection-string-split
+test-input-parsers
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 7e16885..d0da988 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,6 +1,6 @@
 noinst_LTLIBRARIES = libgda-test-5.0.la
 TESTS = test-ddl-creator test-bin-converter test-sql-identifier test-identifiers-quotes test-sql-builder test-connection-string-split
-check_PROGRAMS = test-ddl-creator test-bin-converter test-sql-identifier test-identifiers-quotes test-sql-builder test-connection-string-split
+check_PROGRAMS = test-ddl-creator test-bin-converter test-sql-identifier test-identifiers-quotes test-sql-builder test-connection-string-split test-input-parsers
 
 
 SUBDIRS = providers parser value-holders meta-store data-models multi-threading
@@ -75,10 +75,10 @@ test_connection_string_split_LDADD = \
         $(top_builddir)/libgda/libgda-5.0.la \
         $(LIBGDA_LIBS)
 
-test_connection_string_split_SOURCES = \
-        test-connection-string-split.c
+test_input_parsers_SOURCES = \
+        test-input-parsers.c
 
-test_connection_string_split_LDADD = \
+test_input_parsers_LDADD = \
         $(top_builddir)/libgda/libgda-5.0.la \
         $(LIBGDA_LIBS)
 
diff --git a/tests/gda-ddl-creator.c b/tests/gda-ddl-creator.c
index 30d6ba8..26b9094 100644
--- a/tests/gda-ddl-creator.c
+++ b/tests/gda-ddl-creator.c
@@ -267,7 +267,7 @@ static void
 gda_ddl_creator_set_property (GObject *object,
 			      guint param_id,
 			      const GValue *value,
-			      G_GNUC_UNUSED GParamSpec *pspec)
+			      GParamSpec *pspec)
 {
 	GdaDDLCreator *creator;
 	
@@ -312,6 +312,9 @@ gda_ddl_creator_set_property (GObject *object,
 								  FALSE, FALSE);
 			}
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -320,7 +323,7 @@ static void
 gda_ddl_creator_get_property (GObject *object,
 			     guint param_id,
 			     GValue *value,
-			     G_GNUC_UNUSED GParamSpec *pspec)
+			     GParamSpec *pspec)
 {
 	GdaDDLCreator *creator;
 	creator = GDA_DDL_CREATOR (object);
@@ -342,6 +345,9 @@ gda_ddl_creator_get_property (GObject *object,
 			else
 				g_value_set_string (value, NULL);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
diff --git a/tests/meta-store/common.c b/tests/meta-store/common.c
index 1b9ecda..1818bea 100644
--- a/tests/meta-store/common.c
+++ b/tests/meta-store/common.c
@@ -108,7 +108,7 @@ meta_changed_cb (GdaMetaStore *store, GSList *changes, gpointer data)
 	}
 	if (expected_changes) {
 		/* expected more changes */
-		gchar *estr = (gchar *) el->data;
+		gchar *estr = (gchar *) expected_changes->data;
 		g_print ("Received no change but EXPECTED GdaMetaStoreChange: %s", estr);
 		exit (EXIT_FAILURE);
 	}
diff --git a/tests/providers/README b/tests/providers/README
index 2a96dff..e180e71 100644
--- a/tests/providers/README
+++ b/tests/providers/README
@@ -29,22 +29,40 @@ For each provider, the environment variables to set are:
   values in that variable, so it's useless to repeat them there.
 
 - The <provider_name>_USER and <provider_name>_PASS variables (which are optional) respectively 
-  enable a username and a password to be specified
+  enable a username and a password to be specified. The username and password can also be set as part
+  of the <provider_name>_CNC_PARAMS string as "USERNAME=<username>;PASSWORD=<pass>"
 
 If the database was created during the test, then it will also be destroyed at the end of the
 test.
 
+The list of parameter which can be specified to create a database, which depends on the database provider,
+can be obtained using the 'gda-list-server-op' tool, for example for PostgreSQL (removed extra info for
+clarity):
+$ gda-list-server-op -t -o CREATE_DB -p PostgreSQL | grep SERVER_CNX_P/
+|-- [id=/SERVER_CNX_P/USE_SSL] [name=Require SSL] [descr=Whether to require SSL or not when connecting]
+|-- [id=/SERVER_CNX_P/ADM_PASSWORD] [name=Administrator password]
+|-- [id=/SERVER_CNX_P/ADM_LOGIN] [name=Administrator login] [descr=Login name (which has the rights to create databases)]
+|-- [id=/SERVER_CNX_P/OPTIONS] [name=Options] [descr=Extra connection options]
+|-- [id=/SERVER_CNX_P/PORT] [name=Port] [descr=Database server port (for servers running on unix domain sockets, enter the socket's file name extension (usually 5432), or leave this field empty)]
+|-- [id=/SERVER_CNX_P/HOST] [name=Database server] [descr=Host on which the database server is running (for servers running on unix domain sockets, enter the socket's path (usually /tmp), or leave this field empty)]
+
+
+
 EXAMPLES
 --------
 
 Here are some examples of the environment variables for the various providers:
 
-MYSQL_DBCREATE_PARAMS "HOST=localhost"
-POSTGRESQL_DBCREATE_PARAMS "HOST=localhost;PORT=5432"
-SQLITE_DBCREATE_PARAMS "DB_DIR=."
-BERKELEY_DB_CNC_PARAMS "DB_NAME=gda_check_bdb.db"
+export MYSQL_DBCREATE_PARAMS="HOST=localhost"
+
+export POSTGRESQL_DBCREATE_PARAMS="HOST=gdatester;PORT=5432;ADM_LOGIN=gdauser;ADM_PASSWORD=GdaUser"
+export POSTGRESQL_CNC_PARAMS="HOST=gdatester;PORT=5432;USERNAME=gdauser;PASSWORD=GdaUser"
+
+export SQLITE_DBCREATE_PARAMS="DB_DIR=."
+
+export BERKELEY_DB_CNC_PARAMS="DB_NAME=gda_check_bdb.db"
 
 The MDB provider does not allow database creation, so use the gda_check_db.mdb file in this directory
-MSACCESS_CNC_PARAMS "DB_DIR=/home/me/libgda/tests/providers;DB_NAME=gda_check_db"
+export MSACCESS_CNC_PARAMS="DB_DIR=/home/me/libgda/tests/providers;DB_NAME=gda_check_db"
 
-ORACLE_CNC_PARAMS TNSNAME=//127.0.0.1
+export ORACLE_CNC_PARAMS="TNSNAME=//127.0.0.1"
diff --git a/tests/test-cnc-utils.c b/tests/test-cnc-utils.c
index 3e2c6d3..7ef7da7 100644
--- a/tests/test-cnc-utils.c
+++ b/tests/test-cnc-utils.c
@@ -329,7 +329,7 @@ test_cnc_setup_db_contents (G_GNUC_UNUSED GdaConnection *cnc, G_GNUC_UNUSED cons
 gboolean
 test_cnc_load_data_from_file (GdaConnection *cnc, const gchar *table, const gchar *full_file, GError **error)
 {
-	GdaStatement *stmt;
+	GdaStatement *stmt = NULL;
 	GdaSet *params = NULL;
 	GdaDataModel *import;
 	gint nrows, ncols, i;
diff --git a/tests/test-connection-string-split.c b/tests/test-connection-string-split.c
index 0a3ff69..0f3388e 100644
--- a/tests/test-connection-string-split.c
+++ b/tests/test-connection-string-split.c
@@ -1,54 +1,98 @@
 #include <libgda/libgda.h>
 #include <string.h>
+
+typedef struct {
+	gchar *in_string;
+	gchar *exp_provider;
+	gchar *exp_cnc_params;
+	gchar *exp_user;
+	gchar *exp_pass;
+} ATest;
+
+ATest the_tests[] = {
+	{"PostgreSQL://meme:pass DB_NAME=mydb;HOST=server",
+	 "PostgreSQL", "DB_NAME=mydb;HOST=server",
+	 "meme", "pass"},
+	{"PostgreSQL://meme DB_NAME=mydb;HOST=server;PASSWORD=pass",
+	 "PostgreSQL", "DB_NAME=mydb;HOST=server",
+	 "meme", "pass"},
+	{"PostgreSQL://meme DB_NAME=mydb;PASSWORD=pass;HOST=server",
+	 "PostgreSQL", "DB_NAME=mydb;HOST=server",
+	 "meme", "pass"},
+	{"PostgreSQL://meme PASSWORD=pass;DB_NAME=mydb;HOST=server",
+	 "PostgreSQL", "DB_NAME=mydb;HOST=server",
+	 "meme", "pass"},
+	{"PostgreSQL://DB_NAME=mydb;HOST=server;USERNAME=meme;PASSWORD=pass",
+	 "PostgreSQL", "DB_NAME=mydb;HOST=server",
+	 "meme", "pass"},
+	{"PostgreSQL://DB_NAME=mydb;HOST=server;PASSWORD=pass;USERNAME=meme",
+	 "PostgreSQL", "DB_NAME=mydb;HOST=server",
+	 "meme", "pass"},
+	{"PostgreSQL://DB_NAME=mydb;USERNAME=meme;PASSWORD=pass;HOST=server",
+	 "PostgreSQL", "DB_NAME=mydb;HOST=server",
+	 "meme", "pass"},
+	{"PostgreSQL://PASSWORD=pass;USERNAME=meme;DB_NAME=mydb;HOST=server",
+	 "PostgreSQL", "DB_NAME=mydb;HOST=server",
+	 "meme", "pass"},
+	{"PostgreSQL://:pass USERNAME=meme;DB_NAME=mydb;HOST=server",
+	 "PostgreSQL", "DB_NAME=mydb;HOST=server",
+	 "meme", "pass"},
+	{"PostgreSQL://:pass DB_NAME=mydb;HOST=server;USERNAME=meme",
+	 "PostgreSQL", "DB_NAME=mydb;HOST=server",
+	 "meme", "pass"},
+	{"PORT=5432;ADM_LOGIN=gdauser;HOST=gdatester;ADM_PASSWORD=GdaUser;DB_NAME=testcheckdb",
+	 NULL,
+	 "PORT=5432;ADM_LOGIN=gdauser;HOST=gdatester;ADM_PASSWORD=GdaUser;DB_NAME=testcheckdb",
+	 NULL, NULL},
+	{"PORT=5432;ADM_LOGIN=gdauser;HOST=gdatester;ADM_PASSWORD=GdaUser;DB_NAME=testcheckdb;USERNAME=meme;PASSWORD=pass",
+	 NULL,
+	 "PORT=5432;ADM_LOGIN=gdauser;HOST=gdatester;ADM_PASSWORD=GdaUser;DB_NAME=testcheckdb",
+	 "meme", "pass"},
+	{"PORT=5432;ADM_LOGIN=gdauser;HOST=gdatester;USERNAME=meme;PASSWORD=pass;ADM_PASSWORD=GdaUser;DB_NAME=testcheckdb",
+	 NULL,
+	 "PORT=5432;ADM_LOGIN=gdauser;HOST=gdatester;ADM_PASSWORD=GdaUser;DB_NAME=testcheckdb",
+	 "meme", "pass"}
+};
+
 int
 main (int argc, char *argv[])
 {
 	g_type_init();
 	gda_init ();
 
-	gchar *str[] = {
-	"PostgreSQL://meme:pass DB_NAME=mydb;HOST=server",
-	"PostgreSQL://meme DB_NAME=mydb;HOST=server;PASSWORD=pass",
-	"PostgreSQL://meme DB_NAME=mydb;PASSWORD=pass;HOST=server",
-	"PostgreSQL://meme PASSWORD=pass;DB_NAME=mydb;HOST=server",
-	"PostgreSQL://DB_NAME=mydb;HOST=server;USERNAME=meme;PASSWORD=pass",
-	"PostgreSQL://DB_NAME=mydb;HOST=server;PASSWORD=pass;USERNAME=meme",
-        "PostgreSQL://DB_NAME=mydb;USERNAME=meme;PASSWORD=pass;HOST=server",
-        "PostgreSQL://PASSWORD=pass;USERNAME=meme;DB_NAME=mydb;HOST=server",
-        "PostgreSQL://:pass USERNAME=meme;DB_NAME=mydb;HOST=server",
-        "PostgreSQL://:pass DB_NAME=mydb;HOST=server;USERNAME=meme",
-	NULL};
-
 	gint i;
-	for (i = 0; ;i++) {
-		if (!str[i])
-			break;
+	for (i = 0; i < sizeof (the_tests) / sizeof (ATest); i++) {
+		ATest test = the_tests[i];
 		gchar *cnc_params, *prov, *user, *pass;
-		gda_connection_string_split (str[i], &cnc_params, &prov, &user, &pass);
+		gda_connection_string_split (test.in_string, &cnc_params, &prov, &user, &pass);
 		g_print ("[%s]\n  cnc_params=[%s]\n  prov      =[%s]\n  user      =[%s]\n  pass      =[%s]\n",
-			str[i], cnc_params, prov, user, pass);
-		if (strcmp (cnc_params, "DB_NAME=mydb;HOST=server")) {
+			test.in_string, cnc_params, prov, user, pass);
+		if (g_strcmp0 (cnc_params, test.exp_cnc_params)) {
 			g_print ("Wrong cnc_params result\n");
-			return 1;
+			goto onerror;
 		}
-		if (strcmp (prov, "PostgreSQL")) {
+		if (g_strcmp0 (prov, test.exp_provider)) {
 			g_print ("Wrong provider result\n");
-			return 1;
+			goto onerror;
 		}
-		if (strcmp (user, "meme")) {
+		if (g_strcmp0 (user, test.exp_user)) {
 			g_print ("Wrong username result\n");
-			return 1;
+			goto onerror;
 		}
-		if (strcmp (pass, "pass")) {
+		if (g_strcmp0 (pass, test.exp_pass)) {
 			g_print ("Wrong password result\n");
-			return 1;
+			goto onerror;
 		}
 		g_free (cnc_params);
 		g_free (prov);
 		g_free (user);
 		g_free (pass);
+
 	}
 
 	return 0;
+ onerror:
+	g_print ("Error, aborting\n");
+	return 1;
 }
 
diff --git a/tests/test-input-parsers.c b/tests/test-input-parsers.c
new file mode 100644
index 0000000..cd26a5a
--- /dev/null
+++ b/tests/test-input-parsers.c
@@ -0,0 +1,522 @@
+/* 
+ * Copyright (C) 2010 The GNOME Foundation.
+ *
+ * AUTHORS:
+ *      Vivien Malerba <malerba gnome-db org>
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <libgda/libgda.h>
+static gboolean test_parse_iso8601_date (void);
+static gboolean test_parse_iso8601_time (void);
+static gboolean test_parse_iso8601_timestamp (void);
+static gboolean test_date_handler (void);
+static gboolean test_time_handler (void);
+static gboolean test_timestamp_handler (void);
+
+int
+main (int argc, char** argv)
+{
+	gint nfailed = 0;
+
+	if (! test_parse_iso8601_date ())
+		nfailed++;
+	if (! test_parse_iso8601_time ())
+		nfailed++;
+	if (! test_parse_iso8601_timestamp ())
+		nfailed++;
+
+	gda_init ();
+	if (! test_date_handler ())
+		nfailed++;
+	if (! test_time_handler ())
+		nfailed++;
+	if (! test_timestamp_handler ())
+		nfailed++;
+
+	if (nfailed > 0) {
+		g_print ("FAILED: %d tests failed\n", nfailed);
+		return EXIT_FAILURE;
+	}
+	else {
+		g_print ("All tests passed\n");
+		return EXIT_SUCCESS;
+	}
+}
+
+typedef struct {
+	gchar   *in_string;
+	gboolean exp_retval;
+	gint     exp_day;
+	gint     exp_month;
+	gint     exp_year;
+} TestDate;
+
+TestDate datedata[] = {
+	{"1996-11-22", TRUE, 22, 11, 1996},
+	{"1996-22-23", FALSE, 0, 0, 0},
+	{"96-7-23", TRUE, 23, 7, 96},
+	{"2050-12-31", TRUE, 31, 12, 2050},
+	{"2050-11-31", FALSE, 0, 0, 0},
+	{"1996-02-29", TRUE, 29, 2, 1996},
+	{"1997-02-29", FALSE, 0, 0, 0},
+	{"1900-5-22", TRUE, 22, 5, 1900},
+	{"1900.05-22", FALSE, 0, 0, 0},
+	{"1900-05.22", FALSE, 0, 0, 0},
+	{"1900-05-22 ", FALSE, 0, 0, 0},
+	{" 1900-05-22", FALSE, 0, 0, 0},
+	{"1900 -05-22", FALSE, 0, 0, 0},
+	{"1900- 05-22", FALSE, 0, 0, 0},
+	{"1900-05 -22", FALSE, 0, 0, 0},
+	{"1900-05- 22", FALSE, 0, 0, 0},
+	{"65535-05-22", TRUE, 22, 5, 65535},
+	{"1-05-22", TRUE, 22, 5, 1},
+	{"65536-05-22", FALSE, 0, 0, 0},
+};
+
+static gboolean
+test_parse_iso8601_date (void)
+{
+	gint i;
+
+	for (i = 0; i < sizeof (datedata) / sizeof (TestDate); i++) {
+		TestDate td = datedata[i];
+		GDate date;
+		/*g_print ("[%s]\n", td.in_string);*/
+		if (gda_parse_iso8601_date (&date, td.in_string) != td.exp_retval) {
+			g_print ("Wrong result for gda_parse_iso8601_date (\"%s\"): got %s\n",
+				 td.in_string, td.exp_retval ? "FALSE" : "TRUE");
+			return FALSE;
+		}
+		if (td.exp_retval &&
+		    ((g_date_get_day (&date) != td.exp_day) ||
+		     (g_date_get_month (&date) != td.exp_month) ||
+		     (g_date_get_year (&date) != td.exp_year))) {
+			g_print ("Wrong result for gda_parse_iso8601_date (\"%s\"):\n"
+				 "   exp: DD=%d MM=%d YYYY=%d\n"
+				 "   got: DD=%d MM=%d YYYY=%d\n",
+				 td.in_string, td.exp_day, td.exp_month, td.exp_year,
+				 g_date_get_day (&date), g_date_get_month (&date),
+				 g_date_get_year (&date));
+			return FALSE;
+		}
+	}
+	g_print ("All %d iso8601 date parsing tests passed\n", i);
+
+	return TRUE;
+}
+
+typedef struct {
+	gchar   *in_string;
+	gboolean exp_retval;
+	GdaTime  exp_time;
+} TestTime;
+
+TestTime timedata[] = {
+	{"11:22:56", TRUE, {11, 22, 56, 0, GDA_TIMEZONE_INVALID}},
+	{"1:22:56", TRUE, {1, 22, 56, 0, GDA_TIMEZONE_INVALID}},
+	{"1:22:60", FALSE, {1, 22, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"1:60:45", FALSE, {1, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"24:23:45", FALSE, {0, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"23:59:59", TRUE, {23, 59, 59, 0, GDA_TIMEZONE_INVALID}},
+	{"0:0:00", TRUE, {0, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"12:1:0", TRUE, {12, 1, 0, 0, GDA_TIMEZONE_INVALID}},
+	{" 12:00:00", FALSE, {0, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"12 :00:00", FALSE, {12, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"12: 00:00", FALSE, {12, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"12: 00:00", FALSE, {12, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"12:1 :00", FALSE, {12, 1, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"12:1:2 ", FALSE, {12, 1, 2, 0, GDA_TIMEZONE_INVALID}},
+	{"12:1:2.", FALSE, {12, 1, 2, 0, GDA_TIMEZONE_INVALID}},
+	{"12:1:2:", FALSE, {12, 1, 2, 0, GDA_TIMEZONE_INVALID}},
+	{"12:1:2.123", TRUE, {12, 1, 2, 123, GDA_TIMEZONE_INVALID}},
+	{"12:1:2-2", TRUE, {12, 1, 2, 0, -2*60*60}},
+	{"12:1:2+11", TRUE, {12, 1, 2, 0, 11*60*60}},
+	{"12:1:2.1234+11", TRUE, {12, 1, 2, 1234, 11*60*60}},
+	{"12:1:2.12345678-3", TRUE, {12, 1, 2, 12345678, -3*60*60}},
+};
+
+static gboolean
+test_parse_iso8601_time (void)
+{
+	gint i;
+
+	for (i = 0; i < sizeof (timedata) / sizeof (TestTime); i++) {
+		TestTime td = timedata[i];
+		GdaTime time;
+		/*g_print ("[%s]\n", td.in_string);*/
+		if (gda_parse_iso8601_time (&time, td.in_string) != td.exp_retval) {
+			g_print ("Wrong result for gda_parse_iso8601_time (\"%s\"): got %s\n",
+				 td.in_string, td.exp_retval ? "FALSE" : "TRUE");
+			return FALSE;
+		}
+		if ((time.hour != td.exp_time.hour) ||
+		    (time.minute != td.exp_time.minute) ||
+		    (time.second != td.exp_time.second) ||
+		    (time.fraction != td.exp_time.fraction) ||
+		    (time.timezone != td.exp_time.timezone)) {
+			g_print ("Wrong result for gda_parse_iso8601_time (\"%s\"):\n"
+				 "   exp: HH=%d MM=%d SS=%d FF=%ld TZ=%ld\n"
+				 "   got: HH=%d MM=%d SS=%d FF=%ld TZ=%ld\n",
+				 td.in_string, 
+				 td.exp_time.hour, td.exp_time.minute, td.exp_time.second,
+				 td.exp_time.fraction, td.exp_time.timezone,
+				 time.hour, time.minute, time.second,
+				 time.fraction, time.timezone);
+			return FALSE;
+		}
+	}
+	g_print ("All %d iso8601 time parsing tests passed\n", i);
+
+	return TRUE;
+}
+
+static gboolean
+test_parse_iso8601_timestamp (void)
+{
+	gint idate, itime;
+
+	for (idate = 0; idate < sizeof (datedata) / sizeof (TestTime); idate++) {
+		TestDate td = datedata [idate];
+		for (itime = 0; itime < sizeof (timedata) / sizeof (TestTime); itime++) {
+			TestTime tt = timedata[itime];
+			gchar *str;
+			str = g_strdup_printf ("%s %s", td.in_string, tt.in_string);
+
+			GdaTimestamp timestamp;
+			gboolean exp_result = td.exp_retval && tt.exp_retval;
+			/*g_print ("[%s]\n", str);*/
+			if (gda_parse_iso8601_timestamp (&timestamp, str) != exp_result) {
+				g_print ("Wrong result for gda_parse_iso8601_timestamp (\"%s\"): got %s\n",
+					 td.in_string, exp_result ? "FALSE" : "TRUE");
+				return FALSE;
+			}
+
+			if ((td.exp_retval &&
+			     ((timestamp.year != td.exp_year) ||
+			      (timestamp.month != td.exp_month) ||
+			      (timestamp.day != td.exp_day))) &&
+			    (((timestamp.hour != tt.exp_time.hour) ||
+			      (timestamp.minute != tt.exp_time.minute) ||
+			      (timestamp.second != tt.exp_time.second) ||
+			      (timestamp.fraction != tt.exp_time.fraction) ||
+			      (timestamp.timezone != tt.exp_time.timezone)))) {
+				g_print ("Wrong result for gda_parse_iso8601_timestamp (\"%s\"):\n"
+					 "   exp: DD=%d MM=%d YYYY=%d HH=%d MM=%d SS=%d FF=%ld TZ=%ld\n"
+					 "   got: DD=%d MM=%d YYYY=%d HH=%d MM=%d SS=%d FF=%ld TZ=%ld\n",
+					 str, td.exp_day, td.exp_month, td.exp_year,
+					 tt.exp_time.hour, tt.exp_time.minute, tt.exp_time.second, tt.exp_time.fraction, tt.exp_time.timezone,
+					 timestamp.year, timestamp.month, timestamp.day, timestamp.hour, timestamp.minute,
+					 timestamp.second, timestamp.fraction, timestamp.timezone);
+					 
+				g_free (str);
+				return FALSE;
+			}
+			g_free (str);
+		}
+	}
+	g_print ("All %d iso8601 timestamp parsing tests passed\n", idate * itime);
+
+	return TRUE;
+}
+
+
+static gboolean
+test_date_handler (void)
+{
+	GdaDataHandler *dh;
+	gint i;
+	dh = gda_handler_time_new_no_locale ();
+	gda_handler_time_set_str_spec (GDA_HANDLER_TIME (dh),
+				       G_DATE_YEAR, G_DATE_MONTH, G_DATE_DAY, '-', FALSE);
+
+	for (i = 0; i < sizeof (datedata) / sizeof (TestDate); i++) {
+		TestDate td = datedata[i];
+		GValue *value;
+		/*g_print ("[%s]\n", td.in_string);*/
+
+		value = gda_data_handler_get_value_from_str (dh, td.in_string, G_TYPE_DATE);
+		if ((!value && td.exp_retval) ||
+		    (value && !td.exp_retval)) {
+			g_print ("Wrong result for gda_data_handler_get_value_from_str (\"%s\", G_TYPE_DATE): got %s\n",
+				 td.in_string, td.exp_retval ? "FALSE" : "TRUE");
+			g_object_unref (dh);
+			return FALSE;
+		}
+
+		if (! td.exp_retval)
+			continue;
+		GDate *pdate, date;
+		pdate = g_value_get_boxed (value);
+		date = *pdate;
+		gda_value_free (value);
+
+		if ((g_date_get_day (&date) != td.exp_day) ||
+		    (g_date_get_month (&date) != td.exp_month) ||
+		    (g_date_get_year (&date) != td.exp_year)) {
+			g_print ("Wrong result for gda_parse_iso8601_date (\"%s\"):\n"
+				 "   exp: DD=%d MM=%d YYYY=%d\n"
+				 "   got: DD=%d MM=%d YYYY=%d\n",
+				 td.in_string, td.exp_day, td.exp_month, td.exp_year,
+				 g_date_get_day (&date), g_date_get_month (&date),
+				 g_date_get_year (&date));
+			g_object_unref (dh);
+			return FALSE;
+		}
+	}
+	g_print ("All %d GdaDataHandler (G_TYPE_DATE) parsing tests passed\n", i);
+	g_object_unref (dh);
+	return TRUE;
+}
+
+TestTime timedata2[] = {
+	{"112256", TRUE, {11, 22, 56, 0, GDA_TIMEZONE_INVALID}},
+	{"012256", TRUE, {1, 22, 56, 0, GDA_TIMEZONE_INVALID}},
+	{"012260", FALSE, {1, 22, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"016045", FALSE, {1, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"242345", FALSE, {0, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"235959", TRUE, {23, 59, 59, 0, GDA_TIMEZONE_INVALID}},
+	{"000000", TRUE, {0, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"120100", TRUE, {12, 1, 0, 0, GDA_TIMEZONE_INVALID}},
+	{" 120000", FALSE, {0, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"12 0000", FALSE, {12, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"12 0000", FALSE, {12, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"12 0000", FALSE, {12, 0, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"1201 00", FALSE, {12, 1, 0, 0, GDA_TIMEZONE_INVALID}},
+	{"120102 ", FALSE, {12, 1, 2, 0, GDA_TIMEZONE_INVALID}},
+	{"120102.", FALSE, {12, 1, 2, 0, GDA_TIMEZONE_INVALID}},
+	{"120102:", FALSE, {12, 1, 2, 0, GDA_TIMEZONE_INVALID}},
+	{"120102.123", TRUE, {12, 1, 2, 123, GDA_TIMEZONE_INVALID}},
+	{"120102-2", TRUE, {12, 1, 2, 0, -2*60*60}},
+	{"120102+11", TRUE, {12, 1, 2, 0, 11*60*60}},
+	{"120102.1234+11", TRUE, {12, 1, 2, 1234, 11*60*60}},
+	{"120102.12345678-3", TRUE, {12, 1, 2, 12345678, -3*60*60}},
+};
+
+static gboolean
+test_time_handler (void)
+{
+	GdaDataHandler *dh;
+	gint i, j;
+	dh = gda_get_default_handler (GDA_TYPE_TIME);
+	g_assert (dh);
+
+	for (i = 0; i < sizeof (timedata) / sizeof (TestTime); i++) {
+		TestTime td = timedata[i];
+		GValue *value;
+		/*g_print ("[%s]\n", td.in_string);*/
+
+		value = gda_data_handler_get_value_from_str (dh, td.in_string, GDA_TYPE_TIME);
+		if ((!value && td.exp_retval) ||
+		    (value && !td.exp_retval)) {
+			g_print ("Wrong result for gda_data_handler_get_value_from_str (\"%s\", GDA_TYPE_TIME): got %s\n",
+				 td.in_string, td.exp_retval ? "FALSE" : "TRUE");
+			g_object_unref (dh);
+			return FALSE;
+		}
+
+		if (! td.exp_retval)
+			continue;
+		const GdaTime *ptime;
+		GdaTime time;
+		ptime = gda_value_get_time (value);
+		time = *ptime;
+		gda_value_free (value);
+
+		if ((time.hour != td.exp_time.hour) ||
+		    (time.minute != td.exp_time.minute) ||
+		    (time.second != td.exp_time.second) ||
+		    (time.fraction != td.exp_time.fraction) ||
+		    (time.timezone != td.exp_time.timezone)) {
+			g_print ("Wrong result forgda_data_handler_get_value_from_str (\"%s\", GDA_TYPE_TIME):\n"
+				 "   exp: HH=%d MM=%d SS=%d FF=%ld TZ=%ld\n"
+				 "   got: HH=%d MM=%d SS=%d FF=%ld TZ=%ld\n",
+				 td.in_string, 
+				 td.exp_time.hour, td.exp_time.minute, td.exp_time.second,
+				 td.exp_time.fraction, td.exp_time.timezone,
+				 time.hour, time.minute, time.second,
+				 time.fraction, time.timezone);
+			return FALSE;
+		}
+	}
+
+	for (j = 0; j < sizeof (timedata2) / sizeof (TestTime); j++) {
+		TestTime td = timedata2[j];
+		GValue *value;
+		/*g_print ("[%s]\n", td.in_string);*/
+
+		value = gda_data_handler_get_value_from_str (dh, td.in_string, GDA_TYPE_TIME);
+		if ((!value && td.exp_retval) ||
+		    (value && !td.exp_retval)) {
+			g_print ("Wrong result for gda_data_handler_get_value_from_str (\"%s\", GDA_TYPE_TIME): got %s\n",
+				 td.in_string, td.exp_retval ? "FALSE" : "TRUE");
+			g_object_unref (dh);
+			return FALSE;
+		}
+
+		if (! td.exp_retval)
+			continue;
+		const GdaTime *ptime;
+		GdaTime time;
+		ptime = gda_value_get_time (value);
+		time = *ptime;
+		gda_value_free (value);
+
+		if ((time.hour != td.exp_time.hour) ||
+		    (time.minute != td.exp_time.minute) ||
+		    (time.second != td.exp_time.second) ||
+		    (time.fraction != td.exp_time.fraction) ||
+		    (time.timezone != td.exp_time.timezone)) {
+			g_print ("Wrong result forgda_data_handler_get_value_from_str (\"%s\", GDA_TYPE_TIME):\n"
+				 "   exp: HH=%d MM=%d SS=%d FF=%ld TZ=%ld\n"
+				 "   got: HH=%d MM=%d SS=%d FF=%ld TZ=%ld\n",
+				 td.in_string, 
+				 td.exp_time.hour, td.exp_time.minute, td.exp_time.second,
+				 td.exp_time.fraction, td.exp_time.timezone,
+				 time.hour, time.minute, time.second,
+				 time.fraction, time.timezone);
+			return FALSE;
+		}
+	}
+
+	g_print ("All %d GdaDataHandler (GDA_TYPE_TIME) parsing tests passed\n", i + j);
+	g_object_unref (dh);
+	return TRUE;
+}
+
+static gboolean
+test_timestamp_handler (void)
+{
+	GdaDataHandler *dh;
+	gint idate, itime, itime2;
+	dh = gda_handler_time_new_no_locale ();
+	gda_handler_time_set_str_spec (GDA_HANDLER_TIME (dh),
+				       G_DATE_YEAR, G_DATE_MONTH, G_DATE_DAY, '-', FALSE);
+
+	for (idate = 0; idate < sizeof (datedata) / sizeof (TestTime); idate++) {
+		TestDate td = datedata [idate];
+		for (itime = 0; itime < sizeof (timedata) / sizeof (TestTime); itime++) {
+			TestTime tt = timedata[itime];
+			gchar *str;
+			str = g_strdup_printf ("%s %s", td.in_string, tt.in_string);
+
+			GValue *value;
+			gboolean exp_result = td.exp_retval && tt.exp_retval;
+			/*g_print ("[%s]\n", str);*/
+
+			value = gda_data_handler_get_value_from_str (dh, str, GDA_TYPE_TIMESTAMP);
+			if ((!value && exp_result) ||
+			    (value && !exp_result)) {
+				g_print ("Wrong result for gda_data_handler_get_value_from_str (\"%s\", GDA_TYPE_TIMESTAMP): got %s\n",
+					 str, exp_result ? "FALSE" : "TRUE");
+				g_object_unref (dh);
+				return FALSE;
+			}
+
+			if (! exp_result) {
+				g_free (str);
+				continue;
+			}
+			const GdaTimestamp *ptimestamp;
+			GdaTimestamp timestamp;
+			ptimestamp = gda_value_get_timestamp (value);
+			timestamp = *ptimestamp;
+			gda_value_free (value);
+			
+			if ((td.exp_retval &&
+			     ((timestamp.year != td.exp_year) ||
+			      (timestamp.month != td.exp_month) ||
+			      (timestamp.day != td.exp_day))) &&
+			    ((tt.exp_retval) &&
+			     ((timestamp.hour != tt.exp_time.hour) ||
+			      (timestamp.minute != tt.exp_time.minute) ||
+			      (timestamp.second != tt.exp_time.second) ||
+			      (timestamp.fraction != tt.exp_time.fraction) ||
+			      (timestamp.timezone != tt.exp_time.timezone)))) {
+				g_print ("Wrong result for gda_data_handler_get_value_from_str (\"%s\", GDA_TYPE_TIMESTAMP):\n"
+					 "   exp: DD=%d MM=%d YYYY=%d HH=%d MM=%d SS=%d FF=%ld TZ=%ld\\n"
+					 "   got: DD=%d MM=%d YYYY=%d HH=%d MM=%d SS=%d FF=%ld TZ=%ld\\n",
+					 str, td.exp_day, td.exp_month, td.exp_year,
+					 tt.exp_time.hour, tt.exp_time.minute, tt.exp_time.second, tt.exp_time.fraction, tt.exp_time.timezone,
+					 timestamp.year, timestamp.month, timestamp.day, timestamp.hour, timestamp.minute,
+					 timestamp.second, timestamp.fraction, timestamp.timezone);
+					 
+				g_object_unref (dh);
+				g_free (str);
+				return FALSE;
+			}
+			g_free (str);
+		}
+	}
+
+	for (idate = 0; idate < sizeof (datedata) / sizeof (TestTime); idate++) {
+		TestDate td = datedata [idate];
+		for (itime2 = 0; itime2 < sizeof (timedata2) / sizeof (TestTime); itime2++) {
+			TestTime tt = timedata2[itime2];
+			gchar *str;
+			str = g_strdup_printf ("%s %s", td.in_string, tt.in_string);
+
+			GValue *value;
+			gboolean exp_result = td.exp_retval && tt.exp_retval;
+			/*g_print ("[%s]\n", str);*/
+
+			value = gda_data_handler_get_value_from_str (dh, str, GDA_TYPE_TIMESTAMP);
+			if ((!value && exp_result) ||
+			    (value && !exp_result)) {
+				g_print ("Wrong result for gda_data_handler_get_value_from_str (\"%s\", GDA_TYPE_TIMESTAMP): got %s\n",
+					 str, exp_result ? "FALSE" : "TRUE");
+				g_object_unref (dh);
+				return FALSE;
+			}
+
+			if (! exp_result) {
+				g_free (str);
+				continue;
+			}
+			const GdaTimestamp *ptimestamp;
+			GdaTimestamp timestamp;
+			ptimestamp = gda_value_get_timestamp (value);
+			timestamp = *ptimestamp;
+			gda_value_free (value);
+			
+			if ((timestamp.year != td.exp_year) ||
+			    (timestamp.month != td.exp_month) ||
+			    (timestamp.day != td.exp_day) ||
+			    (timestamp.hour != tt.exp_time.hour) ||
+			    (timestamp.minute != tt.exp_time.minute) ||
+			    (timestamp.second != tt.exp_time.second) ||
+			    (timestamp.fraction != tt.exp_time.fraction) ||
+			    (timestamp.timezone != tt.exp_time.timezone)) {
+				g_print ("Wrong result for gda_data_handler_get_value_from_str (\"%s\", GDA_TYPE_TIMESTAMP):\n"
+					 "   exp: DD=%d MM=%d YYYY=%d HH=%d MM=%d SS=%d FF=%ld TZ=%ld\\n"
+					 "   got: DD=%d MM=%d YYYY=%d HH=%d MM=%d SS=%d FF=%ld TZ=%ld\\n",
+					 str, td.exp_day, td.exp_month, td.exp_year,
+					 tt.exp_time.hour, tt.exp_time.minute, tt.exp_time.second, tt.exp_time.fraction, tt.exp_time.timezone,
+					 timestamp.year, timestamp.month, timestamp.day, timestamp.hour, timestamp.minute,
+					 timestamp.second, timestamp.fraction, timestamp.timezone);
+					 
+				g_object_unref (dh);
+				g_free (str);
+				return FALSE;
+			}
+			g_free (str);
+		}
+	}
+	
+	g_print ("All %d GdaDataHandler (GDA_TYPE_TIMESTAMP) parsing tests passed\n", idate * (itime + itime2));
+	g_object_unref (dh);
+	return TRUE;
+}
diff --git a/tools/Makefile.am b/tools/Makefile.am
index ac4ea57..17da585 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -67,7 +67,9 @@ gda-sql-res.o: gda-sql-res.rc
 	$(WINDRES) $^ -o $@
 
 gda_list_server_op_5_0_SOURCES = \
-        gda-list-server-op.c
+        gda-list-server-op.c \
+	gda-tree-mgr-xml.c \
+	gda-tree-mgr-xml.h
 
 gda_list_server_op_5_0_LDADD = \
         $(top_builddir)/libgda/libgda-5.0.la \
diff --git a/tools/browser/auth-dialog.c b/tools/browser/auth-dialog.c
index 828362c..b3f536e 100644
--- a/tools/browser/auth-dialog.c
+++ b/tools/browser/auth-dialog.c
@@ -136,7 +136,7 @@ auth_contents_changed_cb (GdauiAuth *auth, gboolean is_valid, AuthDialog *dialog
 static void
 update_ad_auth (AuthData *ad)
 {
-	if (ad->cncinfo.auth_string) {
+	if (ad->auth_widget && ad->cncinfo.auth_string) {
 		/* split array in a list of named parameters, and for each parameter value, 
 		 * set the correcponding parameter in @dset */
 		GdaSet *dset;
diff --git a/tools/browser/browser-connection.c b/tools/browser/browser-connection.c
index 6bdb554..498c918 100644
--- a/tools/browser/browser-connection.c
+++ b/tools/browser/browser-connection.c
@@ -364,7 +364,7 @@ static void
 browser_connection_set_property (GObject *object,
 				 guint param_id,
 				 const GValue *value,
-				 G_GNUC_UNUSED GParamSpec *pspec)
+				 GParamSpec *pspec)
 {
         BrowserConnection *bcnc;
 
@@ -452,6 +452,9 @@ browser_connection_set_property (GObject *object,
 								(GdaThreadWrapperCallback) meta_changed_cb,
 								bcnc);
                         break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
@@ -462,7 +465,7 @@ static void
 browser_connection_get_property (GObject *object,
 				 guint param_id,
 				 GValue *value,
-				 G_GNUC_UNUSED GParamSpec *pspec)
+				 GParamSpec *pspec)
 {
         BrowserConnection *bcnc;
 
@@ -472,6 +475,9 @@ browser_connection_get_property (GObject *object,
                 case PROP_GDA_CNC:
                         g_value_set_object (value, bcnc->priv->cnc);
                         break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
@@ -1639,7 +1645,7 @@ browser_connection_get_table_column_attribute  (BrowserConnection *bcnc,
 	GdaSqlBuilder *builder;
 	GdaSet *params;
 	GdaSqlBuilderId op_ids[4];
-	GdaDataModel *model;
+	GdaDataModel *model = NULL;
 	const GValue *cvalue;
 	GdaMetaDbObject *dbo = (GdaMetaDbObject *) table;
 
diff --git a/tools/browser/browser-virtual-connection.c b/tools/browser/browser-virtual-connection.c
index 8236df8..23abf59 100644
--- a/tools/browser/browser-virtual-connection.c
+++ b/tools/browser/browser-virtual-connection.c
@@ -183,7 +183,7 @@ static void
 browser_virtual_connection_set_property (GObject *object,
 					 guint param_id,
 					 const GValue *value,
-					 G_GNUC_UNUSED GParamSpec *pspec)
+					 GParamSpec *pspec)
 {
         BrowserVirtualConnection *bcnc;
 
@@ -205,6 +205,9 @@ browser_virtual_connection_set_property (GObject *object,
 			}
 
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -213,7 +216,7 @@ static void
 browser_virtual_connection_get_property (GObject *object,
 					 guint param_id,
 					 GValue *value,
-					 G_GNUC_UNUSED GParamSpec *pspec)
+					 GParamSpec *pspec)
 {
         BrowserVirtualConnection *bcnc;
 
@@ -223,6 +226,9 @@ browser_virtual_connection_get_property (GObject *object,
                 case PROP_SPECS:
 			g_value_set_pointer (value, bcnc->priv->specs);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
diff --git a/tools/browser/browser-window.c b/tools/browser/browser-window.c
index 884933c..0562256 100644
--- a/tools/browser/browser-window.c
+++ b/tools/browser/browser-window.c
@@ -997,7 +997,7 @@ window_fullscreen_cb (GtkToggleAction *action, BrowserWindow *bwin)
 		gtk_window_fullscreen (GTK_WINDOW (bwin));
 		browser_window_show_notice_printf (bwin, GTK_MESSAGE_INFO,
 						   "fullscreen-esc",
-						   _("Hit the Escape key to leave the fullscreen mode"));
+						   "%s", _("Hit the Escape key to leave the fullscreen mode"));
 		gtk_widget_hide (bwin->priv->toolbar);
 		gtk_widget_hide (bwin->priv->menubar);
 		bwin->priv->toolbar_shown = FALSE;
diff --git a/tools/browser/canvas/browser-canvas-column.c b/tools/browser/canvas/browser-canvas-column.c
index c479205..ac8089a 100644
--- a/tools/browser/canvas/browser-canvas-column.c
+++ b/tools/browser/canvas/browser-canvas-column.c
@@ -144,7 +144,7 @@ static void
 browser_canvas_column_set_property (GObject *object,
 				    guint param_id,
 				    const GValue *value,
-				    G_GNUC_UNUSED GParamSpec *pspec)
+				    GParamSpec *pspec)
 {
 	BrowserCanvasColumn *cf = NULL;
 	GdaMetaTableColumn* column = NULL;
@@ -181,6 +181,9 @@ browser_canvas_column_set_property (GObject *object,
 			g_object_set (object, "tip-text", NULL, NULL);
 		g_string_free (string, TRUE);
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
@@ -188,7 +191,7 @@ static void
 browser_canvas_column_get_property (GObject *object,
 				    guint param_id,
 				    GValue *value,
-				    G_GNUC_UNUSED GParamSpec *pspec)
+				    GParamSpec *pspec)
 {
 	BrowserCanvasColumn *cf;
 
@@ -201,6 +204,9 @@ browser_canvas_column_get_property (GObject *object,
 	case PROP_COLUMN:
 		g_value_set_pointer (value, cf->priv->column);
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
diff --git a/tools/browser/canvas/browser-canvas-db-relations.c b/tools/browser/canvas/browser-canvas-db-relations.c
index 20d708f..e06ab20 100644
--- a/tools/browser/canvas/browser-canvas-db-relations.c
+++ b/tools/browser/canvas/browser-canvas-db-relations.c
@@ -28,7 +28,7 @@
 #include "browser-canvas-column.h"
 #include "browser-canvas-fkey.h"
 #include "../common/objects-cloud.h"
-#include "../common/popup-container.h"
+#include <libgda-ui/internal/popup-container.h>
 
 static void browser_canvas_db_relations_class_init (BrowserCanvasDbRelationsClass *class);
 static void browser_canvas_db_relations_init       (BrowserCanvasDbRelations *canvas);
@@ -156,7 +156,7 @@ static void
 browser_canvas_db_relations_set_property (GObject *object,
 					  guint param_id,
 					  const GValue *value,
-					  G_GNUC_UNUSED GParamSpec *pspec)
+					  GParamSpec *pspec)
 {
 	BrowserCanvasDbRelations *canvas;
 
@@ -178,6 +178,9 @@ browser_canvas_db_relations_set_property (GObject *object,
 				objects_cloud_set_meta_struct (canvas->priv->cloud, canvas->priv->mstruct);
 			break;
 		}
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
@@ -186,7 +189,7 @@ static void
 browser_canvas_db_relations_get_property (GObject *object,
 					  guint param_id,
 					  GValue *value,
-					  G_GNUC_UNUSED GParamSpec *pspec)
+					  GParamSpec *pspec)
 {
 	BrowserCanvasDbRelations *canvas;
 
@@ -196,6 +199,9 @@ browser_canvas_db_relations_get_property (GObject *object,
 		case PROP_META_STRUCT:
 			g_value_set_object (value, canvas->priv->mstruct);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 		}
 	}
 }
diff --git a/tools/browser/canvas/browser-canvas-fkey.c b/tools/browser/canvas/browser-canvas-fkey.c
index cd3621f..ec64890 100644
--- a/tools/browser/canvas/browser-canvas-fkey.c
+++ b/tools/browser/canvas/browser-canvas-fkey.c
@@ -199,7 +199,7 @@ static void
 browser_canvas_fkey_set_property (GObject *object,
 				  guint param_id,
 				  const GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
 	BrowserCanvasFkey *cc;
 
@@ -216,6 +216,9 @@ browser_canvas_fkey_set_property (GObject *object,
 			create_items (cc);
 		}
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
@@ -223,7 +226,7 @@ static void
 browser_canvas_fkey_get_property (GObject *object,
 				  guint param_id,
 				  GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
 	BrowserCanvasFkey *cc;
 
@@ -234,7 +237,7 @@ browser_canvas_fkey_get_property (GObject *object,
 		g_value_set_object (value, cc->priv->mstruct);
 		break;
 	default:
-		g_warning ("No such property!");
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 		break;
 	}
 }
diff --git a/tools/browser/canvas/browser-canvas-item.c b/tools/browser/canvas/browser-canvas-item.c
index 9152931..04d0cb6 100644
--- a/tools/browser/canvas/browser-canvas-item.c
+++ b/tools/browser/canvas/browser-canvas-item.c
@@ -194,7 +194,7 @@ static void
 browser_canvas_item_set_property (GObject *object,
 				  guint param_id,
 				  const GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
 	BrowserCanvasItem *citem = NULL;
 	const gchar *str = NULL;
@@ -217,6 +217,9 @@ browser_canvas_item_set_property (GObject *object,
 		if (str)
 			citem->priv->tooltip_text = g_strdup (str);
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
diff --git a/tools/browser/canvas/browser-canvas-table.c b/tools/browser/canvas/browser-canvas-table.c
index 633d18c..d3de2ee 100644
--- a/tools/browser/canvas/browser-canvas-table.c
+++ b/tools/browser/canvas/browser-canvas-table.c
@@ -200,7 +200,7 @@ static void
 browser_canvas_table_set_property (GObject *object,
 				   guint param_id,
 				   const GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
 	BrowserCanvasTable *ce = NULL;
 
@@ -230,6 +230,9 @@ browser_canvas_table_set_property (GObject *object,
 	case PROP_MENU_FUNC:
 		ce->priv->popup_menu_func = (GtkWidget *(*) (BrowserCanvasTable *ce)) g_value_get_pointer (value);
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
@@ -237,7 +240,7 @@ static void
 browser_canvas_table_get_property (GObject *object,
 				   guint param_id,
 				   GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
 	BrowserCanvasTable *ce = NULL;
 
@@ -250,6 +253,9 @@ browser_canvas_table_get_property (GObject *object,
 	case PROP_TABLE:
 		g_value_set_pointer (value, ce->priv->table);
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
diff --git a/tools/browser/canvas/browser-canvas-text.c b/tools/browser/canvas/browser-canvas-text.c
index de14714..a44a783 100644
--- a/tools/browser/canvas/browser-canvas-text.c
+++ b/tools/browser/canvas/browser-canvas-text.c
@@ -226,7 +226,7 @@ static void
 browser_canvas_text_set_property (GObject *object,
 				  guint param_id,
 				  const GValue *value,
-				  G_GNUC_UNUSED GParamSpec *pspec)
+				  GParamSpec *pspec)
 {
 	BrowserCanvasText *ct = NULL;
 	const gchar *cstr = NULL;
@@ -291,6 +291,9 @@ browser_canvas_text_set_property (GObject *object,
 		ct->priv->bold = bool;
 		adjust_text_pango_attributes (ct);
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
@@ -298,7 +301,7 @@ static void
 browser_canvas_text_get_property    (GObject *object,
 				    guint param_id,
 				    G_GNUC_UNUSED GValue *value,
-				    G_GNUC_UNUSED GParamSpec *pspec)
+				    GParamSpec *pspec)
 {
 	BrowserCanvasText *ct;
 
@@ -306,7 +309,7 @@ browser_canvas_text_get_property    (GObject *object,
 
 	switch (param_id) {
 	default:
-		g_warning ("No such property!");
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 		break;
 	}
 }
diff --git a/tools/browser/canvas/browser-canvas.c b/tools/browser/canvas/browser-canvas.c
index 418a636..e5ea730 100644
--- a/tools/browser/canvas/browser-canvas.c
+++ b/tools/browser/canvas/browser-canvas.c
@@ -674,13 +674,16 @@ static void
 browser_canvas_set_property (GObject *object,
 			   guint param_id,
 			   G_GNUC_UNUSED const GValue *value,
-			   G_GNUC_UNUSED GParamSpec *pspec)
+			   GParamSpec *pspec)
 {
 	BrowserCanvas *canvas;
 	
 	canvas = BROWSER_CANVAS (object);
 
 	switch (param_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
@@ -688,13 +691,16 @@ static void
 browser_canvas_get_property (GObject *object,
 			   guint param_id,
 			   G_GNUC_UNUSED GValue *value,
-			   G_GNUC_UNUSED GParamSpec *pspec)
+			   GParamSpec *pspec)
 {
 	BrowserCanvas *canvas;
 	
 	canvas = BROWSER_CANVAS (object);
 
 	switch (param_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
diff --git a/tools/browser/common/Makefile.am b/tools/browser/common/Makefile.am
index c9f4f6e..f65d9a4 100644
--- a/tools/browser/common/Makefile.am
+++ b/tools/browser/common/Makefile.am
@@ -4,7 +4,6 @@ AM_CPPFLAGS = \
 	-I$(top_builddir) \
 	-I$(top_srcdir) \
 	-I$(top_srcdir)/libgda \
-	-DPRIV_OBJ_PREFIX="\"BROWSER\"" \
 	$(LIBGDA_CFLAGS) \
 	$(GTK_CFLAGS) \
 	$(MAC_INTEGRATION_CFLAGS)
@@ -19,8 +18,6 @@ libcommon_la_SOURCES = \
 	marshal.h \
 	objects-cloud.c \
 	objects-cloud.h \
-	popup-container.c \
-	popup-container.h \
 	gdaui-data-import.c \
 	gdaui-data-import.h \
 	gdaui-entry-import.c \
diff --git a/tools/browser/common/objects-cloud.c b/tools/browser/common/objects-cloud.c
index 6827838..11201a9 100644
--- a/tools/browser/common/objects-cloud.c
+++ b/tools/browser/common/objects-cloud.c
@@ -31,7 +31,7 @@
 #include "../cc-gray-bar.h"
 #include "marshal.h"
 #include <gdk/gdkkeysyms.h>
-#include "popup-container.h"
+#include <libgda-ui/internal/popup-container.h>
 
 struct _ObjectsCloudPrivate {
 	gboolean             show_schemas;
diff --git a/tools/browser/data-manager/data-console.c b/tools/browser/data-manager/data-console.c
index 5678309..826a914 100644
--- a/tools/browser/data-manager/data-console.c
+++ b/tools/browser/data-manager/data-console.c
@@ -33,7 +33,7 @@
 #include "../browser-page.h"
 #include "../browser-perspective.h"
 #include "../browser-stock-icons.h"
-#include "../common/popup-container.h"
+#include <libgda-ui/internal/popup-container.h>
 #include <libgda/sql-parser/gda-sql-parser.h>
 #include <libgda-ui/libgda-ui.h>
 #include "data-source-manager.h"
@@ -891,7 +891,7 @@ compose_mode_toggled_cb (G_GNUC_UNUSED GtkToggleAction *action, DataConsole *dco
 		browser_window_show_notice_printf (BROWSER_WINDOW (gtk_widget_get_toplevel ((GtkWidget*) dconsole)),
 						   GTK_MESSAGE_INFO,
 						   "data-manager-exec-mode-switched",
-						   _("Switching to execution mode. Hit the Escape key "
+						   "%s", _("Switching to execution mode. Hit the Escape key "
 						     "to return to the compose mode"));
 	gtk_notebook_set_current_page (GTK_NOTEBOOK (dconsole->priv->main_notebook), pagenb);
 }
diff --git a/tools/browser/data-manager/data-favorite-selector.c b/tools/browser/data-manager/data-favorite-selector.c
index 229eab4..1b0b6fc 100644
--- a/tools/browser/data-manager/data-favorite-selector.c
+++ b/tools/browser/data-manager/data-favorite-selector.c
@@ -33,7 +33,7 @@
 #include "../cc-gray-bar.h"
 #include "../browser-favorites.h"
 #include <gdk/gdkkeysyms.h>
-#include "../common/popup-container.h"
+#include <libgda-ui/internal/popup-container.h>
 
 #ifdef HAVE_GTKSOURCEVIEW
   #ifdef GTK_DISABLE_SINGLE_INCLUDES
diff --git a/tools/browser/data-manager/data-widget.c b/tools/browser/data-manager/data-widget.c
index d9620cb..64183c0 100644
--- a/tools/browser/data-manager/data-widget.c
+++ b/tools/browser/data-manager/data-widget.c
@@ -60,6 +60,7 @@ typedef struct {
 
 static DataPart *data_part_find (DataWidget *dwid, DataSource *source);
 static void data_part_free (DataPart *part, GSList *all_parts);
+static void data_part_show_error (DataPart *part, GError *error);
 
 struct _DataWidgetPrivate {
 	DataSourceManager *mgr;
@@ -73,7 +74,7 @@ struct _DataWidgetPrivate {
 static void data_widget_class_init (DataWidgetClass *klass);
 static void data_widget_init       (DataWidget *dwid, DataWidgetClass *klass);
 static void data_widget_dispose    (GObject *object);
-static void compute_sources_dependencies (DataPart *part);
+static gboolean compute_sources_dependencies (DataPart *part, GError **error);
 static void mgr_list_changed_cb (DataSourceManager *mgr, DataWidget *dwid);
 
 static GObjectClass *parent_class = NULL;
@@ -629,8 +630,12 @@ update_layout (DataWidget *dwid)
 			g_object_unref ((GObject*) part->top);
 			newparts_list = g_slist_prepend (newparts_list, part);
 			if (!reused) {
-				compute_sources_dependencies (part);
-				data_source_execute (source, NULL);
+				if (compute_sources_dependencies (part, &lerror))
+					data_source_execute (source, NULL);
+				else {
+					data_part_show_error (part, lerror);
+					g_clear_error (&lerror);
+				}
 			}
 		}
 		else {
@@ -649,8 +654,12 @@ update_layout (DataWidget *dwid)
 				g_object_unref ((GObject*) part->top);
 				newparts_list = g_slist_prepend (newparts_list, part);
 				if (!reused) {
-					compute_sources_dependencies (part);
-					data_source_execute (source, NULL);
+					if (compute_sources_dependencies (part, &lerror))
+						data_source_execute (source, NULL);
+					else {
+						data_part_show_error (part, lerror);
+						g_clear_error (&lerror);
+					}
 				}
 			}
 			g_slist_free (paned_list);
@@ -676,8 +685,12 @@ update_layout (DataWidget *dwid)
 				g_object_unref ((GObject*) part->top);
 				newparts_list = g_slist_prepend (newparts_list, part);
 				if (!reused) {
-					compute_sources_dependencies (part);
-					data_source_execute (source, NULL);
+					if (compute_sources_dependencies (part, &lerror))
+						data_source_execute (source, NULL);
+					else {
+						data_part_show_error (part, lerror);
+						g_clear_error (&lerror);
+					}
 				}
 			}
 			else {
@@ -695,8 +708,12 @@ update_layout (DataWidget *dwid)
 					g_object_unref ((GObject*) part->top);
 					newparts_list = g_slist_prepend (newparts_list, part);
 					if (!reused) {
-						compute_sources_dependencies (part);
-						data_source_execute (source, NULL);
+						if (compute_sources_dependencies (part, &lerror))
+							data_source_execute (source, NULL);
+						else {
+							data_part_show_error (part, lerror);
+							g_clear_error (&lerror);
+						}
 					}
 				}
 				g_slist_free (paned_list);
@@ -807,6 +824,25 @@ data_part_find (DataWidget *dwid, DataSource *source)
 	return NULL;
 }
 
+static void
+data_part_show_error (DataPart *part, GError *error)
+{
+	gchar *tmp;
+	g_assert (part);
+	tmp = g_markup_printf_escaped ("\n<b>Error:\n</b>%s",
+				       error && error->message ? error->message : _("no detail"));
+	if (! part->error_widget) {
+		part->error_widget = gtk_label_new ("");
+		gtk_misc_set_alignment (GTK_MISC (part->error_widget), 0., 0.);
+		part->error_widget_page = gtk_notebook_append_page (part->nb, part->error_widget,
+								    NULL);
+		gtk_widget_show (part->error_widget);
+	}
+	gtk_label_set_markup (GTK_LABEL (part->error_widget), tmp);
+	g_free (tmp);
+	gtk_notebook_set_current_page (part->nb, part->error_widget_page);
+}
+
 static gboolean
 source_exec_started_cb_timeout (DataPart *part)
 {
@@ -841,19 +877,7 @@ source_exec_finished_cb (G_GNUC_UNUSED DataSource *source, GError *error, DataPa
 	g_print ("==== Execution of source [%s] finished\n", data_source_get_title (part->source));
 #endif
 	if (error) {
-		gchar *tmp;
-		tmp = g_markup_printf_escaped ("\n<b>Error:\n</b>%s",
-					       error->message ? error->message : _("Error: no detail"));
-		if (! part->error_widget) {
-			part->error_widget = gtk_label_new ("");
-			gtk_misc_set_alignment (GTK_MISC (part->error_widget), 0., 0.);
-			part->error_widget_page = gtk_notebook_append_page (part->nb, part->error_widget,
-									    NULL);
-			gtk_widget_show (part->error_widget);
-		}
-		gtk_label_set_markup (GTK_LABEL (part->error_widget), tmp);
-		g_free (tmp);
-		gtk_notebook_set_current_page (part->nb, part->error_widget_page);
+		data_part_show_error (part, error);
 		return;
 	}
 	
@@ -922,7 +946,12 @@ source_exec_finished_cb (G_GNUC_UNUSED DataSource *source, GError *error, DataPa
 		}
 	}
 	gtk_notebook_set_current_page (part->nb, part->data_widget_page);
-	compute_sources_dependencies (part);
+
+	GError *lerror = NULL;
+	if (! compute_sources_dependencies (part, &lerror)) {
+		data_part_show_error (part, lerror);
+		g_clear_error (&lerror);
+	}
 }
 
 static void
@@ -947,13 +976,15 @@ data_part_selection_changed_cb (G_GNUC_UNUSED GdauiDataSelector *gdauidataselect
 	}
 }
 
-static void
-compute_sources_dependencies (DataPart *part)
+static gboolean
+compute_sources_dependencies (DataPart *part, GError **error)
 {
 	GdaSet *import;
+	gboolean retval = TRUE;
+
 	import = data_source_get_import (part->source);
 	if (!import)
-		return;
+		return TRUE;
 
 	GSList *holders;
 	for (holders = import->holders; holders; holders = holders->next) {
@@ -976,10 +1007,25 @@ compute_sources_dependencies (DataPart *part)
 			if (holder2) {
 				GError *lerror = NULL;
 				if (! gda_holder_set_bind (holder, holder2, &lerror)) {
-					TO_IMPLEMENT;
-					g_print ("Error: %s\n", lerror && lerror->message ? 
-						 lerror->message : "???");
-					g_clear_error (&lerror);
+					if (retval) {
+						if (lerror &&
+						    (lerror->domain == GDA_HOLDER_ERROR) &&
+						    (lerror->code == GDA_HOLDER_VALUE_TYPE_ERROR)) {
+							g_set_error (error, GDA_HOLDER_ERROR,
+								     GDA_HOLDER_VALUE_TYPE_ERROR,
+								     _("Can't bind parameter '%s' of type '%s' "
+								       "to a parameter of type '%s'"),
+								     gda_holder_get_id (holder),
+								     gda_g_type_to_string (gda_holder_get_g_type (holder)),
+								     gda_g_type_to_string (gda_holder_get_g_type (holder2)));
+							g_clear_error (&lerror);
+						}
+						else
+							g_propagate_error (error, lerror);
+						retval = FALSE;
+					}
+					else
+						g_clear_error (&lerror);
 				}
 #ifdef GDA_DEBUG_NO
 				g_print ("[%s.][%s] bound to [%s].[%s]\n",
@@ -995,6 +1041,8 @@ compute_sources_dependencies (DataPart *part)
 			}
 		}
 	}
+
+	return retval;
 }
 
 /**
diff --git a/tools/browser/doc/tmpl/popup-container.sgml b/tools/browser/doc/tmpl/popup-container.sgml
index 00766c0..e3fcf93 100644
--- a/tools/browser/doc/tmpl/popup-container.sgml
+++ b/tools/browser/doc/tmpl/popup-container.sgml
@@ -20,45 +20,3 @@ Popup window without any frame which hides itself when focus goes out
 <!-- ##### SECTION Image ##### -->
 
 
-<!-- ##### STRUCT PopupContainer ##### -->
-<para>
-
-</para>
-
- parent: 
- priv: 
-
-<!-- ##### STRUCT PopupContainerPrivate ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### USER_FUNCTION PopupContainerPositionFunc ##### -->
-<para>
-
-</para>
-
- cont: 
- out_x: 
- out_y: 
-
-
-<!-- ##### FUNCTION popup_container_new ##### -->
-<para>
-
-</para>
-
- position_widget: 
- Returns: 
-
-
-<!-- ##### FUNCTION popup_container_new_with_func ##### -->
-<para>
-
-</para>
-
- pos_func: 
- Returns: 
-
-
diff --git a/tools/browser/main.c b/tools/browser/main.c
index e1f62c1..321a45d 100644
--- a/tools/browser/main.c
+++ b/tools/browser/main.c
@@ -142,7 +142,7 @@ main (int argc, char *argv[])
 		}
 	}
 	
-	g_print ("Main THREAD is %p\n", g_thread_self ());
+	/*g_print ("Main THREAD is %p\n", g_thread_self ());*/
 	if (have_loop)
 		/* application loop */
 		gtk_main ();
diff --git a/tools/browser/mgr-favorites.c b/tools/browser/mgr-favorites.c
index 5171db6..5ade778 100644
--- a/tools/browser/mgr-favorites.c
+++ b/tools/browser/mgr-favorites.c
@@ -142,7 +142,7 @@ static void
 mgr_favorites_set_property (GObject *object,
 				   guint param_id,
 				   const GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         MgrFavorites *mgr;
 
@@ -155,6 +155,9 @@ mgr_favorites_set_property (GObject *object,
 				g_object_ref (mgr->priv->bcnc);
 			
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
@@ -163,7 +166,7 @@ static void
 mgr_favorites_get_property (GObject *object,
 				   guint param_id,
 				   GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         MgrFavorites *mgr;
 
@@ -173,6 +176,9 @@ mgr_favorites_get_property (GObject *object,
 		case PROP_BROWSER_CNC:
 			g_value_set_object (value, mgr->priv->bcnc);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
diff --git a/tools/browser/query-exec/query-console.c b/tools/browser/query-exec/query-console.c
index e426854..8290218 100644
--- a/tools/browser/query-exec/query-console.c
+++ b/tools/browser/query-exec/query-console.c
@@ -32,7 +32,7 @@
 #include "../browser-stock-icons.h"
 #include "query-editor.h"
 #include "query-result.h"
-#include "../common/popup-container.h"
+#include <libgda-ui/internal/popup-container.h>
 #include <libgda/sql-parser/gda-sql-parser.h>
 #include <libgda-ui/libgda-ui.h>
 
diff --git a/tools/browser/query-exec/query-editor.c b/tools/browser/query-exec/query-editor.c
index b8ab0c1..72edb7d 100644
--- a/tools/browser/query-exec/query-editor.c
+++ b/tools/browser/query-exec/query-editor.c
@@ -39,7 +39,7 @@
 #include <binreloc/gda-binreloc.h>
 #include "../browser-connection.h"
 #include "../browser-window.h"
-#include "../common/popup-container.h"
+#include <libgda-ui/internal/popup-container.h>
 #include "../support.h"
 
 #define QUERY_EDITOR_LANGUAGE_SQL "gda-sql"
diff --git a/tools/browser/query-exec/query-favorite-selector.c b/tools/browser/query-exec/query-favorite-selector.c
index 62c3953..e24ea3a 100644
--- a/tools/browser/query-exec/query-favorite-selector.c
+++ b/tools/browser/query-exec/query-favorite-selector.c
@@ -33,7 +33,7 @@
 #include "../cc-gray-bar.h"
 #include "../browser-favorites.h"
 #include <gdk/gdkkeysyms.h>
-#include "../common/popup-container.h"
+#include <libgda-ui/internal/popup-container.h>
 #include "query-editor.h"
 
 struct _QueryFavoriteSelectorPrivate {
diff --git a/tools/browser/schema-browser/mgr-columns.c b/tools/browser/schema-browser/mgr-columns.c
index 3617868..81e185a 100644
--- a/tools/browser/schema-browser/mgr-columns.c
+++ b/tools/browser/schema-browser/mgr-columns.c
@@ -152,7 +152,7 @@ static void
 mgr_columns_set_property (GObject *object,
 				   guint param_id,
 				   const GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         MgrColumns *mgr;
 
@@ -165,6 +165,9 @@ mgr_columns_set_property (GObject *object,
 				g_object_ref (mgr->priv->bcnc);
 			
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
@@ -173,7 +176,7 @@ static void
 mgr_columns_get_property (GObject *object,
 				   guint param_id,
 				   GValue *value,
-				   G_GNUC_UNUSED GParamSpec *pspec)
+				   GParamSpec *pspec)
 {
         MgrColumns *mgr;
 
@@ -183,6 +186,9 @@ mgr_columns_get_property (GObject *object,
 		case PROP_BROWSER_CNC:
 			g_value_set_object (value, mgr->priv->bcnc);
 			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
                 }
         }
 }
diff --git a/tools/browser/schema-browser/objects-index.c b/tools/browser/schema-browser/objects-index.c
index 817d824..6dfbf13 100644
--- a/tools/browser/schema-browser/objects-index.c
+++ b/tools/browser/schema-browser/objects-index.c
@@ -31,7 +31,7 @@
 #include "../cc-gray-bar.h"
 #include "marshal.h"
 #include <gdk/gdkkeysyms.h>
-#include "../common/popup-container.h"
+#include <libgda-ui/internal/popup-container.h>
 #include "../common/objects-cloud.h"
 
 struct _ObjectsIndexPrivate {
diff --git a/tools/browser/schema-browser/relations-diagram.c b/tools/browser/schema-browser/relations-diagram.c
index 33e8d28..f198822 100644
--- a/tools/browser/schema-browser/relations-diagram.c
+++ b/tools/browser/schema-browser/relations-diagram.c
@@ -27,7 +27,7 @@
 #include "../cc-gray-bar.h"
 #include "../canvas/browser-canvas-db-relations.h"
 #include <gdk/gdkkeysyms.h>
-#include "../common/popup-container.h"
+#include <libgda-ui/internal/popup-container.h>
 #include "../browser-page.h"
 #include "../browser-perspective.h"
 #include "../browser-window.h"
@@ -169,11 +169,14 @@ static void
 relations_diagram_set_property (GObject *object,
 				guint param_id,
 				G_GNUC_UNUSED const GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
 	RelationsDiagram *diagram;
 	diagram = RELATIONS_DIAGRAM (object);
 	switch (param_id) {
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 	}
 }
 
@@ -181,11 +184,14 @@ static void
 relations_diagram_get_property (GObject *object,
 				guint param_id,
 				G_GNUC_UNUSED GValue *value,
-				G_GNUC_UNUSED GParamSpec *pspec)
+				GParamSpec *pspec)
 {
 	RelationsDiagram *diagram;
 	diagram = RELATIONS_DIAGRAM (object);
 	switch (param_id) {
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+			break;
 	}
 }
 
diff --git a/tools/browser/schema-browser/table-info.c b/tools/browser/schema-browser/table-info.c
index 98df90c..e168879 100644
--- a/tools/browser/schema-browser/table-info.c
+++ b/tools/browser/schema-browser/table-info.c
@@ -38,7 +38,7 @@
 #include "../data-manager/data-manager-perspective.h"
 #include <libgda-ui/gdaui-enums.h>
 #include <libgda-ui/gdaui-basic-form.h>
-#include "../common/popup-container.h"
+#include <libgda-ui/internal/popup-container.h>
 #include <libgda/gda-data-model-extra.h>
 
 struct _TableInfoPrivate {
@@ -179,11 +179,14 @@ static void
 table_info_set_property (GObject *object,
 			 guint param_id,
 			 G_GNUC_UNUSED const GValue *value,
-			 G_GNUC_UNUSED GParamSpec *pspec)
+			 GParamSpec *pspec)
 {
 	TableInfo *tinfo;
 	tinfo = TABLE_INFO (object);
 	switch (param_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
@@ -191,11 +194,14 @@ static void
 table_info_get_property (GObject *object,
 			 guint param_id,
 			 G_GNUC_UNUSED GValue *value,
-			 G_GNUC_UNUSED GParamSpec *pspec)
+			 GParamSpec *pspec)
 {
 	TableInfo *tinfo;
 	tinfo = TABLE_INFO (object);
 	switch (param_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
 	}
 }
 
@@ -520,7 +526,7 @@ static void statement_executed_cb (G_GNUC_UNUSED BrowserConnection *bcnc,
 		browser_window_show_notice_printf (BROWSER_WINDOW (gtk_widget_get_toplevel ((GtkWidget*) tinfo)),
 						   GTK_MESSAGE_INFO,
 						   "DataInsertQuery",
-						   _("Data successfully inserted"));
+						   "%s", _("Data successfully inserted"));
 }
 
 static void
diff --git a/tools/gda-list-server-op.c b/tools/gda-list-server-op.c
index 63910c2..24ffe68 100644
--- a/tools/gda-list-server-op.c
+++ b/tools/gda-list-server-op.c
@@ -5,16 +5,19 @@
 #include <libgda/libgda.h>
 #include <libgda/binreloc/gda-binreloc.h>
 #include <glib/gi18n-lib.h>
+#include "gda-tree-mgr-xml.h"
 
 gchar *prov = NULL;
 gchar *op = NULL;
 gboolean list_ops = FALSE;
+gboolean out_tree = FALSE;
 GdaServerProvider *prov_obj = NULL;
 
 static GOptionEntry entries[] = {
         { "provider", 'p', 0, G_OPTION_ARG_STRING, &prov, "Provider name", "provider"},
         { "op", 'o', 0, G_OPTION_ARG_STRING, &op, "Operation", "operation name"},
         { "list-ops", 'l', 0, G_OPTION_ARG_NONE, &list_ops, "List existing operations", NULL },
+        { "tree", 't', 0, G_OPTION_ARG_NONE, &out_tree, "Output results as a tree (default is as XML)", NULL },
         { NULL, 0, 0, 0, NULL, NULL, NULL }
 };
 
@@ -75,12 +78,27 @@ main (int argc, char **argv) {
 		g_print (_("Description for type: %s\n"), gda_server_operation_op_type_to_string (type));
 		doc = merge_specs (xml_dir, type, &op_supported, &error);
 		if (doc) {
-			xmlChar *buf;
-			gint len;
-			xmlKeepBlanksDefault (0);
-			xmlDocDumpFormatMemory (doc, &buf, &len, 1);
-			g_print ("%s\n", buf);
-			xmlFree (buf);
+			if (out_tree) {
+				GdaTree *tree;
+				GdaTreeManager *mgr;
+
+				tree = gda_tree_new ();
+				mgr = gda_tree_mgr_xml_new (xmlDocGetRootElement (doc), "prov_name|id|name|gdatype|node_type|descr");
+				gda_tree_add_manager (tree,  mgr);
+				gda_tree_manager_add_manager (mgr, mgr);
+				g_object_unref (mgr);
+				gda_tree_update_all (tree, NULL);
+				gda_tree_dump (tree, NULL, NULL);
+				g_object_unref (tree);
+			}
+			else {
+				xmlChar *buf;
+				gint len;
+				xmlKeepBlanksDefault (0);
+				xmlDocDumpFormatMemory (doc, &buf, &len, 1);
+				g_print ("%s\n", buf);
+				xmlFree (buf);
+			}
 			xmlFreeDoc (doc);
 		}
 		else {
@@ -191,7 +209,6 @@ make_paths (xmlNodePtr node, const gchar *parent_path, GSList *exist_list)
 		for (child = node->children; child; child = child->next) 
 			retlist = make_paths (child, pstr, retlist);
 
-
 		xmlFree (id);
 	}
 	else {
@@ -330,8 +347,12 @@ merge_specs (const gchar *xml_dir, GdaServerOperationType type, gboolean *op_sup
 			provider_end = g_strrstr (provider, suffix);
 			*provider_end = 0;
 			
-			if (lcprov && strcmp (lcprov, provider))
-				continue;
+			if (lcprov && strcmp (lcprov, provider)) {
+				/* handle the name mismatch between the provider named "PostgreSQL" and
+				 * the file names which start with "postgres" */
+				if (strcmp (provider, "postgres") || strcmp (lcprov, "postgresql"))
+					continue;
+			}
 
 			*op_supported = TRUE;
 			pdoc = xmlParseFile (cfile);
diff --git a/tools/gda-tree-mgr-xml.c b/tools/gda-tree-mgr-xml.c
new file mode 100644
index 0000000..45ed02d
--- /dev/null
+++ b/tools/gda-tree-mgr-xml.c
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2010 The GNOME Foundation.
+ *
+ * AUTHORS:
+ *      Vivien Malerba <malerba gnome-db org>
+ *
+ * This Library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this Library; see the file COPYING.LIB.  If not,
+ * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <glib/gi18n-lib.h>
+#include <libgda/libgda.h>
+#include <sql-parser/gda-sql-parser.h>
+#include "gda-tree-mgr-xml.h"
+#include "gda-tree-node.h"
+
+struct _GdaTreeMgrXmlPriv {
+	xmlNodePtr   root;
+	gchar      **attributes;
+};
+
+static void gda_tree_mgr_xml_class_init (GdaTreeMgrXmlClass *klass);
+static void gda_tree_mgr_xml_init       (GdaTreeMgrXml *tmgr1, GdaTreeMgrXmlClass *klass);
+static void gda_tree_mgr_xml_dispose    (GObject *object);
+
+/* virtual methods */
+static GSList *gda_tree_mgr_xml_update_children (GdaTreeManager *manager, GdaTreeNode *node, 
+						 const GSList *children_nodes, gboolean *out_error, GError **error);
+
+static GObjectClass *parent_class = NULL;
+
+/*
+ * GdaTreeMgrXml class implementation
+ * @klass:
+ */
+static void
+gda_tree_mgr_xml_class_init (GdaTreeMgrXmlClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	parent_class = g_type_class_peek_parent (klass);
+
+	/* virtual methods */
+	((GdaTreeManagerClass*) klass)->update_children = gda_tree_mgr_xml_update_children;
+
+	object_class->dispose = gda_tree_mgr_xml_dispose;
+}
+
+static void
+gda_tree_mgr_xml_init (GdaTreeMgrXml *mgr, G_GNUC_UNUSED GdaTreeMgrXmlClass *klass)
+{
+	g_return_if_fail (GDA_IS_TREE_MGR_XML (mgr));
+	mgr->priv = g_new0 (GdaTreeMgrXmlPriv, 1);
+}
+
+static void
+gda_tree_mgr_xml_dispose (GObject *object)
+{
+	GdaTreeMgrXml *mgr = (GdaTreeMgrXml *) object;
+
+	g_return_if_fail (GDA_IS_TREE_MGR_XML (mgr));
+
+	if (mgr->priv) {
+		if (mgr->priv->attributes)
+			g_strfreev (mgr->priv->attributes);
+		g_free (mgr->priv);
+		mgr->priv = NULL;
+	}
+
+	/* chain to parent class */
+	parent_class->dispose (object);
+}
+
+/**
+ * gda_tree_mgr_xml_get_type:
+ *
+ * Returns: the GType
+ */
+GType
+gda_tree_mgr_xml_get_type (void)
+{
+        static GType type = 0;
+
+        if (G_UNLIKELY (type == 0)) {
+                static GStaticMutex registering = G_STATIC_MUTEX_INIT;
+                static const GTypeInfo info = {
+                        sizeof (GdaTreeMgrXmlClass),
+                        (GBaseInitFunc) NULL,
+                        (GBaseFinalizeFunc) NULL,
+                        (GClassInitFunc) gda_tree_mgr_xml_class_init,
+                        NULL,
+                        NULL,
+                        sizeof (GdaTreeMgrXml),
+                        0,
+                        (GInstanceInitFunc) gda_tree_mgr_xml_init,
+			0
+                };
+
+                g_static_mutex_lock (&registering);
+                if (type == 0)
+                        type = g_type_register_static (GDA_TYPE_TREE_MANAGER, "GdaTreeMgrXml", &info, 0);
+                g_static_mutex_unlock (&registering);
+        }
+        return type;
+}
+
+/**
+ * gda_tree_mgr_xml_new:
+ * rootnode: the #xmlNodePtr root
+ * xml_attributes: a string containing the XML attributes which will appear in each node, separated by the | character, or %NULL to list all attributes
+ *
+ * Creates a new #GdaTreeManager object which will add one tree node for each
+ * subnodes of an XmlNodePtr
+ *
+ * Returns: (transfer full): a new #GdaTreeManager object 
+ */
+GdaTreeManager*
+gda_tree_mgr_xml_new (xmlNodePtr rootnode, const gchar *xml_attributes)
+{
+	GdaTreeMgrXml *mgr;
+	mgr = (GdaTreeMgrXml*) g_object_new (GDA_TYPE_TREE_MGR_XML, NULL);
+	mgr->priv->root = rootnode;
+	if (xml_attributes)
+		mgr->priv->attributes = g_strsplit (xml_attributes, "|", 0);
+	return (GdaTreeManager*) mgr;
+}
+
+static GSList *
+gda_tree_mgr_xml_update_children (GdaTreeManager *manager, GdaTreeNode *node,
+				  G_GNUC_UNUSED const GSList *children_nodes,
+				  gboolean *out_error, GError **error)
+{
+	GdaTreeMgrXml *mgr = GDA_TREE_MGR_XML (manager);
+	GSList *list = NULL;
+	xmlNodePtr xnode, child;
+	const GValue *cvalue;
+	
+	cvalue = gda_tree_node_get_node_attribute (node, "xmlnode");
+	if (cvalue)
+		xnode = (xmlNodePtr) g_value_get_pointer (cvalue);
+	else
+		xnode = mgr->priv->root;
+	for (child = xnode->children; child; child = child->next) {
+		GString *string = NULL;
+		if (mgr->priv->attributes) {
+			gint i;
+			for (i = 0; ; i++) {
+				xmlChar *prop;
+				if (! mgr->priv->attributes[i])
+					break;
+				prop = xmlGetProp (child, BAD_CAST mgr->priv->attributes[i]);
+				if (!prop)
+					continue;
+				if (!string)
+					string = g_string_new ("");
+				else
+					g_string_append_c (string, ' ');
+				g_string_append_printf (string, "[%s=%s]", mgr->priv->attributes[i],
+							(gchar*) prop);
+				xmlFree (prop);
+			}
+		}
+		else {
+			/* use all attributes */
+			xmlAttrPtr attr;
+			
+			for (attr = child->properties; attr; attr = attr->next) {
+				xmlChar *prop;
+				prop = xmlGetProp (child, attr->name);
+				if (!prop)
+					continue;
+				if (!string)
+					string = g_string_new ("");
+				else
+					g_string_append_c (string, ' ');
+				g_string_append_printf (string, "[%s=%s]", (gchar*) attr->name, (gchar*) prop);
+				xmlFree (prop);
+			}
+		}
+		if (string) {
+			GValue *xvalue;
+			GdaTreeNode* snode;
+			snode = gda_tree_manager_create_node (manager, node, string->str);
+			g_string_free (string, TRUE);
+			g_value_set_pointer ((xvalue = gda_value_new (G_TYPE_POINTER)), child);
+			gda_tree_node_set_node_attribute (snode, "xmlnode", xvalue, NULL);
+			gda_value_free (xvalue);
+			list = g_slist_prepend (list, snode);
+		}
+	}
+
+	return list;
+}
diff --git a/tools/gda-tree-mgr-xml.h b/tools/gda-tree-mgr-xml.h
new file mode 100644
index 0000000..b1c9c19
--- /dev/null
+++ b/tools/gda-tree-mgr-xml.h
@@ -0,0 +1,56 @@
+/* GDA library
+ * Copyright (C) 2010 The GNOME Foundation.
+ *
+ * AUTHORS:
+ *      Vivien Malerba <malerba gnome-db org>
+ *
+ * This Library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this Library; see the file COPYING.LIB.  If not,
+ * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GDA_TREE_MGR_XML_H__
+#define __GDA_TREE_MGR_XML_H__
+
+#include <libgda/gda-connection.h>
+#include "gda-tree-manager.h"
+
+G_BEGIN_DECLS
+
+#define GDA_TYPE_TREE_MGR_XML            (gda_tree_mgr_xml_get_type())
+#define GDA_TREE_MGR_XML(obj)            (G_TYPE_CHECK_INSTANCE_CAST (obj, GDA_TYPE_TREE_MGR_XML, GdaTreeMgrXml))
+#define GDA_TREE_MGR_XML_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST (klass, GDA_TYPE_TREE_MGR_XML, GdaTreeMgrXmlClass))
+#define GDA_IS_TREE_MGR_XML(obj)         (G_TYPE_CHECK_INSTANCE_TYPE(obj, GDA_TYPE_TREE_MGR_XML))
+#define GDA_IS_TREE_MGR_XML_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GDA_TYPE_TREE_MGR_XML))
+#define GDA_TREE_MGR_XML_GET_CLASS(o)    (G_TYPE_INSTANCE_GET_CLASS ((o), GDA_TYPE_TREE_MGR_XML, GdaTreeMgrXmlClass))
+
+typedef struct _GdaTreeMgrXml GdaTreeMgrXml;
+typedef struct _GdaTreeMgrXmlPriv GdaTreeMgrXmlPriv;
+typedef struct _GdaTreeMgrXmlClass GdaTreeMgrXmlClass;
+
+struct _GdaTreeMgrXml {
+	GdaTreeManager        object;
+	GdaTreeMgrXmlPriv *priv;
+};
+
+struct _GdaTreeMgrXmlClass {
+	GdaTreeManagerClass   object_class;
+};
+
+GType              gda_tree_mgr_xml_get_type  (void) G_GNUC_CONST;
+GdaTreeManager*    gda_tree_mgr_xml_new       (xmlNodePtr rootnode, const gchar *xml_attributes);
+
+G_END_DECLS
+
+#endif



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