[libgda/gtk3] Merged master branch



commit 96817d7940184eb4f6839e0433b62236e187b9c5
Author: Vivien Malerba <malerba gnome-db org>
Date:   Sun Sep 12 12:16:48 2010 +0200

    Merged master branch

 NEWS                                               |   29 +
 configure.ac                                       |    3 +
 control-center/gdaui-login-dialog.c                |    6 +-
 doc/C/libgda-sections.txt                          |    1 +
 doc/C/packaging_ui.xml                             |    6 +-
 doc/C/tmpl/gda-sql-statement.sgml                  |   11 +
 installers/WindowsWix/make-zip-exe.sh              |    2 +-
 libgda-report/engine/gda-report-engine.c           |    2 +-
 libgda-ui/data-entries/common-bin.c                |    2 +-
 .../data-entries/gdaui-data-cell-renderer-bin.c    |    2 +-
 .../gdaui-data-cell-renderer-boolean.c             |    2 +-
 libgda-ui/data-entries/gdaui-entry-date.c          |    2 -
 libgda-ui/data-entries/gdaui-entry-time.c          |    2 -
 libgda-ui/data-entries/gdaui-entry-timestamp.c     |    2 -
 libgda-ui/data-entries/plugins/Makefile.am         |    4 -
 libgda-ui/data-entries/plugins/common-pict.c       |    4 +-
 .../plugins/gdaui-data-cell-renderer-cgrid.c       |  609 --
 .../plugins/gdaui-data-cell-renderer-cgrid.h       |   78 -
 libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c |  852 --
 libgda-ui/data-entries/plugins/gdaui-entry-cgrid.h |   69 -
 libgda-ui/data-entries/plugins/gdaui-entry-text.c  |   10 +-
 libgda-ui/data-entries/plugins/libmain.c           |   16 -
 libgda-ui/gdaui-basic-form.c                       |  147 +-
 libgda-ui/gdaui-combo.c                            |    2 +-
 libgda-ui/gdaui-data-entry.c                       |    2 +-
 libgda-ui/gdaui-data-proxy.c                       |    4 +-
 libgda-ui/gdaui-data-store.c                       |    2 +-
 libgda-ui/gdaui-login.c                            |    7 +
 libgda-ui/gdaui-raw-grid.c                         |   10 +-
 libgda-ui/gdaui-server-operation.c                 |    2 +-
 libgda-ui/internal/gdaui-provider-auth-editor.c    |    2 +-
 libgda-ui/internal/gdaui-provider-spec-editor.c    |    2 +-
 libgda-ui/internal/utility.c                       |   52 +-
 libgda-ui/internal/utility.h                       |    5 +
 libgda-xslt/sql_backend.c                          |    8 +-
 libgda-xslt/sql_exslt_internal.c                   |   12 +-
 libgda-xslt/sqlexslt.c                             |    8 +-
 libgda/Makefile.am                                 |    2 -
 libgda/gda-config.c                                |   10 +-
 libgda/gda-connection.c                            |    8 +-
 libgda/gda-data-model.c                            |    2 +-
 libgda/gda-holder.h                                |    1 +
 libgda/gda-meta-store.c                            |    2 +-
 libgda/gda-meta-struct-io.c                        |    4 +
 libgda/gda-set.c                                   |   38 +-
 libgda/gda-sql-builder.c                           |    8 -
 libgda/gda-tree-manager.c                          |    7 -
 libgda/gda-util.c                                  |   66 +-
 libgda/handlers/gda-handler-time.c                 |    2 +-
 libgda/information_schema.xml                      |   70 +-
 libgda/libgda.symbols                              |    1 +
 libgda/sql-parser/gda-sql-parser.c                 |    2 +-
 libgda/sql-parser/gda-statement-struct.c           |  112 +-
 libgda/sql-parser/gda-statement-struct.h           |    4 +
 libgda/sqlite/gda-sqlite-meta.c                    |    2 +
 libgda/sqlite/gda-symbols-util.c                   |    2 +-
 libgda/sqlite/sqlite-src/PragmasPatch              |    6 +-
 libgda/sqlite/sqlite-src/sqlite3.c                 | 4874 +++++++-----
 libgda/sqlite/sqlite-src/sqlite3.h                 |   96 +-
 libgda/sqlite/virtual/gda-vprovider-data-model.c   |    9 +-
 libgda/thread-wrapper/gda-thread-wrapper.c         |    7 -
 po/LINGUAS                                         |    1 +
 po/POTFILES.in                                     |    3 +-
 po/cs.po                                           | 1069 ++-
 po/da.po                                           | 1994 +++--
 po/de.po                                           |  465 +-
 po/es.po                                           |  392 +-
 po/id.po                                           | 8802 ++++++++++++++++++++
 po/sl.po                                           | 1846 +++--
 providers/mysql/gda-mysql-recordset.c              |   21 -
 providers/postgres/gda-postgres-provider.c         |   33 -
 providers/skel-implementation/capi/gda-capi-meta.c |    4 +-
 testing/gda-test-blob.c                            |    6 +-
 testing/html.c                                     |   70 +-
 tests/.gitignore                                   |    1 +
 tests/Makefile.am                                  |   11 +-
 tests/test-connection-string-split.c               |   54 +
 tools/browser/Makefile.am                          |    4 +-
 tools/browser/browser-connection.c                 |   25 +-
 tools/browser/browser-connection.h                 |    2 +
 tools/browser/browser-window.c                     |  426 +-
 tools/browser/browser-window.h                     |    5 +
 tools/browser/canvas/browser-canvas-db-relations.c |  165 +-
 tools/browser/canvas/browser-canvas-fkey.c         |   16 -
 tools/browser/canvas/browser-canvas-utility.c      |   24 -
 tools/browser/canvas/browser-canvas.c              |    5 +-
 tools/browser/common/gdaui-data-import.c           |    1 +
 tools/browser/common/objects-cloud.c               |   12 +
 tools/browser/common/ui-formgrid.c                 |    9 +-
 tools/browser/data-manager/DataSourceEdition.dia   |  Bin 0 -> 2492 bytes
 tools/browser/data-manager/Makefile.am             |    2 +
 tools/browser/data-manager/data-console.c          |  315 +-
 .../browser/data-manager/data-favorite-selector.c  |    4 +-
 .../data-manager/data-manager-perspective.c        |   23 +-
 tools/browser/data-manager/data-source-editor.c    |  429 +
 tools/browser/data-manager/data-source-editor.h    |   61 +
 tools/browser/data-manager/data-source-manager.c   |  151 +-
 tools/browser/data-manager/data-source-manager.h   |    7 +-
 tools/browser/data-manager/data-source.c           | 1039 ++-
 tools/browser/data-manager/data-source.h           |   28 +-
 tools/browser/data-manager/data-widget.c           |  592 ++-
 tools/browser/data-manager/data-widget.h           |    3 +-
 tools/browser/data-manager/marshal.list            |    1 +
 tools/browser/data-manager/ui-spec-editor.c        |  282 +-
 tools/browser/data-manager/ui-spec-editor.h        |    5 +-
 tools/browser/data-manager/xml-spec-editor.c       |   79 +-
 tools/browser/doc/Makefile.am                      |    1 +
 tools/browser/doc/gda-browser-sections.txt         |    4 +
 tools/browser/doc/tmpl/browser-connection.sgml     |   11 +
 tools/browser/doc/tmpl/browser-window.sgml         |   32 +
 tools/browser/gda-browser-menu-ind.png             |  Bin 0 -> 472 bytes
 tools/browser/help/C/data-manager-perspective.page |   10 +-
 tools/browser/help/C/data-manager-xml-syntax.page  |   32 +-
 tools/browser/help/C/figures/data-man-persp.png    |  Bin 42049 -> 105450 bytes
 .../browser/help/C/figures/data-man-xmlcompose.png |  Bin 26347 -> 43932 bytes
 tools/browser/help/Makefile.am                     |    2 +-
 tools/browser/help/sl/.gitignore                   |    2 +
 tools/browser/help/sl/sl.po                        |  751 ++
 tools/browser/query-exec/query-console.c           |   27 +-
 tools/browser/query-exec/query-favorite-selector.c |    3 -
 tools/browser/schema-browser/favorite-selector.c   |    6 +-
 tools/browser/schema-browser/relations-diagram.c   |    6 -
 .../schema-browser/schema-browser-perspective.c    |    2 +-
 tools/browser/schema-browser/table-columns.c       |    9 +-
 tools/browser/schema-browser/table-info.c          |   13 +-
 tools/browser/schema-browser/table-preferences.c   |    6 -
 tools/browser/schema-browser/table-relations.c     |    6 -
 tools/browser/support.c                            |  130 +-
 tools/browser/support.h                            |    3 +-
 tools/command-exec.c                               |    2 +-
 tools/gda-sql.c                                    |    4 +-
 tools/web-server.c                                 |   19 -
 132 files changed, 19630 insertions(+), 7252 deletions(-)
---
diff --git a/NEWS b/NEWS
index 8ebd505..c42d069 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,32 @@
+libgda 4.1.10, 2010-09-11
+
+ - GdaBrowser improvements & corrections (better full screen mode and notifications, improved
+   data manager perspective and more)
+ - misc corrections
+ - translations:
+	- sl (Matej UrbanÄ?iÄ?)
+	- id (Andika Triwidada)
+
+libgda 4.1.8, 2010-09-01
+
+ - improved core API (GdaSqlBuilder, GdaServerOperation, GdaThreadWrapper, GdaConnection)
+ - core corrections and optimization, mainly in the SQLite and MySQL providers, connection (locking
+   and thread safe usage)
+ - use Gnome Keryring if available to store username and passwords to be used for data sources (DSN)
+ - configuration file monitoring: only use GIO (removed GnomeVFS, gamin or FAM)
+ - many improvements to the UI extension
+ - many improvements and corrections to the GdaBrowser tool
+ - embedd SQLite 3.6.22
+ - translations:
+	- es (Jorge González)
+	- sl (Matej UrbanÄ?iÄ?)
+	- da (Joe Hansen)
+	- pt (Nicolau Gonçalves)
+	- cs (Petr Kovar, Marek Cernocky)
+	- de (Mario Blättermann, Christian Kirbach)
+	- nb (Kjartan Maraas)
+	- id (Andika Triwidada)
+
 libgda 4.1.7, 2010-06-27
 
  - new provider for Oracle Berkeley DB's SQL frontend (which has the same API as sqlite)
diff --git a/configure.ac b/configure.ac
index 23c0156..9f87eca 100644
--- a/configure.ac
+++ b/configure.ac
@@ -177,14 +177,17 @@ AC_SUBST(GTK_LIBS)
 
 AC_ARG_WITH(gtksourceview,
 AS_HELP_STRING([--with-gtksourceview], [Enable using GtkSourceView]),
+	[with_sourceview=$withval]
 	,with_sourceview=auto)
 
 AC_ARG_WITH(goocanvas,
 AS_HELP_STRING([--with-goocanvas], [Enable using GooCanvas]),
+	[with_goo=$withval]
 	,with_goo=auto)
 
 AC_ARG_WITH(graphviz,
 AS_HELP_STRING([--with-graphviz], [Enable using Graphviz]),
+	[with_graphviz=$withval]
 	,with_graphviz=auto)
 
 if test x"$have_ui" = "xyes"
diff --git a/control-center/gdaui-login-dialog.c b/control-center/gdaui-login-dialog.c
index 81a0665..4a4dad6 100644
--- a/control-center/gdaui-login-dialog.c
+++ b/control-center/gdaui-login-dialog.c
@@ -69,7 +69,7 @@ gdaui_login_dialog_class_init (GdauiLoginDialogClass *klass)
 }
 
 static void
-login_dsn_changed_cb (GdauiLogin *login, GdauiLoginDialog *dialog)
+login_changed_cb (GdauiLogin *login, gboolean valid, GdauiLoginDialog *dialog)
 {
 	gchar *str;
 	const GdaDsnInfo *cinfo;
@@ -153,8 +153,8 @@ gdaui_login_dialog_init (GdauiLoginDialog *dialog, GdauiLoginDialogClass *klass)
 		      GDA_UI_LOGIN_HIDE_DSN_SELECTION_MODE, NULL);
 	gtk_widget_show (dialog->priv->login);
 	gtk_box_pack_start (GTK_BOX (vbox), dialog->priv->login, TRUE, TRUE, 0);
-	g_signal_connect (G_OBJECT (dialog->priv->login), "dsn-changed",
-			  G_CALLBACK (login_dsn_changed_cb), dialog);
+	g_signal_connect (G_OBJECT (dialog->priv->login), "changed",
+			  G_CALLBACK (login_changed_cb), dialog);
 
 	gchar *path;
 	path = gda_gbr_get_file_path (GDA_DATA_DIR, LIBGDA_ABI_NAME, "pixmaps", "gdaui-generic.png", NULL);
diff --git a/doc/C/libgda-sections.txt b/doc/C/libgda-sections.txt
index a46b61e..cd313bc 100644
--- a/doc/C/libgda-sections.txt
+++ b/doc/C/libgda-sections.txt
@@ -1153,6 +1153,7 @@ gda_sql_statement_type_to_string
 gda_sql_statement_string_to_type
 gda_sql_statement_check_structure
 gda_sql_statement_check_validity
+gda_sql_statement_check_validity_m
 gda_sql_statement_check_clean
 gda_sql_statement_normalize
 <SUBSECTION>
diff --git a/doc/C/packaging_ui.xml b/doc/C/packaging_ui.xml
index 9f994f1..ba9a941 100644
--- a/doc/C/packaging_ui.xml
+++ b/doc/C/packaging_ui.xml
@@ -54,8 +54,6 @@
 .
 |-- lib
 |   |-- libgda-5.0
-|   |   |-- language-specs
-|   |   |   `-- gda-sql.lang
 |   |   |-- plugins
 |   |   |   |-- gdaui-entry-filesel-spec.xml
 |   |   |   |-- gdaui-entry-password.xml
@@ -68,7 +66,9 @@
 |   `-- libgdaui-5.0.so.4.1.0
 `-- share
     `-- libgda-5.0
-       |-- server_operation.glade
+        |-- language-specs
+        |   `-- gda-sql.lang
+        |-- server_operation.glade
         `-- ui
             |-- gdaui-entry-string-number.xml
             `-- gdaui-entry-string-string.xml
diff --git a/doc/C/tmpl/gda-sql-statement.sgml b/doc/C/tmpl/gda-sql-statement.sgml
index 1f6f66d..ae4eddc 100644
--- a/doc/C/tmpl/gda-sql-statement.sgml
+++ b/doc/C/tmpl/gda-sql-statement.sgml
@@ -142,6 +142,17 @@ Known types of statements
 @Returns: 
 
 
+<!-- ##### FUNCTION gda_sql_statement_check_validity_m ##### -->
+<para>
+
+</para>
+
+ stmt: 
+ mstruct: 
+ error: 
+ Returns: 
+
+
 <!-- ##### FUNCTION gda_sql_statement_check_clean ##### -->
 <para>
 
diff --git a/installers/WindowsWix/make-zip-exe.sh b/installers/WindowsWix/make-zip-exe.sh
index 7b292f2..4f3fafc 100755
--- a/installers/WindowsWix/make-zip-exe.sh
+++ b/installers/WindowsWix/make-zip-exe.sh
@@ -17,7 +17,7 @@
 cross_path=/local/Win32/gtk
 depend_path=/local/Win32
 prefix=/local/Win32/Libgda
-version=4.1.8
+version=4.1.11
 
 
 
diff --git a/libgda-report/engine/gda-report-engine.c b/libgda-report/engine/gda-report-engine.c
index 0ad4dbc..7200265 100644
--- a/libgda-report/engine/gda-report-engine.c
+++ b/libgda-report/engine/gda-report-engine.c
@@ -953,7 +953,7 @@ rewrite_statement_foreach_func (GdaSqlAnyPart *node, ForeachData *fdata, GError
 			return TRUE;
 
 		GdaHolder *source_param;
-		source_param = run_context_find_param (fdata->engine, fdata->context, pspec->name);
+		source_param = run_context_find_param (fdata->engine, fdata->context, BAD_CAST pspec->name);
 		if (!source_param) {
 			g_set_error (error, 0, 0,
 				     _("Unknown parameter '%s'"), pspec->name);
diff --git a/libgda-ui/data-entries/common-bin.c b/libgda-ui/data-entries/common-bin.c
index 2df2cd7..af3c0e6 100644
--- a/libgda-ui/data-entries/common-bin.c
+++ b/libgda-ui/data-entries/common-bin.c
@@ -61,7 +61,7 @@ file_load_cb (GtkWidget *button, BinMenu *menu)
 				GdaBinary *bin;
 				GValue *nvalue;
 				bin = g_new0 (GdaBinary, 1);
-				bin->data = data;
+				bin->data = (guchar*) data;
 				bin->binary_length = length;
 				nvalue = gda_value_new (GDA_TYPE_BINARY);
 				gda_value_take_binary (nvalue, bin);
diff --git a/libgda-ui/data-entries/gdaui-data-cell-renderer-bin.c b/libgda-ui/data-entries/gdaui-data-cell-renderer-bin.c
index 1c1a514..db353a3 100644
--- a/libgda-ui/data-entries/gdaui-data-cell-renderer-bin.c
+++ b/libgda-ui/data-entries/gdaui-data-cell-renderer-bin.c
@@ -317,7 +317,7 @@ gdaui_data_cell_renderer_bin_set_property (GObject *object,
 /**
  * gdaui_data_cell_renderer_bin_new:
  * @dh: a #GdaDataHandler object
- * @type:
+ * @type: the #GType of the data to be displayed
  * 
  * Creates a new #GdauiDataCellRendererBin. Adjust rendering
  * parameters using object properties. Object properties can be set
diff --git a/libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c b/libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c
index ad0f03e..62dca29 100644
--- a/libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c
+++ b/libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c
@@ -325,7 +325,7 @@ gdaui_data_cell_renderer_boolean_set_property (GObject *object,
 /**
  * gdaui_data_cell_renderer_boolean_new:
  * @dh: a #GdaDataHandler object
- * @type:
+ * @type: the #GType of the data to be displayed
  *
  * Creates a new #GdauiDataCellRendererBoolean. Adjust rendering
  * parameters using object properties. Object properties can be set
diff --git a/libgda-ui/data-entries/gdaui-entry-date.c b/libgda-ui/data-entries/gdaui-entry-date.c
index 36570b6..db53825 100644
--- a/libgda-ui/data-entries/gdaui-entry-date.c
+++ b/libgda-ui/data-entries/gdaui-entry-date.c
@@ -58,8 +58,6 @@ gdaui_entry_date_get_type (void)
 static void
 gdaui_entry_date_class_init (GdauiEntryDateClass * class)
 {
-	GObjectClass   *object_class = G_OBJECT_CLASS (class);
-
 	parent_class = g_type_class_peek_parent (class);
 }
 
diff --git a/libgda-ui/data-entries/gdaui-entry-time.c b/libgda-ui/data-entries/gdaui-entry-time.c
index 530b8ff..bf46496 100644
--- a/libgda-ui/data-entries/gdaui-entry-time.c
+++ b/libgda-ui/data-entries/gdaui-entry-time.c
@@ -58,8 +58,6 @@ gdaui_entry_time_get_type (void)
 static void
 gdaui_entry_time_class_init (GdauiEntryTimeClass * class)
 {
-	GObjectClass *object_class = G_OBJECT_CLASS (class);
-
 	parent_class = g_type_class_peek_parent (class);
 }
 
diff --git a/libgda-ui/data-entries/gdaui-entry-timestamp.c b/libgda-ui/data-entries/gdaui-entry-timestamp.c
index 407bc8c..81d02ba 100644
--- a/libgda-ui/data-entries/gdaui-entry-timestamp.c
+++ b/libgda-ui/data-entries/gdaui-entry-timestamp.c
@@ -58,8 +58,6 @@ gdaui_entry_timestamp_get_type (void)
 static void
 gdaui_entry_timestamp_class_init (GdauiEntryTimestampClass * class)
 {
-	GObjectClass   *object_class = G_OBJECT_CLASS (class);
-
 	parent_class = g_type_class_peek_parent (class);
 }
 
diff --git a/libgda-ui/data-entries/plugins/Makefile.am b/libgda-ui/data-entries/plugins/Makefile.am
index a6aa682..61bf594 100644
--- a/libgda-ui/data-entries/plugins/Makefile.am
+++ b/libgda-ui/data-entries/plugins/Makefile.am
@@ -25,11 +25,9 @@ endif
 
 plugins_headers = \
 	common-pict.h \
-	gdaui-data-cell-renderer-cgrid.h \
 	gdaui-data-cell-renderer-pict.h \
 	gdaui-entry-filesel.h \
 	gdaui-entry-cidr.h \
-	gdaui-entry-cgrid.h \
 	gdaui-entry-text.h \
 	gdaui-entry-pict.h \
 	$(gcrypt_headers)
@@ -40,11 +38,9 @@ libgda_ui_plugins_la_SOURCES = \
 	custom-marshal.c \
 	custom-marshal.h \
 	libmain.c \
-	gdaui-data-cell-renderer-cgrid.c \
 	gdaui-data-cell-renderer-pict.c \
 	gdaui-entry-filesel.c \
 	gdaui-entry-cidr.c \
-	gdaui-entry-cgrid.c \
 	gdaui-entry-text.c \
 	gdaui-entry-pict.c \
 	$(gcrypt_sources)
diff --git a/libgda-ui/data-entries/plugins/common-pict.c b/libgda-ui/data-entries/plugins/common-pict.c
index 3420413..23cd2bd 100644
--- a/libgda-ui/data-entries/plugins/common-pict.c
+++ b/libgda-ui/data-entries/plugins/common-pict.c
@@ -590,7 +590,7 @@ common_pict_add_cached_pixbuf (PictOptions *options, const GValue *value, GdkPix
 		bin = (GdaBinary *) blob;
 		if (bin) {
 			if (!bin->data && blob->op)
-				gda_blob_op_read_all (blob->op, blob);
+				gda_blob_op_read_all (blob->op, (GdaBlob*) blob);
 			hash = compute_hash (bin->data, bin->binary_length);
 			g_hash_table_insert (options->pixbuf_hash, GUINT_TO_POINTER (hash), pixbuf);
 			g_object_ref (pixbuf);
@@ -626,7 +626,7 @@ common_pict_fetch_cached_pixbuf (PictOptions *options, const GValue *value)
 		bin = (GdaBinary *) blob;
 		if (bin) {
 			if (!bin->data && blob->op)
-				gda_blob_op_read_all (blob->op, blob);
+				gda_blob_op_read_all (blob->op, (GdaBlob*) blob);
 			hash = compute_hash (bin->data, bin->binary_length);
 			pixbuf = g_hash_table_lookup (options->pixbuf_hash, GUINT_TO_POINTER (hash));
 		}
diff --git a/libgda-ui/data-entries/plugins/gdaui-entry-text.c b/libgda-ui/data-entries/plugins/gdaui-entry-text.c
index 7904a07..8812881 100644
--- a/libgda-ui/data-entries/plugins/gdaui-entry-text.c
+++ b/libgda-ui/data-entries/plugins/gdaui-entry-text.c
@@ -290,7 +290,7 @@ create_entry (GdauiEntryWrapper *mgwrap)
 	mgtxt->priv->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (mgtxt->priv->view));
 	gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (mgtxt->priv->view), mgtxt->priv->wrapmode);
 	sw = gtk_scrolled_window_new (NULL, NULL);
-	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
+	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_NONE);
 	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
 					GTK_POLICY_AUTOMATIC,
 					GTK_POLICY_AUTOMATIC);
@@ -323,8 +323,8 @@ real_set_value (GdauiEntryWrapper *mgwrap, const GValue *value)
 				bin = (GdaBinary *) blob;
 				if (blob->op &&
 				    (bin->binary_length != gda_blob_op_get_length (blob->op)))
-                                        gda_blob_op_read_all (blob->op, blob);
-				if (g_utf8_validate (bin->data, bin->binary_length, NULL)) {
+                                        gda_blob_op_read_all (blob->op, (GdaBlob*) blob);
+				if (g_utf8_validate ((gchar*) bin->data, bin->binary_length, NULL)) {
 					gtk_text_buffer_set_text (mgtxt->priv->buffer, (gchar*) bin->data, 
 								  bin->binary_length);
 					done = TRUE;
@@ -333,7 +333,7 @@ real_set_value (GdauiEntryWrapper *mgwrap, const GValue *value)
 			else  if (G_VALUE_TYPE (value) == GDA_TYPE_BINARY) {
 				const GdaBinary *bin;
 				bin = gda_value_get_binary (value);
-				if (g_utf8_validate (bin->data, bin->binary_length, NULL)) {
+				if (g_utf8_validate ((gchar*) bin->data, bin->binary_length, NULL)) {
 					gtk_text_buffer_set_text (mgtxt->priv->buffer, (gchar*) bin->data, 
 								  bin->binary_length);
 					done = TRUE;
@@ -427,5 +427,5 @@ set_editable (GdauiEntryWrapper *mgwrap, gboolean editable)
 	g_return_if_fail (mgwrap && GDAUI_IS_ENTRY_TEXT (mgwrap));
 	mgtxt = GDAUI_ENTRY_TEXT (mgwrap);
 
-	gtk_widget_set_sensitive (mgtxt->priv->view, editable);
+	gtk_text_view_set_editable (GTK_TEXT_VIEW (mgtxt->priv->view), editable);
 }
diff --git a/libgda-ui/data-entries/plugins/libmain.c b/libgda-ui/data-entries/plugins/libmain.c
index c8d009d..8b83ff4 100644
--- a/libgda-ui/data-entries/plugins/libmain.c
+++ b/libgda-ui/data-entries/plugins/libmain.c
@@ -31,8 +31,6 @@
 #include "gdaui-entry-text.h"
 #include "gdaui-entry-pict.h"
 #include "gdaui-data-cell-renderer-pict.h"
-#include "gdaui-entry-cgrid.h"
-#include "gdaui-data-cell-renderer-cgrid.h"
 
 #ifdef HAVE_LIBGCRYPT
 #include "gdaui-entry-password.h"
@@ -56,8 +54,6 @@ static GdauiDataEntry *plugin_entry_cidr_create_func (GdaDataHandler *handler, G
 static GdauiDataEntry *plugin_entry_text_create_func (GdaDataHandler *handler, GType type, const gchar *options);
 static GdauiDataEntry *plugin_entry_pict_create_func (GdaDataHandler *handler, GType type, const gchar *options);
 static GtkCellRenderer  *plugin_cell_renderer_pict_create_func (GdaDataHandler *handler, GType type, const gchar *options);
-static GdauiDataEntry *plugin_entry_cgrid_create_func (GdaDataHandler *handler, GType type, const gchar *options);
-static GtkCellRenderer  *plugin_cell_renderer_cgrid_create_func (GdaDataHandler *handler, GType type, const gchar *options);
 
 #ifdef HAVE_LIBGCRYPT
 static GdauiDataEntry *plugin_entry_password_create_func (GdaDataHandler *handler, GType type, const gchar *options);
@@ -299,18 +295,6 @@ plugin_cell_renderer_pict_create_func (GdaDataHandler *handler, GType type, cons
 	return gdaui_data_cell_renderer_pict_new (handler, type, options);
 }
 
-static GdauiDataEntry *
-plugin_entry_cgrid_create_func (GdaDataHandler *handler, GType type, const gchar *options)
-{
-	return (GdauiDataEntry *) gdaui_entry_cgrid_new (handler, type, options);
-}
-
-static GtkCellRenderer *
-plugin_cell_renderer_cgrid_create_func (GdaDataHandler *handler, GType type, const gchar *options)
-{
-	return (GtkCellRenderer *) gdaui_data_cell_renderer_cgrid_new (handler, type, options);
-}
-
 #ifdef HAVE_LIBGCRYPT
 static GdauiDataEntry *
 plugin_entry_password_create_func (GdaDataHandler *handler, GType type, const gchar *options)
diff --git a/libgda-ui/gdaui-basic-form.c b/libgda-ui/gdaui-basic-form.c
index b2dc543..e10ba32 100644
--- a/libgda-ui/gdaui-basic-form.c
+++ b/libgda-ui/gdaui-basic-form.c
@@ -69,6 +69,7 @@ typedef struct {
 	gboolean        hidden;
 	gboolean        not_null; /* TRUE if @entry's contents can't be NULL */
 	gboolean        can_expand; /* tells if @entry can expand */
+	gboolean        forward_param_updates; /* forward them to the GdauiDataEntry widgets ? */
 
 	gulong          entry_shown_id; /* signal ID */
 	gulong          label_shown_id; /* signal ID */
@@ -99,6 +100,7 @@ static void pack_entries_in_table (GdauiBasicForm *form);
 static void pack_entries_in_xml_layout (GdauiBasicForm *form, xmlNodePtr form_node);
 static void unpack_entries (GdauiBasicForm *form);
 static void destroy_entries (GdauiBasicForm *form);
+static gchar *create_text_label_for_sentry (SingleEntry *sentry, gchar **out_title);
 
 static void gdaui_basic_form_show_entry_actions (GdauiBasicForm *form, gboolean show_actions);
 static void gdaui_basic_form_set_entries_auto_default (GdauiBasicForm *form, gboolean auto_default);
@@ -155,7 +157,6 @@ struct _GdauiBasicFormPriv
 	GtkWidget              *top_container;
 
 	gboolean                headers_sensitive;
-	gboolean                forward_param_updates; /* forward them to the GdauiDataEntry widgets ? */
 	gboolean                show_actions;
 	gboolean                entries_auto_default;
 
@@ -297,8 +298,6 @@ gdaui_basic_form_init (GdauiBasicForm * wid)
 	wid->priv->headers_sensitive = FALSE;
 	wid->priv->show_actions = FALSE;
 	wid->priv->entries_auto_default = FALSE;
-
-	wid->priv->forward_param_updates = TRUE;
 }
 
 /**
@@ -448,7 +447,33 @@ paramlist_param_attr_changed_cb (GdaSet *paramlist, GdaHolder *param,
 			gdaui_basic_form_entry_set_visible (form, param, !sentry->hidden);
 		}
 		else
-			paramlist_public_data_changed_cb (form->priv->set_info, form);	
+			paramlist_public_data_changed_cb (form->priv->set_info, form);
+	}
+	else if (!strcmp (att_name, GDA_ATTRIBUTE_NAME) ||
+		 !strcmp (att_name, GDA_ATTRIBUTE_DESCRIPTION)) {
+		if (sentry) {
+			gchar *str, *title;
+			str = create_text_label_for_sentry (sentry, &title);
+			gtk_label_set_text (GTK_LABEL (sentry->label), str);
+			g_free (str);
+			g_free (sentry->label_title);
+			sentry->label_title = title;
+			
+			if (! sentry->group->group->nodes_source) {
+				g_object_get (G_OBJECT (param), "description", &title, NULL);
+				if (title && *title)
+					gtk_widget_set_tooltip_text (sentry->label, title);
+				g_free (title);
+			}
+			else {
+				title = g_object_get_data (G_OBJECT (sentry->group->group->nodes_source->data_model),
+							   "descr");
+				if (title && *title)
+					gtk_widget_set_tooltip_text (sentry->label, title);
+			}
+		}
+		else
+			paramlist_public_data_changed_cb (form->priv->set_info, form);
 	}
 }
 
@@ -681,6 +706,59 @@ destroy_entries (GdauiBasicForm *form)
 	}
 }
 
+static gchar *
+create_text_label_for_sentry (SingleEntry *sentry, gchar **out_title)
+{
+	gchar *label = NULL;
+	g_assert (out_title);
+	if (! sentry->group->group->nodes_source) {
+		g_object_get (G_OBJECT (sentry->single_param), "name", out_title, NULL);
+		if (!*out_title)
+			*out_title = g_strdup (_("Value"));
+		label = g_strdup_printf ("%s:", *out_title);
+		/*
+		g_object_get (G_OBJECT (param), "description", &title, NULL);
+		if (title && *title)
+			gtk_widget_set_tooltip_text (sentry->label, title);
+		g_free (title);
+		*/
+
+	}
+	else {
+		gchar *label;
+		GSList *params;
+		gchar *title = NULL;
+
+		label = g_object_get_data (G_OBJECT (sentry->group->group->nodes_source->data_model), "name");
+		if (label)
+			title = g_strdup (label);
+		else {
+			GString *tstring = NULL;
+			for (params = sentry->group->group->nodes; params; params = params->next) {
+				g_object_get (G_OBJECT (GDA_SET_NODE (params->data)->holder),
+					      "name", &title, NULL);
+				if (title) {
+					if (tstring) 
+						g_string_append (tstring, ",\n");
+					else
+						tstring = g_string_new ("");
+					g_string_append (tstring, title);
+				}
+			}
+			if (tstring)
+				title = g_string_free (tstring, FALSE);
+		}
+
+		if (!title)
+			title = g_strdup (_("Value"));
+
+		label = g_strdup_printf ("%s:", title);
+		*out_title = title;
+	}
+
+	return label;
+}
+
 static void
 create_entry_widget (SingleEntry *sentry)
 {
@@ -739,7 +817,7 @@ create_entry_widget (SingleEntry *sentry)
 
 		param = GDA_HOLDER (GDA_SET_NODE (group->group->nodes->data)->holder);
 		sentry->single_param = param;
-			
+		
 		val = gda_holder_get_value (param);
 		default_val = gda_holder_get_default_value (param);
 		nnul = gda_holder_get_not_null (param);
@@ -802,10 +880,7 @@ create_entry_widget (SingleEntry *sentry)
 		/* label */
 		gchar *title;
 		gchar *str;
-		g_object_get (G_OBJECT (param), "name", &title, NULL);
-		if (!title)
-			title = g_strdup (_("Value"));
-		str = g_strdup_printf ("%s:", title);
+		str = create_text_label_for_sentry (sentry, &title);
 		sentry->label = gtk_label_new (str);
 		g_free (str);
 		g_object_ref_sink (sentry->label);
@@ -849,32 +924,8 @@ create_entry_widget (SingleEntry *sentry)
 		/* label */
 		gchar *title = NULL;
 		gchar *str;
-		GSList *params;
-
-		str = g_object_get_data (G_OBJECT (group->group->nodes_source->data_model), "name");
-		if (str)
-			title = g_strdup (str);
-		else {
-			GString *tstring = NULL;
-			for (params = sentry->group->group->nodes; params; params = params->next) {
-				g_object_get (G_OBJECT (GDA_SET_NODE (params->data)->holder),
-					      "name", &title, NULL);
-				if (title) {
-					if (tstring) 
-						g_string_append (tstring, ",\n");
-					else
-						tstring = g_string_new ("");
-					g_string_append (tstring, title);
-				}
-			}
-			if (tstring)
-				title = g_string_free (tstring, FALSE);
-		}
-
-		if (!title)
-			title = g_strdup (_("Value"));
 
-		str = g_strdup_printf ("%s:", title);
+		str = create_text_label_for_sentry (sentry, &title);
 		sentry->label = gtk_label_new (str);
 		g_free (str);
 		g_object_ref_sink (sentry->label);
@@ -940,6 +991,7 @@ create_entries (GdauiBasicForm *form)
 
 		sentry = g_new0 (SingleEntry, 1);
 		sentry->form = form;
+		sentry->forward_param_updates = TRUE;
 		form->priv->s_entries = g_slist_append (form->priv->s_entries, sentry);
 
 		sentry->group = GDAUI_SET_GROUP (list->data);
@@ -1304,7 +1356,7 @@ entry_contents_modified (GdauiDataEntry *entry, SingleEntry *sentry)
 	if (param) { /* single parameter */
 		GValue *value;
 
-		sentry->form->priv->forward_param_updates = FALSE;
+		sentry->forward_param_updates = FALSE;
 
 		/* parameter's value */
 		value = gdaui_data_entry_get_value (entry);
@@ -1329,7 +1381,7 @@ entry_contents_modified (GdauiDataEntry *entry, SingleEntry *sentry)
 						  sentry->entry_contents_modified_id);
 		}
 		gda_value_free (value);
-		sentry->form->priv->forward_param_updates = TRUE;
+		sentry->forward_param_updates = TRUE;
 	}
 	else { /* multiple parameters */
 		GSList *params;
@@ -1352,14 +1404,14 @@ entry_contents_modified (GdauiDataEntry *entry, SingleEntry *sentry)
 			 *   and emit only one signal.
 			 */
 			GdaHolder *param;
-			sentry->form->priv->forward_param_updates = FALSE;
+			sentry->forward_param_updates = FALSE;
 
 			/* parameter's value */
 			param = GDA_SET_NODE (params->data)->holder;
 			gda_holder_set_value (param, (GValue *)(list->data), NULL);
 			g_signal_emit (G_OBJECT (sentry->form), gdaui_basic_form_signals[HOLDER_CHANGED],
 				       0, param, TRUE);
-			sentry->form->priv->forward_param_updates = TRUE;
+			sentry->forward_param_updates = TRUE;
 		}
 		g_slist_free (values);
 
@@ -1403,7 +1455,7 @@ entry_expand_changed_cb (GdauiDataEntry *entry, SingleEntry *sentry)
 
 /*
  * Called when a parameter changes
- * We emit a "holder-changed" signal only if the 'form->priv->forward_param_updates' is TRUE, which means
+ * We emit a "holder-changed" signal only if the 'sentry->forward_param_updates' is TRUE, which means
  * the param change does not come from a GdauiDataEntry change.
  */
 static void
@@ -1413,7 +1465,7 @@ parameter_changed_cb (GdaHolder *param, SingleEntry *sentry)
 	GdauiDataEntry *entry;
 
 	entry = sentry->entry;
-	if (sentry->form->priv->forward_param_updates) {
+	if (sentry->forward_param_updates) {
 		gboolean param_valid;
 		gboolean default_if_invalid = FALSE;
 
@@ -1666,7 +1718,7 @@ gdaui_basic_form_reset (GdauiBasicForm *form)
  * gdaui_basic_form_entry_set_visible
  * @form: a #GdauiBasicForm widget
  * @param: a #GdaHolder object
- * @show:
+ * @show: set to %TRUE to show the data entry, and to %FALSE to hide it
  *
  * Shows or hides the #GdauiDataEntry in @form which corresponds to the
  * @param parameter
@@ -1750,23 +1802,23 @@ gdaui_basic_form_entry_grab_focus (GdauiBasicForm *form, GdaHolder *param)
 /**
  * gdaui_basic_form_entry_set_editable
  * @form: a #GdauiBasicForm widget
- * @param: a #GdaHolder object; or %NULL
+ * @holder: a #GdaHolder object; or %NULL
  * @editable: %TRUE if corresponding data entry must be editable
  *
  * Sets the #GdauiDataEntry in @form which corresponds to the
- * @param parameter editable or not. If @param is %NULL, then all the parameters
+ * @holder parameter editable or not. If @holder is %NULL, then all the parameters
  * are concerned.
  *
  * Since: 4.2
  */
 void
-gdaui_basic_form_entry_set_editable (GdauiBasicForm *form, GdaHolder *param, gboolean editable)
+gdaui_basic_form_entry_set_editable (GdauiBasicForm *form, GdaHolder *holder, gboolean editable)
 {
 	g_return_if_fail (GDAUI_IS_BASIC_FORM (form));
 
-	if (param) {
+	if (holder) {
 		SingleEntry *sentry;
-		sentry = get_single_entry_for_holder (form, param);
+		sentry = get_single_entry_for_holder (form, holder);
 		if (sentry)
 			gdaui_data_entry_set_editable (sentry->entry, editable);
 	}
@@ -2079,7 +2131,8 @@ gdaui_basic_form_set_layout_from_file (GdauiBasicForm *form, const gchar *file_n
  * @form: a #GdauiBasicForm
  * @placeholder_id: the name of the requested place holder
  *
- * Retreives a pointer to a place holder widget
+ * Retreives a pointer to a place holder widget. This feature is only available if a specific
+ * layout has been defined for @form using gdaui_basic_form_set_layout_from_file().
  *
  * Returns: a pointer to the requested place holder, or %NULL if not found
  *
diff --git a/libgda-ui/gdaui-combo.c b/libgda-ui/gdaui-combo.c
index ee13485..b3549b9 100644
--- a/libgda-ui/gdaui-combo.c
+++ b/libgda-ui/gdaui-combo.c
@@ -627,7 +627,7 @@ _gdaui_combo_get_selected_ext (GdauiCombo *combo, gint n_cols, gint *cols_index)
 /**
  * gdaui_combo_add_null
  * @combo: a #GdauiCombo widget
- * @add_undef_choice:
+ * @add_null: set to %TRUE to add a NULL value to the combo box
  *
  * Tells if @combo should add a special entry representing an "undefined choice", as a %NULL entry. The default is
  * that only the available choices in @combo's model are presented.
diff --git a/libgda-ui/gdaui-data-entry.c b/libgda-ui/gdaui-data-entry.c
index bb5cc41..7c00024 100644
--- a/libgda-ui/gdaui-data-entry.c
+++ b/libgda-ui/gdaui-data-entry.c
@@ -132,7 +132,7 @@ gdaui_data_entry_iface_init (gpointer g_class)
 /**
  * gdaui_data_entry_set_value_type
  * @de: a #GtkWidget object which implements the #GdauiDataEntry interface
- * @type:
+ * @type: the #GType of the data to be displayed
  *
  * Sets the type of value the GdauiDataEntry will handle. The type must be compatible with what
  * the widget can handle.
diff --git a/libgda-ui/gdaui-data-proxy.c b/libgda-ui/gdaui-data-proxy.c
index aa44bea..6c4d2f9 100644
--- a/libgda-ui/gdaui-data-proxy.c
+++ b/libgda-ui/gdaui-data-proxy.c
@@ -104,7 +104,7 @@ gdaui_data_proxy_get_proxy (GdauiDataProxy *iface)
  * gdaui_data_proxy_column_set_editable
  * @iface: an object which implements the #GdauiDataProxy interface
  * @column: column number of the data
- * @editable:
+ * @editable: set to %TRUE to make the column editable
  *
  * Sets if the data entry in the @iface widget at @column (in the data model @iface operates on)
  * can be edited or not.
@@ -250,7 +250,7 @@ gdaui_data_proxy_perform_action (GdauiDataProxy *iface, GdauiAction action)
 /**
  * gdaui_data_proxy_set_write_mode
  * @iface: an object which implements the #GdauiDataProxy interface
- * @mode:
+ * @mode: the requested #GdauiDataProxyWriteMode mode
  *
  * Specifies the way the modifications stored in the #GdaDataProxy used internally by @iface are written back to
  * the #GdaDataModel which holds the data displayed in @iface.
diff --git a/libgda-ui/gdaui-data-store.c b/libgda-ui/gdaui-data-store.c
index 4dd6934..5c8cd94 100644
--- a/libgda-ui/gdaui-data-store.c
+++ b/libgda-ui/gdaui-data-store.c
@@ -348,7 +348,7 @@ gdaui_data_store_new (GdaDataModel *model)
  * gdaui_data_store_set_value
  * @store: a #GdauiDataStore object
  * @iter: the considered row
- * @col:
+ * @col: the data model column
  * @value: the value to store (gets copied)
  *
  * Stores a value in the @store data model.
diff --git a/libgda-ui/gdaui-login.c b/libgda-ui/gdaui-login.c
index a30e5d9..8cce938 100644
--- a/libgda-ui/gdaui-login.c
+++ b/libgda-ui/gdaui-login.c
@@ -659,6 +659,13 @@ gdaui_login_set_connection_information (GdauiLogin *login, const GdaDsnInfo *cin
 			/* force switch to */
 			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (login->priv->rb_dsn), FALSE);
 		}
+		g_signal_handlers_block_by_func (login->priv->prov_selector,
+						 G_CALLBACK (prov_entry_changed_cb), login);
+		gdaui_provider_selector_set_provider (GDAUI_PROVIDER_SELECTOR (login->priv->prov_selector),
+		                                      cinfo->provider);
+		g_signal_handlers_unblock_by_func (login->priv->prov_selector,
+						   G_CALLBACK (prov_entry_changed_cb), login);
+
 		_gdaui_provider_spec_editor_set_provider (GDAUI_PROVIDER_SPEC_EDITOR (login->priv->cnc_params_editor),
 							  cinfo->provider);
 		_gdaui_provider_spec_editor_set_specs (GDAUI_PROVIDER_SPEC_EDITOR (login->priv->cnc_params_editor),
diff --git a/libgda-ui/gdaui-raw-grid.c b/libgda-ui/gdaui-raw-grid.c
index 2192fbb..0d110c5 100644
--- a/libgda-ui/gdaui-raw-grid.c
+++ b/libgda-ui/gdaui-raw-grid.c
@@ -362,6 +362,7 @@ gdaui_raw_grid_init (GdauiRawGrid *grid)
 	gtk_tree_view_set_enable_search (GTK_TREE_VIEW (tree_view), TRUE);
 	g_signal_connect (G_OBJECT (tree_view), "event",
 			  G_CALLBACK (tree_view_event_cb), grid);
+	_gdaui_setup_right_click_selection_on_treeview (tree_view);
 	g_signal_connect (G_OBJECT (tree_view), "button-press-event",
                           G_CALLBACK (tree_view_popup_button_pressed_cb), grid);
 	gtk_tree_view_set_enable_search (tree_view, FALSE);
@@ -1719,15 +1720,6 @@ tree_view_popup_button_pressed_cb (GtkWidget *widget, GdkEventButton *event, Gda
 	selection = gtk_tree_view_get_selection (tree_view);
 	sel_mode = gtk_tree_selection_get_mode (selection);
 
-	/* force selection of row on which clicked occurred */
-	GtkTreePath *path;
-	if ((event->window == gtk_tree_view_get_bin_window (tree_view)) &&
-	    gtk_tree_view_get_path_at_pos (tree_view, event->x, event->y, &path, NULL, NULL, NULL)) {
-		gtk_tree_selection_unselect_all (selection);
-		gtk_tree_selection_select_path (selection, path);
-		gtk_tree_path_free (path);
-	}
-
 	/* create the menu */
 	menu = gtk_menu_new ();
 	if (sel_mode == GTK_SELECTION_MULTIPLE)
diff --git a/libgda-ui/gdaui-server-operation.c b/libgda-ui/gdaui-server-operation.c
index 9e9bde5..305da32 100644
--- a/libgda-ui/gdaui-server-operation.c
+++ b/libgda-ui/gdaui-server-operation.c
@@ -1263,7 +1263,7 @@ create_table_proxy_row_inserted_cb (GdaDataProxy *proxy, gint row, GdauiServerOp
 	GdaHolder *holder;
 	GdaServerProvider *prov;
 	GdaConnection *cnc;
-	gchar *type = NULL;
+	const gchar *type = NULL;
 
 	iter = gda_data_model_create_iter (GDA_DATA_MODEL (proxy));
 	gda_data_model_iter_move_to_row (iter, row);
diff --git a/libgda-ui/internal/gdaui-provider-auth-editor.c b/libgda-ui/internal/gdaui-provider-auth-editor.c
index ef4262f..3dd414b 100644
--- a/libgda-ui/internal/gdaui-provider-auth-editor.c
+++ b/libgda-ui/internal/gdaui-provider-auth-editor.c
@@ -206,7 +206,7 @@ _gdaui_provider_auth_editor_get_type (void)
  *
  * Creates a new #GdauiProviderAuthEditor widget
  *
- * Returns:
+ * Returns: a new widget
  */
 GtkWidget *
 _gdaui_provider_auth_editor_new (const gchar *provider)
diff --git a/libgda-ui/internal/gdaui-provider-spec-editor.c b/libgda-ui/internal/gdaui-provider-spec-editor.c
index 4738010..3960c13 100644
--- a/libgda-ui/internal/gdaui-provider-spec-editor.c
+++ b/libgda-ui/internal/gdaui-provider-spec-editor.c
@@ -482,7 +482,7 @@ _gdaui_provider_spec_editor_get_specs (GdauiProviderSpecEditor *spec)
 /**
  * _gdaui_provider_spec_editor_set_specs
  * @spec: a #GdauiProviderSpecEditor widget
- * @specs_string: 
+ * @specs_string: the connection string
  *
  * Sets the connection string to be displayed in the widget
  */
diff --git a/libgda-ui/internal/utility.c b/libgda-ui/internal/utility.c
index b761d41..0058ad8 100644
--- a/libgda-ui/internal/utility.c
+++ b/libgda-ui/internal/utility.c
@@ -452,7 +452,7 @@ create_data_error_dialog (GdauiDataProxy *form, gboolean with_question, gboolean
 
 /**
  * _gdaui_utility_display_error_with_keep_or_discard_choice
- * @form:
+ * @form: a #GdauiDataProxy
  * @filled_error: a #GError containing the error to display
  *
  * Displays a dialog showing @filled_error's message and asks the user to either keep the data which
@@ -481,7 +481,7 @@ _gdaui_utility_display_error_with_keep_or_discard_choice (GdauiDataProxy *form,
 
 /**
  * _gdaui_utility_display_error
- * @form:
+ * @form: a #GdauiDataProxy
  * @filled_error: a #GError containing the error to display
  *
  * Displays a dialog showing @filled_error's message and asks the user to either keep the data which
@@ -580,3 +580,51 @@ _gdaui_utility_iter_differ (GdaDataModelIter *iter1, GdaDataModelIter *iter2)
  out:
         return retval;
 }
+
+
+static gboolean tree_view_button_pressed_cb (GtkWidget *widget, GdkEventButton *event, gpointer unuseddata);
+/*
+ * Setup a callback on the treeview to, on right click:
+ *   - if there is no row under the cursor, then force an empty selection
+ *   OR
+ *   - if the row under the cursor is not selected, then force the selection of only that row
+ *   OR
+ *   - otherwise don't change anything
+ */
+void
+_gdaui_setup_right_click_selection_on_treeview (GtkTreeView *tview)
+{
+	g_return_if_fail (GTK_IS_TREE_VIEW (tview));
+	g_signal_connect (G_OBJECT (tview), "button-press-event",
+                          G_CALLBACK (tree_view_button_pressed_cb), NULL);
+}
+
+static gboolean
+tree_view_button_pressed_cb (GtkWidget *widget, GdkEventButton *event, gpointer unuseddata)
+{
+	GtkTreeView *tree_view;
+	GtkTreeSelection *selection;
+
+	if (event->button != 3)
+		return FALSE;
+
+	tree_view = GTK_TREE_VIEW (widget);
+	selection = gtk_tree_view_get_selection (tree_view);
+
+	/* force selection of row on which clicked occurred */
+	if (event->window == gtk_tree_view_get_bin_window (tree_view)) {
+		GtkTreePath *path;
+		if (gtk_tree_view_get_path_at_pos (tree_view, event->x, event->y, &path,
+						   NULL, NULL, NULL)) {
+			if (! gtk_tree_selection_path_is_selected (selection, path)) {
+				gtk_tree_selection_unselect_all (selection);
+				gtk_tree_selection_select_path (selection, path);
+			}
+			gtk_tree_path_free (path);
+		}
+		else
+			gtk_tree_selection_unselect_all (selection);
+	}
+
+	return FALSE;
+}
diff --git a/libgda-ui/internal/utility.h b/libgda-ui/internal/utility.h
index 88b6d22..7d2de09 100644
--- a/libgda-ui/internal/utility.h
+++ b/libgda-ui/internal/utility.h
@@ -58,3 +58,8 @@ void             _gdaui_utility_show_error (GtkWindow *parent, const gchar *form
  * Misc
  */
 gboolean         _gdaui_utility_iter_differ (GdaDataModelIter *iter1, GdaDataModelIter *iter2);
+
+/*
+ * Handle selection and right click on treeviews
+ */
+void             _gdaui_setup_right_click_selection_on_treeview (GtkTreeView *tview);
diff --git a/libgda-xslt/sql_backend.c b/libgda-xslt/sql_backend.c
index 41319a2..08ff6c7 100644
--- a/libgda-xslt/sql_backend.c
+++ b/libgda-xslt/sql_backend.c
@@ -191,7 +191,7 @@ gda_xslt_bk_fun_getnodeset (xmlChar * set, GdaXsltExCont * exec,
 #ifdef GDA_DEBUG_NO
 	printf ("running function:gda_xslt_bk_fun_getnodeset\n");
 #endif
-	res = get_resultset_nodeset (pdata, set, &nodeset, &(exec->error));
+	res = get_resultset_nodeset (pdata, (gchar*) set, &nodeset, &(exec->error));
 	if (res < 0 || nodeset == NULL) {
 		xsltGenericError (xsltGenericErrorContext,
 				  "gda_xslt_bk_fun_getnodeset error\n");
@@ -325,7 +325,7 @@ get_resultset_col_value (GdaXsltIntCont * pdata, const char *resultset_name,
 		return -1;
 	}
 	gchar *gvalue_string;
-	gvalue_string = value_to_xmlchar (db_value);
+	gvalue_string = (gchar*) value_to_xmlchar (db_value);
 	if (gvalue_string == NULL) {
 #ifdef GDA_DEBUG_NO
 		g_print ("faild to stringify gvalue");
@@ -510,7 +510,7 @@ gda_xslt_bk_internal_query (GdaXsltExCont * exec, GdaXsltIntCont * pdata,
 		return -1;
 	}
 
-	look_predefined_query_by_name (exec, query_name, &(query));
+	look_predefined_query_by_name (exec, (gchar*) query_name, &(query));
 	if (!query) {
 		/* the query is not predefined */
 		/* get the xml text node with the sql */
@@ -526,7 +526,7 @@ gda_xslt_bk_internal_query (GdaXsltExCont * exec, GdaXsltIntCont * pdata,
 		/* create the query */
 		GdaSqlParser *parser;
 		parser = gda_connection_create_parser (exec->cnc);
-		query = gda_sql_parser_parse_string (parser, XML_GET_CONTENT (sqltxt_node), NULL, &(exec->error));
+		query = gda_sql_parser_parse_string (parser, (gchar*) XML_GET_CONTENT (sqltxt_node), NULL, &(exec->error));
 		g_object_unref (parser);
 		if (!query) {
 #ifdef GDA_DEBUG_NO
diff --git a/libgda-xslt/sql_exslt_internal.c b/libgda-xslt/sql_exslt_internal.c
index e0be9d7..9cc796e 100644
--- a/libgda-xslt/sql_exslt_internal.c
+++ b/libgda-xslt/sql_exslt_internal.c
@@ -53,7 +53,7 @@ gda_xslt_extension_init (xsltTransformContextPtr ctxt, const xmlChar * URI)
 #ifdef GDA_DEBUG_NO
 	g_print ("gda_xslt_extension_init");
 #endif
-	if (!URI || strcmp (URI, GDA_XSLT_EXTENSION_URI)) {
+	if (!URI || strcmp ((gchar*) URI, GDA_XSLT_EXTENSION_URI)) {
 #ifdef GDA_DEBUG_NO
 		g_print ("called for another URI, exit");
 #endif
@@ -136,7 +136,7 @@ gda_xslt_getnodeset_function (xmlXPathParserContextPtr ctxt, int nargs)
 	}
 	execc = (GdaXsltExCont *) tctxt->_private;
 	data = (GdaXsltIntCont *) xsltGetExtData (tctxt,
-						  GDA_XSLT_EXTENSION_URI);
+						  BAD_CAST GDA_XSLT_EXTENSION_URI);
 	if (data == NULL) {
 		xsltGenericError (xsltGenericErrorContext,
 				  "sqlxslt: failed to get module data\n");
@@ -189,7 +189,7 @@ gda_xslt_checkif_function (xmlXPathParserContextPtr ctxt, int nargs)
 	}
 	execc = (GdaXsltExCont *) tctxt->_private;
 	data = (GdaXsltIntCont *) xsltGetExtData (tctxt,
-						  GDA_XSLT_EXTENSION_URI);
+						  BAD_CAST GDA_XSLT_EXTENSION_URI);
 	if (data == NULL || execc == NULL) {
 		xsltGenericError (xsltGenericErrorContext,
 				  "gda_xslt_checkif_function: failed to get module internal data\n");
@@ -255,7 +255,7 @@ gda_xslt_getvalue_function (xmlXPathParserContextPtr ctxt, int nargs)
 
 	execc = (GdaXsltExCont *) tctxt->_private;
 	data = (GdaXsltIntCont *) xsltGetExtData (tctxt,
-						  GDA_XSLT_EXTENSION_URI);
+						  BAD_CAST GDA_XSLT_EXTENSION_URI);
 	if (data == NULL || execc == NULL) {
 		xsltGenericError (xsltGenericErrorContext,
 				  "gda_xslt_getvalue_function: failed to get module internal data\n");
@@ -322,7 +322,7 @@ gda_xslt_getxmlvalue_function (xmlXPathParserContextPtr ctxt, int nargs)
 
 	execc = (GdaXsltExCont *) tctxt->_private;
 	data = (GdaXsltIntCont *) xsltGetExtData (tctxt,
-						  GDA_XSLT_EXTENSION_URI);
+						  BAD_CAST GDA_XSLT_EXTENSION_URI);
 	if (data == NULL || execc == NULL) {
 		xsltGenericError (xsltGenericErrorContext,
 				  "gda_xslt_getxmlvalue_function: failed to get module internal data\n");
@@ -387,7 +387,7 @@ gda_xslt_section_element (xsltTransformContextPtr tctxt,
 
 	execc = (GdaXsltExCont *) tctxt->_private;
 	data = (GdaXsltIntCont *) xsltGetExtData (tctxt,
-						  GDA_XSLT_EXTENSION_URI);
+						  BAD_CAST GDA_XSLT_EXTENSION_URI);
 	if (data == NULL || execc == NULL) {
 		xsltGenericError (xsltGenericErrorContext,
 				  "gda_xslt_section_element: failed to get module internal data\n");
diff --git a/libgda-xslt/sqlexslt.c b/libgda-xslt/sqlexslt.c
index 3e18cdd..0c6cca8 100644
--- a/libgda-xslt/sqlexslt.c
+++ b/libgda-xslt/sqlexslt.c
@@ -49,7 +49,7 @@ gda_xslt_register (void)
 		int init_res;
 		init = 1;
 		init_res =
-			xsltRegisterExtModule (GDA_XSLT_EXTENSION_URI,
+			xsltRegisterExtModule (BAD_CAST GDA_XSLT_EXTENSION_URI,
 					       gda_xslt_extension_init,
 					       gda_xslt_extension_shutdown);
 		if (init_res != 0) {
@@ -74,13 +74,15 @@ gda_xslt_set_execution_context (xsltTransformContextPtr tcxt,
 
 /**
  * gda_xslt_create_context_simple
+ * @cnc: a #GdaConnection
+ * @error: a place to store errors, or %NULL
  *
- *  create a gda-xslt context with the Gdaconnection and not predefined queries
+ * create a gda-xslt context with the Gdaconnection and not predefined queries
  *
  * Returns:
  */
 GdaXsltExCont *
-gda_xslt_create_context_simple (GdaConnection * cnc, GError ** error)
+gda_xslt_create_context_simple (GdaConnection *cnc, GError **error)
 {
 	GdaXsltExCont *local = NULL;
 
diff --git a/libgda/Makefile.am b/libgda/Makefile.am
index 158efe9..401aa61 100644
--- a/libgda/Makefile.am
+++ b/libgda/Makefile.am
@@ -337,8 +337,6 @@ handlers = \
 	handlers/gda-handler-type.c
 
 introspection_sources = $(gda_sources) \
-	gda-types.c \
-	gda-types.h \
 	$(gda_headers) \
 	$(psupport) \
 	$(threadwrapper) \
diff --git a/libgda/gda-config.c b/libgda/gda-config.c
index f91a3af..2304c01 100644
--- a/libgda/gda-config.c
+++ b/libgda/gda-config.c
@@ -849,7 +849,9 @@ password_stored_cb (GnomeKeyringResult res, const gchar *dsnname)
  * @info: a pointer to a filled GdaDsnInfo structure
  * @error: a place to store errors, or %NULL
  *
- * Add or update a DSN from the definition in @info
+ * Add or update a DSN from the definition in @info.
+ *
+ * This method may fail with a %GDA_CONFIG_ERROR domain error (see the #GdaConfigError error codes).
  *
  * Returns: TRUE if no error occurred
  */
@@ -969,7 +971,9 @@ password_deleted_cb (GnomeKeyringResult res, const gchar *dsnname)
  * @dsn_name: the name of the DSN to remove
  * @error: a place to store errors, or %NULL
  *
- * Remove the DSN named @dsn_name
+ * Remove the DSN named @dsn_name.
+ *
+ * This method may fail with a %GDA_CONFIG_ERROR domain error (see the #GdaConfigError error codes).
  *
  * Returns: TRUE if no error occurred
  */
@@ -1229,6 +1233,8 @@ gda_config_get_provider_info (const gchar *provider_name)
  * provider named @provider_name. The caller must not call g_object_unref() on the
  * returned object.
  *
+ * This method may fail with a %GDA_CONFIG_ERROR domain error (see the #GdaConfigError error codes).
+ *
  * Returns: (transfer none): a pointer to the #GdaServerProvider, or %NULL if an error occurred
  */
 GdaServerProvider *
diff --git a/libgda/gda-connection.c b/libgda/gda-connection.c
index 1ea8d0b..0193270 100644
--- a/libgda/gda-connection.c
+++ b/libgda/gda-connection.c
@@ -939,6 +939,9 @@ _gda_connection_get_internal_thread_provider (void)
  * provider (use gda_config_get_provider_info() to get it). Also one can use the "gda-sql-5.0 -L" command to 
  * list the possible named parameters.
  *
+ * 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.
  */
 GdaConnection *
@@ -1088,7 +1091,10 @@ gda_connection_open_from_dsn (const gchar *dsn, const gchar *auth_string,
  * Additionally, it is possible to have the connection string
  * respect the "&lt;provider_name&gt;://&lt;real cnc string&gt;" format, in which case the provider name
  * and the real connection string will be extracted from that string (note that if @provider_name
- * is not %NULL then it will still be used as the provider ID).
+ * is not %NULL then it will still be used as the provider ID).\
+ *
+ * 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.
  */
diff --git a/libgda/gda-data-model.c b/libgda/gda-data-model.c
index edd90e9..72ca57e 100644
--- a/libgda/gda-data-model.c
+++ b/libgda/gda-data-model.c
@@ -900,7 +900,7 @@ gda_data_model_remove_row (GdaDataModel *model, gint row, GError **error)
 /**
  * gda_data_model_get_row_from_values:
  * @model: a #GdaDataModel object.
- * @values: (element-type Gobject.Value): a list of #GValue values (no %NULL is allowed)
+ * @values: (element-type GObject.Value): a list of #GValue values (no %NULL is allowed)
  * @cols_index: (array): an array of #gint containing the column number to match each value of @values
  *
  * Returns the first row where all the values in @values at the columns identified at
diff --git a/libgda/gda-holder.h b/libgda/gda-holder.h
index 1c47d97..3ead1a6 100644
--- a/libgda/gda-holder.h
+++ b/libgda/gda-holder.h
@@ -59,6 +59,7 @@ struct _GdaHolderClass
 	GError                  *(*validate_change)  (GdaHolder *holder, const GValue *new_value);
 	void                     (*att_changed)      (GdaHolder *holder, const gchar *att_name, const GValue *att_value);
 
+	/*< private >*/
 	/* Padding for future expansion */
 	void (*_gda_reserved1) (void);
 	void (*_gda_reserved2) (void);
diff --git a/libgda/gda-meta-store.c b/libgda/gda-meta-store.c
index b24d471..a390663 100644
--- a/libgda/gda-meta-store.c
+++ b/libgda/gda-meta-store.c
@@ -1446,7 +1446,7 @@ create_table_object (GdaMetaStoreClass *klass, GdaMetaStore *store, xmlNodePtr n
                         ust->fields_list = g_slist_append (ust->fields_list, field);
 
 			/* SQL identifier ? */
-#define MAX_IDENT_IN_TABLE 10
+#define MAX_IDENT_IN_TABLE 11
 			xstr = xmlGetProp (cnode, BAD_CAST "ident");
                         if (xstr) {
                                 if ((*xstr == 'T') || (*xstr == 't')) {
diff --git a/libgda/gda-meta-struct-io.c b/libgda/gda-meta-struct-io.c
index 400067b..d966db8 100644
--- a/libgda/gda-meta-struct-io.c
+++ b/libgda/gda-meta-struct-io.c
@@ -31,8 +31,10 @@
 
 static GdaMetaDbObject *create_table_object (GdaMetaStruct *mstruct, const GValue *catalog, const gchar *quoted_catalog,
 					     const GValue *schema, const gchar *quoted_schema, xmlNodePtr node, GError **error);
+/*
 static GdaMetaDbObject *create_view_object (GdaMetaStruct *mstruct, const GValue *catalog, const gchar *quoted_catalog,
 					    const GValue *schema, const gchar *quoted_schema, xmlNodePtr node, GError **error);
+*/
 
 
 
@@ -394,6 +396,7 @@ create_table_object (GdaMetaStruct *mstruct, const GValue *catalog, const gchar
 	return NULL;
 }
 
+/*
 static GdaMetaDbObject *
 create_view_object (GdaMetaStruct *mstruct, const GValue *catalog, const gchar *quoted_catalog,
 		    const GValue *schema, const gchar *quoted_schema, xmlNodePtr node, GError **error)
@@ -401,4 +404,5 @@ create_view_object (GdaMetaStruct *mstruct, const GValue *catalog, const gchar *
 	TO_IMPLEMENT;
 	return NULL;
 }
+*/
 
diff --git a/libgda/gda-set.c b/libgda/gda-set.c
index 0e81fd2..b232e6b 100644
--- a/libgda/gda-set.c
+++ b/libgda/gda-set.c
@@ -977,9 +977,8 @@ gda_set_remove_holder (GdaSet *set, GdaHolder *holder)
 		g_signal_handlers_disconnect_by_func (G_OBJECT (holder),
 						      G_CALLBACK (att_holder_changed_cb), set);
 	}
-	if (gda_holder_get_g_type (holder) == GDA_TYPE_NULL)
-		g_signal_handlers_disconnect_by_func (holder,
-						      G_CALLBACK (holder_notify_cb), set);
+	g_signal_handlers_disconnect_by_func (holder,
+					      G_CALLBACK (holder_notify_cb), set);
 
 	/* now destroy the GdaSetNode and the GdaSetSource if necessary */
 	node = gda_set_get_node (set, holder);
@@ -1255,10 +1254,30 @@ holder_notify_cb (GdaHolder *holder, GParamSpec *pspec, GdaSet *dataset)
 {
 	GType gtype;
 	gtype = gda_holder_get_g_type (holder);
-	g_assert (gtype != GDA_TYPE_NULL);
-	g_signal_handlers_disconnect_by_func (holder,
-					      G_CALLBACK (holder_notify_cb), dataset);
-	g_signal_emit (dataset, gda_set_signals[HOLDER_TYPE_SET], 0, holder);
+	if (!strcmp (pspec->name, "g-type")) {
+		g_assert (gtype != GDA_TYPE_NULL);
+		g_signal_emit (dataset, gda_set_signals[HOLDER_TYPE_SET], 0, holder);
+	}
+	else if (!strcmp (pspec->name, "name")) {
+#ifdef GDA_DEBUG_signal
+	g_print (">> 'HOLDER_ATTR_CHANGED' from %s\n", __FUNCTION__);
+#endif
+	g_signal_emit (G_OBJECT (dataset), gda_set_signals[HOLDER_ATTR_CHANGED], 0, holder,
+		       GDA_ATTRIBUTE_NAME, gda_holder_get_attribute (holder, GDA_ATTRIBUTE_NAME));
+#ifdef GDA_DEBUG_signal
+	g_print ("<< 'HOLDER_ATTR_CHANGED' from %s\n", __FUNCTION__);
+#endif
+	}
+	else if (!strcmp (pspec->name, "description")) {
+#ifdef GDA_DEBUG_signal
+	g_print (">> 'HOLDER_ATTR_CHANGED' from %s\n", __FUNCTION__);
+#endif
+	g_signal_emit (G_OBJECT (dataset), gda_set_signals[HOLDER_ATTR_CHANGED], 0, holder,
+		       GDA_ATTRIBUTE_DESCRIPTION, gda_holder_get_attribute (holder, GDA_ATTRIBUTE_DESCRIPTION));
+#ifdef GDA_DEBUG_signal
+	g_print ("<< 'HOLDER_ATTR_CHANGED' from %s\n", __FUNCTION__);
+#endif
+	}
 }
 
 static gboolean
@@ -1300,7 +1319,10 @@ gda_set_real_add_holder (GdaSet *set, GdaHolder *holder)
 		if (gda_holder_get_g_type (holder) == GDA_TYPE_NULL)
 			g_signal_connect (G_OBJECT (holder), "notify::g-type",
 					  G_CALLBACK (holder_notify_cb), set);
-
+		g_signal_connect (G_OBJECT (holder), "notify::name",
+				  G_CALLBACK (holder_notify_cb), set);
+		g_signal_connect (G_OBJECT (holder), "notify::description",
+				  G_CALLBACK (holder_notify_cb), set);
 		return TRUE;
 	}
 	else if (similar == holder)
diff --git a/libgda/gda-sql-builder.c b/libgda/gda-sql-builder.c
index 8806bfb..a1fe8c5 100644
--- a/libgda/gda-sql-builder.c
+++ b/libgda/gda-sql-builder.c
@@ -61,14 +61,6 @@ struct _GdaSqlBuilderPrivate {
 /* get a pointer to the parents to be able to call their destructor */
 static GObjectClass *parent_class = NULL;
 
-/* signals */
-enum {
-	DUMMY,
-	LAST_SIGNAL
-};
-
-static gint gda_sql_builder_signals[LAST_SIGNAL] = { 0 };
-
 /* properties */
 enum {
 	PROP_0,
diff --git a/libgda/gda-tree-manager.c b/libgda/gda-tree-manager.c
index 57194ee..f10c32c 100644
--- a/libgda/gda-tree-manager.c
+++ b/libgda/gda-tree-manager.c
@@ -52,13 +52,6 @@ static void gda_tree_manager_get_property (GObject *object,
 					   GValue *value,
 					   GParamSpec *pspec);
 
-enum {
-	DUMMY,
-	LAST_SIGNAL
-};
-
-static gint gda_tree_manager_signals[LAST_SIGNAL] = { 0 };
-
 /* properties */
 enum {
 	PROP_0,
diff --git a/libgda/gda-util.c b/libgda/gda-util.c
index 2ecb247..2e1e970 100644
--- a/libgda/gda-util.c
+++ b/libgda/gda-util.c
@@ -326,7 +326,7 @@ gda_utility_check_data_model (GdaDataModel *model, gint nbcols, ...)
  * @nb_cols: the number of columns in @cols
  * @rows: an array containing which rows of @model will be exported, or %NULL for all rows
  * @nb_rows: the number of rows in @rows
- * @use_col_ids:
+ * @use_col_ids: set to %TRUE to add column ID information
  *
  * Dump the data in a #GdaDataModel into a xmlNodePtr (as used in libxml).
  *
@@ -512,7 +512,7 @@ gda_utility_data_model_find_column_description (GdaDataSelect *model, const gcha
 
 /**
  * gda_utility_holder_load_attributes
- * @holder:
+ * @holder: a #GdaHolder
  * @node: an xmlNodePtr with a &lt;parameter&gt; tag
  * @sources: a list of #GdaDataModel
  * @error: a place to store errors, or %NULL
@@ -686,7 +686,7 @@ gda_utility_holder_load_attributes (GdaHolder *holder, xmlNodePtr node, GSList *
 #define GDA_PARAM_ENCODE_TOKEN "__gda"
 /**
  * gda_text_to_alphanum
- * @text:
+ * @text: the text to convert
  *
  * The "encoding" consists in replacing non
  * alphanumeric character with the string "__gdaXX" where XX is the hex. representation
@@ -2392,6 +2392,26 @@ gda_dsn_split (const gchar *string, gchar **out_dsn, gchar **out_username, gchar
  * in @string, the various parts are strings
  * which are expected to be encoded using an RFC 1738 compliant encoding. If they are specified, 
  * the returned provider, username and password strings are correctly decoded.
+ *
+ * For example all the following connection strings:
+ * <programlisting><![CDATA[
+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]]></programlisting>
+ *
+ * will return the following new strings (double quotes added here to delimit strings):
+ * <programlisting><![CDATA[
+out_cnc_params: "DB_NAME=mydb;HOST=server"
+out_provider: "PostgreSQL"
+out_username: "meme"
+out_password: "pass"]]></programlisting>
  */
 void
 gda_connection_string_split (const gchar *string, gchar **out_cnc_params, gchar **out_provider, 
@@ -2440,6 +2460,46 @@ gda_connection_string_split (const gchar *string, gchar **out_cnc_params, gchar
 	if (!*out_cnc_params)
 		*out_cnc_params = g_strdup (ap);
 
+	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 = 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;
+		}
+	}
+
 	/* RFC 1738 decode provider, username and password strings */
 	gda_rfc1738_decode (*out_provider);
 	gda_rfc1738_decode (*out_username);
diff --git a/libgda/handlers/gda-handler-time.c b/libgda/handlers/gda-handler-time.c
index 6dc3bbd..a164395 100644
--- a/libgda/handlers/gda-handler-time.c
+++ b/libgda/handlers/gda-handler-time.c
@@ -312,7 +312,7 @@ handler_compute_locale (GdaHandlerTime *hdl)
 	
 	/* computations */
 	if (!error) {
-#ifdef GDA_DEBUG
+#ifdef GDA_DEBUG_NO
 		gchar *strings[3];
 #endif
 		gint i;
diff --git a/libgda/information_schema.xml b/libgda/information_schema.xml
index 31f10f5..edcc051 100644
--- a/libgda/information_schema.xml
+++ b/libgda/information_schema.xml
@@ -40,11 +40,11 @@
   </table>
 
   <table name="_information_schema_catalog_name" descr="Name of the current database (current catalog), has only one row">
-    <column name="catalog_name" pkey="TRUE"/>
+    <column name="catalog_name" pkey="TRUE" ident="TRUE"/>
   </table>
 
   <table name="_schemata" descr="List of schemas">
-    <column name="catalog_name" pkey="TRUE" descr="Name of the catalog that contains the schema"/>
+    <column name="catalog_name" pkey="TRUE" ident="TRUE" descr="Name of the catalog that contains the schema"/>
     <column name="schema_name" pkey="TRUE" ident="TRUE"/>
     <column name="schema_owner" nullok="TRUE" descr="Name of the schema"/>
     <column name="schema_internal" type="boolean"  descr="Tells if the schema is specific to the database implementation (and usually can't be modified)"/>
@@ -66,7 +66,7 @@
   </table>
 
   <table name="_udt" descr="User defined data types">
-    <column name="udt_catalog" pkey="TRUE" descr="Name of the catalog that contains the data type"/>
+    <column name="udt_catalog" pkey="TRUE" ident="TRUE" descr="Name of the catalog that contains the data type"/>
     <column name="udt_schema" pkey="TRUE" descr="Name of the schema that contains the data type" ident="TRUE"/>
     <column name="udt_name" pkey="TRUE" descr="Name of the data type" ident="TRUE"/>
     <column name="udt_gtype" nullok="TRUE" descr="GType associated to the data type"/>
@@ -85,7 +85,7 @@
   </table>
 
   <table name="_udt_columns" descr="List of components for a user defined data type for composed data types (such as a complex number data type which has real and imaginary parts)">
-    <column name="udt_catalog" pkey="TRUE" descr="Name of the catalog that contains the user defined data type for which the column is"/>
+    <column name="udt_catalog" pkey="TRUE" descr="Name of the catalog that contains the user defined data type for which the column is" ident="TRUE"/>
     <column name="udt_schema" pkey="TRUE" descr="Name of the schema that contains the user defined data type for which the column is" ident="TRUE"/>
     <column name="udt_name" pkey="TRUE" descr="Name of the user defined data type for which the column is" ident="TRUE"/>
     <column name="udt_column" pkey="TRUE" descr="Name of the column (part)" ident="TRUE"/>
@@ -119,7 +119,7 @@
   </table>
 
   <table name="_enums" descr="List of possible enumeration labels for enumerations">
-    <column name="udt_catalog" pkey="TRUE" descr="Name of the catalog that contains the ENUM user defined data type"/>
+    <column name="udt_catalog" pkey="TRUE" descr="Name of the catalog that contains the ENUM user defined data type" ident="TRUE"/>
     <column name="udt_schema" pkey="TRUE" descr="Name of the schema that contains the ENUM user defined data type" ident="TRUE"/>
     <column name="udt_name" pkey="TRUE" descr="Name of the ENUM user defined data type" ident="TRUE"/>
     <column name="label" pkey="TRUE"/>
@@ -133,7 +133,7 @@
 
   <table name="_element_types" descr="Array specific attributes for array data types">
     <column name="specific_name" pkey="TRUE" descr="No specific meaning, used as a primary key, and for joining"/>
-    <column name="object_catalog" descr="Name of the catalog that contains the object that uses the array being described"/>
+    <column name="object_catalog" descr="Name of the catalog that contains the object that uses the array being described" ident="TRUE"/>
     <column name="object_schema" descr="Name of the schema that contains the object that uses the array being described" ident="TRUE"/>
     <column name="object_name" descr="Name of the object that uses the array being described" ident="TRUE"/>
     <column name="object_type" descr="The type of the object that uses the array being described TABLE_COL, DOMAIN, UDT_COL, ROUTINE_COL, ROUTINE_PAR"/>
@@ -144,7 +144,7 @@
   </table>
 
   <table name="_domains" descr="List of domains">
-    <column name="domain_catalog" pkey="TRUE" descr="Name of catalog that contains the domain"/>
+    <column name="domain_catalog" pkey="TRUE" descr="Name of catalog that contains the domain" ident="TRUE"/>
     <column name="domain_schema" pkey="TRUE" descr="Name of schema that contains the domain" ident="TRUE"/>
     <column name="domain_name" pkey="TRUE" descr="Name of the domain" ident="TRUE"/>
     <column name="data_type" nullok="TRUE" descr="Data type of the domain (if the domain is an array, then 'array_spec' is set, and this may be NULL)"/>
@@ -152,10 +152,10 @@
     <column name="domain_gtype"/>
     <column name="character_maximum_length" type="gint" nullok="TRUE"/>
     <column name="character_octet_length" type="gint" nullok="TRUE"/>
-    <column name="collation_catalog" nullok="TRUE" descr="Name of catalog that contains the associated collation"/>
+    <column name="collation_catalog" nullok="TRUE" descr="Name of catalog that contains the associated collation" ident="TRUE"/>
     <column name="collation_schema" nullok="TRUE" descr="Name of schema that contains the associated collation" ident="TRUE"/>
     <column name="collation_name" nullok="TRUE" descr="Name of the associated collation" ident="TRUE"/>
-    <column name="character_set_catalog" nullok="TRUE" descr="Name of catalog that contains the associated character set"/>
+    <column name="character_set_catalog" nullok="TRUE" descr="Name of catalog that contains the associated character set" ident="TRUE"/>
     <column name="character_set_schema" nullok="TRUE" descr="Name of schema that contains the associated character set" ident="TRUE"/>
     <column name="character_set_name" nullok="TRUE" descr="Name of the associated character set" ident="TRUE"/>
     <column name="numeric_precision" type="gint" nullok="TRUE"/>
@@ -184,7 +184,7 @@
   </table>
 
   <table name="_tables" descr="List of tables (tables, views or other objects which can contain data)">
-    <column name="table_catalog" pkey="TRUE" descr="Name of catalog that contains the table"/>
+    <column name="table_catalog" pkey="TRUE" descr="Name of catalog that contains the table" ident="TRUE"/>
     <column name="table_schema" pkey="TRUE" descr="Name of schema that contains the table" ident="TRUE"/>
     <column name="table_name" pkey="TRUE" descr="Name of the table" ident="TRUE"/>
     <column name="table_type" descr="Type of table: BASE TABLE, VIEW, LOCAL TEMPORARY, SYSTEM TABLE, GLOBAL TEMPORARY, ALIAS or SYNONYM"/>
@@ -203,7 +203,7 @@
   </table>
 
   <table name="_views" descr="List of views and their specific information">
-    <column name="table_catalog" pkey="TRUE" descr="Name of catalog that contains the view"/>
+    <column name="table_catalog" pkey="TRUE" descr="Name of catalog that contains the view" ident="TRUE"/>
     <column name="table_schema" pkey="TRUE" descr="Name of schema that contains the view" ident="TRUE"/>
     <column name="table_name" pkey="TRUE" descr="Name of the view" ident="TRUE"/>
     <column name="view_definition" nullok="TRUE" descr="View as SQL"/>
@@ -217,7 +217,7 @@
   </table>
 
   <table name="_collations" descr="List of collations methods">
-    <column name="collation_catalog" pkey="TRUE"/>
+    <column name="collation_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="collation_schema" pkey="TRUE" ident="TRUE"/>
     <column name="collation_name" pkey="TRUE" ident="TRUE"/>
     <column name="collation_comments" nullok="TRUE"/>
@@ -233,7 +233,7 @@
   </table>
 
   <table name="_character_sets" descr="List of character sets">
-    <column name="character_set_catalog" pkey="TRUE"/>
+    <column name="character_set_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="character_set_schema" pkey="TRUE" ident="TRUE"/>
     <column name="character_set_name" pkey="TRUE" ident="TRUE"/>
     <column name="default_collate_catalog" nullok="TRUE"/>
@@ -257,7 +257,7 @@
   </table>
 
   <table name="_routines" descr="List of functions and stored procedures (note: the primary jey for that table is composed of (specific_catalog, specific_schema, specific_name))">
-    <column name="specific_catalog" pkey="TRUE" descr="Specific name of catalog that contains the routine"/>
+    <column name="specific_catalog" pkey="TRUE" descr="Specific name of catalog that contains the routine" ident="TRUE"/>
     <column name="specific_schema" pkey="TRUE" descr="Specific name of schema that contains the routine" ident="TRUE"/>
     <column name="specific_name" pkey="TRUE" descr="Specific name of the routine (may be mangled for polymorphic routines)"/>
     <column name="routine_catalog" nullok="TRUE" descr="Name of catalog that contains the routine (may be NULL)"/>
@@ -289,11 +289,11 @@
   </table>
 
   <table name="_triggers" descr="List of triggers">
-    <column name="trigger_catalog" pkey="TRUE"/>
+    <column name="trigger_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="trigger_schema" pkey="TRUE" ident="TRUE"/>
     <column name="trigger_name" pkey="TRUE" ident="TRUE"/>
     <column name="event_manipulation" pkey="TRUE" descr="Event that fires the trigger (INSERT, UPDATE, or DELETE)"/>
-    <column name="event_object_catalog" pkey="TRUE" descr="Name of the database that contains the table that the trigger is defined on"/>
+    <column name="event_object_catalog" pkey="TRUE" descr="Name of the database that contains the table that the trigger is defined on" ident="TRUE"/>
     <column name="event_object_schema" pkey="TRUE" descr="Name of the schema that contains the table that the trigger is defined on" ident="TRUE"/>
     <column name="event_object_table" pkey="TRUE" descr="Name of the table that the trigger is defined on" ident="TRUE"/>
 
@@ -318,7 +318,7 @@
   </table>
 
   <table name="_columns" descr="List of columns composing tables">
-    <column name="table_catalog" pkey="TRUE"/>
+    <column name="table_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="table_schema" pkey="TRUE" ident="TRUE"/>
     <column name="table_name" pkey="TRUE" ident="TRUE"/>
     <column name="column_name" pkey="TRUE" ident="TRUE"/>
@@ -333,10 +333,10 @@
     <column name="numeric_precision" type="gint" nullok="TRUE" descr="If data_type identifies a numeric type, this column contains the precision of the type for this column (the number of significant digits)"/>
     <column name="numeric_scale" type="gint" nullok="TRUE" descr="If data_type identifies an exact numeric type, this column contains the scale of the type for this column (the number of significant digits to the right of the decimal point)"/>
     <column name="datetime_precision" type="gint" nullok="TRUE"/>
-    <column name="character_set_catalog" nullok="TRUE"/>
+    <column name="character_set_catalog" nullok="TRUE" ident="TRUE"/>
     <column name="character_set_schema" nullok="TRUE" ident="TRUE"/>
     <column name="character_set_name" nullok="TRUE" ident="TRUE"/>
-    <column name="collation_catalog" nullok="TRUE"/>
+    <column name="collation_catalog" nullok="TRUE" ident="TRUE"/>
     <column name="collation_schema" nullok="TRUE" ident="TRUE"/>
     <column name="collation_name" nullok="TRUE" ident="TRUE"/>
     <column name="extra" nullok="TRUE" descr="CSV string with: AUTO_INCREMENT"/> <!-- set the gda-enums.h file -->
@@ -368,11 +368,11 @@
   </table>
 
   <table name="_table_constraints" descr="List of constraints applied to tables (Check, primary or foreign key, or unique constraints)">
-    <column name="constraint_catalog" nullok="TRUE" descr="Name of the catalog that contains the constraint"/>
+    <column name="constraint_catalog" nullok="TRUE" descr="Name of the catalog that contains the constraint" ident="TRUE"/>
     <column name="constraint_schema" nullok="TRUE" descr="Name of the schema that contains the constraint" ident="TRUE"/>
 
     <column name="constraint_name" pkey="TRUE" ident="TRUE"/>
-    <column name="table_catalog" pkey="TRUE"/>
+    <column name="table_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="table_schema" pkey="TRUE" ident="TRUE"/>
     <column name="table_name" pkey="TRUE" ident="TRUE"/>
     <column name="constraint_type" descr="CHECK, FOREIGN KEY, PRIMARY KEY or UNIQUE"/>
@@ -387,12 +387,12 @@
   </table>
 
   <table name="_referential_constraints" descr="List of foreign key constraints, along with some specific attributes">
-    <column name="table_catalog" pkey="TRUE"/>
+    <column name="table_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="table_schema" pkey="TRUE" ident="TRUE"/>
     <column name="table_name" pkey="TRUE" ident="TRUE"/>
     <column name="constraint_name" pkey="TRUE" ident="TRUE"/>
 
-    <column name="ref_table_catalog"/>
+    <column name="ref_table_catalog" ident="TRUE"/>
     <column name="ref_table_schema" ident="TRUE"/>
     <column name="ref_table_name" ident="TRUE"/>
     <column name="ref_constraint_name" ident="TRUE"/>
@@ -415,7 +415,7 @@
   </table>
 
   <table name="_key_column_usage" descr="List of primary key constraints and the name of the tables' columns involved">
-    <column name="table_catalog" pkey="TRUE"/>
+    <column name="table_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="table_schema" pkey="TRUE" ident="TRUE"/>
     <column name="table_name" pkey="TRUE" ident="TRUE"/>
     <column name="constraint_name" pkey="TRUE" ident="TRUE"/>
@@ -436,7 +436,7 @@
   </table>
 
   <table name="_check_column_usage" descr="List of check constraints and the name of the tables' columns involved">
-    <column name="table_catalog" pkey="TRUE"/>
+    <column name="table_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="table_schema" pkey="TRUE" ident="TRUE"/>
     <column name="table_name" pkey="TRUE" ident="TRUE"/>
     <column name="constraint_name" pkey="TRUE" ident="TRUE"/>
@@ -456,10 +456,10 @@
   </table>
 
   <table name="_view_column_usage" descr="List of the tables' columns involved in a view">
-    <column name="view_catalog" pkey="TRUE"/>
+    <column name="view_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="view_schema" pkey="TRUE" ident="TRUE"/>
     <column name="view_name" pkey="TRUE" ident="TRUE"/>
-    <column name="table_catalog" pkey="TRUE"/>
+    <column name="table_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="table_schema" pkey="TRUE" ident="TRUE"/>
     <column name="table_name" pkey="TRUE" ident="TRUE"/>
     <column name="column_name" pkey="TRUE" ident="TRUE"/>
@@ -477,11 +477,11 @@
   </table>
 
   <table name="_domain_constraints" descr="List of constraints applicable to domains">
-    <column name="constraint_catalog" nullok="TRUE" descr="Name of the catalog that contains the constraint"/>
+    <column name="constraint_catalog" nullok="TRUE" descr="Name of the catalog that contains the constraint" ident="TRUE"/>
     <column name="constraint_schema" nullok="TRUE" descr="Name of the schema that contains the constraint" ident="TRUE"/>
 
     <column name="constraint_name" pkey="TRUE" ident="TRUE"/>
-    <column name="domain_catalog" pkey="TRUE"/>
+    <column name="domain_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="domain_schema" pkey="TRUE" ident="TRUE"/>
     <column name="domain_name" pkey="TRUE" ident="TRUE"/>
 
@@ -500,7 +500,7 @@
   </table>
 
   <table name="_parameters" descr="List of routines' (functions and stored procedures) parameters (may not contain data for some routines which accept any type of parameter)">
-    <column name="specific_catalog" pkey="TRUE"/>
+    <column name="specific_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="specific_schema" pkey="TRUE" ident="TRUE"/>
     <column name="specific_name" pkey="TRUE"/>
     <column name="ordinal_position" type="gint" pkey="TRUE"/>
@@ -524,7 +524,7 @@
   </table>
 
   <table name="_routine_columns" descr="List of routines' (functions and stored procedures) returned values' parts (columns) for routines returning composed values">
-    <column name="specific_catalog" pkey="TRUE"/>
+    <column name="specific_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="specific_schema" pkey="TRUE" ident="TRUE"/>
     <column name="specific_name" pkey="TRUE"/>
     <column name="column_name" pkey="TRUE" ident="TRUE"/>
@@ -547,10 +547,10 @@
   </table>
 
   <table name="_table_indexes" descr="List of tables' indexes which do not relate to primary keys">
-    <column name="index_catalog" nullok="TRUE" descr="Name of the catalog that contains the index"/>
+    <column name="index_catalog" nullok="TRUE" descr="Name of the catalog that contains the index" ident="TRUE"/>
     <column name="index_schema" nullok="TRUE" descr="Name of the schema that contains the index" ident="TRUE"/>
     <column name="index_name" pkey="TRUE" ident="TRUE"/>
-    <column name="table_catalog" pkey="TRUE"/>
+    <column name="table_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="table_schema" pkey="TRUE" ident="TRUE"/>
     <column name="table_name" pkey="TRUE" ident="TRUE"/>
     <column name="is_unique" type="boolean" descr="" nullok="TRUE"/>
@@ -567,10 +567,10 @@
   </table>
 
   <table name="_index_column_usage" descr="List of the tables' columns involved in an index listed in the _table_indexes table">
-    <column name="index_catalog" nullok="TRUE"/>
+    <column name="index_catalog" nullok="TRUE" ident="TRUE"/>
     <column name="index_schema" nullok="TRUE" ident="TRUE"/>
     <column name="index_name" pkey="TRUE" ident="TRUE"/>
-    <column name="table_catalog" pkey="TRUE"/>
+    <column name="table_catalog" pkey="TRUE" ident="TRUE"/>
     <column name="table_schema" pkey="TRUE" ident="TRUE"/>
     <column name="table_name" pkey="TRUE" ident="TRUE"/>
     <column name="column_name" pkey="TRUE" nullok="TRUE" ident="TRUE"/>
diff --git a/libgda/libgda.symbols b/libgda/libgda.symbols
index 7bde6d0..4ed91b2 100644
--- a/libgda/libgda.symbols
+++ b/libgda/libgda.symbols
@@ -711,6 +711,7 @@
 	gda_sql_statement_check_clean
 	gda_sql_statement_check_structure
 	gda_sql_statement_check_validity
+	gda_sql_statement_check_validity_m
 	gda_sql_statement_compound_set_type
 	gda_sql_statement_compound_take_stmt
 	gda_sql_statement_compound_type_get_type
diff --git a/libgda/sql-parser/gda-sql-parser.c b/libgda/sql-parser/gda-sql-parser.c
index b593f8e..49577bc 100644
--- a/libgda/sql-parser/gda-sql-parser.c
+++ b/libgda/sql-parser/gda-sql-parser.c
@@ -1378,7 +1378,7 @@ getToken (GdaSqlParser *parser)
 						retval = token_as_string (parser->priv->context->next_token_start, consumed_chars);
 						/* remove comments from returned string */
 						gchar *tmp, *ptr;
-						tmp = g_value_get_string (retval);
+						tmp = (gchar*) g_value_get_string (retval);
 						for (ptr = tmp; *ptr; ptr++) {
 							if (((ptr == tmp) || (*(ptr-1) == '\n')) && (*ptr == '-') && (ptr[1] == '-')) {
 								/* we have a comment */
diff --git a/libgda/sql-parser/gda-statement-struct.c b/libgda/sql-parser/gda-statement-struct.c
index 48866d9..aea1658 100644
--- a/libgda/sql-parser/gda-statement-struct.c
+++ b/libgda/sql-parser/gda-statement-struct.c
@@ -355,6 +355,60 @@ gda_sql_statement_check_validity (GdaSqlStatement *stmt, GdaConnection *cnc, GEr
 		return TRUE;
 }
 
+/**
+ * gda_sql_statement_check_validity_m
+ * @stmt: a #GdaSqlStatement pointer
+ * @mstruct: a #GdaMetaStruct object, or %NULL
+ * @error: a place to store errors, or %NULL
+ *
+ * If @mstruct is not %NULL, then checks that all the database objects referenced in the statement i
+ * actually referenced in @mstruct
+ *  (for example the table being updated in a UPDATE statement must exist in the
+ * connection's database for the check to succeed).
+ * This method sets the @stmt-&gt;validity_meta_struct attribute to @mstruct.
+ *
+ * If @mstruct is %NULL, then remove any information from a previous call to this method stored in @stmt. In this case,
+ * the @stmt-&gt;validity_meta_struct attribute is cleared.
+ *
+ * Also note that some parts of @stmt may be modified: for example leading and trailing spaces in aliases or
+ * objects names will be removed.
+ *
+ * Returns: TRUE if no error occurred
+ *
+ * Since: 4.2
+ */
+gboolean
+gda_sql_statement_check_validity_m (GdaSqlStatement *stmt, GdaMetaStruct *mstruct, GError **error)
+{
+	g_return_val_if_fail (stmt, FALSE);
+	g_return_val_if_fail (!mstruct || GDA_IS_META_STRUCT (mstruct), FALSE);
+
+	/* check the structure first */
+	if (!gda_sql_statement_check_structure (stmt, error))
+		return FALSE;
+
+	/* clear any previous setting */
+	gda_sql_statement_check_clean (stmt);
+
+	if (mstruct) {
+		GdaSqlStatementCheckValidityData data;
+		gboolean retval;
+
+		/* prepare data */
+		data.cnc = NULL;
+		data.store = NULL;
+		data.mstruct = g_object_ref (mstruct);
+
+		/* attach the GdaMetaStruct to @stmt */
+		stmt->validity_meta_struct = data.mstruct;
+		retval = gda_sql_any_part_foreach (GDA_SQL_ANY_PART (stmt->contents),
+						   (GdaSqlForeachFunc) foreach_check_validity, &data, error);
+		return retval;
+	}
+	else
+		return TRUE;
+}
+
 static gboolean
 foreach_check_validity (GdaSqlAnyPart *node, GdaSqlStatementCheckValidityData *data, GError **error)
 {
@@ -516,8 +570,6 @@ gda_sql_field_check_validity (GdaSqlField *field, GdaSqlStatementCheckValidityDa
 	if (!field) return TRUE;
 	_gda_sql_field_check_clean (field);
 
-	if (!data->cnc) return TRUE;
-
 	for (any = GDA_SQL_ANY_PART(field)->parent;
 	     any && (any->type != GDA_SQL_ANY_STMT_INSERT) && (any->type != GDA_SQL_ANY_STMT_UPDATE);
 	     any = any->parent);
@@ -706,37 +758,41 @@ gda_sql_select_field_check_validity (GdaSqlSelectField *field, GdaSqlStatementCh
 			return FALSE;
 		}
 
-		for (targets = ((GdaSqlStatementSelect *)any)->from->targets; targets; targets = targets->next) {
-			GdaSqlSelectTarget *target = (GdaSqlSelectTarget *) targets->data;
-			if (!target->validity_meta_object &&
-			    !gda_sql_select_target_check_validity (target, data, error))
-				return FALSE;
-
-			g_value_set_string (g_value_init (&value, G_TYPE_STRING), field->field_name);
-			tcol = gda_meta_struct_get_table_column (data->mstruct,
-								 GDA_META_TABLE (target->validity_meta_object),
-								 &value);
-			g_value_unset (&value);
-			if (tcol) {
-				/* found a candidate */
-				if (dbo) {
-					g_set_error (error, GDA_SQL_ERROR, GDA_SQL_VALIDATION_ERROR,
-						     _("Could not identify table for field '%s'"), field->field_name);
+		if (((GdaSqlStatementSelect *)any)->from) {
+			for (targets = ((GdaSqlStatementSelect *)any)->from->targets;
+			     targets;
+			     targets = targets->next) {
+				GdaSqlSelectTarget *target = (GdaSqlSelectTarget *) targets->data;
+				if (!target->validity_meta_object &&
+				    !gda_sql_select_target_check_validity (target, data, error))
 					return FALSE;
+				
+				g_value_set_string (g_value_init (&value, G_TYPE_STRING), field->field_name);
+				tcol = gda_meta_struct_get_table_column (data->mstruct,
+									 GDA_META_TABLE (target->validity_meta_object),
+									 &value);
+				g_value_unset (&value);
+				if (tcol) {
+					/* found a candidate */
+					if (dbo) {
+						g_set_error (error, GDA_SQL_ERROR, GDA_SQL_VALIDATION_ERROR,
+							     _("Could not identify table for field '%s'"), field->field_name);
+						return FALSE;
+					}
+					dbo = target->validity_meta_object;
 				}
-				dbo = target->validity_meta_object;
+			}
+			if (!dbo) {
+				targets = ((GdaSqlStatementSelect *)any)->from->targets;
+				if (starred_field && targets && !targets->next)
+					/* only one target => it's the one */
+					dbo = ((GdaSqlSelectTarget*) targets->data)->validity_meta_object;
 			}
 		}
 		if (!dbo) {
-			targets = ((GdaSqlStatementSelect *)any)->from->targets;
-			if (starred_field && targets && !targets->next)
-				/* only one target => it's the one */
-				dbo = ((GdaSqlSelectTarget*) targets->data)->validity_meta_object;
-			else {
-				g_set_error (error, GDA_SQL_ERROR, GDA_SQL_VALIDATION_ERROR,
-					     _("Could not identify table for field '%s'"), field->field_name);
-				return FALSE;
-			}
+			g_set_error (error, GDA_SQL_ERROR, GDA_SQL_VALIDATION_ERROR,
+				     _("Could not identify table for field '%s'"), field->field_name);
+			return FALSE;
 		}
 		field->validity_meta_object = dbo;
 		field->validity_meta_table_column = tcol;
diff --git a/libgda/sql-parser/gda-statement-struct.h b/libgda/sql-parser/gda-statement-struct.h
index 0510477..4a45003 100644
--- a/libgda/sql-parser/gda-statement-struct.h
+++ b/libgda/sql-parser/gda-statement-struct.h
@@ -51,6 +51,10 @@ GdaSqlStatementType          gda_sql_statement_string_to_type (const gchar *type
 
 gboolean                     gda_sql_statement_check_structure (GdaSqlStatement *stmt, GError **error);
 gboolean                     gda_sql_statement_check_validity  (GdaSqlStatement *stmt, GdaConnection *cnc, GError **error);
+gboolean                     gda_sql_statement_check_validity_m (GdaSqlStatement *stmt,
+								 GdaMetaStruct *mstruct,
+								 GError **error);
+
 void                         gda_sql_statement_check_clean     (GdaSqlStatement *stmt);
 gboolean                     gda_sql_statement_normalize       (GdaSqlStatement *stmt, GdaConnection *cnc, GError **error);
 
diff --git a/libgda/sqlite/gda-sqlite-meta.c b/libgda/sqlite/gda-sqlite-meta.c
index 8fe13fa..3925ab5 100644
--- a/libgda/sqlite/gda-sqlite-meta.c
+++ b/libgda/sqlite/gda-sqlite-meta.c
@@ -2109,6 +2109,7 @@ _gda_sqlite_meta__routines (GdaServerProvider *prov, GdaConnection *cnc,
 	return _gda_sqlite_meta_routines (prov, cnc, store, context, error, NULL, NULL, NULL);
 }
 
+#ifndef HAVE_SQLITE
 static gboolean
 fill_routines (GdaDataModel *mod_model, 
 	       const GValue *rname, const GValue *is_agg, const GValue *rnargs, const GValue *sname, GError **error)
@@ -2148,6 +2149,7 @@ fill_routines (GdaDataModel *mod_model,
 
 	return retval;
 }
+#endif
 
 gboolean
 _gda_sqlite_meta_routines (GdaServerProvider *prov, GdaConnection *cnc, 
diff --git a/libgda/sqlite/gda-symbols-util.c b/libgda/sqlite/gda-symbols-util.c
index 98e8457..1da7dcc 100644
--- a/libgda/sqlite/gda-symbols-util.c
+++ b/libgda/sqlite/gda-symbols-util.c
@@ -21,7 +21,7 @@
  */
 
 #include <glib/gi18n-lib.h>
-#include <libgda.h>
+#include <libgda/libgda.h>
 #include "gda-symbols-util.h"
 
 Sqlite3ApiRoutines *s3r = NULL;
diff --git a/libgda/sqlite/sqlite-src/PragmasPatch b/libgda/sqlite/sqlite-src/PragmasPatch
index 11136f4..e39d49c 100644
--- a/libgda/sqlite/sqlite-src/PragmasPatch
+++ b/libgda/sqlite/sqlite-src/PragmasPatch
@@ -1,6 +1,6 @@
---- sqlite3.c.orig	2010-08-04 18:07:48.000000000 +0200
-+++ sqlite3.c	2010-08-04 19:31:59.000000000 +0200
-@@ -84217,6 +84217,60 @@
+--- sqlite3.c.orig	2010-08-24 00:56:03.000000000 +0200
++++ sqlite3.c	2010-09-01 15:59:28.000000000 +0200
+@@ -85120,6 +85120,60 @@
  
  #ifndef SQLITE_OMIT_SCHEMA_PRAGMAS
    /*
diff --git a/libgda/sqlite/sqlite-src/sqlite3.c b/libgda/sqlite/sqlite-src/sqlite3.c
index 8df34a2..8ba9cf9 100644
--- a/libgda/sqlite/sqlite-src/sqlite3.c
+++ b/libgda/sqlite/sqlite-src/sqlite3.c
@@ -1,6 +1,6 @@
 /******************************************************************************
 ** This file is an amalgamation of many separate C source files from SQLite
-** version 3.7.0.1.  By combining all the individual C code files into this 
+** version 3.7.2.  By combining all the individual C code files into this 
 ** single large file, the entire code can be compiled as a one translation
 ** unit.  This allows many compilers to do optimizations that would not be
 ** possible if the files were compiled separately.  Performance improvements
@@ -215,20 +215,21 @@
 # define SQLITE_MAX_VARIABLE_NUMBER 999
 #endif
 
-/* Maximum page size.  The upper bound on this value is 32768.  This a limit
-** imposed by the necessity of storing the value in a 2-byte unsigned integer
-** and the fact that the page size must be a power of 2.
+/* Maximum page size.  The upper bound on this value is 65536.  This a limit
+** imposed by the use of 16-bit offsets within each page.
 **
-** If this limit is changed, then the compiled library is technically
-** incompatible with an SQLite library compiled with a different limit. If
-** a process operating on a database with a page-size of 65536 bytes 
-** crashes, then an instance of SQLite compiled with the default page-size 
-** limit will not be able to rollback the aborted transaction. This could
-** lead to database corruption.
+** Earlier versions of SQLite allowed the user to change this value at
+** compile time. This is no longer permitted, on the grounds that it creates
+** a library that is technically incompatible with an SQLite library 
+** compiled with a different limit. If a process operating on a database 
+** with a page-size of 65536 bytes crashes, then an instance of SQLite 
+** compiled with the default page-size limit will not be able to rollback 
+** the aborted transaction. This could lead to database corruption.
 */
-#ifndef SQLITE_MAX_PAGE_SIZE
-# define SQLITE_MAX_PAGE_SIZE 32768
+#ifdef SQLITE_MAX_PAGE_SIZE
+# undef SQLITE_MAX_PAGE_SIZE
 #endif
+#define SQLITE_MAX_PAGE_SIZE 65536
 
 
 /*
@@ -633,7 +634,7 @@ extern "C" {
 **
 ** Since version 3.6.18, SQLite source code has been stored in the
 ** <a href="http://www.fossil-scm.org/";>Fossil configuration management
-** system</a>.  ^The SQLITE_SOURCE_ID macro evalutes to
+** system</a>.  ^The SQLITE_SOURCE_ID macro evaluates to
 ** a string which identifies a particular check-in of SQLite
 ** within its configuration management system.  ^The SQLITE_SOURCE_ID
 ** string contains the date and time of the check-in (UTC) and an SHA1
@@ -643,9 +644,9 @@ extern "C" {
 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
 ** [sqlite_version()] and [sqlite_source_id()].
 */
-#define SQLITE_VERSION        "3.7.0.1"
-#define SQLITE_VERSION_NUMBER 3007000
-#define SQLITE_SOURCE_ID      "2010-08-04 12:31:11 042a1abb030a0711386add7eb6e10832cc8b0f57"
+#define SQLITE_VERSION        "3.7.2"
+#define SQLITE_VERSION_NUMBER 3007002
+#define SQLITE_SOURCE_ID      "2010-08-23 18:52:01 42537b60566f288167f1b5864a5435986838e3a3"
 
 /*
 ** CAPI3REF: Run-Time Library Version Numbers
@@ -690,7 +691,7 @@ SQLITE_API int sqlite3_libversion_number(void);
 ** compile time.  ^The SQLITE_ prefix may be omitted from the 
 ** option name passed to sqlite3_compileoption_used().  
 **
-** ^The sqlite3_compileoption_get() function allows interating
+** ^The sqlite3_compileoption_get() function allows iterating
 ** over the list of options that were defined at compile time by
 ** returning the N-th compile time option string.  ^If N is out of range,
 ** sqlite3_compileoption_get() returns a NULL pointer.  ^The SQLITE_ 
@@ -698,7 +699,7 @@ SQLITE_API int sqlite3_libversion_number(void);
 ** sqlite3_compileoption_get().
 **
 ** ^Support for the diagnostic functions sqlite3_compileoption_used()
-** and sqlite3_compileoption_get() may be omitted by specifing the 
+** and sqlite3_compileoption_get() may be omitted by specifying the 
 ** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time.
 **
 ** See also: SQL functions [sqlite_compileoption_used()] and
@@ -804,7 +805,7 @@ typedef sqlite_uint64 sqlite3_uint64;
 **
 ** ^The sqlite3_close() routine is the destructor for the [sqlite3] object.
 ** ^Calls to sqlite3_close() return SQLITE_OK if the [sqlite3] object is
-** successfullly destroyed and all associated resources are deallocated.
+** successfully destroyed and all associated resources are deallocated.
 **
 ** Applications must [sqlite3_finalize | finalize] all [prepared statements]
 ** and [sqlite3_blob_close | close] all [BLOB handles] associated with
@@ -1231,12 +1232,21 @@ struct sqlite3_io_methods {
 ** is often close.  The underlying VFS might choose to preallocate database
 ** file space based on this hint in order to help writes to the database
 ** file run faster.
+**
+** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS
+** extends and truncates the database file in chunks of a size specified
+** by the user. The fourth argument to [sqlite3_file_control()] should 
+** point to an integer (type int) containing the new chunk-size to use
+** for the nominated database. Allocating database file space in large
+** chunks (say 1MB at a time), may reduce file-system fragmentation and
+** improve performance on some systems.
 */
 #define SQLITE_FCNTL_LOCKSTATE        1
 #define SQLITE_GET_LOCKPROXYFILE      2
 #define SQLITE_SET_LOCKPROXYFILE      3
 #define SQLITE_LAST_ERRNO             4
 #define SQLITE_FCNTL_SIZE_HINT        5
+#define SQLITE_FCNTL_CHUNK_SIZE       6
 
 /*
 ** CAPI3REF: Mutex Handle
@@ -2712,7 +2722,13 @@ SQLITE_API int sqlite3_set_authorizer(
 ** ^The callback function registered by sqlite3_profile() is invoked
 ** as each SQL statement finishes.  ^The profile callback contains
 ** the original statement text and an estimate of wall-clock time
-** of how long that statement took to run.
+** of how long that statement took to run.  ^The profile callback
+** time is in units of nanoseconds, however the current implementation
+** is only capable of millisecond resolution so the six least significant
+** digits in the time are meaningless.  Future versions of SQLite
+** might provide greater resolution on the profiler callback.  The
+** sqlite3_profile() function is considered experimental and is
+** subject to change in future versions of SQLite.
 */
 SQLITE_API void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
 SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*,
@@ -3193,7 +3209,7 @@ typedef struct sqlite3_context sqlite3_context;
 ** </ul>
 **
 ** In the templates above, NNN represents an integer literal,
-** and VVV represents an alphanumeric identifer.)^  ^The values of these
+** and VVV represents an alphanumeric identifier.)^  ^The values of these
 ** parameters (also called "host parameter names" or "SQL parameters")
 ** can be set using the sqlite3_bind_*() routines defined here.
 **
@@ -3972,7 +3988,7 @@ SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*);
 /*
 ** CAPI3REF: Obtain Aggregate Function Context
 **
-** Implementions of aggregate SQL functions use this
+** Implementations of aggregate SQL functions use this
 ** routine to allocate memory for storing their state.
 **
 ** ^The first time the sqlite3_aggregate_context(C,N) routine is called 
@@ -4244,7 +4260,7 @@ SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n);
 **
 ** A pointer to the user supplied routine must be passed as the fifth
 ** argument.  ^If it is NULL, this is the same as deleting the collation
-** sequence (so that SQLite cannot call it anymore).
+** sequence (so that SQLite cannot call it any more).
 ** ^Each time the application supplied function is invoked, it is passed
 ** as its first parameter a copy of the void* passed as the fourth argument
 ** to sqlite3_create_collation() or sqlite3_create_collation16().
@@ -4861,7 +4877,8 @@ struct sqlite3_module {
 ** CAPI3REF: Virtual Table Indexing Information
 ** KEYWORDS: sqlite3_index_info
 **
-** The sqlite3_index_info structure and its substructures is used to
+** The sqlite3_index_info structure and its substructures is used as part
+** of the [virtual table] interface to
 ** pass information into and receive the reply from the [xBestIndex]
 ** method of a [virtual table module].  The fields under **Inputs** are the
 ** inputs to xBestIndex and are read-only.  xBestIndex inserts its
@@ -4869,10 +4886,12 @@ struct sqlite3_module {
 **
 ** ^(The aConstraint[] array records WHERE clause constraints of the form:
 **
-** <pre>column OP expr</pre>
+** <blockquote>column OP expr</blockquote>
 **
 ** where OP is =, &lt;, &lt;=, &gt;, or &gt;=.)^  ^(The particular operator is
-** stored in aConstraint[].op.)^  ^(The index of the column is stored in
+** stored in aConstraint[].op using one of the
+** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^
+** ^(The index of the column is stored in
 ** aConstraint[].iColumn.)^  ^(aConstraint[].usable is TRUE if the
 ** expr on the right-hand side can be evaluated (and thus the constraint
 ** is usable) and false if it cannot.)^
@@ -4932,6 +4951,15 @@ struct sqlite3_index_info {
   int orderByConsumed;       /* True if output is already ordered */
   double estimatedCost;      /* Estimated cost of using this index */
 };
+
+/*
+** CAPI3REF: Virtual Table Constraint Operator Codes
+**
+** These macros defined the allowed values for the
+** [sqlite3_index_info].aConstraint[].op field.  Each value represents
+** an operator that is part of a constraint term in the wHERE clause of
+** a query that uses a [virtual table].
+*/
 #define SQLITE_INDEX_CONSTRAINT_EQ    2
 #define SQLITE_INDEX_CONSTRAINT_GT    4
 #define SQLITE_INDEX_CONSTRAINT_LE    8
@@ -5450,7 +5478,7 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*);
 ** it is passed a NULL pointer).
 **
 ** The xMutexInit() method must be threadsafe.  ^It must be harmless to
-** invoke xMutexInit() mutiple times within the same process and without
+** invoke xMutexInit() multiple times within the same process and without
 ** intervening calls to xMutexEnd().  Second and subsequent calls to
 ** xMutexInit() must be no-ops.
 **
@@ -5620,7 +5648,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
 ** CAPI3REF: SQLite Runtime Status
 **
 ** ^This interface is used to retrieve runtime status information
-** about the preformance of SQLite, and optionally to reset various
+** about the performance of SQLite, and optionally to reset various
 ** highwater marks.  ^The first argument is an integer code for
 ** the specific parameter to measure.  ^(Recognized integer codes
 ** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...].)^
@@ -5672,6 +5700,9 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF
 ** *pHighwater parameter to [sqlite3_status()] is of interest.  
 ** The value written into the *pCurrent parameter is undefined.</dd>)^
 **
+** ^(<dt>SQLITE_STATUS_MALLOC_COUNT</dt>
+** <dd>This parameter records the number of separate memory allocations.</dd>)^
+**
 ** ^(<dt>SQLITE_STATUS_PAGECACHE_USED</dt>
 ** <dd>This parameter returns the number of pages used out of the
 ** [pagecache memory allocator] that was configured using 
@@ -5733,6 +5764,7 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF
 #define SQLITE_STATUS_PARSER_STACK         6
 #define SQLITE_STATUS_PAGECACHE_SIZE       7
 #define SQLITE_STATUS_SCRATCH_SIZE         8
+#define SQLITE_STATUS_MALLOC_COUNT         9
 
 /*
 ** CAPI3REF: Database Connection Status
@@ -5742,7 +5774,7 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF
 ** database connection object to be interrogated.  ^The second argument
 ** is an integer constant, taken from the set of
 ** [SQLITE_DBSTATUS_LOOKASIDE_USED | SQLITE_DBSTATUS_*] macros, that
-** determiness the parameter to interrogate.  The set of 
+** determines the parameter to interrogate.  The set of 
 ** [SQLITE_DBSTATUS_LOOKASIDE_USED | SQLITE_DBSTATUS_*] macros is likely
 ** to grow in future releases of SQLite.
 **
@@ -5772,16 +5804,33 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r
 ** <dd>This parameter returns the number of lookaside memory slots currently
 ** checked out.</dd>)^
 **
-** <dt>SQLITE_DBSTATUS_CACHE_USED</dt>
-** <dd>^This parameter returns the approximate number of of bytes of heap
-** memory used by all pager caches associated with the database connection.
+** ^(<dt>SQLITE_DBSTATUS_CACHE_USED</dt>
+** <dd>This parameter returns the approximate number of of bytes of heap
+** memory used by all pager caches associated with the database connection.)^
 ** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0.
+**
+** ^(<dt>SQLITE_DBSTATUS_SCHEMA_USED</dt>
+** <dd>This parameter returns the approximate number of of bytes of heap
+** memory used to store the schema for all databases associated
+** with the connection - main, temp, and any [ATTACH]-ed databases.)^ 
+** ^The full amount of memory used by the schemas is reported, even if the
+** schema memory is shared with other database connections due to
+** [shared cache mode] being enabled.
+** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0.
+**
+** ^(<dt>SQLITE_DBSTATUS_STMT_USED</dt>
+** <dd>This parameter returns the approximate number of of bytes of heap
+** and lookaside memory used by all prepared statements associated with
+** the database connection.)^
+** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0.
 ** </dd>
 ** </dl>
 */
 #define SQLITE_DBSTATUS_LOOKASIDE_USED     0
 #define SQLITE_DBSTATUS_CACHE_USED         1
-#define SQLITE_DBSTATUS_MAX                1   /* Largest defined DBSTATUS */
+#define SQLITE_DBSTATUS_SCHEMA_USED        2
+#define SQLITE_DBSTATUS_STMT_USED          3
+#define SQLITE_DBSTATUS_MAX                3   /* Largest defined DBSTATUS */
 
 
 /*
@@ -6147,7 +6196,7 @@ typedef struct sqlite3_backup sqlite3_backup;
 **
 ** ^Each call to sqlite3_backup_step() sets two values inside
 ** the [sqlite3_backup] object: the number of pages still to be backed
-** up and the total number of pages in the source databae file.
+** up and the total number of pages in the source database file.
 ** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces
 ** retrieve these two values, respectively.
 **
@@ -6243,7 +6292,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p);
 ** blocked connection already has a registered unlock-notify callback,
 ** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is
 ** called with a NULL pointer as its second argument, then any existing
-** unlock-notify callback is cancelled. ^The blocked connections 
+** unlock-notify callback is canceled. ^The blocked connections 
 ** unlock-notify callback may also be canceled by closing the blocked
 ** connection using [sqlite3_close()].
 **
@@ -6325,7 +6374,7 @@ SQLITE_API int sqlite3_unlock_notify(
 **
 ** ^The [sqlite3_strnicmp()] API allows applications and extensions to
 ** compare the contents of two buffers containing UTF-8 strings in a
-** case-indendent fashion, using the same definition of case independence 
+** case-independent fashion, using the same definition of case independence 
 ** that SQLite uses internally when comparing identifiers.
 */
 SQLITE_API int sqlite3_strnicmp(const char *, const char *, int);
@@ -7259,6 +7308,10 @@ SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int);
 SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*);
 #endif
 
+#ifndef SQLITE_OMIT_WAL
+SQLITE_PRIVATE   int sqlite3BtreeCheckpoint(Btree*);
+#endif
+
 /*
 ** If we are not using shared cache, then there is no need to
 ** use mutexes to access the BtShared structures.  So make the
@@ -7388,8 +7441,8 @@ struct SubProgram {
   int nOp;                      /* Elements in aOp[] */
   int nMem;                     /* Number of memory cells required */
   int nCsr;                     /* Number of cursors required */
-  int nRef;                     /* Number of pointers to this structure */
   void *token;                  /* id that may be used to recursive triggers */
+  SubProgram *pNext;            /* Next sub-program already visited */
 };
 
 /*
@@ -7677,6 +7730,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int);
 SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*);
 SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*);
 SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*);
+SQLITE_PRIVATE void sqlite3VdbeDeleteObject(sqlite3*,Vdbe*);
 SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,int,int,int,int,int,int);
 SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*);
 SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int);
@@ -7694,7 +7748,6 @@ SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*);
 SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, int);
 SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*);
 SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*);
-SQLITE_PRIVATE void sqlite3VdbeProgramDelete(sqlite3 *, SubProgram *, int);
 SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetValue(Vdbe*, int, u8);
 SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe*, int);
 #ifndef SQLITE_OMIT_TRACE
@@ -7705,6 +7758,10 @@ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,
 SQLITE_PRIVATE void sqlite3VdbeDeleteUnpackedRecord(UnpackedRecord*);
 SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*);
 
+#ifndef SQLITE_OMIT_TRIGGER
+SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *);
+#endif
+
 
 #ifndef NDEBUG
 SQLITE_PRIVATE   void sqlite3VdbeComment(Vdbe*, const char*, ...);
@@ -7823,7 +7880,7 @@ SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*);
 
 /* Functions used to configure a Pager object. */
 SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *);
-SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u16*, int);
+SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int);
 SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int);
 SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int);
 SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager*,int,int);
@@ -7850,9 +7907,10 @@ SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *);
 SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *); 
 
 /* Functions used to manage pager transactions and savepoints. */
-SQLITE_PRIVATE int sqlite3PagerPagecount(Pager*, int*);
+SQLITE_PRIVATE void sqlite3PagerPagecount(Pager*, int*);
 SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int);
 SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int);
+SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager*);
 SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager);
 SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*);
 SQLITE_PRIVATE int sqlite3PagerRollback(Pager*);
@@ -8444,14 +8502,6 @@ struct Db {
 
 /*
 ** An instance of the following structure stores a database schema.
-**
-** If there are no virtual tables configured in this schema, the
-** Schema.db variable is set to NULL. After the first virtual table
-** has been added, it is set to point to the database connection 
-** used to create the connection. Once a virtual table has been
-** added to the Schema structure and the Schema.db variable populated, 
-** only that database connection may use the Schema to prepare 
-** statements.
 */
 struct Schema {
   int schema_cookie;   /* Database schema version number for this file */
@@ -8464,9 +8514,6 @@ struct Schema {
   u8 enc;              /* Text encoding used by this database */
   u16 flags;           /* Flags associated with this schema */
   int cache_size;      /* Number of pages to use in the cache */
-#ifndef SQLITE_OMIT_VIRTUALTABLE
-  sqlite3 *db;         /* "Owner" connection. See comment above */
-#endif
 };
 
 /*
@@ -8654,6 +8701,7 @@ struct sqlite3 {
   int nStatement;               /* Number of nested statement-transactions  */
   u8 isTransactionSavepoint;    /* True if the outermost savepoint is a TS */
   i64 nDeferredCons;            /* Net deferred constraints this transaction. */
+  int *pnBytesFreed;            /* If not NULL, increment this in DbFree() */
 
 #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
   /* The following variables are all protected by the STATIC_MASTER 
@@ -9011,7 +9059,6 @@ struct VTable {
 ** of a SELECT statement.
 */
 struct Table {
-  sqlite3 *dbMem;      /* DB connection used for lookaside allocations. */
   char *zName;         /* Name of the table or view */
   int iPKey;           /* If not negative, use aCol[iPKey] as the primary key */
   int nCol;            /* Number of columns in this table */
@@ -9148,9 +9195,9 @@ struct FKey {
 */
 struct KeyInfo {
   sqlite3 *db;        /* The database connection */
-  u8 enc;             /* Text encoding - one of the TEXT_Utf* values */
+  u8 enc;             /* Text encoding - one of the SQLITE_UTF* values */
   u16 nField;         /* Number of entries in aColl[] */
-  u8 *aSortOrder;     /* If defined an aSortOrder[i] is true, sort DESC */
+  u8 *aSortOrder;     /* Sort order for each column.  May be NULL */
   CollSeq *aColl[1];  /* Collating sequence for each term of the key */
 };
 
@@ -10120,7 +10167,7 @@ struct StrAccum {
   int  nAlloc;         /* Amount of space allocated in zText */
   int  mxAlloc;        /* Maximum allowed string length */
   u8   mallocFailed;   /* Becomes true if any memory allocation fails */
-  u8   useMalloc;      /* True if zText is enlargeable using realloc */
+  u8   useMalloc;      /* 0: none,  1: sqlite3DbMalloc,  2: sqlite3_malloc */
   u8   tooBig;         /* Becomes true if string size exceeds limits */
 };
 
@@ -10418,7 +10465,7 @@ SQLITE_PRIVATE   int sqlite3ViewGetColumnNames(Parse*,Table*);
 #endif
 
 SQLITE_PRIVATE void sqlite3DropTable(Parse*, SrcList*, int, int);
-SQLITE_PRIVATE void sqlite3DeleteTable(Table*);
+SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3*, Table*);
 #ifndef SQLITE_OMIT_AUTOINCREMENT
 SQLITE_PRIVATE   void sqlite3AutoincrementBegin(Parse *pParse);
 SQLITE_PRIVATE   void sqlite3AutoincrementEnd(Parse *pParse);
@@ -10652,7 +10699,8 @@ SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse);
 SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char*,int);
 SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char*zName);
 SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr);
-SQLITE_PRIVATE Expr *sqlite3ExprSetColl(Parse *pParse, Expr *, Token *);
+SQLITE_PRIVATE Expr *sqlite3ExprSetColl(Expr*, CollSeq*);
+SQLITE_PRIVATE Expr *sqlite3ExprSetCollByToken(Parse *pParse, Expr*, Token*);
 SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *);
 SQLITE_PRIVATE int sqlite3CheckObjectName(Parse *, const char *);
 SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *, int);
@@ -10702,7 +10750,7 @@ SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*);
 SQLITE_PRIVATE int sqlite3FindDb(sqlite3*, Token*);
 SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *, const char *);
 SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3*,int iDB);
-SQLITE_PRIVATE void sqlite3DeleteIndexSamples(Index*);
+SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3*,Index*);
 SQLITE_PRIVATE void sqlite3DefaultRowEst(Index*);
 SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3*, int);
 SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3*,Expr*,int*,char*);
@@ -10764,7 +10812,7 @@ SQLITE_PRIVATE   int sqlite3Utf8To8(unsigned char*);
 #  define sqlite3VtabUnlock(X)
 #  define sqlite3VtabUnlockList(X)
 #else
-SQLITE_PRIVATE    void sqlite3VtabClear(Table*);
+SQLITE_PRIVATE    void sqlite3VtabClear(sqlite3 *db, Table*);
 SQLITE_PRIVATE    int sqlite3VtabSync(sqlite3 *db, char **);
 SQLITE_PRIVATE    int sqlite3VtabRollback(sqlite3 *db);
 SQLITE_PRIVATE    int sqlite3VtabCommit(sqlite3 *db);
@@ -10817,9 +10865,9 @@ SQLITE_PRIVATE   FKey *sqlite3FkReferences(Table *);
   #define sqlite3FkRequired(a,b,c,d) 0
 #endif
 #ifndef SQLITE_OMIT_FOREIGN_KEY
-SQLITE_PRIVATE   void sqlite3FkDelete(Table*);
+SQLITE_PRIVATE   void sqlite3FkDelete(sqlite3 *, Table*);
 #else
-  #define sqlite3FkDelete(a)
+  #define sqlite3FkDelete(a,b)
 #endif
 
 
@@ -10912,17 +10960,18 @@ SQLITE_PRIVATE void (*sqlite3IoTrace)(const char*,...);
 ** sqlite3MemdebugHasType() returns true if any of the bits in its second
 ** argument match the type set by the previous sqlite3MemdebugSetType().
 ** sqlite3MemdebugHasType() is intended for use inside assert() statements.
-** For example:
 **
-**     assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
+** sqlite3MemdebugNoType() returns true if none of the bits in its second
+** argument match the type set by the previous sqlite3MemdebugSetType().
 **
 ** Perhaps the most important point is the difference between MEMTYPE_HEAP
-** and MEMTYPE_DB.  If an allocation is MEMTYPE_DB, that means it might have
-** been allocated by lookaside, except the allocation was too large or
-** lookaside was already full.  It is important to verify that allocations
-** that might have been satisfied by lookaside are not passed back to 
-** non-lookaside free() routines.  Asserts such as the example above are
-** placed on the non-lookaside free() routines to verify this constraint. 
+** and MEMTYPE_LOOKASIDE.  If an allocation is MEMTYPE_LOOKASIDE, that means
+** it might have been allocated by lookaside, except the allocation was
+** too large or lookaside was already full.  It is important to verify
+** that allocations that might have been satisfied by lookaside are not
+** passed back to non-lookaside free() routines.  Asserts such as the
+** example above are placed on the non-lookaside free() routines to verify
+** this constraint. 
 **
 ** All of this is no-op for a production build.  It only comes into
 ** play when the SQLITE_MEMDEBUG compile-time option is used.
@@ -10930,14 +10979,17 @@ SQLITE_PRIVATE void (*sqlite3IoTrace)(const char*,...);
 #ifdef SQLITE_MEMDEBUG
 SQLITE_PRIVATE   void sqlite3MemdebugSetType(void*,u8);
 SQLITE_PRIVATE   int sqlite3MemdebugHasType(void*,u8);
+SQLITE_PRIVATE   int sqlite3MemdebugNoType(void*,u8);
 #else
 # define sqlite3MemdebugSetType(X,Y)  /* no-op */
 # define sqlite3MemdebugHasType(X,Y)  1
+# define sqlite3MemdebugNoType(X,Y)   1
 #endif
-#define MEMTYPE_HEAP     0x01    /* General heap allocations */
-#define MEMTYPE_DB       0x02    /* Associated with a database connection */
-#define MEMTYPE_SCRATCH  0x04    /* Scratch allocations */
-#define MEMTYPE_PCACHE   0x08    /* Page cache allocations */
+#define MEMTYPE_HEAP       0x01  /* General heap allocations */
+#define MEMTYPE_LOOKASIDE  0x02  /* Might have been lookaside memory */
+#define MEMTYPE_SCRATCH    0x04  /* Scratch allocations */
+#define MEMTYPE_PCACHE     0x08  /* Page cache allocations */
+#define MEMTYPE_DB         0x10  /* Uses sqlite3DbMalloc, not sqlite_malloc */
 
 #endif /* _SQLITEINT_H_ */
 
@@ -11568,14 +11620,438 @@ SQLITE_API const char *sqlite3_compileoption_get(int N){
 ** This module implements the sqlite3_status() interface and related
 ** functionality.
 */
+/************** Include vdbeInt.h in the middle of status.c ******************/
+/************** Begin file vdbeInt.h *****************************************/
+/*
+** 2003 September 6
+**
+** The author disclaims copyright to this source code.  In place of
+** a legal notice, here is a blessing:
+**
+**    May you do good and not evil.
+**    May you find forgiveness for yourself and forgive others.
+**    May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This is the header file for information that is private to the
+** VDBE.  This information used to all be at the top of the single
+** source code file "vdbe.c".  When that file became too big (over
+** 6000 lines long) it was split up into several smaller files and
+** this header information was factored out.
+*/
+#ifndef _VDBEINT_H_
+#define _VDBEINT_H_
+
+/*
+** SQL is translated into a sequence of instructions to be
+** executed by a virtual machine.  Each instruction is an instance
+** of the following structure.
+*/
+typedef struct VdbeOp Op;
+
+/*
+** Boolean values
+*/
+typedef unsigned char Bool;
+
+/*
+** A cursor is a pointer into a single BTree within a database file.
+** The cursor can seek to a BTree entry with a particular key, or
+** loop over all entries of the Btree.  You can also insert new BTree
+** entries or retrieve the key or data from the entry that the cursor
+** is currently pointing to.
+** 
+** Every cursor that the virtual machine has open is represented by an
+** instance of the following structure.
+**
+** If the VdbeCursor.isTriggerRow flag is set it means that this cursor is
+** really a single row that represents the NEW or OLD pseudo-table of
+** a row trigger.  The data for the row is stored in VdbeCursor.pData and
+** the rowid is in VdbeCursor.iKey.
+*/
+struct VdbeCursor {
+  BtCursor *pCursor;    /* The cursor structure of the backend */
+  int iDb;              /* Index of cursor database in db->aDb[] (or -1) */
+  i64 lastRowid;        /* Last rowid from a Next or NextIdx operation */
+  Bool zeroed;          /* True if zeroed out and ready for reuse */
+  Bool rowidIsValid;    /* True if lastRowid is valid */
+  Bool atFirst;         /* True if pointing to first entry */
+  Bool useRandomRowid;  /* Generate new record numbers semi-randomly */
+  Bool nullRow;         /* True if pointing to a row with no data */
+  Bool deferredMoveto;  /* A call to sqlite3BtreeMoveto() is needed */
+  Bool isTable;         /* True if a table requiring integer keys */
+  Bool isIndex;         /* True if an index containing keys only - no data */
+  i64 movetoTarget;     /* Argument to the deferred sqlite3BtreeMoveto() */
+  Btree *pBt;           /* Separate file holding temporary table */
+  int pseudoTableReg;   /* Register holding pseudotable content. */
+  KeyInfo *pKeyInfo;    /* Info about index keys needed by index cursors */
+  int nField;           /* Number of fields in the header */
+  i64 seqCount;         /* Sequence counter */
+  sqlite3_vtab_cursor *pVtabCursor;  /* The cursor for a virtual table */
+  const sqlite3_module *pModule;     /* Module for cursor pVtabCursor */
+
+  /* Result of last sqlite3BtreeMoveto() done by an OP_NotExists or 
+  ** OP_IsUnique opcode on this cursor. */
+  int seekResult;
+
+  /* Cached information about the header for the data record that the
+  ** cursor is currently pointing to.  Only valid if cacheStatus matches
+  ** Vdbe.cacheCtr.  Vdbe.cacheCtr will never take on the value of
+  ** CACHE_STALE and so setting cacheStatus=CACHE_STALE guarantees that
+  ** the cache is out of date.
+  **
+  ** aRow might point to (ephemeral) data for the current row, or it might
+  ** be NULL.
+  */
+  u32 cacheStatus;      /* Cache is valid if this matches Vdbe.cacheCtr */
+  int payloadSize;      /* Total number of bytes in the record */
+  u32 *aType;           /* Type values for all entries in the record */
+  u32 *aOffset;         /* Cached offsets to the start of each columns data */
+  u8 *aRow;             /* Data for the current row, if all on one page */
+};
+typedef struct VdbeCursor VdbeCursor;
+
+/*
+** When a sub-program is executed (OP_Program), a structure of this type
+** is allocated to store the current value of the program counter, as
+** well as the current memory cell array and various other frame specific
+** values stored in the Vdbe struct. When the sub-program is finished, 
+** these values are copied back to the Vdbe from the VdbeFrame structure,
+** restoring the state of the VM to as it was before the sub-program
+** began executing.
+**
+** Frames are stored in a linked list headed at Vdbe.pParent. Vdbe.pParent
+** is the parent of the current frame, or zero if the current frame
+** is the main Vdbe program.
+*/
+typedef struct VdbeFrame VdbeFrame;
+struct VdbeFrame {
+  Vdbe *v;                /* VM this frame belongs to */
+  int pc;                 /* Program Counter */
+  Op *aOp;                /* Program instructions */
+  int nOp;                /* Size of aOp array */
+  Mem *aMem;              /* Array of memory cells */
+  int nMem;               /* Number of entries in aMem */
+  VdbeCursor **apCsr;     /* Element of Vdbe cursors */
+  u16 nCursor;            /* Number of entries in apCsr */
+  void *token;            /* Copy of SubProgram.token */
+  int nChildMem;          /* Number of memory cells for child frame */
+  int nChildCsr;          /* Number of cursors for child frame */
+  i64 lastRowid;          /* Last insert rowid (sqlite3.lastRowid) */
+  int nChange;            /* Statement changes (Vdbe.nChanges)     */
+  VdbeFrame *pParent;     /* Parent of this frame */
+};
+
+#define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))])
+
+/*
+** A value for VdbeCursor.cacheValid that means the cache is always invalid.
+*/
+#define CACHE_STALE 0
+
+/*
+** Internally, the vdbe manipulates nearly all SQL values as Mem
+** structures. Each Mem struct may cache multiple representations (string,
+** integer etc.) of the same value.  A value (and therefore Mem structure)
+** has the following properties:
+**
+** Each value has a manifest type. The manifest type of the value stored
+** in a Mem struct is returned by the MemType(Mem*) macro. The type is
+** one of SQLITE_NULL, SQLITE_INTEGER, SQLITE_REAL, SQLITE_TEXT or
+** SQLITE_BLOB.
+*/
+struct Mem {
+  union {
+    i64 i;              /* Integer value. */
+    int nZero;          /* Used when bit MEM_Zero is set in flags */
+    FuncDef *pDef;      /* Used only when flags==MEM_Agg */
+    RowSet *pRowSet;    /* Used only when flags==MEM_RowSet */
+    VdbeFrame *pFrame;  /* Used when flags==MEM_Frame */
+  } u;
+  double r;           /* Real value */
+  sqlite3 *db;        /* The associated database connection */
+  char *z;            /* String or BLOB value */
+  int n;              /* Number of characters in string value, excluding '\0' */
+  u16 flags;          /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */
+  u8  type;           /* One of SQLITE_NULL, SQLITE_TEXT, SQLITE_INTEGER, etc */
+  u8  enc;            /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */
+  void (*xDel)(void *);  /* If not null, call this function to delete Mem.z */
+  char *zMalloc;      /* Dynamic buffer allocated by sqlite3_malloc() */
+};
+
+/* One or more of the following flags are set to indicate the validOK
+** representations of the value stored in the Mem struct.
+**
+** If the MEM_Null flag is set, then the value is an SQL NULL value.
+** No other flags may be set in this case.
+**
+** If the MEM_Str flag is set then Mem.z points at a string representation.
+** Usually this is encoded in the same unicode encoding as the main
+** database (see below for exceptions). If the MEM_Term flag is also
+** set, then the string is nul terminated. The MEM_Int and MEM_Real 
+** flags may coexist with the MEM_Str flag.
+**
+** Multiple of these values can appear in Mem.flags.  But only one
+** at a time can appear in Mem.type.
+*/
+#define MEM_Null      0x0001   /* Value is NULL */
+#define MEM_Str       0x0002   /* Value is a string */
+#define MEM_Int       0x0004   /* Value is an integer */
+#define MEM_Real      0x0008   /* Value is a real number */
+#define MEM_Blob      0x0010   /* Value is a BLOB */
+#define MEM_RowSet    0x0020   /* Value is a RowSet object */
+#define MEM_Frame     0x0040   /* Value is a VdbeFrame object */
+#define MEM_TypeMask  0x00ff   /* Mask of type bits */
+
+/* Whenever Mem contains a valid string or blob representation, one of
+** the following flags must be set to determine the memory management
+** policy for Mem.z.  The MEM_Term flag tells us whether or not the
+** string is \000 or \u0000 terminated
+*/
+#define MEM_Term      0x0200   /* String rep is nul terminated */
+#define MEM_Dyn       0x0400   /* Need to call sqliteFree() on Mem.z */
+#define MEM_Static    0x0800   /* Mem.z points to a static string */
+#define MEM_Ephem     0x1000   /* Mem.z points to an ephemeral string */
+#define MEM_Agg       0x2000   /* Mem.z points to an agg function context */
+#define MEM_Zero      0x4000   /* Mem.i contains count of 0s appended to blob */
+
+#ifdef SQLITE_OMIT_INCRBLOB
+  #undef MEM_Zero
+  #define MEM_Zero 0x0000
+#endif
+
+
+/*
+** Clear any existing type flags from a Mem and replace them with f
+*/
+#define MemSetTypeFlag(p, f) \
+   ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero))|f)
+
+
+/* A VdbeFunc is just a FuncDef (defined in sqliteInt.h) that contains
+** additional information about auxiliary information bound to arguments
+** of the function.  This is used to implement the sqlite3_get_auxdata()
+** and sqlite3_set_auxdata() APIs.  The "auxdata" is some auxiliary data
+** that can be associated with a constant argument to a function.  This
+** allows functions such as "regexp" to compile their constant regular
+** expression argument once and reused the compiled code for multiple
+** invocations.
+*/
+struct VdbeFunc {
+  FuncDef *pFunc;               /* The definition of the function */
+  int nAux;                     /* Number of entries allocated for apAux[] */
+  struct AuxData {
+    void *pAux;                   /* Aux data for the i-th argument */
+    void (*xDelete)(void *);      /* Destructor for the aux data */
+  } apAux[1];                   /* One slot for each function argument */
+};
+
+/*
+** The "context" argument for a installable function.  A pointer to an
+** instance of this structure is the first argument to the routines used
+** implement the SQL functions.
+**
+** There is a typedef for this structure in sqlite.h.  So all routines,
+** even the public interface to SQLite, can use a pointer to this structure.
+** But this file is the only place where the internal details of this
+** structure are known.
+**
+** This structure is defined inside of vdbeInt.h because it uses substructures
+** (Mem) which are only defined there.
+*/
+struct sqlite3_context {
+  FuncDef *pFunc;       /* Pointer to function information.  MUST BE FIRST */
+  VdbeFunc *pVdbeFunc;  /* Auxilary data, if created. */
+  Mem s;                /* The return value is stored here */
+  Mem *pMem;            /* Memory cell used to store aggregate context */
+  int isError;          /* Error code returned by the function. */
+  CollSeq *pColl;       /* Collating sequence */
+};
+
+/*
+** A Set structure is used for quick testing to see if a value
+** is part of a small set.  Sets are used to implement code like
+** this:
+**            x.y IN ('hi','hoo','hum')
+*/
+typedef struct Set Set;
+struct Set {
+  Hash hash;             /* A set is just a hash table */
+  HashElem *prev;        /* Previously accessed hash elemen */
+};
+
+/*
+** An instance of the virtual machine.  This structure contains the complete
+** state of the virtual machine.
+**
+** The "sqlite3_stmt" structure pointer that is returned by sqlite3_compile()
+** is really a pointer to an instance of this structure.
+**
+** The Vdbe.inVtabMethod variable is set to non-zero for the duration of
+** any virtual table method invocations made by the vdbe program. It is
+** set to 2 for xDestroy method calls and 1 for all other methods. This
+** variable is used for two purposes: to allow xDestroy methods to execute
+** "DROP TABLE" statements and to prevent some nasty side effects of
+** malloc failure when SQLite is invoked recursively by a virtual table 
+** method function.
+*/
+struct Vdbe {
+  sqlite3 *db;            /* The database connection that owns this statement */
+  Vdbe *pPrev,*pNext;     /* Linked list of VDBEs with the same Vdbe.db */
+  int nOp;                /* Number of instructions in the program */
+  int nOpAlloc;           /* Number of slots allocated for aOp[] */
+  Op *aOp;                /* Space to hold the virtual machine's program */
+  int nLabel;             /* Number of labels used */
+  int nLabelAlloc;        /* Number of slots allocated in aLabel[] */
+  int *aLabel;            /* Space to hold the labels */
+  Mem **apArg;            /* Arguments to currently executing user function */
+  Mem *aColName;          /* Column names to return */
+  Mem *pResultSet;        /* Pointer to an array of results */
+  u16 nResColumn;         /* Number of columns in one row of the result set */
+  u16 nCursor;            /* Number of slots in apCsr[] */
+  VdbeCursor **apCsr;     /* One element of this array for each open cursor */
+  u8 errorAction;         /* Recovery action to do in case of an error */
+  u8 okVar;               /* True if azVar[] has been initialized */
+  ynVar nVar;             /* Number of entries in aVar[] */
+  Mem *aVar;              /* Values for the OP_Variable opcode. */
+  char **azVar;           /* Name of variables */
+  u32 magic;              /* Magic number for sanity checking */
+  int nMem;               /* Number of memory locations currently allocated */
+  Mem *aMem;              /* The memory locations */
+  u32 cacheCtr;           /* VdbeCursor row cache generation counter */
+  int pc;                 /* The program counter */
+  int rc;                 /* Value to return */
+  char *zErrMsg;          /* Error message written here */
+  u8 explain;             /* True if EXPLAIN present on SQL command */
+  u8 changeCntOn;         /* True to update the change-counter */
+  u8 expired;             /* True if the VM needs to be recompiled */
+  u8 runOnlyOnce;         /* Automatically expire on reset */
+  u8 minWriteFileFormat;  /* Minimum file format for writable database files */
+  u8 inVtabMethod;        /* See comments above */
+  u8 usesStmtJournal;     /* True if uses a statement journal */
+  u8 readOnly;            /* True for read-only statements */
+  u8 isPrepareV2;         /* True if prepared with prepare_v2() */
+  int nChange;            /* Number of db changes made since last reset */
+  int btreeMask;          /* Bitmask of db->aDb[] entries referenced */
+  i64 startTime;          /* Time when query started - used for profiling */
+  BtreeMutexArray aMutex; /* An array of Btree used here and needing locks */
+  int aCounter[3];        /* Counters used by sqlite3_stmt_status() */
+  char *zSql;             /* Text of the SQL statement that generated this */
+  void *pFree;            /* Free this when deleting the vdbe */
+  i64 nFkConstraint;      /* Number of imm. FK constraints this VM */
+  i64 nStmtDefCons;       /* Number of def. constraints when stmt started */
+  int iStatement;         /* Statement number (or 0 if has not opened stmt) */
+#ifdef SQLITE_DEBUG
+  FILE *trace;            /* Write an execution trace here, if not NULL */
+#endif
+  VdbeFrame *pFrame;      /* Parent frame */
+  int nFrame;             /* Number of frames in pFrame list */
+  u32 expmask;            /* Binding to these vars invalidates VM */
+  SubProgram *pProgram;   /* Linked list of all sub-programs used by VM */
+};
+
+/*
+** The following are allowed values for Vdbe.magic
+*/
+#define VDBE_MAGIC_INIT     0x26bceaa5    /* Building a VDBE program */
+#define VDBE_MAGIC_RUN      0xbdf20da3    /* VDBE is ready to execute */
+#define VDBE_MAGIC_HALT     0x519c2973    /* VDBE has completed execution */
+#define VDBE_MAGIC_DEAD     0xb606c3c8    /* The VDBE has been deallocated */
+
+/*
+** Function prototypes
+*/
+SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*);
+void sqliteVdbePopStack(Vdbe*,int);
+SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor*);
+#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
+SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, Op*);
+#endif
+SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32);
+SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem*, int);
+SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, int, Mem*, int);
+SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
+SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(VdbeFunc*, int);
+
+int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *);
+SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(VdbeCursor*,UnpackedRecord*,int*);
+SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor *, i64 *);
+SQLITE_PRIVATE int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*);
+SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*);
+SQLITE_PRIVATE int sqlite3VdbeList(Vdbe*);
+SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe*);
+SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *, int);
+SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem*);
+SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem*, const Mem*);
+SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem*, const Mem*, int);
+SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem*, Mem*);
+SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem*);
+SQLITE_PRIVATE int sqlite3VdbeMemSetStr(Mem*, const char*, int, u8, void(*)(void*));
+SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem*, i64);
+#ifdef SQLITE_OMIT_FLOATING_POINT
+# define sqlite3VdbeMemSetDouble sqlite3VdbeMemSetInt64
+#else
+SQLITE_PRIVATE   void sqlite3VdbeMemSetDouble(Mem*, double);
+#endif
+SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem*);
+SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem*,int);
+SQLITE_PRIVATE void sqlite3VdbeMemSetRowSet(Mem*);
+SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem*);
+SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, int);
+SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem*);
+SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*);
+SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*);
+SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*);
+SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*);
+SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*);
+SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,int,int,int,Mem*);
+SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p);
+SQLITE_PRIVATE void sqlite3VdbeMemReleaseExternal(Mem *p);
+SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*);
+SQLITE_PRIVATE const char *sqlite3OpcodeName(int);
+SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve);
+SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int);
+SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame*);
+SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *);
+SQLITE_PRIVATE void sqlite3VdbeMemStoreType(Mem *pMem);
+
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *, int);
+#else
+# define sqlite3VdbeCheckFk(p,i) 0
+#endif
+
+#ifndef SQLITE_OMIT_SHARED_CACHE
+SQLITE_PRIVATE void sqlite3VdbeMutexArrayEnter(Vdbe *p);
+#else
+# define sqlite3VdbeMutexArrayEnter(p)
+#endif
+
+SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem*, u8);
+#ifdef SQLITE_DEBUG
+SQLITE_PRIVATE   void sqlite3VdbePrintSql(Vdbe*);
+SQLITE_PRIVATE   void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf);
+#endif
+SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem);
+
+#ifndef SQLITE_OMIT_INCRBLOB
+SQLITE_PRIVATE   int sqlite3VdbeMemExpandBlob(Mem *);
+#else
+  #define sqlite3VdbeMemExpandBlob(x) SQLITE_OK
+#endif
+
+#endif /* !defined(_VDBEINT_H_) */
+
+/************** End of vdbeInt.h *********************************************/
+/************** Continuing where we left off in status.c *********************/
 
 /*
 ** Variables in which to record status information.
 */
 typedef struct sqlite3StatType sqlite3StatType;
 static SQLITE_WSD struct sqlite3StatType {
-  int nowValue[9];         /* Current value */
-  int mxValue[9];          /* Maximum value */
+  int nowValue[10];         /* Current value */
+  int mxValue[10];          /* Maximum value */
 } sqlite3Stat = { {0,}, {0,} };
 
 
@@ -11657,6 +12133,8 @@ SQLITE_API int sqlite3_db_status(
   int *pHighwater,      /* Write high-water mark here */
   int resetFlag         /* Reset high-water mark if true */
 ){
+  int rc = SQLITE_OK;   /* Return code */
+  sqlite3_mutex_enter(db->mutex);
   switch( op ){
     case SQLITE_DBSTATUS_LOOKASIDE_USED: {
       *pCurrent = db->lookaside.nOut;
@@ -11675,6 +12153,7 @@ SQLITE_API int sqlite3_db_status(
     case SQLITE_DBSTATUS_CACHE_USED: {
       int totalUsed = 0;
       int i;
+      sqlite3BtreeEnterAll(db);
       for(i=0; i<db->nDb; i++){
         Btree *pBt = db->aDb[i].pBt;
         if( pBt ){
@@ -11682,15 +12161,80 @@ SQLITE_API int sqlite3_db_status(
           totalUsed += sqlite3PagerMemUsed(pPager);
         }
       }
+      sqlite3BtreeLeaveAll(db);
       *pCurrent = totalUsed;
       *pHighwater = 0;
       break;
     }
+
+    /*
+    ** *pCurrent gets an accurate estimate of the amount of memory used
+    ** to store the schema for all databases (main, temp, and any ATTACHed
+    ** databases.  *pHighwater is set to zero.
+    */
+    case SQLITE_DBSTATUS_SCHEMA_USED: {
+      int i;                      /* Used to iterate through schemas */
+      int nByte = 0;              /* Used to accumulate return value */
+
+      db->pnBytesFreed = &nByte;
+      for(i=0; i<db->nDb; i++){
+        Schema *pSchema = db->aDb[i].pSchema;
+        if( ALWAYS(pSchema!=0) ){
+          HashElem *p;
+
+          nByte += sqlite3GlobalConfig.m.xRoundup(sizeof(HashElem)) * (
+              pSchema->tblHash.count 
+            + pSchema->trigHash.count
+            + pSchema->idxHash.count
+            + pSchema->fkeyHash.count
+          );
+          nByte += sqlite3MallocSize(pSchema->tblHash.ht);
+          nByte += sqlite3MallocSize(pSchema->trigHash.ht);
+          nByte += sqlite3MallocSize(pSchema->idxHash.ht);
+          nByte += sqlite3MallocSize(pSchema->fkeyHash.ht);
+
+          for(p=sqliteHashFirst(&pSchema->trigHash); p; p=sqliteHashNext(p)){
+            sqlite3DeleteTrigger(db, (Trigger*)sqliteHashData(p));
+          }
+          for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){
+            sqlite3DeleteTable(db, (Table *)sqliteHashData(p));
+          }
+        }
+      }
+      db->pnBytesFreed = 0;
+
+      *pHighwater = 0;
+      *pCurrent = nByte;
+      break;
+    }
+
+    /*
+    ** *pCurrent gets an accurate estimate of the amount of memory used
+    ** to store all prepared statements.
+    ** *pHighwater is set to zero.
+    */
+    case SQLITE_DBSTATUS_STMT_USED: {
+      struct Vdbe *pVdbe;         /* Used to iterate through VMs */
+      int nByte = 0;              /* Used to accumulate return value */
+
+      db->pnBytesFreed = &nByte;
+      for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){
+        sqlite3VdbeDeleteObject(db, pVdbe);
+      }
+      db->pnBytesFreed = 0;
+
+      *pHighwater = 0;
+      *pCurrent = nByte;
+
+      break;
+    }
+
     default: {
-      return SQLITE_ERROR;
+      rc = SQLITE_ERROR;
     }
   }
-  return SQLITE_OK;
+  sqlite3_mutex_leave(db->mutex);
+  return rc;
 }
 
 /************** End of status.c **********************************************/
@@ -13799,7 +14343,7 @@ SQLITE_PRIVATE void sqlite3MemSetDefault(void){
 ** Set the "type" of an allocation.
 */
 SQLITE_PRIVATE void sqlite3MemdebugSetType(void *p, u8 eType){
-  if( p ){
+  if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){
     struct MemBlockHdr *pHdr;
     pHdr = sqlite3MemsysGetHeader(p);
     assert( pHdr->iForeGuard==FOREGUARD );
@@ -13818,23 +14362,38 @@ SQLITE_PRIVATE void sqlite3MemdebugSetType(void *p, u8 eType){
 */
 SQLITE_PRIVATE int sqlite3MemdebugHasType(void *p, u8 eType){
   int rc = 1;
-  if( p ){
+  if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){
     struct MemBlockHdr *pHdr;
     pHdr = sqlite3MemsysGetHeader(p);
     assert( pHdr->iForeGuard==FOREGUARD );         /* Allocation is valid */
-    assert( (pHdr->eType & (pHdr->eType-1))==0 );  /* Only one type bit set */
     if( (pHdr->eType&eType)==0 ){
-      void **pBt;
-      pBt = (void**)pHdr;
-      pBt -= pHdr->nBacktraceSlots;
-      backtrace_symbols_fd(pBt, pHdr->nBacktrace, fileno(stderr));
-      fprintf(stderr, "\n");
       rc = 0;
     }
   }
   return rc;
 }
- 
+
+/*
+** Return TRUE if the mask of type in eType matches no bits of the type of the
+** allocation p.  Also return true if p==NULL.
+**
+** This routine is designed for use within an assert() statement, to
+** verify the type of an allocation.  For example:
+**
+**     assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
+*/
+SQLITE_PRIVATE int sqlite3MemdebugNoType(void *p, u8 eType){
+  int rc = 1;
+  if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){
+    struct MemBlockHdr *pHdr;
+    pHdr = sqlite3MemsysGetHeader(p);
+    assert( pHdr->iForeGuard==FOREGUARD );         /* Allocation is valid */
+    if( (pHdr->eType&eType)!=0 ){
+      rc = 0;
+    }
+  }
+  return rc;
+}
 
 /*
 ** Set the number of backtrace levels kept for each allocation.
@@ -16077,6 +16636,7 @@ static void pthreadMutexEnter(sqlite3_mutex *p){
   */
   pthread_mutex_lock(&p->mutex);
 #if SQLITE_MUTEX_NREF
+  assert( p->nRef>0 || p->owner==0 );
   p->owner = pthread_self();
   p->nRef++;
 #endif
@@ -16149,6 +16709,7 @@ static void pthreadMutexLeave(sqlite3_mutex *p){
   assert( pthreadMutexHeld(p) );
 #if SQLITE_MUTEX_NREF
   p->nRef--;
+  if( p->nRef==0 ) p->owner = 0;
 #endif
   assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE );
 
@@ -16413,7 +16974,7 @@ static sqlite3_mutex *winMutexAlloc(int iType){
 */
 static void winMutexFree(sqlite3_mutex *p){
   assert( p );
-  assert( p->nRef==0 );
+  assert( p->nRef==0 && p->owner==0 );
   assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
   DeleteCriticalSection(&p->mutex);
   sqlite3_free(p);
@@ -16437,6 +16998,7 @@ static void winMutexEnter(sqlite3_mutex *p){
 #endif
   EnterCriticalSection(&p->mutex);
 #ifdef SQLITE_DEBUG
+  assert( p->nRef>0 || p->owner==0 );
   p->owner = tid; 
   p->nRef++;
   if( p->trace ){
@@ -16490,6 +17052,7 @@ static void winMutexLeave(sqlite3_mutex *p){
   assert( p->nRef>0 );
   assert( p->owner==tid );
   p->nRef--;
+  if( p->nRef==0 ) p->owner = 0;
   assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE );
 #endif
   LeaveCriticalSection(&p->mutex);
@@ -16775,6 +17338,7 @@ static int mallocWithAlarm(int n, void **pp){
   if( p ){
     nFull = sqlite3MallocSize(p);
     sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, nFull);
+    sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, 1);
   }
   *pp = p;
   return nFull;
@@ -16892,12 +17456,14 @@ SQLITE_PRIVATE void sqlite3ScratchFree(void *p){
            || p<sqlite3GlobalConfig.pScratch
            || p>=(void*)mem0.aScratchFree ){
       assert( sqlite3MemdebugHasType(p, MEMTYPE_SCRATCH) );
+      assert( sqlite3MemdebugNoType(p, ~MEMTYPE_SCRATCH) );
       sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
       if( sqlite3GlobalConfig.bMemstat ){
         int iSize = sqlite3MallocSize(p);
         sqlite3_mutex_enter(mem0.mutex);
         sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_OVERFLOW, -iSize);
         sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, -iSize);
+        sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, -1);
         sqlite3GlobalConfig.m.xFree(p);
         sqlite3_mutex_leave(mem0.mutex);
       }else{
@@ -16932,7 +17498,7 @@ SQLITE_PRIVATE void sqlite3ScratchFree(void *p){
 */
 #ifndef SQLITE_OMIT_LOOKASIDE
 static int isLookaside(sqlite3 *db, void *p){
-  return db && p && p>=db->lookaside.pStart && p<db->lookaside.pEnd;
+  return p && p>=db->lookaside.pStart && p<db->lookaside.pEnd;
 }
 #else
 #define isLookaside(A,B) 0
@@ -16944,15 +17510,17 @@ static int isLookaside(sqlite3 *db, void *p){
 */
 SQLITE_PRIVATE int sqlite3MallocSize(void *p){
   assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
+  assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
   return sqlite3GlobalConfig.m.xSize(p);
 }
 SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){
   assert( db==0 || sqlite3_mutex_held(db->mutex) );
-  if( isLookaside(db, p) ){
+  if( db && isLookaside(db, p) ){
     return db->lookaside.sz;
   }else{
-    assert( sqlite3MemdebugHasType(p,
-             db ? (MEMTYPE_DB|MEMTYPE_HEAP) : MEMTYPE_HEAP) );
+    assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
+    assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
+    assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) );
     return sqlite3GlobalConfig.m.xSize(p);
   }
 }
@@ -16962,10 +17530,12 @@ SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){
 */
 SQLITE_API void sqlite3_free(void *p){
   if( p==0 ) return;
+  assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
   assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
   if( sqlite3GlobalConfig.bMemstat ){
     sqlite3_mutex_enter(mem0.mutex);
     sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, -sqlite3MallocSize(p));
+    sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, -1);
     sqlite3GlobalConfig.m.xFree(p);
     sqlite3_mutex_leave(mem0.mutex);
   }else{
@@ -16979,16 +17549,24 @@ SQLITE_API void sqlite3_free(void *p){
 */
 SQLITE_PRIVATE void sqlite3DbFree(sqlite3 *db, void *p){
   assert( db==0 || sqlite3_mutex_held(db->mutex) );
-  if( isLookaside(db, p) ){
-    LookasideSlot *pBuf = (LookasideSlot*)p;
-    pBuf->pNext = db->lookaside.pFree;
-    db->lookaside.pFree = pBuf;
-    db->lookaside.nOut--;
-  }else{
-    assert( sqlite3MemdebugHasType(p, MEMTYPE_DB|MEMTYPE_HEAP) );
-    sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
-    sqlite3_free(p);
+  if( db ){
+    if( db->pnBytesFreed ){
+      *db->pnBytesFreed += sqlite3DbMallocSize(db, p);
+      return;
+    }
+    if( isLookaside(db, p) ){
+      LookasideSlot *pBuf = (LookasideSlot*)p;
+      pBuf->pNext = db->lookaside.pFree;
+      db->lookaside.pFree = pBuf;
+      db->lookaside.nOut--;
+      return;
+    }
   }
+  assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
+  assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
+  assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) );
+  sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
+  sqlite3_free(p);
 }
 
 /*
@@ -17020,6 +17598,7 @@ SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, int nBytes){
       sqlite3MallocAlarm(nNew-nOld);
     }
     assert( sqlite3MemdebugHasType(pOld, MEMTYPE_HEAP) );
+    assert( sqlite3MemdebugNoType(pOld, ~MEMTYPE_HEAP) );
     pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
     if( pNew==0 && mem0.alarmCallback ){
       sqlite3MallocAlarm(nBytes);
@@ -17092,6 +17671,7 @@ SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3 *db, int n){
 SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3 *db, int n){
   void *p;
   assert( db==0 || sqlite3_mutex_held(db->mutex) );
+  assert( db==0 || db->pnBytesFreed==0 );
 #ifndef SQLITE_OMIT_LOOKASIDE
   if( db ){
     LookasideSlot *pBuf;
@@ -17117,8 +17697,8 @@ SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3 *db, int n){
   if( !p && db ){
     db->mallocFailed = 1;
   }
-  sqlite3MemdebugSetType(p,
-            (db && db->lookaside.bEnabled) ? MEMTYPE_DB : MEMTYPE_HEAP);
+  sqlite3MemdebugSetType(p, MEMTYPE_DB |
+         ((db && db->lookaside.bEnabled) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
   return p;
 }
 
@@ -17144,14 +17724,16 @@ SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *db, void *p, int n){
         sqlite3DbFree(db, p);
       }
     }else{
-      assert( sqlite3MemdebugHasType(p, MEMTYPE_DB|MEMTYPE_HEAP) );
+      assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
+      assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
       sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
       pNew = sqlite3_realloc(p, n);
       if( !pNew ){
+        sqlite3MemdebugSetType(p, MEMTYPE_DB|MEMTYPE_HEAP);
         db->mallocFailed = 1;
       }
-      sqlite3MemdebugSetType(pNew,
-            db->lookaside.bEnabled ? MEMTYPE_DB : MEMTYPE_HEAP);
+      sqlite3MemdebugSetType(pNew, MEMTYPE_DB | 
+            (db->lookaside.bEnabled ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
     }
   }
   return pNew;
@@ -18024,7 +18606,11 @@ SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
       }else{
         p->nAlloc = (int)szNew;
       }
-      zNew = sqlite3DbMallocRaw(p->db, p->nAlloc );
+      if( p->useMalloc==1 ){
+        zNew = sqlite3DbMallocRaw(p->db, p->nAlloc );
+      }else{
+        zNew = sqlite3_malloc(p->nAlloc);
+      }
       if( zNew ){
         memcpy(zNew, p->zText, p->nChar);
         sqlite3StrAccumReset(p);
@@ -18049,7 +18635,11 @@ SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){
   if( p->zText ){
     p->zText[p->nChar] = 0;
     if( p->useMalloc && p->zText==p->zBase ){
-      p->zText = sqlite3DbMallocRaw(p->db, p->nChar+1 );
+      if( p->useMalloc==1 ){
+        p->zText = sqlite3DbMallocRaw(p->db, p->nChar+1 );
+      }else{
+        p->zText = sqlite3_malloc(p->nChar+1);
+      }
       if( p->zText ){
         memcpy(p->zText, p->zBase, p->nChar+1);
       }else{
@@ -18065,7 +18655,11 @@ SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){
 */
 SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum *p){
   if( p->zText!=p->zBase ){
-    sqlite3DbFree(p->db, p->zText);
+    if( p->useMalloc==1 ){
+      sqlite3DbFree(p->db, p->zText);
+    }else{
+      sqlite3_free(p->zText);
+    }
   }
   p->zText = 0;
 }
@@ -18147,6 +18741,7 @@ SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){
   if( sqlite3_initialize() ) return 0;
 #endif
   sqlite3StrAccumInit(&acc, zBase, sizeof(zBase), SQLITE_MAX_LENGTH);
+  acc.useMalloc = 2;
   sqlite3VXPrintf(&acc, 0, zFormat, ap);
   z = sqlite3StrAccumFinish(&acc);
   return z;
@@ -18440,429 +19035,6 @@ SQLITE_PRIVATE void sqlite3PrngResetState(void){
 **     0xfe 0xff   big-endian utf-16 follows
 **
 */
-/************** Include vdbeInt.h in the middle of utf.c *********************/
-/************** Begin file vdbeInt.h *****************************************/
-/*
-** 2003 September 6
-**
-** The author disclaims copyright to this source code.  In place of
-** a legal notice, here is a blessing:
-**
-**    May you do good and not evil.
-**    May you find forgiveness for yourself and forgive others.
-**    May you share freely, never taking more than you give.
-**
-*************************************************************************
-** This is the header file for information that is private to the
-** VDBE.  This information used to all be at the top of the single
-** source code file "vdbe.c".  When that file became too big (over
-** 6000 lines long) it was split up into several smaller files and
-** this header information was factored out.
-*/
-#ifndef _VDBEINT_H_
-#define _VDBEINT_H_
-
-/*
-** SQL is translated into a sequence of instructions to be
-** executed by a virtual machine.  Each instruction is an instance
-** of the following structure.
-*/
-typedef struct VdbeOp Op;
-
-/*
-** Boolean values
-*/
-typedef unsigned char Bool;
-
-/*
-** A cursor is a pointer into a single BTree within a database file.
-** The cursor can seek to a BTree entry with a particular key, or
-** loop over all entries of the Btree.  You can also insert new BTree
-** entries or retrieve the key or data from the entry that the cursor
-** is currently pointing to.
-** 
-** Every cursor that the virtual machine has open is represented by an
-** instance of the following structure.
-**
-** If the VdbeCursor.isTriggerRow flag is set it means that this cursor is
-** really a single row that represents the NEW or OLD pseudo-table of
-** a row trigger.  The data for the row is stored in VdbeCursor.pData and
-** the rowid is in VdbeCursor.iKey.
-*/
-struct VdbeCursor {
-  BtCursor *pCursor;    /* The cursor structure of the backend */
-  int iDb;              /* Index of cursor database in db->aDb[] (or -1) */
-  i64 lastRowid;        /* Last rowid from a Next or NextIdx operation */
-  Bool zeroed;          /* True if zeroed out and ready for reuse */
-  Bool rowidIsValid;    /* True if lastRowid is valid */
-  Bool atFirst;         /* True if pointing to first entry */
-  Bool useRandomRowid;  /* Generate new record numbers semi-randomly */
-  Bool nullRow;         /* True if pointing to a row with no data */
-  Bool deferredMoveto;  /* A call to sqlite3BtreeMoveto() is needed */
-  Bool isTable;         /* True if a table requiring integer keys */
-  Bool isIndex;         /* True if an index containing keys only - no data */
-  i64 movetoTarget;     /* Argument to the deferred sqlite3BtreeMoveto() */
-  Btree *pBt;           /* Separate file holding temporary table */
-  int pseudoTableReg;   /* Register holding pseudotable content. */
-  KeyInfo *pKeyInfo;    /* Info about index keys needed by index cursors */
-  int nField;           /* Number of fields in the header */
-  i64 seqCount;         /* Sequence counter */
-  sqlite3_vtab_cursor *pVtabCursor;  /* The cursor for a virtual table */
-  const sqlite3_module *pModule;     /* Module for cursor pVtabCursor */
-
-  /* Result of last sqlite3BtreeMoveto() done by an OP_NotExists or 
-  ** OP_IsUnique opcode on this cursor. */
-  int seekResult;
-
-  /* Cached information about the header for the data record that the
-  ** cursor is currently pointing to.  Only valid if cacheStatus matches
-  ** Vdbe.cacheCtr.  Vdbe.cacheCtr will never take on the value of
-  ** CACHE_STALE and so setting cacheStatus=CACHE_STALE guarantees that
-  ** the cache is out of date.
-  **
-  ** aRow might point to (ephemeral) data for the current row, or it might
-  ** be NULL.
-  */
-  u32 cacheStatus;      /* Cache is valid if this matches Vdbe.cacheCtr */
-  int payloadSize;      /* Total number of bytes in the record */
-  u32 *aType;           /* Type values for all entries in the record */
-  u32 *aOffset;         /* Cached offsets to the start of each columns data */
-  u8 *aRow;             /* Data for the current row, if all on one page */
-};
-typedef struct VdbeCursor VdbeCursor;
-
-/*
-** When a sub-program is executed (OP_Program), a structure of this type
-** is allocated to store the current value of the program counter, as
-** well as the current memory cell array and various other frame specific
-** values stored in the Vdbe struct. When the sub-program is finished, 
-** these values are copied back to the Vdbe from the VdbeFrame structure,
-** restoring the state of the VM to as it was before the sub-program
-** began executing.
-**
-** Frames are stored in a linked list headed at Vdbe.pParent. Vdbe.pParent
-** is the parent of the current frame, or zero if the current frame
-** is the main Vdbe program.
-*/
-typedef struct VdbeFrame VdbeFrame;
-struct VdbeFrame {
-  Vdbe *v;                /* VM this frame belongs to */
-  int pc;                 /* Program Counter */
-  Op *aOp;                /* Program instructions */
-  int nOp;                /* Size of aOp array */
-  Mem *aMem;              /* Array of memory cells */
-  int nMem;               /* Number of entries in aMem */
-  VdbeCursor **apCsr;     /* Element of Vdbe cursors */
-  u16 nCursor;            /* Number of entries in apCsr */
-  void *token;            /* Copy of SubProgram.token */
-  int nChildMem;          /* Number of memory cells for child frame */
-  int nChildCsr;          /* Number of cursors for child frame */
-  i64 lastRowid;          /* Last insert rowid (sqlite3.lastRowid) */
-  int nChange;            /* Statement changes (Vdbe.nChanges)     */
-  VdbeFrame *pParent;     /* Parent of this frame */
-};
-
-#define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))])
-
-/*
-** A value for VdbeCursor.cacheValid that means the cache is always invalid.
-*/
-#define CACHE_STALE 0
-
-/*
-** Internally, the vdbe manipulates nearly all SQL values as Mem
-** structures. Each Mem struct may cache multiple representations (string,
-** integer etc.) of the same value.  A value (and therefore Mem structure)
-** has the following properties:
-**
-** Each value has a manifest type. The manifest type of the value stored
-** in a Mem struct is returned by the MemType(Mem*) macro. The type is
-** one of SQLITE_NULL, SQLITE_INTEGER, SQLITE_REAL, SQLITE_TEXT or
-** SQLITE_BLOB.
-*/
-struct Mem {
-  union {
-    i64 i;              /* Integer value. */
-    int nZero;          /* Used when bit MEM_Zero is set in flags */
-    FuncDef *pDef;      /* Used only when flags==MEM_Agg */
-    RowSet *pRowSet;    /* Used only when flags==MEM_RowSet */
-    VdbeFrame *pFrame;  /* Used when flags==MEM_Frame */
-  } u;
-  double r;           /* Real value */
-  sqlite3 *db;        /* The associated database connection */
-  char *z;            /* String or BLOB value */
-  int n;              /* Number of characters in string value, excluding '\0' */
-  u16 flags;          /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */
-  u8  type;           /* One of SQLITE_NULL, SQLITE_TEXT, SQLITE_INTEGER, etc */
-  u8  enc;            /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */
-  void (*xDel)(void *);  /* If not null, call this function to delete Mem.z */
-  char *zMalloc;      /* Dynamic buffer allocated by sqlite3_malloc() */
-};
-
-/* One or more of the following flags are set to indicate the validOK
-** representations of the value stored in the Mem struct.
-**
-** If the MEM_Null flag is set, then the value is an SQL NULL value.
-** No other flags may be set in this case.
-**
-** If the MEM_Str flag is set then Mem.z points at a string representation.
-** Usually this is encoded in the same unicode encoding as the main
-** database (see below for exceptions). If the MEM_Term flag is also
-** set, then the string is nul terminated. The MEM_Int and MEM_Real 
-** flags may coexist with the MEM_Str flag.
-**
-** Multiple of these values can appear in Mem.flags.  But only one
-** at a time can appear in Mem.type.
-*/
-#define MEM_Null      0x0001   /* Value is NULL */
-#define MEM_Str       0x0002   /* Value is a string */
-#define MEM_Int       0x0004   /* Value is an integer */
-#define MEM_Real      0x0008   /* Value is a real number */
-#define MEM_Blob      0x0010   /* Value is a BLOB */
-#define MEM_RowSet    0x0020   /* Value is a RowSet object */
-#define MEM_Frame     0x0040   /* Value is a VdbeFrame object */
-#define MEM_TypeMask  0x00ff   /* Mask of type bits */
-
-/* Whenever Mem contains a valid string or blob representation, one of
-** the following flags must be set to determine the memory management
-** policy for Mem.z.  The MEM_Term flag tells us whether or not the
-** string is \000 or \u0000 terminated
-*/
-#define MEM_Term      0x0200   /* String rep is nul terminated */
-#define MEM_Dyn       0x0400   /* Need to call sqliteFree() on Mem.z */
-#define MEM_Static    0x0800   /* Mem.z points to a static string */
-#define MEM_Ephem     0x1000   /* Mem.z points to an ephemeral string */
-#define MEM_Agg       0x2000   /* Mem.z points to an agg function context */
-#define MEM_Zero      0x4000   /* Mem.i contains count of 0s appended to blob */
-
-#ifdef SQLITE_OMIT_INCRBLOB
-  #undef MEM_Zero
-  #define MEM_Zero 0x0000
-#endif
-
-
-/*
-** Clear any existing type flags from a Mem and replace them with f
-*/
-#define MemSetTypeFlag(p, f) \
-   ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero))|f)
-
-
-/* A VdbeFunc is just a FuncDef (defined in sqliteInt.h) that contains
-** additional information about auxiliary information bound to arguments
-** of the function.  This is used to implement the sqlite3_get_auxdata()
-** and sqlite3_set_auxdata() APIs.  The "auxdata" is some auxiliary data
-** that can be associated with a constant argument to a function.  This
-** allows functions such as "regexp" to compile their constant regular
-** expression argument once and reused the compiled code for multiple
-** invocations.
-*/
-struct VdbeFunc {
-  FuncDef *pFunc;               /* The definition of the function */
-  int nAux;                     /* Number of entries allocated for apAux[] */
-  struct AuxData {
-    void *pAux;                   /* Aux data for the i-th argument */
-    void (*xDelete)(void *);      /* Destructor for the aux data */
-  } apAux[1];                   /* One slot for each function argument */
-};
-
-/*
-** The "context" argument for a installable function.  A pointer to an
-** instance of this structure is the first argument to the routines used
-** implement the SQL functions.
-**
-** There is a typedef for this structure in sqlite.h.  So all routines,
-** even the public interface to SQLite, can use a pointer to this structure.
-** But this file is the only place where the internal details of this
-** structure are known.
-**
-** This structure is defined inside of vdbeInt.h because it uses substructures
-** (Mem) which are only defined there.
-*/
-struct sqlite3_context {
-  FuncDef *pFunc;       /* Pointer to function information.  MUST BE FIRST */
-  VdbeFunc *pVdbeFunc;  /* Auxilary data, if created. */
-  Mem s;                /* The return value is stored here */
-  Mem *pMem;            /* Memory cell used to store aggregate context */
-  int isError;          /* Error code returned by the function. */
-  CollSeq *pColl;       /* Collating sequence */
-};
-
-/*
-** A Set structure is used for quick testing to see if a value
-** is part of a small set.  Sets are used to implement code like
-** this:
-**            x.y IN ('hi','hoo','hum')
-*/
-typedef struct Set Set;
-struct Set {
-  Hash hash;             /* A set is just a hash table */
-  HashElem *prev;        /* Previously accessed hash elemen */
-};
-
-/*
-** An instance of the virtual machine.  This structure contains the complete
-** state of the virtual machine.
-**
-** The "sqlite3_stmt" structure pointer that is returned by sqlite3_compile()
-** is really a pointer to an instance of this structure.
-**
-** The Vdbe.inVtabMethod variable is set to non-zero for the duration of
-** any virtual table method invocations made by the vdbe program. It is
-** set to 2 for xDestroy method calls and 1 for all other methods. This
-** variable is used for two purposes: to allow xDestroy methods to execute
-** "DROP TABLE" statements and to prevent some nasty side effects of
-** malloc failure when SQLite is invoked recursively by a virtual table 
-** method function.
-*/
-struct Vdbe {
-  sqlite3 *db;            /* The database connection that owns this statement */
-  Vdbe *pPrev,*pNext;     /* Linked list of VDBEs with the same Vdbe.db */
-  int nOp;                /* Number of instructions in the program */
-  int nOpAlloc;           /* Number of slots allocated for aOp[] */
-  Op *aOp;                /* Space to hold the virtual machine's program */
-  int nLabel;             /* Number of labels used */
-  int nLabelAlloc;        /* Number of slots allocated in aLabel[] */
-  int *aLabel;            /* Space to hold the labels */
-  Mem **apArg;            /* Arguments to currently executing user function */
-  Mem *aColName;          /* Column names to return */
-  Mem *pResultSet;        /* Pointer to an array of results */
-  u16 nResColumn;         /* Number of columns in one row of the result set */
-  u16 nCursor;            /* Number of slots in apCsr[] */
-  VdbeCursor **apCsr;     /* One element of this array for each open cursor */
-  u8 errorAction;         /* Recovery action to do in case of an error */
-  u8 okVar;               /* True if azVar[] has been initialized */
-  ynVar nVar;             /* Number of entries in aVar[] */
-  Mem *aVar;              /* Values for the OP_Variable opcode. */
-  char **azVar;           /* Name of variables */
-  u32 magic;              /* Magic number for sanity checking */
-  int nMem;               /* Number of memory locations currently allocated */
-  Mem *aMem;              /* The memory locations */
-  u32 cacheCtr;           /* VdbeCursor row cache generation counter */
-  int pc;                 /* The program counter */
-  int rc;                 /* Value to return */
-  char *zErrMsg;          /* Error message written here */
-  u8 explain;             /* True if EXPLAIN present on SQL command */
-  u8 changeCntOn;         /* True to update the change-counter */
-  u8 expired;             /* True if the VM needs to be recompiled */
-  u8 runOnlyOnce;         /* Automatically expire on reset */
-  u8 minWriteFileFormat;  /* Minimum file format for writable database files */
-  u8 inVtabMethod;        /* See comments above */
-  u8 usesStmtJournal;     /* True if uses a statement journal */
-  u8 readOnly;            /* True for read-only statements */
-  u8 isPrepareV2;         /* True if prepared with prepare_v2() */
-  int nChange;            /* Number of db changes made since last reset */
-  int btreeMask;          /* Bitmask of db->aDb[] entries referenced */
-  i64 startTime;          /* Time when query started - used for profiling */
-  BtreeMutexArray aMutex; /* An array of Btree used here and needing locks */
-  int aCounter[3];        /* Counters used by sqlite3_stmt_status() */
-  char *zSql;             /* Text of the SQL statement that generated this */
-  void *pFree;            /* Free this when deleting the vdbe */
-  i64 nFkConstraint;      /* Number of imm. FK constraints this VM */
-  i64 nStmtDefCons;       /* Number of def. constraints when stmt started */
-  int iStatement;         /* Statement number (or 0 if has not opened stmt) */
-#ifdef SQLITE_DEBUG
-  FILE *trace;            /* Write an execution trace here, if not NULL */
-#endif
-  VdbeFrame *pFrame;      /* Parent frame */
-  int nFrame;             /* Number of frames in pFrame list */
-  u32 expmask;            /* Binding to these vars invalidates VM */
-};
-
-/*
-** The following are allowed values for Vdbe.magic
-*/
-#define VDBE_MAGIC_INIT     0x26bceaa5    /* Building a VDBE program */
-#define VDBE_MAGIC_RUN      0xbdf20da3    /* VDBE is ready to execute */
-#define VDBE_MAGIC_HALT     0x519c2973    /* VDBE has completed execution */
-#define VDBE_MAGIC_DEAD     0xb606c3c8    /* The VDBE has been deallocated */
-
-/*
-** Function prototypes
-*/
-SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*);
-void sqliteVdbePopStack(Vdbe*,int);
-SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor*);
-#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
-SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, Op*);
-#endif
-SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32);
-SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem*, int);
-SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, int, Mem*, int);
-SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
-SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(VdbeFunc*, int);
-
-int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *);
-SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(VdbeCursor*,UnpackedRecord*,int*);
-SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor *, i64 *);
-SQLITE_PRIVATE int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*);
-SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*);
-SQLITE_PRIVATE int sqlite3VdbeList(Vdbe*);
-SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe*);
-SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *, int);
-SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem*);
-SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem*, const Mem*);
-SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem*, const Mem*, int);
-SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem*, Mem*);
-SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem*);
-SQLITE_PRIVATE int sqlite3VdbeMemSetStr(Mem*, const char*, int, u8, void(*)(void*));
-SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem*, i64);
-#ifdef SQLITE_OMIT_FLOATING_POINT
-# define sqlite3VdbeMemSetDouble sqlite3VdbeMemSetInt64
-#else
-SQLITE_PRIVATE   void sqlite3VdbeMemSetDouble(Mem*, double);
-#endif
-SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem*);
-SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem*,int);
-SQLITE_PRIVATE void sqlite3VdbeMemSetRowSet(Mem*);
-SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem*);
-SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, int);
-SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem*);
-SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*);
-SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*);
-SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*);
-SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*);
-SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*);
-SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,int,int,int,Mem*);
-SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p);
-SQLITE_PRIVATE void sqlite3VdbeMemReleaseExternal(Mem *p);
-SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*);
-SQLITE_PRIVATE const char *sqlite3OpcodeName(int);
-SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve);
-SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int);
-SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame*);
-SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *);
-SQLITE_PRIVATE void sqlite3VdbeMemStoreType(Mem *pMem);
-
-#ifndef SQLITE_OMIT_FOREIGN_KEY
-SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *, int);
-#else
-# define sqlite3VdbeCheckFk(p,i) 0
-#endif
-
-#ifndef SQLITE_OMIT_SHARED_CACHE
-SQLITE_PRIVATE void sqlite3VdbeMutexArrayEnter(Vdbe *p);
-#else
-# define sqlite3VdbeMutexArrayEnter(p)
-#endif
-
-SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem*, u8);
-#ifdef SQLITE_DEBUG
-SQLITE_PRIVATE   void sqlite3VdbePrintSql(Vdbe*);
-SQLITE_PRIVATE   void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf);
-#endif
-SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem);
-
-#ifndef SQLITE_OMIT_INCRBLOB
-SQLITE_PRIVATE   int sqlite3VdbeMemExpandBlob(Mem *);
-#else
-  #define sqlite3VdbeMemExpandBlob(x) SQLITE_OK
-#endif
-
-#endif /* !defined(_VDBEINT_H_) */
-
-/************** End of vdbeInt.h *********************************************/
-/************** Continuing where we left off in utf.c ************************/
 
 #ifndef SQLITE_AMALGAMATION
 /*
@@ -22453,6 +22625,7 @@ struct unixFile {
   int fileFlags;                      /* Miscellanous flags */
   const char *zPath;                  /* Name of the file */
   unixShm *pShm;                      /* Shared memory segment information */
+  int szChunk;                        /* Configured by FCNTL_CHUNK_SIZE */
 #if SQLITE_ENABLE_LOCKING_STYLE
   int openFlags;                      /* The flags specified at open() */
 #endif
@@ -25211,6 +25384,7 @@ static int unixWrite(
   }
   SimulateIOError(( wrote=(-1), amt=1 ));
   SimulateDiskfullError(( wrote=0, amt=1 ));
+
   if( amt>0 ){
     if( wrote<0 ){
       /* lastErrno set by seekAndWrite */
@@ -25220,6 +25394,7 @@ static int unixWrite(
       return SQLITE_FULL;
     }
   }
+
   return SQLITE_OK;
 }
 
@@ -25421,12 +25596,23 @@ static int unixSync(sqlite3_file *id, int flags){
 ** Truncate an open file to a specified size
 */
 static int unixTruncate(sqlite3_file *id, i64 nByte){
+  unixFile *pFile = (unixFile *)id;
   int rc;
-  assert( id );
+  assert( pFile );
   SimulateIOError( return SQLITE_IOERR_TRUNCATE );
-  rc = ftruncate(((unixFile*)id)->h, (off_t)nByte);
+
+  /* If the user has configured a chunk-size for this file, truncate the
+  ** file so that it consists of an integer number of chunks (i.e. the
+  ** actual file size after the operation may be larger than the requested
+  ** size).
+  */
+  if( pFile->szChunk ){
+    nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk;
+  }
+
+  rc = ftruncate(pFile->h, (off_t)nByte);
   if( rc ){
-    ((unixFile*)id)->lastErrno = errno;
+    pFile->lastErrno = errno;
     return SQLITE_IOERR_TRUNCATE;
   }else{
 #ifndef NDEBUG
@@ -25437,8 +25623,8 @@ static int unixTruncate(sqlite3_file *id, i64 nByte){
     ** when restoring a database using the backup API from a zero-length
     ** source.
     */
-    if( ((unixFile*)id)->inNormalWrite && nByte==0 ){
-      ((unixFile*)id)->transCntrChng = 1;
+    if( pFile->inNormalWrite && nByte==0 ){
+      pFile->transCntrChng = 1;
     }
 #endif
 
@@ -25481,6 +25667,54 @@ static int unixFileSize(sqlite3_file *id, i64 *pSize){
 static int proxyFileControl(sqlite3_file*,int,void*);
 #endif
 
+/* 
+** This function is called to handle the SQLITE_FCNTL_SIZE_HINT 
+** file-control operation.
+**
+** If the user has configured a chunk-size for this file, it could be
+** that the file needs to be extended at this point. Otherwise, the
+** SQLITE_FCNTL_SIZE_HINT operation is a no-op for Unix.
+*/
+static int fcntlSizeHint(unixFile *pFile, i64 nByte){
+  if( pFile->szChunk ){
+    i64 nSize;                    /* Required file size */
+    struct stat buf;              /* Used to hold return values of fstat() */
+   
+    if( fstat(pFile->h, &buf) ) return SQLITE_IOERR_FSTAT;
+
+    nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk;
+    if( nSize>(i64)buf.st_size ){
+#if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE
+      if( posix_fallocate(pFile->h, buf.st_size, nSize-buf.st_size) ){
+        return SQLITE_IOERR_WRITE;
+      }
+#else
+      /* If the OS does not have posix_fallocate(), fake it. First use
+      ** ftruncate() to set the file size, then write a single byte to
+      ** the last byte in each block within the extended region. This
+      ** is the same technique used by glibc to implement posix_fallocate()
+      ** on systems that do not have a real fallocate() system call.
+      */
+      int nBlk = buf.st_blksize;  /* File-system block size */
+      i64 iWrite;                 /* Next offset to write to */
+      int nWrite;                 /* Return value from seekAndWrite() */
+
+      if( ftruncate(pFile->h, nSize) ){
+        pFile->lastErrno = errno;
+        return SQLITE_IOERR_TRUNCATE;
+      }
+      iWrite = ((buf.st_size + 2*nBlk - 1)/nBlk)*nBlk-1;
+      do {
+        nWrite = seekAndWrite(pFile, iWrite, "", 1);
+        iWrite += nBlk;
+      } while( nWrite==1 && iWrite<nSize );
+      if( nWrite!=1 ) return SQLITE_IOERR_WRITE;
+#endif
+    }
+  }
+
+  return SQLITE_OK;
+}
 
 /*
 ** Information and control of an open file handle.
@@ -25495,14 +25729,13 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){
       *(int*)pArg = ((unixFile*)id)->lastErrno;
       return SQLITE_OK;
     }
-    case SQLITE_FCNTL_SIZE_HINT: {
-#if 0 /* No performance advantage seen on Linux */
-      sqlite3_int64 szFile = *(sqlite3_int64*)pArg;
-      unixFile *pFile = (unixFile*)id;
-      ftruncate(pFile->h, szFile);
-#endif
+    case SQLITE_FCNTL_CHUNK_SIZE: {
+      ((unixFile*)id)->szChunk = *(int *)pArg;
       return SQLITE_OK;
     }
+    case SQLITE_FCNTL_SIZE_HINT: {
+      return fcntlSizeHint((unixFile *)id, *(i64 *)pArg);
+    }
 #ifndef NDEBUG
     /* The pager calls this method to signal that it has done
     ** a rollback and that the database is therefore unchanged and
@@ -28366,7 +28599,7 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) {
       pCtx->conchFile->pMethod->xClose((sqlite3_file *)pCtx->conchFile);
       sqlite3_free(pCtx->conchFile);
     }
-    sqlite3_free(pCtx->lockProxyPath);
+    sqlite3DbFree(0, pCtx->lockProxyPath);
     sqlite3_free(pCtx->conchFilePath); 
     sqlite3_free(pCtx);
   }
@@ -28557,9 +28790,9 @@ static int proxyClose(sqlite3_file *id) {
       if( rc ) return rc;
       sqlite3_free(conchFile);
     }
-    sqlite3_free(pCtx->lockProxyPath);
+    sqlite3DbFree(0, pCtx->lockProxyPath);
     sqlite3_free(pCtx->conchFilePath);
-    sqlite3_free(pCtx->dbPath);
+    sqlite3DbFree(0, pCtx->dbPath);
     /* restore the original locking context and pMethod then close it */
     pFile->lockingContext = pCtx->oldLockingContext;
     pFile->pMethod = pCtx->pOldMethod;
@@ -29005,6 +29238,7 @@ struct winFile {
   DWORD sectorSize;       /* Sector size of the device file is on */
   winShm *pShm;           /* Instance of shared memory on this file */
   const char *zPath;      /* Full pathname of this file */
+  int szChunk;            /* Chunk size configured by FCNTL_CHUNK_SIZE */
 #if SQLITE_OS_WINCE
   WCHAR *zDeleteOnClose;  /* Name of file to delete when closing */
   HANDLE hMutex;          /* Mutex used to control access to shared lock */  
@@ -29517,6 +29751,42 @@ static BOOL winceLockFileEx(
 ******************************************************************************/
 
 /*
+** Some microsoft compilers lack this definition.
+*/
+#ifndef INVALID_SET_FILE_POINTER
+# define INVALID_SET_FILE_POINTER ((DWORD)-1)
+#endif
+
+/*
+** Move the current position of the file handle passed as the first 
+** argument to offset iOffset within the file. If successful, return 0. 
+** Otherwise, set pFile->lastErrno and return non-zero.
+*/
+static int seekWinFile(winFile *pFile, sqlite3_int64 iOffset){
+  LONG upperBits;                 /* Most sig. 32 bits of new offset */
+  LONG lowerBits;                 /* Least sig. 32 bits of new offset */
+  DWORD dwRet;                    /* Value returned by SetFilePointer() */
+
+  upperBits = (LONG)((iOffset>>32) & 0x7fffffff);
+  lowerBits = (LONG)(iOffset & 0xffffffff);
+
+  /* API oddity: If successful, SetFilePointer() returns a dword 
+  ** containing the lower 32-bits of the new file-offset. Or, if it fails,
+  ** it returns INVALID_SET_FILE_POINTER. However according to MSDN, 
+  ** INVALID_SET_FILE_POINTER may also be a valid new offset. So to determine 
+  ** whether an error has actually occured, it is also necessary to call 
+  ** GetLastError().
+  */
+  dwRet = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
+  if( (dwRet==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR) ){
+    pFile->lastErrno = GetLastError();
+    return 1;
+  }
+
+  return 0;
+}
+
+/*
 ** Close a file.
 **
 ** It is reported that an attempt to close a handle might sometimes
@@ -29559,13 +29829,6 @@ static int winClose(sqlite3_file *id){
 }
 
 /*
-** Some microsoft compilers lack this definition.
-*/
-#ifndef INVALID_SET_FILE_POINTER
-# define INVALID_SET_FILE_POINTER ((DWORD)-1)
-#endif
-
-/*
 ** Read data from a file into a buffer.  Return SQLITE_OK if all
 ** bytes were read successfully and SQLITE_IOERR if anything goes
 ** wrong.
@@ -29576,32 +29839,27 @@ static int winRead(
   int amt,                   /* Number of bytes to read */
   sqlite3_int64 offset       /* Begin reading at this offset */
 ){
-  LONG upperBits = (LONG)((offset>>32) & 0x7fffffff);
-  LONG lowerBits = (LONG)(offset & 0xffffffff);
-  DWORD rc;
-  winFile *pFile = (winFile*)id;
-  DWORD error;
-  DWORD got;
+  winFile *pFile = (winFile*)id;  /* file handle */
+  DWORD nRead;                    /* Number of bytes actually read from file */
 
   assert( id!=0 );
   SimulateIOError(return SQLITE_IOERR_READ);
   OSTRACE(("READ %d lock=%d\n", pFile->h, pFile->locktype));
-  rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
-  if( rc==INVALID_SET_FILE_POINTER && (error=GetLastError())!=NO_ERROR ){
-    pFile->lastErrno = error;
+
+  if( seekWinFile(pFile, offset) ){
     return SQLITE_FULL;
   }
-  if( !ReadFile(pFile->h, pBuf, amt, &got, 0) ){
+  if( !ReadFile(pFile->h, pBuf, amt, &nRead, 0) ){
     pFile->lastErrno = GetLastError();
     return SQLITE_IOERR_READ;
   }
-  if( got==(DWORD)amt ){
-    return SQLITE_OK;
-  }else{
+  if( nRead<(DWORD)amt ){
     /* Unread parts of the buffer must be zero-filled */
-    memset(&((char*)pBuf)[got], 0, amt-got);
+    memset(&((char*)pBuf)[nRead], 0, amt-nRead);
     return SQLITE_IOERR_SHORT_READ;
   }
+
+  return SQLITE_OK;
 }
 
 /*
@@ -29609,47 +29867,42 @@ static int winRead(
 ** or some other error code on failure.
 */
 static int winWrite(
-  sqlite3_file *id,         /* File to write into */
-  const void *pBuf,         /* The bytes to be written */
-  int amt,                  /* Number of bytes to write */
-  sqlite3_int64 offset      /* Offset into the file to begin writing at */
+  sqlite3_file *id,               /* File to write into */
+  const void *pBuf,               /* The bytes to be written */
+  int amt,                        /* Number of bytes to write */
+  sqlite3_int64 offset            /* Offset into the file to begin writing at */
 ){
-  LONG upperBits = (LONG)((offset>>32) & 0x7fffffff);
-  LONG lowerBits = (LONG)(offset & 0xffffffff);
-  DWORD rc;
-  winFile *pFile = (winFile*)id;
-  DWORD error;
-  DWORD wrote = 0;
+  int rc;                         /* True if error has occured, else false */
+  winFile *pFile = (winFile*)id;  /* File handle */
 
-  assert( id!=0 );
+  assert( amt>0 );
+  assert( pFile );
   SimulateIOError(return SQLITE_IOERR_WRITE);
   SimulateDiskfullError(return SQLITE_FULL);
+
   OSTRACE(("WRITE %d lock=%d\n", pFile->h, pFile->locktype));
-  rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
-  if( rc==INVALID_SET_FILE_POINTER && (error=GetLastError())!=NO_ERROR ){
-    pFile->lastErrno = error;
-    if( pFile->lastErrno==ERROR_HANDLE_DISK_FULL ){
-      return SQLITE_FULL;
-    }else{
-      return SQLITE_IOERR_WRITE;
+
+  rc = seekWinFile(pFile, offset);
+  if( rc==0 ){
+    u8 *aRem = (u8 *)pBuf;        /* Data yet to be written */
+    int nRem = amt;               /* Number of bytes yet to be written */
+    DWORD nWrite;                 /* Bytes written by each WriteFile() call */
+
+    while( nRem>0 && WriteFile(pFile->h, aRem, nRem, &nWrite, 0) && nWrite>0 ){
+      aRem += nWrite;
+      nRem -= nWrite;
+    }
+    if( nRem>0 ){
+      pFile->lastErrno = GetLastError();
+      rc = 1;
     }
   }
-  assert( amt>0 );
-  while(
-     amt>0
-     && (rc = WriteFile(pFile->h, pBuf, amt, &wrote, 0))!=0
-     && wrote>0
-  ){
-    amt -= wrote;
-    pBuf = &((char*)pBuf)[wrote];
-  }
-  if( !rc || amt>(int)wrote ){
-    pFile->lastErrno = GetLastError();
+
+  if( rc ){
     if( pFile->lastErrno==ERROR_HANDLE_DISK_FULL ){
       return SQLITE_FULL;
-    }else{
-      return SQLITE_IOERR_WRITE;
     }
+    return SQLITE_IOERR_WRITE;
   }
   return SQLITE_OK;
 }
@@ -29658,26 +29911,32 @@ static int winWrite(
 ** Truncate an open file to a specified size
 */
 static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){
-  LONG upperBits = (LONG)((nByte>>32) & 0x7fffffff);
-  LONG lowerBits = (LONG)(nByte & 0xffffffff);
-  DWORD dwRet;
-  winFile *pFile = (winFile*)id;
-  DWORD error;
-  int rc = SQLITE_OK;
+  winFile *pFile = (winFile*)id;  /* File handle object */
+  int rc = SQLITE_OK;             /* Return code for this function */
+
+  assert( pFile );
 
-  assert( id!=0 );
   OSTRACE(("TRUNCATE %d %lld\n", pFile->h, nByte));
   SimulateIOError(return SQLITE_IOERR_TRUNCATE);
-  dwRet = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
-  if( dwRet==INVALID_SET_FILE_POINTER && (error=GetLastError())!=NO_ERROR ){
-    pFile->lastErrno = error;
+
+  /* If the user has configured a chunk-size for this file, truncate the
+  ** file so that it consists of an integer number of chunks (i.e. the
+  ** actual file size after the operation may be larger than the requested
+  ** size).
+  */
+  if( pFile->szChunk ){
+    nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk;
+  }
+
+  /* SetEndOfFile() returns non-zero when successful, or zero when it fails. */
+  if( seekWinFile(pFile, nByte) ){
     rc = SQLITE_IOERR_TRUNCATE;
-  /* SetEndOfFile will fail if nByte is negative */
-  }else if( !SetEndOfFile(pFile->h) ){
+  }else if( 0==SetEndOfFile(pFile->h) ){
     pFile->lastErrno = GetLastError();
     rc = SQLITE_IOERR_TRUNCATE;
   }
-  OSTRACE(("TRUNCATE %d %lld %s\n", pFile->h, nByte, rc==SQLITE_OK ? "ok" : "failed"));
+
+  OSTRACE(("TRUNCATE %d %lld %s\n", pFile->h, nByte, rc ? "failed" : "ok"));
   return rc;
 }
 
@@ -30042,6 +30301,10 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){
       *(int*)pArg = (int)((winFile*)id)->lastErrno;
       return SQLITE_OK;
     }
+    case SQLITE_FCNTL_CHUNK_SIZE: {
+      ((winFile*)id)->szChunk = *(int *)pArg;
+      return SQLITE_OK;
+    }
     case SQLITE_FCNTL_SIZE_HINT: {
       sqlite3_int64 sz = *(sqlite3_int64*)pArg;
       SimulateIOErrorBenign(1);
@@ -31593,7 +31856,7 @@ SQLITE_API int sqlite3_os_end(void){
 */
 
 /* Size of the Bitvec structure in bytes. */
-#define BITVEC_SZ        (sizeof(void*)*128)  /* 512 on 32bit.  1024 on 64bit */
+#define BITVEC_SZ        512
 
 /* Round the union size down to the nearest pointer boundary, since that's how 
 ** it will be aligned within the Bitvec struct. */
@@ -32703,11 +32966,11 @@ SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *pBuf, int sz, int n){
 static void *pcache1Alloc(int nByte){
   void *p;
   assert( sqlite3_mutex_held(pcache1.mutex) );
+  sqlite3StatusSet(SQLITE_STATUS_PAGECACHE_SIZE, nByte);
   if( nByte<=pcache1.szSlot && pcache1.pFree ){
     assert( pcache1.isInit );
     p = (PgHdr1 *)pcache1.pFree;
     pcache1.pFree = pcache1.pFree->pNext;
-    sqlite3StatusSet(SQLITE_STATUS_PAGECACHE_SIZE, nByte);
     sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_USED, 1);
   }else{
 
@@ -32751,6 +33014,25 @@ static void pcache1Free(void *p){
   }
 }
 
+#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
+/*
+** Return the size of a pache allocation
+*/
+static int pcache1MemSize(void *p){
+  assert( sqlite3_mutex_held(pcache1.mutex) );
+  if( p>=pcache1.pStart && p<pcache1.pEnd ){
+    return pcache1.szSlot;
+  }else{
+    int iSize;
+    assert( sqlite3MemdebugHasType(p, MEMTYPE_PCACHE) );
+    sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
+    iSize = sqlite3MallocSize(p);
+    sqlite3MemdebugSetType(p, MEMTYPE_PCACHE);
+    return iSize;
+  }
+}
+#endif /* SQLITE_ENABLE_MEMORY_MANAGEMENT */
+
 /*
 ** Allocate a new page object initially associated with cache pCache.
 */
@@ -33299,7 +33581,7 @@ SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int nReq){
     PgHdr1 *p;
     pcache1EnterMutex();
     while( (nReq<0 || nFree<nReq) && (p=pcache1.pLruTail) ){
-      nFree += sqlite3MallocSize(PGHDR1_TO_PAGE(p));
+      nFree += pcache1MemSize(PGHDR1_TO_PAGE(p));
       pcache1PinPage(p);
       pcache1RemoveFromHash(p);
       pcache1FreePage(p);
@@ -33808,7 +34090,7 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, u8 iBatch, sqlite3_int64 i
 # define sqlite3WalBeginReadTransaction(y,z)   0
 # define sqlite3WalEndReadTransaction(z)
 # define sqlite3WalRead(v,w,x,y,z)             0
-# define sqlite3WalDbsize(y,z)
+# define sqlite3WalDbsize(y)                   0
 # define sqlite3WalBeginWriteTransaction(y)    0
 # define sqlite3WalEndWriteTransaction(x)      0
 # define sqlite3WalUndo(x,y,z)                 0
@@ -33844,9 +34126,8 @@ SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal);
 /* Read a page from the write-ahead log, if it is present. */
 SQLITE_PRIVATE int sqlite3WalRead(Wal *pWal, Pgno pgno, int *pInWal, int nOut, u8 *pOut);
 
-/* Return the size of the database as it existed at the beginning
-** of the snapshot */
-SQLITE_PRIVATE void sqlite3WalDbsize(Wal *pWal, Pgno *pPgno);
+/* If the WAL is not empty, return the size of the database. */
+SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal);
 
 /* Obtain or release the WRITER lock. */
 SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal);
@@ -33892,8 +34173,12 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op);
 /************** End of wal.h *************************************************/
 /************** Continuing where we left off in pager.c **********************/
 
-/*
-******************** NOTES ON THE DESIGN OF THE PAGER ************************
+
+/******************* NOTES ON THE DESIGN OF THE PAGER ************************
+**
+** This comment block describes invariants that hold when using a rollback
+** journal.  These invariants do not apply for journal_mode=WAL,
+** journal_mode=MEMORY, or journal_mode=OFF.
 **
 ** Within this comment block, a page is deemed to have been synced
 ** automatically as soon as it is written when PRAGMA synchronous=OFF.
@@ -33927,7 +34212,7 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op);
 **     transaction.
 ** 
 ** (3) Writes to the database file are an integer multiple of the page size
-**     in length and are aligned to a page boundary.
+**     in length and are aligned on a page boundary.
 ** 
 ** (4) Reads from the database file are either aligned on a page boundary and
 **     an integer multiple of the page size in length or are taken from the
@@ -33958,7 +34243,8 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op);
 ** 
 ** (9) Whenever the database file is modified, at least one bit in the range
 **     of bytes from 24 through 39 inclusive will be changed prior to releasing
-**     the EXCLUSIVE lock.
+**     the EXCLUSIVE lock, thus signaling other connections on the same
+**     database to flush their caches.
 **
 ** (10) The pattern of bits in bytes 24 through 39 shall not repeat in less
 **      than one billion transactions.
@@ -33971,7 +34257,8 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op);
 **
 ** (13) A SHARED lock is held on the database file while reading any
 **      content out of the database file.
-*/
+**
+******************************************************************************/
 
 /*
 ** Macros for troubleshooting.  Normally turned off
@@ -33996,58 +34283,279 @@ int sqlite3PagerTrace=1;  /* True to enable tracing */
 #define FILEHANDLEID(fd) ((int)fd)
 
 /*
-** The page cache as a whole is always in one of the following
-** states:
-**
-**   PAGER_UNLOCK        The page cache is not currently reading or 
-**                       writing the database file.  There is no
-**                       data held in memory.  This is the initial
-**                       state.
-**
-**   PAGER_SHARED        The page cache is reading the database.
-**                       Writing is not permitted.  There can be
-**                       multiple readers accessing the same database
-**                       file at the same time.
-**
-**   PAGER_RESERVED      This process has reserved the database for writing
-**                       but has not yet made any changes.  Only one process
-**                       at a time can reserve the database.  The original
-**                       database file has not been modified so other
-**                       processes may still be reading the on-disk
-**                       database file.
-**
-**   PAGER_EXCLUSIVE     The page cache is writing the database.
-**                       Access is exclusive.  No other processes or
-**                       threads can be reading or writing while one
-**                       process is writing.
-**
-**   PAGER_SYNCED        The pager moves to this state from PAGER_EXCLUSIVE
-**                       after all dirty pages have been written to the
-**                       database file and the file has been synced to
-**                       disk. All that remains to do is to remove or
-**                       truncate the journal file and the transaction 
-**                       will be committed.
-**
-** The page cache comes up in PAGER_UNLOCK.  The first time a
-** sqlite3PagerGet() occurs, the state transitions to PAGER_SHARED.
-** After all pages have been released using sqlite_page_unref(),
-** the state transitions back to PAGER_UNLOCK.  The first time
-** that sqlite3PagerWrite() is called, the state transitions to
-** PAGER_RESERVED.  (Note that sqlite3PagerWrite() can only be
-** called on an outstanding page which means that the pager must
-** be in PAGER_SHARED before it transitions to PAGER_RESERVED.)
-** PAGER_RESERVED means that there is an open rollback journal.
-** The transition to PAGER_EXCLUSIVE occurs before any changes
-** are made to the database file, though writes to the rollback
-** journal occurs with just PAGER_RESERVED.  After an sqlite3PagerRollback()
-** or sqlite3PagerCommitPhaseTwo(), the state can go back to PAGER_SHARED,
-** or it can stay at PAGER_EXCLUSIVE if we are in exclusive access mode.
-*/
-#define PAGER_UNLOCK      0
-#define PAGER_SHARED      1   /* same as SHARED_LOCK */
-#define PAGER_RESERVED    2   /* same as RESERVED_LOCK */
-#define PAGER_EXCLUSIVE   4   /* same as EXCLUSIVE_LOCK */
-#define PAGER_SYNCED      5
+** The Pager.eState variable stores the current 'state' of a pager. A
+** pager may be in any one of the seven states shown in the following
+** state diagram.
+**
+**                            OPEN <------+------+
+**                              |         |      |
+**                              V         |      |
+**               +---------> READER-------+      |
+**               |              |                |
+**               |              V                |
+**               |<-------WRITER_LOCKED------> ERROR
+**               |              |                ^  
+**               |              V                |
+**               |<------WRITER_CACHEMOD-------->|
+**               |              |                |
+**               |              V                |
+**               |<-------WRITER_DBMOD---------->|
+**               |              |                |
+**               |              V                |
+**               +<------WRITER_FINISHED-------->+
+**
+**
+** List of state transitions and the C [function] that performs each:
+** 
+**   OPEN              -> READER              [sqlite3PagerSharedLock]
+**   READER            -> OPEN                [pager_unlock]
+**
+**   READER            -> WRITER_LOCKED       [sqlite3PagerBegin]
+**   WRITER_LOCKED     -> WRITER_CACHEMOD     [pager_open_journal]
+**   WRITER_CACHEMOD   -> WRITER_DBMOD        [syncJournal]
+**   WRITER_DBMOD      -> WRITER_FINISHED     [sqlite3PagerCommitPhaseOne]
+**   WRITER_***        -> READER              [pager_end_transaction]
+**
+**   WRITER_***        -> ERROR               [pager_error]
+**   ERROR             -> OPEN                [pager_unlock]
+** 
+**
+**  OPEN:
+**
+**    The pager starts up in this state. Nothing is guaranteed in this
+**    state - the file may or may not be locked and the database size is
+**    unknown. The database may not be read or written.
+**
+**    * No read or write transaction is active.
+**    * Any lock, or no lock at all, may be held on the database file.
+**    * The dbSize, dbOrigSize and dbFileSize variables may not be trusted.
+**
+**  READER:
+**
+**    In this state all the requirements for reading the database in 
+**    rollback (non-WAL) mode are met. Unless the pager is (or recently
+**    was) in exclusive-locking mode, a user-level read transaction is 
+**    open. The database size is known in this state.
+**
+**    A connection running with locking_mode=normal enters this state when
+**    it opens a read-transaction on the database and returns to state
+**    OPEN after the read-transaction is completed. However a connection
+**    running in locking_mode=exclusive (including temp databases) remains in
+**    this state even after the read-transaction is closed. The only way
+**    a locking_mode=exclusive connection can transition from READER to OPEN
+**    is via the ERROR state (see below).
+** 
+**    * A read transaction may be active (but a write-transaction cannot).
+**    * A SHARED or greater lock is held on the database file.
+**    * The dbSize variable may be trusted (even if a user-level read 
+**      transaction is not active). The dbOrigSize and dbFileSize variables
+**      may not be trusted at this point.
+**    * If the database is a WAL database, then the WAL connection is open.
+**    * Even if a read-transaction is not open, it is guaranteed that 
+**      there is no hot-journal in the file-system.
+**
+**  WRITER_LOCKED:
+**
+**    The pager moves to this state from READER when a write-transaction
+**    is first opened on the database. In WRITER_LOCKED state, all locks 
+**    required to start a write-transaction are held, but no actual 
+**    modifications to the cache or database have taken place.
+**
+**    In rollback mode, a RESERVED or (if the transaction was opened with 
+**    BEGIN EXCLUSIVE) EXCLUSIVE lock is obtained on the database file when
+**    moving to this state, but the journal file is not written to or opened 
+**    to in this state. If the transaction is committed or rolled back while 
+**    in WRITER_LOCKED state, all that is required is to unlock the database 
+**    file.
+**
+**    IN WAL mode, WalBeginWriteTransaction() is called to lock the log file.
+**    If the connection is running with locking_mode=exclusive, an attempt
+**    is made to obtain an EXCLUSIVE lock on the database file.
+**
+**    * A write transaction is active.
+**    * If the connection is open in rollback-mode, a RESERVED or greater 
+**      lock is held on the database file.
+**    * If the connection is open in WAL-mode, a WAL write transaction
+**      is open (i.e. sqlite3WalBeginWriteTransaction() has been successfully
+**      called).
+**    * The dbSize, dbOrigSize and dbFileSize variables are all valid.
+**    * The contents of the pager cache have not been modified.
+**    * The journal file may or may not be open.
+**    * Nothing (not even the first header) has been written to the journal.
+**
+**  WRITER_CACHEMOD:
+**
+**    A pager moves from WRITER_LOCKED state to this state when a page is
+**    first modified by the upper layer. In rollback mode the journal file
+**    is opened (if it is not already open) and a header written to the
+**    start of it. The database file on disk has not been modified.
+**
+**    * A write transaction is active.
+**    * A RESERVED or greater lock is held on the database file.
+**    * The journal file is open and the first header has been written 
+**      to it, but the header has not been synced to disk.
+**    * The contents of the page cache have been modified.
+**
+**  WRITER_DBMOD:
+**
+**    The pager transitions from WRITER_CACHEMOD into WRITER_DBMOD state
+**    when it modifies the contents of the database file. WAL connections
+**    never enter this state (since they do not modify the database file,
+**    just the log file).
+**
+**    * A write transaction is active.
+**    * An EXCLUSIVE or greater lock is held on the database file.
+**    * The journal file is open and the first header has been written 
+**      and synced to disk.
+**    * The contents of the page cache have been modified (and possibly
+**      written to disk).
+**
+**  WRITER_FINISHED:
+**
+**    It is not possible for a WAL connection to enter this state.
+**
+**    A rollback-mode pager changes to WRITER_FINISHED state from WRITER_DBMOD
+**    state after the entire transaction has been successfully written into the
+**    database file. In this state the transaction may be committed simply
+**    by finalizing the journal file. Once in WRITER_FINISHED state, it is 
+**    not possible to modify the database further. At this point, the upper 
+**    layer must either commit or rollback the transaction.
+**
+**    * A write transaction is active.
+**    * An EXCLUSIVE or greater lock is held on the database file.
+**    * All writing and syncing of journal and database data has finished.
+**      If no error occured, all that remains is to finalize the journal to
+**      commit the transaction. If an error did occur, the caller will need
+**      to rollback the transaction. 
+**
+**  ERROR:
+**
+**    The ERROR state is entered when an IO or disk-full error (including
+**    SQLITE_IOERR_NOMEM) occurs at a point in the code that makes it 
+**    difficult to be sure that the in-memory pager state (cache contents, 
+**    db size etc.) are consistent with the contents of the file-system.
+**
+**    Temporary pager files may enter the ERROR state, but in-memory pagers
+**    cannot.
+**
+**    For example, if an IO error occurs while performing a rollback, 
+**    the contents of the page-cache may be left in an inconsistent state.
+**    At this point it would be dangerous to change back to READER state
+**    (as usually happens after a rollback). Any subsequent readers might
+**    report database corruption (due to the inconsistent cache), and if
+**    they upgrade to writers, they may inadvertently corrupt the database
+**    file. To avoid this hazard, the pager switches into the ERROR state
+**    instead of READER following such an error.
+**
+**    Once it has entered the ERROR state, any attempt to use the pager
+**    to read or write data returns an error. Eventually, once all 
+**    outstanding transactions have been abandoned, the pager is able to
+**    transition back to OPEN state, discarding the contents of the 
+**    page-cache and any other in-memory state at the same time. Everything
+**    is reloaded from disk (and, if necessary, hot-journal rollback peformed)
+**    when a read-transaction is next opened on the pager (transitioning
+**    the pager into READER state). At that point the system has recovered 
+**    from the error.
+**
+**    Specifically, the pager jumps into the ERROR state if:
+**
+**      1. An error occurs while attempting a rollback. This happens in
+**         function sqlite3PagerRollback().
+**
+**      2. An error occurs while attempting to finalize a journal file
+**         following a commit in function sqlite3PagerCommitPhaseTwo().
+**
+**      3. An error occurs while attempting to write to the journal or
+**         database file in function pagerStress() in order to free up
+**         memory.
+**
+**    In other cases, the error is returned to the b-tree layer. The b-tree
+**    layer then attempts a rollback operation. If the error condition 
+**    persists, the pager enters the ERROR state via condition (1) above.
+**
+**    Condition (3) is necessary because it can be triggered by a read-only
+**    statement executed within a transaction. In this case, if the error
+**    code were simply returned to the user, the b-tree layer would not
+**    automatically attempt a rollback, as it assumes that an error in a
+**    read-only statement cannot leave the pager in an internally inconsistent 
+**    state.
+**
+**    * The Pager.errCode variable is set to something other than SQLITE_OK.
+**    * There are one or more outstanding references to pages (after the
+**      last reference is dropped the pager should move back to OPEN state).
+**    * The pager is not an in-memory pager.
+**    
+**
+** Notes:
+**
+**   * A pager is never in WRITER_DBMOD or WRITER_FINISHED state if the
+**     connection is open in WAL mode. A WAL connection is always in one
+**     of the first four states.
+**
+**   * Normally, a connection open in exclusive mode is never in PAGER_OPEN
+**     state. There are two exceptions: immediately after exclusive-mode has
+**     been turned on (and before any read or write transactions are 
+**     executed), and when the pager is leaving the "error state".
+**
+**   * See also: assert_pager_state().
+*/
+#define PAGER_OPEN                  0
+#define PAGER_READER                1
+#define PAGER_WRITER_LOCKED         2
+#define PAGER_WRITER_CACHEMOD       3
+#define PAGER_WRITER_DBMOD          4
+#define PAGER_WRITER_FINISHED       5
+#define PAGER_ERROR                 6
+
+/*
+** The Pager.eLock variable is almost always set to one of the 
+** following locking-states, according to the lock currently held on
+** the database file: NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK.
+** This variable is kept up to date as locks are taken and released by
+** the pagerLockDb() and pagerUnlockDb() wrappers.
+**
+** If the VFS xLock() or xUnlock() returns an error other than SQLITE_BUSY
+** (i.e. one of the SQLITE_IOERR subtypes), it is not clear whether or not
+** the operation was successful. In these circumstances pagerLockDb() and
+** pagerUnlockDb() take a conservative approach - eLock is always updated
+** when unlocking the file, and only updated when locking the file if the
+** VFS call is successful. This way, the Pager.eLock variable may be set
+** to a less exclusive (lower) value than the lock that is actually held
+** at the system level, but it is never set to a more exclusive value.
+**
+** This is usually safe. If an xUnlock fails or appears to fail, there may 
+** be a few redundant xLock() calls or a lock may be held for longer than
+** required, but nothing really goes wrong.
+**
+** The exception is when the database file is unlocked as the pager moves
+** from ERROR to OPEN state. At this point there may be a hot-journal file 
+** in the file-system that needs to be rolled back (as part of a OPEN->SHARED
+** transition, by the same pager or any other). If the call to xUnlock()
+** fails at this point and the pager is left holding an EXCLUSIVE lock, this
+** can confuse the call to xCheckReservedLock() call made later as part
+** of hot-journal detection.
+**
+** xCheckReservedLock() is defined as returning true "if there is a RESERVED 
+** lock held by this process or any others". So xCheckReservedLock may 
+** return true because the caller itself is holding an EXCLUSIVE lock (but
+** doesn't know it because of a previous error in xUnlock). If this happens
+** a hot-journal may be mistaken for a journal being created by an active
+** transaction in another process, causing SQLite to read from the database
+** without rolling it back.
+**
+** To work around this, if a call to xUnlock() fails when unlocking the
+** database in the ERROR state, Pager.eLock is set to UNKNOWN_LOCK. It
+** is only changed back to a real locking state after a successful call
+** to xLock(EXCLUSIVE). Also, the code to do the OPEN->SHARED state transition
+** omits the check for a hot-journal if Pager.eLock is set to UNKNOWN_LOCK 
+** lock. Instead, it assumes a hot-journal exists and obtains an EXCLUSIVE
+** lock on the database file before attempting to roll it back. See function
+** PagerSharedLock() for more detail.
+**
+** Pager.eLock may only be set to UNKNOWN_LOCK when the pager is in 
+** PAGER_OPEN state.
+*/
+#define UNKNOWN_LOCK                (EXCLUSIVE_LOCK+1)
 
 /*
 ** A macro used for invoking the codec if there is one
@@ -34097,33 +34605,28 @@ struct PagerSavepoint {
 };
 
 /*
-** A open page cache is an instance of the following structure.
+** A open page cache is an instance of struct Pager. A description of
+** some of the more important member variables follows:
 **
-** errCode
+** eState
+**
+**   The current 'state' of the pager object. See the comment and state
+**   diagram above for a description of the pager state.
+**
+** eLock
+**
+**   For a real on-disk database, the current lock held on the database file -
+**   NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK.
 **
-**   Pager.errCode may be set to SQLITE_IOERR, SQLITE_CORRUPT, or
-**   or SQLITE_FULL. Once one of the first three errors occurs, it persists
-**   and is returned as the result of every major pager API call.  The
-**   SQLITE_FULL return code is slightly different. It persists only until the
-**   next successful rollback is performed on the pager cache. Also,
-**   SQLITE_FULL does not affect the sqlite3PagerGet() and sqlite3PagerLookup()
-**   APIs, they may still be used successfully.
-**
-** dbSizeValid, dbSize, dbOrigSize, dbFileSize
-**
-**   Managing the size of the database file in pages is a little complicated.
-**   The variable Pager.dbSize contains the number of pages that the database
-**   image currently contains. As the database image grows or shrinks this
-**   variable is updated. The variable Pager.dbFileSize contains the number
-**   of pages in the database file. This may be different from Pager.dbSize
-**   if some pages have been appended to the database image but not yet written
-**   out from the cache to the actual file on disk. Or if the image has been
-**   truncated by an incremental-vacuum operation. The Pager.dbOrigSize variable
-**   contains the number of pages in the database image when the current
-**   transaction was opened. The contents of all three of these variables is
-**   only guaranteed to be correct if the boolean Pager.dbSizeValid is true.
-**
-**   TODO: Under what conditions is dbSizeValid set? Cleared?
+**   For a temporary or in-memory database (neither of which require any
+**   locks), this variable is always set to EXCLUSIVE_LOCK. Since such
+**   databases always have Pager.exclusiveMode==1, this tricks the pager
+**   logic into thinking that it already has all the locks it will ever
+**   need (and no reason to release them).
+**
+**   In some (obscure) circumstances, this variable may also be set to
+**   UNKNOWN_LOCK. See the comment above the #define of UNKNOWN_LOCK for
+**   details.
 **
 ** changeCountDone
 **
@@ -34142,67 +34645,123 @@ struct PagerSavepoint {
 **   need only update the change-counter once, for the first transaction
 **   committed.
 **
-** dbModified
-**
-**   The dbModified flag is set whenever a database page is dirtied.
-**   It is cleared at the end of each transaction.
-**
-**   It is used when committing or otherwise ending a transaction. If
-**   the dbModified flag is clear then less work has to be done.
-**
-** journalStarted
-**
-**   This flag is set whenever the the main journal is opened and
-**   initialized
-**
-**   The point of this flag is that it must be set after the 
-**   first journal header in a journal file has been synced to disk.
-**   After this has happened, new pages appended to the database 
-**   do not need the PGHDR_NEED_SYNC flag set, as they do not need
-**   to wait for a journal sync before they can be written out to
-**   the database file (see function pager_write()).
-**   
 ** setMaster
 **
-**   This variable is used to ensure that the master journal file name
-**   (if any) is only written into the journal file once.
-**
-**   When committing a transaction, the master journal file name (if any)
-**   may be written into the journal file while the pager is still in
-**   PAGER_RESERVED state (see CommitPhaseOne() for the action). It
-**   then attempts to upgrade to an exclusive lock. If this attempt
-**   fails, then SQLITE_BUSY may be returned to the user and the user
-**   may attempt to commit the transaction again later (calling
-**   CommitPhaseOne() again). This flag is used to ensure that the 
-**   master journal name is only written to the journal file the first
-**   time CommitPhaseOne() is called.
+**   When PagerCommitPhaseOne() is called to commit a transaction, it may
+**   (or may not) specify a master-journal name to be written into the 
+**   journal file before it is synced to disk.
+**
+**   Whether or not a journal file contains a master-journal pointer affects 
+**   the way in which the journal file is finalized after the transaction is 
+**   committed or rolled back when running in "journal_mode=PERSIST" mode.
+**   If a journal file does not contain a master-journal pointer, it is
+**   finalized by overwriting the first journal header with zeroes. If
+**   it does contain a master-journal pointer the journal file is finalized 
+**   by truncating it to zero bytes, just as if the connection were 
+**   running in "journal_mode=truncate" mode.
+**
+**   Journal files that contain master journal pointers cannot be finalized
+**   simply by overwriting the first journal-header with zeroes, as the
+**   master journal pointer could interfere with hot-journal rollback of any
+**   subsequently interrupted transaction that reuses the journal file.
+**
+**   The flag is cleared as soon as the journal file is finalized (either
+**   by PagerCommitPhaseTwo or PagerRollback). If an IO error prevents the
+**   journal file from being successfully finalized, the setMaster flag
+**   is cleared anyway (and the pager will move to ERROR state).
 **
 ** doNotSpill, doNotSyncSpill
 **
-**   When enabled, cache spills are prohibited.  The doNotSpill variable
-**   inhibits all cache spill and doNotSyncSpill inhibits those spills that
-**   would require a journal sync.  The doNotSyncSpill is set and cleared 
-**   by sqlite3PagerWrite() in order to prevent a journal sync from happening 
-**   in between the journalling of two pages on the same sector.  The
-**   doNotSpill value set to prevent pagerStress() from trying to use
-**   the journal during a rollback.
+**   These two boolean variables control the behaviour of cache-spills
+**   (calls made by the pcache module to the pagerStress() routine to
+**   write cached data to the file-system in order to free up memory).
 **
-** needSync
-**
-**   TODO: It might be easier to set this variable in writeJournalHdr()
-**   and writeMasterJournal() only. Change its meaning to "unsynced data
-**   has been written to the journal".
+**   When doNotSpill is non-zero, writing to the database from pagerStress()
+**   is disabled altogether. This is done in a very obscure case that
+**   comes up during savepoint rollback that requires the pcache module
+**   to allocate a new page to prevent the journal file from being written
+**   while it is being traversed by code in pager_playback().
+** 
+**   If doNotSyncSpill is non-zero, writing to the database from pagerStress()
+**   is permitted, but syncing the journal file is not. This flag is set
+**   by sqlite3PagerWrite() when the file-system sector-size is larger than
+**   the database page-size in order to prevent a journal sync from happening 
+**   in between the journalling of two pages on the same sector. 
 **
 ** subjInMemory
 **
 **   This is a boolean variable. If true, then any required sub-journal
 **   is opened as an in-memory journal file. If false, then in-memory
 **   sub-journals are only used for in-memory pager files.
+**
+**   This variable is updated by the upper layer each time a new 
+**   write-transaction is opened.
+**
+** dbSize, dbOrigSize, dbFileSize
+**
+**   Variable dbSize is set to the number of pages in the database file.
+**   It is valid in PAGER_READER and higher states (all states except for
+**   OPEN and ERROR). 
+**
+**   dbSize is set based on the size of the database file, which may be 
+**   larger than the size of the database (the value stored at offset
+**   28 of the database header by the btree). If the size of the file
+**   is not an integer multiple of the page-size, the value stored in
+**   dbSize is rounded down (i.e. a 5KB file with 2K page-size has dbSize==2).
+**   Except, any file that is greater than 0 bytes in size is considered
+**   to have at least one page. (i.e. a 1KB file with 2K page-size leads
+**   to dbSize==1).
+**
+**   During a write-transaction, if pages with page-numbers greater than
+**   dbSize are modified in the cache, dbSize is updated accordingly.
+**   Similarly, if the database is truncated using PagerTruncateImage(), 
+**   dbSize is updated.
+**
+**   Variables dbOrigSize and dbFileSize are valid in states 
+**   PAGER_WRITER_LOCKED and higher. dbOrigSize is a copy of the dbSize
+**   variable at the start of the transaction. It is used during rollback,
+**   and to determine whether or not pages need to be journalled before
+**   being modified.
+**
+**   Throughout a write-transaction, dbFileSize contains the size of
+**   the file on disk in pages. It is set to a copy of dbSize when the
+**   write-transaction is first opened, and updated when VFS calls are made
+**   to write or truncate the database file on disk. 
+**
+**   The only reason the dbFileSize variable is required is to suppress 
+**   unnecessary calls to xTruncate() after committing a transaction. If, 
+**   when a transaction is committed, the dbFileSize variable indicates 
+**   that the database file is larger than the database image (Pager.dbSize), 
+**   pager_truncate() is called. The pager_truncate() call uses xFilesize()
+**   to measure the database file on disk, and then truncates it if required.
+**   dbFileSize is not used when rolling back a transaction. In this case
+**   pager_truncate() is called unconditionally (which means there may be
+**   a call to xFilesize() that is not strictly required). In either case,
+**   pager_truncate() may cause the file to become smaller or larger.
+**
+** dbHintSize
+**
+**   The dbHintSize variable is used to limit the number of calls made to
+**   the VFS xFileControl(FCNTL_SIZE_HINT) method. 
+**
+**   dbHintSize is set to a copy of the dbSize variable when a
+**   write-transaction is opened (at the same time as dbFileSize and
+**   dbOrigSize). If the xFileControl(FCNTL_SIZE_HINT) method is called,
+**   dbHintSize is increased to the number of pages that correspond to the
+**   size-hint passed to the method call. See pager_write_pagelist() for 
+**   details.
+**
+** errCode
+**
+**   The Pager.errCode variable is only ever used in PAGER_ERROR state. It
+**   is set to zero in all other states. In PAGER_ERROR state, Pager.errCode 
+**   is always set to SQLITE_FULL, SQLITE_IOERR or one of the SQLITE_IOERR_XXX 
+**   sub-codes.
 */
 struct Pager {
   sqlite3_vfs *pVfs;          /* OS functions to use for IO */
   u8 exclusiveMode;           /* Boolean. True if locking_mode==EXCLUSIVE */
-  u8 journalMode;             /* On of the PAGER_JOURNALMODE_* values */
+  u8 journalMode;             /* One of the PAGER_JOURNALMODE_* values */
   u8 useJournal;              /* Use a rollback journal on this file */
   u8 noReadlock;              /* Do not bother to obtain readlocks */
   u8 noSync;                  /* Do not sync the journal if true */
@@ -34212,30 +34771,26 @@ struct Pager {
   u8 readOnly;                /* True for a read-only database */
   u8 memDb;                   /* True to inhibit all file I/O */
 
-  /* The following block contains those class members that are dynamically
-  ** modified during normal operations. The other variables in this structure
-  ** are either constant throughout the lifetime of the pager, or else
-  ** used to store configuration parameters that affect the way the pager 
-  ** operates.
-  **
-  ** The 'state' variable is described in more detail along with the
-  ** descriptions of the values it may take - PAGER_UNLOCK etc. Many of the
-  ** other variables in this block are described in the comment directly 
-  ** above this class definition.
-  */
-  u8 state;                   /* PAGER_UNLOCK, _SHARED, _RESERVED, etc. */
-  u8 dbModified;              /* True if there are any changes to the Db */
-  u8 needSync;                /* True if an fsync() is needed on the journal */
-  u8 journalStarted;          /* True if header of journal is synced */
+  /**************************************************************************
+  ** The following block contains those class members that change during
+  ** routine opertion.  Class members not in this block are either fixed
+  ** when the pager is first created or else only change when there is a
+  ** significant mode change (such as changing the page_size, locking_mode,
+  ** or the journal_mode).  From another view, these class members describe
+  ** the "state" of the pager, while other class members describe the
+  ** "configuration" of the pager.
+  */
+  u8 eState;                  /* Pager state (OPEN, READER, WRITER_LOCKED..) */
+  u8 eLock;                   /* Current lock held on database file */
   u8 changeCountDone;         /* Set after incrementing the change-counter */
   u8 setMaster;               /* True if a m-j name has been written to jrnl */
   u8 doNotSpill;              /* Do not spill the cache when non-zero */
   u8 doNotSyncSpill;          /* Do not do a spill that requires jrnl sync */
-  u8 dbSizeValid;             /* Set when dbSize is correct */
   u8 subjInMemory;            /* True to use in-memory sub-journals */
   Pgno dbSize;                /* Number of pages in the database */
   Pgno dbOrigSize;            /* dbSize before the current transaction */
   Pgno dbFileSize;            /* Number of pages in the database file */
+  Pgno dbHintSize;            /* Value passed to FCNTL_SIZE_HINT call */
   int errCode;                /* One of several kinds of errors */
   int nRec;                   /* Pages journalled since last j-header written */
   u32 cksumInit;              /* Quasi-random value added to every checksum */
@@ -34246,17 +34801,21 @@ struct Pager {
   sqlite3_file *sjfd;         /* File descriptor for sub-journal */
   i64 journalOff;             /* Current write offset in the journal file */
   i64 journalHdr;             /* Byte offset to previous journal header */
-  i64 journalSizeLimit;       /* Size limit for persistent journal files */
+  sqlite3_backup *pBackup;    /* Pointer to list of ongoing backup processes */
   PagerSavepoint *aSavepoint; /* Array of active savepoints */
   int nSavepoint;             /* Number of elements in aSavepoint[] */
   char dbFileVers[16];        /* Changes whenever database file changes */
-  u32 sectorSize;             /* Assumed sector size during rollback */
+  /*
+  ** End of the routinely-changing class members
+  ***************************************************************************/
 
   u16 nExtra;                 /* Add this many bytes to each in-memory page */
   i16 nReserve;               /* Number of unused bytes at end of each page */
   u32 vfsFlags;               /* Flags for sqlite3_vfs.xOpen() */
+  u32 sectorSize;             /* Assumed sector size during rollback */
   int pageSize;               /* Number of bytes in a page */
   Pgno mxPgno;                /* Maximum allowed size of the database */
+  i64 journalSizeLimit;       /* Size limit for persistent journal files */
   char *zFilename;            /* Name of the database file */
   char *zJournal;             /* Name of the journal file */
   int (*xBusyHandler)(void*); /* Function to call when busy */
@@ -34274,7 +34833,6 @@ struct Pager {
 #endif
   char *pTmpSpace;            /* Pager.pageSize bytes of space for tmp use */
   PCache *pPCache;            /* Pointer to page cache object */
-  sqlite3_backup *pBackup;    /* Pointer to list of ongoing backup processes */
 #ifndef SQLITE_OMIT_WAL
   Wal *pWal;                  /* Write-ahead log used by "journal_mode=wal" */
   char *zWal;                 /* File name for write-ahead log */
@@ -34353,22 +34911,221 @@ static const unsigned char aJournalMagic[] = {
 */
 #define PAGER_MAX_PGNO 2147483647
 
+/*
+** The argument to this macro is a file descriptor (type sqlite3_file*).
+** Return 0 if it is not open, or non-zero (but not 1) if it is.
+**
+** This is so that expressions can be written as:
+**
+**   if( isOpen(pPager->jfd) ){ ...
+**
+** instead of
+**
+**   if( pPager->jfd->pMethods ){ ...
+*/
+#define isOpen(pFd) ((pFd)->pMethods)
+
+/*
+** Return true if this pager uses a write-ahead log instead of the usual
+** rollback journal. Otherwise false.
+*/
+#ifndef SQLITE_OMIT_WAL
+static int pagerUseWal(Pager *pPager){
+  return (pPager->pWal!=0);
+}
+#else
+# define pagerUseWal(x) 0
+# define pagerRollbackWal(x) 0
+# define pagerWalFrames(v,w,x,y,z) 0
+# define pagerOpenWalIfPresent(z) SQLITE_OK
+# define pagerBeginReadTransaction(z) SQLITE_OK
+#endif
+
 #ifndef NDEBUG 
 /*
 ** Usage:
 **
 **   assert( assert_pager_state(pPager) );
+**
+** This function runs many asserts to try to find inconsistencies in
+** the internal state of the Pager object.
 */
-static int assert_pager_state(Pager *pPager){
+static int assert_pager_state(Pager *p){
+  Pager *pPager = p;
 
-  /* A temp-file is always in PAGER_EXCLUSIVE or PAGER_SYNCED state. */
-  assert( pPager->tempFile==0 || pPager->state>=PAGER_EXCLUSIVE );
+  /* State must be valid. */
+  assert( p->eState==PAGER_OPEN
+       || p->eState==PAGER_READER
+       || p->eState==PAGER_WRITER_LOCKED
+       || p->eState==PAGER_WRITER_CACHEMOD
+       || p->eState==PAGER_WRITER_DBMOD
+       || p->eState==PAGER_WRITER_FINISHED
+       || p->eState==PAGER_ERROR
+  );
 
-  /* The changeCountDone flag is always set for temp-files */
-  assert( pPager->tempFile==0 || pPager->changeCountDone );
+  /* Regardless of the current state, a temp-file connection always behaves
+  ** as if it has an exclusive lock on the database file. It never updates
+  ** the change-counter field, so the changeCountDone flag is always set.
+  */
+  assert( p->tempFile==0 || p->eLock==EXCLUSIVE_LOCK );
+  assert( p->tempFile==0 || pPager->changeCountDone );
+
+  /* If the useJournal flag is clear, the journal-mode must be "OFF". 
+  ** And if the journal-mode is "OFF", the journal file must not be open.
+  */
+  assert( p->journalMode==PAGER_JOURNALMODE_OFF || p->useJournal );
+  assert( p->journalMode!=PAGER_JOURNALMODE_OFF || !isOpen(p->jfd) );
+
+  /* Check that MEMDB implies noSync. And an in-memory journal. Since 
+  ** this means an in-memory pager performs no IO at all, it cannot encounter 
+  ** either SQLITE_IOERR or SQLITE_FULL during rollback or while finalizing 
+  ** a journal file. (although the in-memory journal implementation may 
+  ** return SQLITE_IOERR_NOMEM while the journal file is being written). It 
+  ** is therefore not possible for an in-memory pager to enter the ERROR 
+  ** state.
+  */
+  if( MEMDB ){
+    assert( p->noSync );
+    assert( p->journalMode==PAGER_JOURNALMODE_OFF 
+         || p->journalMode==PAGER_JOURNALMODE_MEMORY 
+    );
+    assert( p->eState!=PAGER_ERROR && p->eState!=PAGER_OPEN );
+    assert( pagerUseWal(p)==0 );
+  }
+
+  /* If changeCountDone is set, a RESERVED lock or greater must be held
+  ** on the file.
+  */
+  assert( pPager->changeCountDone==0 || pPager->eLock>=RESERVED_LOCK );
+  assert( p->eLock!=PENDING_LOCK );
+
+  switch( p->eState ){
+    case PAGER_OPEN:
+      assert( !MEMDB );
+      assert( pPager->errCode==SQLITE_OK );
+      assert( sqlite3PcacheRefCount(pPager->pPCache)==0 || pPager->tempFile );
+      break;
+
+    case PAGER_READER:
+      assert( pPager->errCode==SQLITE_OK );
+      assert( p->eLock!=UNKNOWN_LOCK );
+      assert( p->eLock>=SHARED_LOCK || p->noReadlock );
+      break;
+
+    case PAGER_WRITER_LOCKED:
+      assert( p->eLock!=UNKNOWN_LOCK );
+      assert( pPager->errCode==SQLITE_OK );
+      if( !pagerUseWal(pPager) ){
+        assert( p->eLock>=RESERVED_LOCK );
+      }
+      assert( pPager->dbSize==pPager->dbOrigSize );
+      assert( pPager->dbOrigSize==pPager->dbFileSize );
+      assert( pPager->dbOrigSize==pPager->dbHintSize );
+      assert( pPager->setMaster==0 );
+      break;
+
+    case PAGER_WRITER_CACHEMOD:
+      assert( p->eLock!=UNKNOWN_LOCK );
+      assert( pPager->errCode==SQLITE_OK );
+      if( !pagerUseWal(pPager) ){
+        /* It is possible that if journal_mode=wal here that neither the
+        ** journal file nor the WAL file are open. This happens during
+        ** a rollback transaction that switches from journal_mode=off
+        ** to journal_mode=wal.
+        */
+        assert( p->eLock>=RESERVED_LOCK );
+        assert( isOpen(p->jfd) 
+             || p->journalMode==PAGER_JOURNALMODE_OFF 
+             || p->journalMode==PAGER_JOURNALMODE_WAL 
+        );
+      }
+      assert( pPager->dbOrigSize==pPager->dbFileSize );
+      assert( pPager->dbOrigSize==pPager->dbHintSize );
+      break;
+
+    case PAGER_WRITER_DBMOD:
+      assert( p->eLock==EXCLUSIVE_LOCK );
+      assert( pPager->errCode==SQLITE_OK );
+      assert( !pagerUseWal(pPager) );
+      assert( p->eLock>=EXCLUSIVE_LOCK );
+      assert( isOpen(p->jfd) 
+           || p->journalMode==PAGER_JOURNALMODE_OFF 
+           || p->journalMode==PAGER_JOURNALMODE_WAL 
+      );
+      assert( pPager->dbOrigSize<=pPager->dbHintSize );
+      break;
+
+    case PAGER_WRITER_FINISHED:
+      assert( p->eLock==EXCLUSIVE_LOCK );
+      assert( pPager->errCode==SQLITE_OK );
+      assert( !pagerUseWal(pPager) );
+      assert( isOpen(p->jfd) 
+           || p->journalMode==PAGER_JOURNALMODE_OFF 
+           || p->journalMode==PAGER_JOURNALMODE_WAL 
+      );
+      break;
+
+    case PAGER_ERROR:
+      /* There must be at least one outstanding reference to the pager if
+      ** in ERROR state. Otherwise the pager should have already dropped
+      ** back to OPEN state.
+      */
+      assert( pPager->errCode!=SQLITE_OK );
+      assert( sqlite3PcacheRefCount(pPager->pPCache)>0 );
+      break;
+  }
 
   return 1;
 }
+
+/*
+** Return a pointer to a human readable string in a static buffer
+** containing the state of the Pager object passed as an argument. This
+** is intended to be used within debuggers. For example, as an alternative
+** to "print *pPager" in gdb:
+**
+** (gdb) printf "%s", print_pager_state(pPager)
+*/
+static char *print_pager_state(Pager *p){
+  static char zRet[1024];
+
+  sqlite3_snprintf(1024, zRet,
+      "Filename:      %s\n"
+      "State:         %s errCode=%d\n"
+      "Lock:          %s\n"
+      "Locking mode:  locking_mode=%s\n"
+      "Journal mode:  journal_mode=%s\n"
+      "Backing store: tempFile=%d memDb=%d useJournal=%d\n"
+      "Journal:       journalOff=%lld journalHdr=%lld\n"
+      "Size:          dbsize=%d dbOrigSize=%d dbFileSize=%d\n"
+      , p->zFilename
+      , p->eState==PAGER_OPEN            ? "OPEN" :
+        p->eState==PAGER_READER          ? "READER" :
+        p->eState==PAGER_WRITER_LOCKED   ? "WRITER_LOCKED" :
+        p->eState==PAGER_WRITER_CACHEMOD ? "WRITER_CACHEMOD" :
+        p->eState==PAGER_WRITER_DBMOD    ? "WRITER_DBMOD" :
+        p->eState==PAGER_WRITER_FINISHED ? "WRITER_FINISHED" :
+        p->eState==PAGER_ERROR           ? "ERROR" : "?error?"
+      , (int)p->errCode
+      , p->eLock==NO_LOCK         ? "NO_LOCK" :
+        p->eLock==RESERVED_LOCK   ? "RESERVED" :
+        p->eLock==EXCLUSIVE_LOCK  ? "EXCLUSIVE" :
+        p->eLock==SHARED_LOCK     ? "SHARED" :
+        p->eLock==UNKNOWN_LOCK    ? "UNKNOWN" : "?error?"
+      , p->exclusiveMode ? "exclusive" : "normal"
+      , p->journalMode==PAGER_JOURNALMODE_MEMORY   ? "memory" :
+        p->journalMode==PAGER_JOURNALMODE_OFF      ? "off" :
+        p->journalMode==PAGER_JOURNALMODE_DELETE   ? "delete" :
+        p->journalMode==PAGER_JOURNALMODE_PERSIST  ? "persist" :
+        p->journalMode==PAGER_JOURNALMODE_TRUNCATE ? "truncate" :
+        p->journalMode==PAGER_JOURNALMODE_WAL      ? "wal" : "?error?"
+      , (int)p->tempFile, (int)p->memDb, (int)p->useJournal
+      , p->journalOff, p->journalHdr
+      , (int)p->dbSize, (int)p->dbOrigSize, (int)p->dbFileSize
+  );
+
+  return zRet;
+}
 #endif
 
 /*
@@ -34421,6 +35178,7 @@ static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){
 */
 #define put32bits(A,B)  sqlite3Put4byte((u8*)A,B)
 
+
 /*
 ** Write a 32-bit integer into the given file descriptor.  Return SQLITE_OK
 ** on success or an error code is something goes wrong.
@@ -34432,27 +35190,53 @@ static int write32bits(sqlite3_file *fd, i64 offset, u32 val){
 }
 
 /*
-** The argument to this macro is a file descriptor (type sqlite3_file*).
-** Return 0 if it is not open, or non-zero (but not 1) if it is.
-**
-** This is so that expressions can be written as:
+** Unlock the database file to level eLock, which must be either NO_LOCK
+** or SHARED_LOCK. Regardless of whether or not the call to xUnlock()
+** succeeds, set the Pager.eLock variable to match the (attempted) new lock.
 **
-**   if( isOpen(pPager->jfd) ){ ...
-**
-** instead of
-**
-**   if( pPager->jfd->pMethods ){ ...
+** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is
+** called, do not modify it. See the comment above the #define of 
+** UNKNOWN_LOCK for an explanation of this.
 */
-#define isOpen(pFd) ((pFd)->pMethods)
+static int pagerUnlockDb(Pager *pPager, int eLock){
+  int rc = SQLITE_OK;
+
+  assert( !pPager->exclusiveMode );
+  assert( eLock==NO_LOCK || eLock==SHARED_LOCK );
+  assert( eLock!=NO_LOCK || pagerUseWal(pPager)==0 );
+  if( isOpen(pPager->fd) ){
+    assert( pPager->eLock>=eLock );
+    rc = sqlite3OsUnlock(pPager->fd, eLock);
+    if( pPager->eLock!=UNKNOWN_LOCK ){
+      pPager->eLock = (u8)eLock;
+    }
+    IOTRACE(("UNLOCK %p %d\n", pPager, eLock))
+  }
+  return rc;
+}
 
 /*
-** If file pFd is open, call sqlite3OsUnlock() on it.
+** Lock the database file to level eLock, which must be either SHARED_LOCK,
+** RESERVED_LOCK or EXCLUSIVE_LOCK. If the caller is successful, set the
+** Pager.eLock variable to the new locking state. 
+**
+** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is 
+** called, do not modify it unless the new locking state is EXCLUSIVE_LOCK. 
+** See the comment above the #define of UNKNOWN_LOCK for an explanation 
+** of this.
 */
-static int osUnlock(sqlite3_file *pFd, int eLock){
-  if( !isOpen(pFd) ){
-    return SQLITE_OK;
+static int pagerLockDb(Pager *pPager, int eLock){
+  int rc = SQLITE_OK;
+
+  assert( eLock==SHARED_LOCK || eLock==RESERVED_LOCK || eLock==EXCLUSIVE_LOCK );
+  if( pPager->eLock<eLock || pPager->eLock==UNKNOWN_LOCK ){
+    rc = sqlite3OsLock(pPager->fd, eLock);
+    if( rc==SQLITE_OK && (pPager->eLock!=UNKNOWN_LOCK||eLock==EXCLUSIVE_LOCK) ){
+      pPager->eLock = (u8)eLock;
+      IOTRACE(("LOCK %p %d\n", pPager, eLock))
+    }
   }
-  return sqlite3OsUnlock(pFd, eLock);
+  return rc;
 }
 
 /*
@@ -34528,13 +35312,14 @@ static void pager_set_pagehash(PgHdr *pPage){
 #define CHECK_PAGE(x) checkPage(x)
 static void checkPage(PgHdr *pPg){
   Pager *pPager = pPg->pPager;
-  assert( !pPg->pageHash || pPager->errCode
-      || (pPg->flags&PGHDR_DIRTY) || pPg->pageHash==pager_pagehash(pPg) );
+  assert( pPager->eState!=PAGER_ERROR );
+  assert( (pPg->flags&PGHDR_DIRTY) || pPg->pageHash==pager_pagehash(pPg) );
 }
 
 #else
 #define pager_datahash(X,Y)  0
 #define pager_pagehash(X)  0
+#define pager_set_pagehash(X)
 #define CHECK_PAGE(x)
 #endif  /* SQLITE_CHECK_PAGES */
 
@@ -34701,7 +35486,7 @@ static int zeroJournalHdr(Pager *pPager, int doTruncate){
 static int writeJournalHdr(Pager *pPager){
   int rc = SQLITE_OK;                 /* Return code */
   char *zHeader = pPager->pTmpSpace;  /* Temporary space used to build header */
-  u32 nHeader = pPager->pageSize;     /* Size of buffer pointed to by zHeader */
+  u32 nHeader = (u32)pPager->pageSize;/* Size of buffer pointed to by zHeader */
   u32 nWrite;                         /* Bytes of header sector written */
   int ii;                             /* Loop counter */
 
@@ -34744,7 +35529,7 @@ static int writeJournalHdr(Pager *pPager){
   **     that garbage data is never appended to the journal file.
   */
   assert( isOpen(pPager->fd) || pPager->noSync );
-  if( (pPager->noSync) || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY)
+  if( pPager->noSync || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY)
    || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND) 
   ){
     memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic));
@@ -34868,7 +35653,6 @@ static int readJournalHdr(
   if( pPager->journalOff==0 ){
     u32 iPageSize;               /* Page-size field of journal header */
     u32 iSectorSize;             /* Sector-size field of journal header */
-    u16 iPageSize16;             /* Copy of iPageSize in 16-bit variable */
 
     /* Read the page-size and sector-size journal header fields. */
     if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+20, &iSectorSize))
@@ -34877,6 +35661,14 @@ static int readJournalHdr(
       return rc;
     }
 
+    /* Versions of SQLite prior to 3.5.8 set the page-size field of the
+    ** journal header to zero. In this case, assume that the Pager.pageSize
+    ** variable is already set to the correct page size.
+    */
+    if( iPageSize==0 ){
+      iPageSize = pPager->pageSize;
+    }
+
     /* Check that the values read from the page-size and sector-size fields
     ** are within range. To be 'in range', both values need to be a power
     ** of two greater than or equal to 512 or 32, and not greater than their 
@@ -34898,10 +35690,8 @@ static int readJournalHdr(
     ** Use a testcase() macro to make sure that malloc failure within 
     ** PagerSetPagesize() is tested.
     */
-    iPageSize16 = (u16)iPageSize;
-    rc = sqlite3PagerSetPagesize(pPager, &iPageSize16, -1);
+    rc = sqlite3PagerSetPagesize(pPager, &iPageSize, -1);
     testcase( rc!=SQLITE_OK );
-    assert( rc!=SQLITE_OK || iPageSize16==(u16)iPageSize );
 
     /* Update the assumed sector-size to match the value used by 
     ** the process that created this journal. If this journal was
@@ -34943,7 +35733,10 @@ static int writeMasterJournal(Pager *pPager, const char *zMaster){
   i64 jrnlSize;                    /* Size of journal file on disk */
   u32 cksum = 0;                   /* Checksum of string zMaster */
 
-  if( !zMaster || pPager->setMaster
+  assert( pPager->setMaster==0 );
+  assert( !pagerUseWal(pPager) );
+
+  if( !zMaster 
    || pPager->journalMode==PAGER_JOURNALMODE_MEMORY 
    || pPager->journalMode==PAGER_JOURNALMODE_OFF 
   ){
@@ -34979,7 +35772,6 @@ static int writeMasterJournal(Pager *pPager, const char *zMaster){
     return rc;
   }
   pPager->journalOff += (nMaster+20);
-  pPager->needSync = !pPager->noSync;
 
   /* If the pager is in peristent-journal mode, then the physical 
   ** journal-file may extend past the end of the master-journal name
@@ -35015,17 +35807,11 @@ static PgHdr *pager_lookup(Pager *pPager, Pgno pgno){
 }
 
 /*
-** Unless the pager is in error-state, discard all in-memory pages. If
-** the pager is in error-state, then this call is a no-op.
-**
-** TODO: Why can we not reset the pager while in error state?
+** Discard the entire contents of the in-memory page-cache.
 */
 static void pager_reset(Pager *pPager){
-  if( SQLITE_OK==pPager->errCode ){
-    sqlite3BackupRestart(pPager->pBackup);
-    sqlite3PcacheClear(pPager->pPCache);
-    pPager->dbSizeValid = 0;
-  }
+  sqlite3BackupRestart(pPager->pBackup);
+  sqlite3PcacheClear(pPager->pPCache);
 }
 
 /*
@@ -35068,34 +35854,39 @@ static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){
 }
 
 /*
-** Return true if this pager uses a write-ahead log instead of the usual
-** rollback journal. Otherwise false.
-*/
-#ifndef SQLITE_OMIT_WAL
-static int pagerUseWal(Pager *pPager){
-  return (pPager->pWal!=0);
-}
-#else
-# define pagerUseWal(x) 0
-# define pagerRollbackWal(x) 0
-# define pagerWalFrames(v,w,x,y,z) 0
-# define pagerOpenWalIfPresent(z) SQLITE_OK
-# define pagerBeginReadTransaction(z) SQLITE_OK
-#endif
-
-/*
-** Unlock the database file. This function is a no-op if the pager
-** is in exclusive mode.
+** This function is a no-op if the pager is in exclusive mode and not
+** in the ERROR state. Otherwise, it switches the pager to PAGER_OPEN
+** state.
+**
+** If the pager is not in exclusive-access mode, the database file is
+** completely unlocked. If the file is unlocked and the file-system does
+** not exhibit the UNDELETABLE_WHEN_OPEN property, the journal file is
+** closed (if it is open).
 **
-** If the pager is currently in error state, discard the contents of 
-** the cache and reset the Pager structure internal state. If there is
-** an open journal-file, then the next time a shared-lock is obtained
-** on the pager file (by this or any other process), it will be
-** treated as a hot-journal and rolled back.
+** If the pager is in ERROR state when this function is called, the 
+** contents of the pager cache are discarded before switching back to 
+** the OPEN state. Regardless of whether the pager is in exclusive-mode
+** or not, any journal file left in the file-system will be treated
+** as a hot-journal and rolled back the next time a read-transaction
+** is opened (by this or by any other connection).
 */
 static void pager_unlock(Pager *pPager){
-  if( !pPager->exclusiveMode ){
-    int rc = SQLITE_OK;          /* Return code */
+
+  assert( pPager->eState==PAGER_READER 
+       || pPager->eState==PAGER_OPEN 
+       || pPager->eState==PAGER_ERROR 
+  );
+
+  sqlite3BitvecDestroy(pPager->pInJournal);
+  pPager->pInJournal = 0;
+  releaseAllSavepoints(pPager);
+
+  if( pagerUseWal(pPager) ){
+    assert( !isOpen(pPager->jfd) );
+    sqlite3WalEndReadTransaction(pPager->pWal);
+    pPager->eState = PAGER_OPEN;
+  }else if( !pPager->exclusiveMode ){
+    int rc;                       /* Error code returned by pagerUnlockDb() */
     int iDc = isOpen(pPager->fd)?sqlite3OsDeviceCharacteristics(pPager->fd):0;
 
     /* If the operating system support deletion of open files, then
@@ -35115,58 +35906,56 @@ static void pager_unlock(Pager *pPager){
       sqlite3OsClose(pPager->jfd);
     }
 
-    sqlite3BitvecDestroy(pPager->pInJournal);
-    pPager->pInJournal = 0;
-    releaseAllSavepoints(pPager);
-
-    /* If the file is unlocked, somebody else might change it. The
-    ** values stored in Pager.dbSize etc. might become invalid if
-    ** this happens.  One can argue that this doesn't need to be cleared
-    ** until the change-counter check fails in PagerSharedLock().
-    ** Clearing the page size cache here is being conservative.
+    /* If the pager is in the ERROR state and the call to unlock the database
+    ** file fails, set the current lock to UNKNOWN_LOCK. See the comment
+    ** above the #define for UNKNOWN_LOCK for an explanation of why this
+    ** is necessary.
     */
-    pPager->dbSizeValid = 0;
-
-    if( pagerUseWal(pPager) ){
-      sqlite3WalEndReadTransaction(pPager->pWal);
-    }else{
-      rc = osUnlock(pPager->fd, NO_LOCK);
-    }
-    if( rc ){
-      pPager->errCode = rc;
+    rc = pagerUnlockDb(pPager, NO_LOCK);
+    if( rc!=SQLITE_OK && pPager->eState==PAGER_ERROR ){
+      pPager->eLock = UNKNOWN_LOCK;
     }
-    IOTRACE(("UNLOCK %p\n", pPager))
 
-    /* If Pager.errCode is set, the contents of the pager cache cannot be
-    ** trusted. Now that the pager file is unlocked, the contents of the
-    ** cache can be discarded and the error code safely cleared.
+    /* The pager state may be changed from PAGER_ERROR to PAGER_OPEN here
+    ** without clearing the error code. This is intentional - the error
+    ** code is cleared and the cache reset in the block below.
     */
-    if( pPager->errCode ){
-      if( rc==SQLITE_OK ){
-        pPager->errCode = SQLITE_OK;
-      }
-      pager_reset(pPager);
-    }
-
+    assert( pPager->errCode || pPager->eState!=PAGER_ERROR );
     pPager->changeCountDone = 0;
-    pPager->state = PAGER_UNLOCK;
-    pPager->dbModified = 0;
+    pPager->eState = PAGER_OPEN;
+  }
+
+  /* If Pager.errCode is set, the contents of the pager cache cannot be
+  ** trusted. Now that there are no outstanding references to the pager,
+  ** it can safely move back to PAGER_OPEN state. This happens in both
+  ** normal and exclusive-locking mode.
+  */
+  if( pPager->errCode ){
+    assert( !MEMDB );
+    pager_reset(pPager);
+    pPager->changeCountDone = pPager->tempFile;
+    pPager->eState = PAGER_OPEN;
+    pPager->errCode = SQLITE_OK;
   }
+
+  pPager->journalOff = 0;
+  pPager->journalHdr = 0;
+  pPager->setMaster = 0;
 }
 
 /*
-** This function should be called when an IOERR, CORRUPT or FULL error
-** may have occurred. The first argument is a pointer to the pager 
-** structure, the second the error-code about to be returned by a pager 
-** API function. The value returned is a copy of the second argument 
-** to this function. 
+** This function is called whenever an IOERR or FULL error that requires
+** the pager to transition into the ERROR state may ahve occurred.
+** The first argument is a pointer to the pager structure, the second 
+** the error-code about to be returned by a pager API function. The 
+** value returned is a copy of the second argument to this function. 
 **
-** If the second argument is SQLITE_IOERR, SQLITE_CORRUPT, or SQLITE_FULL
-** the error becomes persistent. Until the persistent error is cleared,
-** subsequent API calls on this Pager will immediately return the same 
-** error code.
+** If the second argument is SQLITE_FULL, SQLITE_IOERR or one of the
+** IOERR sub-codes, the pager enters the ERROR state and the error code
+** is stored in Pager.errCode. While the pager remains in the ERROR state,
+** all major API calls on the Pager will immediately return Pager.errCode.
 **
-** A persistent error indicates that the contents of the pager-cache 
+** The ERROR state indicates that the contents of the pager-cache 
 ** cannot be trusted. This state can be cleared by completely discarding 
 ** the contents of the pager-cache. If a transaction was active when
 ** the persistent error occurred, then the rollback journal may need
@@ -35183,45 +35972,21 @@ static int pager_error(Pager *pPager, int rc){
   );
   if( rc2==SQLITE_FULL || rc2==SQLITE_IOERR ){
     pPager->errCode = rc;
+    pPager->eState = PAGER_ERROR;
   }
   return rc;
 }
 
 /*
-** Execute a rollback if a transaction is active and unlock the 
-** database file. 
-**
-** If the pager has already entered the error state, do not attempt 
-** the rollback at this time. Instead, pager_unlock() is called. The
-** call to pager_unlock() will discard all in-memory pages, unlock
-** the database file and clear the error state. If this means that
-** there is a hot-journal left in the file-system, the next connection
-** to obtain a shared lock on the pager (which may be this one) will
-** roll it back.
-**
-** If the pager has not already entered the error state, but an IO or
-** malloc error occurs during a rollback, then this will itself cause 
-** the pager to enter the error state. Which will be cleared by the
-** call to pager_unlock(), as described above.
-*/
-static void pagerUnlockAndRollback(Pager *pPager){
-  if( pPager->errCode==SQLITE_OK && pPager->state>=PAGER_RESERVED ){
-    sqlite3BeginBenignMalloc();
-    sqlite3PagerRollback(pPager);
-    sqlite3EndBenignMalloc();
-  }
-  pager_unlock(pPager);
-}
-
-/*
 ** This routine ends a transaction. A transaction is usually ended by 
 ** either a COMMIT or a ROLLBACK operation. This routine may be called 
 ** after rollback of a hot-journal, or if an error occurs while opening
 ** the journal file or writing the very first journal-header of a
 ** database transaction.
 ** 
-** If the pager is in PAGER_SHARED or PAGER_UNLOCK state when this
-** routine is called, it is a no-op (returns SQLITE_OK).
+** This routine is never called in PAGER_ERROR state. If it is called
+** in PAGER_NONE or PAGER_SHARED state and the lock held is less
+** exclusive than a RESERVED lock, it is a no-op.
 **
 ** Otherwise, any active savepoints are released.
 **
@@ -35252,13 +36017,9 @@ static void pagerUnlockAndRollback(Pager *pPager){
 **     DELETE and the pager is in exclusive mode, the method described under
 **     journalMode==PERSIST is used instead.
 **
-** After the journal is finalized, if running in non-exclusive mode, the
-** pager moves to PAGER_SHARED state (and downgrades the lock on the
-** database file accordingly).
-**
-** If the pager is running in exclusive mode and is in PAGER_SYNCED state,
-** it moves to PAGER_EXCLUSIVE. No locks are downgraded when running in
-** exclusive mode.
+** After the journal is finalized, the pager moves to PAGER_READER state.
+** If running in non-exclusive rollback mode, the lock on the file is 
+** downgraded to a SHARED_LOCK.
 **
 ** SQLITE_OK is returned if no error occurs. If an error occurs during
 ** any of the IO operations to finalize the journal file or unlock the
@@ -35273,11 +36034,26 @@ static int pager_end_transaction(Pager *pPager, int hasMaster){
   int rc = SQLITE_OK;      /* Error code from journal finalization operation */
   int rc2 = SQLITE_OK;     /* Error code from db file unlock operation */
 
-  if( pPager->state<PAGER_RESERVED ){
+  /* Do nothing if the pager does not have an open write transaction
+  ** or at least a RESERVED lock. This function may be called when there
+  ** is no write-transaction active but a RESERVED or greater lock is
+  ** held under two circumstances:
+  **
+  **   1. After a successful hot-journal rollback, it is called with
+  **      eState==PAGER_NONE and eLock==EXCLUSIVE_LOCK.
+  **
+  **   2. If a connection with locking_mode=exclusive holding an EXCLUSIVE 
+  **      lock switches back to locking_mode=normal and then executes a
+  **      read-transaction, this function is called with eState==PAGER_READER 
+  **      and eLock==EXCLUSIVE_LOCK when the read-transaction is closed.
+  */
+  assert( assert_pager_state(pPager) );
+  assert( pPager->eState!=PAGER_ERROR );
+  if( pPager->eState<PAGER_WRITER_LOCKED && pPager->eLock<RESERVED_LOCK ){
     return SQLITE_OK;
   }
-  releaseAllSavepoints(pPager);
 
+  releaseAllSavepoints(pPager);
   assert( isOpen(pPager->jfd) || pPager->pInJournal==0 );
   if( isOpen(pPager->jfd) ){
     assert( !pagerUseWal(pPager) );
@@ -35293,14 +36069,11 @@ static int pager_end_transaction(Pager *pPager, int hasMaster){
         rc = sqlite3OsTruncate(pPager->jfd, 0);
       }
       pPager->journalOff = 0;
-      pPager->journalStarted = 0;
     }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST
       || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL)
     ){
       rc = zeroJournalHdr(pPager, hasMaster);
-      pager_error(pPager, rc);
       pPager->journalOff = 0;
-      pPager->journalStarted = 0;
     }else{
       /* This branch may be executed with Pager.journalMode==MEMORY if
       ** a hot-journal was just rolled back. In this case the journal
@@ -35316,50 +36089,78 @@ static int pager_end_transaction(Pager *pPager, int hasMaster){
         rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
       }
     }
+  }
 
 #ifdef SQLITE_CHECK_PAGES
-    sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash);
-#endif
+  sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash);
+  if( pPager->dbSize==0 && sqlite3PcacheRefCount(pPager->pPCache)>0 ){
+    PgHdr *p = pager_lookup(pPager, 1);
+    if( p ){
+      p->pageHash = 0;
+      sqlite3PagerUnref(p);
+    }
   }
+#endif
+
   sqlite3BitvecDestroy(pPager->pInJournal);
   pPager->pInJournal = 0;
   pPager->nRec = 0;
   sqlite3PcacheCleanAll(pPager->pPCache);
+  sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize);
 
   if( pagerUseWal(pPager) ){
+    /* Drop the WAL write-lock, if any. Also, if the connection was in 
+    ** locking_mode=exclusive mode but is no longer, drop the EXCLUSIVE 
+    ** lock held on the database file.
+    */
     rc2 = sqlite3WalEndWriteTransaction(pPager->pWal);
     assert( rc2==SQLITE_OK );
-    pPager->state = PAGER_SHARED;
-
-    /* If the connection was in locking_mode=exclusive mode but is no longer,
-    ** drop the EXCLUSIVE lock held on the database file.
-    */
-    if( !pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, 0) ){
-      rc2 = osUnlock(pPager->fd, SHARED_LOCK);
-    }
-  }else if( !pPager->exclusiveMode ){
-    rc2 = osUnlock(pPager->fd, SHARED_LOCK);
-    pPager->state = PAGER_SHARED;
+  }
+  if( !pPager->exclusiveMode 
+   && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0))
+  ){
+    rc2 = pagerUnlockDb(pPager, SHARED_LOCK);
     pPager->changeCountDone = 0;
-  }else if( pPager->state==PAGER_SYNCED ){
-    pPager->state = PAGER_EXCLUSIVE;
   }
+  pPager->eState = PAGER_READER;
   pPager->setMaster = 0;
-  pPager->needSync = 0;
-  pPager->dbModified = 0;
-
-  /* TODO: Is this optimal? Why is the db size invalidated here 
-  ** when the database file is not unlocked? */
-  pPager->dbOrigSize = 0;
-  sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize);
-  if( !MEMDB ){
-    pPager->dbSizeValid = 0;
-  }
 
   return (rc==SQLITE_OK?rc2:rc);
 }
 
 /*
+** Execute a rollback if a transaction is active and unlock the 
+** database file. 
+**
+** If the pager has already entered the ERROR state, do not attempt 
+** the rollback at this time. Instead, pager_unlock() is called. The
+** call to pager_unlock() will discard all in-memory pages, unlock
+** the database file and move the pager back to OPEN state. If this 
+** means that there is a hot-journal left in the file-system, the next 
+** connection to obtain a shared lock on the pager (which may be this one) 
+** will roll it back.
+**
+** If the pager has not already entered the ERROR state, but an IO or
+** malloc error occurs during a rollback, then this will itself cause 
+** the pager to enter the ERROR state. Which will be cleared by the
+** call to pager_unlock(), as described above.
+*/
+static void pagerUnlockAndRollback(Pager *pPager){
+  if( pPager->eState!=PAGER_ERROR && pPager->eState!=PAGER_OPEN ){
+    assert( assert_pager_state(pPager) );
+    if( pPager->eState>=PAGER_WRITER_LOCKED ){
+      sqlite3BeginBenignMalloc();
+      sqlite3PagerRollback(pPager);
+      sqlite3EndBenignMalloc();
+    }else if( !pPager->exclusiveMode ){
+      assert( pPager->eState==PAGER_READER );
+      pager_end_transaction(pPager, 0);
+    }
+  }
+  pager_unlock(pPager);
+}
+
+/*
 ** Parameter aData must point to a buffer of pPager->pageSize bytes
 ** of data. Compute and return a checksum based ont the contents of the 
 ** page of data and the current value of pPager->cksumInit.
@@ -35409,9 +36210,8 @@ static void pagerReportSize(Pager *pPager){
 ** The page begins at offset *pOffset into the file. The *pOffset
 ** value is increased to the start of the next page in the journal.
 **
-** The isMainJrnl flag is true if this is the main rollback journal and
-** false for the statement journal.  The main rollback journal uses
-** checksums - the statement journal does not.
+** The main rollback journal uses checksums - the statement journal does 
+** not.
 **
 ** If the page number of the page record read from the (sub-)journal file
 ** is greater than the current value of Pager.dbSize, then playback is
@@ -35465,6 +36265,17 @@ static int pager_playback_one_page(
   assert( aData );         /* Temp storage must have already been allocated */
   assert( pagerUseWal(pPager)==0 || (!isMainJrnl && isSavepnt) );
 
+  /* Either the state is greater than PAGER_WRITER_CACHEMOD (a transaction 
+  ** or savepoint rollback done at the request of the caller) or this is
+  ** a hot-journal rollback. If it is a hot-journal rollback, the pager
+  ** is in state OPEN and holds an EXCLUSIVE lock. Hot-journal rollback
+  ** only reads from the main journal, not the sub-journal.
+  */
+  assert( pPager->eState>=PAGER_WRITER_CACHEMOD
+       || (pPager->eState==PAGER_OPEN && pPager->eLock==EXCLUSIVE_LOCK)
+  );
+  assert( pPager->eState>=PAGER_WRITER_CACHEMOD || isMainJrnl );
+
   /* Read the page number and page data from the journal or sub-journal
   ** file. Return an error code to the caller if an IO error occurs.
   */
@@ -35501,7 +36312,6 @@ static int pager_playback_one_page(
   if( pDone && (rc = sqlite3BitvecSet(pDone, pgno))!=SQLITE_OK ){
     return rc;
   }
-  assert( pPager->state==PAGER_RESERVED || pPager->state>=PAGER_EXCLUSIVE );
 
   /* When playing back page 1, restore the nReserve setting
   */
@@ -35510,7 +36320,7 @@ static int pager_playback_one_page(
     pagerReportSize(pPager);
   }
 
-  /* If the pager is in RESERVED state, then there must be a copy of this
+  /* If the pager is in CACHEMOD state, then there must be a copy of this
   ** page in the pager cache. In this case just update the pager cache,
   ** not the database file. The page is left marked dirty in this case.
   **
@@ -35521,8 +36331,11 @@ static int pager_playback_one_page(
   ** either. So the condition described in the above paragraph is not
   ** assert()able.
   **
-  ** If in EXCLUSIVE state, then we update the pager cache if it exists
-  ** and the main file. The page is then marked not dirty.
+  ** If in WRITER_DBMOD, WRITER_FINISHED or OPEN state, then we update the
+  ** pager cache if it exists and the main file. The page is then marked 
+  ** not dirty. Since this code is only executed in PAGER_OPEN state for
+  ** a hot-journal rollback, it is guaranteed that the page-cache is empty
+  ** if the pager is in OPEN state.
   **
   ** Ticket #1171:  The statement journal might contain page content that is
   ** different from the page content at the start of the transaction.
@@ -35548,6 +36361,7 @@ static int pager_playback_one_page(
     pPg = pager_lookup(pPager, pgno);
   }
   assert( pPg || !MEMDB );
+  assert( pPager->eState!=PAGER_OPEN || pPg==0 );
   PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n",
            PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData),
            (isMainJrnl?"main-journal":"sub-journal")
@@ -35557,8 +36371,8 @@ static int pager_playback_one_page(
   }else{
     isSynced = (pPg==0 || 0==(pPg->flags & PGHDR_NEED_SYNC));
   }
-  if( (pPager->state>=PAGER_EXCLUSIVE)
-   && isOpen(pPager->fd)
+  if( isOpen(pPager->fd)
+   && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN)
    && isSynced
   ){
     i64 ofst = (pgno-1)*(i64)pPager->pageSize;
@@ -35634,9 +36448,8 @@ static int pager_playback_one_page(
       assert( !pagerUseWal(pPager) );
       sqlite3PcacheMakeClean(pPg);
     }
-#ifdef SQLITE_CHECK_PAGES
-    pPg->pageHash = pager_pagehash(pPg);
-#endif
+    pager_set_pagehash(pPg);
+
     /* If this was page 1, then restore the value of Pager.dbFileVers.
     ** Do this before any decoding. */
     if( pgno==1 ){
@@ -35788,10 +36601,10 @@ delmaster_out:
 ** file in the file-system. This only happens when committing a transaction,
 ** or rolling back a transaction (including rolling back a hot-journal).
 **
-** If the main database file is not open, or an exclusive lock is not
-** held, this function is a no-op. Otherwise, the size of the file is
-** changed to nPage pages (nPage*pPager->pageSize bytes). If the file
-** on disk is currently larger than nPage pages, then use the VFS
+** If the main database file is not open, or the pager is not in either
+** DBMOD or OPEN state, this function is a no-op. Otherwise, the size 
+** of the file is changed to nPage pages (nPage*pPager->pageSize bytes). 
+** If the file on disk is currently larger than nPage pages, then use the VFS
 ** xTruncate() method to truncate it.
 **
 ** Or, it might might be the case that the file on disk is smaller than 
@@ -35805,8 +36618,14 @@ delmaster_out:
 */
 static int pager_truncate(Pager *pPager, Pgno nPage){
   int rc = SQLITE_OK;
-  if( pPager->state>=PAGER_EXCLUSIVE && isOpen(pPager->fd) ){
+  assert( pPager->eState!=PAGER_ERROR );
+  assert( pPager->eState!=PAGER_READER );
+  
+  if( isOpen(pPager->fd) 
+   && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) 
+  ){
     i64 currentSize, newSize;
+    assert( pPager->eLock==EXCLUSIVE_LOCK );
     /* TODO: Is it safe to use Pager.dbFileSize here? */
     rc = sqlite3OsFileSize(pPager->fd, &currentSize);
     newSize = pPager->pageSize*(i64)nPage;
@@ -35930,7 +36749,7 @@ static int pager_playback(Pager *pPager, int isHot){
   */
   assert( isOpen(pPager->jfd) );
   rc = sqlite3OsFileSize(pPager->jfd, &szJ);
-  if( rc!=SQLITE_OK || szJ==0 ){
+  if( rc!=SQLITE_OK ){
     goto end_playback;
   }
 
@@ -35964,7 +36783,7 @@ static int pager_playback(Pager *pPager, int isHot){
   while( 1 ){
     /* Read the next journal header from the journal file.  If there are
     ** not enough bytes left in the journal file for a complete header, or
-    ** it is corrupted, then a process must of failed while writing it.
+    ** it is corrupted, then a process must have failed while writing it.
     ** This indicates nothing more needs to be rolled back.
     */
     rc = readJournalHdr(pPager, isHot, szJ, &nRec, &mxPg);
@@ -36078,10 +36897,9 @@ end_playback:
     rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1);
     testcase( rc!=SQLITE_OK );
   }
-  if( rc==SQLITE_OK && pPager->noSync==0 && pPager->state>=PAGER_EXCLUSIVE ){
-    rc = sqlite3OsSync(pPager->fd, pPager->sync_flags);
-  }
-  if( rc==SQLITE_OK && pPager->noSync==0 && pPager->state>=PAGER_EXCLUSIVE ){
+  if( rc==SQLITE_OK && !pPager->noSync 
+   && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN)
+  ){
     rc = sqlite3OsSync(pPager->fd, pPager->sync_flags);
   }
   if( rc==SQLITE_OK ){
@@ -36123,7 +36941,7 @@ static int readDbPage(PgHdr *pPg){
   int isInWal = 0;             /* True if page is in log file */
   int pgsz = pPager->pageSize; /* Number of bytes to read */
 
-  assert( pPager->state>=PAGER_SHARED && !MEMDB );
+  assert( pPager->eState>=PAGER_READER && !MEMDB );
   assert( isOpen(pPager->fd) );
 
   if( NEVER(!isOpen(pPager->fd)) ){
@@ -36270,6 +37088,14 @@ static int pagerWalFrames(
       sqlite3BackupUpdate(pPager->pBackup, p->pgno, (u8 *)p->pData);
     }
   }
+
+#ifdef SQLITE_CHECK_PAGES
+  {
+    PgHdr *p;
+    for(p=pList; p; p=p->pDirty) pager_set_pagehash(p);
+  }
+#endif
+
   return rc;
 }
 
@@ -36286,6 +37112,7 @@ static int pagerBeginReadTransaction(Pager *pPager){
   int changed = 0;                /* True if cache must be reset */
 
   assert( pagerUseWal(pPager) );
+  assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER );
 
   /* sqlite3WalEndReadTransaction() was not called for the previous
   ** transaction in locking_mode=EXCLUSIVE.  So call it now.  If we
@@ -36295,20 +37122,70 @@ static int pagerBeginReadTransaction(Pager *pPager){
   sqlite3WalEndReadTransaction(pPager->pWal);
 
   rc = sqlite3WalBeginReadTransaction(pPager->pWal, &changed);
-  if( rc==SQLITE_OK ){
-    int dummy;
-    if( changed ){
-      pager_reset(pPager);
-      assert( pPager->errCode || pPager->dbSizeValid==0 );
-    }
-    rc = sqlite3PagerPagecount(pPager, &dummy);
+  if( rc==SQLITE_OK && changed ){
+    pager_reset(pPager);
   }
-  pPager->state = PAGER_SHARED;
 
   return rc;
 }
 
 /*
+** This function is called as part of the transition from PAGER_OPEN
+** to PAGER_READER state to determine the size of the database file
+** in pages (assuming the page size currently stored in Pager.pageSize).
+**
+** If no error occurs, SQLITE_OK is returned and the size of the database
+** in pages is stored in *pnPage. Otherwise, an error code (perhaps
+** SQLITE_IOERR_FSTAT) is returned and *pnPage is left unmodified.
+*/
+static int pagerPagecount(Pager *pPager, Pgno *pnPage){
+  Pgno nPage;                     /* Value to return via *pnPage */
+
+  /* Query the WAL sub-system for the database size. The WalDbsize()
+  ** function returns zero if the WAL is not open (i.e. Pager.pWal==0), or
+  ** if the database size is not available. The database size is not
+  ** available from the WAL sub-system if the log file is empty or
+  ** contains no valid committed transactions.
+  */
+  assert( pPager->eState==PAGER_OPEN );
+  assert( pPager->eLock>=SHARED_LOCK || pPager->noReadlock );
+  nPage = sqlite3WalDbsize(pPager->pWal);
+
+  /* If the database size was not available from the WAL sub-system,
+  ** determine it based on the size of the database file. If the size
+  ** of the database file is not an integer multiple of the page-size,
+  ** round down to the nearest page. Except, any file larger than 0
+  ** bytes in size is considered to contain at least one page.
+  */
+  if( nPage==0 ){
+    i64 n = 0;                    /* Size of db file in bytes */
+    assert( isOpen(pPager->fd) || pPager->tempFile );
+    if( isOpen(pPager->fd) ){
+      int rc = sqlite3OsFileSize(pPager->fd, &n);
+      if( rc!=SQLITE_OK ){
+        return rc;
+      }
+    }
+    nPage = (Pgno)(n / pPager->pageSize);
+    if( nPage==0 && n>0 ){
+      nPage = 1;
+    }
+  }
+
+  /* If the current number of pages in the file is greater than the
+  ** configured maximum pager number, increase the allowed limit so
+  ** that the file can be read.
+  */
+  if( nPage>pPager->mxPgno ){
+    pPager->mxPgno = (Pgno)nPage;
+  }
+
+  *pnPage = nPage;
+  return SQLITE_OK;
+}
+
+
+/*
 ** Check if the *-wal file that corresponds to the database opened by pPager
 ** exists if the database is not empy, or verify that the *-wal file does
 ** not exist (by deleting it) if the database file is empty.
@@ -36320,8 +37197,6 @@ static int pagerBeginReadTransaction(Pager *pPager){
 **
 ** Return SQLITE_OK or an error code.
 **
-** If the WAL file is opened, also open a snapshot (read transaction).
-**
 ** The caller must hold a SHARED lock on the database file to call this
 ** function. Because an EXCLUSIVE lock on the db file is required to delete 
 ** a WAL on a none-empty database, this ensures there is no race condition 
@@ -36330,11 +37205,14 @@ static int pagerBeginReadTransaction(Pager *pPager){
 */
 static int pagerOpenWalIfPresent(Pager *pPager){
   int rc = SQLITE_OK;
+  assert( pPager->eState==PAGER_OPEN );
+  assert( pPager->eLock>=SHARED_LOCK || pPager->noReadlock );
+
   if( !pPager->tempFile ){
     int isWal;                    /* True if WAL file exists */
-    int nPage;                    /* Size of the database file */
-    assert( pPager->state>=SHARED_LOCK );
-    rc = sqlite3PagerPagecount(pPager, &nPage);
+    Pgno nPage;                   /* Size of the database file */
+
+    rc = pagerPagecount(pPager, &nPage);
     if( rc ) return rc;
     if( nPage==0 ){
       rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0);
@@ -36346,11 +37224,8 @@ static int pagerOpenWalIfPresent(Pager *pPager){
     }
     if( rc==SQLITE_OK ){
       if( isWal ){
-        pager_reset(pPager);
+        testcase( sqlite3PcachePagecount(pPager->pPCache)==0 );
         rc = sqlite3PagerOpenWal(pPager, 0);
-        if( rc==SQLITE_OK ){
-          rc = pagerBeginReadTransaction(pPager);
-        }
       }else if( pPager->journalMode==PAGER_JOURNALMODE_WAL ){
         pPager->journalMode = PAGER_JOURNALMODE_DELETE;
       }
@@ -36402,7 +37277,8 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){
   int rc = SQLITE_OK;      /* Return code */
   Bitvec *pDone = 0;       /* Bitvec to ensure pages played back only once */
 
-  assert( pPager->state>=PAGER_SHARED );
+  assert( pPager->eState!=PAGER_ERROR );
+  assert( pPager->eState>=PAGER_WRITER_LOCKED );
 
   /* Allocate a bitvec to use to store the set of pages rolled back */
   if( pSavepoint ){
@@ -36541,7 +37417,6 @@ SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager *pPager, int level, int bFu
   pPager->noSync =  (level==1 || pPager->tempFile) ?1:0;
   pPager->fullSync = (level==3 && !pPager->tempFile) ?1:0;
   pPager->sync_flags = (bFullFsync?SQLITE_SYNC_FULL:SQLITE_SYNC_NORMAL);
-  if( pPager->noSync ) pPager->needSync = 0;
 }
 #endif
 
@@ -36623,7 +37498,7 @@ SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(
 **
 ** If the pager is in the error state when this function is called, it
 ** is a no-op. The value returned is the error state error code (i.e. 
-** one of SQLITE_IOERR, SQLITE_CORRUPT or SQLITE_FULL).
+** one of SQLITE_IOERR, an SQLITE_IOERR_xxx sub-code or SQLITE_FULL).
 **
 ** Otherwise, if all of the following are true:
 **
@@ -36647,28 +37522,48 @@ SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(
 ** function was called, or because the memory allocation attempt failed, 
 ** then *pPageSize is set to the old, retained page size before returning.
 */
-SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u16 *pPageSize, int nReserve){
-  int rc = pPager->errCode;
+SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){
+  int rc = SQLITE_OK;
 
-  if( rc==SQLITE_OK ){
-    u16 pageSize = *pPageSize;
-    assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) );
-    if( (pPager->memDb==0 || pPager->dbSize==0)
-     && sqlite3PcacheRefCount(pPager->pPCache)==0 
-     && pageSize && pageSize!=pPager->pageSize 
-    ){
-      char *pNew = (char *)sqlite3PageMalloc(pageSize);
-      if( !pNew ){
-        rc = SQLITE_NOMEM;
-      }else{
-        pager_reset(pPager);
-        pPager->pageSize = pageSize;
-        sqlite3PageFree(pPager->pTmpSpace);
-        pPager->pTmpSpace = pNew;
-        sqlite3PcacheSetPageSize(pPager->pPCache, pageSize);
-      }
+  /* It is not possible to do a full assert_pager_state() here, as this
+  ** function may be called from within PagerOpen(), before the state
+  ** of the Pager object is internally consistent.
+  **
+  ** At one point this function returned an error if the pager was in 
+  ** PAGER_ERROR state. But since PAGER_ERROR state guarantees that
+  ** there is at least one outstanding page reference, this function
+  ** is a no-op for that case anyhow.
+  */
+
+  u32 pageSize = *pPageSize;
+  assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) );
+  if( (pPager->memDb==0 || pPager->dbSize==0)
+   && sqlite3PcacheRefCount(pPager->pPCache)==0 
+   && pageSize && pageSize!=(u32)pPager->pageSize 
+  ){
+    char *pNew = NULL;             /* New temp space */
+    i64 nByte = 0;
+
+    if( pPager->eState>PAGER_OPEN && isOpen(pPager->fd) ){
+      rc = sqlite3OsFileSize(pPager->fd, &nByte);
+    }
+    if( rc==SQLITE_OK ){
+      pNew = (char *)sqlite3PageMalloc(pageSize);
+      if( !pNew ) rc = SQLITE_NOMEM;
+    }
+
+    if( rc==SQLITE_OK ){
+      pager_reset(pPager);
+      pPager->dbSize = (Pgno)(nByte/pageSize);
+      pPager->pageSize = pageSize;
+      sqlite3PageFree(pPager->pTmpSpace);
+      pPager->pTmpSpace = pNew;
+      sqlite3PcacheSetPageSize(pPager->pPCache, pageSize);
     }
-    *pPageSize = (u16)pPager->pageSize;
+  }
+
+  *pPageSize = pPager->pageSize;
+  if( rc==SQLITE_OK ){
     if( nReserve<0 ) nReserve = pPager->nReserve;
     assert( nReserve>=0 && nReserve<1000 );
     pPager->nReserve = (i16)nReserve;
@@ -36697,13 +37592,11 @@ SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager *pPager){
 ** Regardless of mxPage, return the current maximum page count.
 */
 SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){
-  int nPage;
   if( mxPage>0 ){
     pPager->mxPgno = mxPage;
   }
-  if( pPager->state!=PAGER_UNLOCK ){
-    sqlite3PagerPagecount(pPager, &nPage);
-    assert( (int)pPager->mxPgno>=nPage );
+  if( pPager->eState!=PAGER_OPEN && pPager->mxPgno<pPager->dbSize ){
+    pPager->mxPgno = pPager->dbSize;
   }
   return pPager->mxPgno;
 }
@@ -36768,66 +37661,16 @@ SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned cha
 }
 
 /*
-** Return the total number of pages in the database file associated 
-** with pPager. Normally, this is calculated as (<db file size>/<page-size>).
+** This function may only be called when a read-transaction is open on
+** the pager. It returns the total number of pages in the database.
+**
 ** However, if the file is between 1 and <page-size> bytes in size, then 
 ** this is considered a 1 page file.
-**
-** If the pager is in error state when this function is called, then the
-** error state error code is returned and *pnPage left unchanged. Or,
-** if the file system has to be queried for the size of the file and
-** the query attempt returns an IO error, the IO error code is returned
-** and *pnPage is left unchanged.
-**
-** Otherwise, if everything is successful, then SQLITE_OK is returned
-** and *pnPage is set to the number of pages in the database.
 */
-SQLITE_PRIVATE int sqlite3PagerPagecount(Pager *pPager, int *pnPage){
-  Pgno nPage = 0;           /* Value to return via *pnPage */
-
-  /* Determine the number of pages in the file. Store this in nPage. */
-  if( pPager->dbSizeValid ){
-    nPage = pPager->dbSize;
-  }else{
-    int rc;                 /* Error returned by OsFileSize() */
-    i64 n = 0;              /* File size in bytes returned by OsFileSize() */
-
-    if( pagerUseWal(pPager) && pPager->state!=PAGER_UNLOCK ){
-      sqlite3WalDbsize(pPager->pWal, &nPage);
-    }
-
-    if( nPage==0 ){
-      assert( isOpen(pPager->fd) || pPager->tempFile );
-      if( isOpen(pPager->fd) ){
-        if( SQLITE_OK!=(rc = sqlite3OsFileSize(pPager->fd, &n)) ){
-          pager_error(pPager, rc);
-          return rc;
-        }
-      }
-      if( n>0 && n<pPager->pageSize ){
-        nPage = 1;
-      }else{
-        nPage = (Pgno)(n / pPager->pageSize);
-      }
-    }
-    if( pPager->state!=PAGER_UNLOCK ){
-      pPager->dbSize = nPage;
-      pPager->dbFileSize = nPage;
-      pPager->dbSizeValid = 1;
-    }
-  }
-
-  /* If the current number of pages in the file is greater than the 
-  ** configured maximum pager number, increase the allowed limit so
-  ** that the file can be read.
-  */
-  if( nPage>pPager->mxPgno ){
-    pPager->mxPgno = (Pgno)nPage;
-  }
-
-  /* Set the output variable and return SQLITE_OK */
-  *pnPage = nPage;
-  return SQLITE_OK;
+SQLITE_PRIVATE void sqlite3PagerPagecount(Pager *pPager, int *pnPage){
+  assert( pPager->eState>=PAGER_READER );
+  assert( pPager->eState!=PAGER_WRITER_FINISHED );
+  *pnPage = (int)pPager->dbSize;
 }
 
 
@@ -36848,38 +37691,19 @@ SQLITE_PRIVATE int sqlite3PagerPagecount(Pager *pPager, int *pnPage){
 static int pager_wait_on_lock(Pager *pPager, int locktype){
   int rc;                              /* Return code */
 
-  /* The OS lock values must be the same as the Pager lock values */
-  assert( PAGER_SHARED==SHARED_LOCK );
-  assert( PAGER_RESERVED==RESERVED_LOCK );
-  assert( PAGER_EXCLUSIVE==EXCLUSIVE_LOCK );
-
-  /* If the file is currently unlocked then the size must be unknown. It
-  ** must not have been modified at this point.
-  */
-  assert( pPager->state>=PAGER_SHARED || pPager->dbSizeValid==0 );
-  assert( pPager->state>=PAGER_SHARED || pPager->dbModified==0 );
-
   /* Check that this is either a no-op (because the requested lock is 
   ** already held, or one of the transistions that the busy-handler
   ** may be invoked during, according to the comment above
   ** sqlite3PagerSetBusyhandler().
   */
-  assert( (pPager->state>=locktype)
-       || (pPager->state==PAGER_UNLOCK && locktype==PAGER_SHARED)
-       || (pPager->state==PAGER_RESERVED && locktype==PAGER_EXCLUSIVE)
+  assert( (pPager->eLock>=locktype)
+       || (pPager->eLock==NO_LOCK && locktype==SHARED_LOCK)
+       || (pPager->eLock==RESERVED_LOCK && locktype==EXCLUSIVE_LOCK)
   );
 
-  if( pPager->state>=locktype ){
-    rc = SQLITE_OK;
-  }else{
-    do {
-      rc = sqlite3OsLock(pPager->fd, locktype);
-    }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) );
-    if( rc==SQLITE_OK ){
-      pPager->state = (u8)locktype;
-      IOTRACE(("LOCK %p %d\n", pPager, locktype))
-    }
-  }
+  do {
+    rc = pagerLockDb(pPager, locktype);
+  }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) );
   return rc;
 }
 
@@ -36924,9 +37748,8 @@ static void assertTruncateConstraint(Pager *pPager){
 ** truncation will be done when the current transaction is committed.
 */
 SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){
-  assert( pPager->dbSizeValid );
   assert( pPager->dbSize>=nPage );
-  assert( pPager->state>=PAGER_RESERVED );
+  assert( pPager->eState>=PAGER_WRITER_CACHEMOD );
   pPager->dbSize = nPage;
   assertTruncateConstraint(pPager);
 }
@@ -36976,7 +37799,7 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager){
 
   disable_simulated_io_errors();
   sqlite3BeginBenignMalloc();
-  pPager->errCode = 0;
+  /* pPager->errCode = 0; */
   pPager->exclusiveMode = 0;
 #ifndef SQLITE_OMIT_WAL
   sqlite3WalClose(pPager->pWal,
@@ -36989,14 +37812,19 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager){
   if( MEMDB ){
     pager_unlock(pPager);
   }else{
-    /* Set Pager.journalHdr to -1 for the benefit of the pager_playback() 
-    ** call which may be made from within pagerUnlockAndRollback(). If it
-    ** is not -1, then the unsynced portion of an open journal file may
-    ** be played back into the database. If a power failure occurs while
-    ** this is happening, the database may become corrupt.
+    /* If it is open, sync the journal file before calling UnlockAndRollback.
+    ** If this is not done, then an unsynced portion of the open journal 
+    ** file may be played back into the database. If a power failure occurs 
+    ** while this is happening, the database could become corrupt.
+    **
+    ** If an error occurs while trying to sync the journal, shift the pager
+    ** into the ERROR state. This causes UnlockAndRollback to unlock the
+    ** database and close the journal file without attempting to roll it
+    ** back or finalize it. The next database user will have to do hot-journal
+    ** rollback before accessing the database file.
     */
     if( isOpen(pPager->jfd) ){
-      pPager->errCode = pagerSyncHotJournal(pPager);
+      pager_error(pPager, pagerSyncHotJournal(pPager));
     }
     pagerUnlockAndRollback(pPager);
   }
@@ -37041,9 +37869,9 @@ SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){
 ** been written to the journal have actually reached the surface of the
 ** disk and can be restored in the event of a hot-journal rollback.
 **
-** If the Pager.needSync flag is not set, then this function is a
-** no-op. Otherwise, the actions required depend on the journal-mode
-** and the device characteristics of the the file-system, as follows:
+** If the Pager.noSync flag is set, then this function is a no-op.
+** Otherwise, the actions required depend on the journal-mode and the 
+** device characteristics of the the file-system, as follows:
 **
 **   * If the journal file is an in-memory journal file, no action need
 **     be taken.
@@ -37067,18 +37895,25 @@ SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){
 **     if( NOT SEQUENTIAL ) xSync(<journal file>);
 **   }
 **
-** The Pager.needSync flag is never be set for temporary files, or any
-** file operating in no-sync mode (Pager.noSync set to non-zero).
-**
 ** If successful, this routine clears the PGHDR_NEED_SYNC flag of every 
 ** page currently held in memory before returning SQLITE_OK. If an IO
 ** error is encountered, then the IO error code is returned to the caller.
 */
-static int syncJournal(Pager *pPager){
-  if( pPager->needSync ){
+static int syncJournal(Pager *pPager, int newHdr){
+  int rc;                         /* Return code */
+
+  assert( pPager->eState==PAGER_WRITER_CACHEMOD
+       || pPager->eState==PAGER_WRITER_DBMOD
+  );
+  assert( assert_pager_state(pPager) );
+  assert( !pagerUseWal(pPager) );
+
+  rc = sqlite3PagerExclusiveLock(pPager);
+  if( rc!=SQLITE_OK ) return rc;
+
+  if( !pPager->noSync ){
     assert( !pPager->tempFile );
-    if( pPager->journalMode!=PAGER_JOURNALMODE_MEMORY ){
-      int rc;                              /* Return code */
+    if( isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_MEMORY ){
       const int iDc = sqlite3OsDeviceCharacteristics(pPager->fd);
       assert( isOpen(pPager->jfd) );
 
@@ -37153,17 +37988,25 @@ static int syncJournal(Pager *pPager){
         );
         if( rc!=SQLITE_OK ) return rc;
       }
-    }
 
-    /* The journal file was just successfully synced. Set Pager.needSync 
-    ** to zero and clear the PGHDR_NEED_SYNC flag on all pagess.
-    */
-    pPager->needSync = 0;
-    pPager->journalStarted = 1;
-    pPager->journalHdr = pPager->journalOff;
-    sqlite3PcacheClearSyncFlags(pPager->pPCache);
+      pPager->journalHdr = pPager->journalOff;
+      if( newHdr && 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){
+        pPager->nRec = 0;
+        rc = writeJournalHdr(pPager);
+        if( rc!=SQLITE_OK ) return rc;
+      }
+    }else{
+      pPager->journalHdr = pPager->journalOff;
+    }
   }
 
+  /* Unless the pager is in noSync mode, the journal file was just 
+  ** successfully synced. Either way, clear the PGHDR_NEED_SYNC flag on 
+  ** all pages.
+  */
+  sqlite3PcacheClearSyncFlags(pPager->pPCache);
+  pPager->eState = PAGER_WRITER_DBMOD;
+  assert( assert_pager_state(pPager) );
   return SQLITE_OK;
 }
 
@@ -37200,27 +38043,12 @@ static int syncJournal(Pager *pPager){
 ** be obtained, SQLITE_BUSY is returned.
 */
 static int pager_write_pagelist(Pager *pPager, PgHdr *pList){
-  int rc;                              /* Return code */
+  int rc = SQLITE_OK;                  /* Return code */
 
-  /* At this point there may be either a RESERVED or EXCLUSIVE lock on the
-  ** database file. If there is already an EXCLUSIVE lock, the following
-  ** call is a no-op.
-  **
-  ** Moving the lock from RESERVED to EXCLUSIVE actually involves going
-  ** through an intermediate state PENDING.   A PENDING lock prevents new
-  ** readers from attaching to the database but is unsufficient for us to
-  ** write.  The idea of a PENDING lock is to prevent new readers from
-  ** coming in while we wait for existing readers to clear.
-  **
-  ** While the pager is in the RESERVED state, the original database file
-  ** is unchanged and we can rollback without having to playback the
-  ** journal into the original database file.  Once we transition to
-  ** EXCLUSIVE, it means the database file has been changed and any rollback
-  ** will require a journal playback.
-  */
+  /* This function is only called for rollback pagers in WRITER_DBMOD state. */
   assert( !pagerUseWal(pPager) );
-  assert( pPager->state>=PAGER_RESERVED );
-  rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
+  assert( pPager->eState==PAGER_WRITER_DBMOD );
+  assert( pPager->eLock==EXCLUSIVE_LOCK );
 
   /* If the file is a temp-file has not yet been opened, open it now. It
   ** is not possible for rc to be other than SQLITE_OK if this branch
@@ -37235,9 +38063,10 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){
   ** file size will be.
   */
   assert( rc!=SQLITE_OK || isOpen(pPager->fd) );
-  if( rc==SQLITE_OK && pPager->dbSize>(pPager->dbOrigSize+1) ){
+  if( rc==SQLITE_OK && pPager->dbSize>pPager->dbHintSize ){
     sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize;
     sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile);
+    pPager->dbHintSize = pPager->dbSize;
   }
 
   while( rc==SQLITE_OK && pList ){
@@ -37255,6 +38084,8 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){
       i64 offset = (pgno-1)*(i64)pPager->pageSize;   /* Offset to write */
       char *pData;                                   /* Data to write */    
 
+      assert( (pList->flags&PGHDR_NEED_SYNC)==0 );
+
       /* Encode the database */
       CODEC2(pPager, pList->pData, pgno, 6, return SQLITE_NOMEM, pData);
 
@@ -37283,9 +38114,7 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){
     }else{
       PAGERTRACE(("NOSTORE %d page %d\n", PAGERID(pPager), pgno));
     }
-#ifdef SQLITE_CHECK_PAGES
-    pList->pageHash = pager_pagehash(pList);
-#endif
+    pager_set_pagehash(pList);
     pList = pList->pDirty;
   }
 
@@ -37397,9 +38226,14 @@ static int pagerStress(void *p, PgHdr *pPg){
   ** The doNotSpill flag inhibits all cache spilling regardless of whether
   ** or not a sync is required.  This is set during a rollback.
   **
-  ** Spilling is also inhibited when in an error state.
-  */
-  if( pPager->errCode ) return SQLITE_OK;
+  ** Spilling is also prohibited when in an error state since that could
+  ** lead to database corruption.   In the current implementaton it 
+  ** is impossible for sqlite3PCacheFetch() to be called with createFlag==1
+  ** while in the error state, hence it is impossible for this routine to
+  ** be called in the error state.  Nevertheless, we include a NEVER()
+  ** test for the error state as a safeguard against future changes.
+  */
+  if( NEVER(pPager->errCode) ) return SQLITE_OK;
   if( pPager->doNotSpill ) return SQLITE_OK;
   if( pPager->doNotSyncSpill && (pPg->flags & PGHDR_NEED_SYNC)!=0 ){
     return SQLITE_OK;
@@ -37417,16 +38251,10 @@ static int pagerStress(void *p, PgHdr *pPg){
   }else{
   
     /* Sync the journal file if required. */
-    if( pPg->flags&PGHDR_NEED_SYNC ){
-      assert( !pPager->noSync );
-      rc = syncJournal(pPager);
-      if( rc==SQLITE_OK && 
-        !(pPager->journalMode==PAGER_JOURNALMODE_MEMORY) &&
-        !(sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND)
-      ){
-        pPager->nRec = 0;
-        rc = writeJournalHdr(pPager);
-      }
+    if( pPg->flags&PGHDR_NEED_SYNC 
+     || pPager->eState==PAGER_WRITER_CACHEMOD
+    ){
+      rc = syncJournal(pPager, 1);
     }
   
     /* If the page number of this page is larger than the current size of
@@ -37464,6 +38292,7 @@ static int pagerStress(void *p, PgHdr *pPg){
   
     /* Write the contents of the page out to the database file. */
     if( rc==SQLITE_OK ){
+      assert( (pPg->flags&PGHDR_NEED_SYNC)==0 );
       rc = pager_write_pagelist(pPager, pPg);
     }
   }
@@ -37474,7 +38303,7 @@ static int pagerStress(void *p, PgHdr *pPg){
     sqlite3PcacheMakeClean(pPg);
   }
 
-  return pager_error(pPager, rc);
+  return pager_error(pPager, rc); 
 }
 
 
@@ -37529,7 +38358,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
   int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; /* False to omit journal */
   int noReadlock = (flags & PAGER_NO_READLOCK)!=0;  /* True to omit read-lock */
   int pcacheSize = sqlite3PcacheSize();       /* Bytes to allocate for PCache */
-  u16 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE;  /* Default page size */
+  u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE;  /* Default page size */
 
   /* Figure out how much space is required for each journal file-handle
   ** (there are two of them, the main journal and the sub-journal). This
@@ -37664,7 +38493,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
         if( pPager->sectorSize>SQLITE_MAX_DEFAULT_PAGE_SIZE ){
           szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE;
         }else{
-          szPageDflt = (u16)pPager->sectorSize;
+          szPageDflt = (u32)pPager->sectorSize;
         }
       }
 #ifdef SQLITE_ENABLE_ATOMIC_WRITE
@@ -37692,7 +38521,8 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
     ** disk and uses an in-memory rollback journal.
     */ 
     tempFile = 1;
-    pPager->state = PAGER_EXCLUSIVE;
+    pPager->eState = PAGER_READER;
+    pPager->eLock = EXCLUSIVE_LOCK;
     readOnly = (vfsFlags&SQLITE_OPEN_READONLY);
   }
 
@@ -37729,13 +38559,14 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
   /* pPager->stmtOpen = 0; */
   /* pPager->stmtInUse = 0; */
   /* pPager->nRef = 0; */
-  pPager->dbSizeValid = (u8)memDb;
   /* pPager->stmtSize = 0; */
   /* pPager->stmtJSize = 0; */
   /* pPager->nPage = 0; */
   pPager->mxPgno = SQLITE_MAX_PAGE_COUNT;
   /* pPager->state = PAGER_UNLOCK; */
+#if 0
   assert( pPager->state == (tempFile ? PAGER_EXCLUSIVE : PAGER_UNLOCK) );
+#endif
   /* pPager->errMask = 0; */
   pPager->tempFile = (u8)tempFile;
   assert( tempFile==PAGER_LOCKINGMODE_NORMAL 
@@ -37745,7 +38576,6 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
   pPager->changeCountDone = pPager->tempFile;
   pPager->memDb = (u8)memDb;
   pPager->readOnly = (u8)readOnly;
-  /* pPager->needSync = 0; */
   assert( useJournal || pPager->tempFile );
   pPager->noSync = pPager->tempFile;
   pPager->fullSync = pPager->noSync ?0:1;
@@ -37810,10 +38640,10 @@ static int hasHotJournal(Pager *pPager, int *pExists){
   int exists = 1;               /* True if a journal file is present */
   int jrnlOpen = !!isOpen(pPager->jfd);
 
-  assert( pPager!=0 );
   assert( pPager->useJournal );
   assert( isOpen(pPager->fd) );
-  assert( pPager->state <= PAGER_SHARED );
+  assert( pPager->eState==PAGER_OPEN );
+
   assert( jrnlOpen==0 || ( sqlite3OsDeviceCharacteristics(pPager->jfd) &
     SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN
   ));
@@ -37823,7 +38653,7 @@ static int hasHotJournal(Pager *pPager, int *pExists){
     rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &exists);
   }
   if( rc==SQLITE_OK && exists ){
-    int locked;                 /* True if some process holds a RESERVED lock */
+    int locked = 0;             /* True if some process holds a RESERVED lock */
 
     /* Race condition here:  Another process might have been holding the
     ** the RESERVED lock and have a journal open at the sqlite3OsAccess() 
@@ -37835,7 +38665,7 @@ static int hasHotJournal(Pager *pPager, int *pExists){
     */
     rc = sqlite3OsCheckReservedLock(pPager->fd, &locked);
     if( rc==SQLITE_OK && !locked ){
-      int nPage;
+      Pgno nPage;                 /* Number of pages in database file */
 
       /* Check the size of the database file. If it consists of 0 pages,
       ** then delete the journal file. See the header comment above for 
@@ -37843,13 +38673,13 @@ static int hasHotJournal(Pager *pPager, int *pExists){
       ** a RESERVED lock to avoid race conditions and to avoid violating
       ** [H33020].
       */
-      rc = sqlite3PagerPagecount(pPager, &nPage);
+      rc = pagerPagecount(pPager, &nPage);
       if( rc==SQLITE_OK ){
         if( nPage==0 ){
           sqlite3BeginBenignMalloc();
-          if( sqlite3OsLock(pPager->fd, RESERVED_LOCK)==SQLITE_OK ){
+          if( pagerLockDb(pPager, RESERVED_LOCK)==SQLITE_OK ){
             sqlite3OsDelete(pVfs, pPager->zJournal, 0);
-            sqlite3OsUnlock(pPager->fd, SHARED_LOCK);
+            pagerUnlockDb(pPager, SHARED_LOCK);
           }
           sqlite3EndBenignMalloc();
         }else{
@@ -37902,7 +38732,7 @@ static int hasHotJournal(Pager *pPager, int *pExists){
 **
 ** The following operations are also performed by this function.
 **
-**   1) If the pager is currently in PAGER_UNLOCK state (no lock held
+**   1) If the pager is currently in PAGER_OPEN state (no lock held
 **      on the database file), then an attempt is made to obtain a
 **      SHARED lock on the database file. Immediately after obtaining
 **      the SHARED lock, the file-system is checked for a hot-journal,
@@ -37917,66 +38747,47 @@ static int hasHotJournal(Pager *pPager, int *pExists){
 **      the contents of the page cache and rolling back any open journal
 **      file.
 **
-** If the operation described by (2) above is not attempted, and if the
-** pager is in an error state other than SQLITE_FULL when this is called,
-** the error state error code is returned. It is permitted to read the
-** database when in SQLITE_FULL error state.
-**
-** Otherwise, if everything is successful, SQLITE_OK is returned. If an
-** IO error occurs while locking the database, checking for a hot-journal
-** file or rolling back a journal file, the IO error code is returned.
+** If everything is successful, SQLITE_OK is returned. If an IO error 
+** occurs while locking the database, checking for a hot-journal file or 
+** rolling back a journal file, the IO error code is returned.
 */
 SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){
   int rc = SQLITE_OK;                /* Return code */
-  int isErrorReset = 0;              /* True if recovering from error state */
 
   /* This routine is only called from b-tree and only when there are no
-  ** outstanding pages */
+  ** outstanding pages. This implies that the pager state should either
+  ** be OPEN or READER. READER is only possible if the pager is or was in 
+  ** exclusive access mode.
+  */
   assert( sqlite3PcacheRefCount(pPager->pPCache)==0 );
+  assert( assert_pager_state(pPager) );
+  assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER );
   if( NEVER(MEMDB && pPager->errCode) ){ return pPager->errCode; }
 
-  /* If this database is in an error-state, now is a chance to clear
-  ** the error. Discard the contents of the pager-cache and rollback
-  ** any hot journal in the file-system.
-  */
-  if( pPager->errCode ){
-    if( isOpen(pPager->jfd) || pPager->zJournal ){
-      isErrorReset = 1;
-    }
-    pPager->errCode = SQLITE_OK;
-    pager_reset(pPager);
-  }
+  if( !pagerUseWal(pPager) && pPager->eState==PAGER_OPEN ){
+    int bHotJournal = 1;          /* True if there exists a hot journal-file */
 
-  if( pagerUseWal(pPager) ){
-    rc = pagerBeginReadTransaction(pPager);
-  }else if( pPager->state==PAGER_UNLOCK || isErrorReset ){
-    sqlite3_vfs * const pVfs = pPager->pVfs;
-    int isHotJournal = 0;
     assert( !MEMDB );
-    assert( sqlite3PcacheRefCount(pPager->pPCache)==0 );
-    if( pPager->noReadlock ){
-      assert( pPager->readOnly );
-      pPager->state = PAGER_SHARED;
-    }else{
+    assert( pPager->noReadlock==0 || pPager->readOnly );
+
+    if( pPager->noReadlock==0 ){
       rc = pager_wait_on_lock(pPager, SHARED_LOCK);
       if( rc!=SQLITE_OK ){
-        assert( pPager->state==PAGER_UNLOCK );
-        return pager_error(pPager, rc);
+        assert( pPager->eLock==NO_LOCK || pPager->eLock==UNKNOWN_LOCK );
+        goto failed;
       }
     }
-    assert( pPager->state>=SHARED_LOCK );
 
     /* If a journal file exists, and there is no RESERVED lock on the
     ** database file, then it either needs to be played back or deleted.
     */
-    if( !isErrorReset ){
-      assert( pPager->state <= PAGER_SHARED );
-      rc = hasHotJournal(pPager, &isHotJournal);
-      if( rc!=SQLITE_OK ){
-        goto failed;
-      }
+    if( pPager->eLock<=SHARED_LOCK ){
+      rc = hasHotJournal(pPager, &bHotJournal);
     }
-    if( isErrorReset || isHotJournal ){
+    if( rc!=SQLITE_OK ){
+      goto failed;
+    }
+    if( bHotJournal ){
       /* Get an EXCLUSIVE lock on the database file. At this point it is
       ** important that a RESERVED lock is not obtained on the way to the
       ** EXCLUSIVE lock. If it were, another process might open the
@@ -37988,58 +38799,45 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){
       ** other process attempting to access the database file will get to 
       ** this point in the code and fail to obtain its own EXCLUSIVE lock 
       ** on the database file.
+      **
+      ** Unless the pager is in locking_mode=exclusive mode, the lock is
+      ** downgraded to SHARED_LOCK before this function returns.
       */
-      if( pPager->state<EXCLUSIVE_LOCK ){
-        rc = sqlite3OsLock(pPager->fd, EXCLUSIVE_LOCK);
-        if( rc!=SQLITE_OK ){
-          rc = pager_error(pPager, rc);
-          goto failed;
-        }
-        pPager->state = PAGER_EXCLUSIVE;
+      rc = pagerLockDb(pPager, EXCLUSIVE_LOCK);
+      if( rc!=SQLITE_OK ){
+        goto failed;
       }
  
-      /* Open the journal for read/write access. This is because in 
-      ** exclusive-access mode the file descriptor will be kept open and
-      ** possibly used for a transaction later on. On some systems, the
-      ** OsTruncate() call used in exclusive-access mode also requires
-      ** a read/write file handle.
+      /* If it is not already open and the file exists on disk, open the 
+      ** journal for read/write access. Write access is required because 
+      ** in exclusive-access mode the file descriptor will be kept open 
+      ** and possibly used for a transaction later on. Also, write-access 
+      ** is usually required to finalize the journal in journal_mode=persist 
+      ** mode (and also for journal_mode=truncate on some systems).
+      **
+      ** If the journal does not exist, it usually means that some 
+      ** other connection managed to get in and roll it back before 
+      ** this connection obtained the exclusive lock above. Or, it 
+      ** may mean that the pager was in the error-state when this
+      ** function was called and the journal file does not exist.
       */
       if( !isOpen(pPager->jfd) ){
-        int res;
-        rc = sqlite3OsAccess(pVfs,pPager->zJournal,SQLITE_ACCESS_EXISTS,&res);
-        if( rc==SQLITE_OK ){
-          if( res ){
-            int fout = 0;
-            int f = SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL;
-            assert( !pPager->tempFile );
-            rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout);
-            assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
-            if( rc==SQLITE_OK && fout&SQLITE_OPEN_READONLY ){
-              rc = SQLITE_CANTOPEN_BKPT;
-              sqlite3OsClose(pPager->jfd);
-            }
-          }else{
-            /* If the journal does not exist, it usually means that some 
-            ** other connection managed to get in and roll it back before 
-            ** this connection obtained the exclusive lock above. Or, it 
-            ** may mean that the pager was in the error-state when this
-            ** function was called and the journal file does not exist.  */
-            rc = pager_end_transaction(pPager, 0);
+        sqlite3_vfs * const pVfs = pPager->pVfs;
+        int bExists;              /* True if journal file exists */
+        rc = sqlite3OsAccess(
+            pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &bExists);
+        if( rc==SQLITE_OK && bExists ){
+          int fout = 0;
+          int f = SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL;
+          assert( !pPager->tempFile );
+          rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout);
+          assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
+          if( rc==SQLITE_OK && fout&SQLITE_OPEN_READONLY ){
+            rc = SQLITE_CANTOPEN_BKPT;
+            sqlite3OsClose(pPager->jfd);
           }
         }
       }
-      if( rc!=SQLITE_OK ){
-        goto failed;
-      }
-
-      /* Reset the journal status fields to indicates that we have no
-      ** rollback journal at this time. */
-      pPager->journalStarted = 0;
-      pPager->journalOff = 0;
-      pPager->setMaster = 0;
-      pPager->journalHdr = 0;
- 
-      /* Make sure the journal file has been synced to disk. */
  
       /* Playback and delete the journal.  Drop the database write
       ** lock and reacquire the read lock. Purge the cache before
@@ -38050,21 +38848,46 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){
       ** the journal before playing it back.
       */
       if( isOpen(pPager->jfd) ){
+        assert( rc==SQLITE_OK );
         rc = pagerSyncHotJournal(pPager);
         if( rc==SQLITE_OK ){
           rc = pager_playback(pPager, 1);
+          pPager->eState = PAGER_OPEN;
         }
-        if( rc!=SQLITE_OK ){
-          rc = pager_error(pPager, rc);
-          goto failed;
-        }
+      }else if( !pPager->exclusiveMode ){
+        pagerUnlockDb(pPager, SHARED_LOCK);
+      }
+
+      if( rc!=SQLITE_OK ){
+        /* This branch is taken if an error occurs while trying to open
+        ** or roll back a hot-journal while holding an EXCLUSIVE lock. The
+        ** pager_unlock() routine will be called before returning to unlock
+        ** the file. If the unlock attempt fails, then Pager.eLock must be
+        ** set to UNKNOWN_LOCK (see the comment above the #define for 
+        ** UNKNOWN_LOCK above for an explanation). 
+        **
+        ** In order to get pager_unlock() to do this, set Pager.eState to
+        ** PAGER_ERROR now. This is not actually counted as a transition
+        ** to ERROR state in the state diagram at the top of this file,
+        ** since we know that the same call to pager_unlock() will very
+        ** shortly transition the pager object to the OPEN state. Calling
+        ** assert_pager_state() would fail now, as it should not be possible
+        ** to be in ERROR state when there are zero outstanding page 
+        ** references.
+        */
+        pager_error(pPager, rc);
+        goto failed;
       }
-      assert( (pPager->state==PAGER_SHARED)
-           || (pPager->exclusiveMode && pPager->state>PAGER_SHARED)
+
+      assert( pPager->eState==PAGER_OPEN );
+      assert( (pPager->eLock==SHARED_LOCK)
+           || (pPager->exclusiveMode && pPager->eLock>SHARED_LOCK)
       );
     }
 
-    if( pPager->pBackup || sqlite3PcachePagecount(pPager->pPCache)>0 ){
+    if( !pPager->tempFile 
+     && (pPager->pBackup || sqlite3PcachePagecount(pPager->pPCache)>0) 
+    ){
       /* The shared-lock has just been acquired on the database file
       ** and there are already pages in the cache (from a previous
       ** read or write transaction).  Check to see if the database
@@ -38081,14 +38904,11 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){
       ** detected.  The chance of an undetected change is so small that
       ** it can be neglected.
       */
-      int nPage = 0;
+      Pgno nPage = 0;
       char dbFileVers[sizeof(pPager->dbFileVers)];
-      sqlite3PagerPagecount(pPager, &nPage);
 
-      if( pPager->errCode ){
-        rc = pPager->errCode;
-        goto failed;
-      }
+      rc = pagerPagecount(pPager, &nPage);
+      if( rc ) goto failed;
 
       if( nPage>0 ){
         IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers)));
@@ -38104,18 +38924,30 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){
         pager_reset(pPager);
       }
     }
-    assert( pPager->exclusiveMode || pPager->state==PAGER_SHARED );
 
     /* If there is a WAL file in the file-system, open this database in WAL
     ** mode. Otherwise, the following function call is a no-op.
     */
     rc = pagerOpenWalIfPresent(pPager);
+    assert( pPager->pWal==0 || rc==SQLITE_OK );
+  }
+
+  if( pagerUseWal(pPager) ){
+    assert( rc==SQLITE_OK );
+    rc = pagerBeginReadTransaction(pPager);
+  }
+
+  if( pPager->eState==PAGER_OPEN && rc==SQLITE_OK ){
+    rc = pagerPagecount(pPager, &pPager->dbSize);
   }
 
  failed:
   if( rc!=SQLITE_OK ){
-    /* pager_unlock() is a no-op for exclusive mode and in-memory databases. */
+    assert( !MEMDB );
     pager_unlock(pPager);
+    assert( pPager->eState==PAGER_OPEN );
+  }else{
+    pPager->eState = PAGER_READER;
   }
   return rc;
 }
@@ -38129,9 +38961,7 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){
 ** nothing to rollback, so this routine is a no-op.
 */ 
 static void pagerUnlockIfUnused(Pager *pPager){
-  if( (sqlite3PcacheRefCount(pPager->pPCache)==0)
-   && (!pPager->exclusiveMode || pPager->journalOff>0) 
-  ){
+  if( (sqlite3PcacheRefCount(pPager->pPCache)==0) ){
     pagerUnlockAndRollback(pPager);
   }
 }
@@ -38195,8 +39025,8 @@ SQLITE_PRIVATE int sqlite3PagerAcquire(
   int rc;
   PgHdr *pPg;
 
+  assert( pPager->eState>=PAGER_READER );
   assert( assert_pager_state(pPager) );
-  assert( pPager->state>PAGER_UNLOCK );
 
   if( pgno==0 ){
     return SQLITE_CORRUPT_BKPT;
@@ -38204,7 +39034,7 @@ SQLITE_PRIVATE int sqlite3PagerAcquire(
 
   /* If the pager is in the error state, return an error immediately. 
   ** Otherwise, request the page from the PCache layer. */
-  if( pPager->errCode!=SQLITE_OK && pPager->errCode!=SQLITE_FULL ){
+  if( pPager->errCode!=SQLITE_OK ){
     rc = pPager->errCode;
   }else{
     rc = sqlite3PcacheFetch(pPager->pPCache, pgno, 1, ppPage);
@@ -38230,7 +39060,6 @@ SQLITE_PRIVATE int sqlite3PagerAcquire(
   }else{
     /* The pager cache has created a new page. Its content needs to 
     ** be initialized.  */
-    int nMax;
 
     PAGER_INCR(pPager->nMiss);
     pPg = *ppPage;
@@ -38243,12 +39072,7 @@ SQLITE_PRIVATE int sqlite3PagerAcquire(
       goto pager_acquire_err;
     }
 
-    rc = sqlite3PagerPagecount(pPager, &nMax);
-    if( rc!=SQLITE_OK ){
-      goto pager_acquire_err;
-    }
-
-    if( MEMDB || nMax<(int)pgno || noContent || !isOpen(pPager->fd) ){
+    if( MEMDB || pPager->dbSize<pgno || noContent || !isOpen(pPager->fd) ){
       if( pgno>pPager->mxPgno ){
         rc = SQLITE_FULL;
         goto pager_acquire_err;
@@ -38278,9 +39102,7 @@ SQLITE_PRIVATE int sqlite3PagerAcquire(
         goto pager_acquire_err;
       }
     }
-#ifdef SQLITE_CHECK_PAGES
-    pPg->pageHash = pager_pagehash(pPg);
-#endif
+    pager_set_pagehash(pPg);
   }
 
   return SQLITE_OK;
@@ -38299,9 +39121,7 @@ pager_acquire_err:
 /*
 ** Acquire a page if it is already in the in-memory cache.  Do
 ** not read the page from disk.  Return a pointer to the page,
-** or 0 if the page is not in cache. Also, return 0 if the 
-** pager is in PAGER_UNLOCK state when this function is called,
-** or if the pager is in an error state other than SQLITE_FULL.
+** or 0 if the page is not in cache. 
 **
 ** See also sqlite3PagerGet().  The difference between this routine
 ** and sqlite3PagerGet() is that _get() will go to the disk and read
@@ -38314,7 +39134,7 @@ SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){
   assert( pPager!=0 );
   assert( pgno!=0 );
   assert( pPager->pPCache!=0 );
-  assert( pPager->state > PAGER_UNLOCK );
+  assert( pPager->eState>=PAGER_READER && pPager->eState!=PAGER_ERROR );
   sqlite3PcacheFetch(pPager->pPCache, pgno, 0, &pPg);
   return pPg;
 }
@@ -38359,12 +39179,10 @@ SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){
 */
 static int pager_open_journal(Pager *pPager){
   int rc = SQLITE_OK;                        /* Return code */
-  int nPage;                                 /* Size of database file */
   sqlite3_vfs * const pVfs = pPager->pVfs;   /* Local cache of vfs pointer */
 
-  assert( pPager->state>=PAGER_RESERVED );
-  assert( pPager->useJournal );
-  assert( pPager->journalMode!=PAGER_JOURNALMODE_OFF );
+  assert( pPager->eState==PAGER_WRITER_LOCKED );
+  assert( assert_pager_state(pPager) );
   assert( pPager->pInJournal==0 );
   
   /* If already in the error state, this function is a no-op.  But on
@@ -38372,56 +39190,56 @@ static int pager_open_journal(Pager *pPager){
   ** an error state. */
   if( NEVER(pPager->errCode) ) return pPager->errCode;
 
-  testcase( pPager->dbSizeValid==0 );
-  rc = sqlite3PagerPagecount(pPager, &nPage);
-  if( rc ) return rc;
-  pPager->pInJournal = sqlite3BitvecCreate(nPage);
-  if( pPager->pInJournal==0 ){
-    return SQLITE_NOMEM;
-  }
-
-  /* Open the journal file if it is not already open. */
-  if( !isOpen(pPager->jfd) ){
-    if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){
-      sqlite3MemJournalOpen(pPager->jfd);
-    }else{
-      const int flags =                   /* VFS flags to open journal file */
-        SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|
-        (pPager->tempFile ? 
-          (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL):
-          (SQLITE_OPEN_MAIN_JOURNAL)
+  if( !pagerUseWal(pPager) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
+    pPager->pInJournal = sqlite3BitvecCreate(pPager->dbSize);
+    if( pPager->pInJournal==0 ){
+      return SQLITE_NOMEM;
+    }
+  
+    /* Open the journal file if it is not already open. */
+    if( !isOpen(pPager->jfd) ){
+      if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){
+        sqlite3MemJournalOpen(pPager->jfd);
+      }else{
+        const int flags =                   /* VFS flags to open journal file */
+          SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|
+          (pPager->tempFile ? 
+            (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL):
+            (SQLITE_OPEN_MAIN_JOURNAL)
+          );
+  #ifdef SQLITE_ENABLE_ATOMIC_WRITE
+        rc = sqlite3JournalOpen(
+            pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager)
         );
-#ifdef SQLITE_ENABLE_ATOMIC_WRITE
-      rc = sqlite3JournalOpen(
-          pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager)
-      );
-#else
-      rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0);
-#endif
+  #else
+        rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0);
+  #endif
+      }
+      assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
+    }
+  
+  
+    /* Write the first journal header to the journal file and open 
+    ** the sub-journal if necessary.
+    */
+    if( rc==SQLITE_OK ){
+      /* TODO: Check if all of these are really required. */
+      pPager->nRec = 0;
+      pPager->journalOff = 0;
+      pPager->setMaster = 0;
+      pPager->journalHdr = 0;
+      rc = writeJournalHdr(pPager);
     }
-    assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
-  }
-
-
-  /* Write the first journal header to the journal file and open 
-  ** the sub-journal if necessary.
-  */
-  if( rc==SQLITE_OK ){
-    /* TODO: Check if all of these are really required. */
-    pPager->dbOrigSize = pPager->dbSize;
-    pPager->journalStarted = 0;
-    pPager->needSync = 0;
-    pPager->nRec = 0;
-    pPager->journalOff = 0;
-    pPager->setMaster = 0;
-    pPager->journalHdr = 0;
-    rc = writeJournalHdr(pPager);
   }
 
   if( rc!=SQLITE_OK ){
     sqlite3BitvecDestroy(pPager->pInJournal);
     pPager->pInJournal = 0;
+  }else{
+    assert( pPager->eState==PAGER_WRITER_LOCKED );
+    pPager->eState = PAGER_WRITER_CACHEMOD;
   }
+
   return rc;
 }
 
@@ -38434,14 +39252,6 @@ static int pager_open_journal(Pager *pPager){
 ** an EXCLUSIVE lock. If such a lock is already held, no locking 
 ** functions need be called.
 **
-** If this is not a temporary or in-memory file and, the journal file is 
-** opened if it has not been already. For a temporary file, the opening 
-** of the journal file is deferred until there is an actual need to 
-** write to the journal. TODO: Why handle temporary files differently?
-**
-** If the journal file is opened (or if it is already open), then a
-** journal-header is written to the start of it.
-**
 ** If the subjInMemory argument is non-zero, then any sub-journal opened
 ** within this transaction will be opened as an in-memory file. This
 ** has no effect if the sub-journal is already opened (as it may be when
@@ -38452,20 +39262,20 @@ static int pager_open_journal(Pager *pPager){
 */
 SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){
   int rc = SQLITE_OK;
-  assert( pPager->state!=PAGER_UNLOCK );
+
+  if( pPager->errCode ) return pPager->errCode;
+  assert( pPager->eState>=PAGER_READER && pPager->eState<PAGER_ERROR );
   pPager->subjInMemory = (u8)subjInMemory;
 
-  if( pPager->state==PAGER_SHARED ){
+  if( ALWAYS(pPager->eState==PAGER_READER) ){
     assert( pPager->pInJournal==0 );
-    assert( !MEMDB && !pPager->tempFile );
 
     if( pagerUseWal(pPager) ){
       /* If the pager is configured to use locking_mode=exclusive, and an
       ** exclusive lock on the database is not already held, obtain it now.
       */
       if( pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, -1) ){
-        rc = sqlite3OsLock(pPager->fd, EXCLUSIVE_LOCK);
-        pPager->state = PAGER_SHARED;
+        rc = pagerLockDb(pPager, EXCLUSIVE_LOCK);
         if( rc!=SQLITE_OK ){
           return rc;
         }
@@ -38476,52 +39286,40 @@ SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory
       ** PAGER_RESERVED state. Otherwise, return an error code to the caller.
       ** The busy-handler is not invoked if another connection already
       ** holds the write-lock. If possible, the upper layer will call it.
-      **
-      ** WAL mode sets Pager.state to PAGER_RESERVED when it has an open
-      ** transaction, but never to PAGER_EXCLUSIVE. This is because in 
-      ** PAGER_EXCLUSIVE state the code to roll back savepoint transactions
-      ** may copy data from the sub-journal into the database file as well
-      ** as into the page cache. Which would be incorrect in WAL mode.
       */
       rc = sqlite3WalBeginWriteTransaction(pPager->pWal);
-      if( rc==SQLITE_OK ){
-        pPager->dbOrigSize = pPager->dbSize;
-        pPager->state = PAGER_RESERVED;
-        pPager->journalOff = 0;
-      }
-
-      assert( rc!=SQLITE_OK || pPager->state==PAGER_RESERVED );
-      assert( rc==SQLITE_OK || pPager->state==PAGER_SHARED );
     }else{
       /* Obtain a RESERVED lock on the database file. If the exFlag parameter
       ** is true, then immediately upgrade this to an EXCLUSIVE lock. The
       ** busy-handler callback can be used when upgrading to the EXCLUSIVE
       ** lock, but not when obtaining the RESERVED lock.
       */
-      rc = sqlite3OsLock(pPager->fd, RESERVED_LOCK);
-      if( rc==SQLITE_OK ){
-        pPager->state = PAGER_RESERVED;
-        if( exFlag ){
-          rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
-        }
+      rc = pagerLockDb(pPager, RESERVED_LOCK);
+      if( rc==SQLITE_OK && exFlag ){
+        rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
       }
     }
 
-    /* No need to open the journal file at this time.  It will be
-    ** opened before it is written to.  If we defer opening the journal,
-    ** we might save the work of creating a file if the transaction
-    ** ends up being a no-op.
-    */
-
-    if( rc!=SQLITE_OK ){
-      assert( !pPager->dbModified );
-      /* Ignore any IO error that occurs within pager_end_transaction(). The
-      ** purpose of this call is to reset the internal state of the pager
-      ** sub-system. It doesn't matter if the journal-file is not properly
-      ** finalized at this point (since it is not a valid journal file anyway).
+    if( rc==SQLITE_OK ){
+      /* Change to WRITER_LOCKED state.
+      **
+      ** WAL mode sets Pager.eState to PAGER_WRITER_LOCKED or CACHEMOD
+      ** when it has an open transaction, but never to DBMOD or FINISHED.
+      ** This is because in those states the code to roll back savepoint 
+      ** transactions may copy data from the sub-journal into the database 
+      ** file as well as into the page cache. Which would be incorrect in 
+      ** WAL mode.
       */
-      pager_end_transaction(pPager, 0);
+      pPager->eState = PAGER_WRITER_LOCKED;
+      pPager->dbHintSize = pPager->dbSize;
+      pPager->dbFileSize = pPager->dbSize;
+      pPager->dbOrigSize = pPager->dbSize;
+      pPager->journalOff = 0;
     }
+
+    assert( rc==SQLITE_OK || pPager->eState==PAGER_READER );
+    assert( rc!=SQLITE_OK || pPager->eState==PAGER_WRITER_LOCKED );
+    assert( assert_pager_state(pPager) );
   }
 
   PAGERTRACE(("TRANSACTION %d\n", PAGERID(pPager)));
@@ -38540,22 +39338,24 @@ static int pager_write(PgHdr *pPg){
   Pager *pPager = pPg->pPager;
   int rc = SQLITE_OK;
 
-  /* This routine is not called unless a transaction has already been
-  ** started.
+  /* This routine is not called unless a write-transaction has already 
+  ** been started. The journal file may or may not be open at this point.
+  ** It is never called in the ERROR state.
   */
-  assert( pPager->state>=PAGER_RESERVED );
+  assert( pPager->eState==PAGER_WRITER_LOCKED
+       || pPager->eState==PAGER_WRITER_CACHEMOD
+       || pPager->eState==PAGER_WRITER_DBMOD
+  );
+  assert( assert_pager_state(pPager) );
 
   /* If an error has been previously detected, report the same error
-  ** again.
-  */
+  ** again. This should not happen, but the check provides robustness. */
   if( NEVER(pPager->errCode) )  return pPager->errCode;
 
   /* Higher-level routines never call this function if database is not
   ** writable.  But check anyway, just for robustness. */
   if( NEVER(pPager->readOnly) ) return SQLITE_PERM;
 
-  assert( !pPager->setMaster );
-
   CHECK_PAGE(pPg);
 
   /* Mark the page as dirty.  If the page has already been written
@@ -38564,82 +39364,68 @@ static int pager_write(PgHdr *pPg){
   sqlite3PcacheMakeDirty(pPg);
   if( pageInJournal(pPg) && !subjRequiresPage(pPg) ){
     assert( !pagerUseWal(pPager) );
-    pPager->dbModified = 1;
+    assert( pPager->eState>=PAGER_WRITER_CACHEMOD );
   }else{
 
     /* If we get this far, it means that the page needs to be
-    ** written to the transaction journal or the ckeckpoint journal
+    ** written to the transaction journal or the checkpoint journal
     ** or both.
     **
-    ** Higher level routines should have already started a transaction,
-    ** which means they have acquired the necessary locks but the rollback
-    ** journal might not yet be open.
+    ** Higher level routines have already obtained the necessary locks
+    ** to begin the write-transaction, but the rollback journal might not 
+    ** yet be open. Open it now if this is the case.
     */
-    assert( pPager->state>=RESERVED_LOCK );
-    if( pPager->pInJournal==0
-     && pPager->journalMode!=PAGER_JOURNALMODE_OFF 
-     && !pagerUseWal(pPager)
-    ){
-      assert( pPager->useJournal );
+    if( pPager->eState==PAGER_WRITER_LOCKED ){
       rc = pager_open_journal(pPager);
       if( rc!=SQLITE_OK ) return rc;
     }
-    pPager->dbModified = 1;
+    assert( pPager->eState>=PAGER_WRITER_CACHEMOD );
+    assert( assert_pager_state(pPager) );
   
     /* The transaction journal now exists and we have a RESERVED or an
     ** EXCLUSIVE lock on the main database file.  Write the current page to
     ** the transaction journal if it is not there already.
     */
-    if( !pageInJournal(pPg) && isOpen(pPager->jfd) ){
-      assert( !pagerUseWal(pPager) );
-      if( pPg->pgno<=pPager->dbOrigSize ){
+    if( !pageInJournal(pPg) && !pagerUseWal(pPager) ){
+      assert( pagerUseWal(pPager)==0 );
+      if( pPg->pgno<=pPager->dbOrigSize && isOpen(pPager->jfd) ){
         u32 cksum;
         char *pData2;
+        i64 iOff = pPager->journalOff;
 
         /* We should never write to the journal file the page that
         ** contains the database locks.  The following assert verifies
         ** that we do not. */
         assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) );
 
-        assert( pPager->journalHdr <= pPager->journalOff );
+        assert( pPager->journalHdr<=pPager->journalOff );
         CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2);
         cksum = pager_cksum(pPager, (u8*)pData2);
-        rc = write32bits(pPager->jfd, pPager->journalOff, pPg->pgno);
-        if( rc==SQLITE_OK ){
-          rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize,
-                              pPager->journalOff + 4);
-          pPager->journalOff += pPager->pageSize+4;
-        }
-        if( rc==SQLITE_OK ){
-          rc = write32bits(pPager->jfd, pPager->journalOff, cksum);
-          pPager->journalOff += 4;
-        }
-        IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, 
-                 pPager->journalOff, pPager->pageSize));
-        PAGER_INCR(sqlite3_pager_writej_count);
-        PAGERTRACE(("JOURNAL %d page %d needSync=%d hash(%08x)\n",
-             PAGERID(pPager), pPg->pgno, 
-             ((pPg->flags&PGHDR_NEED_SYNC)?1:0), pager_pagehash(pPg)));
 
-        /* Even if an IO or diskfull error occurred while journalling the
+        /* Even if an IO or diskfull error occurs while journalling the
         ** page in the block above, set the need-sync flag for the page.
         ** Otherwise, when the transaction is rolled back, the logic in
         ** playback_one_page() will think that the page needs to be restored
         ** in the database file. And if an IO error occurs while doing so,
         ** then corruption may follow.
         */
-        if( !pPager->noSync ){
-          pPg->flags |= PGHDR_NEED_SYNC;
-          pPager->needSync = 1;
-        }
+        pPg->flags |= PGHDR_NEED_SYNC;
 
-        /* An error has occurred writing to the journal file. The 
-        ** transaction will be rolled back by the layer above.
-        */
-        if( rc!=SQLITE_OK ){
-          return rc;
-        }
+        rc = write32bits(pPager->jfd, iOff, pPg->pgno);
+        if( rc!=SQLITE_OK ) return rc;
+        rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize, iOff+4);
+        if( rc!=SQLITE_OK ) return rc;
+        rc = write32bits(pPager->jfd, iOff+pPager->pageSize+4, cksum);
+        if( rc!=SQLITE_OK ) return rc;
 
+        IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, 
+                 pPager->journalOff, pPager->pageSize));
+        PAGER_INCR(sqlite3_pager_writej_count);
+        PAGERTRACE(("JOURNAL %d page %d needSync=%d hash(%08x)\n",
+             PAGERID(pPager), pPg->pgno, 
+             ((pPg->flags&PGHDR_NEED_SYNC)?1:0), pager_pagehash(pPg)));
+
+        pPager->journalOff += 8 + pPager->pageSize;
         pPager->nRec++;
         assert( pPager->pInJournal!=0 );
         rc = sqlite3BitvecSet(pPager->pInJournal, pPg->pgno);
@@ -38651,9 +39437,8 @@ static int pager_write(PgHdr *pPg){
           return rc;
         }
       }else{
-        if( !pPager->journalStarted && !pPager->noSync ){
+        if( pPager->eState!=PAGER_WRITER_DBMOD ){
           pPg->flags |= PGHDR_NEED_SYNC;
-          pPager->needSync = 1;
         }
         PAGERTRACE(("APPEND %d page %d needSync=%d\n",
                 PAGERID(pPager), pPg->pgno,
@@ -38673,7 +39458,6 @@ static int pager_write(PgHdr *pPg){
 
   /* Update the database size and return.
   */
-  assert( pPager->state>=PAGER_SHARED );
   if( pPager->dbSize<pPg->pgno ){
     pPager->dbSize = pPg->pgno;
   }
@@ -38701,6 +39485,10 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
   Pager *pPager = pPg->pPager;
   Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize);
 
+  assert( pPager->eState>=PAGER_WRITER_LOCKED );
+  assert( pPager->eState!=PAGER_ERROR );
+  assert( assert_pager_state(pPager) );
+
   if( nPagePerSector>1 ){
     Pgno nPageCount;          /* Total number of pages in database file */
     Pgno pg1;                 /* First page of the sector pPg is located on. */
@@ -38722,19 +39510,17 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
     */
     pg1 = ((pPg->pgno-1) & ~(nPagePerSector-1)) + 1;
 
-    rc = sqlite3PagerPagecount(pPager, (int *)&nPageCount);
-    if( rc==SQLITE_OK ){
-      if( pPg->pgno>nPageCount ){
-        nPage = (pPg->pgno - pg1)+1;
-      }else if( (pg1+nPagePerSector-1)>nPageCount ){
-        nPage = nPageCount+1-pg1;
-      }else{
-        nPage = nPagePerSector;
-      }
-      assert(nPage>0);
-      assert(pg1<=pPg->pgno);
-      assert((pg1+nPage)>pPg->pgno);
+    nPageCount = pPager->dbSize;
+    if( pPg->pgno>nPageCount ){
+      nPage = (pPg->pgno - pg1)+1;
+    }else if( (pg1+nPagePerSector-1)>nPageCount ){
+      nPage = nPageCount+1-pg1;
+    }else{
+      nPage = nPagePerSector;
     }
+    assert(nPage>0);
+    assert(pg1<=pPg->pgno);
+    assert((pg1+nPage)>pPg->pgno);
 
     for(ii=0; ii<nPage && rc==SQLITE_OK; ii++){
       Pgno pg = pg1+ii;
@@ -38746,7 +39532,6 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
             rc = pager_write(pPage);
             if( pPage->flags&PGHDR_NEED_SYNC ){
               needSync = 1;
-              assert(pPager->needSync);
             }
             sqlite3PagerUnref(pPage);
           }
@@ -38766,7 +39551,7 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
     ** before any of them can be written out to the database file.
     */
     if( rc==SQLITE_OK && needSync ){
-      assert( !MEMDB && pPager->noSync==0 );
+      assert( !MEMDB );
       for(ii=0; ii<nPage; ii++){
         PgHdr *pPage = pager_lookup(pPager, pg1+ii);
         if( pPage ){
@@ -38774,7 +39559,6 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
           sqlite3PagerUnref(pPage);
         }
       }
-      assert(pPager->needSync);
     }
 
     assert( pPager->doNotSyncSpill==1 );
@@ -38816,9 +39600,7 @@ SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){
     PAGERTRACE(("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager)));
     IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno))
     pPg->flags |= PGHDR_DONT_WRITE;
-#ifdef SQLITE_CHECK_PAGES
-    pPg->pageHash = pager_pagehash(pPg);
-#endif
+    pager_set_pagehash(pPg);
   }
 }
 
@@ -38841,6 +39623,11 @@ SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){
 static int pager_incr_changecounter(Pager *pPager, int isDirectMode){
   int rc = SQLITE_OK;
 
+  assert( pPager->eState==PAGER_WRITER_CACHEMOD
+       || pPager->eState==PAGER_WRITER_DBMOD
+  );
+  assert( assert_pager_state(pPager) );
+
   /* Declare and initialize constant integer 'isDirect'. If the
   ** atomic-write optimization is enabled in this build, then isDirect
   ** is initialized to the value passed as the isDirectMode parameter
@@ -38859,7 +39646,6 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){
 # define DIRECT_MODE isDirectMode
 #endif
 
-  assert( pPager->state>=PAGER_RESERVED );
   if( !pPager->changeCountDone && pPager->dbSize>0 ){
     PgHdr *pPgHdr;                /* Reference to page 1 */
     u32 change_counter;           /* Initial value of change-counter field */
@@ -38932,6 +39718,30 @@ SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager){
 }
 
 /*
+** This function may only be called while a write-transaction is active in
+** rollback. If the connection is in WAL mode, this call is a no-op. 
+** Otherwise, if the connection does not already have an EXCLUSIVE lock on 
+** the database file, an attempt is made to obtain one.
+**
+** If the EXCLUSIVE lock is already held or the attempt to obtain it is
+** successful, or the connection is in WAL mode, SQLITE_OK is returned.
+** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is 
+** returned.
+*/
+SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager *pPager){
+  int rc = SQLITE_OK;
+  assert( pPager->eState==PAGER_WRITER_CACHEMOD 
+       || pPager->eState==PAGER_WRITER_DBMOD 
+       || pPager->eState==PAGER_WRITER_LOCKED 
+  );
+  assert( assert_pager_state(pPager) );
+  if( 0==pagerUseWal(pPager) ){
+    rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
+  }
+  return rc;
+}
+
+/*
 ** Sync the database file for the pager pPager. zMaster points to the name
 ** of a master journal file that should be written into the individual
 ** journal file. zMaster may be NULL, which is interpreted as no master
@@ -38964,22 +39774,29 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
 ){
   int rc = SQLITE_OK;             /* Return code */
 
-  /* The dbOrigSize is never set if journal_mode=OFF */
-  assert( pPager->journalMode!=PAGER_JOURNALMODE_OFF || pPager->dbOrigSize==0 );
+  assert( pPager->eState==PAGER_WRITER_LOCKED
+       || pPager->eState==PAGER_WRITER_CACHEMOD
+       || pPager->eState==PAGER_WRITER_DBMOD
+       || pPager->eState==PAGER_ERROR
+  );
+  assert( assert_pager_state(pPager) );
 
   /* If a prior error occurred, report that error again. */
-  if( pPager->errCode ) return pPager->errCode;
+  if( NEVER(pPager->errCode) ) return pPager->errCode;
 
   PAGERTRACE(("DATABASE SYNC: File=%s zMaster=%s nSize=%d\n", 
       pPager->zFilename, zMaster, pPager->dbSize));
 
-  if( MEMDB && pPager->dbModified ){
+  /* If no database changes have been made, return early. */
+  if( pPager->eState<PAGER_WRITER_CACHEMOD ) return SQLITE_OK;
+
+  if( MEMDB ){
     /* If this is an in-memory db, or no pages have been written to, or this
     ** function has already been called, it is mostly a no-op.  However, any
     ** backup in progress needs to be restarted.
     */
     sqlite3BackupRestart(pPager->pBackup);
-  }else if( pPager->state!=PAGER_SYNCED && pPager->dbModified ){
+  }else{
     if( pagerUseWal(pPager) ){
       PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache);
       if( pList ){
@@ -39022,7 +39839,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
       );
       if( !zMaster && isOpen(pPager->jfd) 
        && pPager->journalOff==jrnlBufferSize(pPager) 
-       && pPager->dbSize>=pPager->dbFileSize
+       && pPager->dbSize>=pPager->dbOrigSize
        && (0==(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty)
       ){
         /* Update the db file change counter via the direct-write method. The 
@@ -39052,13 +39869,10 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
       ** that it took at the start of the transaction. Otherwise, the
       ** calls to sqlite3PagerGet() return zeroed pages instead of 
       ** reading data from the database file.
-      **
-      ** When journal_mode==OFF the dbOrigSize is always zero, so this
-      ** block never runs if journal_mode=OFF.
       */
   #ifndef SQLITE_OMIT_AUTOVACUUM
       if( pPager->dbSize<pPager->dbOrigSize 
-       && ALWAYS(pPager->journalMode!=PAGER_JOURNALMODE_OFF)
+       && pPager->journalMode!=PAGER_JOURNALMODE_OFF
       ){
         Pgno i;                                   /* Iterator variable */
         const Pgno iSkip = PAGER_MJ_PGNO(pPager); /* Pending lock page */
@@ -39085,14 +39899,20 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
       rc = writeMasterJournal(pPager, zMaster);
       if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
   
-      /* Sync the journal file. If the atomic-update optimization is being
-      ** used, this call will not create the journal file or perform any
-      ** real IO.
+      /* Sync the journal file and write all dirty pages to the database.
+      ** If the atomic-update optimization is being used, this sync will not 
+      ** create the journal file or perform any real IO.
+      **
+      ** Because the change-counter page was just modified, unless the
+      ** atomic-update optimization is used it is almost certain that the
+      ** journal requires a sync here. However, in locking_mode=exclusive
+      ** on a system under memory pressure it is just possible that this is 
+      ** not the case. In this case it is likely enough that the redundant
+      ** xSync() call will be changed to a no-op by the OS anyhow. 
       */
-      rc = syncJournal(pPager);
+      rc = syncJournal(pPager, 0);
       if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
   
-      /* Write all dirty pages to the database file. */
       rc = pager_write_pagelist(pPager,sqlite3PcacheDirtyList(pPager->pPCache));
       if( rc!=SQLITE_OK ){
         assert( rc!=SQLITE_IOERR_BLOCKED );
@@ -39105,7 +39925,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
       */
       if( pPager->dbSize!=pPager->dbFileSize ){
         Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager));
-        assert( pPager->state>=PAGER_EXCLUSIVE );
+        assert( pPager->eState==PAGER_WRITER_DBMOD );
         rc = pager_truncate(pPager, nNew);
         if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
       }
@@ -39116,11 +39936,12 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
       }
       IOTRACE(("DBSYNC %p\n", pPager))
     }
-
-    pPager->state = PAGER_SYNCED;
   }
 
 commit_phase_one_exit:
+  if( rc==SQLITE_OK && !pagerUseWal(pPager) ){
+    pPager->eState = PAGER_WRITER_FINISHED;
+  }
   return rc;
 }
 
@@ -39148,12 +39969,11 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){
   ** called, just return the same error code without doing anything. */
   if( NEVER(pPager->errCode) ) return pPager->errCode;
 
-  /* This function should not be called if the pager is not in at least
-  ** PAGER_RESERVED state. **FIXME**: Make it so that this test always
-  ** fails - make it so that we never reach this point if we do not hold
-  ** all necessary locks.
-  */
-  if( NEVER(pPager->state<PAGER_RESERVED) ) return SQLITE_ERROR;
+  assert( pPager->eState==PAGER_WRITER_LOCKED
+       || pPager->eState==PAGER_WRITER_FINISHED
+       || (pagerUseWal(pPager) && pPager->eState==PAGER_WRITER_CACHEMOD)
+  );
+  assert( assert_pager_state(pPager) );
 
   /* An optimization. If the database was not actually modified during
   ** this transaction, the pager is running in exclusive-mode and is
@@ -39166,102 +39986,76 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){
   ** header. Since the pager is in exclusive mode, there is no need
   ** to drop any locks either.
   */
-  if( pPager->dbModified==0 && pPager->exclusiveMode 
+  if( pPager->eState==PAGER_WRITER_LOCKED 
+   && pPager->exclusiveMode 
    && pPager->journalMode==PAGER_JOURNALMODE_PERSIST
   ){
     assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) || !pPager->journalOff );
+    pPager->eState = PAGER_READER;
     return SQLITE_OK;
   }
 
   PAGERTRACE(("COMMIT %d\n", PAGERID(pPager)));
-  assert( pPager->state==PAGER_SYNCED || MEMDB || !pPager->dbModified );
   rc = pager_end_transaction(pPager, pPager->setMaster);
   return pager_error(pPager, rc);
 }
 
 /*
-** Rollback all changes. The database falls back to PAGER_SHARED mode.
+** If a write transaction is open, then all changes made within the 
+** transaction are reverted and the current write-transaction is closed.
+** The pager falls back to PAGER_READER state if successful, or PAGER_ERROR
+** state if an error occurs.
 **
-** This function performs two tasks:
+** If the pager is already in PAGER_ERROR state when this function is called,
+** it returns Pager.errCode immediately. No work is performed in this case.
+**
+** Otherwise, in rollback mode, this function performs two functions:
 **
 **   1) It rolls back the journal file, restoring all database file and 
 **      in-memory cache pages to the state they were in when the transaction
 **      was opened, and
+**
 **   2) It finalizes the journal file, so that it is not used for hot
 **      rollback at any point in the future.
 **
-** subject to the following qualifications:
-**
-** * If the journal file is not yet open when this function is called,
-**   then only (2) is performed. In this case there is no journal file
-**   to roll back.
-**
-** * If in an error state other than SQLITE_FULL, then task (1) is 
-**   performed. If successful, task (2). Regardless of the outcome
-**   of either, the error state error code is returned to the caller
-**   (i.e. either SQLITE_IOERR or SQLITE_CORRUPT).
-**
-** * If the pager is in PAGER_RESERVED state, then attempt (1). Whether
-**   or not (1) is successful, also attempt (2). If successful, return
-**   SQLITE_OK. Otherwise, enter the error state and return the first 
-**   error code encountered. 
+** Finalization of the journal file (task 2) is only performed if the 
+** rollback is successful.
 **
-**   In this case there is no chance that the database was written to. 
-**   So is safe to finalize the journal file even if the playback 
-**   (operation 1) failed. However the pager must enter the error state
-**   as the contents of the in-memory cache are now suspect.
-**
-** * Finally, if in PAGER_EXCLUSIVE state, then attempt (1). Only
-**   attempt (2) if (1) is successful. Return SQLITE_OK if successful,
-**   otherwise enter the error state and return the error code from the 
-**   failing operation.
-**
-**   In this case the database file may have been written to. So if the
-**   playback operation did not succeed it would not be safe to finalize
-**   the journal file. It needs to be left in the file-system so that
-**   some other process can use it to restore the database state (by
-**   hot-journal rollback).
+** In WAL mode, all cache-entries containing data modified within the
+** current transaction are either expelled from the cache or reverted to
+** their pre-transaction state by re-reading data from the database or
+** WAL files. The WAL transaction is then closed.
 */
 SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){
   int rc = SQLITE_OK;                  /* Return code */
   PAGERTRACE(("ROLLBACK %d\n", PAGERID(pPager)));
+
+  /* PagerRollback() is a no-op if called in READER or OPEN state. If
+  ** the pager is already in the ERROR state, the rollback is not 
+  ** attempted here. Instead, the error code is returned to the caller.
+  */
+  assert( assert_pager_state(pPager) );
+  if( pPager->eState==PAGER_ERROR ) return pPager->errCode;
+  if( pPager->eState<=PAGER_READER ) return SQLITE_OK;
+
   if( pagerUseWal(pPager) ){
     int rc2;
-
     rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, -1);
     rc2 = pager_end_transaction(pPager, pPager->setMaster);
     if( rc==SQLITE_OK ) rc = rc2;
-    rc = pager_error(pPager, rc);
-  }else if( !pPager->dbModified || !isOpen(pPager->jfd) ){
-    rc = pager_end_transaction(pPager, pPager->setMaster);
-  }else if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){
-    if( pPager->state>=PAGER_EXCLUSIVE ){
-      pager_playback(pPager, 0);
-    }
-    rc = pPager->errCode;
+  }else if( !isOpen(pPager->jfd) || pPager->eState==PAGER_WRITER_LOCKED ){
+    rc = pager_end_transaction(pPager, 0);
   }else{
-    if( pPager->state==PAGER_RESERVED ){
-      int rc2;
-      rc = pager_playback(pPager, 0);
-      rc2 = pager_end_transaction(pPager, pPager->setMaster);
-      if( rc==SQLITE_OK ){
-        rc = rc2;
-      }
-    }else{
-      rc = pager_playback(pPager, 0);
-    }
+    rc = pager_playback(pPager, 0);
+  }
 
-    if( !MEMDB ){
-      pPager->dbSizeValid = 0;
-    }
+  assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK );
+  assert( rc==SQLITE_OK || rc==SQLITE_FULL || (rc&0xFF)==SQLITE_IOERR );
 
-    /* If an error occurs during a ROLLBACK, we can no longer trust the pager
-    ** cache. So call pager_error() on the way out to make any error 
-    ** persistent.
-    */
-    rc = pager_error(pPager, rc);
-  }
-  return rc;
+  /* If an error occurs during a ROLLBACK, we can no longer trust the pager
+  ** cache. So call pager_error() on the way out to make any error persistent.
+  */
+  return pager_error(pPager, rc);
 }
 
 /*
@@ -39284,9 +40078,11 @@ SQLITE_PRIVATE int sqlite3PagerRefcount(Pager *pPager){
 ** used by the pager and its associated cache.
 */
 SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager *pPager){
-  int perPageSize = pPager->pageSize + pPager->nExtra + 20;
+  int perPageSize = pPager->pageSize + pPager->nExtra + sizeof(PgHdr)
+                                     + 5*sizeof(void*);
   return perPageSize*sqlite3PcachePagecount(pPager->pPCache)
-           + sqlite3MallocSize(pPager);
+           + sqlite3MallocSize(pPager)
+           + pPager->pageSize;
 }
 
 /*
@@ -39305,8 +40101,8 @@ SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){
   a[0] = sqlite3PcacheRefCount(pPager->pPCache);
   a[1] = sqlite3PcachePagecount(pPager->pPCache);
   a[2] = sqlite3PcacheGetCachesize(pPager->pPCache);
-  a[3] = pPager->dbSizeValid ? (int) pPager->dbSize : -1;
-  a[4] = pPager->state;
+  a[3] = pPager->eState==PAGER_OPEN ? -1 : (int) pPager->dbSize;
+  a[4] = pPager->eState;
   a[5] = pPager->errCode;
   a[6] = pPager->nHit;
   a[7] = pPager->nMiss;
@@ -39338,13 +40134,12 @@ SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){
   int rc = SQLITE_OK;                       /* Return code */
   int nCurrent = pPager->nSavepoint;        /* Current number of savepoints */
 
+  assert( pPager->eState>=PAGER_WRITER_LOCKED );
+  assert( assert_pager_state(pPager) );
+
   if( nSavepoint>nCurrent && pPager->useJournal ){
     int ii;                                 /* Iterator variable */
     PagerSavepoint *aNew;                   /* New Pager.aSavepoint array */
-    int nPage;                              /* Size of database file */
-
-    rc = sqlite3PagerPagecount(pPager, &nPage);
-    if( rc ) return rc;
 
     /* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM
     ** if the allocation fails. Otherwise, zero the new portion in case a 
@@ -39361,14 +40156,14 @@ SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){
 
     /* Populate the PagerSavepoint structures just allocated. */
     for(ii=nCurrent; ii<nSavepoint; ii++){
-      aNew[ii].nOrig = nPage;
+      aNew[ii].nOrig = pPager->dbSize;
       if( isOpen(pPager->jfd) && pPager->journalOff>0 ){
         aNew[ii].iOffset = pPager->journalOff;
       }else{
         aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager);
       }
       aNew[ii].iSubRec = pPager->nSubRec;
-      aNew[ii].pInSavepoint = sqlite3BitvecCreate(nPage);
+      aNew[ii].pInSavepoint = sqlite3BitvecCreate(pPager->dbSize);
       if( !aNew[ii].pInSavepoint ){
         return SQLITE_NOMEM;
       }
@@ -39415,12 +40210,12 @@ SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){
 ** savepoint. If no errors occur, SQLITE_OK is returned.
 */ 
 SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){
-  int rc = SQLITE_OK;
+  int rc = pPager->errCode;       /* Return code */
 
   assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK );
   assert( iSavepoint>=0 || op==SAVEPOINT_ROLLBACK );
 
-  if( iSavepoint<pPager->nSavepoint ){
+  if( rc==SQLITE_OK && iSavepoint<pPager->nSavepoint ){
     int ii;            /* Iterator variable */
     int nNew;          /* Number of remaining savepoints after this op. */
 
@@ -39456,8 +40251,8 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){
       rc = pagerPlaybackSavepoint(pPager, pSavepoint);
       assert(rc!=SQLITE_DONE);
     }
-  
   }
+
   return rc;
 }
 
@@ -39555,6 +40350,10 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i
   Pgno origPgno;               /* The original page number */
 
   assert( pPg->nRef>0 );
+  assert( pPager->eState==PAGER_WRITER_CACHEMOD
+       || pPager->eState==PAGER_WRITER_DBMOD
+  );
+  assert( assert_pager_state(pPager) );
 
   /* In order to be able to rollback, an in-memory database must journal
   ** the page we are moving from.
@@ -39604,11 +40403,10 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i
     needSyncPgno = pPg->pgno;
     assert( pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize );
     assert( pPg->flags&PGHDR_DIRTY );
-    assert( pPager->needSync );
   }
 
   /* If the cache contains a page with page-number pgno, remove it
-  ** from its hash chain. Also, if the PgHdr.needSync was set for 
+  ** from its hash chain. Also, if the PGHDR_NEED_SYNC flag was set for 
   ** page pgno before the 'move' operation, it needs to be retained 
   ** for the page moved there.
   */
@@ -39620,7 +40418,6 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i
     if( MEMDB ){
       /* Do not discard pages from an in-memory database since we might
       ** need to rollback later.  Just move the page out of the way. */
-      assert( pPager->dbSizeValid );
       sqlite3PcacheMove(pPgOld, pPager->dbSize+1);
     }else{
       sqlite3PcacheDrop(pPgOld);
@@ -39630,14 +40427,23 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i
   origPgno = pPg->pgno;
   sqlite3PcacheMove(pPg, pgno);
   sqlite3PcacheMakeDirty(pPg);
-  pPager->dbModified = 1;
+
+  /* For an in-memory database, make sure the original page continues
+  ** to exist, in case the transaction needs to roll back.  Use pPgOld
+  ** as the original page since it has already been allocated.
+  */
+  if( MEMDB ){
+    assert( pPgOld );
+    sqlite3PcacheMove(pPgOld, origPgno);
+    sqlite3PagerUnref(pPgOld);
+  }
 
   if( needSyncPgno ){
     /* If needSyncPgno is non-zero, then the journal file needs to be 
     ** sync()ed before any data is written to database file page needSyncPgno.
     ** Currently, no such page exists in the page-cache and the 
     ** "is journaled" bitvec flag has been set. This needs to be remedied by
-    ** loading the page into the pager-cache and setting the PgHdr.needSync 
+    ** loading the page into the pager-cache and setting the PGHDR_NEED_SYNC
     ** flag.
     **
     ** If the attempt to load the page into the page-cache fails, (due
@@ -39646,12 +40452,8 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i
     ** this transaction, it may be written to the database file before
     ** it is synced into the journal file. This way, it may end up in
     ** the journal file twice, but that is not a problem.
-    **
-    ** The sqlite3PagerGet() call may cause the journal to sync. So make
-    ** sure the Pager.needSync flag is set too.
     */
     PgHdr *pPgHdr;
-    assert( pPager->needSync );
     rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr);
     if( rc!=SQLITE_OK ){
       if( needSyncPgno<=pPager->dbOrigSize ){
@@ -39660,23 +40462,11 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i
       }
       return rc;
     }
-    pPager->needSync = 1;
-    assert( pPager->noSync==0 && !MEMDB );
     pPgHdr->flags |= PGHDR_NEED_SYNC;
     sqlite3PcacheMakeDirty(pPgHdr);
     sqlite3PagerUnref(pPgHdr);
   }
 
-  /*
-  ** For an in-memory database, make sure the original page continues
-  ** to exist, in case the transaction needs to roll back.  Use pPgOld
-  ** as the original page since it has already been allocated.
-  */
-  if( MEMDB ){
-    sqlite3PcacheMove(pPgOld, origPgno);
-    sqlite3PagerUnref(pPgOld);
-  }
-
   return SQLITE_OK;
 }
 #endif
@@ -39742,6 +40532,13 @@ SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *pPager, int eMode){
 SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){
   u8 eOld = pPager->journalMode;    /* Prior journalmode */
 
+#ifdef SQLITE_DEBUG
+  /* The print_pager_state() routine is intended to be used by the debugger
+  ** only.  We invoke it once here to suppress a compiler warning. */
+  print_pager_state(pPager);
+#endif
+
+
   /* The eMode parameter is always valid */
   assert(      eMode==PAGER_JOURNALMODE_DELETE
             || eMode==PAGER_JOURNALMODE_TRUNCATE
@@ -39767,20 +40564,13 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){
   }
 
   if( eMode!=eOld ){
-    /* When changing between rollback modes, close the journal file prior
-    ** to the change.  But when changing from a rollback mode to WAL, keep
-    ** the journal open since there is a rollback-style transaction in play
-    ** used to convert the version numbers in the btree header.
-    */
-    if( isOpen(pPager->jfd) && eMode!=PAGER_JOURNALMODE_WAL ){
-      sqlite3OsClose(pPager->jfd);
-    }
 
     /* Change the journal mode. */
+    assert( pPager->eState!=PAGER_ERROR );
     pPager->journalMode = (u8)eMode;
 
     /* When transistioning from TRUNCATE or PERSIST to any other journal
-    ** mode except WAL (and we are not in locking_mode=EXCLUSIVE) then 
+    ** mode except WAL, unless the pager is in locking_mode=exclusive mode,
     ** delete the journal file.
     */
     assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 );
@@ -39801,24 +40591,30 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){
       ** database file. This ensures that the journal file is not deleted
       ** while it is in use by some other client.
       */
-      int rc = SQLITE_OK;
-      int state = pPager->state;
-      if( state<PAGER_SHARED ){
-        rc = sqlite3PagerSharedLock(pPager);
-      }
-      if( pPager->state==PAGER_SHARED ){
-        assert( rc==SQLITE_OK );
-        rc = sqlite3OsLock(pPager->fd, RESERVED_LOCK);
-      }
-      if( rc==SQLITE_OK ){
+      sqlite3OsClose(pPager->jfd);
+      if( pPager->eLock>=RESERVED_LOCK ){
         sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
+      }else{
+        int rc = SQLITE_OK;
+        int state = pPager->eState;
+        assert( state==PAGER_OPEN || state==PAGER_READER );
+        if( state==PAGER_OPEN ){
+          rc = sqlite3PagerSharedLock(pPager);
+        }
+        if( pPager->eState==PAGER_READER ){
+          assert( rc==SQLITE_OK );
+          rc = pagerLockDb(pPager, RESERVED_LOCK);
+        }
+        if( rc==SQLITE_OK ){
+          sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
+        }
+        if( rc==SQLITE_OK && state==PAGER_READER ){
+          pagerUnlockDb(pPager, SHARED_LOCK);
+        }else if( state==PAGER_OPEN ){
+          pager_unlock(pPager);
+        }
+        assert( state==pPager->eState );
       }
-      if( rc==SQLITE_OK && state==PAGER_SHARED ){
-        sqlite3OsUnlock(pPager->fd, SHARED_LOCK);
-      }else if( state==PAGER_UNLOCK ){
-        pager_unlock(pPager);
-      }
-      assert( state==pPager->state );
     }
   }
 
@@ -39839,7 +40635,8 @@ SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager *pPager){
 ** is unmodified.
 */
 SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager *pPager){
-  if( pPager->dbModified ) return 0;
+  assert( assert_pager_state(pPager) );
+  if( pPager->eState>=PAGER_WRITER_CACHEMOD ) return 0;
   if( NEVER(isOpen(pPager->jfd) && pPager->journalOff>0) ) return 0;
   return 1;
 }
@@ -39904,25 +40701,31 @@ SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager){
 ** file (not a temp file or an in-memory database), and the WAL file
 ** is not already open, make an attempt to open it now. If successful,
 ** return SQLITE_OK. If an error occurs or the VFS used by the pager does 
-** not support the xShmXXX() methods, return an error code. *pisOpen is
+** not support the xShmXXX() methods, return an error code. *pbOpen is
 ** not modified in either case.
 **
 ** If the pager is open on a temp-file (or in-memory database), or if
-** the WAL file is already open, set *pisOpen to 1 and return SQLITE_OK
+** the WAL file is already open, set *pbOpen to 1 and return SQLITE_OK
 ** without doing anything.
 */
 SQLITE_PRIVATE int sqlite3PagerOpenWal(
   Pager *pPager,                  /* Pager object */
-  int *pisOpen                    /* OUT: Set to true if call is a no-op */
+  int *pbOpen                     /* OUT: Set to true if call is a no-op */
 ){
   int rc = SQLITE_OK;             /* Return code */
 
-  assert( pPager->state>=PAGER_SHARED );
-  assert( (pisOpen==0 && !pPager->tempFile && !pPager->pWal) || *pisOpen==0 );
+  assert( assert_pager_state(pPager) );
+  assert( pPager->eState==PAGER_OPEN   || pbOpen );
+  assert( pPager->eState==PAGER_READER || !pbOpen );
+  assert( pbOpen==0 || *pbOpen==0 );
+  assert( pbOpen!=0 || (!pPager->tempFile && !pPager->pWal) );
 
   if( !pPager->tempFile && !pPager->pWal ){
     if( !sqlite3PagerWalSupported(pPager) ) return SQLITE_CANTOPEN;
 
+    /* Close any rollback journal previously open */
+    sqlite3OsClose(pPager->jfd);
+
     /* Open the connection to the log file. If this operation fails, 
     ** (e.g. due to malloc() failure), unlock the database file and 
     ** return an error code.
@@ -39930,9 +40733,10 @@ SQLITE_PRIVATE int sqlite3PagerOpenWal(
     rc = sqlite3WalOpen(pPager->pVfs, pPager->fd, pPager->zWal, &pPager->pWal);
     if( rc==SQLITE_OK ){
       pPager->journalMode = PAGER_JOURNALMODE_WAL;
+      pPager->eState = PAGER_OPEN;
     }
   }else{
-    *pisOpen = 1;
+    *pbOpen = 1;
   }
 
   return rc;
@@ -39958,7 +40762,7 @@ SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager){
   */
   if( !pPager->pWal ){
     int logexists = 0;
-    rc = sqlite3OsLock(pPager->fd, SQLITE_LOCK_SHARED);
+    rc = pagerLockDb(pPager, SHARED_LOCK);
     if( rc==SQLITE_OK ){
       rc = sqlite3OsAccess(
           pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &logexists
@@ -39974,7 +40778,7 @@ SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager){
   ** the database file, the log and log-summary files will be deleted.
   */
   if( rc==SQLITE_OK && pPager->pWal ){
-    rc = sqlite3OsLock(pPager->fd, SQLITE_LOCK_EXCLUSIVE);
+    rc = pagerLockDb(pPager, EXCLUSIVE_LOCK);
     if( rc==SQLITE_OK ){
       rc = sqlite3WalClose(pPager->pWal,
                            (pPager->noSync ? 0 : pPager->sync_flags), 
@@ -39984,7 +40788,7 @@ SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager){
     }else{
       /* If we cannot get an EXCLUSIVE lock, downgrade the PENDING lock
       ** that we did get back to SHARED. */
-      sqlite3OsUnlock(pPager->fd, SQLITE_LOCK_SHARED);
+      pagerUnlockDb(pPager, SQLITE_LOCK_SHARED);
     }
   }
   return rc;
@@ -40304,6 +41108,10 @@ typedef struct WalCkptInfo WalCkptInfo;
 **
 ** The actual header in the wal-index consists of two copies of this
 ** object.
+**
+** The szPage value can be any power of 2 between 512 and 32768, inclusive.
+** Or it can be 1 to represent a 65536-byte page.  The latter case was
+** added in 3.7.1 when support for 64K pages was added.  
 */
 struct WalIndexHdr {
   u32 iVersion;                   /* Wal-index version */
@@ -40311,7 +41119,7 @@ struct WalIndexHdr {
   u32 iChange;                    /* Counter incremented each transaction */
   u8 isInit;                      /* 1 when initialized */
   u8 bigEndCksum;                 /* True if checksums in WAL are big-endian */
-  u16 szPage;                     /* Database page size in bytes */
+  u16 szPage;                     /* Database page size in bytes. 1==64K */
   u32 mxFrame;                    /* Index of last valid frame in the WAL */
   u32 nPage;                      /* Size of database in pages */
   u32 aFrameCksum[2];             /* Checksum of last frame in log */
@@ -40422,7 +41230,7 @@ struct Wal {
   u32 iCallback;             /* Value to pass to log callback (or 0) */
   int nWiData;               /* Size of array apWiData */
   volatile u32 **apWiData;   /* Pointer to wal-index content in memory */
-  u16 szPage;                /* Database page size */
+  u32 szPage;                /* Database page size */
   i16 readLock;              /* Which read lock is being held.  -1 for none */
   u8 exclusiveMode;          /* Non-zero if connection is in exclusive mode */
   u8 writeLock;              /* True if in a write transaction */
@@ -41093,7 +41901,7 @@ static int walIndexRecover(Wal *pWal){
       goto finished;
     }
     pWal->hdr.bigEndCksum = (u8)(magic&0x00000001);
-    pWal->szPage = (u16)szPage;
+    pWal->szPage = szPage;
     pWal->nCkpt = sqlite3Get4byte(&aBuf[12]);
     memcpy(&pWal->hdr.aSalt, &aBuf[16], 8);
 
@@ -41143,7 +41951,9 @@ static int walIndexRecover(Wal *pWal){
       if( nTruncate ){
         pWal->hdr.mxFrame = iFrame;
         pWal->hdr.nPage = nTruncate;
-        pWal->hdr.szPage = (u16)szPage;
+        pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16));
+        testcase( szPage<=32768 );
+        testcase( szPage>=65536 );
         aFrameCksum[0] = pWal->hdr.aFrameCksum[0];
         aFrameCksum[1] = pWal->hdr.aFrameCksum[1];
       }
@@ -41168,6 +41978,17 @@ finished:
     pInfo->nBackfill = 0;
     pInfo->aReadMark[0] = 0;
     for(i=1; i<WAL_NREADER; i++) pInfo->aReadMark[i] = READMARK_NOT_USED;
+
+    /* If more than one frame was recovered from the log file, report an
+    ** event via sqlite3_log(). This is to help with identifying performance
+    ** problems caused by applications routinely shutting down without
+    ** checkpointing the log file.
+    */
+    if( pWal->hdr.nPage ){
+      sqlite3_log(SQLITE_OK, "Recovered %d frames from WAL file %s",
+          pWal->hdr.nPage, pWal->zWalName
+      );
+    }
   }
 
 recovery_error:
@@ -41528,14 +42349,18 @@ static int walCheckpoint(
   u8 *zBuf                        /* Temporary buffer to use */
 ){
   int rc;                         /* Return code */
-  int szPage = pWal->hdr.szPage;  /* Database page-size */
+  int szPage;                     /* Database page-size */
   WalIterator *pIter = 0;         /* Wal iterator context */
   u32 iDbpage = 0;                /* Next database page to write */
   u32 iFrame = 0;                 /* Wal frame containing data for iDbpage */
   u32 mxSafeFrame;                /* Max frame that can be backfilled */
+  u32 mxPage;                     /* Max database page to write */
   int i;                          /* Loop counter */
   volatile WalCkptInfo *pInfo;    /* The checkpoint status information */
 
+  szPage = (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16);
+  testcase( szPage<=32768 );
+  testcase( szPage>=65536 );
   if( pWal->hdr.mxFrame==0 ) return SQLITE_OK;
 
   /* Allocate the iterator */
@@ -41546,7 +42371,7 @@ static int walCheckpoint(
   assert( pIter );
 
   /*** TODO:  Move this test out to the caller.  Make it an assert() here ***/
-  if( pWal->hdr.szPage!=nBuf ){
+  if( szPage!=nBuf ){
     rc = SQLITE_CORRUPT_BKPT;
     goto walcheckpoint_out;
   }
@@ -41557,6 +42382,7 @@ static int walCheckpoint(
   ** cannot be backfilled from the WAL.
   */
   mxSafeFrame = pWal->hdr.mxFrame;
+  mxPage = pWal->hdr.nPage;
   pInfo = walCkptInfo(pWal);
   for(i=1; i<WAL_NREADER; i++){
     u32 y = pInfo->aReadMark[i];
@@ -41577,6 +42403,7 @@ static int walCheckpoint(
   if( pInfo->nBackfill<mxSafeFrame
    && (rc = walLockExclusive(pWal, WAL_READ_LOCK(0), 1))==SQLITE_OK
   ){
+    i64 nSize;                    /* Current size of database file */
     u32 nBackfill = pInfo->nBackfill;
 
     /* Sync the WAL to disk */
@@ -41584,11 +42411,22 @@ static int walCheckpoint(
       rc = sqlite3OsSync(pWal->pWalFd, sync_flags);
     }
 
+    /* If the database file may grow as a result of this checkpoint, hint
+    ** about the eventual size of the db file to the VFS layer. 
+    */
+    if( rc==SQLITE_OK ){
+      i64 nReq = ((i64)mxPage * szPage);
+      rc = sqlite3OsFileSize(pWal->pDbFd, &nSize);
+      if( rc==SQLITE_OK && nSize<nReq ){
+        sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_SIZE_HINT, &nReq);
+      }
+    }
+
     /* Iterate through the contents of the WAL, copying data to the db file. */
     while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){
       i64 iOffset;
       assert( walFramePgno(pWal, iFrame)==iDbpage );
-      if( iFrame<=nBackfill || iFrame>mxSafeFrame ) continue;
+      if( iFrame<=nBackfill || iFrame>mxSafeFrame || iDbpage>mxPage ) continue;
       iOffset = walFrameOffset(iFrame, szPage) + WAL_FRAME_HDRSIZE;
       /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL file */
       rc = sqlite3OsRead(pWal->pWalFd, zBuf, szPage, iOffset);
@@ -41695,7 +42533,7 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){
   /* The first page of the wal-index must be mapped at this point. */
   assert( pWal->nWiData>0 && pWal->apWiData[0] );
 
-  /* Read the header. This might happen currently with a write to the
+  /* Read the header. This might happen concurrently with a write to the
   ** same area of shared memory on a different CPU in a SMP,
   ** meaning it is possible that an inconsistent snapshot is read
   ** from the file. If this happens, return non-zero.
@@ -41724,7 +42562,9 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){
   if( memcmp(&pWal->hdr, &h1, sizeof(WalIndexHdr)) ){
     *pChanged = 1;
     memcpy(&pWal->hdr, &h1, sizeof(WalIndexHdr));
-    pWal->szPage = pWal->hdr.szPage;
+    pWal->szPage = (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16);
+    testcase( pWal->szPage<=32768 );
+    testcase( pWal->szPage>=65536 );
   }
 
   /* The header was successfully read. Return zero. */
@@ -42043,6 +42883,7 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){
 ** read-lock.
 */
 SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal){
+  sqlite3WalEndWriteTransaction(pWal);
   if( pWal->readLock>=0 ){
     walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock));
     pWal->readLock = -1;
@@ -42153,7 +42994,13 @@ SQLITE_PRIVATE int sqlite3WalRead(
   ** required page. Read and return data from the log file.
   */
   if( iRead ){
-    i64 iOffset = walFrameOffset(iRead, pWal->hdr.szPage) + WAL_FRAME_HDRSIZE;
+    int sz;
+    i64 iOffset;
+    sz = pWal->hdr.szPage;
+    sz = (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16);
+    testcase( sz<=32768 );
+    testcase( sz>=65536 );
+    iOffset = walFrameOffset(iRead, sz) + WAL_FRAME_HDRSIZE;
     *pInWal = 1;
     /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL */
     return sqlite3OsRead(pWal->pWalFd, pOut, nOut, iOffset);
@@ -42165,11 +43012,13 @@ SQLITE_PRIVATE int sqlite3WalRead(
 
 
 /* 
-** Set *pPgno to the size of the database file (or zero, if unknown).
+** Return the size of the database in pages (or zero, if unknown).
 */
-SQLITE_PRIVATE void sqlite3WalDbsize(Wal *pWal, Pgno *pPgno){
-  assert( pWal->readLock>=0 || pWal->lockError );
-  *pPgno = pWal->hdr.nPage;
+SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal){
+  if( pWal && ALWAYS(pWal->readLock>=0) ){
+    return pWal->hdr.nPage;
+  }
+  return 0;
 }
 
 
@@ -42245,7 +43094,7 @@ SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal){
 */
 SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){
   int rc = SQLITE_OK;
-  if( pWal->writeLock ){
+  if( ALWAYS(pWal->writeLock) ){
     Pgno iMax = pWal->hdr.mxFrame;
     Pgno iFrame;
   
@@ -42434,7 +43283,7 @@ SQLITE_PRIVATE int sqlite3WalFrames(
     sqlite3Put4byte(&aWalHdr[24], aCksum[0]);
     sqlite3Put4byte(&aWalHdr[28], aCksum[1]);
     
-    pWal->szPage = (u16)szPage;
+    pWal->szPage = szPage;
     pWal->hdr.bigEndCksum = SQLITE_BIGENDIAN;
     pWal->hdr.aFrameCksum[0] = aCksum[0];
     pWal->hdr.aFrameCksum[1] = aCksum[1];
@@ -42529,7 +43378,9 @@ SQLITE_PRIVATE int sqlite3WalFrames(
 
   if( rc==SQLITE_OK ){
     /* Update the private copy of the header. */
-    pWal->hdr.szPage = (u16)szPage;
+    pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16));
+    testcase( szPage<=32768 );
+    testcase( szPage>=65536 );
     pWal->hdr.mxFrame = iFrame;
     if( isCommit ){
       pWal->hdr.iChange++;
@@ -42741,7 +43592,7 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){
 **
 ** The file is divided into pages.  The first page is called page 1,
 ** the second is page 2, and so forth.  A page number of zero indicates
-** "no such page".  The page size can be any power of 2 between 512 and 32768.
+** "no such page".  The page size can be any power of 2 between 512 and 65536.
 ** Each page can be either a btree page, a freelist page, an overflow
 ** page, or a pointer-map page.
 **
@@ -43107,14 +43958,14 @@ struct BtShared {
   u8 autoVacuum;        /* True if auto-vacuum is enabled */
   u8 incrVacuum;        /* True if incr-vacuum is enabled */
 #endif
-  u16 pageSize;         /* Total number of bytes on a page */
-  u16 usableSize;       /* Number of usable bytes on each page */
   u16 maxLocal;         /* Maximum local payload in non-LEAFDATA tables */
   u16 minLocal;         /* Minimum local payload in non-LEAFDATA tables */
   u16 maxLeaf;          /* Maximum local payload in a LEAFDATA table */
   u16 minLeaf;          /* Minimum local payload in a LEAFDATA table */
   u8 inTransaction;     /* Transaction state */
   u8 doNotUseWAL;       /* If true, do not open write-ahead-log file */
+  u32 pageSize;         /* Total number of bytes on a page */
+  u32 usableSize;       /* Number of usable bytes on each page */
   int nTransaction;     /* Number of open transactions (read + write) */
   u32 nPage;            /* Number of pages in the database */
   void *pSchema;        /* Pointer to space allocated by sqlite3BtreeSchema() */
@@ -43713,7 +44564,16 @@ int sqlite3BtreeTrace=1;  /* True to enable tracing */
 # define TRACE(X)
 #endif
 
-
+/*
+** Extract a 2-byte big-endian integer from an array of unsigned bytes.
+** But if the value is zero, make it 65536.
+**
+** This routine is used to extract the "offset to cell content area" value
+** from the header of a btree page.  If the page size is 65536 and the page
+** is empty, the offset should be 65536, but the 2-byte value stores zero.
+** This routine makes the necessary adjustment to 65536.
+*/
+#define get2byteNotZero(X)  (((((int)get2byte(X))-1)&0xffff)+1)
 
 #ifndef SQLITE_OMIT_SHARED_CACHE
 /*
@@ -44402,11 +45262,16 @@ SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor *pCur, int *pHasMoved){
 ** Given a page number of a regular database page, return the page
 ** number for the pointer-map page that contains the entry for the
 ** input page number.
+**
+** Return 0 (not a valid page) for pgno==1 since there is
+** no pointer map associated with page 1.  The integrity_check logic
+** requires that ptrmapPageno(*,1)!=1.
 */
 static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){
   int nPagesPerMapPage;
   Pgno iPtrMap, ret;
   assert( sqlite3_mutex_held(pBt->mutex) );
+  if( pgno<2 ) return 0;
   nPagesPerMapPage = (pBt->usableSize/5)+1;
   iPtrMap = (pgno-2)/nPagesPerMapPage;
   ret = (iPtrMap*nPagesPerMapPage) + 2; 
@@ -44835,7 +45700,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
   nFrag = data[hdr+7];
   assert( pPage->cellOffset == hdr + 12 - 4*pPage->leaf );
   gap = pPage->cellOffset + 2*pPage->nCell;
-  top = get2byte(&data[hdr+5]);
+  top = get2byteNotZero(&data[hdr+5]);
   if( gap>top ) return SQLITE_CORRUPT_BKPT;
   testcase( gap+2==top );
   testcase( gap+1==top );
@@ -44845,7 +45710,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
     /* Always defragment highly fragmented pages */
     rc = defragmentPage(pPage);
     if( rc ) return rc;
-    top = get2byte(&data[hdr+5]);
+    top = get2byteNotZero(&data[hdr+5]);
   }else if( gap+2<=top ){
     /* Search the freelist looking for a free slot big enough to satisfy 
     ** the request. The allocation is made from the first free slot in 
@@ -44887,7 +45752,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
   if( gap+2+nByte>top ){
     rc = defragmentPage(pPage);
     if( rc ) return rc;
-    top = get2byte(&data[hdr+5]);
+    top = get2byteNotZero(&data[hdr+5]);
     assert( gap+nByte<=top );
   }
 
@@ -45053,10 +45918,10 @@ static int btreeInitPage(MemPage *pPage){
     u8 hdr;            /* Offset to beginning of page header */
     u8 *data;          /* Equal to pPage->aData */
     BtShared *pBt;        /* The main btree structure */
-    u16 usableSize;    /* Amount of usable space on each page */
+    int usableSize;    /* Amount of usable space on each page */
     u16 cellOffset;    /* Offset from start of page to first cell pointer */
-    u16 nFree;         /* Number of unused bytes on the page */
-    u16 top;           /* First byte of the cell content area */
+    int nFree;         /* Number of unused bytes on the page */
+    int top;           /* First byte of the cell content area */
     int iCellFirst;    /* First allowable cell or freeblock offset */
     int iCellLast;     /* Last possible cell or freeblock offset */
 
@@ -45065,12 +45930,12 @@ static int btreeInitPage(MemPage *pPage){
     hdr = pPage->hdrOffset;
     data = pPage->aData;
     if( decodeFlags(pPage, data[hdr]) ) return SQLITE_CORRUPT_BKPT;
-    assert( pBt->pageSize>=512 && pBt->pageSize<=32768 );
-    pPage->maskPage = pBt->pageSize - 1;
+    assert( pBt->pageSize>=512 && pBt->pageSize<=65536 );
+    pPage->maskPage = (u16)(pBt->pageSize - 1);
     pPage->nOverflow = 0;
     usableSize = pBt->usableSize;
     pPage->cellOffset = cellOffset = hdr + 12 - 4*pPage->leaf;
-    top = get2byte(&data[hdr+5]);
+    top = get2byteNotZero(&data[hdr+5]);
     pPage->nCell = get2byte(&data[hdr+3]);
     if( pPage->nCell>MX_CELL(pBt) ){
       /* To many cells for a single page.  The page must be corrupt */
@@ -45169,13 +46034,13 @@ static void zeroPage(MemPage *pPage, int flags){
   memset(&data[hdr+1], 0, 4);
   data[hdr+7] = 0;
   put2byte(&data[hdr+5], pBt->usableSize);
-  pPage->nFree = pBt->usableSize - first;
+  pPage->nFree = (u16)(pBt->usableSize - first);
   decodeFlags(pPage, flags);
   pPage->hdrOffset = hdr;
   pPage->cellOffset = first;
   pPage->nOverflow = 0;
-  assert( pBt->pageSize>=512 && pBt->pageSize<=32768 );
-  pPage->maskPage = pBt->pageSize - 1;
+  assert( pBt->pageSize>=512 && pBt->pageSize<=65536 );
+  pPage->maskPage = (u16)(pBt->pageSize - 1);
   pPage->nCell = 0;
   pPage->isInit = 1;
 }
@@ -45483,7 +46348,7 @@ SQLITE_PRIVATE int sqlite3BtreeOpen(
 #ifdef SQLITE_SECURE_DELETE
     pBt->secureDelete = 1;
 #endif
-    pBt->pageSize = get2byte(&zDbHeader[16]);
+    pBt->pageSize = (zDbHeader[16]<<8) | (zDbHeader[17]<<16);
     if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE
          || ((pBt->pageSize-1)&pBt->pageSize)!=0 ){
       pBt->pageSize = 0;
@@ -45685,7 +46550,7 @@ SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){
     if( pBt->xFreeSchema && pBt->pSchema ){
       pBt->xFreeSchema(pBt->pSchema);
     }
-    sqlite3_free(pBt->pSchema);
+    sqlite3DbFree(0, pBt->pSchema);
     freeTempSpace(pBt);
     sqlite3_free(pBt);
   }
@@ -45797,7 +46662,7 @@ SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve,
         ((pageSize-1)&pageSize)==0 ){
     assert( (pageSize & 7)==0 );
     assert( !pBt->pPage1 && !pBt->pCursor );
-    pBt->pageSize = (u16)pageSize;
+    pBt->pageSize = (u32)pageSize;
     freeTempSpace(pBt);
   }
   rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve);
@@ -45932,15 +46797,13 @@ static int lockBtree(BtShared *pBt){
   ** a valid database file. 
   */
   nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData);
-  if( (rc = sqlite3PagerPagecount(pBt->pPager, &nPageFile))!=SQLITE_OK ){;
-    goto page1_init_failed;
-  }
+  sqlite3PagerPagecount(pBt->pPager, &nPageFile);
   if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){
     nPage = nPageFile;
   }
   if( nPage>0 ){
-    int pageSize;
-    int usableSize;
+    u32 pageSize;
+    u32 usableSize;
     u8 *page1 = pPage1->aData;
     rc = SQLITE_NOTADB;
     if( memcmp(page1, zMagicHeader, 16)!=0 ){
@@ -45991,15 +46854,16 @@ static int lockBtree(BtShared *pBt){
     if( memcmp(&page1[21], "\100\040\040",3)!=0 ){
       goto page1_init_failed;
     }
-    pageSize = get2byte(&page1[16]);
-    if( ((pageSize-1)&pageSize)!=0 || pageSize<512 ||
-        (SQLITE_MAX_PAGE_SIZE<32768 && pageSize>SQLITE_MAX_PAGE_SIZE)
+    pageSize = (page1[16]<<8) | (page1[17]<<16);
+    if( ((pageSize-1)&pageSize)!=0
+     || pageSize>SQLITE_MAX_PAGE_SIZE 
+     || pageSize<=256 
     ){
       goto page1_init_failed;
     }
     assert( (pageSize & 7)==0 );
     usableSize = pageSize - page1[20];
-    if( pageSize!=pBt->pageSize ){
+    if( (u32)pageSize!=pBt->pageSize ){
       /* After reading the first page of the database assuming a page size
       ** of BtShared.pageSize, we have discovered that the page-size is
       ** actually pageSize. Unlock the database, leave pBt->pPage1 at
@@ -46007,8 +46871,8 @@ static int lockBtree(BtShared *pBt){
       ** again with the correct page-size.
       */
       releasePage(pPage1);
-      pBt->usableSize = (u16)usableSize;
-      pBt->pageSize = (u16)pageSize;
+      pBt->usableSize = usableSize;
+      pBt->pageSize = pageSize;
       freeTempSpace(pBt);
       rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize,
                                    pageSize-usableSize);
@@ -46021,8 +46885,8 @@ static int lockBtree(BtShared *pBt){
     if( usableSize<480 ){
       goto page1_init_failed;
     }
-    pBt->pageSize = (u16)pageSize;
-    pBt->usableSize = (u16)usableSize;
+    pBt->pageSize = pageSize;
+    pBt->usableSize = usableSize;
 #ifndef SQLITE_OMIT_AUTOVACUUM
     pBt->autoVacuum = (get4byte(&page1[36 + 4*4])?1:0);
     pBt->incrVacuum = (get4byte(&page1[36 + 7*4])?1:0);
@@ -46038,14 +46902,14 @@ static int lockBtree(BtShared *pBt){
   **     9-byte nKey value
   **     4-byte nData value
   **     4-byte overflow page pointer
-  ** So a cell consists of a 2-byte poiner, a header which is as much as
+  ** So a cell consists of a 2-byte pointer, a header which is as much as
   ** 17 bytes long, 0 to N bytes of payload, and an optional 4 byte overflow
   ** page pointer.
   */
-  pBt->maxLocal = (pBt->usableSize-12)*64/255 - 23;
-  pBt->minLocal = (pBt->usableSize-12)*32/255 - 23;
-  pBt->maxLeaf = pBt->usableSize - 35;
-  pBt->minLeaf = (pBt->usableSize-12)*32/255 - 23;
+  pBt->maxLocal = (u16)((pBt->usableSize-12)*64/255 - 23);
+  pBt->minLocal = (u16)((pBt->usableSize-12)*32/255 - 23);
+  pBt->maxLeaf = (u16)(pBt->usableSize - 35);
+  pBt->minLeaf = (u16)((pBt->usableSize-12)*32/255 - 23);
   assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) );
   pBt->pPage1 = pPage1;
   pBt->nPage = nPage;
@@ -46098,7 +46962,8 @@ static int newDatabase(BtShared *pBt){
   if( rc ) return rc;
   memcpy(data, zMagicHeader, sizeof(zMagicHeader));
   assert( sizeof(zMagicHeader)==16 );
-  put2byte(&data[16], pBt->pageSize);
+  data[16] = (u8)((pBt->pageSize>>8)&0xff);
+  data[17] = (u8)((pBt->pageSize>>16)&0xff);
   data[18] = 1;
   data[19] = 1;
   assert( pBt->usableSize<=pBt->pageSize && pBt->usableSize+255>=pBt->pageSize);
@@ -47009,9 +47874,11 @@ SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){
       if( iSavepoint<0 && pBt->initiallyEmpty ) pBt->nPage = 0;
       rc = newDatabase(pBt);
       pBt->nPage = get4byte(28 + pBt->pPage1->aData);
-      if( pBt->nPage==0 ){
-        sqlite3PagerPagecount(pBt->pPager, (int*)&pBt->nPage);
-      }
+
+      /* The database size was written into the offset 28 of the header
+      ** when the transaction started, so we know that the value at offset
+      ** 28 is nonzero. */
+      assert( pBt->nPage>0 );
     }
     sqlite3BtreeLeave(p);
   }
@@ -48107,9 +48974,9 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
         pCur->validNKey = 1;
         pCur->info.nKey = nCellKey;
       }else{
-        /* The maximum supported page-size is 32768 bytes. This means that
+        /* The maximum supported page-size is 65536 bytes. This means that
         ** the maximum number of record bytes stored on an index B-Tree
-        ** page is at most 8198 bytes, which may be stored as a 2-byte
+        ** page is less than 16384 bytes and may be stored as a 2-byte
         ** varint. This information is used to attempt to avoid parsing 
         ** the entire cell by checking for the cases where the record is 
         ** stored entirely within the b-tree page by inspecting the first 
@@ -48472,6 +49339,10 @@ static int allocateBtreePage(
           if( !pPrevTrunk ){
             memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4);
           }else{
+            rc = sqlite3PagerWrite(pPrevTrunk->pDbPage);
+            if( rc!=SQLITE_OK ){
+              goto end_allocate_page;
+            }
             memcpy(&pPrevTrunk->aData[0], &pTrunk->aData[0], 4);
           }
         }else{
@@ -48778,7 +49649,7 @@ static int clearCell(MemPage *pPage, unsigned char *pCell){
   Pgno ovflPgno;
   int rc;
   int nOvfl;
-  u16 ovflPageSize;
+  u32 ovflPageSize;
 
   assert( sqlite3_mutex_held(pPage->pBt->mutex) );
   btreeParseCellPtr(pPage, pCell, &info);
@@ -49003,7 +49874,7 @@ static int fillInCell(
 */
 static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){
   int i;          /* Loop counter */
-  int pc;         /* Offset to cell content of cell being deleted */
+  u32 pc;         /* Offset to cell content of cell being deleted */
   u8 *data;       /* pPage->aData */
   u8 *ptr;        /* Used to move bytes around within data[] */
   int rc;         /* The return code */
@@ -49021,7 +49892,7 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){
   hdr = pPage->hdrOffset;
   testcase( pc==get2byte(&data[hdr+5]) );
   testcase( pc+sz==pPage->pBt->usableSize );
-  if( pc < get2byte(&data[hdr+5]) || pc+sz > pPage->pBt->usableSize ){
+  if( pc < (u32)get2byte(&data[hdr+5]) || pc+sz > pPage->pBt->usableSize ){
     *pRC = SQLITE_CORRUPT_BKPT;
     return;
   }
@@ -49078,7 +49949,7 @@ static void insertCell(
   if( *pRC ) return;
 
   assert( i>=0 && i<=pPage->nCell+pPage->nOverflow );
-  assert( pPage->nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=5460 );
+  assert( pPage->nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=10921 );
   assert( pPage->nOverflow<=ArraySize(pPage->aOvfl) );
   assert( sqlite3_mutex_held(pPage->pBt->mutex) );
   /* The cell should normally be sized correctly.  However, when moving a
@@ -49158,12 +50029,12 @@ static void assemblePage(
 
   assert( pPage->nOverflow==0 );
   assert( sqlite3_mutex_held(pPage->pBt->mutex) );
-  assert( nCell>=0 && nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=5460 );
+  assert( nCell>=0 && nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=10921);
   assert( sqlite3PagerIswriteable(pPage->pDbPage) );
 
   /* Check that the page has just been zeroed by zeroPage() */
   assert( pPage->nCell==0 );
-  assert( get2byte(&data[hdr+5])==nUsable );
+  assert( get2byteNotZero(&data[hdr+5])==nUsable );
 
   pCellptr = &data[pPage->cellOffset + nCell*2];
   cellbody = nUsable;
@@ -49229,6 +50100,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){
   assert( sqlite3PagerIswriteable(pParent->pDbPage) );
   assert( pPage->nOverflow==1 );
 
+  /* This error condition is now caught prior to reaching this function */
   if( pPage->nCell<=0 ) return SQLITE_CORRUPT_BKPT;
 
   /* Allocate a new page. This page will become the right-sibling of 
@@ -49558,7 +50430,7 @@ static int balance_nonroot(
       ** is allocated.  */
       if( pBt->secureDelete ){
         int iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData);
-        if( (iOff+szNew[i])>pBt->usableSize ){
+        if( (iOff+szNew[i])>(int)pBt->usableSize ){
           rc = SQLITE_CORRUPT_BKPT;
           memset(apOld, 0, (i+1)*sizeof(MemPage*));
           goto balance_cleanup;
@@ -49637,7 +50509,7 @@ static int balance_nonroot(
       szCell[nCell] = sz;
       pTemp = &aSpace1[iSpace1];
       iSpace1 += sz;
-      assert( sz<=pBt->pageSize/4 );
+      assert( sz<=pBt->maxLocal+23 );
       assert( iSpace1<=pBt->pageSize );
       memcpy(pTemp, apDiv[i], sz);
       apCell[nCell] = pTemp+leafCorrection;
@@ -49883,7 +50755,7 @@ static int balance_nonroot(
         }
       }
       iOvflSpace += sz;
-      assert( sz<=pBt->pageSize/4 );
+      assert( sz<=pBt->maxLocal+23 );
       assert( iOvflSpace<=pBt->pageSize );
       insertCell(pParent, nxDiv, pCell, sz, pTemp, pNew->pgno, &rc);
       if( rc!=SQLITE_OK ) goto balance_cleanup;
@@ -51127,7 +51999,7 @@ static void checkList(
         checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0, zContext);
       }
 #endif
-      if( n>pCheck->pBt->usableSize/4-2 ){
+      if( n>(int)pCheck->pBt->usableSize/4-2 ){
         checkAppendMsg(pCheck, zContext,
            "freelist leaf count too big on page %d", iPage);
         N--;
@@ -51338,7 +52210,7 @@ static int checkTreePage(
   if( hit==0 ){
     pCheck->mallocFailed = 1;
   }else{
-    u16 contentOffset = get2byte(&data[hdr+5]);
+    int contentOffset = get2byteNotZero(&data[hdr+5]);
     assert( contentOffset<=usableSize );  /* Enforced by btreeInitPage() */
     memset(hit+contentOffset, 0, usableSize-contentOffset);
     memset(hit, 1, contentOffset);
@@ -51346,12 +52218,12 @@ static int checkTreePage(
     cellStart = hdr + 12 - 4*pPage->leaf;
     for(i=0; i<nCell; i++){
       int pc = get2byte(&data[cellStart+i*2]);
-      u16 size = 1024;
+      u32 size = 65536;
       int j;
       if( pc<=usableSize-4 ){
         size = cellSizePtr(pPage, &data[pc]);
       }
-      if( (pc+size-1)>=usableSize ){
+      if( (int)(pc+size-1)>=usableSize ){
         checkAppendMsg(pCheck, 0, 
             "Corruption detected in cell %d on page %d",i,iPage);
       }else{
@@ -51444,6 +52316,7 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
     sCheck.anRef[i] = 1;
   }
   sqlite3StrAccumInit(&sCheck.errMsg, zErr, sizeof(zErr), 20000);
+  sCheck.errMsg.useMalloc = 2;
 
   /* Check the integrity of the freelist
   */
@@ -51542,6 +52415,29 @@ SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree *p){
   return (p && (p->inTrans==TRANS_WRITE));
 }
 
+#ifndef SQLITE_OMIT_WAL
+/*
+** Run a checkpoint on the Btree passed as the first argument.
+**
+** Return SQLITE_LOCKED if this or any other connection has an open 
+** transaction on the shared-cache the argument Btree is connected to.
+*/
+SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree *p){
+  int rc = SQLITE_OK;
+  if( p ){
+    BtShared *pBt = p->pBt;
+    sqlite3BtreeEnter(p);
+    if( pBt->inTransaction!=TRANS_NONE ){
+      rc = SQLITE_LOCKED;
+    }else{
+      rc = sqlite3PagerCheckpoint(pBt->pPager);
+    }
+    sqlite3BtreeLeave(p);
+  }
+  return rc;
+}
+#endif
+
 /*
 ** Return non-zero if a read (or write) transaction is active.
 */
@@ -51581,7 +52477,7 @@ SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void
   BtShared *pBt = p->pBt;
   sqlite3BtreeEnter(p);
   if( !pBt->pSchema && nBytes ){
-    pBt->pSchema = sqlite3MallocZero(nBytes);
+    pBt->pSchema = sqlite3DbMallocZero(0, nBytes);
     pBt->xFreeSchema = xFree;
   }
   sqlite3BtreeLeave(p);
@@ -51951,6 +52847,15 @@ static int backupOnePage(sqlite3_backup *p, Pgno iSrcPg, const u8 *zSrcData){
     rc = SQLITE_READONLY;
   }
 
+#ifdef SQLITE_HAS_CODEC
+  /* Backup is not possible if the page size of the destination is changing
+  ** a a codec is in use.
+  */
+  if( nSrcPgsz!=nDestPgsz && sqlite3PagerGetCodec(pDestPager)!=0 ){
+    rc = SQLITE_READONLY;
+  }
+#endif
+
   /* This loop runs once for each destination page spanned by the source 
   ** page. For each iteration, variable iOff is set to the byte offset
   ** of the destination page.
@@ -53389,7 +54294,7 @@ SQLITE_PRIVATE int sqlite3ValueFromExpr(
   }
   op = pExpr->op;
 
-  /* op can only be TK_REGISTER is we have compiled with SQLITE_ENABLE_STAT2.
+  /* op can only be TK_REGISTER if we have compiled with SQLITE_ENABLE_STAT2.
   ** The ifdef here is to enable us to achieve 100% branch test coverage even
   ** when SQLITE_ENABLE_STAT2 is omitted.
   */
@@ -54067,15 +54972,17 @@ static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){
   }
 }
 
+static void vdbeFreeOpArray(sqlite3 *, Op *, int);
+
 /*
 ** Delete a P4 value if necessary.
 */
 static void freeP4(sqlite3 *db, int p4type, void *p4){
   if( p4 ){
+    assert( db );
     switch( p4type ){
       case P4_REAL:
       case P4_INT64:
-      case P4_MPRINTF:
       case P4_DYNAMIC:
       case P4_KEYINFO:
       case P4_INTARRAY:
@@ -54083,10 +54990,14 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){
         sqlite3DbFree(db, p4);
         break;
       }
+      case P4_MPRINTF: {
+        if( db->pnBytesFreed==0 ) sqlite3_free(p4);
+        break;
+      }
       case P4_VDBEFUNC: {
         VdbeFunc *pVdbeFunc = (VdbeFunc *)p4;
         freeEphemeralFunction(db, pVdbeFunc->pFunc);
-        sqlite3VdbeDeleteAuxData(pVdbeFunc, 0);
+        if( db->pnBytesFreed==0 ) sqlite3VdbeDeleteAuxData(pVdbeFunc, 0);
         sqlite3DbFree(db, pVdbeFunc);
         break;
       }
@@ -54095,15 +55006,17 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){
         break;
       }
       case P4_MEM: {
-        sqlite3ValueFree((sqlite3_value*)p4);
+        if( db->pnBytesFreed==0 ){
+          sqlite3ValueFree((sqlite3_value*)p4);
+        }else{
+          Mem *p = (Mem*)p4;
+          sqlite3DbFree(db, p->zMalloc);
+          sqlite3DbFree(db, p);
+        }
         break;
       }
       case P4_VTAB : {
-        sqlite3VtabUnlock((VTable *)p4);
-        break;
-      }
-      case P4_SUBPROGRAM : {
-        sqlite3VdbeProgramDelete(db, (SubProgram *)p4, 1);
+        if( db->pnBytesFreed==0 ) sqlite3VtabUnlock((VTable *)p4);
         break;
       }
     }
@@ -54129,35 +55042,15 @@ static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){
 }
 
 /*
-** Decrement the ref-count on the SubProgram structure passed as the
-** second argument. If the ref-count reaches zero, free the structure.
-**
-** The array of VDBE opcodes stored as SubProgram.aOp is freed if
-** either the ref-count reaches zero or parameter freeop is non-zero.
-**
-** Since the array of opcodes pointed to by SubProgram.aOp may directly
-** or indirectly contain a reference to the SubProgram structure itself.
-** By passing a non-zero freeop parameter, the caller may ensure that all
-** SubProgram structures and their aOp arrays are freed, even when there
-** are such circular references.
+** Link the SubProgram object passed as the second argument into the linked
+** list at Vdbe.pSubProgram. This list is used to delete all sub-program
+** objects when the VM is no longer required.
 */
-SQLITE_PRIVATE void sqlite3VdbeProgramDelete(sqlite3 *db, SubProgram *p, int freeop){
-  if( p ){
-    assert( p->nRef>0 );
-    if( freeop || p->nRef==1 ){
-      Op *aOp = p->aOp;
-      p->aOp = 0;
-      vdbeFreeOpArray(db, aOp, p->nOp);
-      p->nOp = 0;
-    }
-    p->nRef--;
-    if( p->nRef==0 ){
-      sqlite3DbFree(db, p);
-    }
-  }
+SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *pVdbe, SubProgram *p){
+  p->pNext = pVdbe->pProgram;
+  pVdbe->pProgram = p;
 }
 
-
 /*
 ** Change N opcodes starting at addr to No-ops.
 */
@@ -54233,7 +55126,7 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int
 
     nField = ((KeyInfo*)zP4)->nField;
     nByte = sizeof(*pKeyInfo) + (nField-1)*sizeof(pKeyInfo->aColl[0]) + nField;
-    pKeyInfo = sqlite3Malloc( nByte );
+    pKeyInfo = sqlite3DbMallocRaw(0, nByte);
     pOp->p4.pKeyInfo = pKeyInfo;
     if( pKeyInfo ){
       u8 *aSortOrder;
@@ -54497,6 +55390,12 @@ static void releaseMemArray(Mem *p, int N){
     Mem *pEnd;
     sqlite3 *db = p->db;
     u8 malloc_failed = db->mallocFailed;
+    if( db->pnBytesFreed ){
+      for(pEnd=&p[N]; p<pEnd; p++){
+        sqlite3DbFree(db, p->zMalloc);
+      }
+      return;
+    }
     for(pEnd=&p[N]; p<pEnd; p++){
       assert( (&p[1])==pEnd || p[0].db==p[1].db );
 
@@ -55146,9 +56045,6 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){
   ** to the transaction.
   */
   rc = sqlite3VtabSync(db, &p->zErrMsg);
-  if( rc!=SQLITE_OK ){
-    return rc;
-  }
 
   /* This loop determines (a) if the commit hook should be invoked and
   ** (b) how many database files have open write transactions, not 
@@ -55156,13 +56052,17 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){
   ** one database file has an open write transaction, a master journal
   ** file is required for an atomic commit.
   */ 
-  for(i=0; i<db->nDb; i++){ 
+  for(i=0; rc==SQLITE_OK && i<db->nDb; i++){ 
     Btree *pBt = db->aDb[i].pBt;
     if( sqlite3BtreeIsInTrans(pBt) ){
       needXcommit = 1;
       if( i!=1 ) nTrans++;
+      rc = sqlite3PagerExclusiveLock(sqlite3BtreePager(pBt));
     }
   }
+  if( rc!=SQLITE_OK ){
+    return rc;
+  }
 
   /* If there are any write-transactions at all, invoke the commit hook */
   if( needXcommit && db->xCommitCallback ){
@@ -55301,6 +56201,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){
       }
     }
     sqlite3OsCloseFree(pMaster);
+    assert( rc!=SQLITE_BUSY );
     if( rc!=SQLITE_OK ){
       sqlite3DbFree(db, zMaster);
       return rc;
@@ -55559,8 +56460,17 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
     isSpecialError = mrc==SQLITE_NOMEM || mrc==SQLITE_IOERR
                      || mrc==SQLITE_INTERRUPT || mrc==SQLITE_FULL;
     if( isSpecialError ){
-      /* If the query was read-only, we need do no rollback at all. Otherwise,
-      ** proceed with the special handling.
+      /* If the query was read-only and the error code is SQLITE_INTERRUPT, 
+      ** no rollback is necessary. Otherwise, at least a savepoint 
+      ** transaction must be rolled back to restore the database to a 
+      ** consistent state.
+      **
+      ** Even if the statement is read-only, it is important to perform
+      ** a statement or transaction rollback operation. If the error 
+      ** occured while writing to the journal, sub-journal or database
+      ** file as part of an effort to free up cache space (see function
+      ** pagerStress() in pager.c), the rollback is required to restore 
+      ** the pager to a consistent state.
       */
       if( !p->readOnly || mrc!=SQLITE_INTERRUPT ){
         if( (mrc==SQLITE_NOMEM || mrc==SQLITE_FULL) && p->usesStmtJournal ){
@@ -55830,6 +56740,30 @@ SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(VdbeFunc *pVdbeFunc, int mask){
 }
 
 /*
+** Free all memory associated with the Vdbe passed as the second argument.
+** The difference between this function and sqlite3VdbeDelete() is that
+** VdbeDelete() also unlinks the Vdbe from the list of VMs associated with
+** the database connection.
+*/
+SQLITE_PRIVATE void sqlite3VdbeDeleteObject(sqlite3 *db, Vdbe *p){
+  SubProgram *pSub, *pNext;
+  assert( p->db==0 || p->db==db );
+  releaseMemArray(p->aVar, p->nVar);
+  releaseMemArray(p->aColName, p->nResColumn*COLNAME_N);
+  for(pSub=p->pProgram; pSub; pSub=pNext){
+    pNext = pSub->pNext;
+    vdbeFreeOpArray(db, pSub->aOp, pSub->nOp);
+    sqlite3DbFree(db, pSub);
+  }
+  vdbeFreeOpArray(db, p->aOp, p->nOp);
+  sqlite3DbFree(db, p->aLabel);
+  sqlite3DbFree(db, p->aColName);
+  sqlite3DbFree(db, p->zSql);
+  sqlite3DbFree(db, p->pFree);
+  sqlite3DbFree(db, p);
+}
+
+/*
 ** Delete an entire VDBE.
 */
 SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){
@@ -55846,16 +56780,9 @@ SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){
   if( p->pNext ){
     p->pNext->pPrev = p->pPrev;
   }
-  releaseMemArray(p->aVar, p->nVar);
-  releaseMemArray(p->aColName, p->nResColumn*COLNAME_N);
-  vdbeFreeOpArray(db, p->aOp, p->nOp);
-  sqlite3DbFree(db, p->aLabel);
-  sqlite3DbFree(db, p->aColName);
-  sqlite3DbFree(db, p->zSql);
   p->magic = VDBE_MAGIC_DEAD;
-  sqlite3DbFree(db, p->pFree);
   p->db = 0;
-  sqlite3DbFree(db, p);
+  sqlite3VdbeDeleteObject(db, p);
 }
 
 /*
@@ -55881,11 +56808,8 @@ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor *p){
     rc = sqlite3BtreeMovetoUnpacked(p->pCursor, 0, p->movetoTarget, 0, &res);
     if( rc ) return rc;
     p->lastRowid = p->movetoTarget;
-    p->rowidIsValid = ALWAYS(res==0) ?1:0;
-    if( NEVER(res<0) ){
-      rc = sqlite3BtreeNext(p->pCursor, &res);
-      if( rc ) return rc;
-    }
+    if( res!=0 ) return SQLITE_CORRUPT_BKPT;
+    p->rowidIsValid = 1;
 #ifdef SQLITE_TEST
     sqlite3_search_count++;
 #endif
@@ -57029,7 +57953,7 @@ static int sqlite3Step(Vdbe *p){
   if( rc!=SQLITE_ROW && db->xProfile && !db->init.busy && p->zSql ){
     sqlite3_int64 iNow;
     sqlite3OsCurrentTimeInt64(db->pVfs, &iNow);
-    db->xProfile(db->pProfileArg, p->zSql, iNow - p->startTime);
+    db->xProfile(db->pProfileArg, p->zSql, (iNow - p->startTime)*1000000);
   }
 #endif
 
@@ -58646,6 +59570,20 @@ static int checkSavepointCount(sqlite3 *db){
 #endif
 
 /*
+** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored
+** in memory obtained from sqlite3_malloc) into a Vdbe.zErrMsg (text stored
+** in memory obtained from sqlite3DbMalloc).
+*/
+static void importVtabErrMsg(Vdbe *p, sqlite3_vtab *pVtab){
+  sqlite3 *db = p->db;
+  sqlite3DbFree(db, p->zErrMsg);
+  p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg);
+  sqlite3_free(pVtab->zErrMsg);
+  pVtab->zErrMsg = 0;
+}
+
+
+/*
 ** Execute as much of a VDBE program as we can then return.
 **
 ** sqlite3VdbeMakeReady() must be called before this routine in order to
@@ -62643,9 +63581,7 @@ case OP_Rowid: {                 /* out2-prerelease */
     u.bi.pModule = u.bi.pVtab->pModule;
     assert( u.bi.pModule->xRowid );
     rc = u.bi.pModule->xRowid(u.bi.pC->pVtabCursor, &u.bi.v);
-    sqlite3DbFree(db, p->zErrMsg);
-    p->zErrMsg = u.bi.pVtab->zErrMsg;
-    u.bi.pVtab->zErrMsg = 0;
+    importVtabErrMsg(p, u.bi.pVtab);
 #endif /* SQLITE_OMIT_VIRTUALTABLE */
   }else{
     assert( u.bi.pC->pCursor!=0 );
@@ -62964,7 +63900,7 @@ case OP_IdxRowid: {              /* out2-prerelease */
 ** that if the key from register P3 is a prefix of the key in the cursor,
 ** the result is false whereas it would be true with IdxGT.
 */
-/* Opcode: IdxLT P1 P2 P3 * P5
+/* Opcode: IdxLT P1 P2 P3 P4 P5
 **
 ** The P4 register values beginning with P3 form an unpacked index 
 ** key that omits the ROWID.  Compare this key value against the index 
@@ -64034,11 +64970,7 @@ case OP_VBegin: {
 #endif /* local variables moved into u.cf */
   u.cf.pVTab = pOp->p4.pVtab;
   rc = sqlite3VtabBegin(db, u.cf.pVTab);
-  if( u.cf.pVTab ){
-    sqlite3DbFree(db, p->zErrMsg);
-    p->zErrMsg = u.cf.pVTab->pVtab->zErrMsg;
-    u.cf.pVTab->pVtab->zErrMsg = 0;
-  }
+  if( u.cf.pVTab ) importVtabErrMsg(p, u.cf.pVTab->pVtab);
   break;
 }
 #endif /* SQLITE_OMIT_VIRTUALTABLE */
@@ -64090,9 +65022,7 @@ case OP_VOpen: {
   u.cg.pModule = (sqlite3_module *)u.cg.pVtab->pModule;
   assert(u.cg.pVtab && u.cg.pModule);
   rc = u.cg.pModule->xOpen(u.cg.pVtab, &u.cg.pVtabCursor);
-  sqlite3DbFree(db, p->zErrMsg);
-  p->zErrMsg = u.cg.pVtab->zErrMsg;
-  u.cg.pVtab->zErrMsg = 0;
+  importVtabErrMsg(p, u.cg.pVtab);
   if( SQLITE_OK==rc ){
     /* Initialize sqlite3_vtab_cursor base class */
     u.cg.pVtabCursor->pVtab = u.cg.pVtab;
@@ -64171,9 +65101,7 @@ case OP_VFilter: {   /* jump */
     p->inVtabMethod = 1;
     rc = u.ch.pModule->xFilter(u.ch.pVtabCursor, u.ch.iQuery, pOp->p4.z, u.ch.nArg, u.ch.apArg);
     p->inVtabMethod = 0;
-    sqlite3DbFree(db, p->zErrMsg);
-    p->zErrMsg = u.ch.pVtab->zErrMsg;
-    u.ch.pVtab->zErrMsg = 0;
+    importVtabErrMsg(p, u.ch.pVtab);
     if( rc==SQLITE_OK ){
       u.ch.res = u.ch.pModule->xEof(u.ch.pVtabCursor);
     }
@@ -64225,9 +65153,7 @@ case OP_VColumn: {
   MemSetTypeFlag(&u.ci.sContext.s, MEM_Null);
 
   rc = u.ci.pModule->xColumn(pCur->pVtabCursor, &u.ci.sContext, pOp->p2);
-  sqlite3DbFree(db, p->zErrMsg);
-  p->zErrMsg = u.ci.pVtab->zErrMsg;
-  u.ci.pVtab->zErrMsg = 0;
+  importVtabErrMsg(p, u.ci.pVtab);
   if( u.ci.sContext.isError ){
     rc = u.ci.sContext.isError;
   }
@@ -64282,9 +65208,7 @@ case OP_VNext: {   /* jump */
   p->inVtabMethod = 1;
   rc = u.cj.pModule->xNext(u.cj.pCur->pVtabCursor);
   p->inVtabMethod = 0;
-  sqlite3DbFree(db, p->zErrMsg);
-  p->zErrMsg = u.cj.pVtab->zErrMsg;
-  u.cj.pVtab->zErrMsg = 0;
+  importVtabErrMsg(p, u.cj.pVtab);
   if( rc==SQLITE_OK ){
     u.cj.res = u.cj.pModule->xEof(u.cj.pCur->pVtabCursor);
   }
@@ -64316,9 +65240,7 @@ case OP_VRename: {
   REGISTER_TRACE(pOp->p1, u.ck.pName);
   assert( u.ck.pName->flags & MEM_Str );
   rc = u.ck.pVtab->pModule->xRename(u.ck.pVtab, u.ck.pName->z);
-  sqlite3DbFree(db, p->zErrMsg);
-  p->zErrMsg = u.ck.pVtab->zErrMsg;
-  u.ck.pVtab->zErrMsg = 0;
+  importVtabErrMsg(p, u.ck.pVtab);
 
   break;
 }
@@ -64372,9 +65294,7 @@ case OP_VUpdate: {
       u.cl.pX++;
     }
     rc = u.cl.pModule->xUpdate(u.cl.pVtab, u.cl.nArg, u.cl.apArg, &u.cl.rowid);
-    sqlite3DbFree(db, p->zErrMsg);
-    p->zErrMsg = u.cl.pVtab->zErrMsg;
-    u.cl.pVtab->zErrMsg = 0;
+    importVtabErrMsg(p, u.cl.pVtab);
     if( rc==SQLITE_OK && pOp->p1 ){
       assert( u.cl.nArg>1 && u.cl.apArg[0] && (u.cl.apArg[0]->flags&MEM_Null) );
       db->lastRowid = u.cl.rowid;
@@ -66829,24 +67749,31 @@ SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){
 }
 
 /*
+** Set the explicit collating sequence for an expression to the
+** collating sequence supplied in the second argument.
+*/
+SQLITE_PRIVATE Expr *sqlite3ExprSetColl(Expr *pExpr, CollSeq *pColl){
+  if( pExpr && pColl ){
+    pExpr->pColl = pColl;
+    pExpr->flags |= EP_ExpCollate;
+  }
+  return pExpr;
+}
+
+/*
 ** Set the collating sequence for expression pExpr to be the collating
 ** sequence named by pToken.   Return a pointer to the revised expression.
 ** The collating sequence is marked as "explicit" using the EP_ExpCollate
 ** flag.  An explicit collating sequence will override implicit
 ** collating sequences.
 */
-SQLITE_PRIVATE Expr *sqlite3ExprSetColl(Parse *pParse, Expr *pExpr, Token *pCollName){
+SQLITE_PRIVATE Expr *sqlite3ExprSetCollByToken(Parse *pParse, Expr *pExpr, Token *pCollName){
   char *zColl = 0;            /* Dequoted name of collation sequence */
   CollSeq *pColl;
   sqlite3 *db = pParse->db;
   zColl = sqlite3NameFromToken(db, pCollName);
-  if( pExpr && zColl ){
-    pColl = sqlite3LocateCollSeq(pParse, zColl);
-    if( pColl ){
-      pExpr->pColl = pColl;
-      pExpr->flags |= EP_ExpCollate;
-    }
-  }
+  pColl = sqlite3LocateCollSeq(pParse, zColl);
+  sqlite3ExprSetColl(pExpr, pColl);
   sqlite3DbFree(db, zColl);
   return pExpr;
 }
@@ -67320,18 +68247,19 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){
   }else if( z[0]=='?' ){
     /* Wildcard of the form "?nnn".  Convert "nnn" to an integer and
     ** use it as the variable number */
-    int i = atoi((char*)&z[1]);
+    i64 i;
+    int bOk = sqlite3Atoi64(&z[1], &i);
     pExpr->iColumn = (ynVar)i;
     testcase( i==0 );
     testcase( i==1 );
     testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]-1 );
     testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] );
-    if( i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){
+    if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){
       sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d",
           db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]);
     }
     if( i>pParse->nVar ){
-      pParse->nVar = i;
+      pParse->nVar = (int)i;
     }
   }else{
     /* Wildcards like ":aaa", "$aaa" or "@aaa".  Reuse the same variable
@@ -71324,7 +72252,6 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
   if( !pNew ) goto exit_begin_add_column;
   pParse->pNewTable = pNew;
   pNew->nRef = 1;
-  pNew->dbMem = pTab->dbMem;
   pNew->nCol = pTab->nCol;
   assert( pNew->nCol>0 );
   nAlloc = (((pNew->nCol-1)/8)*8)+8;
@@ -71853,21 +72780,20 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){
 ** If the Index.aSample variable is not NULL, delete the aSample[] array
 ** and its contents.
 */
-SQLITE_PRIVATE void sqlite3DeleteIndexSamples(Index *pIdx){
+SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){
 #ifdef SQLITE_ENABLE_STAT2
   if( pIdx->aSample ){
     int j;
-    sqlite3 *dbMem = pIdx->pTable->dbMem;
     for(j=0; j<SQLITE_INDEX_SAMPLES; j++){
       IndexSample *p = &pIdx->aSample[j];
       if( p->eType==SQLITE_TEXT || p->eType==SQLITE_BLOB ){
-        sqlite3DbFree(pIdx->pTable->dbMem, p->u.z);
+        sqlite3DbFree(db, p->u.z);
       }
     }
-    sqlite3DbFree(dbMem, pIdx->aSample);
-    pIdx->aSample = 0;
+    sqlite3DbFree(db, pIdx->aSample);
   }
 #else
+  UNUSED_PARAMETER(db);
   UNUSED_PARAMETER(pIdx);
 #endif
 }
@@ -71906,7 +72832,8 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
   for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){
     Index *pIdx = sqliteHashData(i);
     sqlite3DefaultRowEst(pIdx);
-    sqlite3DeleteIndexSamples(pIdx);
+    sqlite3DeleteIndexSamples(db, pIdx);
+    pIdx->aSample = 0;
   }
 
   /* Check to make sure the sqlite_stat1 table exists */
@@ -71950,18 +72877,17 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
         Index *pIdx = sqlite3FindIndex(db, zIndex, sInfo.zDatabase);
         if( pIdx ){
           int iSample = sqlite3_column_int(pStmt, 1);
-          sqlite3 *dbMem = pIdx->pTable->dbMem;
-          assert( dbMem==db || dbMem==0 );
           if( iSample<SQLITE_INDEX_SAMPLES && iSample>=0 ){
             int eType = sqlite3_column_type(pStmt, 2);
 
             if( pIdx->aSample==0 ){
               static const int sz = sizeof(IndexSample)*SQLITE_INDEX_SAMPLES;
-              pIdx->aSample = (IndexSample *)sqlite3DbMallocZero(dbMem, sz);
+              pIdx->aSample = (IndexSample *)sqlite3DbMallocRaw(0, sz);
               if( pIdx->aSample==0 ){
                 db->mallocFailed = 1;
                 break;
               }
+	      memset(pIdx->aSample, 0, sz);
             }
 
             assert( pIdx->aSample );
@@ -71984,10 +72910,8 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
                 if( n < 1){
                   pSample->u.z = 0;
                 }else{
-                  pSample->u.z = sqlite3DbMallocRaw(dbMem, n);
-                  if( pSample->u.z ){
-                    memcpy(pSample->u.z, z, n);
-                  }else{
+                  pSample->u.z = sqlite3DbStrNDup(0, z, n);
+                  if( pSample->u.z==0 ){
                     db->mallocFailed = 1;
                     break;
                   }
@@ -73150,34 +74074,15 @@ SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const cha
 /*
 ** Reclaim the memory used by an index
 */
-static void freeIndex(Index *p){
-  sqlite3 *db = p->pTable->dbMem;
+static void freeIndex(sqlite3 *db, Index *p){
 #ifndef SQLITE_OMIT_ANALYZE
-  sqlite3DeleteIndexSamples(p);
+  sqlite3DeleteIndexSamples(db, p);
 #endif
   sqlite3DbFree(db, p->zColAff);
   sqlite3DbFree(db, p);
 }
 
 /*
-** Remove the given index from the index hash table, and free
-** its memory structures.
-**
-** The index is removed from the database hash tables but
-** it is not unlinked from the Table that it indexes.
-** Unlinking from the Table must be done by the calling function.
-*/
-static void sqlite3DeleteIndex(Index *p){
-  Index *pOld;
-  const char *zName = p->zName;
-
-  pOld = sqlite3HashInsert(&p->pSchema->idxHash, zName,
-                           sqlite3Strlen30(zName), 0);
-  assert( pOld==0 || pOld==p );
-  freeIndex(p);
-}
-
-/*
 ** For the index called zIdxName which is found in the database iDb,
 ** unlike that index from its Table then remove the index from
 ** the index hash table and free all memory structures associated
@@ -73203,7 +74108,7 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char
         p->pNext = pIndex->pNext;
       }
     }
-    freeIndex(pIndex);
+    freeIndex(db, pIndex);
   }
   db->flags |= SQLITE_InternChanges;
 }
@@ -73274,13 +74179,12 @@ SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3 *db){
 }
 
 /*
-** Clear the column names from a table or view.
+** Delete memory allocated for the column names of a table or view (the
+** Table.aCol[] array).
 */
-static void sqliteResetColumnNames(Table *pTable){
+static void sqliteDeleteColumnNames(sqlite3 *db, Table *pTable){
   int i;
   Column *pCol;
-  sqlite3 *db = pTable->dbMem;
-  testcase( db==0 );
   assert( pTable!=0 );
   if( (pCol = pTable->aCol)!=0 ){
     for(i=0; i<pTable->nCol; i++, pCol++){
@@ -73292,8 +74196,6 @@ static void sqliteResetColumnNames(Table *pTable){
     }
     sqlite3DbFree(db, pTable->aCol);
   }
-  pTable->aCol = 0;
-  pTable->nCol = 0;
 }
 
 /*
@@ -73305,42 +74207,44 @@ static void sqliteResetColumnNames(Table *pTable){
 ** memory structures of the indices and foreign keys associated with 
 ** the table.
 */
-SQLITE_PRIVATE void sqlite3DeleteTable(Table *pTable){
+SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
   Index *pIndex, *pNext;
-  sqlite3 *db;
 
-  if( pTable==0 ) return;
-  db = pTable->dbMem;
-  testcase( db==0 );
+  assert( !pTable || pTable->nRef>0 );
 
   /* Do not delete the table until the reference count reaches zero. */
-  pTable->nRef--;
-  if( pTable->nRef>0 ){
-    return;
-  }
-  assert( pTable->nRef==0 );
+  if( !pTable ) return;
+  if( ((!db || db->pnBytesFreed==0) && (--pTable->nRef)>0) ) return;
 
-  /* Delete all indices associated with this table
-  */
+  /* Delete all indices associated with this table. */
   for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){
     pNext = pIndex->pNext;
     assert( pIndex->pSchema==pTable->pSchema );
-    sqlite3DeleteIndex(pIndex);
+    if( !db || db->pnBytesFreed==0 ){
+      char *zName = pIndex->zName; 
+      TESTONLY ( Index *pOld = ) sqlite3HashInsert(
+	  &pIndex->pSchema->idxHash, zName, sqlite3Strlen30(zName), 0
+      );
+      assert( pOld==pIndex || pOld==0 );
+    }
+    freeIndex(db, pIndex);
   }
 
   /* Delete any foreign keys attached to this table. */
-  sqlite3FkDelete(pTable);
+  sqlite3FkDelete(db, pTable);
 
   /* Delete the Table structure itself.
   */
-  sqliteResetColumnNames(pTable);
+  sqliteDeleteColumnNames(db, pTable);
   sqlite3DbFree(db, pTable->zName);
   sqlite3DbFree(db, pTable->zColAff);
   sqlite3SelectDelete(db, pTable->pSelect);
 #ifndef SQLITE_OMIT_CHECK
   sqlite3ExprDelete(db, pTable->pCheck);
 #endif
-  sqlite3VtabClear(pTable);
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+  sqlite3VtabClear(db, pTable);
+#endif
   sqlite3DbFree(db, pTable);
 }
 
@@ -73359,7 +74263,7 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char
   pDb = &db->aDb[iDb];
   p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName,
                         sqlite3Strlen30(zTabName),0);
-  sqlite3DeleteTable(p);
+  sqlite3DeleteTable(db, p);
   db->flags |= SQLITE_InternChanges;
 }
 
@@ -73627,7 +74531,6 @@ SQLITE_PRIVATE void sqlite3StartTable(
   pTable->iPKey = -1;
   pTable->pSchema = db->aDb[iDb].pSchema;
   pTable->nRef = 1;
-  pTable->dbMem = 0;
   assert( pParse->pNewTable==0 );
   pParse->pNewTable = pTable;
 
@@ -74179,7 +75082,7 @@ static char *createTableStmt(sqlite3 *db, Table *p){
     zEnd = "\n)";
   }
   n += 35 + 6*p->nCol;
-  zStmt = sqlite3Malloc( n );
+  zStmt = sqlite3DbMallocRaw(0, n);
   if( zStmt==0 ){
     db->mallocFailed = 1;
     return 0;
@@ -74360,7 +75263,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
         p->aCol = pSelTab->aCol;
         pSelTab->nCol = 0;
         pSelTab->aCol = 0;
-        sqlite3DeleteTable(pSelTab);
+        sqlite3DeleteTable(db, pSelTab);
       }
     }
 
@@ -74604,7 +75507,7 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
       pTable->aCol = pSelTab->aCol;
       pSelTab->nCol = 0;
       pSelTab->aCol = 0;
-      sqlite3DeleteTable(pSelTab);
+      sqlite3DeleteTable(db, pSelTab);
       pTable->pSchema->flags |= DB_UnresetViews;
     }else{
       pTable->nCol = 0;
@@ -74629,7 +75532,9 @@ static void sqliteViewResetAll(sqlite3 *db, int idx){
   for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){
     Table *pTab = sqliteHashData(i);
     if( pTab->pSelect ){
-      sqliteResetColumnNames(pTab);
+      sqliteDeleteColumnNames(db, pTab);
+      pTab->aCol = 0;
+      pTab->nCol = 0;
     }
   }
   DbClearProperty(db, idx, DB_UnresetViews);
@@ -75626,7 +76531,7 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex(
   /* Clean up before exiting */
 exit_create_index:
   if( pIndex ){
-    sqlite3_free(pIndex->zColAff);
+    sqlite3DbFree(db, pIndex->zColAff);
     sqlite3DbFree(db, pIndex);
   }
   sqlite3ExprListDelete(db, pList);
@@ -76005,7 +76910,7 @@ SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){
     sqlite3DbFree(db, pItem->zName);
     sqlite3DbFree(db, pItem->zAlias);
     sqlite3DbFree(db, pItem->zIndex);
-    sqlite3DeleteTable(pItem->pTab);
+    sqlite3DeleteTable(db, pItem->pTab);
     sqlite3SelectDelete(db, pItem->pSelect);
     sqlite3ExprDelete(db, pItem->pOn);
     sqlite3IdListDelete(db, pItem->pUsing);
@@ -76936,8 +77841,7 @@ SQLITE_PRIVATE void sqlite3SchemaFree(void *p){
   sqlite3HashInit(&pSchema->tblHash);
   for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){
     Table *pTab = sqliteHashData(pElem);
-    assert( pTab->dbMem==0 );
-    sqlite3DeleteTable(pTab);
+    sqlite3DeleteTable(0, pTab);
   }
   sqlite3HashClear(&temp1);
   sqlite3HashClear(&pSchema->fkeyHash);
@@ -76954,7 +77858,7 @@ SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){
   if( pBt ){
     p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaFree);
   }else{
-    p = (Schema *)sqlite3MallocZero(sizeof(Schema));
+    p = (Schema *)sqlite3DbMallocZero(0, sizeof(Schema));
   }
   if( !p ){
     db->mallocFailed = 1;
@@ -76995,7 +77899,7 @@ SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){
   Table *pTab;
   assert( pItem && pSrc->nSrc==1 );
   pTab = sqlite3LocateTable(pParse, 0, pItem->zName, pItem->zDatabase);
-  sqlite3DeleteTable(pItem->pTab);
+  sqlite3DeleteTable(pParse->db, pItem->pTab);
   pItem->pTab = pTab;
   if( pTab ){
     pTab->nRef++;
@@ -78392,8 +79296,10 @@ static void compileoptionusedFunc(
   const char *zOptName;
   assert( argc==1 );
   UNUSED_PARAMETER(argc);
-  /* IMP: R-xxxx This function is an SQL wrapper around the
-  ** sqlite3_compileoption_used() C interface. */
+  /* IMP: R-39564-36305 The sqlite_compileoption_used() SQL
+  ** function is a wrapper around the sqlite3_compileoption_used() C/C++
+  ** function.
+  */
   if( (zOptName = (const char*)sqlite3_value_text(argv[0]))!=0 ){
     sqlite3_result_int(context, sqlite3_compileoption_used(zOptName));
   }
@@ -78414,8 +79320,9 @@ static void compileoptiongetFunc(
   int n;
   assert( argc==1 );
   UNUSED_PARAMETER(argc);
-  /* IMP: R-xxxx This function is an SQL wrapper around the
-  ** sqlite3_compileoption_get() C interface. */
+  /* IMP: R-04922-24076 The sqlite_compileoption_get() SQL function
+  ** is a wrapper around the sqlite3_compileoption_get() C/C++ function.
+  */
   n = sqlite3_value_int(argv[0]);
   sqlite3_result_text(context, sqlite3_compileoption_get(n), -1, SQLITE_STATIC);
 }
@@ -78614,14 +79521,14 @@ static void replaceFunc(
       testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
       if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
         sqlite3_result_error_toobig(context);
-        sqlite3DbFree(db, zOut);
+        sqlite3_free(zOut);
         return;
       }
       zOld = zOut;
       zOut = sqlite3_realloc(zOut, (int)nOut);
       if( zOut==0 ){
         sqlite3_result_error_nomem(context);
-        sqlite3DbFree(db, zOld);
+        sqlite3_free(zOld);
         return;
       }
       memcpy(&zOut[j], zRep, nRep);
@@ -78982,7 +79889,7 @@ static void groupConcatStep(
   if( pAccum ){
     sqlite3 *db = sqlite3_context_db_handle(context);
     int firstTerm = pAccum->useMalloc==0;
-    pAccum->useMalloc = 1;
+    pAccum->useMalloc = 2;
     pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
     if( !firstTerm ){
       if( argc==2 ){
@@ -79699,7 +80606,8 @@ static void fkScanChildren(
       if( pIdx ){
         Column *pCol;
         iCol = pIdx->aiColumn[i];
-        pCol = &pIdx->pTable->aCol[iCol];
+        pCol = &pTab->aCol[iCol];
+        if( pTab->iPKey==iCol ) iCol = -1;
         pLeft->iTable = regData+iCol+1;
         pLeft->affinity = pCol->affinity;
         pLeft->pColl = sqlite3LocateCollSeq(pParse, pCol->zColl);
@@ -80260,11 +81168,7 @@ static Trigger *fkActionTrigger(
       pWhere = 0;
     }
 
-    /* In the current implementation, pTab->dbMem==0 for all tables except
-    ** for temporary tables used to describe subqueries.  And temporary
-    ** tables do not have foreign key constraints.  Hence, pTab->dbMem
-    ** should always be 0 there.
-    */
+    /* Disable lookaside memory allocation */
     enableLookaside = db->lookaside.bEnabled;
     db->lookaside.bEnabled = 0;
 
@@ -80354,37 +81258,39 @@ SQLITE_PRIVATE void sqlite3FkActions(
 ** table pTab. Remove the deleted foreign keys from the Schema.fkeyHash
 ** hash table.
 */
-SQLITE_PRIVATE void sqlite3FkDelete(Table *pTab){
+SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){
   FKey *pFKey;                    /* Iterator variable */
   FKey *pNext;                    /* Copy of pFKey->pNextFrom */
 
   for(pFKey=pTab->pFKey; pFKey; pFKey=pNext){
 
     /* Remove the FK from the fkeyHash hash table. */
-    if( pFKey->pPrevTo ){
-      pFKey->pPrevTo->pNextTo = pFKey->pNextTo;
-    }else{
-      void *data = (void *)pFKey->pNextTo;
-      const char *z = (data ? pFKey->pNextTo->zTo : pFKey->zTo);
-      sqlite3HashInsert(&pTab->pSchema->fkeyHash, z, sqlite3Strlen30(z), data);
-    }
-    if( pFKey->pNextTo ){
-      pFKey->pNextTo->pPrevTo = pFKey->pPrevTo;
+    if( !db || db->pnBytesFreed==0 ){
+      if( pFKey->pPrevTo ){
+        pFKey->pPrevTo->pNextTo = pFKey->pNextTo;
+      }else{
+        void *p = (void *)pFKey->pNextTo;
+        const char *z = (p ? pFKey->pNextTo->zTo : pFKey->zTo);
+        sqlite3HashInsert(&pTab->pSchema->fkeyHash, z, sqlite3Strlen30(z), p);
+      }
+      if( pFKey->pNextTo ){
+        pFKey->pNextTo->pPrevTo = pFKey->pPrevTo;
+      }
     }
 
-    /* Delete any triggers created to implement actions for this FK. */
-#ifndef SQLITE_OMIT_TRIGGER
-    fkTriggerDelete(pTab->dbMem, pFKey->apTrigger[0]);
-    fkTriggerDelete(pTab->dbMem, pFKey->apTrigger[1]);
-#endif
-
     /* EV: R-30323-21917 Each foreign key constraint in SQLite is
     ** classified as either immediate or deferred.
     */
     assert( pFKey->isDeferred==0 || pFKey->isDeferred==1 );
 
+    /* Delete any triggers created to implement actions for this FK. */
+#ifndef SQLITE_OMIT_TRIGGER
+    fkTriggerDelete(db, pFKey->apTrigger[0]);
+    fkTriggerDelete(db, pFKey->apTrigger[1]);
+#endif
+
     pNext = pFKey->pNextFrom;
-    sqlite3DbFree(pTab->dbMem, pFKey);
+    sqlite3DbFree(db, pFKey);
   }
 }
 #endif /* ifndef SQLITE_OMIT_FOREIGN_KEY */
@@ -80459,7 +81365,7 @@ SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){
     int n;
     Table *pTab = pIdx->pTable;
     sqlite3 *db = sqlite3VdbeDb(v);
-    pIdx->zColAff = (char *)sqlite3Malloc(pIdx->nColumn+2);
+    pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+2);
     if( !pIdx->zColAff ){
       db->mallocFailed = 1;
       return 0;
@@ -80501,7 +81407,7 @@ SQLITE_PRIVATE void sqlite3TableAffinityStr(Vdbe *v, Table *pTab){
     int i;
     sqlite3 *db = sqlite3VdbeDb(v);
 
-    zColAff = (char *)sqlite3Malloc(pTab->nCol+1);
+    zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1);
     if( !zColAff ){
       db->mallocFailed = 1;
       return;
@@ -81612,6 +82518,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
     if( onError==OE_Ignore ){
       sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest);
     }else{
+      if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-15569-63625 */
       sqlite3HaltConstraint(pParse, onError, 0, 0);
     }
     sqlite3VdbeResolveLabel(v, allOk);
@@ -83126,13 +84033,11 @@ static int sqlite3LoadExtension(
   handle = sqlite3OsDlOpen(pVfs, zFile);
   if( handle==0 ){
     if( pzErrMsg ){
-      zErrmsg = sqlite3StackAllocZero(db, nMsg);
+      *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg);
       if( zErrmsg ){
         sqlite3_snprintf(nMsg, zErrmsg, 
             "unable to open shared library [%s]", zFile);
         sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
-        *pzErrMsg = sqlite3DbStrDup(0, zErrmsg);
-        sqlite3StackFree(db, zErrmsg);
       }
     }
     return SQLITE_ERROR;
@@ -83141,13 +84046,11 @@ static int sqlite3LoadExtension(
                    sqlite3OsDlSym(pVfs, handle, zProc);
   if( xInit==0 ){
     if( pzErrMsg ){
-      zErrmsg = sqlite3StackAllocZero(db, nMsg);
+      *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg);
       if( zErrmsg ){
         sqlite3_snprintf(nMsg, zErrmsg,
             "no entry point [%s] in shared library [%s]", zProc,zFile);
         sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
-        *pzErrMsg = sqlite3DbStrDup(0, zErrmsg);
-        sqlite3StackFree(db, zErrmsg);
       }
       sqlite3OsDlClose(pVfs, handle);
     }
@@ -84126,7 +85029,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
       }
       sqlite3_free(sqlite3_temp_directory);
       if( zRight[0] ){
-        sqlite3_temp_directory = sqlite3DbStrDup(0, zRight);
+        sqlite3_temp_directory = sqlite3_mprintf("%s", zRight);
       }else{
         sqlite3_temp_directory = 0;
       }
@@ -85601,7 +86504,6 @@ static int sqlite3Prepare(
   while( pParse->pTriggerPrg ){
     TriggerPrg *pT = pParse->pTriggerPrg;
     pParse->pTriggerPrg = pT->pNext;
-    sqlite3VdbeProgramDelete(db, pT->pProgram, 0);
     sqlite3DbFree(db, pT);
   }
 
@@ -87092,16 +87994,15 @@ SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){
     return 0;
   }
   /* The sqlite3ResultSetOfSelect() is only used n contexts where lookaside
-  ** is disabled, so we might as well hard-code pTab->dbMem to NULL. */
+  ** is disabled */
   assert( db->lookaside.bEnabled==0 );
-  pTab->dbMem = 0;
   pTab->nRef = 1;
   pTab->zName = 0;
   selectColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol);
   selectAddColumnTypeAndCollation(pParse, pTab->nCol, pTab->aCol, pSelect);
   pTab->iPKey = -1;
   if( db->mallocFailed ){
-    sqlite3DeleteTable(pTab);
+    sqlite3DeleteTable(db, pTab);
     return 0;
   }
   return pTab;
@@ -87593,7 +88494,7 @@ multi_select_end:
 ** regReturn is the number of the register holding the subroutine
 ** return address.
 **
-** If regPrev>0 then it is a the first register in a vector that
+** If regPrev>0 then it is the first register in a vector that
 ** records the previous output.  mem[regPrev] is a flag that is false
 ** if there has been no previous output.  If regPrev>0 then code is
 ** generated to suppress duplicates.  pKeyInfo is used for comparing
@@ -88290,12 +89191,13 @@ static void substSelect(
 **   (2)  The subquery is not an aggregate or the outer query is not a join.
 **
 **   (3)  The subquery is not the right operand of a left outer join
-**        (Originally ticket #306.  Strenghtened by ticket #3300)
+**        (Originally ticket #306.  Strengthened by ticket #3300)
 **
-**   (4)  The subquery is not DISTINCT or the outer query is not a join.
+**   (4)  The subquery is not DISTINCT.
 **
-**   (5)  The subquery is not DISTINCT or the outer query does not use
-**        aggregates.
+**  (**)  At one point restrictions (4) and (5) defined a subset of DISTINCT
+**        sub-queries that were excluded from this optimization. Restriction 
+**        (4) has since been expanded to exclude all DISTINCT subqueries.
 **
 **   (6)  The subquery does not use aggregates or the outer query is not
 **        DISTINCT.
@@ -88315,9 +89217,9 @@ static void substSelect(
 **  (**)  Not implemented.  Subsumed into restriction (3).  Was previously
 **        a separate restriction deriving from ticket #350.
 **
-**  (13)  The subquery and outer query do not both use LIMIT
+**  (13)  The subquery and outer query do not both use LIMIT.
 **
-**  (14)  The subquery does not use OFFSET
+**  (14)  The subquery does not use OFFSET.
 **
 **  (15)  The outer query is not part of a compound select or the
 **        subquery does not have a LIMIT clause.
@@ -88408,9 +89310,9 @@ static int flattenSubquery(
     return 0;                                            /* Restriction (15) */
   }
   if( pSubSrc->nSrc==0 ) return 0;                       /* Restriction (7)  */
-  if( ((pSub->selFlags & SF_Distinct)!=0 || pSub->pLimit) 
-         && (pSrc->nSrc>1 || isAgg) ){          /* Restrictions (4)(5)(8)(9) */
-     return 0;       
+  if( pSub->selFlags & SF_Distinct ) return 0;           /* Restriction (5)  */
+  if( pSub->pLimit && (pSrc->nSrc>1 || isAgg) ){
+     return 0;         /* Restrictions (8)(9) */
   }
   if( (p->selFlags & SF_Distinct)!=0 && subqueryIsAgg ){
      return 0;         /* Restriction (6)  */
@@ -88890,7 +89792,6 @@ static int selectExpander(Walker *pWalker, Select *p){
       sqlite3WalkSelect(pWalker, pSel);
       pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table));
       if( pTab==0 ) return WRC_Abort;
-      pTab->dbMem = db->lookaside.bEnabled ? db : 0;
       pTab->nRef = 1;
       pTab->zName = sqlite3MPrintf(db, "sqlite_subquery_%p_", (void*)pTab);
       while( pSel->pPrior ){ pSel = pSel->pPrior; }
@@ -91104,6 +92005,7 @@ static TriggerPrg *codeRowTrigger(
   int iEndTrigger = 0;        /* Label to jump to if WHEN is false */
 
   assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) );
+  assert( pTop->pVdbe );
 
   /* Allocate the TriggerPrg and SubProgram objects. To ensure that they
   ** are freed if an error occurs, link them into the Parse.pTriggerPrg 
@@ -91114,7 +92016,7 @@ static TriggerPrg *codeRowTrigger(
   pTop->pTriggerPrg = pPrg;
   pPrg->pProgram = pProgram = sqlite3DbMallocZero(db, sizeof(SubProgram));
   if( !pProgram ) return 0;
-  pProgram->nRef = 1;
+  sqlite3VdbeLinkSubProgram(pTop->pVdbe, pProgram);
   pPrg->pTrigger = pTrigger;
   pPrg->orconf = orconf;
   pPrg->aColmask[0] = 0xffffffff;
@@ -91248,8 +92150,9 @@ SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(
   /* Code the OP_Program opcode in the parent VDBE. P4 of the OP_Program 
   ** is a pointer to the sub-vdbe containing the trigger program.  */
   if( pPrg ){
+    int bRecursive = (p->zName && 0==(pParse->db->flags&SQLITE_RecTriggers));
+
     sqlite3VdbeAddOp3(v, OP_Program, reg, ignoreJump, ++pParse->nMem);
-    pPrg->pProgram->nRef++;
     sqlite3VdbeChangeP4(v, -1, (const char *)pPrg->pProgram, P4_SUBPROGRAM);
     VdbeComment(
         (v, "Call: %s.%s", (p->zName?p->zName:"fkey"), onErrorText(orconf)));
@@ -91259,7 +92162,7 @@ SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(
     ** invocation is disallowed if (a) the sub-program is really a trigger,
     ** not a foreign key action, and (b) the flag to enable recursive triggers
     ** is clear.  */
-    sqlite3VdbeChangeP5(v, (u8)(p->zName && !(pParse->db->flags&SQLITE_RecTriggers)));
+    sqlite3VdbeChangeP5(v, (u8)bRecursive);
   }
 }
 
@@ -91408,7 +92311,7 @@ SQLITE_PRIVATE u32 sqlite3TriggerColmask(
 **    May you find forgiveness for yourself and forgive others.
 **    May you share freely, never taking more than you give.
 **
-sqlite*************************************************************************
+*************************************************************************
 ** This file contains C code routines that are called by the parser
 ** to handle UPDATE statements.
 */
@@ -92627,14 +93530,14 @@ SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){
 ** in the list are moved to the sqlite3.pDisconnect list of the associated 
 ** database connection.
 */
-SQLITE_PRIVATE void sqlite3VtabClear(Table *p){
-  vtabDisconnectAll(0, p);
+SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table *p){
+  if( !db || db->pnBytesFreed==0 ) vtabDisconnectAll(0, p);
   if( p->azModuleArg ){
     int i;
     for(i=0; i<p->nModuleArg; i++){
-      sqlite3DbFree(p->dbMem, p->azModuleArg[i]);
+      sqlite3DbFree(db, p->azModuleArg[i]);
     }
-    sqlite3DbFree(p->dbMem, p->azModuleArg);
+    sqlite3DbFree(db, p->azModuleArg);
   }
 }
 
@@ -92799,7 +93702,6 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){
       assert( pTab==pOld );  /* Malloc must have failed inside HashInsert() */
       return;
     }
-    pSchema->db = pParse->db;
     pParse->pNewTable = 0;
   }
 }
@@ -92873,7 +93775,7 @@ static int vtabCallConstructor(
       *pzErr = sqlite3MPrintf(db, "vtable constructor failed: %s", zModuleName);
     }else {
       *pzErr = sqlite3MPrintf(db, "%s", zErr);
-      sqlite3DbFree(db, zErr);
+      sqlite3_free(zErr);
     }
     sqlite3DbFree(db, pVTable);
   }else if( ALWAYS(pVTable->pVtab) ){
@@ -93088,7 +93990,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
     if( pParse->pVdbe ){
       sqlite3VdbeFinalize(pParse->pVdbe);
     }
-    sqlite3DeleteTable(pParse->pNewTable);
+    sqlite3DeleteTable(db, pParse->pNewTable);
     sqlite3StackFree(db, pParse);
   }
 
@@ -93175,8 +94077,8 @@ SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, char **pzErrmsg){
     if( pVtab && (x = pVtab->pModule->xSync)!=0 ){
       rc = x(pVtab);
       sqlite3DbFree(db, *pzErrmsg);
-      *pzErrmsg = pVtab->zErrMsg;
-      pVtab->zErrMsg = 0;
+      *pzErrmsg = sqlite3DbStrDup(db, pVtab->zErrMsg);
+      sqlite3_free(pVtab->zErrMsg);
     }
   }
   db->aVTrans = aVTrans;
@@ -93676,6 +94578,7 @@ static void whereClauseClear(WhereClause *pWC){
 static int whereClauseInsert(WhereClause *pWC, Expr *p, u8 wtFlags){
   WhereTerm *pTerm;
   int idx;
+  testcase( wtFlags & TERM_VIRTUAL );  /* EV: R-00211-15100 */
   if( pWC->nTerm>=pWC->nSlot ){
     WhereTerm *pOld = pWC->a;
     sqlite3 *db = pWC->pParse->db;
@@ -93821,6 +94724,13 @@ static Bitmask exprSelectTableUsage(WhereMaskSet *pMaskSet, Select *pS){
 ** Return TRUE if the given operator is one of the operators that is
 ** allowed for an indexable WHERE clause term.  The allowed operators are
 ** "=", "<", ">", "<=", ">=", and "IN".
+**
+** IMPLEMENTATION-OF: R-59926-26393 To be usable by an index a term must be
+** of one of the following forms: column = expression column > expression
+** column >= expression column < expression column <= expression
+** expression = column expression > column expression >= column
+** expression < column expression <= column column IN
+** (expression-list) column IN (subquery) column IS NULL
 */
 static int allowedOp(int op){
   assert( TK_GT>TK_EQ && TK_GT<TK_GE );
@@ -93984,7 +94894,6 @@ static int isLikeOrGlob(
   int c;                     /* One character in z[] */
   int cnt;                   /* Number of non-wildcard prefix characters */
   char wc[3];                /* Wildcard characters */
-  CollSeq *pColl;            /* Collating sequence for LHS */
   sqlite3 *db = pParse->db;  /* Database connection */
   sqlite3_value *pVal = 0;
   int op;                    /* Opcode of pRight */
@@ -94003,19 +94912,6 @@ static int isLikeOrGlob(
     return 0;
   }
   assert( pLeft->iColumn!=(-1) ); /* Because IPK never has AFF_TEXT */
-  pColl = sqlite3ExprCollSeq(pParse, pLeft);
-  if( pColl==0 ) return 0;  /* Happens when LHS has an undefined collation */
-  if( (pColl->type!=SQLITE_COLL_BINARY || *pnoCase) &&
-      (pColl->type!=SQLITE_COLL_NOCASE || !*pnoCase) ){
-    /* IMP: R-09003-32046 For the GLOB operator, the column must use the
-    ** default BINARY collating sequence.
-    ** IMP: R-41408-28306 For the LIKE operator, if case_sensitive_like mode
-    ** is enabled then the column must use the default BINARY collating
-    ** sequence, or if case_sensitive_like mode is disabled then the column
-    ** must use the built-in NOCASE collating sequence.
-    */
-    return 0;
-  }
 
   pRight = pList->a[0].pExpr;
   op = pRight->op;
@@ -94038,9 +94934,9 @@ static int isLikeOrGlob(
     while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){
       cnt++;
     }
-    if( cnt!=0 && c!=0 && 255!=(u8)z[cnt-1] ){
+    if( cnt!=0 && 255!=(u8)z[cnt-1] ){
       Expr *pPrefix;
-      *pisComplete = z[cnt]==wc[0] && z[cnt+1]==0;
+      *pisComplete = c==wc[0] && z[cnt+1]==0;
       pPrefix = sqlite3Expr(db, TK_STRING, z);
       if( pPrefix ) pPrefix->u.zToken[cnt] = 0;
       *ppPrefix = pPrefix;
@@ -94379,6 +95275,8 @@ static void exprAnalyzeOrTerm(
     /* At this point, okToChngToIN is true if original pTerm satisfies
     ** case 1.  In that case, construct a new virtual term that is 
     ** pTerm converted into an IN operator.
+    **
+    ** EV: R-00211-15100
     */
     if( okToChngToIN ){
       Expr *pDup;            /* A transient duplicate expression */
@@ -94595,6 +95493,7 @@ static void exprAnalyze(
     Expr *pNewExpr2;
     int idxNew1;
     int idxNew2;
+    CollSeq *pColl;    /* Collating sequence to use */
 
     pLeft = pExpr->x.pList->a[1].pExpr;
     pStr2 = sqlite3ExprDup(db, pStr1, 0);
@@ -94609,17 +95508,23 @@ static void exprAnalyze(
         ** inequality.  To avoid this, make sure to also run the full
         ** LIKE on all candidate expressions by clearing the isComplete flag
         */
-        if( c=='A'-1 ) isComplete = 0;
+        if( c=='A'-1 ) isComplete = 0;   /* EV: R-64339-08207 */
+
 
         c = sqlite3UpperToLower[c];
       }
       *pC = c + 1;
     }
-    pNewExpr1 = sqlite3PExpr(pParse, TK_GE, sqlite3ExprDup(db,pLeft,0),pStr1,0);
+    pColl = sqlite3FindCollSeq(db, SQLITE_UTF8, noCase ? "NOCASE" : "BINARY",0);
+    pNewExpr1 = sqlite3PExpr(pParse, TK_GE, 
+                     sqlite3ExprSetColl(sqlite3ExprDup(db,pLeft,0), pColl),
+                     pStr1, 0);
     idxNew1 = whereClauseInsert(pWC, pNewExpr1, TERM_VIRTUAL|TERM_DYNAMIC);
     testcase( idxNew1==0 );
     exprAnalyze(pSrc, pWC, idxNew1);
-    pNewExpr2 = sqlite3PExpr(pParse, TK_LT, sqlite3ExprDup(db,pLeft,0),pStr2,0);
+    pNewExpr2 = sqlite3PExpr(pParse, TK_LT,
+                     sqlite3ExprSetColl(sqlite3ExprDup(db,pLeft,0), pColl),
+                     pStr2, 0);
     idxNew2 = whereClauseInsert(pWC, pNewExpr2, TERM_VIRTUAL|TERM_DYNAMIC);
     testcase( idxNew2==0 );
     exprAnalyze(pSrc, pWC, idxNew2);
@@ -95371,7 +96276,7 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){
       sqlite3ErrorMsg(pParse, "%s", pVtab->zErrMsg);
     }
   }
-  sqlite3DbFree(pParse->db, pVtab->zErrMsg);
+  sqlite3_free(pVtab->zErrMsg);
   pVtab->zErrMsg = 0;
 
   for(i=0; i<p->nConstraint; i++){
@@ -96236,6 +97141,9 @@ static void bestIndex(
 ** in the ON clause.  The term is disabled in (3) because it is not part
 ** of a LEFT OUTER JOIN.  In (1), the term is not disabled.
 **
+** IMPLEMENTATION-OF: R-24597-58655 No tests are done for terms that are
+** completely satisfied by indices.
+**
 ** Disabling a term causes that term to not be tested in the inner loop
 ** of the join.  Disabling is an optimization.  When terms are satisfied
 ** by indices, we disable them to prevent redundant tests in the inner
@@ -96447,6 +97355,7 @@ static int codeAllEqualityTerms(
     /* The following true for indices with redundant columns. 
     ** Ex: CREATE INDEX i1 ON t1(a,b,a); SELECT * FROM t1 WHERE a=0 AND b=0; */
     testcase( (pTerm->wtFlags & TERM_CODED)!=0 );
+    testcase( pTerm->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
     r1 = codeEqualityTerm(pParse, pTerm, pLevel, regBase+j);
     if( r1!=regBase+j ){
       if( nReg==1 ){
@@ -96590,6 +97499,7 @@ static Bitmask codeOneLoopStart(
     assert( pTerm->pExpr!=0 );
     assert( pTerm->leftCursor==iCur );
     assert( omitTable==0 );
+    testcase( pTerm->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
     iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, iReleaseReg);
     addrNxt = pLevel->addrNxt;
     sqlite3VdbeAddOp2(v, OP_MustBeInt, iRowidReg, addrNxt);
@@ -96630,6 +97540,7 @@ static Bitmask codeOneLoopStart(
       assert( TK_LT==TK_GT+2 );      /*  ... of the TK_xx values... */
       assert( TK_GE==TK_GT+3 );      /*  ... is correcct. */
 
+      testcase( pStart->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
       pX = pStart->pExpr;
       assert( pX!=0 );
       assert( pStart->leftCursor==iCur );
@@ -96647,6 +97558,7 @@ static Bitmask codeOneLoopStart(
       pX = pEnd->pExpr;
       assert( pX!=0 );
       assert( pEnd->leftCursor==iCur );
+      testcase( pEnd->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
       memEndValue = ++pParse->nMem;
       sqlite3ExprCode(pParse, pX->pRight, memEndValue);
       if( pX->op==TK_LT || pX->op==TK_GT ){
@@ -96704,7 +97616,7 @@ static Bitmask codeOneLoopStart(
     **         constraints but an index is selected anyway, in order
     **         to force the output order to conform to an ORDER BY.
     */  
-    int aStartOp[] = {
+    static const u8 aStartOp[] = {
       0,
       0,
       OP_Rewind,           /* 2: (!start_constraints && startEq &&  !bRev) */
@@ -96714,12 +97626,12 @@ static Bitmask codeOneLoopStart(
       OP_SeekGe,           /* 6: (start_constraints  &&  startEq && !bRev) */
       OP_SeekLe            /* 7: (start_constraints  &&  startEq &&  bRev) */
     };
-    int aEndOp[] = {
+    static const u8 aEndOp[] = {
       OP_Noop,             /* 0: (!end_constraints) */
       OP_IdxGE,            /* 1: (end_constraints && !bRev) */
       OP_IdxLT             /* 2: (end_constraints && bRev) */
     };
-    int nEq = pLevel->plan.nEq;
+    int nEq = pLevel->plan.nEq;  /* Number of == or IN terms */
     int isMinQuery = 0;          /* If this is an optimized SELECT min(x).. */
     int regBase;                 /* Base register holding constraint values */
     int r1;                      /* Temp register */
@@ -96729,10 +97641,10 @@ static Bitmask codeOneLoopStart(
     int endEq;                   /* True if range end uses ==, >= or <= */
     int start_constraints;       /* Start of range is constrained */
     int nConstraint;             /* Number of constraint terms */
-    Index *pIdx;         /* The index we will be using */
-    int iIdxCur;         /* The VDBE cursor for the index */
-    int nExtraReg = 0;   /* Number of extra registers needed */
-    int op;              /* Instruction opcode */
+    Index *pIdx;                 /* The index we will be using */
+    int iIdxCur;                 /* The VDBE cursor for the index */
+    int nExtraReg = 0;           /* Number of extra registers needed */
+    int op;                      /* Instruction opcode */
     char *zStartAff;             /* Affinity for start of range constraint */
     char *zEndAff;               /* Affinity for end of range constraint */
 
@@ -96814,6 +97726,7 @@ static Bitmask codeOneLoopStart(
         }
       }  
       nConstraint++;
+      testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
     }else if( isMinQuery ){
       sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq);
       nConstraint++;
@@ -96853,6 +97766,7 @@ static Bitmask codeOneLoopStart(
       }  
       codeApplyAffinity(pParse, regBase, nEq+1, zEndAff);
       nConstraint++;
+      testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
     }
     sqlite3DbFree(pParse->db, zStartAff);
     sqlite3DbFree(pParse->db, zEndAff);
@@ -97059,11 +97973,15 @@ static Bitmask codeOneLoopStart(
 
   /* Insert code to test every subexpression that can be completely
   ** computed using the current set of tables.
+  **
+  ** IMPLEMENTATION-OF: R-49525-50935 Terms that cannot be satisfied through
+  ** the use of indices become tests that are evaluated against each row of
+  ** the relevant input tables.
   */
   k = 0;
   for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){
     Expr *pE;
-    testcase( pTerm->wtFlags & TERM_VIRTUAL );
+    testcase( pTerm->wtFlags & TERM_VIRTUAL ); /* IMP: R-30575-11662 */
     testcase( pTerm->wtFlags & TERM_CODED );
     if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
     if( (pTerm->prereqAll & notReady)!=0 ){
@@ -97091,7 +98009,7 @@ static Bitmask codeOneLoopStart(
     VdbeComment((v, "record LEFT JOIN hit"));
     sqlite3ExprCacheClear(pParse);
     for(pTerm=pWC->a, j=0; j<pWC->nTerm; j++, pTerm++){
-      testcase( pTerm->wtFlags & TERM_VIRTUAL );
+      testcase( pTerm->wtFlags & TERM_VIRTUAL );  /* IMP: R-30575-11662 */
       testcase( pTerm->wtFlags & TERM_CODED );
       if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
       if( (pTerm->prereqAll & notReady)!=0 ){
@@ -97309,7 +98227,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
   initMaskSet(pMaskSet);
   whereClauseInit(pWC, pParse, pMaskSet);
   sqlite3ExprCodeConstants(pParse, pWhere);
-  whereSplit(pWC, pWhere, TK_AND);
+  whereSplit(pWC, pWhere, TK_AND);   /* IMP: R-15842-53296 */
     
   /* Special case: a WHERE clause that is constant.  Evaluate the
   ** expression and either jump over all of the code or fall thru.
@@ -97397,6 +98315,8 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
     int bestJ = -1;             /* The value of j */
     Bitmask m;                  /* Bitmask value for j or bestJ */
     int isOptimal;              /* Iterator for optimal/non-optimal search */
+    int nUnconstrained;         /* Number tables without INDEXED BY */
+    Bitmask notIndexed;         /* Mask of tables that cannot use an index */
 
     memset(&bestPlan, 0, sizeof(bestPlan));
     bestPlan.rCost = SQLITE_BIG_DBL;
@@ -97438,8 +98358,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
     ** algorithm may choose to use t2 for the outer loop, which is a much
     ** costlier approach.
     */
+    nUnconstrained = 0;
+    notIndexed = 0;
     for(isOptimal=(iFrom<nTabList-1); isOptimal>=0; isOptimal--){
-      Bitmask mask;  /* Mask of tables not yet ready */
+      Bitmask mask;             /* Mask of tables not yet ready */
       for(j=iFrom, pTabItem=&pTabList->a[j]; j<nTabList; j++, pTabItem++){
         int doNotReorder;    /* True if this table should not be reordered */
         WhereCost sCost;     /* Cost information from best[Virtual]Index() */
@@ -97454,6 +98376,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
         }
         mask = (isOptimal ? m : notReady);
         pOrderBy = ((i==0 && ppOrderBy )?*ppOrderBy:0);
+        if( pTabItem->pIndex==0 ) nUnconstrained++;
   
         assert( pTabItem->pTab );
 #ifndef SQLITE_OMIT_VIRTUALTABLE
@@ -97467,9 +98390,43 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
         }
         assert( isOptimal || (sCost.used&notReady)==0 );
 
-        if( (sCost.used&notReady)==0
-         && (bestJ<0 || sCost.rCost<bestPlan.rCost
-             || (sCost.rCost<=bestPlan.rCost && sCost.nRow<bestPlan.nRow))
+        /* If an INDEXED BY clause is present, then the plan must use that
+        ** index if it uses any index at all */
+        assert( pTabItem->pIndex==0 
+                  || (sCost.plan.wsFlags & WHERE_NOT_FULLSCAN)==0
+                  || sCost.plan.u.pIdx==pTabItem->pIndex );
+
+        if( isOptimal && (sCost.plan.wsFlags & WHERE_NOT_FULLSCAN)==0 ){
+          notIndexed |= m;
+        }
+
+        /* Conditions under which this table becomes the best so far:
+        **
+        **   (1) The table must not depend on other tables that have not
+        **       yet run.
+        **
+        **   (2) A full-table-scan plan cannot supercede another plan unless
+        **       it is an "optimal" plan as defined above.
+        **
+        **   (3) All tables have an INDEXED BY clause or this table lacks an
+        **       INDEXED BY clause or this table uses the specific
+        **       index specified by its INDEXED BY clause.  This rule ensures
+        **       that a best-so-far is always selected even if an impossible
+        **       combination of INDEXED BY clauses are given.  The error
+        **       will be detected and relayed back to the application later.
+        **       The NEVER() comes about because rule (2) above prevents
+        **       An indexable full-table-scan from reaching rule (3).
+        **
+        **   (4) The plan cost must be lower than prior plans or else the
+        **       cost must be the same and the number of rows must be lower.
+        */
+        if( (sCost.used&notReady)==0                       /* (1) */
+            && (bestJ<0 || (notIndexed&m)!=0               /* (2) */
+                || (sCost.plan.wsFlags & WHERE_NOT_FULLSCAN)!=0)
+            && (nUnconstrained==0 || pTabItem->pIndex==0   /* (3) */
+                || NEVER((sCost.plan.wsFlags & WHERE_NOT_FULLSCAN)!=0))
+            && (bestJ<0 || sCost.rCost<bestPlan.rCost      /* (4) */
+                || (sCost.rCost<=bestPlan.rCost && sCost.nRow<bestPlan.nRow))
         ){
           WHERETRACE(("... best so far with cost=%g and nRow=%g\n",
                       sCost.rCost, sCost.nRow));
@@ -100484,7 +101441,7 @@ static void yy_reduce(
         break;
       case 195: /* expr ::= expr COLLATE ids */
 {
-  yygotominor.yy118.pExpr = sqlite3ExprSetColl(pParse, yymsp[-2].minor.yy118.pExpr, &yymsp[0].minor.yy0);
+  yygotominor.yy118.pExpr = sqlite3ExprSetCollByToken(pParse, yymsp[-2].minor.yy118.pExpr, &yymsp[0].minor.yy0);
   yygotominor.yy118.zStart = yymsp[-2].minor.yy118.zStart;
   yygotominor.yy118.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
 }
@@ -100740,7 +101697,7 @@ static void yy_reduce(
   Expr *p = 0;
   if( yymsp[-1].minor.yy0.n>0 ){
     p = sqlite3Expr(pParse->db, TK_COLUMN, 0);
-    sqlite3ExprSetColl(pParse, p, &yymsp[-1].minor.yy0);
+    sqlite3ExprSetCollByToken(pParse, p, &yymsp[-1].minor.yy0);
   }
   yygotominor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, p);
   sqlite3ExprListSetName(pParse,yygotominor.yy322,&yymsp[-2].minor.yy0,1);
@@ -100753,7 +101710,7 @@ static void yy_reduce(
   Expr *p = 0;
   if( yymsp[-1].minor.yy0.n>0 ){
     p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0);
-    sqlite3ExprSetColl(pParse, p, &yymsp[-1].minor.yy0);
+    sqlite3ExprSetCollByToken(pParse, p, &yymsp[-1].minor.yy0);
   }
   yygotominor.yy322 = sqlite3ExprListAppend(pParse,0, p);
   sqlite3ExprListSetName(pParse, yygotominor.yy322, &yymsp[-2].minor.yy0, 1);
@@ -102033,7 +102990,7 @@ abort_parse:
   }
 #endif
 #ifndef SQLITE_OMIT_VIRTUALTABLE
-  sqlite3DbFree(db, pParse->apVtabLock);
+  sqlite3_free(pParse->apVtabLock);
 #endif
 
   if( !IN_DECLARE_VTAB ){
@@ -102041,7 +102998,7 @@ abort_parse:
     ** structure built up in pParse->pNewTable. The calling code (see vtab.c)
     ** will take responsibility for freeing the Table structure.
     */
-    sqlite3DeleteTable(pParse->pNewTable);
+    sqlite3DeleteTable(db, pParse->pNewTable);
   }
 
   sqlite3DeleteTrigger(db, pParse->pNewTrigger);
@@ -102055,7 +103012,7 @@ abort_parse:
   while( pParse->pZombieTab ){
     Table *p = pParse->pZombieTab;
     pParse->pZombieTab = p->pNextZombie;
-    sqlite3DeleteTable(p);
+    sqlite3DeleteTable(db, p);
   }
   if( nErr>0 && pParse->rc==SQLITE_OK ){
     pParse->rc = SQLITE_ERROR;
@@ -103747,16 +104704,7 @@ SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3 *db, int iDb){
 
   for(i=0; i<db->nDb && rc==SQLITE_OK; i++){
     if( i==iDb || iDb==SQLITE_MAX_ATTACHED ){
-      Btree *pBt = db->aDb[i].pBt;
-      if( pBt ){
-        if( sqlite3BtreeIsInReadTrans(pBt) ){
-          rc = SQLITE_LOCKED;
-        }else{
-          sqlite3BtreeEnter(pBt);
-          rc = sqlite3PagerCheckpoint(sqlite3BtreePager(pBt));
-          sqlite3BtreeLeave(pBt);
-        }
-      }
+      rc = sqlite3BtreeCheckpoint(db->aDb[i].pBt);
     }
   }
 
@@ -105205,7 +106153,7 @@ SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db){
       assert( aArg==aDyn || (aDyn==0 && aArg==aStatic) );
       assert( nArg<=(int)ArraySize(aStatic) || aArg==aDyn );
       if( (!aDyn && nArg==(int)ArraySize(aStatic))
-       || (aDyn && nArg==(int)(sqlite3DbMallocSize(db, aDyn)/sizeof(void*)))
+       || (aDyn && nArg==(int)(sqlite3MallocSize(aDyn)/sizeof(void*)))
       ){
         /* The aArg[] array needs to grow. */
         void **pNew = (void **)sqlite3Malloc(nArg*sizeof(void *)*2);
@@ -108529,7 +109477,7 @@ static void hashDestroy(void *p){
 ** used to retrieve the respective implementations.
 **
 ** Calling sqlite3Fts3SimpleTokenizerModule() sets the value pointed
-** to by the argument to point a the "simple" tokenizer implementation.
+** to by the argument to point to the "simple" tokenizer implementation.
 ** Function ...PorterTokenizerModule() sets *pModule to point to the
 ** porter tokenizer/stemmer implementation.
 */
@@ -108731,7 +109679,7 @@ struct ParseContext {
 ** negative values).
 */
 static int fts3isspace(char c){
-  return (c&0x80)==0 ? isspace(c) : 0;
+  return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f';
 }
 
 /*
@@ -111118,6 +112066,9 @@ typedef struct simple_tokenizer_cursor {
 static int simpleDelim(simple_tokenizer *t, unsigned char c){
   return c<0x80 && t->delim[c];
 }
+static int fts3_isalnum(int x){
+  return (x>='0' && x<='9') || (x>='A' && x<='Z') || (x>='a' && x<='z');
+}
 
 /*
 ** Create a new tokenizer instance.
@@ -111152,7 +112103,7 @@ static int simpleCreate(
     /* Mark non-alphanumeric ASCII characters as delimiters */
     int i;
     for(i=1; i<0x80; i++){
-      t->delim[i] = !isalnum(i) ? -1 : 0;
+      t->delim[i] = !fts3_isalnum(i) ? -1 : 0;
     }
   }
 
@@ -111258,7 +112209,7 @@ static int simpleNext(
         ** case-insensitivity.
         */
         unsigned char ch = p[iStartOffset+i];
-        c->pToken[i] = (char)(ch<0x80 ? tolower(ch) : ch);
+        c->pToken[i] = (char)((ch>='A' && ch<='Z') ? ch-'A'+'a' : ch);
       }
       *ppToken = c->pToken;
       *pnBytes = n;
@@ -116164,11 +117115,10 @@ static int rtreeFilter(
 **   idxNum     idxStr        Strategy
 **   ------------------------------------------------
 **     1        Unused        Direct lookup by rowid.
-**     2        See below     R-tree query.
-**     3        Unused        Full table scan.
+**     2        See below     R-tree query or full-table scan.
 **   ------------------------------------------------
 **
-** If strategy 1 or 3 is used, then idxStr is not meaningful. If strategy
+** If strategy 1 is used, then idxStr is not meaningful. If strategy
 ** 2 is used, idxStr is formatted to contain 2 bytes for each 
 ** constraint used. The first two bytes of idxStr correspond to 
 ** the constraint in sqlite3_index_info.aConstraintUsage[] with
diff --git a/libgda/sqlite/sqlite-src/sqlite3.h b/libgda/sqlite/sqlite-src/sqlite3.h
index 3d02c7c..ceca47a 100644
--- a/libgda/sqlite/sqlite-src/sqlite3.h
+++ b/libgda/sqlite/sqlite-src/sqlite3.h
@@ -97,7 +97,7 @@ extern "C" {
 **
 ** Since version 3.6.18, SQLite source code has been stored in the
 ** <a href="http://www.fossil-scm.org/";>Fossil configuration management
-** system</a>.  ^The SQLITE_SOURCE_ID macro evalutes to
+** system</a>.  ^The SQLITE_SOURCE_ID macro evaluates to
 ** a string which identifies a particular check-in of SQLite
 ** within its configuration management system.  ^The SQLITE_SOURCE_ID
 ** string contains the date and time of the check-in (UTC) and an SHA1
@@ -107,9 +107,9 @@ extern "C" {
 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
 ** [sqlite_version()] and [sqlite_source_id()].
 */
-#define SQLITE_VERSION        "3.7.0.1"
-#define SQLITE_VERSION_NUMBER 3007000
-#define SQLITE_SOURCE_ID      "2010-08-04 12:31:11 042a1abb030a0711386add7eb6e10832cc8b0f57"
+#define SQLITE_VERSION        "3.7.2"
+#define SQLITE_VERSION_NUMBER 3007002
+#define SQLITE_SOURCE_ID      "2010-08-23 18:52:01 42537b60566f288167f1b5864a5435986838e3a3"
 
 /*
 ** CAPI3REF: Run-Time Library Version Numbers
@@ -154,7 +154,7 @@ SQLITE_API int sqlite3_libversion_number(void);
 ** compile time.  ^The SQLITE_ prefix may be omitted from the 
 ** option name passed to sqlite3_compileoption_used().  
 **
-** ^The sqlite3_compileoption_get() function allows interating
+** ^The sqlite3_compileoption_get() function allows iterating
 ** over the list of options that were defined at compile time by
 ** returning the N-th compile time option string.  ^If N is out of range,
 ** sqlite3_compileoption_get() returns a NULL pointer.  ^The SQLITE_ 
@@ -162,7 +162,7 @@ SQLITE_API int sqlite3_libversion_number(void);
 ** sqlite3_compileoption_get().
 **
 ** ^Support for the diagnostic functions sqlite3_compileoption_used()
-** and sqlite3_compileoption_get() may be omitted by specifing the 
+** and sqlite3_compileoption_get() may be omitted by specifying the 
 ** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time.
 **
 ** See also: SQL functions [sqlite_compileoption_used()] and
@@ -268,7 +268,7 @@ typedef sqlite_uint64 sqlite3_uint64;
 **
 ** ^The sqlite3_close() routine is the destructor for the [sqlite3] object.
 ** ^Calls to sqlite3_close() return SQLITE_OK if the [sqlite3] object is
-** successfullly destroyed and all associated resources are deallocated.
+** successfully destroyed and all associated resources are deallocated.
 **
 ** Applications must [sqlite3_finalize | finalize] all [prepared statements]
 ** and [sqlite3_blob_close | close] all [BLOB handles] associated with
@@ -695,12 +695,21 @@ struct sqlite3_io_methods {
 ** is often close.  The underlying VFS might choose to preallocate database
 ** file space based on this hint in order to help writes to the database
 ** file run faster.
+**
+** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS
+** extends and truncates the database file in chunks of a size specified
+** by the user. The fourth argument to [sqlite3_file_control()] should 
+** point to an integer (type int) containing the new chunk-size to use
+** for the nominated database. Allocating database file space in large
+** chunks (say 1MB at a time), may reduce file-system fragmentation and
+** improve performance on some systems.
 */
 #define SQLITE_FCNTL_LOCKSTATE        1
 #define SQLITE_GET_LOCKPROXYFILE      2
 #define SQLITE_SET_LOCKPROXYFILE      3
 #define SQLITE_LAST_ERRNO             4
 #define SQLITE_FCNTL_SIZE_HINT        5
+#define SQLITE_FCNTL_CHUNK_SIZE       6
 
 /*
 ** CAPI3REF: Mutex Handle
@@ -2176,7 +2185,13 @@ SQLITE_API int sqlite3_set_authorizer(
 ** ^The callback function registered by sqlite3_profile() is invoked
 ** as each SQL statement finishes.  ^The profile callback contains
 ** the original statement text and an estimate of wall-clock time
-** of how long that statement took to run.
+** of how long that statement took to run.  ^The profile callback
+** time is in units of nanoseconds, however the current implementation
+** is only capable of millisecond resolution so the six least significant
+** digits in the time are meaningless.  Future versions of SQLite
+** might provide greater resolution on the profiler callback.  The
+** sqlite3_profile() function is considered experimental and is
+** subject to change in future versions of SQLite.
 */
 SQLITE_API void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
 SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*,
@@ -2657,7 +2672,7 @@ typedef struct sqlite3_context sqlite3_context;
 ** </ul>
 **
 ** In the templates above, NNN represents an integer literal,
-** and VVV represents an alphanumeric identifer.)^  ^The values of these
+** and VVV represents an alphanumeric identifier.)^  ^The values of these
 ** parameters (also called "host parameter names" or "SQL parameters")
 ** can be set using the sqlite3_bind_*() routines defined here.
 **
@@ -3436,7 +3451,7 @@ SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*);
 /*
 ** CAPI3REF: Obtain Aggregate Function Context
 **
-** Implementions of aggregate SQL functions use this
+** Implementations of aggregate SQL functions use this
 ** routine to allocate memory for storing their state.
 **
 ** ^The first time the sqlite3_aggregate_context(C,N) routine is called 
@@ -3708,7 +3723,7 @@ SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n);
 **
 ** A pointer to the user supplied routine must be passed as the fifth
 ** argument.  ^If it is NULL, this is the same as deleting the collation
-** sequence (so that SQLite cannot call it anymore).
+** sequence (so that SQLite cannot call it any more).
 ** ^Each time the application supplied function is invoked, it is passed
 ** as its first parameter a copy of the void* passed as the fourth argument
 ** to sqlite3_create_collation() or sqlite3_create_collation16().
@@ -4325,7 +4340,8 @@ struct sqlite3_module {
 ** CAPI3REF: Virtual Table Indexing Information
 ** KEYWORDS: sqlite3_index_info
 **
-** The sqlite3_index_info structure and its substructures is used to
+** The sqlite3_index_info structure and its substructures is used as part
+** of the [virtual table] interface to
 ** pass information into and receive the reply from the [xBestIndex]
 ** method of a [virtual table module].  The fields under **Inputs** are the
 ** inputs to xBestIndex and are read-only.  xBestIndex inserts its
@@ -4333,10 +4349,12 @@ struct sqlite3_module {
 **
 ** ^(The aConstraint[] array records WHERE clause constraints of the form:
 **
-** <pre>column OP expr</pre>
+** <blockquote>column OP expr</blockquote>
 **
 ** where OP is =, &lt;, &lt;=, &gt;, or &gt;=.)^  ^(The particular operator is
-** stored in aConstraint[].op.)^  ^(The index of the column is stored in
+** stored in aConstraint[].op using one of the
+** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^
+** ^(The index of the column is stored in
 ** aConstraint[].iColumn.)^  ^(aConstraint[].usable is TRUE if the
 ** expr on the right-hand side can be evaluated (and thus the constraint
 ** is usable) and false if it cannot.)^
@@ -4396,6 +4414,15 @@ struct sqlite3_index_info {
   int orderByConsumed;       /* True if output is already ordered */
   double estimatedCost;      /* Estimated cost of using this index */
 };
+
+/*
+** CAPI3REF: Virtual Table Constraint Operator Codes
+**
+** These macros defined the allowed values for the
+** [sqlite3_index_info].aConstraint[].op field.  Each value represents
+** an operator that is part of a constraint term in the wHERE clause of
+** a query that uses a [virtual table].
+*/
 #define SQLITE_INDEX_CONSTRAINT_EQ    2
 #define SQLITE_INDEX_CONSTRAINT_GT    4
 #define SQLITE_INDEX_CONSTRAINT_LE    8
@@ -4914,7 +4941,7 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*);
 ** it is passed a NULL pointer).
 **
 ** The xMutexInit() method must be threadsafe.  ^It must be harmless to
-** invoke xMutexInit() mutiple times within the same process and without
+** invoke xMutexInit() multiple times within the same process and without
 ** intervening calls to xMutexEnd().  Second and subsequent calls to
 ** xMutexInit() must be no-ops.
 **
@@ -5084,7 +5111,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
 ** CAPI3REF: SQLite Runtime Status
 **
 ** ^This interface is used to retrieve runtime status information
-** about the preformance of SQLite, and optionally to reset various
+** about the performance of SQLite, and optionally to reset various
 ** highwater marks.  ^The first argument is an integer code for
 ** the specific parameter to measure.  ^(Recognized integer codes
 ** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...].)^
@@ -5136,6 +5163,9 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF
 ** *pHighwater parameter to [sqlite3_status()] is of interest.  
 ** The value written into the *pCurrent parameter is undefined.</dd>)^
 **
+** ^(<dt>SQLITE_STATUS_MALLOC_COUNT</dt>
+** <dd>This parameter records the number of separate memory allocations.</dd>)^
+**
 ** ^(<dt>SQLITE_STATUS_PAGECACHE_USED</dt>
 ** <dd>This parameter returns the number of pages used out of the
 ** [pagecache memory allocator] that was configured using 
@@ -5197,6 +5227,7 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF
 #define SQLITE_STATUS_PARSER_STACK         6
 #define SQLITE_STATUS_PAGECACHE_SIZE       7
 #define SQLITE_STATUS_SCRATCH_SIZE         8
+#define SQLITE_STATUS_MALLOC_COUNT         9
 
 /*
 ** CAPI3REF: Database Connection Status
@@ -5206,7 +5237,7 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF
 ** database connection object to be interrogated.  ^The second argument
 ** is an integer constant, taken from the set of
 ** [SQLITE_DBSTATUS_LOOKASIDE_USED | SQLITE_DBSTATUS_*] macros, that
-** determiness the parameter to interrogate.  The set of 
+** determines the parameter to interrogate.  The set of 
 ** [SQLITE_DBSTATUS_LOOKASIDE_USED | SQLITE_DBSTATUS_*] macros is likely
 ** to grow in future releases of SQLite.
 **
@@ -5236,16 +5267,33 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r
 ** <dd>This parameter returns the number of lookaside memory slots currently
 ** checked out.</dd>)^
 **
-** <dt>SQLITE_DBSTATUS_CACHE_USED</dt>
-** <dd>^This parameter returns the approximate number of of bytes of heap
-** memory used by all pager caches associated with the database connection.
+** ^(<dt>SQLITE_DBSTATUS_CACHE_USED</dt>
+** <dd>This parameter returns the approximate number of of bytes of heap
+** memory used by all pager caches associated with the database connection.)^
 ** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0.
+**
+** ^(<dt>SQLITE_DBSTATUS_SCHEMA_USED</dt>
+** <dd>This parameter returns the approximate number of of bytes of heap
+** memory used to store the schema for all databases associated
+** with the connection - main, temp, and any [ATTACH]-ed databases.)^ 
+** ^The full amount of memory used by the schemas is reported, even if the
+** schema memory is shared with other database connections due to
+** [shared cache mode] being enabled.
+** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0.
+**
+** ^(<dt>SQLITE_DBSTATUS_STMT_USED</dt>
+** <dd>This parameter returns the approximate number of of bytes of heap
+** and lookaside memory used by all prepared statements associated with
+** the database connection.)^
+** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0.
 ** </dd>
 ** </dl>
 */
 #define SQLITE_DBSTATUS_LOOKASIDE_USED     0
 #define SQLITE_DBSTATUS_CACHE_USED         1
-#define SQLITE_DBSTATUS_MAX                1   /* Largest defined DBSTATUS */
+#define SQLITE_DBSTATUS_SCHEMA_USED        2
+#define SQLITE_DBSTATUS_STMT_USED          3
+#define SQLITE_DBSTATUS_MAX                3   /* Largest defined DBSTATUS */
 
 
 /*
@@ -5611,7 +5659,7 @@ typedef struct sqlite3_backup sqlite3_backup;
 **
 ** ^Each call to sqlite3_backup_step() sets two values inside
 ** the [sqlite3_backup] object: the number of pages still to be backed
-** up and the total number of pages in the source databae file.
+** up and the total number of pages in the source database file.
 ** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces
 ** retrieve these two values, respectively.
 **
@@ -5707,7 +5755,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p);
 ** blocked connection already has a registered unlock-notify callback,
 ** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is
 ** called with a NULL pointer as its second argument, then any existing
-** unlock-notify callback is cancelled. ^The blocked connections 
+** unlock-notify callback is canceled. ^The blocked connections 
 ** unlock-notify callback may also be canceled by closing the blocked
 ** connection using [sqlite3_close()].
 **
@@ -5789,7 +5837,7 @@ SQLITE_API int sqlite3_unlock_notify(
 **
 ** ^The [sqlite3_strnicmp()] API allows applications and extensions to
 ** compare the contents of two buffers containing UTF-8 strings in a
-** case-indendent fashion, using the same definition of case independence 
+** case-independent fashion, using the same definition of case independence 
 ** that SQLite uses internally when comparing identifiers.
 */
 SQLITE_API int sqlite3_strnicmp(const char *, const char *, int);
diff --git a/libgda/sqlite/virtual/gda-vprovider-data-model.c b/libgda/sqlite/virtual/gda-vprovider-data-model.c
index 2c20a4e..972041e 100644
--- a/libgda/sqlite/virtual/gda-vprovider-data-model.c
+++ b/libgda/sqlite/virtual/gda-vprovider-data-model.c
@@ -564,7 +564,6 @@ virtual_table_manage_real_data_model (VirtualTable *vtable)
 		}
 		else {
 			/* no random access => use a wrapper */
-			GdaDataModel *wrapper;
 			vtable->wrapper = gda_data_access_wrapper_new (vtable->td->real_model);
 		}
 	}
@@ -617,7 +616,7 @@ static int
 virtualNext (sqlite3_vtab_cursor *cur)
 {
 	VirtualCursor *cursor = (VirtualCursor*) cur;
-	VirtualTable *vtable = (VirtualTable*) cur->pVtab;
+	/*VirtualTable *vtable = (VirtualTable*) cur->pVtab;*/
 
 	TRACE ();
 
@@ -851,17 +850,13 @@ virtualSync (sqlite3_vtab *tab)
 static int
 virtualCommit (sqlite3_vtab *tab)
 {
-	VirtualTable *vtable = (VirtualTable *) tab;
-	
 	TRACE ();
 	return SQLITE_OK;
 }
 
 static int
 virtualRollback (sqlite3_vtab *tab)
-{
-	VirtualTable *vtable = (VirtualTable *) tab;
-	
+{	
 	TRACE ();
 	return SQLITE_OK;
 }
diff --git a/libgda/thread-wrapper/gda-thread-wrapper.c b/libgda/thread-wrapper/gda-thread-wrapper.c
index beaa767..f2514d5 100644
--- a/libgda/thread-wrapper/gda-thread-wrapper.c
+++ b/libgda/thread-wrapper/gda-thread-wrapper.c
@@ -249,13 +249,6 @@ static void gda_thread_wrapper_get_property (GObject *object,
 					     GValue *value,
 					     GParamSpec *pspec);
 
-enum {
-	DUMMY,
-	LAST_SIGNAL
-};
-
-static gint gda_thread_wrapper_signals[LAST_SIGNAL] = { 0 };
-
 /* properties */
 enum {
 	PROP_0
diff --git a/po/LINGUAS b/po/LINGUAS
index aa9ddd5..02eca56 100755
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -17,6 +17,7 @@ ga
 gl
 hr
 hu
+id
 it
 ja
 ko
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 9383b01..6d82a0a 100755
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -96,10 +96,8 @@ libgda-ui/data-entries/gdaui-formatted-entry.c
 libgda-ui/data-entries/gdaui-numeric-entry.c
 libgda-ui/data-entries/plugins/common-pict.c
 libgda-ui/data-entries/plugins/gda-sql.lang
-libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c
 libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c
 libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-pict.c
-libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c
 libgda-ui/data-entries/plugins/gdaui-entry-cidr.c
 libgda-ui/data-entries/plugins/gdaui-entry-filesel-spec.xml.in
 libgda-ui/data-entries/plugins/gdaui-entry-filesel.c
@@ -257,6 +255,7 @@ tools/browser/data-manager/data-console.c
 tools/browser/data-manager/data-favorite-selector.c
 tools/browser/data-manager/data-manager-perspective.c
 tools/browser/data-manager/data-source.c
+tools/browser/data-manager/data-source-editor.c
 tools/browser/data-manager/data-widget.c
 tools/browser/data-manager/ui-spec-editor.c
 tools/browser/data-manager/xml-spec-editor.c
diff --git a/po/cs.po b/po/cs.po
index 0b70077..b1d6a11 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -5,15 +5,16 @@
 # Michal Bukovjan <bukm centrum cz>, 2002.
 # Miloslav Trmac <mitr volny cz>, 2003, 2004, 2005.
 # Marek Ä?ernocký <marek manet cz>, 2010.
+#: ../libgda/gda-connection.c:372
 msgid ""
 msgstr ""
 "Project-Id-Version: libgda\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?";
-"product=libgda&component=general\n"
-"POT-Creation-Date: 2010-07-15 19:15+0000\n"
-"PO-Revision-Date: 2010-07-16 21:12+0200\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-08-23 23:14+0200\n"
+"PO-Revision-Date: 2010-08-06 23:09+0200\n"
 "Last-Translator: Marek Ä?ernocký <marek manet cz>\n"
 "Language-Team: Czech <gnome-cs-list gnome org>\n"
+"Language: cs\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -101,23 +102,23 @@ msgstr "Nelze spustit prohlížecí program"
 
 #. FIXME: add a notice somewhere in the UI
 #: ../control-center/dsn-properties-dialog.c:283
-#: ../libgda/gda-connection.c:1523 ../libgda/gda-data-model.c:1991
-#: ../libgda/gda-data-model.c:1999 ../libgda/gda-data-model-dir.c:382
+#: ../libgda/gda-connection.c:1523 ../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:1706
+#: ../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:509 ../libgda/gda-tree-mgr-select.c:188
+#: ../libgda/gda-set.c:553 ../libgda/gda-tree-mgr-select.c:188
 #: ../libgda/gda-tree-mgr-select.c:220
-#: ../libgda/sqlite/gda-sqlite-provider.c:2043
-#: ../libgda/sqlite/gda-sqlite-provider.c:2055
-#: ../libgda/sqlite/gda-sqlite-provider.c:2077
-#: ../libgda/sqlite/gda-sqlite-provider.c:2267
-#: ../libgda/sqlite/gda-sqlite-provider.c:2521
-#: ../libgda/sqlite/gda-sqlite-provider.c:2533
+#: ../libgda/sqlite/gda-sqlite-provider.c:2046
+#: ../libgda/sqlite/gda-sqlite-provider.c:2058
+#: ../libgda/sqlite/gda-sqlite-provider.c:2080
+#: ../libgda/sqlite/gda-sqlite-provider.c:2270
+#: ../libgda/sqlite/gda-sqlite-provider.c:2555
+#: ../libgda/sqlite/gda-sqlite-provider.c:2567
 #: ../libgda/thread-wrapper/gda-thread-provider.c:454
 #: ../libgda-ui/data-entries/common-bin.c:79
 #: ../libgda-ui/data-entries/common-bin.c:156
@@ -127,33 +128,34 @@ msgstr "Nelze spustit prohlížecí program"
 #: ../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:495 ../libgda-ui/gdaui-login.c:421
-#: ../providers/jdbc/gda-jdbc-provider.c:384
-#: ../providers/jdbc/gda-jdbc-provider.c:1330
-#: ../providers/jdbc/gda-jdbc-provider.c:1359
-#: ../providers/jdbc/gda-jdbc-provider.c:1378
+#: ../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
 #: ../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:1862
-#: ../providers/mysql/gda-mysql-provider.c:1877
+#: ../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:1700
-#: ../providers/postgres/gda-postgres-provider.c:1715
-#: ../providers/postgres/gda-postgres-util.c:87
-#: ../providers/postgres/gda-postgres-util.c:90
-#: ../tools/browser/auth-dialog.c:651 ../tools/browser/auth-dialog.c:654
-#: ../tools/browser/browser-connection.c:351
-#: ../tools/browser/browser-connection.c:411
-#: ../tools/browser/browser-connection.c:431
-#: ../tools/browser/browser-connection.c:605
-#: ../tools/browser/browser-connection.c:625
-#: ../tools/browser/browser-connection.c:833
-#: ../tools/browser/browser-window.c:805 ../tools/browser/browser-window.c:819
-#: ../tools/browser/browser-window.c:833 ../tools/browser/browser-window.c:945
-#: ../tools/browser/browser-window.c:986 ../tools/browser/login-dialog.c:239
+#: ../providers/postgres/gda-postgres-provider.c:1706
+#: ../providers/postgres/gda-postgres-provider.c:1721
+#: ../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:353
+#: ../tools/browser/browser-connection.c:419
+#: ../tools/browser/browser-connection.c:439
+#: ../tools/browser/browser-connection.c:623
+#: ../tools/browser/browser-connection.c:643
+#: ../tools/browser/browser-connection.c:851
+#: ../tools/browser/browser-window.c:842 ../tools/browser/browser-window.c:856
+#: ../tools/browser/browser-window.c:870 ../tools/browser/browser-window.c:986
+#: ../tools/browser/browser-window.c:1027 ../tools/browser/login-dialog.c:239
 #: ../tools/browser/main.c:96 ../tools/browser/main.c:110
 #: ../tools/browser/main.c:136
+#: ../tools/browser/data-manager/data-console.c:503
 #: ../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:629
@@ -165,12 +167,15 @@ msgstr "Nelze spustit prohlížecí program"
 #: ../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:601
-#: ../tools/browser/query-exec/query-result.c:257
-#: ../tools/browser/query-exec/query-result.c:478
+#: ../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:359
 #: ../tools/browser/schema-browser/relations-diagram.c:241
-#: ../tools/browser/schema-browser/table-info.c:454
+#: ../tools/browser/schema-browser/table-info.c:475
+#: ../tools/browser/schema-browser/table-info.c:528
+#: ../tools/browser/schema-browser/table-info.c:554
+#: ../tools/browser/schema-browser/table-info.c:848
 #: ../tools/browser/schema-browser/table-preferences.c:705
 #: ../tools/browser/schema-browser/table-preferences.c:778
 #: ../tools/gda-list-server-op.c:47 ../tools/gda-list-server-op.c:90
@@ -379,7 +384,7 @@ msgstr ""
 "potvrÄ?te otevÅ?ení pÅ?ipojení"
 
 #: ../control-center/main.c:57 ../libgda-ui/internal/utility.c:529
-#: ../tools/browser/support.c:137
+#: ../tools/browser/support.c:138
 msgid "Error:"
 msgstr "Chyba:"
 
@@ -391,7 +396,7 @@ msgstr "Nelze deklarovat nový zdroj dat"
 msgid "No valid data source info was created"
 msgstr "Nebyly vytvoÅ?eny žádné platné informace zdroje dat"
 
-#: ../control-center/main.c:184 ../tools/browser/browser-window.c:1028
+#: ../control-center/main.c:184 ../tools/browser/browser-window.c:1069
 msgid "Database access services for the GNOME Desktop"
 msgstr "Služby pro pÅ?ístupu k databázím pro pracovní prostÅ?edí GNOME"
 
@@ -627,8 +632,8 @@ msgstr "Zdroj dat %s nebyl nalezen v nastavení"
 msgid "Datasource configuration error: no provider specified"
 msgstr "Chyba nastavení zdroje dat: není urÄ?en žádný poskytovatel"
 
-#: ../libgda/gda-connection.c:1118 ../tools/browser/auth-dialog.c:392
-#: ../tools/browser/auth-dialog.c:428 ../tools/gda-sql.c:1309
+#: ../libgda/gda-connection.c:1118 ../tools/browser/auth-dialog.c:417
+#: ../tools/browser/auth-dialog.c:453 ../tools/gda-sql.c:1309
 #, c-format
 msgid "Malformed connection string '%s'"
 msgstr "Chybný pÅ?ipojovací Å?etÄ?zec â??%sâ??"
@@ -681,12 +686,12 @@ msgstr "PÅ?ipojení je uzavÅ?eno"
 msgid "Can't find task %u"
 msgstr "Nelze najít úlohu %u"
 
-#: ../libgda/gda-connection.c:2547 ../libgda/sqlite/gda-sqlite-provider.c:1005
+#: ../libgda/gda-connection.c:2547 ../libgda/sqlite/gda-sqlite-provider.c:1008
 #: ../libgda/thread-wrapper/gda-thread-provider.c:917
-#: ../providers/jdbc/gda-jdbc-provider.c:571
-#: ../providers/mysql/gda-mysql-provider.c:959
-#: ../providers/postgres/gda-postgres-provider.c:890
-#: ../providers/web/gda-web-provider.c:671
+#: ../providers/jdbc/gda-jdbc-provider.c:575
+#: ../providers/mysql/gda-mysql-provider.c:963
+#: ../providers/postgres/gda-postgres-provider.c:896
+#: ../providers/web/gda-web-provider.c:674
 msgid "Provider does not support asynchronous server operation"
 msgstr "Poskytovatel nepodporuje asynchronní serverové operace"
 
@@ -734,7 +739,7 @@ msgstr "Interní chyba: neplatný ovladaÄ? poskytovatele"
 #: ../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:3475
+#: ../libgda/gda-data-model-iter.c:1018 ../libgda/gda-data-proxy.c:3494
 #: ../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
@@ -790,8 +795,8 @@ msgstr "Zda může být datový model upravován"
 #: ../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:3424
-#: ../libgda/gda-data-proxy.c:3462 ../libgda/gda-data-select.c:1649
+#: ../libgda/gda-data-model-dsn-list.c:319 ../libgda/gda-data-proxy.c:3443
+#: ../libgda/gda-data-proxy.c:3481 ../libgda/gda-data-select.c:1649
 #: ../libgda/gda-data-select.c:1703
 #, c-format
 msgid "Row %d out of range (0-%d)"
@@ -800,8 +805,8 @@ msgstr "Å?ádek %d je mimo rozsah (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:3427
-#: ../libgda/gda-data-proxy.c:3465 ../libgda/gda-data-select.c:1652
+#: ../libgda/gda-data-model-dsn-list.c:322 ../libgda/gda-data-proxy.c:3446
+#: ../libgda/gda-data-proxy.c:3484 ../libgda/gda-data-select.c:1652
 #: ../libgda/gda-data-select.c:1706
 #, c-format
 msgid "Row %d not found (empty data model)"
@@ -858,91 +863,92 @@ msgstr "OÄ?ekávána hodnota GdaBinary, obdržena %s"
 msgid "Key modification is not supported"
 msgstr "Ã?prava klíÄ?ů není podporována"
 
-#: ../libgda/gda-data-model.c:617
+#: ../libgda/gda-data-model.c:620
 msgid "Data model does not support getting individual value"
 msgstr "Datový model nepodporuje získávání samostatných hodnot"
 
-#: ../libgda/gda-data-model.c:660 ../libgda/gda-data-model.c:670
+#: ../libgda/gda-data-model.c:663 ../libgda/gda-data-model.c:673
 #, c-format
 msgid "Data model returned value of invalid '%s' type"
 msgstr "Hodnota vrácená datovým modelem je neplatného typu â??%sâ??"
 
-#: ../libgda/gda-data-model.c:667
+#: ../libgda/gda-data-model.c:670
 msgid "Data model returned invalid NULL value"
 msgstr "Datový model vrátil neplatnou prázdnou (NULL) hodnotu"
 
-#: ../libgda/gda-data-model.c:727
+#: ../libgda/gda-data-model.c:730
 msgid "Data model does not support setting individual value"
 msgstr "Datový model nepodporuje nastavování samostatných hodnot"
 
-#: ../libgda/gda-data-model.c:760
+#: ../libgda/gda-data-model.c:763
 msgid "Data model does not support setting values"
 msgstr "Datový model nepodporuje nastavování hodnot"
 
-#: ../libgda/gda-data-model.c:823 ../libgda/gda-data-model.c:857
+#: ../libgda/gda-data-model.c:826 ../libgda/gda-data-model.c:860
 msgid "Data model does not support row append"
 msgstr "Datový model nepodporuje pÅ?idávání Å?ádků"
 
-#: ../libgda/gda-data-model.c:848
+#: ../libgda/gda-data-model.c:851
 msgid "Model does not allow row insertion"
 msgstr "Model neumožÅ?uje vkládání Å?ádků"
 
-#: ../libgda/gda-data-model.c:883
+#: ../libgda/gda-data-model.c:886
 msgid "Model does not allow row deletion"
 msgstr "Model neumožÅ?uje mazání Å?ádků"
 
-#: ../libgda/gda-data-model.c:892
+#: ../libgda/gda-data-model.c:895
 msgid "Data model does not support row removal"
 msgstr "Datový model nepodporuje odstraÅ?ování Å?ádků"
 
-#: ../libgda/gda-data-model.c:1034 ../libgda/gda-data-model.c:1074
-#: ../libgda/gda-data-model.c:1088
+#: ../libgda/gda-data-model.c:1038 ../libgda/gda-data-model.c:1079
+#: ../libgda/gda-data-model.c:1093
 #, c-format
 msgid "The '%s' parameter must hold a string value, ignored."
 msgstr "Parametr â??%sâ?? musí obsahovat Å?etÄ?zcovou hodnotu, ignorováno."
 
-#: ../libgda/gda-data-model.c:1097 ../libgda/gda-data-model.c:1107
-#: ../libgda/gda-data-model.c:1145 ../libgda/gda-data-model.c:1237
+#: ../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
 #, c-format
 msgid "The '%s' parameter must hold a boolean value, ignored."
 msgstr "Parametr â??%sâ?? musí obsahovat pravdivostní hodnotu, ignorováno."
 
-#: ../libgda/gda-data-model.c:1245
+#: ../libgda/gda-data-model.c:1261
 #, c-format
 msgid "File '%s' already exists"
 msgstr "Soubor â??%sâ?? již existuje"
 
-#: ../libgda/gda-data-model.c:1361
+#: ../libgda/gda-data-model.c:1401
 msgid "Exported Data"
 msgstr "Exportovaná data"
 
-#: ../libgda/gda-data-model.c:1478
+#: ../libgda/gda-data-model.c:1518
 #, c-format
 msgid "Expected tag <gda_value> or <gda_array_value>, got <%s>, ignoring"
 msgstr ""
 "OÄ?ekávána znaÄ?ka <gda_value> nebo <gda_array_value>, obdržena <%s>, ignoruje "
 "se"
 
-#: ../libgda/gda-data-model.c:1509
+#: ../libgda/gda-data-model.c:1549
 msgid "Cannot retrieve column data type (type is UNKNOWN or not specified)"
 msgstr ""
 "Nelze získat datový typ sloupce (typ je UNKNOWN - neznámý nebo není urÄ?en)"
 
-#: ../libgda/gda-data-model.c:1595
+#: ../libgda/gda-data-model.c:1635
 #, c-format
 msgid "Expected tag <gda_array_data>, got <%s>"
 msgstr "OÄ?ekávána znaÄ?ka <gda_array_data>, obdržena <%s>"
 
-#: ../libgda/gda-data-model.c:1658
+#: ../libgda/gda-data-model.c:1698
 msgid "Could not get an iterator for source data model"
 msgstr "Nelze získat iterátor pro zdrojový datový model"
 
-#: ../libgda/gda-data-model.c:1675
+#: ../libgda/gda-data-model.c:1715
 #, c-format
 msgid "Inexistent column in source data model: %d"
 msgstr "Neexistující sloupec ve zdrojovém datovém modelu: %d"
 
-#: ../libgda/gda-data-model.c:1689
+#: ../libgda/gda-data-model.c:1729
 #, c-format
 msgid ""
 "Destination column %d can't be NULL but has no correspondence in the source "
@@ -951,35 +957,35 @@ msgstr ""
 "Cílový sloupec %d nemůže být prázdný (NULL), což ale neodpovídá zdrojovému "
 "datovému modelu"
 
-#: ../libgda/gda-data-model.c:1699
+#: ../libgda/gda-data-model.c:1739
 #, c-format
 msgid ""
 "Destination column %d has a gda type (%s) incompatible with source column %d "
 "type (%s)"
 msgstr ""
-"Cílový sloupec %d má typ gda (%s) nekompatibilní s typem zdrojového sloupce %"
-"d (%s)"
+"Cílový sloupec %d má typ gda (%s) nekompatibilní s typem zdrojového sloupce "
+"%d (%s)"
 
-#: ../libgda/gda-data-model.c:1796
+#: ../libgda/gda-data-model.c:1836
 #, c-format
 msgid "Can't transform '%s' from GDA type %s to GDA type %s"
 msgstr "Nelze pÅ?evést â??%sâ?? z typu GDA %s na typ GDA %s"
 
-#: ../libgda/gda-data-model.c:1990
+#: ../libgda/gda-data-model.c:2030
 #, c-format
 msgid "Could not dump data model's attributes: %s"
 msgstr "Nelze vypsat atributy datového modelu: %s"
 
-#: ../libgda/gda-data-model.c:1998
+#: ../libgda/gda-data-model.c:2038
 #, c-format
 msgid "Could not dump data model's contents: %s"
 msgstr "Nelze vypsat obsah datového modelu: %s"
 
-#: ../libgda/gda-data-model.c:2231
+#: ../libgda/gda-data-model.c:2286
 msgid "Data model does not support backward cursor move, not displaying data"
 msgstr "Datový model nepodporuje zpÄ?tný posun kurzoru, data se nezobrazí"
 
-#: ../libgda/gda-data-model.c:2350
+#: ../libgda/gda-data-model.c:2405
 #, c-format
 msgid "(%d row)\n"
 msgid_plural "(%d rows)\n"
@@ -1088,7 +1094,7 @@ msgid "Character conversion at line %d, error: %s"
 msgstr "PÅ?evod znaků na Å?ádku %d, chyba: %s"
 
 #: ../libgda/gda-data-model-import.c:904
-#: ../libgda/sqlite/gda-sqlite-provider.c:688
+#: ../libgda/sqlite/gda-sqlite-provider.c:691
 #: ../providers/bdb/gda-bdb-provider.c:208
 #: ../tools/browser/common/gdaui-data-import.c:177
 msgid "no detail"
@@ -1188,7 +1194,7 @@ msgstr "GdaDataModel zamítl zmÄ?nit hodnotu"
 msgid "GdaDataProxy can't handle non random access data models"
 msgstr "GdaDataProxy neumí obsluhovat datový model s nenáhodným pÅ?ístupem"
 
-#: ../libgda/gda-data-proxy.c:1538 ../libgda/gda-data-proxy.c:3881
+#: ../libgda/gda-data-proxy.c:1538 ../libgda/gda-data-proxy.c:3899
 msgid ""
 "The first row is an empty row artificially prepended and cannot be removed"
 msgstr "První Å?ádek je umÄ?le pÅ?edÅ?azený prázdný Å?ádek a nemůže být odstranÄ?n"
@@ -1227,22 +1233,22 @@ msgstr "Chyba ve výrazu filtru"
 msgid "Incorrect filter expression"
 msgstr "Chybný výraz filtru"
 
-#: ../libgda/gda-data-proxy.c:3636
+#: ../libgda/gda-data-proxy.c:3654
 msgid ""
 "The first row is an empty row artificially prepended and cannot be altered"
 msgstr "První Å?ádek je umÄ?le pÅ?edÅ?azený prázdný Å?ádek a nemůže být zmÄ?nÄ?n"
 
-#: ../libgda/gda-data-proxy.c:3658
+#: ../libgda/gda-data-proxy.c:3676
 #, c-format
 msgid "Wrong value type: expected '%s' and got '%s'"
 msgstr "Nesprávný typ hodnoty: oÄ?ekáváno â??%sâ?? a obdrženo â??%sâ??"
 
-#: ../libgda/gda-data-proxy.c:3744
+#: ../libgda/gda-data-proxy.c:3762
 #, c-format
 msgid "Trying to change read-only column: %d"
 msgstr "Pokus o zmÄ?nu sloupce pouze ke Ä?tení: %d"
 
-#: ../libgda/gda-data-proxy.c:3781
+#: ../libgda/gda-data-proxy.c:3799
 #, c-format
 msgid "Value type mismatch %s instead of %s"
 msgstr "Typ hodnoty neodpovídá typu %s namísto typu %s"
@@ -1436,7 +1442,7 @@ msgstr "Neplatný typ"
 msgid "CREATE TABLE operation is not supported by the database server"
 msgstr "Operace CREATE TABLE není databázovým serverem podporována"
 
-#: ../libgda/gda-holder.c:487 ../libgda/gda-set.c:508
+#: ../libgda/gda-holder.c:487 ../libgda/gda-set.c:552
 #, c-format
 msgid "Unable to set holder's value: %s"
 msgstr "Nelze nastavit hodnotu držitele: %s"
@@ -1476,7 +1482,7 @@ msgstr ""
 "(%s): Nesprávný typ hodnoty: oÄ?ekáván typ â??%sâ??, zatímco typ hodnoty je â??%sâ??"
 
 #. break holder's binding because type differ
-#: ../libgda/gda-holder.c:1520
+#: ../libgda/gda-holder.c:1522
 #, c-format
 msgid ""
 "Cannot bind holders if their type is not the same, breaking existing bind "
@@ -1485,11 +1491,11 @@ msgstr ""
 "Nelze svázat držitele, pokud jejich typ není stejný, pÅ?eruÅ¡uje se stávající "
 "vazba, kdy â??%sâ?? bylo navázáno na â??%sâ??"
 
-#: ../libgda/gda-holder.c:1565
+#: ../libgda/gda-holder.c:1567
 msgid "Cannot bind holders if their type is not the same"
 msgstr "Nelze svázat držitele, pokud jejich typ není stejný"
 
-#: ../libgda/gda-holder.c:1705
+#: ../libgda/gda-holder.c:1707
 #, c-format
 msgid "Could not change GdaHolder to match value change in bound GdaHolder: %s"
 msgstr ""
@@ -2072,8 +2078,8 @@ msgstr "DoplÅ?ující atributy"
 #: ../providers/mysql/mysql_specs_drop_index.xml.in.h:1
 #: ../providers/postgres/postgres_specs_drop_index.xml.in.h:2
 #: ../providers/sqlite/sqlite_specs_drop_index.xml.in.h:3
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:158
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:164
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:166
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:172
 msgid "Index"
 msgstr "Index"
 
@@ -2218,39 +2224,47 @@ msgstr "Datový model pro schéma má nesprávný název sloupce: â??%sâ?? míst
 msgid "Data model for schema has a wrong gda type: %s instead of %s"
 msgstr "Datový model pro schéma má nesprávný typ gda: %s místo %s"
 
-#: ../libgda/gda-set.c:500 ../libgda/gda-set.c:601
+#: ../libgda/gda-set.c:544 ../libgda/gda-set.c:645
 #, c-format
 msgid "%s() does not handle values of type '%s'."
 msgstr "%s() neobsluhuje hodnoty typu â??%sâ??"
 
-#: ../libgda/gda-set.c:555
+#: ../libgda/gda-set.c:599
 #, c-format
 msgid "GdaHolder with ID '%s' not found in set"
 msgstr "GdaHolder s ID â??%sâ?? nebyl nalezen v sadÄ?"
 
-#: ../libgda/gda-set.c:735
+#: ../libgda/gda-set.c:779
 #, c-format
 msgid "Spec's root node != 'data-set-spec': '%s'"
 msgstr "KoÅ?enový uzel spec je jiný než â??data-set-specâ??: â??%sâ??"
 
-#: ../libgda/gda-set.c:774
+#: ../libgda/gda-set.c:818
 #, c-format
 msgid "Missing node <parameters>: '%s'"
 msgstr "Schází uzel <parameters>: â??%sâ??"
 
-#: ../libgda/gda-set.c:984
+#: ../libgda/gda-set.c:1031
 #, c-format
 msgid "Data set does not allow modifications"
 msgstr "Model neumožÅ?uje úpravy"
 
-#: ../libgda/gda-set.c:1218
+#: ../libgda/gda-set.c:1276
 msgid "GdaHolder needs to have an ID"
 msgstr "GdaHolder musí mít nÄ?jaké ID"
 
-#: ../libgda/gda-set.c:1324
+#: ../libgda/gda-set.c:1386
 msgid "One or more values are invalid"
 msgstr "Jedna nebo více hodnot je neplatných"
 
+#: ../libgda/gda-set.c:1603 ../libgda/gda-set.c:1616
+msgid ""
+"Replacing data model must have the same characteristics as the data model it "
+"replaces"
+msgstr ""
+"Nahrazující datový model musí mít stejné charakteristiky jako datový model, "
+"který je nahrazován"
+
 #: ../libgda/gda-sql-builder.c:294 ../libgda/gda-sql-builder.c:1399
 #, c-format
 msgid "Unknown part ID %u"
@@ -2324,38 +2338,38 @@ msgstr "Schází kód SQL"
 msgid "No data handler for type '%s'"
 msgstr "Žádná obsluha pro typ â??%sâ??"
 
-#: ../libgda/gda-statement.c:1217
+#: ../libgda/gda-statement.c:1219
 #, c-format
 msgid "Wrong parameter type for '%s': expected type '%s' and got '%s'"
 msgstr "Nesprávný typ parametru pro â??%sâ??: oÄ?ekáván typ â??%sâ?? a obdržen â??%sâ??"
 
-#: ../libgda/gda-statement.c:1229
+#: ../libgda/gda-statement.c:1231
 #, c-format
 msgid "Missing parameter '%s'"
 msgstr "Schází parametr â??%sâ??"
 
-#: ../libgda/gda-statement.c:1241 ../libgda/sqlite/gda-sqlite-provider.c:2445
-#: ../providers/jdbc/gda-jdbc-provider.c:1343
-#: ../providers/mysql/gda-mysql-provider.c:2094
-#: ../providers/postgres/gda-postgres-provider.c:1976
-#: ../providers/web/gda-web-provider.c:1505
+#: ../libgda/gda-statement.c:1243 ../libgda/sqlite/gda-sqlite-provider.c:2448
+#: ../providers/jdbc/gda-jdbc-provider.c:1347
+#: ../providers/mysql/gda-mysql-provider.c:2188
+#: ../providers/postgres/gda-postgres-provider.c:1982
+#: ../providers/web/gda-web-provider.c:1508
 #, c-format
 msgid "Parameter '%s' is invalid"
 msgstr "Parametr â??%sâ?? není platný"
 
-#: ../libgda/gda-statement.c:1287
+#: ../libgda/gda-statement.c:1289
 msgid "Unnamed parameter"
 msgstr "Nepojmenovaný parametr"
 
-#: ../libgda/gda-statement.c:1505
+#: ../libgda/gda-statement.c:1507
 msgid "Malformed table name"
 msgstr "Chybný název tabulky"
 
-#: ../libgda/gda-statement.c:1954
+#: ../libgda/gda-statement.c:1956
 msgid "Join is not in a FROM statement"
 msgstr "Spojení (join) není v Ä?ásti pÅ?íkazu FROM"
 
-#: ../libgda/gda-statement.c:1961
+#: ../libgda/gda-statement.c:1963
 msgid "Could not find target the join is for"
 msgstr "Nelze nají cíl, ke kterému se má spojit (join)"
 
@@ -2385,7 +2399,7 @@ msgstr "Nelze získat název sloupce"
 
 #: ../libgda/gda-tree-mgr-label.c:207
 #: ../tools/browser/canvas/browser-canvas-table.c:309
-#: ../tools/browser/data-manager/data-source.c:869
+#: ../tools/browser/data-manager/data-source.c:914
 msgid "No name"
 msgstr "Žádný název"
 
@@ -2435,39 +2449,54 @@ msgstr "Å?íká, zda je GdaTree seznamem nebo stromem"
 msgid "Path format error: %s"
 msgstr "Chyba formátu cesty: %s"
 
-#: ../libgda/gda-util.c:594
+#: ../libgda/gda-util.c:596
 #, c-format
 msgid "Field number %d not found in source named '%s'"
 msgstr "Ä?íslo pole %d nebylo nalezeno ve zdroji s názvem â??%sâ??"
 
-#: ../libgda/gda-util.c:781
+#: ../libgda/gda-util.c:783
 msgid "SELECT statement has no FROM part"
 msgstr "PÅ?íkaz SELECT nemá Ä?ást FROM"
 
-#: ../libgda/gda-util.c:786 ../libgda/gda-util.c:793
+#: ../libgda/gda-util.c:788 ../libgda/gda-util.c:795
 msgid "SELECT statement involves more than one table or expression"
 msgstr "PÅ?íkaz SELECT zahrnuje více než jednu tabulku nebo výraz"
 
-#: ../libgda/gda-util.c:803
+#: ../libgda/gda-util.c:805
 msgid "Can only build modification statement for tables"
 msgstr "Je možné sestavit jen pÅ?íkaz pro zmÄ?nu tabulek"
 
-#: ../libgda/gda-util.c:837 ../libgda/gda-util.c:845
+#: ../libgda/gda-util.c:839 ../libgda/gda-util.c:847
 msgid "Table does not have any primary key"
 msgstr "Tabulka nemá žádný primární klíÄ?"
 
-#: ../libgda/gda-util.c:871
+#: ../libgda/gda-util.c:873
 msgid "Table's primary key is not selected"
 msgstr "Není vybrán primární klíÄ? tabulky"
 
-#: ../libgda/gda-util.c:1120
+#: ../libgda/gda-util.c:1122
 msgid "Could not compute any field to insert into"
 msgstr "Nelze vypoÄ?ítat nÄ?které pole, které se má vkládat"
 
-#: ../libgda/gda-util.c:1183
+#: ../libgda/gda-util.c:1185
 msgid "Missing table name in UPDATE statement"
 msgstr "Schází název tabulky v pÅ?íkazu UPDATE"
 
+#: ../libgda/gda-util.c:1264
+#, c-format
+msgid "Can't rewrite UPDATE statement to handle default values"
+msgstr "Nelze pÅ?epsat pÅ?íkaz UPDATE, aby obsluhoval výchozí hodnoty"
+
+#: ../libgda/gda-util.c:1316 ../libgda/gda-util.c:1373
+#: ../libgda/gda-util.c:1413 ../libgda/sqlite/gda-sqlite-provider.c:2429
+#: ../providers/jdbc/gda-jdbc-provider.c:1318
+#: ../providers/mysql/gda-mysql-provider.c:2168
+#: ../providers/postgres/gda-postgres-provider.c:1964
+#: ../providers/web/gda-web-provider.c:1488
+#, c-format
+msgid "Missing parameter '%s' to execute query"
+msgstr "K provedení dotazu schází parametr â??%sâ??"
+
 #: ../libgda/gda-xa-transaction.c:159
 msgid "Global transaction ID can not have more than 64 bytes"
 msgstr "ID globální transakce nemůže mít více než 64 bajtů"
@@ -2585,29 +2614,29 @@ msgstr ""
 "Navázání rozsáhlých binárních dat (BLOB) není pro tento typ pÅ?íkazu "
 "podporováno"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:507
+#: ../libgda/sqlite/gda-sqlite-provider.c:510
 msgid "Can't find libsqlite3."
 msgstr "Nelze najít libsqlite3."
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:557
+#: ../libgda/sqlite/gda-sqlite-provider.c:560
 #: ../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:350
+#: ../providers/jdbc/gda-jdbc-provider.c:354
 #: ../providers/mdb/gda-mdb-provider.c:230
-#: ../providers/mysql/gda-mysql-provider.c:574
-#: ../providers/postgres/gda-postgres-provider.c:425
-#: ../providers/web/gda-web-provider.c:338
+#: ../providers/mysql/gda-mysql-provider.c:578
+#: ../providers/postgres/gda-postgres-provider.c:431
+#: ../providers/web/gda-web-provider.c:341
 msgid "Provider does not support asynchronous connection open"
 msgstr "Poskytovatel nepodporuje otevÅ?ení asynchronního pÅ?ipojení"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:579
+#: ../libgda/sqlite/gda-sqlite-provider.c:582
 #: ../providers/mdb/gda-mdb-provider.c:246
 msgid "The connection string must contain DB_DIR and DB_NAME values"
 msgstr "PÅ?ipojovací Å?etÄ?zec musí obsahovat hodnoty DB_DIR a DB_NAME"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:606
-#: ../libgda/sqlite/gda-sqlite-provider.c:614
+#: ../libgda/sqlite/gda-sqlite-provider.c:609
+#: ../libgda/sqlite/gda-sqlite-provider.c:617
 #, c-format
 msgid ""
 "The connection string format has changed: replace URI with DB_DIR (the path "
@@ -2617,97 +2646,97 @@ msgstr ""
 "PÅ?ipojovací Å?etÄ?zec byl zmÄ?nÄ?n: nahraÄ?te adresu URI za DB_DIR (cestu k "
 "souboru s databází) a DB_NAME (soubor s databází bez â??%sâ?? na konci)."
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:629
+#: ../libgda/sqlite/gda-sqlite-provider.c:632
 #: ../providers/mdb/gda-mdb-provider.c:288
 msgid ""
 "The DB_DIR part of the connection string must point to a valid directory"
 msgstr "Ä?ást DB_DIR pÅ?ipojovací Å?etÄ?zce musí ukazovat na platnou složku"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:687
+#: ../libgda/sqlite/gda-sqlite-provider.c:690
 #, c-format
 msgid "Could not set empty_result_callbacks SQLite option: %s"
 msgstr "Nelze nastavit volbu SQLite empty_result_callbacks: %s"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:902
-#: ../libgda/sqlite/gda-sqlite-provider.c:941
+#: ../libgda/sqlite/gda-sqlite-provider.c:905
+#: ../libgda/sqlite/gda-sqlite-provider.c:944
 #: ../libgda-ui/data-entries/plugins/libmain.c:89
 #: ../libgda-ui/data-entries/plugins/libmain.c:127
 #: ../libgda-ui/data-entries/plugins/libmain.c:155
 #: ../libgda-ui/data-entries/plugins/libmain.c:162
 #: ../libgda-ui/data-entries/plugins/libmain.c:237
 #: ../libgda-ui/data-entries/plugins/libmain.c:261
-#: ../providers/mysql/gda-mysql-provider.c:843
-#: ../providers/mysql/gda-mysql-provider.c:884
-#: ../providers/postgres/gda-postgres-provider.c:763
-#: ../providers/postgres/gda-postgres-provider.c:819
+#: ../providers/mysql/gda-mysql-provider.c:847
+#: ../providers/mysql/gda-mysql-provider.c:888
+#: ../providers/postgres/gda-postgres-provider.c:769
+#: ../providers/postgres/gda-postgres-provider.c:825
 #, c-format
 msgid "Missing spec. file '%s'"
 msgstr "Schází soubor spec. â??%sâ??"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:1071
+#: ../libgda/sqlite/gda-sqlite-provider.c:1074
 msgid "Missing database name or directory"
 msgstr "Schází název databáze nebo složka"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:1097
-#: ../providers/postgres/gda-postgres-provider.c:1019
-#: ../providers/postgres/gda-postgres-provider.c:1020
+#: ../libgda/sqlite/gda-sqlite-provider.c:1100
+#: ../providers/postgres/gda-postgres-provider.c:1025
+#: ../providers/postgres/gda-postgres-provider.c:1026
 msgid "Transactions are not supported in read-only mode"
 msgstr "Transakce nejsou podporovány v režimu pouze pro Ä?tení"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:1930
-#: ../providers/jdbc/gda-jdbc-provider.c:1111
-#: ../providers/postgres/gda-postgres-provider.c:1555
-#: ../providers/web/gda-web-provider.c:1256
+#: ../libgda/sqlite/gda-sqlite-provider.c:1933
+#: ../providers/jdbc/gda-jdbc-provider.c:1115
+#: ../providers/postgres/gda-postgres-provider.c:1561
+#: ../providers/web/gda-web-provider.c:1259
 msgid "Unnamed parameter is not allowed in prepared statements"
 msgstr "Nepojmenovaný parametr není v pÅ?edpÅ?ipraveném pÅ?íkazu dovolen"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2042
-#: ../libgda/sqlite/gda-sqlite-provider.c:2054
-#: ../providers/mysql/gda-mysql-provider.c:1861
-#: ../providers/postgres/gda-postgres-provider.c:1699
+#: ../libgda/sqlite/gda-sqlite-provider.c:2045
+#: ../libgda/sqlite/gda-sqlite-provider.c:2057
+#: ../providers/mysql/gda-mysql-provider.c:1955
+#: ../providers/postgres/gda-postgres-provider.c:1705
 #, c-format
 msgid "Can't build SELECT statement to get last inserted row: %s)"
 msgstr ""
 "Nelze sestavit pÅ?íkaz SELECT pro získání posledního vloženého Å?ádku: %s)"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2076
-#: ../providers/mysql/gda-mysql-provider.c:1876
-#: ../providers/postgres/gda-postgres-provider.c:1714
+#: ../libgda/sqlite/gda-sqlite-provider.c:2079
+#: ../providers/mysql/gda-mysql-provider.c:1970
+#: ../providers/postgres/gda-postgres-provider.c:1720
 #, c-format
 msgid "Can't execute SELECT statement to get last inserted row: %s"
 msgstr "Nelze provést pÅ?íkaz SELECT pro získání posledního vloženého Å?ádku: %s"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2089
-#: ../providers/mysql/gda-mysql-provider.c:1889
-#: ../providers/postgres/gda-postgres-provider.c:1727
+#: ../libgda/sqlite/gda-sqlite-provider.c:2092
+#: ../providers/mysql/gda-mysql-provider.c:1983
+#: ../providers/postgres/gda-postgres-provider.c:1733
 msgid "SELECT statement to get last inserted row did not return any row"
 msgstr ""
 "PÅ?íkaz SELECT pro získání posledního vloženého Å?ádku nevrátil žádný Å?ádek"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2093
-#: ../providers/mysql/gda-mysql-provider.c:1893
-#: ../providers/postgres/gda-postgres-provider.c:1731
+#: ../libgda/sqlite/gda-sqlite-provider.c:2096
+#: ../providers/mysql/gda-mysql-provider.c:1987
+#: ../providers/postgres/gda-postgres-provider.c:1737
 #, c-format
 msgid "SELECT statement to get last inserted row returned too many (%d) rows"
 msgstr ""
-"PÅ?íkaz SELECT pro získání posledního vloženého Å?ádku vrátil pÅ?íliÅ¡ mnoho (%"
-"d) Å?ádků"
+"PÅ?íkaz SELECT pro získání posledního vloženého Å?ádku vrátil pÅ?íliÅ¡ mnoho "
+"(%d) Å?ádků"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2158
+#: ../libgda/sqlite/gda-sqlite-provider.c:2161
 msgid "Prepared statement has no associated GdaStatement"
 msgstr "PÅ?edpÅ?ipravený pÅ?íkaz nemá odpovídající GdaStatment"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2198
-#: ../libgda/sqlite/gda-sqlite-provider.c:2235
+#: ../libgda/sqlite/gda-sqlite-provider.c:2201
+#: ../libgda/sqlite/gda-sqlite-provider.c:2238
 msgid "Can't create SQLite BLOB handle"
 msgstr "Nelze vytvoÅ?it obsluhu rozsáhlého objektu BLOB z SQLite"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2202
-#: ../libgda/sqlite/gda-sqlite-provider.c:2240
+#: ../libgda/sqlite/gda-sqlite-provider.c:2205
+#: ../libgda/sqlite/gda-sqlite-provider.c:2243
 msgid "Can't write to SQLite's BLOB"
 msgstr "Nelze zapisovat do binárního objektu BLOB databáze SQLite"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2225
+#: ../libgda/sqlite/gda-sqlite-provider.c:2228
 #, c-format
 msgid ""
 "Can't obtain SQLite BLOB handle (reported type is '%s'), please report this "
@@ -2717,70 +2746,69 @@ msgstr ""
 "â??%sâ??), nahlaste to prosím jako chybu na http://bugzilla.gnome.org/ pro "
 "produkt â??libgdaâ??."
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2250
+#: ../libgda/sqlite/gda-sqlite-provider.c:2253
 msgid "Can't identify the ROWID of the blob to fill"
 msgstr ""
 "Nelze zjistit ROWID rozsáhlých binárních dat BLOB, která se mají vyplnit"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2298
-#: ../providers/jdbc/gda-jdbc-provider.c:1209
-#: ../providers/mysql/gda-mysql-provider.c:1982
-#: ../providers/postgres/gda-postgres-provider.c:1826
-#: ../providers/web/gda-web-provider.c:1389
+#: ../libgda/sqlite/gda-sqlite-provider.c:2301
+#: ../providers/jdbc/gda-jdbc-provider.c:1213
+#: ../providers/mysql/gda-mysql-provider.c:2076
+#: ../providers/postgres/gda-postgres-provider.c:1832
+#: ../providers/web/gda-web-provider.c:1392
 msgid "Provider does not support asynchronous statement execution"
 msgstr "Poskytovatel nepodporuje asynchronní provádÄ?ní pÅ?íkazů"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2366
+#: ../libgda/sqlite/gda-sqlite-provider.c:2369
 #: ../tools/browser/mgr-favorites.c:217 ../tools/browser/mgr-favorites.c:259
 msgid "Empty statement"
 msgstr "Prázdný pÅ?íkaz"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2408
 #: ../libgda/sqlite/gda-sqlite-provider.c:2411
-#: ../providers/jdbc/gda-jdbc-provider.c:1296
-#: ../providers/jdbc/gda-jdbc-provider.c:1299
-#: ../providers/mysql/gda-mysql-provider.c:2056
-#: ../providers/mysql/gda-mysql-provider.c:2059
-#: ../providers/postgres/gda-postgres-provider.c:1940
-#: ../providers/postgres/gda-postgres-provider.c:1943
-#: ../providers/web/gda-web-provider.c:1467
+#: ../libgda/sqlite/gda-sqlite-provider.c:2414
+#: ../providers/jdbc/gda-jdbc-provider.c:1300
+#: ../providers/jdbc/gda-jdbc-provider.c:1303
+#: ../providers/mysql/gda-mysql-provider.c:2150
+#: ../providers/mysql/gda-mysql-provider.c:2153
+#: ../providers/postgres/gda-postgres-provider.c:1946
+#: ../providers/postgres/gda-postgres-provider.c:1949
 #: ../providers/web/gda-web-provider.c:1470
+#: ../providers/web/gda-web-provider.c:1473
 #, c-format
 msgid "Missing parameter(s) to execute query"
 msgstr "K provedení dotazu schází parametr(y)"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2426
-#: ../providers/jdbc/gda-jdbc-provider.c:1314
-#: ../providers/mysql/gda-mysql-provider.c:2074
-#: ../providers/postgres/gda-postgres-provider.c:1958
-#: ../providers/web/gda-web-provider.c:1485
-#, c-format
-msgid "Missing parameter '%s' to execute query"
-msgstr "K provedení dotazu schází parametr â??%sâ??"
+#: ../libgda/sqlite/gda-sqlite-provider.c:2473
+#: ../providers/jdbc/gda-jdbc-provider.c:1382
+#: ../providers/mysql/gda-mysql-provider.c:2214
+#: ../providers/postgres/gda-postgres-provider.c:2007
+#: ../providers/web/gda-web-provider.c:1537
+msgid "Can't rewrite statement handle default values"
+msgstr "Nelze pÅ?epsat pÅ?íkaz, aby obsluhoval výchozí hodnoty"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2503
-#: ../providers/mysql/gda-mysql-provider.c:2223
+#: ../libgda/sqlite/gda-sqlite-provider.c:2537
+#: ../providers/mysql/gda-mysql-provider.c:2346
 msgid "Can't get BLOB's length"
 msgstr "Nelze získat délku rozsáhlých binárních dat BLOB"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2505
-#: ../providers/mysql/gda-mysql-provider.c:2225
+#: ../libgda/sqlite/gda-sqlite-provider.c:2539
+#: ../providers/mysql/gda-mysql-provider.c:2348
 msgid "BLOB is too big"
 msgstr "Rozsáhlá binární data BLOB jsou pÅ?íliÅ¡ velká"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2587
+#: ../libgda/sqlite/gda-sqlite-provider.c:2621
 #, c-format
 msgid "Non handled data type '%s'"
 msgstr "Neobsluhovaný datový typ â??%sâ??"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2755
-#: ../libgda/sqlite/gda-sqlite-provider.c:2776
-#: ../libgda/sqlite/gda-sqlite-provider.c:2842
+#: ../libgda/sqlite/gda-sqlite-provider.c:2805
+#: ../libgda/sqlite/gda-sqlite-provider.c:2826
+#: ../libgda/sqlite/gda-sqlite-provider.c:2892
 msgid "Function requires one argument"
 msgstr "Funkce vyžaduje jeden parametr"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2808
-#: ../libgda/sqlite/gda-sqlite-provider.c:2874
+#: ../libgda/sqlite/gda-sqlite-provider.c:2858
+#: ../libgda/sqlite/gda-sqlite-provider.c:2924
 msgid "Function requires two arguments"
 msgstr "Funkce vyžaduje dva parametry"
 
@@ -3272,7 +3300,7 @@ msgid "Data size"
 msgstr "Velikost dat"
 
 #: ../libgda-ui/data-entries/common-bin.c:301
-#: ../providers/mysql/gda-mysql-provider.c:619
+#: ../providers/mysql/gda-mysql-provider.c:623
 #: ../providers/mysql/gda-mysql-util.c:67
 msgid "Unknown"
 msgstr "Neznámo"
@@ -3283,7 +3311,7 @@ msgstr "Neznámo"
 #: ../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:763 ../libgda-ui/gdaui-basic-form.c:825
+#: ../libgda-ui/gdaui-basic-form.c:805 ../libgda-ui/gdaui-basic-form.c:873
 #: ../libgda-ui/gdaui-raw-grid.c:739 ../tools/gda-sql.c:2656
 #: ../tools/gda-sql.c:2831 ../tools/gda-sql.c:4011
 msgid "Value"
@@ -3331,7 +3359,7 @@ msgid "The information and status changer can be activated"
 msgstr "Může být aktivována zmÄ?na stavu a informace"
 
 #: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:408
-#: ../libgda-ui/data-entries/gdaui-entry-string.c:398
+#: ../libgda-ui/data-entries/gdaui-entry-string.c:399
 msgid "<string cut because too long>"
 msgstr "<Å?etÄ?zec oÅ?íznut kvůli délce>"
 
@@ -3357,7 +3385,6 @@ msgstr ""
 "datovém modelu"
 
 #: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:490
-#: ../libgda-ui/data-entries/gdaui-entry-none.c:173
 #: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:298
 msgid "<non-printable>"
 msgstr "<netisknutelné>"
@@ -3369,7 +3396,7 @@ msgid "Invalid UTF-8 format!"
 msgstr "Neplatný formát UTF-8!"
 
 #. format tooltip
-#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1044
+#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1053
 msgid "Format is hh:mm:ss"
 msgstr "Formát je hh:mm:ss"
 
@@ -3633,27 +3660,27 @@ msgstr "Hodnota cgrid"
 msgid "Cgrid value attributes"
 msgstr "Hodnota atributů cgrid"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:849
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:843
 msgid "Cgrid text column"
 msgstr "Textový sloupec cgrid"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:850
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:844
 msgid "A column in the data source model to get the string from."
 msgstr "Sloupce v modelu zdroje dat, ze kterého se má získat Å?etÄ?zec."
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:857
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:851
 msgid "Cgrid grid height"
 msgstr "Výška mÅ?ížky cgrid"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:858
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:852
 msgid "Cgrid height's."
 msgstr "Výška cgrid"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:865
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:859
 msgid "Cgrid has its headers visible"
 msgstr "Cgrid má viditelné své záhlaví"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:866
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:860
 msgid "Cgrid headers visible"
 msgstr "Viditelné záhlaví cgrid"
 
@@ -3750,15 +3777,39 @@ msgid "No data to display"
 msgstr "Žádná data k zobrazení"
 
 #: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:1
+msgid "Break lines in between words"
+msgstr "Zalamovat Å?ádky mezi slovy"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:2
+msgid "Break lines in between words or graphemes"
+msgstr "Zalamovat Å?ádky mezi slovy nebo grafémy"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:3
 msgid "Define to enable syntactical colourisation"
 msgstr "Definuje se pro zprovoznÄ?ní obarvování syntaxe"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:2
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:4
+msgid "Defines how long lines are wrapped"
+msgstr "UrÄ?uje, jak se mají zalamovat dlouhé Å?ádky"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:5
+msgid "Do not wrap lines"
+msgstr "Nezalamovat Å?ádky"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:6
+msgid "Lines wrapping"
+msgstr "Zalamování Å?ádků"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:7
 msgid "Programming language"
 msgstr "Programovací jazyk"
 
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:8
+msgid "break lines anywhere the cursor can appear"
+msgstr "zalamovat Å?ádky kdekoliv se nachází kurzor"
+
 #: ../libgda-ui/data/server_operation.glade.h:1
-#: ../tools/browser/schema-browser/table-info.c:363
+#: ../tools/browser/schema-browser/table-info.c:384
 msgid "Columns"
 msgstr "Sloupce"
 
@@ -3897,7 +3948,7 @@ msgstr "Zahodit zmÄ?nÄ?ná data"
 msgid "Correct data first"
 msgstr "NejdÅ?íve data opravit"
 
-#: ../libgda-ui/gdaui-basic-form.c:255
+#: ../libgda-ui/gdaui-basic-form.c:259
 msgid ""
 "Pointer to an XML layout specification  (as an xmlNodePtr to a <gdaui_form> "
 "node)"
@@ -3905,46 +3956,46 @@ msgstr ""
 "Ukazatel na specifikaci rozvržení v XML (jako ukazatel xmlNodePtr na uzel "
 "<gdaui_form>)"
 
-#: ../libgda-ui/gdaui-basic-form.c:259
+#: ../libgda-ui/gdaui-basic-form.c:263
 msgid "List of parameters to show in the form"
 msgstr "Seznam parametrů, které se mají zobrazit ve formuláÅ?i"
 
-#: ../libgda-ui/gdaui-basic-form.c:263
+#: ../libgda-ui/gdaui-basic-form.c:267
 msgid "Entry headers are sensitive"
 msgstr "Záhlaví záznamů jsou citlivá"
 
-#: ../libgda-ui/gdaui-basic-form.c:268
+#: ../libgda-ui/gdaui-basic-form.c:272
 msgid "Show Entry actions"
 msgstr "Zobrazit akce záznamu"
 
-#: ../libgda-ui/gdaui-basic-form.c:273
+#: ../libgda-ui/gdaui-basic-form.c:277
 msgid "Entries Auto-default"
 msgstr "Záznamy automaticky na výchozí"
 
-#: ../libgda-ui/gdaui-basic-form.c:278
-msgid "TRUE if expanding the form makes sense"
-msgstr "ZAPNUTO, pokud reaguje rozbalování formuláÅ?e"
+#: ../libgda-ui/gdaui-basic-form.c:282
+msgid "TRUE if expanding the form vertically makes sense"
+msgstr "ZAPNUTO, pokud reaguje rozbalování formuláÅ?e svisle"
 
-#: ../libgda-ui/gdaui-basic-form.c:725 ../libgda-ui/gdaui-raw-grid.c:780
-#: ../libgda-ui/gdaui-raw-grid.c:2525
+#: ../libgda-ui/gdaui-basic-form.c:759 ../libgda-ui/gdaui-raw-grid.c:780
+#: ../libgda-ui/gdaui-raw-grid.c:2619
 #, c-format
 msgid "The '%s' attribute should be a G_TYPE_STRING value"
 msgstr "Atribut â??%sâ?? by mÄ?l být hodnotou G_TYPE_STRING"
 
-#: ../libgda-ui/gdaui-basic-form.c:1622
+#: ../libgda-ui/gdaui-basic-form.c:1685
 msgid "Can't find data entry for GdaHolder"
 msgstr "Nelze najít datový záznam pro GdaHolder"
 
-#: ../libgda-ui/gdaui-basic-form.c:1894
+#: ../libgda-ui/gdaui-basic-form.c:1957
 msgid "Values to be filled"
 msgstr "Hodnoty, které se mají vyplnit"
 
-#: ../libgda-ui/gdaui-basic-form.c:1975 ../libgda-ui/gdaui-raw-grid.c:2352
+#: ../libgda-ui/gdaui-basic-form.c:2038 ../libgda-ui/gdaui-raw-grid.c:2446
 #, c-format
 msgid "'%s' document not parsed successfully"
 msgstr "Dokument â??%sâ?? nebyl úspÄ?Å¡nÄ? zpracován"
 
-#: ../libgda-ui/gdaui-basic-form.c:1985 ../libgda-ui/gdaui-raw-grid.c:2362
+#: ../libgda-ui/gdaui-basic-form.c:2048 ../libgda-ui/gdaui-raw-grid.c:2456
 #, c-format
 msgid ""
 "'%s' DTD not parsed successfully. XML data layout validation will not be "
@@ -3953,7 +4004,7 @@ msgstr ""
 "Analýza DTD â??%sâ?? nebyla úspÄ?Å¡ná. OvÄ?Å?ení správnosti rozvržení dat XML nebude "
 "provedeno (mohou se vyskytnout nÄ?jaké chyby)"
 
-#: ../libgda-ui/gdaui-basic-form.c:2116
+#: ../libgda-ui/gdaui-basic-form.c:2179
 msgid ""
 "size group was not taken into account using "
 "gdaui_basic_form_add_to_size_group()"
@@ -3994,19 +4045,19 @@ msgstr "Zkouší se zmÄ?nit Å?ádek jen ke Ä?tení"
 msgid "Filter failed:"
 msgstr "Filtr selhal:"
 
-#: ../libgda-ui/gdaui-data-filter.c:213
+#: ../libgda-ui/gdaui-data-filter.c:216
 msgid "Filter"
 msgstr "Filtr"
 
-#: ../libgda-ui/gdaui-data-filter.c:213
+#: ../libgda-ui/gdaui-data-filter.c:216
 msgid "any valid SQL expression"
 msgstr "libovolný platný výraz SQL"
 
-#: ../libgda-ui/gdaui-data-filter.c:229
+#: ../libgda-ui/gdaui-data-filter.c:232
 msgid "Set filter"
 msgstr "Nastavit filtr"
 
-#: ../libgda-ui/gdaui-data-filter.c:234
+#: ../libgda-ui/gdaui-data-filter.c:237
 msgid "Clear filter"
 msgstr "Vymazat filtr"
 
@@ -4014,23 +4065,24 @@ msgstr "Vymazat filtr"
 msgid "Attempt to initialize an already initialized library"
 msgstr "Pokus o inicializaci již inicializované knihovny"
 
-#: ../libgda-ui/gdaui-init.c:464
+#: ../libgda-ui/gdaui-init.c:465
 msgid "Could not open plugins directory, no plugin loaded."
 msgstr ""
 "Nelze otevÅ?ít složku se zásuvnými moduly, žádný zásuvný modul nebude naÄ?ten."
 
-#: ../libgda-ui/gdaui-init.c:484
-#: ../tools/browser/query-exec/query-result.c:255 ../tools/web-server.c:2018
+#: ../libgda-ui/gdaui-init.c:485
+#: ../tools/browser/data-manager/xml-spec-editor.c:217
+#: ../tools/browser/query-exec/query-result.c:256 ../tools/web-server.c:2018
 #, c-format
 msgid "Error: %s"
 msgstr "Chyba: %s"
 
-#: ../libgda-ui/gdaui-init.c:491
+#: ../libgda-ui/gdaui-init.c:492
 #, c-format
 msgid "Loading file %s...\n"
 msgstr "NaÄ?ítá se soubor %sâ?¦\n"
 
-#: ../libgda-ui/gdaui-init.c:494
+#: ../libgda-ui/gdaui-init.c:495
 #, c-format
 msgid "Plugins load warning: %s"
 msgstr "Varování naÄ?ítání zásuvných modulů: %s"
@@ -4087,36 +4139,36 @@ msgstr "Nemůže být prázdné (NULL)"
 msgid "No title"
 msgstr "Bez názvu"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1753
+#: ../libgda-ui/gdaui-raw-grid.c:1762
 msgid "Select _All"
 msgstr "Vybrat _vše"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1758
+#: ../libgda-ui/gdaui-raw-grid.c:1767
 msgid "_Clear Selection"
 msgstr "ZruÅ¡it vý_bÄ?r"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1761
+#: ../libgda-ui/gdaui-raw-grid.c:1770
 msgid "Show Column _Titles"
 msgstr "Zobrazi_t záhlaví sloupců"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1766
+#: ../libgda-ui/gdaui-raw-grid.c:1775
 msgid "_Set filter"
 msgstr "Na_stavit filtr"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1769
+#: ../libgda-ui/gdaui-raw-grid.c:1778
 msgid "_Unset filter"
 msgstr "Zr_ušit filtr"
 
 #. create dialog box
-#: ../libgda-ui/gdaui-raw-grid.c:1868
+#: ../libgda-ui/gdaui-raw-grid.c:1878
 msgid "Saving Data"
 msgstr "Uložení dat"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1876
+#: ../libgda-ui/gdaui-raw-grid.c:1886
 msgid "Saving data to a file"
 msgstr "Uložení dat do souboru"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1877
+#: ../libgda-ui/gdaui-raw-grid.c:1887
 msgid ""
 "The data will be exported without any of the modifications which may have "
 "been made and have not been committed."
@@ -4124,48 +4176,82 @@ msgstr ""
 "Data budou exportována bez jakýchkoliv úprav, které možná byly provedeny a "
 "nebyly zaÅ?azeny."
 
-#: ../libgda-ui/gdaui-raw-grid.c:1892
+#: ../libgda-ui/gdaui-raw-grid.c:1902
 msgid "File name"
 msgstr "Název souboru"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1910
+#: ../libgda-ui/gdaui-raw-grid.c:1921
 msgid "Details"
 msgstr "Podrobnosti"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1930
-msgid "Limit to selection?"
-msgstr "Omezit na výbÄ?r?"
-
-#: ../libgda-ui/gdaui-raw-grid.c:1949
+#. file type
+#: ../libgda-ui/gdaui-raw-grid.c:1942
 msgid "File type:"
 msgstr "Typ souboru:"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1959
+#: ../libgda-ui/gdaui-raw-grid.c:1952
 msgid "Tab-delimited"
 msgstr "OddÄ?lovaný tabulátory"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1960
+#: ../libgda-ui/gdaui-raw-grid.c:1953
 msgid "Comma-delimited"
 msgstr "OddÄ?lovaný Ä?árkami"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1961
+#: ../libgda-ui/gdaui-raw-grid.c:1954
 msgid "XML"
 msgstr "XML"
 
-#: ../libgda-ui/gdaui-raw-grid.c:2090
+#. limit to selection ?
+#: ../libgda-ui/gdaui-raw-grid.c:1961
+msgid "Limit to selection?"
+msgstr "Omezit na výbÄ?r?"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1982
+msgid "Other options"
+msgstr "Ostatní volby"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1989
+msgid "Empty string when NULL?"
+msgstr "Prázdný Å?etÄ?zec, když je prázdné?"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1992 ../libgda-ui/gdaui-raw-grid.c:1997
+msgid "Export NULL values as an empty \"\" string"
+msgstr "Exportovat prázdné hodnoty (NULL) jako prázdný Å?etÄ?zec â??â??"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1999
+msgid "Invalid data as NULL?"
+msgstr "Neplatná data jako prázdná?"
+
+#: ../libgda-ui/gdaui-raw-grid.c:2002 ../libgda-ui/gdaui-raw-grid.c:2007
+msgid ""
+"Don't export invalid data,\n"
+"but export a NULL value instead"
+msgstr ""
+"Neexportovat neplatná data,\n"
+"ale exportovat místo nich prázdnou hodnotu (NULL)"
+
+#: ../libgda-ui/gdaui-raw-grid.c:2009
+msgid "Field names on first row?"
+msgstr "Názvy polí na prvním Å?ádku?"
+
+#: ../libgda-ui/gdaui-raw-grid.c:2012 ../libgda-ui/gdaui-raw-grid.c:2017
+msgid "Add a row at beginning with columns names"
+msgstr "PÅ?idat na zaÄ?átek Å?ádek s názvy sloupců"
+
+#: ../libgda-ui/gdaui-raw-grid.c:2184
 #, c-format
 msgid "Could not save file %s"
 msgstr "Nelze uložit soubor %s"
 
-#: ../libgda-ui/gdaui-raw-grid.c:2098
+#: ../libgda-ui/gdaui-raw-grid.c:2192
 msgid "You must specify a file name"
 msgstr "Musíte urÄ?it název souboru"
 
-#: ../libgda-ui/gdaui-raw-grid.c:2104
+#: ../libgda-ui/gdaui-raw-grid.c:2198
 msgid "Got empty file while converting the data"
 msgstr "Obdržen prázdný soubor bÄ?hem pÅ?evodu dat"
 
-#: ../libgda-ui/gdaui-raw-grid.c:2117
+#: ../libgda-ui/gdaui-raw-grid.c:2211
 #, c-format
 msgid ""
 "File '%s' already exists.\n"
@@ -4174,7 +4260,7 @@ msgstr ""
 "Soubor â??%sâ?? již existuje.\n"
 "Chcete jej pÅ?epsat?"
 
-#: ../libgda-ui/gdaui-raw-grid.c:2127
+#: ../libgda-ui/gdaui-raw-grid.c:2221
 msgid "If you choose yes, the contents will be lost."
 msgstr "Pokud zvolíte ano, bude obsah ztracen."
 
@@ -4549,6 +4635,7 @@ msgstr "Globální omezení"
 #: ../providers/postgres/postgres_specs_add_column.xml.in.h:11
 #: ../providers/postgres/postgres_specs_create_table.xml.in.h:52
 #: ../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:196
 #: ../tools/command-exec.c:809
 msgid "Primary key"
@@ -4757,7 +4844,7 @@ msgstr "Neplatné datum: rok %d, mÄ?síc %d a den %d"
 msgid "Can't get BLOB's size"
 msgstr "Nelze zjistit velikost rozsáhlého binárního objektu BLOB"
 
-#: ../providers/jdbc/gda-jdbc-provider.c:359
+#: ../providers/jdbc/gda-jdbc-provider.c:363
 msgid "The connection string must contain the URL value"
 msgstr "PÅ?ipojovací Å?etÄ?ze musí obsahovat hodnotu s adresou URL"
 
@@ -4790,8 +4877,8 @@ msgid ""
 "at the end)."
 msgstr ""
 "Formát pÅ?ipojovacího Å?etÄ?zce byl zmÄ?nÄ?n: nahraÄ?te FILENAME (název souboru) "
-"za DB_DIR (cesta k databázovému souboru) a DB_NAME (soubor s databází bez â??%"
-"sâ?? na konci)."
+"za DB_DIR (cesta k databázovému souboru) a DB_NAME (soubor s databází bez "
+"â??%sâ?? na konci)."
 
 #: ../providers/mdb/gda-mdb-provider.c:307
 #, c-format
@@ -4839,12 +4926,12 @@ msgstr "NesprávnÄ? zadaný název sloupce"
 msgid "MySQL boolean representation"
 msgstr "Podoba pravdivostní hodnoty MySQL"
 
-#: ../providers/mysql/gda-mysql-provider.c:476
+#: ../providers/mysql/gda-mysql-provider.c:480
 msgid "Cannot give a UNIX SOCKET if you also provide either a HOST or a PORT"
 msgstr ""
 "Nelze zadat UNIXový SOKET pokud jste zároveÅ? zadali HOSTITELE nebo PORT"
 
-#: ../providers/mysql/gda-mysql-provider.c:528
+#: ../providers/mysql/gda-mysql-provider.c:532
 #, c-format
 msgid ""
 "Could not set client charset to UTF8. Using %s. It'll be problems with non "
@@ -4853,25 +4940,25 @@ msgstr ""
 "Nelze nastavit znakovou sadu klienta na UTF8. Použije se %s, což bude "
 "působit problémy se znaky nepatÅ?ícími do UTF-8"
 
-#: ../providers/mysql/gda-mysql-provider.c:584
+#: ../providers/mysql/gda-mysql-provider.c:588
 msgid "The connection string must contain the DB_NAME values"
 msgstr "PÅ?ipojovací Å?etÄ?zec musí obsahovat hodnoty DB_NAME (název databáze)"
 
-#: ../providers/mysql/gda-mysql-provider.c:622
+#: ../providers/mysql/gda-mysql-provider.c:626
 #: ../providers/mysql/gda-mysql-util.c:69
 msgid "No description"
 msgstr "Bez popisu"
 
-#: ../providers/mysql/gda-mysql-provider.c:1658
+#: ../providers/mysql/gda-mysql-provider.c:1752
 msgid "Unnamed statement parameter is not allowed in prepared statement."
 msgstr "V pÅ?edpÅ?ipraveném pÅ?íkazu není dovolen nepojmenovaný parametr pÅ?íkazu."
 
 #. force reading the complete BLOB into memory
-#: ../providers/mysql/gda-mysql-provider.c:2217
+#: ../providers/mysql/gda-mysql-provider.c:2340
 msgid "Can't read whole BLOB into memory"
 msgstr "Nelze naÄ?íst celý rozsáhlý binární objekt BLOB do pamÄ?ti"
 
-#: ../providers/mysql/gda-mysql-provider.c:2307
+#: ../providers/mysql/gda-mysql-provider.c:2430
 msgid ""
 "Could not use CURSOR. Mysql version 5.0 at least is required. Using random "
 "access anyway."
@@ -5429,6 +5516,7 @@ msgstr "Pevný"
 #. 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:852
 msgid "Foreign key"
 msgstr "Cizí klíÄ?"
@@ -5709,11 +5797,11 @@ msgstr "Nedostatek pamÄ?ti pro pÅ?evod binární vyrovnávací pamÄ?ti na Å?etÄ?
 msgid "Insufficient memory to convert string to binary buffer"
 msgstr "Nedostatek pamÄ?ti pro pÅ?evod Å?etÄ?zce na binární vyrovnávací pamÄ?Å¥"
 
-#: ../providers/postgres/gda-postgres-provider.c:450
+#: ../providers/postgres/gda-postgres-provider.c:456
 msgid "The connection string must contain a DB_NAME value"
 msgstr "PÅ?ipojovací Å?etÄ?zec musí obsahovat hodnotu DB_NAME (název databáze)"
 
-#: ../providers/postgres/gda-postgres-provider.c:454
+#: ../providers/postgres/gda-postgres-provider.c:460
 msgid ""
 "The connection string format has changed: replace DATABASE with DB_NAME and "
 "the same contents"
@@ -5721,50 +5809,50 @@ msgstr ""
 "Formát pÅ?ipojovacího Å?etÄ?zce byl zmÄ?nÄ?n: nahraÄ?te DATABASE za DB_NAME a "
 "stejný obsah"
 
-#: ../providers/postgres/gda-postgres-provider.c:582
+#: ../providers/postgres/gda-postgres-provider.c:588
 #, c-format
 msgid "Could not set search_path to %s"
 msgstr "Nelze nastavit serach_path (cestu vyhledávání) na %s"
 
-#: ../providers/postgres/gda-postgres-provider.c:591
+#: ../providers/postgres/gda-postgres-provider.c:597
 #, c-format
 msgid "Search path %s is invalid"
 msgstr "Cesta vyhledávání %s je neplatná"
 
-#: ../providers/postgres/gda-postgres-provider.c:1030
-#: ../providers/postgres/gda-postgres-provider.c:1032
+#: ../providers/postgres/gda-postgres-provider.c:1036
+#: ../providers/postgres/gda-postgres-provider.c:1038
 msgid "Transactions are not supported in read uncommitted isolation level"
 msgstr "Transakce nejsou podporovány v izolované úrovni Ä?tení nezaÅ?azených"
 
-#: ../providers/postgres/gda-postgres-provider.c:1036
-#: ../providers/postgres/gda-postgres-provider.c:1038
+#: ../providers/postgres/gda-postgres-provider.c:1042
+#: ../providers/postgres/gda-postgres-provider.c:1044
 msgid "Transactions are not supported in repeatable read isolation level"
 msgstr "Transakce nejsou podporovány v izolované úrovni opakovatelného Ä?tení"
 
-#: ../providers/postgres/gda-postgres-provider.c:1055
-#: ../providers/postgres/gda-postgres-provider.c:1153
-#: ../providers/postgres/gda-postgres-provider.c:1203
-#: ../providers/postgres/gda-postgres-provider.c:1253
+#: ../providers/postgres/gda-postgres-provider.c:1061
+#: ../providers/postgres/gda-postgres-provider.c:1159
+#: ../providers/postgres/gda-postgres-provider.c:1209
+#: ../providers/postgres/gda-postgres-provider.c:1259
 #: ../providers/postgres/gda-postgres-recordset.c:431
 #: ../providers/postgres/gda-postgres-recordset.c:459
 msgid "Internal error"
 msgstr "Interní chyba"
 
-#: ../providers/postgres/gda-postgres-provider.c:1159
-#: ../providers/postgres/gda-postgres-provider.c:1209
-#: ../providers/postgres/gda-postgres-provider.c:1259
+#: ../providers/postgres/gda-postgres-provider.c:1165
+#: ../providers/postgres/gda-postgres-provider.c:1215
+#: ../providers/postgres/gda-postgres-provider.c:1265
 #, c-format
 msgid "Wrong savepoint name '%s'"
 msgstr "Nesprávný název â??%sâ?? bodu uložení"
 
-#: ../providers/postgres/gda-postgres-provider.c:2004
-#: ../providers/postgres/gda-postgres-provider.c:2006
+#: ../providers/postgres/gda-postgres-provider.c:2043
+#: ../providers/postgres/gda-postgres-provider.c:2045
 msgid "Cannot start transaction"
 msgstr "Nelze zahájit transakci"
 
-#: ../providers/postgres/gda-postgres-provider.c:2196
-#: ../providers/postgres/gda-postgres-provider.c:2232
-#: ../providers/postgres/gda-postgres-provider.c:2267
+#: ../providers/postgres/gda-postgres-provider.c:2254
+#: ../providers/postgres/gda-postgres-provider.c:2290
+#: ../providers/postgres/gda-postgres-provider.c:2325
 msgid "Could not set the XA transaction ID parameter"
 msgstr "Nelze nastavit parametr ID transakce XA"
 
@@ -6421,44 +6509,44 @@ msgstr "nelze urÄ?it indexové sloupce pro index"
 msgid "Provider for SQLite databases"
 msgstr "Poskytovatel pro databáze SQLite"
 
-#: ../providers/web/gda-web-provider.c:287 ../providers/web/gda-web-util.c:296
+#: ../providers/web/gda-web-provider.c:290 ../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 "Neplatný POÄ?Ã?TAÄ?/SKRIPT â??%sâ??"
 
-#: ../providers/web/gda-web-provider.c:348
-#: ../providers/web/gda-web-provider.c:354
-#: ../providers/web/gda-web-provider.c:360
-#: ../providers/web/gda-web-provider.c:368
+#: ../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
 #, c-format
 msgid "The connection string must contain the %s value"
 msgstr "PÅ?ipojovací Å?etÄ?zec musí obsahovat hodnotu %s"
 
-#: ../providers/web/gda-web-provider.c:624
-#: ../providers/web/gda-web-provider.c:649
+#: ../providers/web/gda-web-provider.c:627
+#: ../providers/web/gda-web-provider.c:652
 #, c-format
 msgid "Not supported"
 msgstr "Nepodporováno"
 
-#: ../providers/web/gda-web-provider.c:629
-#: ../providers/web/gda-web-provider.c:654
+#: ../providers/web/gda-web-provider.c:632
+#: ../providers/web/gda-web-provider.c:657
 #, c-format
 msgid "Server operations not yet implemented"
 msgstr "Serverové operace nejsou zatím implementovány"
 
-#: ../providers/web/gda-web-provider.c:704
-#: ../providers/web/gda-web-provider.c:769
-#: ../providers/web/gda-web-provider.c:829
+#: ../providers/web/gda-web-provider.c:707
+#: ../providers/web/gda-web-provider.c:772
+#: ../providers/web/gda-web-provider.c:832
 msgid "Named transaction is not supported"
 msgstr "Pojmenované transakce nejsou podporovány"
 
-#: ../providers/web/gda-web-provider.c:709
+#: ../providers/web/gda-web-provider.c:712
 msgid "Transaction level is not supported"
 msgstr "Ã?roveÅ? transakce ní podporována"
 
-#: ../providers/web/gda-web-provider.c:889
-#: ../providers/web/gda-web-provider.c:950
+#: ../providers/web/gda-web-provider.c:892
+#: ../providers/web/gda-web-provider.c:953
 msgid "Unnamed savepoint is not supported"
 msgstr "Nepojmenované body uložení nejsou podporovány"
 
@@ -6635,15 +6723,15 @@ msgstr "Natavit jako původní"
 msgid "Set as default"
 msgstr "Nastavit jako výchozí"
 
-#: ../tools/browser/auth-dialog.c:497
+#: ../tools/browser/auth-dialog.c:522
 msgid "For connection"
 msgstr "Pro pÅ?ipojení"
 
-#: ../tools/browser/auth-dialog.c:498
+#: ../tools/browser/auth-dialog.c:523
 msgid "enter authentication information"
 msgstr "zadejte ovÄ?Å?ovací informace"
 
-#: ../tools/browser/auth-dialog.c:652 ../tools/browser/login-dialog.c:238
+#: ../tools/browser/auth-dialog.c:679 ../tools/browser/login-dialog.c:238
 #, c-format
 msgid ""
 "Could not open connection:\n"
@@ -6657,47 +6745,47 @@ msgstr ""
 msgid "c%u"
 msgstr "p%u"
 
-#: ../tools/browser/browser-connection.c:348
-#: ../tools/browser/browser-connection.c:428
+#: ../tools/browser/browser-connection.c:350
+#: ../tools/browser/browser-connection.c:436
 msgid "Analysing database schema"
 msgstr "Analyzuje se databázové schéma"
 
-#: ../tools/browser/browser-connection.c:350
-#: ../tools/browser/browser-connection.c:410
-#: ../tools/browser/browser-connection.c:430
-#: ../tools/browser/browser-connection.c:832
+#: ../tools/browser/browser-connection.c:352
+#: ../tools/browser/browser-connection.c:418
+#: ../tools/browser/browser-connection.c:438
+#: ../tools/browser/browser-connection.c:850
 #, c-format
 msgid "Error while fetching meta data from the connection: %s"
 msgstr "Chyba pÅ?i získávání metadat z pÅ?ipojení: %s"
 
-#: ../tools/browser/browser-connection.c:408
-#: ../tools/browser/browser-connection.c:830
+#: ../tools/browser/browser-connection.c:416
+#: ../tools/browser/browser-connection.c:848
 msgid "Getting database schema information"
 msgstr "Získávají se informace o databázovém schématu"
 
-#: ../tools/browser/browser-connection.c:604
-#: ../tools/browser/browser-connection.c:624
+#: ../tools/browser/browser-connection.c:622
+#: ../tools/browser/browser-connection.c:642
 #, c-format
 msgid "Error while analysing database schema: %s"
 msgstr "Chyba pÅ?i analýze databázového schématu: %s"
 
-#: ../tools/browser/browser-connection.c:1085
-#: ../tools/browser/browser-connection.c:1128
+#: ../tools/browser/browser-connection.c:1104
+#: ../tools/browser/browser-connection.c:1154
 msgid "Executing a query"
 msgstr "Provádí se dotaz"
 
-#: ../tools/browser/browser-connection.c:1240
+#: ../tools/browser/browser-connection.c:1416
 #, c-format
 msgid "Connection not yet opened"
 msgstr "PÅ?ipojení není zatím otevÅ?eno"
 
-#: ../tools/browser/browser-connection.c:1246
+#: ../tools/browser/browser-connection.c:1422
 msgid "Can't initialize dictionary to store table preferences"
 msgstr "Nelze inicializovat slovník pro uchování pÅ?edvoleb tabulek"
 
-#: ../tools/browser/browser-connection.c:1292
-#: ../tools/browser/browser-connection.c:1298
-#: ../tools/browser/browser-connection.c:1434
+#: ../tools/browser/browser-connection.c:1468
+#: ../tools/browser/browser-connection.c:1474
+#: ../tools/browser/browser-connection.c:1610
 #: ../tools/browser/browser-favorites.c:523
 #: ../tools/browser/browser-favorites.c:529
 #: ../tools/browser/browser-favorites.c:958
@@ -6705,7 +6793,7 @@ msgstr "Nelze inicializovat slovník pro uchování pÅ?edvoleb tabulek"
 msgid "Can't initialize transaction to access favorites"
 msgstr "Nelez inicializovat transakci pro pÅ?ístup k oblíbeným"
 
-#: ../tools/browser/browser-connection.c:1379
+#: ../tools/browser/browser-connection.c:1555
 #: ../tools/browser/browser-favorites.c:702
 #: ../tools/browser/browser-favorites.c:1016
 msgid "Can't commit transaction to access favorites"
@@ -6787,17 +6875,17 @@ msgid "Bookmarks"
 msgstr "Záložky"
 
 #: ../tools/browser/browser-stock-icons.c:47
-#: ../tools/browser/browser-window.c:248
+#: ../tools/browser/browser-window.c:270
 msgid "Begin"
 msgstr "ZaÄ?ít"
 
 #: ../tools/browser/browser-stock-icons.c:48
-#: ../tools/browser/browser-window.c:250
+#: ../tools/browser/browser-window.c:272
 msgid "Commit"
 msgstr "ZaÅ?adit"
 
 #: ../tools/browser/browser-stock-icons.c:49
-#: ../tools/browser/browser-window.c:252
+#: ../tools/browser/browser-window.c:274
 msgid "Rollback"
 msgstr "Vrátit zpÄ?t"
 
@@ -6813,19 +6901,19 @@ msgstr "Je použit svázané pÅ?ipojení"
 msgid "Virtual connection using this connection is busy"
 msgstr "Virtuální pÅ?ipojení používající toto pÅ?ipojení je zaneprázdnÄ?no"
 
-#: ../tools/browser/browser-window.c:223
+#: ../tools/browser/browser-window.c:244
 msgid "_Fullscreen"
 msgstr "_Celá obrazovka"
 
-#: ../tools/browser/browser-window.c:223
+#: ../tools/browser/browser-window.c:244
 msgid "Use the whole screen"
 msgstr "Použít celou obrazovku"
 
-#: ../tools/browser/browser-window.c:229
+#: ../tools/browser/browser-window.c:250
 msgid "_Bind connection"
 msgstr "S_vázat pÅ?ipojení"
 
-#: ../tools/browser/browser-window.c:229
+#: ../tools/browser/browser-window.c:250
 msgid ""
 "Use connection to create\n"
 "a new binding connection to access data\n"
@@ -6835,75 +6923,75 @@ msgstr ""
 "nového svazku pÅ?ipojení na pÅ?ístup\n"
 "k datům z více databází naráz"
 
-#: ../tools/browser/browser-window.c:248
+#: ../tools/browser/browser-window.c:270
 msgid "Begin a new transaction"
 msgstr "ZaÄ?ít novou transakci"
 
-#: ../tools/browser/browser-window.c:250
+#: ../tools/browser/browser-window.c:272
 msgid "Commit current transaction"
 msgstr "Schválit souÄ?asnou transakci"
 
-#: ../tools/browser/browser-window.c:252
+#: ../tools/browser/browser-window.c:274
 msgid "Rollback current transaction"
 msgstr "Vrací se zpÄ?t souÄ?asná transakceâ?¦"
 
-#: ../tools/browser/browser-window.c:340
+#: ../tools/browser/browser-window.c:364
 msgid "unnamed"
 msgstr "nepojmenováno"
 
-#: ../tools/browser/browser-window.c:341
+#: ../tools/browser/browser-window.c:365
 #, c-format
 msgid "Connection: %s"
 msgstr "PÅ?ipojení: %s"
 
-#: ../tools/browser/browser-window.c:703 ../tools/browser/support.c:75
+#: ../tools/browser/browser-window.c:740 ../tools/browser/support.c:75
 #, c-format
 msgid "Do you want to close the '%s' connection?"
 msgstr "Chcete uzavÅ?ít pÅ?ipojení â??%sâ???"
 
-#: ../tools/browser/browser-window.c:745 ../tools/browser/browser-window.c:752
+#: ../tools/browser/browser-window.c:782 ../tools/browser/browser-window.c:789
 msgid "Do you want to quit the application?"
 msgstr "Chcete aplikaci ukonÄ?it?"
 
-#: ../tools/browser/browser-window.c:746
+#: ../tools/browser/browser-window.c:783
 msgid "all the connections will be closed."
 msgstr "vÅ¡echna pÅ?ipojení budou uzavÅ?ena"
 
-#: ../tools/browser/browser-window.c:753
+#: ../tools/browser/browser-window.c:790
 msgid "the connection will be closed."
 msgstr "pÅ?ipojení bude uzavÅ?eno"
 
-#: ../tools/browser/browser-window.c:804
+#: ../tools/browser/browser-window.c:841
 #, c-format
 msgid "Error starting transaction: %s"
 msgstr "Chyba zahájení transakce: %s"
 
-#: ../tools/browser/browser-window.c:818
+#: ../tools/browser/browser-window.c:855
 #, c-format
 msgid "Error committing transaction: %s"
 msgstr "Chyba schvalování transakce: %s"
 
-#: ../tools/browser/browser-window.c:832
+#: ../tools/browser/browser-window.c:869
 #, c-format
 msgid "Error rolling back transaction: %s"
 msgstr "Chyba pÅ?i vracení transakce zpÄ?t: %s"
 
-#: ../tools/browser/browser-window.c:944
+#: ../tools/browser/browser-window.c:985
 #, c-format
 msgid "Error updating bound connection: %s"
 msgstr "Chyba aktualizace svázaného pÅ?ipojení: %s"
 
-#: ../tools/browser/browser-window.c:985
+#: ../tools/browser/browser-window.c:1026
 #, c-format
 msgid "Could not open binding connection: %s"
 msgstr "Nelze otevÅ?ít svázaná pÅ?ipojení: %s"
 
-#: ../tools/browser/browser-window.c:1025
+#: ../tools/browser/browser-window.c:1066
 #: ../tools/browser/gda-browser-4.0.desktop.in.h:2
 msgid "Database browser"
 msgstr "ProhlížeÄ? databáze"
 
-#: ../tools/browser/browser-window.c:1279
+#: ../tools/browser/browser-window.c:1320
 #, c-format
 msgid ""
 "The current perspective has changed to the '%s' perspective, you can switch "
@@ -7051,7 +7139,7 @@ msgstr "PÅ?íkaz DELETE SAVEPOINT"
 msgid "Unknown statement"
 msgstr "Neznámý pÅ?íkaz"
 
-#: ../tools/browser/mgr-favorites.c:541
+#: ../tools/browser/mgr-favorites.c:547
 msgid ""
 "Getting\n"
 "favorites..."
@@ -7059,7 +7147,7 @@ msgstr ""
 "Získávají se\n"
 "oblíbené�"
 
-#: ../tools/browser/mgr-favorites.c:553
+#: ../tools/browser/mgr-favorites.c:559
 msgid ""
 "No favorite:\n"
 "drag item to\n"
@@ -7069,15 +7157,15 @@ msgstr ""
 "novou vytvoÅ?íte\n"
 "pÅ?etažením položky"
 
-#: ../tools/browser/support.c:208
+#: ../tools/browser/support.c:211
 msgid "Note:"
 msgstr "Poznámka:"
 
-#: ../tools/browser/support.c:211
+#: ../tools/browser/support.c:214
 msgid "Don't show this message again"
 msgstr "Tuto zprávu již pÅ?íštÄ? nezobrazovat"
 
-#: ../tools/browser/support.c:272
+#: ../tools/browser/support.c:275
 msgid ""
 "Unable to display help. Please make sure the documentation package is "
 "installed."
@@ -7085,15 +7173,15 @@ msgstr ""
 "Nelze zobrazit nápovÄ?du. UjistÄ?te se prosím, že je nainstalován balíÄ?ek s "
 "dokumentací."
 
-#: ../tools/browser/support.c:298
+#: ../tools/browser/support.c:301
 msgid "Unable to open help file"
 msgstr "Nelze otevÅ?ít soubor s nápovÄ?dou"
 
-#: ../tools/browser/support.c:352
+#: ../tools/browser/support.c:355
 msgid "Close tab"
 msgstr "ZavÅ?ít kartu"
 
-#: ../tools/browser/support.h:91
+#: ../tools/browser/support.h:95
 msgid ""
 "<small>This area allows to give values to\n"
 "variables defined in the SQL code\n"
@@ -7295,7 +7383,7 @@ msgid "Data set import from file"
 msgstr "Import datové sady ze souboru"
 
 #: ../tools/browser/common/gdaui-entry-import.c:202
-#: ../tools/browser/query-exec/query-result.c:216
+#: ../tools/browser/query-exec/query-result.c:217
 #, c-format
 msgid "%d row"
 msgid_plural "%d rows"
@@ -7304,7 +7392,7 @@ msgstr[1] "%d Å?ádky"
 msgstr[2] "%d Å?ádků"
 
 #: ../tools/browser/common/gdaui-entry-import.c:203
-#: ../tools/browser/query-exec/query-result.c:217
+#: ../tools/browser/query-exec/query-result.c:218
 #, c-format
 msgid "%d column"
 msgid_plural "%d columns"
@@ -7313,7 +7401,7 @@ msgstr[1] "%d sloupce"
 msgstr[2] "%d sloupců"
 
 #: ../tools/browser/common/gdaui-entry-import.c:204
-#: ../tools/browser/query-exec/query-result.c:219
+#: ../tools/browser/query-exec/query-result.c:220
 #, c-format
 msgid "Data set with %s and %s"
 msgstr "Datová sada s %s a %s"
@@ -7348,48 +7436,54 @@ msgstr[2] "%d tabulek ve schématu â??%sâ??:"
 msgid "None"
 msgstr "Žádné"
 
-#: ../tools/browser/data-manager/data-console.c:205
+#: ../tools/browser/common/ui-formgrid.c:162
+msgid "Toggle between grid and form presentations"
+msgstr "PÅ?epíná mezi zobrazením v podobÄ? mÅ?ížky a formuláÅ?e"
+
+#: ../tools/browser/data-manager/data-console.c:265
 msgid "Data Manager"
 msgstr "Správce dat"
 
-#: ../tools/browser/data-manager/data-console.c:223
+#: ../tools/browser/data-manager/data-console.c:265
+#: ../tools/browser/data-manager/data-console.c:459
+#: ../tools/browser/schema-browser/relations-diagram.c:327
+#: ../tools/browser/schema-browser/relations-diagram.c:475
+msgid "Unsaved"
+msgstr "Neuloženo"
+
+#: ../tools/browser/data-manager/data-console.c:296
 #: ../tools/browser/query-exec/query-console.c:336
 msgid "Variables' values:"
 msgstr "Hodnoty promÄ?nných:"
 
-#: ../tools/browser/data-manager/data-console.c:257
-#: ../tools/browser/query-exec/query-console.c:315
-msgid "SQL code to execute:"
-msgstr "Kód SQL ke spuÅ¡tÄ?ní:"
-
-#: ../tools/browser/data-manager/data-console.c:301
+#: ../tools/browser/data-manager/data-console.c:351
 #: ../tools/browser/query-exec/query-console.c:363
 #: ../tools/browser/query-exec/query-console.c:427
 msgid "Clear"
 msgstr "Vymazat"
 
-#: ../tools/browser/data-manager/data-console.c:301
+#: ../tools/browser/data-manager/data-console.c:351
 #: ../tools/browser/query-exec/query-console.c:363
 msgid ""
 "Clear the editor's\n"
 "contents"
 msgstr "Vymazat obsah editoru"
 
-#: ../tools/browser/data-manager/data-console.c:306
+#: ../tools/browser/data-manager/data-console.c:356
 #: ../tools/browser/query-exec/query-console.c:368
 msgid "Variables"
 msgstr "PromÄ?nné"
 
-#: ../tools/browser/data-manager/data-console.c:306
+#: ../tools/browser/data-manager/data-console.c:356
 msgid "Show variables needed"
 msgstr "Zobrazit potÅ?ebné promÄ?nné"
 
-#: ../tools/browser/data-manager/data-console.c:312
+#: ../tools/browser/data-manager/data-console.c:362
 #: ../tools/browser/query-exec/query-console.c:374
 msgid "Execute"
 msgstr "Spustit"
 
-#: ../tools/browser/data-manager/data-console.c:312
+#: ../tools/browser/data-manager/data-console.c:362
 msgid ""
 "Execute specified\n"
 "data manager"
@@ -7397,11 +7491,11 @@ msgstr ""
 "Spustit zadaného\n"
 "správce dat"
 
-#: ../tools/browser/data-manager/data-console.c:318
+#: ../tools/browser/data-manager/data-console.c:368
 msgid "View XML"
 msgstr "Zobrazit XML"
 
-#: ../tools/browser/data-manager/data-console.c:318
+#: ../tools/browser/data-manager/data-console.c:368
 msgid ""
 "View specifications\n"
 "as XML (advanced)"
@@ -7409,37 +7503,58 @@ msgstr ""
 "Zobrazit specifikaci\n"
 "jako XML (pokroÄ?ilé)"
 
-#: ../tools/browser/data-manager/data-console.c:328 ../tools/html-doc.c:95
+#: ../tools/browser/data-manager/data-console.c:376 ../tools/html-doc.c:95
 msgid "Help"
 msgstr "NápovÄ?da"
 
-#: ../tools/browser/data-manager/data-console.c:343
+#: ../tools/browser/data-manager/data-console.c:389
 msgid "BBB:"
 msgstr "BBB:"
 
-#: ../tools/browser/data-manager/data-console.c:434
+#: ../tools/browser/data-manager/data-console.c:447
+#, c-format
+msgid "'%s' data manager"
+msgstr "Správce dat â??%sâ??"
+
+#: ../tools/browser/data-manager/data-console.c:448
+#: ../tools/browser/data-manager/data-console.c:459
+#: ../tools/browser/data-manager/data-console.c:492
+#: ../tools/browser/data-manager/data-console.c:767
+msgid "Data manager"
+msgstr "Správce dat"
+
+#: ../tools/browser/data-manager/data-console.c:502
+msgid "Could not save data manager"
+msgstr "Nelze uložit správce dat"
+
+#: ../tools/browser/data-manager/data-console.c:528
+msgid "Data manager's name"
+msgstr "Název správce dat"
+
+#: ../tools/browser/data-manager/data-console.c:548
+#: ../tools/browser/schema-browser/relations-diagram.c:286
+msgid "Save"
+msgstr "Uložit"
+
+#: ../tools/browser/data-manager/data-console.c:646
 #, c-format
 msgid "No data source defined"
 msgstr "Není definován žádný zdroj dat"
 
-#: ../tools/browser/data-manager/data-console.c:493
-#: ../tools/browser/data-manager/spec-editor.c:155
+#: ../tools/browser/data-manager/data-console.c:706
+#: ../tools/browser/data-manager/xml-spec-editor.c:161
 #, c-format
 msgid "Error parsing XML specifications"
 msgstr "Chyba pÅ?i zpracování specifikace XML"
 
-#: ../tools/browser/data-manager/data-console.c:510
+#: ../tools/browser/data-manager/data-console.c:723
 msgid "_Toggle mode"
 msgstr "PÅ?epnou_t režim"
 
-#: ../tools/browser/data-manager/data-console.c:510
+#: ../tools/browser/data-manager/data-console.c:723
 msgid "Switch between compose and execute modes"
 msgstr "PÅ?epnout mezi sestavovacím a provádÄ?cím režimem"
 
-#: ../tools/browser/data-manager/data-console.c:554
-msgid "Data manager"
-msgstr "Správce dat"
-
 #: ../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
@@ -7453,7 +7568,7 @@ msgstr "Nelze odstranit oblíbenou: %s"
 #: ../tools/browser/query-exec/query-favorite-selector.c:242
 #: ../tools/browser/query-exec/query-favorite-selector.c:600
 #: ../tools/browser/schema-browser/favorite-selector.c:358
-#: ../tools/browser/schema-browser/table-info.c:453
+#: ../tools/browser/schema-browser/table-info.c:474
 #, c-format
 msgid "Could not add favorite: %s"
 msgstr "Nelze pÅ?idat oblíbenou: %s"
@@ -7477,78 +7592,100 @@ msgstr "Oblíbené"
 msgid "Unnamed data manager"
 msgstr "Nepojmenovaný správce dat"
 
+#: ../tools/browser/data-manager/data-manager-perspective.c:388
+#: ../tools/browser/query-exec/query-exec-perspective.c:385
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:317
+msgid "_Show favorites"
+msgstr "_Zobrazit oblíbené"
+
+#: ../tools/browser/data-manager/data-manager-perspective.c:388
+#: ../tools/browser/query-exec/query-exec-perspective.c:385
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:317
+msgid "Show or hide favorites"
+msgstr "Zobrazit nebo skrýt oblíbené"
+
 #. Translators: Do not translate "table" nor "query"
-#: ../tools/browser/data-manager/data-source.c:249
+#: ../tools/browser/data-manager/data-source.c:252
 #, c-format
 msgid "Node must be \"table\" or \"query\", and is \"%s\""
 msgstr "Uzel musí být â??tableâ?? nebo â??queryâ?? a je â??%sâ??"
 
-#: ../tools/browser/data-manager/data-source.c:278
+#: ../tools/browser/data-manager/data-source.c:284
 #, c-format
 msgid "Multiple statements detected, only the first will be used"
 msgstr "ZjiÅ¡tÄ?no více pÅ?íkazů, bude použit jen první"
 
-#: ../tools/browser/data-manager/data-source.c:350
+#: ../tools/browser/data-manager/data-source.c:368
 #: ../tools/browser/schema-browser/mgr-columns.c:274
 #, c-format
 msgid "Not ready"
 msgstr "NepÅ?ipraveno"
 
-#: ../tools/browser/data-manager/data-source.c:357
+#: ../tools/browser/data-manager/data-source.c:375
 #, c-format
 msgid "Malformed table name \"%s\""
 msgstr "Chybný název tabulky â??%sâ??"
 
-#: ../tools/browser/data-manager/data-source.c:374
+#: ../tools/browser/data-manager/data-source.c:392
 #, c-format
 msgid "Could not find the \"%s\" table"
 msgstr "Nelze najít tabulku â??%sâ??"
 
-#: ../tools/browser/data-manager/data-source.c:379
+#: ../tools/browser/data-manager/data-source.c:397
 #, c-format
 msgid "The \"%s\" object is not a table"
 msgstr "Objekt â??%sâ?? není tabulka"
 
 #. Translators: Do not translate "name"
-#: ../tools/browser/data-manager/data-source.c:393
+#: ../tools/browser/data-manager/data-source.c:415
 #, c-format
 msgid "Missing attribute \"name\" for table"
 msgstr "Schází atribut â??názevâ?? pro tabulku"
 
-#: ../tools/browser/data-manager/data-source.c:398
+#: ../tools/browser/data-manager/data-source.c:420
 #, c-format
 msgid "Contents of '%s'"
 msgstr "Obsah z â??%sâ??"
 
-#: ../tools/browser/data-manager/data-source.c:416
+#: ../tools/browser/data-manager/data-source.c:438
 #, c-format
 msgid "Could not build SELECT statement"
 msgstr "Nelze sestavit pÅ?íkaz SELECT"
 
-#: ../tools/browser/data-manager/data-source.c:493
+#: ../tools/browser/data-manager/data-source.c:519
 #, c-format
 msgid "Could not find any foreign key to \"%s\""
 msgstr "Nelze najít žádný cizí klíÄ? k â??%sâ??"
 
-#: ../tools/browser/data-manager/data-source.c:501
+#: ../tools/browser/data-manager/data-source.c:527
 #, c-format
 msgid "The fields involved in the foreign key to \"%s\" are not known"
 msgstr "Pole zapojená do cizího klíÄ?e smÄ?Å?ujícího na â??%sâ?? nejsou známá"
 
-#: ../tools/browser/data-manager/data-source.c:615
+#: ../tools/browser/data-manager/data-source.c:648
 #, c-format
 msgid "Statement to execute is not a selection statement"
 msgstr "PÅ?íkaz ke spuÅ¡tÄ?ní není pÅ?íkazem pro výbÄ?r"
 
-#: ../tools/browser/data-manager/data-source.c:745
+#: ../tools/browser/data-manager/data-source.c:788
 #, c-format
 msgid "No SELECT statement to execute"
 msgstr "Žádný pÅ?íkaz SELECT ke spuÅ¡tÄ?ní"
 
-#: ../tools/browser/data-manager/data-widget.c:347
+#: ../tools/browser/data-manager/data-widget.c:357
 msgid "Error: no detail"
 msgstr "Chyba: bez upÅ?esnÄ?ní"
 
+#: ../tools/browser/data-manager/xml-spec-editor.c:175
+#, c-format
+msgid "Expecting <%s> root node"
+msgstr "OÄ?ekáván koÅ?enový uzel <%s>"
+
+#: ../tools/browser/data-manager/xml-spec-editor.c:259
+#: ../tools/browser/query-exec/query-console.c:315
+msgid "SQL code to execute:"
+msgstr "Kód SQL ke spuÅ¡tÄ?ní:"
+
 #: ../tools/browser/query-exec/query-console.c:289
 #: ../tools/browser/query-exec/query-console.c:1083
 msgid "Query editor"
@@ -7622,6 +7759,7 @@ msgid "Invalid variable's contents"
 msgstr "Neplatný obsah promÄ?nných"
 
 #: ../tools/browser/query-exec/query-console.c:774
+#: ../tools/browser/schema-browser/table-info.c:919
 msgid "assign values to the following variables"
 msgstr "pÅ?iÅ?aÄ?te hodnoty následujícím promÄ?nným"
 
@@ -7639,12 +7777,14 @@ msgstr ""
 "pÅ?ipojení."
 
 #: ../tools/browser/query-exec/query-console.c:873
+#: ../tools/browser/schema-browser/table-info.c:553
 #, c-format
 msgid "Error executing query: %s"
 msgstr "Chyba pÅ?i provádÄ?ní dotazu: %s"
 
 #: ../tools/browser/query-exec/query-console.c:926
 #: ../tools/browser/query-exec/query-console.c:976
+#: ../tools/browser/schema-browser/table-info.c:526
 #, c-format
 msgid ""
 "Error executing query:\n"
@@ -7688,15 +7828,15 @@ msgstr "_ZpÄ?t"
 msgid "Undo last change"
 msgstr "Vrátit zpÄ?t poslední zmÄ?nu"
 
-#: ../tools/browser/query-exec/query-editor.c:1185
+#: ../tools/browser/query-exec/query-editor.c:1186
 msgid "In the future:\n"
 msgstr "V budoucnu:\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1189
+#: ../tools/browser/query-exec/query-editor.c:1190
 msgid "Less than a minute ago:\n"
 msgstr "PÅ?ed ménÄ? než minutou:\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1194
+#: ../tools/browser/query-exec/query-editor.c:1195
 #, c-format
 msgid "%lu minute ago:\n"
 msgid_plural "%lu minutes ago:\n"
@@ -7706,7 +7846,7 @@ msgstr[2] ""
 "pÅ?ed %lu minutami\n"
 "\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1201
+#: ../tools/browser/query-exec/query-editor.c:1202
 #, c-format
 msgid "%lu hour ago\n"
 msgid_plural "%lu hours ago\n"
@@ -7714,7 +7854,7 @@ msgstr[0] "pÅ?ed %lu hodinou\n"
 msgstr[1] "pÅ?ed %lu hodinami\n"
 msgstr[2] "pÅ?ed %lu hodinami\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1207
+#: ../tools/browser/query-exec/query-editor.c:1208
 #, c-format
 msgid "%lu day ago\n"
 msgid_plural "%lu days ago\n"
@@ -7722,15 +7862,15 @@ msgstr[0] "pÅ?ed %lu dnem\n"
 msgstr[1] "pÅ?ed %lu dny\n"
 msgstr[2] "pÅ?ed %lu dny\n"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:314
+#: ../tools/browser/query-exec/query-exec-perspective.c:389
 msgid "_Query"
 msgstr "_Dotaz"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:315
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
 msgid "_New editor"
 msgstr "_Nový editor"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:315
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
 msgid "Open a new query editor"
 msgstr "OtevÅ?ít nový editor dotazů"
 
@@ -7738,27 +7878,27 @@ msgstr "OtevÅ?ít nový editor dotazů"
 msgid "SQL Code"
 msgstr "Kód SQL"
 
-#: ../tools/browser/query-exec/query-result.c:206
+#: ../tools/browser/query-exec/query-result.c:207
 msgid "Statement:"
 msgstr "PÅ?íkaz:"
 
-#: ../tools/browser/query-exec/query-result.c:240
+#: ../tools/browser/query-exec/query-result.c:241
 msgid "Number of rows impacted"
 msgstr "PoÄ?et Å?ádku vložených mezi"
 
-#: ../tools/browser/query-exec/query-result.c:264
+#: ../tools/browser/query-exec/query-result.c:265
 msgid "Execution Parameters"
 msgstr "Parametry provádÄ?ní"
 
-#: ../tools/browser/query-exec/query-result.c:326
+#: ../tools/browser/query-exec/query-result.c:327
 msgid "No result selected"
 msgstr "Není vybrán žádný výsledek"
 
-#: ../tools/browser/query-exec/query-result.c:432
+#: ../tools/browser/query-exec/query-result.c:386
 msgid "Number of rows impacted:"
 msgstr "PoÄ?et Å?ádku vložených mezi:"
 
-#: ../tools/browser/query-exec/query-result.c:471
+#: ../tools/browser/query-exec/query-result.c:425
 msgid "Execution error:\n"
 msgstr "Chyba zpracování:\n"
 
@@ -7772,6 +7912,10 @@ msgstr "Tabulka nebyla nalezena"
 msgid "Requested object is not a table or view"
 msgstr "Požadovaný objekt není tabulkou ani pohledem"
 
+#: ../tools/browser/schema-browser/mgr-columns.c:390
+msgid "Auto incremented"
+msgstr "Automaticky zvýšeno"
+
 #: ../tools/browser/schema-browser/objects-index.c:170
 msgid "Tables' index"
 msgstr "Index tabulky"
@@ -7793,10 +7937,6 @@ msgstr "Nelze uložit diagram"
 msgid "Canvas's name"
 msgstr "Název plátna"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:286
-msgid "Save"
-msgstr "Uložit"
-
 #: ../tools/browser/schema-browser/relations-diagram.c:327
 #: ../tools/browser/schema-browser/relations-diagram.c:384
 #: ../tools/browser/schema-browser/relations-diagram.c:464
@@ -7804,11 +7944,6 @@ msgstr "Uložit"
 msgid "Relations diagram"
 msgstr "Diagram vztahů"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:327
-#: ../tools/browser/schema-browser/relations-diagram.c:475
-msgid "Unsaved diagram"
-msgstr "Neuložený diagram"
-
 #: ../tools/browser/schema-browser/relations-diagram.c:374
 #, c-format
 msgid "Error parsing favorite's contents"
@@ -7826,16 +7961,15 @@ msgid "Missing table attribute in favorite's contents"
 msgstr "Schází atribut tabulky v obsahu oblíbených"
 
 #: ../tools/browser/schema-browser/relations-diagram.c:519
-#: ../tools/browser/schema-browser/table-info.c:491
+#: ../tools/browser/schema-browser/table-info.c:951
 msgid "_Contents"
 msgstr "_Obsah"
 
 #: ../tools/browser/schema-browser/relations-diagram.c:519
-#: ../tools/browser/schema-browser/table-info.c:491
 msgid "View contents"
 msgstr "Zobrazit obsah"
 
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:384
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:416
 msgid "Could not load diagram"
 msgstr "Nelze naÄ?íst diagram"
 
@@ -7847,15 +7981,19 @@ msgstr "Cizí klíÄ? smÄ?Å?ující na "
 msgid "Unique constraint"
 msgstr "Omezení na jedineÄ?nost"
 
-#: ../tools/browser/schema-browser/table-columns.c:396
+#: ../tools/browser/schema-browser/table-columns.c:337
+msgid "Tables referencing this one"
+msgstr "Tabulky odkazující na toto"
+
+#: ../tools/browser/schema-browser/table-columns.c:451
 msgid "Column Name"
 msgstr "Název sloupce"
 
-#: ../tools/browser/schema-browser/table-columns.c:445
+#: ../tools/browser/schema-browser/table-columns.c:506
 msgid "Constraints and integrity rules"
 msgstr "Pravidla omezení a integrity"
 
-#: ../tools/browser/schema-browser/table-info.c:342
+#: ../tools/browser/schema-browser/table-info.c:363
 msgid ""
 "Table not found. If you think this is an error,\n"
 "please refresh the meta data from the database\n"
@@ -7865,22 +8003,69 @@ msgstr ""
 "jedná o chybu, obÄ?erstvÄ?te metadata z databáze\n"
 "(nabídka PÅ?ipojení/Získat metadata)."
 
-#: ../tools/browser/schema-browser/table-info.c:373
+#: ../tools/browser/schema-browser/table-info.c:394
 msgid "Relations"
 msgstr "Relace"
 
-#: ../tools/browser/schema-browser/table-info.c:383
+#: ../tools/browser/schema-browser/table-info.c:404
 msgid "Preferences"
 msgstr "PÅ?edvolby"
 
-#: ../tools/browser/schema-browser/table-info.c:489
-msgid "_Favorite"
-msgstr "O_blíbené"
+#: ../tools/browser/schema-browser/table-info.c:532
+msgid "Data successfully inserted"
+msgstr "Data úspÄ?Å¡nÄ? vložena"
+
+#: ../tools/browser/schema-browser/table-info.c:671
+msgid "Meta data not yet available"
+msgstr "Metadata zatím nejsou dostupná"
 
-#: ../tools/browser/schema-browser/table-info.c:489
+#: ../tools/browser/schema-browser/table-info.c:688
+msgid "Can't find information about table"
+msgstr "Nelze nalézt informace o tabulce"
+
+#: ../tools/browser/schema-browser/table-info.c:724
+#, c-format
+msgid ""
+"Internal error while building INSERT statement:\n"
+"%s"
+msgstr ""
+"Interní chyba bÄ?hem sestavování pÅ?íkazu INSERT:\n"
+"%s"
+
+#: ../tools/browser/schema-browser/table-info.c:770
+#, c-format
+msgid "Default value: '%s'"
+msgstr "Výchozí hodnota: â??%sâ??"
+
+#: ../tools/browser/schema-browser/table-info.c:780
+msgid "Default value: auto incremented value"
+msgstr "Výchozí hodnota: automaticky zvyšovaná hodnota"
+
+#: ../tools/browser/schema-browser/table-info.c:894
+#: ../tools/browser/schema-browser/table-info.c:918
+msgid "Values to insert into table"
+msgstr "Hodnoty, které se mají vložit do tabulky"
+
+#: ../tools/browser/schema-browser/table-info.c:949
+msgid "Add to _Favorites"
+msgstr "PÅ?idat do o_blíbených"
+
+#: ../tools/browser/schema-browser/table-info.c:949
 msgid "Add table to favorites"
 msgstr "PÅ?idat tabulku do oblíbených"
 
+#: ../tools/browser/schema-browser/table-info.c:951
+msgid "View table's contents"
+msgstr "Zobrazit obsah tabulky"
+
+#: ../tools/browser/schema-browser/table-info.c:953
+msgid "_Insert data"
+msgstr "Vlož_it data"
+
+#: ../tools/browser/schema-browser/table-info.c:953
+msgid "Insert data into table"
+msgstr "Vložit data do tabulky"
+
 #: ../tools/browser/schema-browser/table-preferences.c:267
 msgid "default"
 msgstr "výchozí"
@@ -8163,11 +8348,11 @@ msgstr "Pro â??%sâ?? není žádné heslo"
 #: ../tools/gda-sql.c:1436
 #, 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 ""
-"VÅ¡echna metadata vztahující se k pÅ?ipojení â??%sâ?? budou uložena v souboru â??%"
-"sâ??\n"
+"VÅ¡echna metadata vztahující se k pÅ?ipojení â??%sâ?? budou uložena v souboru "
+"â??%sâ??\n"
 
 #: ../tools/gda-sql.c:1464
 #, c-format
@@ -8853,3 +9038,9 @@ msgstr "Objekty"
 #: ../tools/web-server.c:1883
 msgid "Triggers"
 msgstr "Triggery"
+
+#~ msgid "Unsaved diagram"
+#~ msgstr "Neuložený diagram"
+
+#~ msgid "_Favorite"
+#~ msgstr "O_blíbené"
diff --git a/po/da.po b/po/da.po
index ed3bd58..8cb6f40 100644
--- a/po/da.po
+++ b/po/da.po
@@ -10,19 +10,20 @@
 #  acces -> adgang, tilgang?
 #  argument -> parameter (bemærk parameter kan være både t- eller n-ord; valgt n-ord)
 #  authentication -> godkendelse
-#  BLOB -> BLOB (beholdes uoversat da intet dansk navn fundet, 
+#  BLOB -> BLOB (beholdes uoversat da intet dansk navn fundet,
 #                http://en.wikipedia.org/wiki/Binary_large_object).
 #  bind -> tildele (andet forslag?)
 #  bound -> bundet
+#  break -> ombryd
 #  buffer -> mellemlager
-#  builder -> designer (Jeg kunne forestille mig at det er programmet eller 
-#                       brugeren som har kørt et script der bygger installationen 
+#  builder -> designer (Jeg kunne forestille mig at det er programmet eller
+#                       brugeren som har kørt et script der bygger installationen
 #                       eller noget lignende. Altså ikke designer.
-#  cast -> kast (Det kalder man det når man ændrer datatype for en værdi, så 
-#               "caster" man værdien til en eller anden datatype. Selvom det 
+#  cast -> kast (Det kalder man det når man ændrer datatype for en værdi, så
+#               "caster" man værdien til en eller anden datatype. Selvom det
 #               er svært at vide uden kontekst.)
 #  chunk -> fragment (klump, stykke, del)?
-#  collation -> kollation http://ordnet.dk/ods/opslag?id=479910&liste=alfa 
+#  collation -> kollation http://ordnet.dk/ods/opslag?id=479910&liste=alfa
 #               (sortering)
 #  commit -> integrere (men måske er det her udfør; væsentlig uafklaret post).
 #  compound -> sammensat
@@ -33,17 +34,17 @@
 #  exist -> findes
 #  expression -> udtryk (kan det hedde det samme som statement?)
 #                       Expression skal helt sikkert være udtryk.
-#                       Statement vil jeg nok også oversætte til 
+#                       Statement vil jeg nok også oversætte til
 #                       udtryk, jeg kan i hvert fald ikke komme på bedre lige nu.
-#                       I databasesammenhæng gør det nok ikke så meget at de 
-#                       hedder det samme. SÃ¥ vidt jeg kan se i mysql databasen, 
-#                       så bruges statement om de fleste udtryk, mens expression 
-#                       bruges om matematiske udtryk og regulære udtryk.  
+#                       I databasesammenhæng gør det nok ikke så meget at de
+#                       hedder det samme. SÃ¥ vidt jeg kan se i mysql databasen,
+#                       så bruges statement om de fleste udtryk, mens expression
+#                       bruges om matematiske udtryk og regulære udtryk.
 #  floating point -> flydende kommatal (se evt. diskussion i Dansk-gruppens arkiv)
 #  form -> formular?
-#  framework -> ramme (bedre forslag?, der er kun en streng med den så måske forkert 
+#  framework -> ramme (bedre forslag?, der er kun en streng med den så måske forkert
 #               engelsk ord, Svært uden sætningen, men måske skelet eller struktur)
-#  get -> indhente (skaffe, opnå -> begge de her to var brugt, erstattede med indhente i alle 
+#  get -> indhente (skaffe, opnå -> begge de her to var brugt, erstattede med indhente i alle
 #                  (håber jeg :o), måske nogen har et bedre forslag.)
 #  handler -> håndtering (måske håndtag, men kan ikke helt gennemskue den).
 #  holder -> holder (men er der tale om pause)
@@ -52,25 +53,26 @@
 #  inexistent -> ikkeeksisterende
 #  item -> punkt (element)
 #  iter -> ?  (er det en forkortelse for iterator eller iteration)
-#  iterator -> iterator (åbenbart noget meget it-specifikt, så har end ikke fundet hvad det 
-#                        er udledt af). Typisk noget i programmet, der sørger for at holde 
-#                        styr på, hvordan man henter data ud på en iterativ måde. I 
+#  iterator -> iterator (åbenbart noget meget it-specifikt, så har end ikke fundet hvad det
+#                        er udledt af). Typisk noget i programmet, der sørger for at holde
+#                        styr på, hvordan man henter data ud på en iterativ måde. I
 #                        databasesammenhæng: Man henter en post ud af gangen ved at bede
 #                        iteratoren om næste post).
 #  join -> sammenføj (sammenlæg)
 #  list -> vis (list of -> liste over)
 #  locator -> afgrænser
-#  map -> kortlægge (mapped -> kortlagt) (A mapping kan også være en oversigt over 
+#  map -> kortlægge (mapped -> kortlagt) (A mapping kan også være en oversigt over
 #                                        hvordan man oversætter fra et program til et andet.
 #  match -> match (forekomst)
 #  node -> knude
+#  null -> nul (eller null? ordlisten har nul)
 #  offset -> forskydning
 #  operand -> operand
 #  options -> tilvalg
 #  overflow -> overløb
 #  parse -> fortolke  (an interpreter parses a script -> en fortolker analyserer et script)
 #  pipe -> datakanal
-#  provider -> leverandør (er udbyder bedre?, eller er der ikke tale om et udvidelsesmodul 
+#  provider -> leverandør (er udbyder bedre?, eller er der ikke tale om et udvidelsesmodul
 #                         og hvad hedder det så i den her sammenhæng?). Se vendor.
 #  random -> vilkårlig
 #  renderer -> optegner
@@ -81,19 +83,20 @@
 #  the following -> følgende
 #  token -> symbol (Ja, nogle gange et symbol, altså et tegn, andre gange et symbol på
 #                   noget, f.eks. et symbol på et match fra en søgning.
-#  trigger -> udløser (Når man laver en trigger i databaser, så angiver man, hvad der 
-#                      udløser dem og hvad reaktionen skal være. Så det er faktisk mere 
+#  trigger -> udløser (Når man laver en trigger i databaser, så angiver man, hvad der
+#                      udløser dem og hvad reaktionen skal være. Så det er faktisk mere
 #                      en fælde. Men fælder er altid negative og det er en trigger jo ikke.
 #  unset -> fravælg
 #  vendor -> udbyder (se også provider)
 #
 #  opfølgning, send fejllog på engelsk fejl.
+#: ../libgda/gda-connection.c:372
 msgid ""
 msgstr ""
 "Project-Id-Version: libgda\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-07-08 12:24+0200\n"
-"PO-Revision-Date: 2010-03-12 12:42+0000\n"
+"POT-Creation-Date: 2010-08-24 23:06+0200\n"
+"PO-Revision-Date: 2010-08-24 18:53+0100\n"
 "Last-Translator: Joe Hansen <joedalton2 yahoo dk>\n"
 "Language-Team: Danish <dansk dansk-gruppen dk>\n"
 "MIME-Version: 1.0\n"
@@ -181,22 +184,23 @@ msgstr "Kunne ikke køre browserprogram"
 
 #. FIXME: add a notice somewhere in the UI
 #: ../control-center/dsn-properties-dialog.c:283
-#: ../libgda/gda-connection.c:1469 ../libgda/gda-data-model.c:1933
-#: ../libgda/gda-data-model.c:1941 ../libgda/gda-data-model-dir.c:386
+#: ../libgda/gda-connection.c:1523 ../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:367
-#: ../libgda/gda-data-select.c:2033 ../libgda/gda-data-select.c:2042
-#: ../libgda/gda-data-select.c:2052 ../libgda/gda-data-select.c:3447
-#: ../libgda/gda-holder.c:486 ../libgda/gda-holder.c:1704
+#: ../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:485 ../libgda/gda-tree-mgr-select.c:188
+#: ../libgda/gda-set.c:553 ../libgda/gda-tree-mgr-select.c:188
 #: ../libgda/gda-tree-mgr-select.c:220
-#: ../libgda/sqlite/gda-sqlite-provider.c:2029
-#: ../libgda/sqlite/gda-sqlite-provider.c:2044
-#: ../libgda/sqlite/gda-sqlite-provider.c:2234
-#: ../libgda/sqlite/gda-sqlite-provider.c:2488
-#: ../libgda/sqlite/gda-sqlite-provider.c:2500
+#: ../libgda/sqlite/gda-sqlite-provider.c:2046
+#: ../libgda/sqlite/gda-sqlite-provider.c:2058
+#: ../libgda/sqlite/gda-sqlite-provider.c:2080
+#: ../libgda/sqlite/gda-sqlite-provider.c:2270
+#: ../libgda/sqlite/gda-sqlite-provider.c:2555
+#: ../libgda/sqlite/gda-sqlite-provider.c:2567
 #: ../libgda/thread-wrapper/gda-thread-provider.c:454
 #: ../libgda-ui/data-entries/common-bin.c:79
 #: ../libgda-ui/data-entries/common-bin.c:156
@@ -206,33 +210,34 @@ msgstr "Kunne ikke køre browserprogram"
 #: ../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:495 ../libgda-ui/gdaui-login.c:401
-#: ../providers/jdbc/gda-jdbc-provider.c:384
-#: ../providers/jdbc/gda-jdbc-provider.c:1330
-#: ../providers/jdbc/gda-jdbc-provider.c:1359
-#: ../providers/jdbc/gda-jdbc-provider.c:1378
+#: ../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
 #: ../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:1862
-#: ../providers/mysql/gda-mysql-provider.c:1877
+#: ../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:1696
-#: ../providers/postgres/gda-postgres-provider.c:1711
-#: ../providers/postgres/gda-postgres-util.c:87
-#: ../providers/postgres/gda-postgres-util.c:90
-#: ../tools/browser/auth-dialog.c:621 ../tools/browser/auth-dialog.c:624
-#: ../tools/browser/browser-connection.c:351
-#: ../tools/browser/browser-connection.c:411
-#: ../tools/browser/browser-connection.c:431
-#: ../tools/browser/browser-connection.c:605
-#: ../tools/browser/browser-connection.c:625
-#: ../tools/browser/browser-connection.c:833
-#: ../tools/browser/browser-window.c:805 ../tools/browser/browser-window.c:819
-#: ../tools/browser/browser-window.c:833 ../tools/browser/browser-window.c:945
-#: ../tools/browser/browser-window.c:986 ../tools/browser/login-dialog.c:239
+#: ../providers/postgres/gda-postgres-provider.c:1706
+#: ../providers/postgres/gda-postgres-provider.c:1721
+#: ../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:353
+#: ../tools/browser/browser-connection.c:419
+#: ../tools/browser/browser-connection.c:439
+#: ../tools/browser/browser-connection.c:623
+#: ../tools/browser/browser-connection.c:643
+#: ../tools/browser/browser-connection.c:851
+#: ../tools/browser/browser-window.c:842 ../tools/browser/browser-window.c:856
+#: ../tools/browser/browser-window.c:870 ../tools/browser/browser-window.c:986
+#: ../tools/browser/browser-window.c:1027 ../tools/browser/login-dialog.c:239
 #: ../tools/browser/main.c:96 ../tools/browser/main.c:110
 #: ../tools/browser/main.c:136
+#: ../tools/browser/data-manager/data-console.c:503
 #: ../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:629
@@ -244,18 +249,21 @@ msgstr "Kunne ikke køre browserprogram"
 #: ../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:601
-#: ../tools/browser/query-exec/query-result.c:257
-#: ../tools/browser/query-exec/query-result.c:478
+#: ../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:359
 #: ../tools/browser/schema-browser/relations-diagram.c:241
-#: ../tools/browser/schema-browser/table-info.c:454
+#: ../tools/browser/schema-browser/table-info.c:475
+#: ../tools/browser/schema-browser/table-info.c:528
+#: ../tools/browser/schema-browser/table-info.c:554
+#: ../tools/browser/schema-browser/table-info.c:848
 #: ../tools/browser/schema-browser/table-preferences.c:705
 #: ../tools/browser/schema-browser/table-preferences.c:778
 #: ../tools/gda-list-server-op.c:47 ../tools/gda-list-server-op.c:90
-#: ../tools/gda-sql.c:268 ../tools/gda-sql.c:285 ../tools/gda-sql.c:424
-#: ../tools/gda-sql.c:1457 ../tools/gda-sql.c:1472 ../tools/gda-sql.c:1609
-#: ../tools/gda-sql.c:3039 ../tools/tools-input.c:129
+#: ../tools/gda-sql.c:269 ../tools/gda-sql.c:286 ../tools/gda-sql.c:425
+#: ../tools/gda-sql.c:1465 ../tools/gda-sql.c:1480 ../tools/gda-sql.c:1617
+#: ../tools/gda-sql.c:3047 ../tools/tools-input.c:129
 #: ../tools/web-server.c:2019
 msgid "No detail"
 msgstr "Ingen detaljer"
@@ -278,11 +286,11 @@ msgstr "Mangler obligatorisk information for at kunne oprette database"
 msgid "Error creating database: %s"
 msgstr "Fejl ved oprettelse af database: %s"
 
-#: ../control-center/gdaui-dsn-assistant.c:405
+#: ../control-center/gdaui-dsn-assistant.c:408
 msgid "New data source definition"
 msgstr "Ny datakildedefinition"
 
-#: ../control-center/gdaui-dsn-assistant.c:428
+#: ../control-center/gdaui-dsn-assistant.c:431
 msgid ""
 "This assistant will guide you through the process of\n"
 "creating a new data source, and optionally will allow you to\n"
@@ -296,11 +304,11 @@ msgstr ""
 "\n"
 "Følg disse nemme trin!"
 
-#: ../control-center/gdaui-dsn-assistant.c:434
+#: ../control-center/gdaui-dsn-assistant.c:437
 msgid "Add a new data source..."
 msgstr "Tilføj en ny datakilde..."
 
-#: ../control-center/gdaui-dsn-assistant.c:452
+#: ../control-center/gdaui-dsn-assistant.c:455
 msgid ""
 "The following fields represent the basic information items for your new data "
 "source. Mandatory fields are marked with a star.\n"
@@ -311,27 +319,27 @@ msgstr ""
 "For at oprette en lokal database i en fil, vælges 'SQLite' i typen af "
 "databaser.\n"
 
-#: ../control-center/gdaui-dsn-assistant.c:460
+#: ../control-center/gdaui-dsn-assistant.c:463
 msgid "Data source name"
 msgstr "Datakildenavn"
 
-#: ../control-center/gdaui-dsn-assistant.c:475
+#: ../control-center/gdaui-dsn-assistant.c:478
 msgid "System wide data source:"
 msgstr "Systemudbredt datakilde:"
 
-#: ../control-center/gdaui-dsn-assistant.c:485
+#: ../control-center/gdaui-dsn-assistant.c:488
 msgid "Database type"
 msgstr "Databasetype"
 
-#: ../control-center/gdaui-dsn-assistant.c:497
+#: ../control-center/gdaui-dsn-assistant.c:500
 msgid "Description:"
 msgstr "Beskrivelse:"
 
-#: ../control-center/gdaui-dsn-assistant.c:509
+#: ../control-center/gdaui-dsn-assistant.c:512
 msgid "General Information"
 msgstr "Generel information"
 
-#: ../control-center/gdaui-dsn-assistant.c:527
+#: ../control-center/gdaui-dsn-assistant.c:530
 msgid ""
 "This page lets you choose between using an existing database or to create a "
 "new database to use with this new data source\n"
@@ -339,16 +347,16 @@ msgstr ""
 "Denne side lader dig vælge mellem at bruge en eksisterende database eller "
 "oprette en ny database til brug med denne nye datakilde\n"
 
-#: ../control-center/gdaui-dsn-assistant.c:532
+#: ../control-center/gdaui-dsn-assistant.c:535
 msgid "Create a new database:"
 msgstr "Opret en ny database:"
 
-#: ../control-center/gdaui-dsn-assistant.c:541
+#: ../control-center/gdaui-dsn-assistant.c:544
 msgid "Create a new database?"
 msgstr "Opret en ny database?"
 
 # engelsk fejl. manglende mellemrum.
-#: ../control-center/gdaui-dsn-assistant.c:554
+#: ../control-center/gdaui-dsn-assistant.c:557
 msgid ""
 "The following fields represent the information needed to create a new "
 "database (mandatory fields are marked with a star).This information is "
@@ -359,11 +367,11 @@ msgstr ""
 "information er databasespecifik, så undersøg manualen for yderligere "
 "information.\n"
 
-#: ../control-center/gdaui-dsn-assistant.c:578
+#: ../control-center/gdaui-dsn-assistant.c:581
 msgid "New database definition"
 msgstr "Ny databasedefinition"
 
-#: ../control-center/gdaui-dsn-assistant.c:591
+#: ../control-center/gdaui-dsn-assistant.c:594
 msgid ""
 "The following fields represent the information needed to open a connection "
 "(mandatory fields are marked with a star). This information is database-"
@@ -375,12 +383,12 @@ msgstr ""
 "information.\n"
 
 #. connection's spec
-#: ../control-center/gdaui-dsn-assistant.c:604
+#: ../control-center/gdaui-dsn-assistant.c:607
 #: ../control-center/gdaui-dsn-editor.c:208
 msgid "Connection's parameters"
 msgstr "Forbindelsens parametre"
 
-#: ../control-center/gdaui-dsn-assistant.c:617
+#: ../control-center/gdaui-dsn-assistant.c:620
 msgid ""
 "The following fields represent the authentication information needed to open "
 "a connection."
@@ -388,11 +396,11 @@ msgstr ""
 "Følgende felter repræsenterer godkendelsesinformationen, der skal bruges for "
 "at åbne en forbindelse."
 
-#: ../control-center/gdaui-dsn-assistant.c:628
+#: ../control-center/gdaui-dsn-assistant.c:631
 msgid "Authentication parameters"
 msgstr "Parametre for godkendelse"
 
-#: ../control-center/gdaui-dsn-assistant.c:641
+#: ../control-center/gdaui-dsn-assistant.c:644
 msgid ""
 "All information needed to create a new data source\n"
 "has been retrieved. Now, press 'Apply' to close\n"
@@ -402,7 +410,7 @@ msgstr ""
 "er blevet indhentet. Tryk 'Anvend' for at lukke\n"
 "denne dialog."
 
-#: ../control-center/gdaui-dsn-assistant.c:650
+#: ../control-center/gdaui-dsn-assistant.c:653
 msgid "Ready to add a new data source"
 msgstr "Klar til at tilføje en ny datakilde"
 
@@ -433,8 +441,8 @@ msgstr ""
 "redigering af datakildens attributter er slået fra</span>"
 
 #. connection's authentication
-#: ../control-center/gdaui-dsn-editor.c:223 ../libgda/gda-config.c:1277
-#: ../tools/browser/auth-dialog.c:218
+#: ../control-center/gdaui-dsn-editor.c:223 ../libgda/gda-config.c:1331
+#: ../tools/browser/auth-dialog.c:281
 msgid "Authentication"
 msgstr "Godkendelse"
 
@@ -442,7 +450,7 @@ msgstr "Godkendelse"
 # Kunne dog være en beskrivelse, '�bning af forbindelse'
 #: ../control-center/gdaui-login-dialog.c:79
 #: ../control-center/gdaui-login-dialog.c:87
-#: ../tools/browser/auth-dialog.c:174 ../tools/browser/login-dialog.c:192
+#: ../tools/browser/auth-dialog.c:233 ../tools/browser/login-dialog.c:192
 msgid "Connection opening"
 msgstr "Forbindelse åbnes"
 
@@ -463,7 +471,7 @@ msgstr ""
 "bekræft åbning af forbindelse"
 
 #: ../control-center/main.c:57 ../libgda-ui/internal/utility.c:529
-#: ../tools/browser/support.c:137
+#: ../tools/browser/support.c:138
 msgid "Error:"
 msgstr "Fejl:"
 
@@ -475,7 +483,7 @@ msgstr "Kunne ikke erklære ny datakilde"
 msgid "No valid data source info was created"
 msgstr "Ingen gyldig information for datakilde blev oprettet"
 
-#: ../control-center/main.c:184 ../tools/browser/browser-window.c:1028
+#: ../control-center/main.c:184 ../tools/browser/browser-window.c:1069
 msgid "Database access services for the GNOME Desktop"
 msgstr "Adgangstjenester for databaser til GNOME-skrivebordet"
 
@@ -506,80 +514,100 @@ msgstr "Udtryk kunne ikke findes i batch-udtryk"
 msgid "Conflicting parameter '%s'"
 msgstr "Modstridende parameter '%s'"
 
-#: ../libgda/gda-config.c:507
+#: ../libgda/gda-config.c:264 ../libgda/gda-config.c:382
+#, c-format
+msgid "Error loading authentification information for '%s' DSN: %s"
+msgstr "Fejl ved åbning af godkendelsesinformation for DSN '%s': %s"
+
+#: ../libgda/gda-config.c:542
 #, c-format
 msgid "Error creating user specific configuration directory '%s'"
 msgstr "Fejl ved oprettelse af brugerspecifik konfigurationsmappe '%s'"
 
-#: ../libgda/gda-config.c:556 ../libgda/gda-config.c:569
+#: ../libgda/gda-config.c:591 ../libgda/gda-config.c:604
 #, c-format
 msgid ""
 "User specific configuration directory '%s' exists and is not a directory"
 msgstr "Brugerspecifik konfigurationsmappe '%s' findes og er ikke en mappe"
 
-#: ../libgda/gda-config.c:832
+#: ../libgda/gda-config.c:818
 #, c-format
 msgid "Malformed data source name '%s'"
 msgstr "Forkert udformet datakildenavn '%s'"
 
-#: ../libgda/gda-config.c:876 ../libgda/gda-config.c:965
+#: ../libgda/gda-config.c:842
+#, c-format
+msgid "Couldn't save authentification information for DSN '%s': %s"
+msgstr "Kunne ikke gemme godkendelsesinformation for DSN '%s': %s"
+
+#: ../libgda/gda-config.c:872 ../libgda/gda-config.c:998
 msgid "Can't manage system-wide configuration"
 msgstr "Kan ikke håndtere systemudbredt konfiguration"
 
-#: ../libgda/gda-config.c:959 ../libgda-ui/gdaui-login.c:612
+#: ../libgda/gda-config.c:927
+#, c-format
+msgid "Authentification for the '%s' DSN"
+msgstr "Godkendelse for DSN'et '%s'"
+
+#: ../libgda/gda-config.c:962
+#, c-format
+msgid "Couldn't delete authentication information for DSN '%s': %s"
+msgstr "Kunne ikke slette godkendelsesinformation for DSN '%s': %s"
+
+#: ../libgda/gda-config.c:992 ../libgda-ui/gdaui-login.c:632
 #, c-format
 msgid "Unknown DSN '%s'"
 msgstr "Ukendt DSN '%s'"
 
-#: ../libgda/gda-config.c:1009
+#: ../libgda/gda-config.c:1063
 #, c-format
 msgid "Provider '%s' not found"
 msgstr "Leverandør '%s' ikke fundet"
 
-#: ../libgda/gda-config.c:1192 ../libgda/gda-connection.c:965
-#: ../libgda/gda-connection.c:1119
+#: ../libgda/gda-config.c:1246 ../libgda/gda-connection.c:1013
+#: ../libgda/gda-connection.c:1167
 #, c-format
 msgid "No provider '%s' installed"
 msgstr "Ingen leverandør '%s' installeret"
 
-#: ../libgda/gda-config.c:1207
+#: ../libgda/gda-config.c:1261
 #, c-format
 msgid "Can't load provider: %s"
 msgstr "Kunne ikke indlæse leverandør: %s"
 
-#: ../libgda/gda-config.c:1230
+#: ../libgda/gda-config.c:1284
 #, c-format
 msgid "Can't instantiate provider '%s'"
 msgstr "Kan ikke instantiere leverandør '%s'"
 
-#: ../libgda/gda-config.c:1274 ../libgda/gda-data-model-dsn-list.c:111
-#: ../libgda/gda-data-model-dsn-list.c:112 ../tools/gda-sql.c:1842
-#: ../tools/gda-sql.c:2688 ../tools/gda-sql.c:2860 ../tools/gda-sql.c:3077
+#: ../libgda/gda-config.c:1328 ../libgda/gda-data-model-dsn-list.c:111
+#: ../libgda/gda-data-model-dsn-list.c:112 ../tools/gda-sql.c:1850
+#: ../tools/gda-sql.c:2696 ../tools/gda-sql.c:2868 ../tools/gda-sql.c:3085
 msgid "Provider"
 msgstr "Leverandør"
 
-#: ../libgda/gda-config.c:1275 ../libgda/gda-data-model-dsn-list.c:117
+#: ../libgda/gda-config.c:1329 ../libgda/gda-data-model-dsn-list.c:117
 #: ../libgda/gda-data-model-dsn-list.c:118
 #: ../libgda/gda-server-provider-extra.c:377
-#: ../libgda/gda-server-provider-extra.c:400 ../tools/gda-sql.c:1843
-#: ../tools/gda-sql.c:2687 ../tools/gda-sql.c:2861
+#: ../libgda/gda-server-provider-extra.c:400 ../tools/gda-sql.c:1851
+#: ../tools/gda-sql.c:2695 ../tools/gda-sql.c:2869
 msgid "Description"
 msgstr "Beskrivelse"
 
-#: ../libgda/gda-config.c:1276
+#: ../libgda/gda-config.c:1330
 msgid "DSN parameters"
 msgstr "DSN-parametre"
 
-#: ../libgda/gda-config.c:1278
+#: ../libgda/gda-config.c:1332
 msgid "File"
 msgstr "Fil"
 
-#: ../libgda/gda-config.c:1279
+#: ../libgda/gda-config.c:1333
 msgid "List of installed providers"
 msgstr "Liste over installerede leverandører"
 
-#: ../libgda/gda-config.c:1443 ../libgda/gda-data-model-dsn-list.c:131
-#: ../libgda/gda-data-model-dsn-list.c:132 ../tools/gda-sql.c:3079
+#: ../libgda/gda-config.c:1497 ../libgda/gda-data-model-dsn-list.c:131
+#: ../libgda/gda-data-model-dsn-list.c:132 ../tools/gda-sql.c:3087
 msgid "Username"
 msgstr "Brugernavn"
 
@@ -588,7 +616,7 @@ msgstr "Brugernavn"
 #. This file contains the CREATE ROLE operation's parameters, which is
 #. available since PostgreSQL 8.1
 #.
-#: ../libgda/gda-config.c:1445
+#: ../libgda/gda-config.c:1499
 #: ../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
@@ -596,28 +624,28 @@ msgstr "Brugernavn"
 msgid "Password"
 msgstr "Adgangskode"
 
-#: ../libgda/gda-config.c:1515
+#: ../libgda/gda-config.c:1569
 #, c-format
 msgid "Error loading provider '%s': %s"
 msgstr "Kunne ikke indlæse leverandør '%s': %s"
 
-#: ../libgda/gda-connection.c:295
+#: ../libgda/gda-connection.c:306
 msgid "DSN to use"
 msgstr "DSN der skal bruges"
 
-#: ../libgda/gda-connection.c:298
+#: ../libgda/gda-connection.c:309
 msgid "Connection string to use"
 msgstr "Forbindelsesstreng der skal bruges"
 
-#: ../libgda/gda-connection.c:301
+#: ../libgda/gda-connection.c:312
 msgid "Provider to use"
 msgstr "Leverandør der skal bruges"
 
-#: ../libgda/gda-connection.c:306
+#: ../libgda/gda-connection.c:317
 msgid "Authentication string to use"
 msgstr "Godkendelsesstreng der skal bruges"
 
-#: ../libgda/gda-connection.c:310 ../libgda/gda-server-provider-extra.c:409
+#: ../libgda/gda-connection.c:321 ../libgda/gda-server-provider-extra.c:409
 #: ../libgda-ui/data/server_operation.glade.h:5
 #: ../libgda-ui/gdaui-server-operation.c:792
 #: ../providers/postgres/postgres_specs_create_db.xml.in.h:55
@@ -627,11 +655,11 @@ msgid "Options"
 msgstr "Indstillinger"
 
 #. To translators: Don't translate "GdaMetaStore", it's a class name
-#: ../libgda/gda-connection.c:315
+#: ../libgda/gda-connection.c:326
 msgid "GdaMetaStore used by the connection"
 msgstr "GdaMetaStore brugt af forbindelsen"
 
-#: ../libgda/gda-connection.c:321
+#: ../libgda/gda-connection.c:332
 msgid ""
 "Unique GThread from which the connection will be available.This should only "
 "be modified by the database providers' implementation"
@@ -639,7 +667,7 @@ msgstr ""
 "Unik GThread hvorfra forbindelsen vil være tilgængelig. Denne bør kun ændres "
 "af databaseleverandørens implementering"
 
-#: ../libgda/gda-connection.c:332
+#: ../libgda/gda-connection.c:343
 msgid ""
 "Tells if the connection acts as a thread wrapper around another connection, "
 "making it completely thread safe"
@@ -647,7 +675,7 @@ msgstr ""
 "Fortæller om forbindelsen optræder som en trådgrænseflade til en anden "
 "forbindelse, hvilket gør den fuldstændig trådsikker"
 
-#: ../libgda/gda-connection.c:347
+#: ../libgda/gda-connection.c:358
 msgid ""
 "Make the connection set up a monitoring function in the mainloop to monitor "
 "the wrapped connection"
@@ -655,62 +683,62 @@ msgstr ""
 "Lad forbindelsen sætte en overvågningsfunktion op i hovedløkken til at "
 "overvåge den ombrudte forbindelse"
 
-#: ../libgda/gda-connection.c:605 ../libgda/gda-connection.c:633
-#: ../libgda/gda-connection.c:647 ../libgda/gda-connection.c:662
+#: ../libgda/gda-connection.c:645 ../libgda/gda-connection.c:673
+#: ../libgda/gda-connection.c:687 ../libgda/gda-connection.c:702
 #, c-format
 msgid "Could not set the '%s' property when the connection is opened"
 msgstr "Kunne ikke angive egenskaben '%s' når forbindelsen er åbnet"
 
-#: ../libgda/gda-connection.c:613
+#: ../libgda/gda-connection.c:653
 #, c-format
 msgid "No DSN named '%s' defined"
 msgstr "Ingen DSN-navngivet '%s' defineret"
 
-#: ../libgda/gda-connection.c:683
+#: ../libgda/gda-connection.c:723
 #, c-format
 msgid "Can't set the '%s' property once the connection is opened"
 msgstr "Kan ikke angive egenskaben '%s' når forbindelsen er åbnet"
 
-#: ../libgda/gda-connection.c:910 ../libgda/gda-connection.c:1060
+#: ../libgda/gda-connection.c:958 ../libgda/gda-connection.c:1108
 #: ../libgda/thread-wrapper/gda-thread-provider.c:428
 #: ../libgda/thread-wrapper/gda-thread-provider.c:513
 msgid "Multi threading is not supported or enabled"
 msgstr "Flertrådning er ikke understøttet eller slået til"
 
-#: ../libgda/gda-connection.c:919
+#: ../libgda/gda-connection.c:967
 #, c-format
 msgid "Malformed data source specification '%s'"
 msgstr "Forkert udformet specifikation af datakilde '%s'"
 
-#: ../libgda/gda-connection.c:927 ../libgda/gda-connection.c:1307
-#: ../libgda/gda-connection.c:1309
+#: ../libgda/gda-connection.c:975 ../libgda/gda-connection.c:1355
+#: ../libgda/gda-connection.c:1357
 #, c-format
 msgid "Data source %s not found in configuration"
 msgstr "Datakilde %s ikke fundet i konfiguration"
 
-#: ../libgda/gda-connection.c:993
+#: ../libgda/gda-connection.c:1041
 msgid "Datasource configuration error: no provider specified"
 msgstr "Konfigurationsfejl for datakilde: Ingen leverandør angivet"
 
-#: ../libgda/gda-connection.c:1070 ../tools/browser/auth-dialog.c:329
-#: ../tools/browser/auth-dialog.c:365 ../tools/gda-sql.c:1308
+#: ../libgda/gda-connection.c:1118 ../tools/browser/auth-dialog.c:417
+#: ../tools/browser/auth-dialog.c:453 ../tools/gda-sql.c:1309
 #, c-format
 msgid "Malformed connection string '%s'"
 msgstr "Forkert udformet forbindelsestreng '%s'"
 
-#: ../libgda/gda-connection.c:1076 ../libgda/gda-connection.c:1331
+#: ../libgda/gda-connection.c:1124 ../libgda/gda-connection.c:1379
 msgid "No provider specified"
 msgstr "Ingen leverandør angivet"
 
-#: ../libgda/gda-connection.c:1319 ../libgda/gda-connection.c:1321
+#: ../libgda/gda-connection.c:1367 ../libgda/gda-connection.c:1369
 msgid "No DSN or connection string specified"
 msgstr "Ingen DSN eller forbindelsesstreng angivet"
 
-#: ../libgda/gda-connection.c:1345
+#: ../libgda/gda-connection.c:1399
 msgid "Provider does not allow usage from this thread"
 msgstr "Leverandør tillader ikke brug fra denne tråd"
 
-#: ../libgda/gda-connection.c:1359
+#: ../libgda/gda-connection.c:1413
 msgid ""
 "Internal error: provider does not implement the open_connection() virtual "
 "method"
@@ -718,82 +746,83 @@ msgstr ""
 "Intern fejl: Leverandør implementerer ikke den virtuelle metode "
 "open_connection()"
 
-#: ../libgda/gda-connection.c:1468
-#, fuzzy, c-format
+# lyder som dobbeltkonfekt, ville sige Fejl ved vedligeholdelse af matadata
+#: ../libgda/gda-connection.c:1522
+#, c-format
 msgid "Error while maintaining the meta data up to date: %s"
-msgstr "Fejl ved hentning af metadata fra forbindelsen: %s"
+msgstr "Fejl ved vedligeholdelse af metadata: %s"
 
-#: ../libgda/gda-connection.c:2012
+#: ../libgda/gda-connection.c:2173
 msgid "Provider does not support statement preparation"
 msgstr "Leverandøren understøtter ikke udtryksforberedelse"
 
-#: ../libgda/gda-connection.c:2207 ../libgda/gda-connection.c:2293
-#: ../libgda/gda-connection.c:2363 ../libgda/gda-meta-store.c:659
+#: ../libgda/gda-connection.c:2368 ../libgda/gda-connection.c:2454
+#: ../libgda/gda-connection.c:2524 ../libgda/gda-meta-store.c:659
 #, c-format
 msgid "Can't obtain connection lock"
 msgstr "Kunne ikke opnå forbindelseslås"
 
-#: ../libgda/gda-connection.c:2214 ../libgda/gda-connection.c:2429
-#: ../libgda/gda-connection.c:2700 ../libgda/gda-connection.c:2772
-#: ../libgda/gda-connection.c:2842
+#: ../libgda/gda-connection.c:2375 ../libgda/gda-connection.c:2591
+#: ../libgda/gda-connection.c:2862 ../libgda/gda-connection.c:2932
+#: ../libgda/gda-connection.c:3002
 #: ../libgda/sqlite/virtual/gda-vconnection-hub.c:217
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1614
+#: ../libgda/thread-wrapper/gda-thread-provider.c:1619
 #, c-format
 msgid "Connection is closed"
 msgstr "Forbindelse er lukket"
 
-#: ../libgda/gda-connection.c:2308 ../libgda/gda-connection.c:2398
+#: ../libgda/gda-connection.c:2469 ../libgda/gda-connection.c:2559
 #, c-format
 msgid "Can't find task %u"
 msgstr "Kan ikke finde opgave %u"
 
-#: ../libgda/gda-connection.c:2386 ../libgda/sqlite/gda-sqlite-provider.c:1005
+#: ../libgda/gda-connection.c:2547 ../libgda/sqlite/gda-sqlite-provider.c:1008
 #: ../libgda/thread-wrapper/gda-thread-provider.c:917
-#: ../providers/jdbc/gda-jdbc-provider.c:571
-#: ../providers/mysql/gda-mysql-provider.c:959
-#: ../providers/postgres/gda-postgres-provider.c:886
-#: ../providers/web/gda-web-provider.c:671
+#: ../providers/jdbc/gda-jdbc-provider.c:575
+#: ../providers/mysql/gda-mysql-provider.c:963
+#: ../providers/postgres/gda-postgres-provider.c:896
+#: ../providers/web/gda-web-provider.c:674
 msgid "Provider does not support asynchronous server operation"
 msgstr "Leverandør understøtter ikke asynkron serverhandling"
 
 # bør nok være select-udtryk, evt. selektionsudtryk hvis vi vil bruge
 # noget pseudo-dansk
-#: ../libgda/gda-connection.c:2571 ../libgda/gda-connection.c:2586
+#: ../libgda/gda-connection.c:2733 ../libgda/gda-connection.c:2748
 msgid "Statement is a selection statement"
 msgstr "Udtryk er et select-udtryk"
 
-#: ../libgda/gda-connection.c:2644 ../libgda/gda-connection.c:2720
-#: ../libgda/gda-connection.c:2792
+#: ../libgda/gda-connection.c:2806 ../libgda/gda-connection.c:2882
+#: ../libgda/gda-connection.c:2952
 msgid "Statement is not a selection statement"
 msgstr "Udtryk er ikke et select-udtryk"
 
-#: ../libgda/gda-connection.c:3251
+#: ../libgda/gda-connection.c:3411
 msgid "Invalid argument"
 msgstr "Ugyldig parameter"
 
-#: ../libgda/gda-connection.c:3260
+#: ../libgda/gda-connection.c:3420
 #, c-format
 msgid "Missing or wrong arguments for table '%s': %s"
 msgstr "Manglende eller forkert parameter for tabel '%s': %s"
 
-#: ../libgda/gda-connection.c:4015
+#: ../libgda/gda-connection.c:4175
 msgid "Meta update error"
 msgstr "Metaopdateringsfejl"
 
-#: ../libgda/gda-connection.c:4578
+#: ../libgda/gda-connection.c:4738
 msgid "Wrong filter arguments"
 msgstr "Forkerte filterparametre"
 
-#: ../libgda/gda-connection.c:4729 ../libgda/gda-connection.c:4782
-#: ../libgda/gda-connection.c:4826 ../libgda/gda-connection.c:4870
-#: ../libgda/gda-connection.c:4914
+#: ../libgda/gda-connection.c:4926 ../libgda/gda-connection.c:4979
+#: ../libgda/gda-connection.c:5023 ../libgda/gda-connection.c:5067
+#: ../libgda/gda-connection.c:5111
 #, c-format
 msgid "Connection transaction status tracking: no transaction exists for %s"
 msgstr ""
 "Sporing af transaktionsstatus for forbindelse: Ingen transaktion findes for %"
 "s"
 
-#: ../libgda/gda-connection.c:5222
+#: ../libgda/gda-connection.c:5416
 #: ../libgda/sqlite/virtual/gda-virtual-connection.c:235
 msgid "Internal error: invalid provider handle"
 msgstr "Intern fejl: Ugyldigt leverandørhåndtag"
@@ -801,12 +830,12 @@ msgstr "Intern fejl: Ugyldigt leverandørhåndtag"
 #: ../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:792
-#: ../libgda/gda-data-model-dir.c:891 ../libgda/gda-data-model-dir.c:933
+#: ../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:3475
-#: ../libgda/gda-data-select.c:1196 ../libgda/gda-data-select.c:1694
-#: ../libgda/gda-data-select.c:2589 ../libgda/gda-data-select.c:2656
+#: ../libgda/gda-data-model-iter.c:1018 ../libgda/gda-data-proxy.c:3494
+#: ../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
 #, c-format
 msgid "Column %d out of range (0-%d)"
@@ -860,21 +889,21 @@ msgid "Whether data model can be modified"
 msgstr "Hvorvidt datamodel kan ændres"
 
 #: ../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:803
-#: ../libgda/gda-data-model-dir.c:975 ../libgda/gda-data-model-dir.c:1329
-#: ../libgda/gda-data-model-dsn-list.c:319 ../libgda/gda-data-proxy.c:3424
-#: ../libgda/gda-data-proxy.c:3462 ../libgda/gda-data-select.c:1650
-#: ../libgda/gda-data-select.c:1704
+#: ../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:3443
+#: ../libgda/gda-data-proxy.c:3481 ../libgda/gda-data-select.c:1649
+#: ../libgda/gda-data-select.c:1703
 #, c-format
 msgid "Row %d out of range (0-%d)"
 msgstr "Række %d uden for interval (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:806
-#: ../libgda/gda-data-model-dir.c:978 ../libgda/gda-data-model-dir.c:1332
-#: ../libgda/gda-data-model-dsn-list.c:322 ../libgda/gda-data-proxy.c:3427
-#: ../libgda/gda-data-proxy.c:3465 ../libgda/gda-data-select.c:1653
-#: ../libgda/gda-data-select.c:1707
+#: ../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:3446
+#: ../libgda/gda-data-proxy.c:3484 ../libgda/gda-data-select.c:1652
+#: ../libgda/gda-data-select.c:1706
 #, c-format
 msgid "Row %d not found (empty data model)"
 msgstr "Række %d ikke fundet (tom datamodel)"
@@ -933,88 +962,90 @@ msgstr "Forventede GdaBinary-værdi, fik %s"
 msgid "Key modification is not supported"
 msgstr "Nøgleændring er ikke understøttet"
 
-#: ../libgda/gda-data-model.c:617
+#: ../libgda/gda-data-model.c:620
 msgid "Data model does not support getting individual value"
 msgstr "Datamodel understøtter ikke indhentelse af individuel værdi"
 
-#: ../libgda/gda-data-model.c:660 ../libgda/gda-data-model.c:670
+#: ../libgda/gda-data-model.c:663 ../libgda/gda-data-model.c:673
 #, c-format
 msgid "Data model returned value of invalid '%s' type"
 msgstr "Datamodel returnerede værdi på ugyldig type '%s'"
 
-#: ../libgda/gda-data-model.c:667
+#: ../libgda/gda-data-model.c:670
 msgid "Data model returned invalid NULL value"
 msgstr "Datamodel returnerede ugyldig NULL-værdi"
 
-#: ../libgda/gda-data-model.c:727
+#: ../libgda/gda-data-model.c:730
 msgid "Data model does not support setting individual value"
 msgstr "Datamodel understøtter ikke angivelse af individuel værdi"
 
-#: ../libgda/gda-data-model.c:760
+#: ../libgda/gda-data-model.c:763
 msgid "Data model does not support setting values"
 msgstr "Datamodel understøtter ikke angivelse af værdier"
 
-#: ../libgda/gda-data-model.c:823 ../libgda/gda-data-model.c:857
+#: ../libgda/gda-data-model.c:826 ../libgda/gda-data-model.c:860
 msgid "Data model does not support row append"
 msgstr "Datamodel understøtter ikke rækketilføjelse"
 
-#: ../libgda/gda-data-model.c:848
+#: ../libgda/gda-data-model.c:851
 msgid "Model does not allow row insertion"
 msgstr "Model tillader ikke rækkeindsættelse"
 
-#: ../libgda/gda-data-model.c:883
+#: ../libgda/gda-data-model.c:886
 msgid "Model does not allow row deletion"
 msgstr "Model tillader ikke rækkesletning"
 
-#: ../libgda/gda-data-model.c:892
+#: ../libgda/gda-data-model.c:895
 msgid "Data model does not support row removal"
 msgstr "Datamodel understøtter ikke rækkefjernelse"
 
-#: ../libgda/gda-data-model.c:1033 ../libgda/gda-data-model.c:1072
-#: ../libgda/gda-data-model.c:1086
+#: ../libgda/gda-data-model.c:1038 ../libgda/gda-data-model.c:1079
+#: ../libgda/gda-data-model.c:1093
 #, c-format
 msgid "The '%s' parameter must hold a string value, ignored."
 msgstr "Parametren '%s' skal indeholde en strengværdi, ignoreret."
 
-#: ../libgda/gda-data-model.c:1095 ../libgda/gda-data-model.c:1181
+#: ../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
 #, c-format
 msgid "The '%s' parameter must hold a boolean value, ignored."
 msgstr "Parametren '%s' skal indeholde en boolesk værdi, ignoreret."
 
-#: ../libgda/gda-data-model.c:1189
+#: ../libgda/gda-data-model.c:1261
 #, c-format
 msgid "File '%s' already exists"
 msgstr "Filen '%s' findes allerede"
 
-#: ../libgda/gda-data-model.c:1303
+#: ../libgda/gda-data-model.c:1401
 msgid "Exported Data"
 msgstr "Eksporteret data"
 
-#: ../libgda/gda-data-model.c:1420
+#: ../libgda/gda-data-model.c:1518
 #, c-format
 msgid "Expected tag <gda_value> or <gda_array_value>, got <%s>, ignoring"
 msgstr ""
 "Forventede mærke <gda_value> eller <gda_array_value>, fik <%s>, ignoreret"
 
-#: ../libgda/gda-data-model.c:1451
+#: ../libgda/gda-data-model.c:1549
 msgid "Cannot retrieve column data type (type is UNKNOWN or not specified)"
 msgstr "Kan ikke indhente kolonnedatatype (type er UKENDT eller ikke angivet)"
 
-#: ../libgda/gda-data-model.c:1537
+#: ../libgda/gda-data-model.c:1635
 #, c-format
 msgid "Expected tag <gda_array_data>, got <%s>"
 msgstr "Forventede mærke <gda_array_data>, fik <%s>"
 
-#: ../libgda/gda-data-model.c:1600
+#: ../libgda/gda-data-model.c:1698
 msgid "Could not get an iterator for source data model"
 msgstr "Kunne ikke indhente en iterator til kildedatamodellen"
 
-#: ../libgda/gda-data-model.c:1617
+#: ../libgda/gda-data-model.c:1715
 #, c-format
 msgid "Inexistent column in source data model: %d"
 msgstr "Ikkeeksisterende kolonne i kildedatamodel: %d"
 
-#: ../libgda/gda-data-model.c:1631
+#: ../libgda/gda-data-model.c:1729
 #, c-format
 msgid ""
 "Destination column %d can't be NULL but has no correspondence in the source "
@@ -1023,7 +1054,7 @@ msgstr ""
 "Målkolonne %d kan ikke være NULL men har ingen korrespondance i "
 "kildedatamodellen"
 
-#: ../libgda/gda-data-model.c:1641
+#: ../libgda/gda-data-model.c:1739
 #, c-format
 msgid ""
 "Destination column %d has a gda type (%s) incompatible with source column %d "
@@ -1032,17 +1063,17 @@ msgstr ""
 "MÃ¥lkolonne %d har en gda-type (%s) som er inkompatibel med typen af "
 "kildekolonne %d (%s)"
 
-#: ../libgda/gda-data-model.c:1738
+#: ../libgda/gda-data-model.c:1836
 #, c-format
 msgid "Can't transform '%s' from GDA type %s to GDA type %s"
 msgstr "Kan ikke transformere '%s' fra GDA-type %s til GDA-type %s"
 
-#: ../libgda/gda-data-model.c:1932
+#: ../libgda/gda-data-model.c:2030
 #, c-format
 msgid "Could not dump data model's attributes: %s"
 msgstr "Kunne ikke smide datamodels attributter: %s"
 
-#: ../libgda/gda-data-model.c:1940
+#: ../libgda/gda-data-model.c:2038
 #, c-format
 msgid "Could not dump data model's contents: %s"
 msgstr "Kunne ikke smide datamodels indhold: %s"
@@ -1050,75 +1081,75 @@ msgstr "Kunne ikke smide datamodels indhold: %s"
 # Burde nok have været to sætninger:
 # ...backward cursor move.  [Therefore] not displaying data.
 # altså en lidt anden betydning.
-#: ../libgda/gda-data-model.c:2174
+#: ../libgda/gda-data-model.c:2286
 msgid "Data model does not support backward cursor move, not displaying data"
 msgstr ""
 "Datamodel understøtter ikke baglæns markørbevægelse. Derfor vises data ikke"
 
-#: ../libgda/gda-data-model.c:2293
+#: ../libgda/gda-data-model.c:2405
 #, c-format
 msgid "(%d row)\n"
 msgid_plural "(%d rows)\n"
 msgstr[0] "(%d række)\n"
 msgstr[1] "(%d rækker)\n"
 
-#: ../libgda/gda-data-model-dir.c:875
+#: ../libgda/gda-data-model-dir.c:859
 msgid "Row not found"
 msgstr "Række ikke fundet"
 
-#: ../libgda/gda-data-model-dir.c:1000 ../libgda/gda-data-model-dir.c:1002
+#: ../libgda/gda-data-model-dir.c:984 ../libgda/gda-data-model-dir.c:986
 msgid "Column cannot be modified"
 msgstr "Kolonne kan ikke ændres"
 
-#: ../libgda/gda-data-model-dir.c:1015 ../libgda/gda-data-model-dir.c:1017
-#: ../libgda/gda-data-model-dir.c:1226 ../libgda/gda-data-model-dir.c:1228
+#: ../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
 msgid "New path must be a subpath of the base directory"
 msgstr "Ny sti skal være en understi af basemappen"
 
-#: ../libgda/gda-data-model-dir.c:1061 ../libgda/gda-data-model-dir.c:1105
+#: ../libgda/gda-data-model-dir.c:1045 ../libgda/gda-data-model-dir.c:1089
 #, c-format
 msgid "Could not rename file '%s' to '%s'"
 msgstr "Kunne ikke omdøbe fil '%s' til '%s'"
 
-#: ../libgda/gda-data-model-dir.c:1085
+#: ../libgda/gda-data-model-dir.c:1069
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Kunne ikke oprette mappe '%s'"
 
-#: ../libgda/gda-data-model-dir.c:1154
+#: ../libgda/gda-data-model-dir.c:1138
 #, c-format
 msgid "Could not overwrite contents of file '%s'"
 msgstr "Kunne ikke overskrive indholdet af filen '%s'"
 
-#: ../libgda/gda-data-model-dir.c:1172 ../libgda/gda-data-model-dir.c:1173
+#: ../libgda/gda-data-model-dir.c:1156 ../libgda/gda-data-model-dir.c:1157
 msgid "Wrong type of data"
 msgstr "Forkert datatype"
 
-#: ../libgda/gda-data-model-dir.c:1214 ../libgda/gda-data-model-dir.c:1216
+#: ../libgda/gda-data-model-dir.c:1198 ../libgda/gda-data-model-dir.c:1200
 msgid "Column cannot be set"
 msgstr "Kolonne kan ikke angives"
 
-#: ../libgda/gda-data-model-dir.c:1287
+#: ../libgda/gda-data-model-dir.c:1271
 #, c-format
 msgid "Cannot set contents of filename '%s'"
 msgstr "Kan ikke angive indhold på filnavn '%s'"
 
-#: ../libgda/gda-data-model-dir.c:1298
+#: ../libgda/gda-data-model-dir.c:1282
 #, c-format
 msgid "Cannot create directory '%s'"
 msgstr "Kan ikke oprette mappe '%s'"
 
-#: ../libgda/gda-data-model-dir.c:1306 ../libgda/gda-data-model-dir.c:1308
+#: ../libgda/gda-data-model-dir.c:1290 ../libgda/gda-data-model-dir.c:1292
 msgid "Cannot add row: filename missing"
 msgstr "Kan ikke tilføje række: Filnavn mangler"
 
-#: ../libgda/gda-data-model-dir.c:1348
+#: ../libgda/gda-data-model-dir.c:1332
 #, c-format
 msgid "Cannot remove file '%s'"
 msgstr "Kan ikke fjerne fil '%s'"
 
 #: ../libgda/gda-data-model-dsn-list.c:105
-#: ../libgda/gda-data-model-dsn-list.c:106 ../tools/gda-sql.c:2686
+#: ../libgda/gda-data-model-dsn-list.c:106 ../tools/gda-sql.c:2694
 msgid "DSN"
 msgstr "DSN"
 
@@ -1171,7 +1202,7 @@ msgid "Character conversion at line %d, error: %s"
 msgstr "Tegnomdannelse på linje %d, fejl: %s"
 
 #: ../libgda/gda-data-model-import.c:904
-#: ../libgda/sqlite/gda-sqlite-provider.c:688
+#: ../libgda/sqlite/gda-sqlite-provider.c:691
 #: ../providers/bdb/gda-bdb-provider.c:208
 #: ../tools/browser/common/gdaui-data-import.c:177
 msgid "no detail"
@@ -1271,7 +1302,7 @@ msgid "GdaDataProxy can't handle non random access data models"
 msgstr ""
 "GdaDataProxy kan ikke håndtere datamodeller med adgang der ikke er vilkårlig"
 
-#: ../libgda/gda-data-proxy.c:1538 ../libgda/gda-data-proxy.c:3881
+#: ../libgda/gda-data-proxy.c:1538 ../libgda/gda-data-proxy.c:3899
 msgid ""
 "The first row is an empty row artificially prepended and cannot be removed"
 msgstr ""
@@ -1301,7 +1332,7 @@ msgstr ""
 "\" (row-updated) eller \"række fjernet\" (row-removed). Dette kan være en "
 "fejl i implementationen af %s (rapporter venligst fejlen)."
 
-#: ../libgda/gda-data-proxy.c:2930 ../tools/gda-sql.c:3241
+#: ../libgda/gda-data-proxy.c:2930 ../tools/gda-sql.c:3249
 msgid "Could not create virtual connection"
 msgstr "Kunne ikke oprette virtuel forbindelse"
 
@@ -1309,53 +1340,53 @@ msgstr "Kunne ikke oprette virtuel forbindelse"
 msgid "Error in filter expression"
 msgstr "Fejl i filterudtryk"
 
-#: ../libgda/gda-data-proxy.c:3098 ../libgda/gda-data-select.c:1444
+#: ../libgda/gda-data-proxy.c:3098 ../libgda/gda-data-select.c:1445
 msgid "Incorrect filter expression"
 msgstr "Ukorrekt filterudtryk"
 
-#: ../libgda/gda-data-proxy.c:3636
+#: ../libgda/gda-data-proxy.c:3654
 msgid ""
 "The first row is an empty row artificially prepended and cannot be altered"
 msgstr ""
 "Den første række er en tom række kunstigt tilføjet, som ikke kan ændres"
 
-#: ../libgda/gda-data-proxy.c:3658
+#: ../libgda/gda-data-proxy.c:3676
 #, c-format
 msgid "Wrong value type: expected '%s' and got '%s'"
 msgstr "Forkert værditype: Forventede '%s' og fik '%s'"
 
-#: ../libgda/gda-data-proxy.c:3744
+#: ../libgda/gda-data-proxy.c:3762
 #, c-format
 msgid "Trying to change read-only column: %d"
 msgstr "Forsøger at ændre skrivebeskyttet kolonne: %d"
 
-#: ../libgda/gda-data-proxy.c:3781
+#: ../libgda/gda-data-proxy.c:3799
 #, c-format
 msgid "Value type mismatch %s instead of %s"
 msgstr "Misforhold i værditype %s i steden for %s"
 
-#: ../libgda/gda-data-select.c:366
+#: ../libgda/gda-data-select.c:367
 #, c-format
 msgid "Could not re-run SELECT statement: %s"
 msgstr "Kunne ikke genkøre SELECT-udtryk: %s"
 
-#: ../libgda/gda-data-select.c:952
+#: ../libgda/gda-data-select.c:953
 msgid "Incorrect SQL expression"
 msgstr "Ukorrekt SQL-udtryk"
 
-#: ../libgda/gda-data-select.c:977
+#: ../libgda/gda-data-select.c:978
 msgid "Internal error: the \"prepared-stmt\" property has not been set"
 msgstr "Intern fejl: Egenskaben prepared-stmt er ikke angivet"
 
-#: ../libgda/gda-data-select.c:984
+#: ../libgda/gda-data-select.c:985
 msgid "Can't get the prepared statement's actual statement"
 msgstr "Kan ikke indhente det forberedte udtryks faktiske udtryk"
 
-#: ../libgda/gda-data-select.c:990
+#: ../libgda/gda-data-select.c:991
 msgid "Unsupported type of SELECT statement"
 msgstr "Type af SELECT-udtryk der ikke er understøttet"
 
-#: ../libgda/gda-data-select.c:1059
+#: ../libgda/gda-data-select.c:1060
 msgid "INSERT statement must contain values to insert"
 msgstr "INSERT-udtryk skal indeholde værdier til indsættelse"
 
@@ -1365,65 +1396,65 @@ msgstr "INSERT-udtryk skal indeholde værdier til indsættelse"
 # blive forstået rigtigt alligevel).
 # I dette tilfælde (hvad man 'kun' må) er der tale om en streng begrænsning:
 # msgstr "INSERT-udtryk må kun indsætte en [enkelt] række"
-#: ../libgda/gda-data-select.c:1065
+#: ../libgda/gda-data-select.c:1066
 msgid "INSERT statement must insert only one row"
 msgstr "INSERT-udtryk skal kun indsætte en række"
 
-#: ../libgda/gda-data-select.c:1092
+#: ../libgda/gda-data-select.c:1093
 msgid "DELETE statement must have a WHERE part"
 msgstr "DELETE-udtryk skal have en WHERE-del"
 
-#: ../libgda/gda-data-select.c:1132
+#: ../libgda/gda-data-select.c:1133
 msgid "UPDATE statement must have a WHERE part"
 msgstr "UPDATE-udtryk skal have en WHERE-del"
 
-#: ../libgda/gda-data-select.c:1186
+#: ../libgda/gda-data-select.c:1187
 #, c-format
 msgid "Modification statement uses an unknown '%s' parameter"
 msgstr "Ã?ndringsudtryk bruger en ukendt parameter '%s'"
 
-#: ../libgda/gda-data-select.c:1208
+#: ../libgda/gda-data-select.c:1209
 #, c-format
 msgid "Modification statement's  '%s' parameter is a %s when it should be a %s"
 msgstr "�ndringsudtrykkets parameter '%s' er en %s, men det skulle være en %s"
 
-#: ../libgda/gda-data-select.c:1245
+#: ../libgda/gda-data-select.c:1246
 msgid "Modification statement must be an INSERT, UPDATE or DELETE statement"
 msgstr "�ndringsudtryk skal være et INSERT-, UPDATE- eller DELETE-udtryk"
 
-#: ../libgda/gda-data-select.c:1293 ../libgda/gda-data-select.c:1499
-#: ../libgda/gda-data-select.c:3321
+#: ../libgda/gda-data-select.c:1294 ../libgda/gda-data-select.c:1500
+#: ../libgda/gda-data-select.c:3320
 msgid "No connection to use"
 msgstr "Ingen forbindelse der kan bruges"
 
-#: ../libgda/gda-data-select.c:1339
-msgid "Invalid unique row condition (ony equal operators are allowed)"
+#: ../libgda/gda-data-select.c:1340
+msgid "Invalid unique row condition (only equal operators are allowed)"
 msgstr "Ugyldig unik rækkebetingelse (kun lighedsoperatorer er tilladt)"
 
-#: ../libgda/gda-data-select.c:1371 ../libgda/gda-data-select.c:1426
+#: ../libgda/gda-data-select.c:1372 ../libgda/gda-data-select.c:1427
 msgid "Unique row condition has already been specified"
 msgstr "Unik rækkebetingelse er allerede angivet"
 
-#: ../libgda/gda-data-select.c:1508 ../libgda/gda-data-select.c:1519
+#: ../libgda/gda-data-select.c:1509 ../libgda/gda-data-select.c:1520
 msgid "No table to select from in SELECT statement"
 msgstr "Ingen tabel der kan vælges fra i SELECT-udtryk"
 
-#: ../libgda/gda-data-select.c:1513
+#: ../libgda/gda-data-select.c:1514
 msgid "SELECT statement uses more than one table to select from"
 msgstr "SELECT-udtryk bruger mere end en tabel der vælges fra"
 
-#: ../libgda/gda-data-select.c:1687 ../libgda/gda-data-select.c:2406
-#: ../libgda/gda-data-select.c:2576 ../libgda/gda-data-select.c:2728
-#: ../libgda/gda-data-select.c:2816 ../libgda/gda-data-select.c:3010
+#: ../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
 msgid "Data model does only support random access"
 msgstr "Datamodel understøtter ikke vilkårlig adgang"
 
-#: ../libgda/gda-data-select.c:1722
+#: ../libgda/gda-data-select.c:1721
 msgid "Unable to retrieve data after modifications"
 msgstr "Kunne ikke hente data efter ændringer"
 
-#: ../libgda/gda-data-select.c:1741 ../libgda/gda-data-select.c:1749
-#: ../libgda/gda-data-select.c:1771
+#: ../libgda/gda-data-select.c:1740 ../libgda/gda-data-select.c:1748
+#: ../libgda/gda-data-select.c:1770
 msgid ""
 "Unable to retrieve data after modifications, no further modification will be "
 "allowed"
@@ -1431,83 +1462,83 @@ msgstr ""
 "Kunne ikke hente data efter ændringer, ingen yderligere ændring vil være "
 "tilladt"
 
-#: ../libgda/gda-data-select.c:1806
+#: ../libgda/gda-data-select.c:1805
 #, c-format
 msgid "Unable to get value for row %d and column %d"
 msgstr "Kan ikke indhente værdi for række %d og kolonne %d"
 
 # hvad i alverden er en iter
-#: ../libgda/gda-data-select.c:2032 ../libgda/gda-data-select.c:2041
-#: ../libgda/gda-data-select.c:2051
+#: ../libgda/gda-data-select.c:2031 ../libgda/gda-data-select.c:2040
+#: ../libgda/gda-data-select.c:2050
 #, c-format
 msgid "Could not change iter's value for column %d: %s"
 msgstr "Kunne ikke ændre iters værdi for kolonne %d: %s"
 
-#: ../libgda/gda-data-select.c:2046
+#: ../libgda/gda-data-select.c:2045
 msgid "Allowed GdaHolder's value to be NULL for the iterator to be updated"
 msgstr ""
 "Tillod GdaHolders værdi at være NULL for at iteratoren bliver opdateret"
 
-#: ../libgda/gda-data-select.c:2126 ../libgda/gda-data-select.c:2219
+#: ../libgda/gda-data-select.c:2125 ../libgda/gda-data-select.c:2218
 msgid "Some columns can't be modified"
 msgstr "Nogle kolonner kan ikke ændres"
 
-#: ../libgda/gda-data-select.c:2273
+#: ../libgda/gda-data-select.c:2272
 msgid "Internal error: can't get the prepared statement's actual statement"
 msgstr "Intern fejl: Kan ikke indhente det forberedte udtryks faktiske udtryk"
 
-#: ../libgda/gda-data-select.c:2313
+#: ../libgda/gda-data-select.c:2312
 msgid "Unable to identify a way to fetch a single row"
 msgstr "Kunne ikke finde en måde at hente en enkelt række på"
 
-#: ../libgda/gda-data-select.c:2320
+#: ../libgda/gda-data-select.c:2319
 msgid "Can only operate on non compound SELECT statements"
 msgstr "Kan kun fungere på ikkesammensatte SELECT-udtryk"
 
-#: ../libgda/gda-data-select.c:2401 ../libgda/gda-data-select.c:2571
-#: ../libgda/gda-data-select.c:2642 ../libgda/gda-data-select.c:2723
-#: ../libgda/gda-data-select.c:2811 ../libgda/gda-data-select.c:3005
+#: ../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
 msgid "Modifications are not allowed anymore"
 msgstr "�ndringer er ikke længere tilladt"
 
-#: ../libgda/gda-data-select.c:2411 ../libgda/gda-data-select.c:2581
-#: ../libgda/gda-data-select.c:2647 ../libgda/gda-data-select.c:2733
+#: ../libgda/gda-data-select.c:2410 ../libgda/gda-data-select.c:2580
+#: ../libgda/gda-data-select.c:2646 ../libgda/gda-data-select.c:2732
 msgid "No UPDATE statement provided"
 msgstr "Intet UPDATE-udtryk"
 
-#: ../libgda/gda-data-select.c:2451
+#: ../libgda/gda-data-select.c:2450
 msgid "Could not get iterator's value"
 msgstr "Kunne ikke indhente iteratorens værdi"
 
-#: ../libgda/gda-data-select.c:2608 ../libgda/gda-data-select.c:2675
+#: ../libgda/gda-data-select.c:2607 ../libgda/gda-data-select.c:2674
 #, c-format
 msgid "Column %d can't be modified"
 msgstr "Kolonne %d kan ikke ændres"
 
-#: ../libgda/gda-data-select.c:2741
+#: ../libgda/gda-data-select.c:2740
 #, c-format
 msgid "Too many values (%d as maximum)"
 msgstr "For mange værdier (%d som maksimum)"
 
-#: ../libgda/gda-data-select.c:2821
+#: ../libgda/gda-data-select.c:2820
 msgid "No INSERT statement provided"
 msgstr "Intet INSERT-udtryk"
 
-#: ../libgda/gda-data-select.c:2826
+#: ../libgda/gda-data-select.c:2825
 msgid "Cannot add a row because the number of rows in unknown"
 msgstr "Kan ikke tilføje en række da antallet af rækker er ukendt"
 
-#: ../libgda/gda-data-select.c:2855
+#: ../libgda/gda-data-select.c:2854
 #: ../libgda/sql-parser/gda-statement-struct-insert.c:385
 #: ../libgda/sql-parser/gda-statement-struct-insert.c:394
 msgid "Missing values to insert in INSERT statement"
 msgstr "Manglende værdier til indsættelse i INSERT-udtryk"
 
-#: ../libgda/gda-data-select.c:3015
+#: ../libgda/gda-data-select.c:3014
 msgid "No DELETE statement provided"
 msgstr "Intet DELETE-udtryk"
 
-#: ../libgda/gda-data-select.c:3445
+#: ../libgda/gda-data-select.c:3444
 #, c-format
 msgid ""
 "An error has occurred, the value returned by the \"exec-params\" property "
@@ -1528,33 +1559,33 @@ msgstr "Ugyldig type"
 msgid "CREATE TABLE operation is not supported by the database server"
 msgstr "Handlingen CREATE TABLE understøttes ikke af databaseserveren"
 
-#: ../libgda/gda-holder.c:485 ../libgda/gda-set.c:484
+#: ../libgda/gda-holder.c:487 ../libgda/gda-set.c:552
 #, c-format
 msgid "Unable to set holder's value: %s"
 msgstr "Kunne ikke angive holders værdi: %s"
 
-#: ../libgda/gda-holder.c:579
+#: ../libgda/gda-holder.c:581
 msgid "The 'g-type' property cannot be changed"
 msgstr "Egenskaben 'g-type' kan ikke ændres"
 
-#: ../libgda/gda-holder.c:846
+#: ../libgda/gda-holder.c:848
 #, c-format
 msgid "Unable to convert string to '%s' type"
 msgstr "Kunne ikke konvertere streng til typen '%s'"
 
-#: ../libgda/gda-holder.c:906
+#: ../libgda/gda-holder.c:908
 msgid ""
 "Can't use this method to set value because there is already a static value"
 msgstr ""
 "Kan ikke bruge denne metode til at angive værdi da der allerede er en "
 "statisk værdi"
 
-#: ../libgda/gda-holder.c:925 ../libgda/gda-holder.c:1059
+#: ../libgda/gda-holder.c:927 ../libgda/gda-holder.c:1061
 #, c-format
 msgid "(%s): Holder does not allow NULL values"
 msgstr "(%s): Holder tillader ikke NULL-værdier"
 
-#: ../libgda/gda-holder.c:932
+#: ../libgda/gda-holder.c:934
 #, c-format
 msgid ""
 "(%s): Wrong Holder value type, expected type '%s' when value's type is '%s'"
@@ -1562,14 +1593,14 @@ msgstr ""
 "(%s): Forkert holderværditype, forventede type '%s', når værdiens type er '%"
 "s'"
 
-#: ../libgda/gda-holder.c:1066
+#: ../libgda/gda-holder.c:1068
 #, c-format
 msgid "(%s): Wrong value type: expected type '%s' when value's type is '%s'"
 msgstr ""
 "(%s): Forkert værditype: Forventede type '%s', når værdiens type er '%s'"
 
 #. break holder's binding because type differ
-#: ../libgda/gda-holder.c:1518
+#: ../libgda/gda-holder.c:1522
 #, c-format
 msgid ""
 "Cannot bind holders if their type is not the same, breaking existing bind "
@@ -1578,11 +1609,11 @@ msgstr ""
 "Kan ikke tildele holdere hvis deres type er forskellig, afbryder "
 "eksisterende tildeling hvor '%s' var bundet til '%s'"
 
-#: ../libgda/gda-holder.c:1563
+#: ../libgda/gda-holder.c:1567
 msgid "Cannot bind holders if their type is not the same"
 msgstr "Kan ikke tildele holdere hvis deres type er forskellig"
 
-#: ../libgda/gda-holder.c:1703
+#: ../libgda/gda-holder.c:1707
 #, c-format
 msgid "Could not change GdaHolder to match value change in bound GdaHolder: %s"
 msgstr ""
@@ -1704,7 +1735,7 @@ msgstr "Kunne ikke indhente version af internt skema"
 msgid "Unknown internal schema's version: '%s'"
 msgstr "Ukendt intern skemaversion: '%s'"
 
-#: ../libgda/gda-meta-store.c:2306 ../tools/gda-sql.c:966
+#: ../libgda/gda-meta-store.c:2306 ../tools/gda-sql.c:967
 msgid "More than one SQL statement"
 msgstr "Mere end et SQL-udtryk"
 
@@ -2171,8 +2202,8 @@ msgstr "Ekstra attributter"
 #: ../providers/mysql/mysql_specs_drop_index.xml.in.h:1
 #: ../providers/postgres/postgres_specs_drop_index.xml.in.h:2
 #: ../providers/sqlite/sqlite_specs_drop_index.xml.in.h:3
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:158
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:164
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:166
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:172
 msgid "Index"
 msgstr "Indeks"
 
@@ -2287,7 +2318,7 @@ msgstr "Visning"
 #: ../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:641 ../tools/gda-sql.c:3076 ../tools/gda-sql.c:4002
+#: ../tools/command-exec.c:641 ../tools/gda-sql.c:3084 ../tools/gda-sql.c:4010
 msgid "Name"
 msgstr "Navn"
 
@@ -2318,34 +2349,45 @@ msgstr "Datamodel for skema har en forkert kolonnenavn: '%s' i steden for '%s'"
 msgid "Data model for schema has a wrong gda type: %s instead of %s"
 msgstr "Datamodel for skema har en forkert gda-type: %s i steden for %s"
 
-#: ../libgda/gda-set.c:476 ../libgda/gda-set.c:577
+#: ../libgda/gda-set.c:544 ../libgda/gda-set.c:645
 #, c-format
 msgid "%s() does not handle values of type '%s'."
 msgstr "%s() kan ikke håndtere værdier af typen '%s'."
 
-#: ../libgda/gda-set.c:531
+#: ../libgda/gda-set.c:599
 #, c-format
 msgid "GdaHolder with ID '%s' not found in set"
 msgstr "GdaHolder med id '%s' ikke fundet i angiv"
 
-#: ../libgda/gda-set.c:711
+#: ../libgda/gda-set.c:779
 #, c-format
 msgid "Spec's root node != 'data-set-spec': '%s'"
 msgstr "Spefikationens rodknude != 'data-set-spec': '%s'"
 
-#: ../libgda/gda-set.c:750
+#: ../libgda/gda-set.c:818
 #, c-format
 msgid "Missing node <parameters>: '%s'"
 msgstr "Manglende knude <parametre>: '%s'"
 
-#: ../libgda/gda-set.c:1187
+#: ../libgda/gda-set.c:1031
+#, c-format
+msgid "Data set does not allow modifications"
+msgstr "Datasæt tillader ikke ændringer"
+
+#: ../libgda/gda-set.c:1276
 msgid "GdaHolder needs to have an ID"
 msgstr "GdaHolder skal have et id"
 
-#: ../libgda/gda-set.c:1289
+#: ../libgda/gda-set.c:1386
 msgid "One or more values are invalid"
 msgstr "En eller flere værdier er ugyldige"
 
+#: ../libgda/gda-set.c:1603 ../libgda/gda-set.c:1616
+msgid ""
+"Replacing data model must have the same characteristics as the data model it "
+"replaces"
+msgstr ""
+
 #: ../libgda/gda-sql-builder.c:294 ../libgda/gda-sql-builder.c:1399
 #, c-format
 msgid "Unknown part ID %u"
@@ -2373,9 +2415,9 @@ msgid "Wrong statement type"
 msgstr "Forkert udtrykstype"
 
 #: ../libgda/gda-sql-builder.c:596
-#, fuzzy, c-format
+#, c-format
 msgid "Could not convert value to type '%s', value not defined"
-msgstr "Kunne ikke konvertere værdi til type '%s'"
+msgstr "Kunne ikke konvertere værdi til type '%s', værdi ikke defineret"
 
 #: ../libgda/gda-sql-builder.c:720
 msgid "Wrong field format"
@@ -2391,74 +2433,75 @@ msgstr "Uhåndteret datatype '%s'"
 msgid "Could not convert value to type '%s'"
 msgstr "Kunne ikke konvertere værdi til type '%s'"
 
+# mon ikke det er mål-id %u for venstre del (ikke sikker)
 #: ../libgda/gda-sql-builder.c:1312
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown left part target ID %u"
-msgstr "Ukendt del-id %u"
+msgstr "Ukendt mål-id %u for venstre del"
 
 #: ../libgda/gda-sql-builder.c:1317
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown right part target ID %u"
-msgstr "Ukendt del-id %u"
+msgstr "Ukendt mål-id %u for højre del"
 
-#: ../libgda/gda-statement.c:478
+#: ../libgda/gda-statement.c:483
 #, c-format
 msgid "Could not determine GType for parameter '%s'"
 msgstr "Kunne ikke afgøre GType for parameter '%s'"
 
-#: ../libgda/gda-statement.c:479
+#: ../libgda/gda-statement.c:484
 msgid "Unnamed"
 msgstr "Unavngivet"
 
-#: ../libgda/gda-statement.c:678
+#: ../libgda/gda-statement.c:683
 msgid "Missing SQL code"
 msgstr "Manglende SQL-kode"
 
-#: ../libgda/gda-statement.c:695
+#: ../libgda/gda-statement.c:700
 #, c-format
 msgid "No data handler for type '%s'"
 msgstr "Ingen datahåndtering for type '%s'"
 
-#: ../libgda/gda-statement.c:1212
+#: ../libgda/gda-statement.c:1219
 #, c-format
 msgid "Wrong parameter type for '%s': expected type '%s' and got '%s'"
 msgstr "Forkert parametertype for '%s': Forventede type '%s' og fik '%s'"
 
-#: ../libgda/gda-statement.c:1224
+#: ../libgda/gda-statement.c:1231
 #, c-format
 msgid "Missing parameter '%s'"
 msgstr "Manglende parameter '%s'"
 
-#: ../libgda/gda-statement.c:1236 ../libgda/sqlite/gda-sqlite-provider.c:2412
-#: ../providers/jdbc/gda-jdbc-provider.c:1343
-#: ../providers/mysql/gda-mysql-provider.c:2094
-#: ../providers/postgres/gda-postgres-provider.c:1972
-#: ../providers/web/gda-web-provider.c:1505
+#: ../libgda/gda-statement.c:1243 ../libgda/sqlite/gda-sqlite-provider.c:2448
+#: ../providers/jdbc/gda-jdbc-provider.c:1347
+#: ../providers/mysql/gda-mysql-provider.c:2188
+#: ../providers/postgres/gda-postgres-provider.c:1982
+#: ../providers/web/gda-web-provider.c:1508
 #, c-format
 msgid "Parameter '%s' is invalid"
 msgstr "Parameteren '%s' er ugyldig"
 
-#: ../libgda/gda-statement.c:1282
+#: ../libgda/gda-statement.c:1289
 msgid "Unnamed parameter"
 msgstr "Unavngivet parameter"
 
-#: ../libgda/gda-statement.c:1500
+#: ../libgda/gda-statement.c:1507
 msgid "Malformed table name"
 msgstr "Forkert udformet tabelnavn"
 
-#: ../libgda/gda-statement.c:1949
+#: ../libgda/gda-statement.c:1956
 msgid "Join is not in a FROM statement"
 msgstr "Sammenføj er ikke i et FROM-udtryk"
 
-#: ../libgda/gda-statement.c:1956
+#: ../libgda/gda-statement.c:1963
 msgid "Could not find target the join is for"
 msgstr "Kunne ikke finde målet sammenføjningen er til for"
 
 #: ../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:761
-#: ../tools/gda-sql.c:946
+#: ../libgda-report/engine/gda-report-engine.c:613 ../tools/gda-sql.c:762
+#: ../tools/gda-sql.c:947
 #, c-format
 msgid "No connection specified"
 msgstr "Ingen forbindelse angivet"
@@ -2480,7 +2523,7 @@ msgstr "Kunne ikke indhente kolonnenavn"
 
 #: ../libgda/gda-tree-mgr-label.c:207
 #: ../tools/browser/canvas/browser-canvas-table.c:309
-#: ../tools/browser/data-manager/data-source.c:829
+#: ../tools/browser/data-manager/data-source.c:914
 msgid "No name"
 msgstr "Intet navn"
 
@@ -2530,41 +2573,57 @@ msgstr "Viser om GdaTree er en liste eller et træ"
 msgid "Path format error: %s"
 msgstr "Fejl i stiformat: %s"
 
-#: ../libgda/gda-util.c:594
+#: ../libgda/gda-util.c:596
 #, c-format
 msgid "Field number %d not found in source named '%s'"
 msgstr "Felt nummer %d blev ikke fundet i kilde med navnet '%s'"
 
-#: ../libgda/gda-util.c:781
+#: ../libgda/gda-util.c:783
 msgid "SELECT statement has no FROM part"
 msgstr "SELECT-udtryk har ingen FROM-del"
 
-#: ../libgda/gda-util.c:786 ../libgda/gda-util.c:793
+#: ../libgda/gda-util.c:788 ../libgda/gda-util.c:795
 msgid "SELECT statement involves more than one table or expression"
 msgstr "SELECT-udtryk involverer mere end en tabel eller udtryk"
 
 # måske 'bygge' i dette tilfælde (tror ikke noget kompileres i samme
 # forstand som normalt for kildekode)
-#: ../libgda/gda-util.c:803
+#: ../libgda/gda-util.c:805
 msgid "Can only build modification statement for tables"
 msgstr "Kan kun bygge ændringsudtryk for tabeller"
 
-#: ../libgda/gda-util.c:837 ../libgda/gda-util.c:845
+#: ../libgda/gda-util.c:839 ../libgda/gda-util.c:847
 msgid "Table does not have any primary key"
 msgstr "Tabel har ingen primær nøgle"
 
-#: ../libgda/gda-util.c:871
+#: ../libgda/gda-util.c:873
 msgid "Table's primary key is not selected"
 msgstr "Tabels primære nøgle er ikke valgt"
 
-#: ../libgda/gda-util.c:1120
+#: ../libgda/gda-util.c:1122
 msgid "Could not compute any field to insert into"
 msgstr "Kunne ikke beregne et felt der kan indsættes til"
 
-#: ../libgda/gda-util.c:1183
+#: ../libgda/gda-util.c:1185
 msgid "Missing table name in UPDATE statement"
 msgstr "Manglende tabelnavn i UPDATE-udtryk"
 
+# genskrive UPDATE-udtrykket til
+#: ../libgda/gda-util.c:1264
+#, c-format
+msgid "Can't rewrite UPDATE statement to handle default values"
+msgstr "Kan ikke genskrive udtrykket UPDATE til håndtering af standardværdier"
+
+#: ../libgda/gda-util.c:1316 ../libgda/gda-util.c:1373
+#: ../libgda/gda-util.c:1413 ../libgda/sqlite/gda-sqlite-provider.c:2429
+#: ../providers/jdbc/gda-jdbc-provider.c:1318
+#: ../providers/mysql/gda-mysql-provider.c:2168
+#: ../providers/postgres/gda-postgres-provider.c:1964
+#: ../providers/web/gda-web-provider.c:1488
+#, c-format
+msgid "Missing parameter '%s' to execute query"
+msgstr "Manglende parameter '%s' til at køre forespørgsel"
+
 #: ../libgda/gda-xa-transaction.c:159
 msgid "Global transaction ID can not have more than 64 bytes"
 msgstr "Global transaktions-id kan ikke have flere end 64 byte"
@@ -2679,30 +2738,29 @@ msgstr "Parameter '%s' svarer ikke til en tabels kolonne"
 msgid "Binding a BLOB for this type of statement is not supported"
 msgstr "Tildeling af en BLOB for denne type udtryk er ikke understøttet"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:507
-#, fuzzy
+#: ../libgda/sqlite/gda-sqlite-provider.c:510
 msgid "Can't find libsqlite3."
-msgstr "Kan ikke finde opgave %u"
+msgstr "Kan ikke finde libsqlite3."
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:557
+#: ../libgda/sqlite/gda-sqlite-provider.c:560
 #: ../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:350
+#: ../providers/jdbc/gda-jdbc-provider.c:354
 #: ../providers/mdb/gda-mdb-provider.c:230
-#: ../providers/mysql/gda-mysql-provider.c:574
-#: ../providers/postgres/gda-postgres-provider.c:421
-#: ../providers/web/gda-web-provider.c:338
+#: ../providers/mysql/gda-mysql-provider.c:578
+#: ../providers/postgres/gda-postgres-provider.c:431
+#: ../providers/web/gda-web-provider.c:341
 msgid "Provider does not support asynchronous connection open"
 msgstr "Leverandørern understøtter ikke asynkron forbindelsesåbning"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:579
+#: ../libgda/sqlite/gda-sqlite-provider.c:582
 #: ../providers/mdb/gda-mdb-provider.c:246
 msgid "The connection string must contain DB_DIR and DB_NAME values"
 msgstr "Forbindelsesstrengen må ikke indeholde værdierne DB_DIR og DB_NAME"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:606
-#: ../libgda/sqlite/gda-sqlite-provider.c:614
+#: ../libgda/sqlite/gda-sqlite-provider.c:609
+#: ../libgda/sqlite/gda-sqlite-provider.c:617
 #, c-format
 msgid ""
 "The connection string format has changed: replace URI with DB_DIR (the path "
@@ -2713,95 +2771,96 @@ msgstr ""
 "DB_DIR (stien til databasefilen) og DB_NAME (databasefilen uden '%s' i "
 "slutningen)."
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:629
+#: ../libgda/sqlite/gda-sqlite-provider.c:632
 #: ../providers/mdb/gda-mdb-provider.c:288
 msgid ""
 "The DB_DIR part of the connection string must point to a valid directory"
 msgstr "Delen DB_DIR i forbindelsesstrengen skal pege på en gyldig mappe"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:687
+#: ../libgda/sqlite/gda-sqlite-provider.c:690
 #, c-format
 msgid "Could not set empty_result_callbacks SQLite option: %s"
 msgstr "Kunne ikke angive SQLite-tilvalget empty_result_callbacks: %s"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:902
-#: ../libgda/sqlite/gda-sqlite-provider.c:941
+#: ../libgda/sqlite/gda-sqlite-provider.c:905
+#: ../libgda/sqlite/gda-sqlite-provider.c:944
 #: ../libgda-ui/data-entries/plugins/libmain.c:89
 #: ../libgda-ui/data-entries/plugins/libmain.c:127
 #: ../libgda-ui/data-entries/plugins/libmain.c:155
 #: ../libgda-ui/data-entries/plugins/libmain.c:162
 #: ../libgda-ui/data-entries/plugins/libmain.c:237
 #: ../libgda-ui/data-entries/plugins/libmain.c:261
-#: ../providers/mysql/gda-mysql-provider.c:843
-#: ../providers/mysql/gda-mysql-provider.c:884
-#: ../providers/postgres/gda-postgres-provider.c:759
-#: ../providers/postgres/gda-postgres-provider.c:815
+#: ../providers/mysql/gda-mysql-provider.c:847
+#: ../providers/mysql/gda-mysql-provider.c:888
+#: ../providers/postgres/gda-postgres-provider.c:769
+#: ../providers/postgres/gda-postgres-provider.c:825
 #, c-format
 msgid "Missing spec. file '%s'"
 msgstr "Manglende specifikationsfil '%s'"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:1071
+#: ../libgda/sqlite/gda-sqlite-provider.c:1074
 msgid "Missing database name or directory"
 msgstr "Manglende databasenavn eller mappe"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:1097
-#: ../providers/postgres/gda-postgres-provider.c:1015
-#: ../providers/postgres/gda-postgres-provider.c:1016
+#: ../libgda/sqlite/gda-sqlite-provider.c:1100
+#: ../providers/postgres/gda-postgres-provider.c:1025
+#: ../providers/postgres/gda-postgres-provider.c:1026
 msgid "Transactions are not supported in read-only mode"
 msgstr "Transaktioner er ikke understøttet i skrivebeskyttet tilstand"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:1930
-#: ../providers/jdbc/gda-jdbc-provider.c:1111
-#: ../providers/postgres/gda-postgres-provider.c:1551
-#: ../providers/web/gda-web-provider.c:1256
+#: ../libgda/sqlite/gda-sqlite-provider.c:1933
+#: ../providers/jdbc/gda-jdbc-provider.c:1115
+#: ../providers/postgres/gda-postgres-provider.c:1561
+#: ../providers/web/gda-web-provider.c:1259
 msgid "Unnamed parameter is not allowed in prepared statements"
 msgstr "Unavngivet parameter er ikke tilladt i forberedte udtryk"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2028
-#: ../providers/mysql/gda-mysql-provider.c:1861
-#: ../providers/postgres/gda-postgres-provider.c:1695
+#: ../libgda/sqlite/gda-sqlite-provider.c:2045
+#: ../libgda/sqlite/gda-sqlite-provider.c:2057
+#: ../providers/mysql/gda-mysql-provider.c:1955
+#: ../providers/postgres/gda-postgres-provider.c:1705
 #, c-format
 msgid "Can't build SELECT statement to get last inserted row: %s)"
 msgstr "Kan ikke bygge SELECT-udtryk for at indhente sidst indsat række: %s)"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2043
-#: ../providers/mysql/gda-mysql-provider.c:1876
-#: ../providers/postgres/gda-postgres-provider.c:1710
+#: ../libgda/sqlite/gda-sqlite-provider.c:2079
+#: ../providers/mysql/gda-mysql-provider.c:1970
+#: ../providers/postgres/gda-postgres-provider.c:1720
 #, c-format
 msgid "Can't execute SELECT statement to get last inserted row: %s"
 msgstr "Kan ikke udføre SELECT-udtryk for at indhente sidst indsatte række: %s"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2056
-#: ../providers/mysql/gda-mysql-provider.c:1889
-#: ../providers/postgres/gda-postgres-provider.c:1723
+#: ../libgda/sqlite/gda-sqlite-provider.c:2092
+#: ../providers/mysql/gda-mysql-provider.c:1983
+#: ../providers/postgres/gda-postgres-provider.c:1733
 msgid "SELECT statement to get last inserted row did not return any row"
 msgstr ""
 "SELECT-udtryk der skal indhente sidst indsatte række returnerede ingen række"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2060
-#: ../providers/mysql/gda-mysql-provider.c:1893
-#: ../providers/postgres/gda-postgres-provider.c:1727
+#: ../libgda/sqlite/gda-sqlite-provider.c:2096
+#: ../providers/mysql/gda-mysql-provider.c:1987
+#: ../providers/postgres/gda-postgres-provider.c:1737
 #, c-format
 msgid "SELECT statement to get last inserted row returned too many (%d) rows"
 msgstr ""
 "SELECT-udtryk der skal indhente sidst indsatte række returnerede for mange (%"
 "d) rækker"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2125
+#: ../libgda/sqlite/gda-sqlite-provider.c:2161
 msgid "Prepared statement has no associated GdaStatement"
 msgstr "Forberedt udtryk har ingen forbundet GdaStatement"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2165
-#: ../libgda/sqlite/gda-sqlite-provider.c:2202
+#: ../libgda/sqlite/gda-sqlite-provider.c:2201
+#: ../libgda/sqlite/gda-sqlite-provider.c:2238
 msgid "Can't create SQLite BLOB handle"
 msgstr "Kan ikke oprette SQLite BLOB-håndtag"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2169
-#: ../libgda/sqlite/gda-sqlite-provider.c:2207
+#: ../libgda/sqlite/gda-sqlite-provider.c:2205
+#: ../libgda/sqlite/gda-sqlite-provider.c:2243
 msgid "Can't write to SQLite's BLOB"
 msgstr "Kan ikke skrive til SQLites BLOB"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2192
+#: ../libgda/sqlite/gda-sqlite-provider.c:2228
 #, c-format
 msgid ""
 "Can't obtain SQLite BLOB handle (reported type is '%s'), please report this "
@@ -2810,69 +2869,68 @@ msgstr ""
 "Kan ikke indhente SQLite BLOB-håndtag (rapporteret type er '%s'), rapporter "
 "venligst denne fejl til http://bugzilla.gnome.org/ for produktet \"libgda\"."
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2217
+#: ../libgda/sqlite/gda-sqlite-provider.c:2253
 msgid "Can't identify the ROWID of the blob to fill"
 msgstr "Kan ikke identificere ROWID'en på blob'en, der skal fyldes"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2265
-#: ../providers/jdbc/gda-jdbc-provider.c:1209
-#: ../providers/mysql/gda-mysql-provider.c:1982
-#: ../providers/postgres/gda-postgres-provider.c:1822
-#: ../providers/web/gda-web-provider.c:1389
+#: ../libgda/sqlite/gda-sqlite-provider.c:2301
+#: ../providers/jdbc/gda-jdbc-provider.c:1213
+#: ../providers/mysql/gda-mysql-provider.c:2076
+#: ../providers/postgres/gda-postgres-provider.c:1832
+#: ../providers/web/gda-web-provider.c:1392
 msgid "Provider does not support asynchronous statement execution"
 msgstr "Leverandør understøtter ikke asynkron udtrykskørsel"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2333
+#: ../libgda/sqlite/gda-sqlite-provider.c:2369
 #: ../tools/browser/mgr-favorites.c:217 ../tools/browser/mgr-favorites.c:259
 msgid "Empty statement"
 msgstr "Tomt udtryk"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2375
-#: ../libgda/sqlite/gda-sqlite-provider.c:2378
-#: ../providers/jdbc/gda-jdbc-provider.c:1296
-#: ../providers/jdbc/gda-jdbc-provider.c:1299
-#: ../providers/mysql/gda-mysql-provider.c:2056
-#: ../providers/mysql/gda-mysql-provider.c:2059
-#: ../providers/postgres/gda-postgres-provider.c:1936
-#: ../providers/postgres/gda-postgres-provider.c:1939
-#: ../providers/web/gda-web-provider.c:1467
+#: ../libgda/sqlite/gda-sqlite-provider.c:2411
+#: ../libgda/sqlite/gda-sqlite-provider.c:2414
+#: ../providers/jdbc/gda-jdbc-provider.c:1300
+#: ../providers/jdbc/gda-jdbc-provider.c:1303
+#: ../providers/mysql/gda-mysql-provider.c:2150
+#: ../providers/mysql/gda-mysql-provider.c:2153
+#: ../providers/postgres/gda-postgres-provider.c:1946
+#: ../providers/postgres/gda-postgres-provider.c:1949
 #: ../providers/web/gda-web-provider.c:1470
+#: ../providers/web/gda-web-provider.c:1473
 #, c-format
 msgid "Missing parameter(s) to execute query"
 msgstr "Manglende parametre til at køre forespørgsel"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2393
-#: ../providers/jdbc/gda-jdbc-provider.c:1314
-#: ../providers/mysql/gda-mysql-provider.c:2074
-#: ../providers/postgres/gda-postgres-provider.c:1954
-#: ../providers/web/gda-web-provider.c:1485
-#, c-format
-msgid "Missing parameter '%s' to execute query"
-msgstr "Manglende parameter '%s' til at køre forespørgsel"
+#: ../libgda/sqlite/gda-sqlite-provider.c:2473
+#: ../providers/jdbc/gda-jdbc-provider.c:1382
+#: ../providers/mysql/gda-mysql-provider.c:2214
+#: ../providers/postgres/gda-postgres-provider.c:2007
+#: ../providers/web/gda-web-provider.c:1537
+msgid "Can't rewrite statement handle default values"
+msgstr "Kan ikke genskrive udtryk til håndtering af standardværdier"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2470
-#: ../providers/mysql/gda-mysql-provider.c:2223
+#: ../libgda/sqlite/gda-sqlite-provider.c:2537
+#: ../providers/mysql/gda-mysql-provider.c:2346
 msgid "Can't get BLOB's length"
 msgstr "Kan ikke indhente BLOB'ens længde"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2472
-#: ../providers/mysql/gda-mysql-provider.c:2225
+#: ../libgda/sqlite/gda-sqlite-provider.c:2539
+#: ../providers/mysql/gda-mysql-provider.c:2348
 msgid "BLOB is too big"
 msgstr "BLOB er for stor"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2554
+#: ../libgda/sqlite/gda-sqlite-provider.c:2621
 #, c-format
 msgid "Non handled data type '%s'"
 msgstr "Datatype '%s' kan ikke håndteres"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2722
-#: ../libgda/sqlite/gda-sqlite-provider.c:2743
-#: ../libgda/sqlite/gda-sqlite-provider.c:2809
+#: ../libgda/sqlite/gda-sqlite-provider.c:2805
+#: ../libgda/sqlite/gda-sqlite-provider.c:2826
+#: ../libgda/sqlite/gda-sqlite-provider.c:2892
 msgid "Function requires one argument"
 msgstr "Funktion kræver et parameter"
 
-#: ../libgda/sqlite/gda-sqlite-provider.c:2775
-#: ../libgda/sqlite/gda-sqlite-provider.c:2841
+#: ../libgda/sqlite/gda-sqlite-provider.c:2858
+#: ../libgda/sqlite/gda-sqlite-provider.c:2924
 msgid "Function requires two arguments"
 msgstr "Funktion kræver to parametre"
 
@@ -3184,12 +3242,12 @@ msgstr "UPDATE-udtryk har ikke en målkolonne der skal opdateres"
 #: ../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:1744
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1793
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1841
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1890
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1938
-#: ../libgda/thread-wrapper/gda-thread-provider.c:1987
+#: ../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
 #, c-format
 msgid "A connection is required"
 msgstr "Der kræves en forbindelse"
@@ -3246,8 +3304,8 @@ msgid "Unknown query '%s'"
 msgstr "Ukendt forespørgsel '%s'"
 
 #: ../libgda-report/engine/gda-report-engine.c:581
-#: ../libgda-report/engine/gda-report-engine.c:608 ../tools/gda-sql.c:2971
-#: ../tools/gda-sql.c:3053 ../tools/gda-sql.c:3153 ../tools/gda-sql.c:3229
+#: ../libgda-report/engine/gda-report-engine.c:608 ../tools/gda-sql.c:2979
+#: ../tools/gda-sql.c:3061 ../tools/gda-sql.c:3161 ../tools/gda-sql.c:3237
 #, c-format
 msgid "No connection named '%s' found"
 msgstr "Ingen forbindelse med navnet '%s' fundet"
@@ -3364,7 +3422,7 @@ msgid "Data size"
 msgstr "Datastørrelse"
 
 #: ../libgda-ui/data-entries/common-bin.c:301
-#: ../providers/mysql/gda-mysql-provider.c:619
+#: ../providers/mysql/gda-mysql-provider.c:623
 #: ../providers/mysql/gda-mysql-util.c:67
 msgid "Unknown"
 msgstr "Ukendt"
@@ -3375,9 +3433,9 @@ msgstr "Ukendt"
 #: ../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:763 ../libgda-ui/gdaui-basic-form.c:825
-#: ../libgda-ui/gdaui-raw-grid.c:739 ../tools/gda-sql.c:2648
-#: ../tools/gda-sql.c:2823 ../tools/gda-sql.c:4003
+#: ../libgda-ui/gdaui-basic-form.c:805 ../libgda-ui/gdaui-basic-form.c:873
+#: ../libgda-ui/gdaui-raw-grid.c:739 ../tools/gda-sql.c:2656
+#: ../tools/gda-sql.c:2831 ../tools/gda-sql.c:4011
 msgid "Value"
 msgstr "Værdi"
 
@@ -3428,7 +3486,7 @@ msgid "The information and status changer can be activated"
 msgstr "Informations- og statusændringen kan aktiveres"
 
 #: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:408
-#: ../libgda-ui/data-entries/gdaui-entry-string.c:398
+#: ../libgda-ui/data-entries/gdaui-entry-string.c:399
 msgid "<string cut because too long>"
 msgstr "<streng afgrænset da den er for lang>"
 
@@ -3454,7 +3512,6 @@ msgstr ""
 "helt kohærant"
 
 #: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:490
-#: ../libgda-ui/data-entries/gdaui-entry-none.c:173
 #: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:298
 msgid "<non-printable>"
 msgstr "<kan ikke udskrives>"
@@ -3466,7 +3523,7 @@ msgid "Invalid UTF-8 format!"
 msgstr "Ugyldigt UTF-8-format!"
 
 #. format tooltip
-#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1044
+#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1053
 msgid "Format is hh:mm:ss"
 msgstr "Format er tt:mm:ss"
 
@@ -3729,27 +3786,27 @@ msgstr "Cgrid-værdi"
 msgid "Cgrid value attributes"
 msgstr "Cgrid-værdiattributter"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:849
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:843
 msgid "Cgrid text column"
 msgstr "Cgrid-tekstkolonne"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:850
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:844
 msgid "A column in the data source model to get the string from."
 msgstr "En kolonne i datakildemodellen hvor strengen skal hentes fra."
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:857
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:851
 msgid "Cgrid grid height"
 msgstr "Cgrids gitterhøjde"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:858
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:852
 msgid "Cgrid height's."
 msgstr "Cgrids højder."
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:865
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:859
 msgid "Cgrid has its headers visible"
 msgstr "Cgrid har sine teksthoveder synlige"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:866
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:860
 msgid "Cgrid headers visible"
 msgstr "Cgrids teksthoveder synlige"
 
@@ -3849,15 +3906,39 @@ msgid "No data to display"
 msgstr "Ingen data at vise"
 
 #: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:1
-msgid "Define to enable syntactical colourisation"
-msgstr ""
+msgid "Break lines in between words"
+msgstr "Ombryd linjer mellem ord"
 
 #: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:2
+msgid "Break lines in between words or graphemes"
+msgstr "Ombryd linjer mellem ord eller grafemer"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:3
+msgid "Define to enable syntactical colourisation"
+msgstr "Definer aktivering af syntaktisk farvelæggelse"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:4
+msgid "Defines how long lines are wrapped"
+msgstr "Definerer hvordan lange linjer ombrydes"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:5
+msgid "Do not wrap lines"
+msgstr "Ombryd ikke linjer"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:6
+msgid "Lines wrapping"
+msgstr "Linjeombrydning"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:7
 msgid "Programming language"
-msgstr ""
+msgstr "Programmeringssprog"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:8
+msgid "break lines anywhere the cursor can appear"
+msgstr "ombryd linjer overalt hvor markøren kan fremkomme"
 
 #: ../libgda-ui/data/server_operation.glade.h:1
-#: ../tools/browser/schema-browser/table-info.c:363
+#: ../tools/browser/schema-browser/table-info.c:384
 msgid "Columns"
 msgstr "Kolonner"
 
@@ -3869,10 +3950,10 @@ msgstr "Begrænsninger"
 msgid "Foreign keys"
 msgstr "Fremmede nøgler"
 
-#: ../libgda-ui/data/server_operation.glade.h:4 ../tools/gda-sql.c:1986
-#: ../tools/gda-sql.c:2085 ../tools/gda-sql.c:2097 ../tools/gda-sql.c:2109
-#: ../tools/gda-sql.c:2217 ../tools/gda-sql.c:2229 ../tools/gda-sql.c:2241
-#: ../tools/gda-sql.c:2435
+#: ../libgda-ui/data/server_operation.glade.h:4 ../tools/gda-sql.c:1994
+#: ../tools/gda-sql.c:2093 ../tools/gda-sql.c:2105 ../tools/gda-sql.c:2117
+#: ../tools/gda-sql.c:2225 ../tools/gda-sql.c:2237 ../tools/gda-sql.c:2249
+#: ../tools/gda-sql.c:2443
 msgid "General"
 msgstr "Generelt"
 
@@ -3997,7 +4078,7 @@ msgstr "Fjern ændrede data"
 msgid "Correct data first"
 msgstr "Ret data først"
 
-#: ../libgda-ui/gdaui-basic-form.c:255
+#: ../libgda-ui/gdaui-basic-form.c:259
 msgid ""
 "Pointer to an XML layout specification  (as an xmlNodePtr to a <gdaui_form> "
 "node)"
@@ -4005,7 +4086,7 @@ msgstr ""
 "Peger til en XML-layoutspecifikation (som en xmlNOdePtr til en <gdaui_form> "
 "knude)"
 
-#: ../libgda-ui/gdaui-basic-form.c:259
+#: ../libgda-ui/gdaui-basic-form.c:263
 msgid "List of parameters to show in the form"
 msgstr "Liste over parametre der skal vises i formularen"
 
@@ -4014,43 +4095,43 @@ msgstr "Liste over parametre der skal vises i formularen"
 # Jeg tror ikke de mener case sensitive, men jeg kan ikke gætte
 # sammenhængen.  Der er nogle muligheder (måske 'sensitive' = 'kan
 # redigeres'), dog synes jeg den aktuelle oversættelse er fin
-#: ../libgda-ui/gdaui-basic-form.c:263
+#: ../libgda-ui/gdaui-basic-form.c:267
 msgid "Entry headers are sensitive"
 msgstr "Indtastningshoveder er sensitive"
 
-#: ../libgda-ui/gdaui-basic-form.c:268
+#: ../libgda-ui/gdaui-basic-form.c:272
 msgid "Show Entry actions"
 msgstr "Vis indtastningshandlinger"
 
-#: ../libgda-ui/gdaui-basic-form.c:273
+#: ../libgda-ui/gdaui-basic-form.c:277
 msgid "Entries Auto-default"
 msgstr "Indtastninger får autostandard"
 
 # evt. udfoldning
-#: ../libgda-ui/gdaui-basic-form.c:278
-msgid "TRUE if expanding the form makes sense"
-msgstr "TRUE (SAND) hvis udvidelse af formularen giver mening"
+#: ../libgda-ui/gdaui-basic-form.c:282
+msgid "TRUE if expanding the form vertically makes sense"
+msgstr "TRUE (SAND) hvis udvidelse af formularen lodret giver mening"
 
-#: ../libgda-ui/gdaui-basic-form.c:725 ../libgda-ui/gdaui-raw-grid.c:780
-#: ../libgda-ui/gdaui-raw-grid.c:2525
+#: ../libgda-ui/gdaui-basic-form.c:759 ../libgda-ui/gdaui-raw-grid.c:780
+#: ../libgda-ui/gdaui-raw-grid.c:2619
 #, c-format
 msgid "The '%s' attribute should be a G_TYPE_STRING value"
 msgstr "Attributten '%s' bør være en værdi af typen G_TYPE_STRING"
 
-#: ../libgda-ui/gdaui-basic-form.c:1622
+#: ../libgda-ui/gdaui-basic-form.c:1685
 msgid "Can't find data entry for GdaHolder"
 msgstr "Kan ikke finde dataindtastning til GdaHolder"
 
-#: ../libgda-ui/gdaui-basic-form.c:1894
+#: ../libgda-ui/gdaui-basic-form.c:1957
 msgid "Values to be filled"
 msgstr "Værdier der skal udfyldes"
 
-#: ../libgda-ui/gdaui-basic-form.c:1975 ../libgda-ui/gdaui-raw-grid.c:2352
+#: ../libgda-ui/gdaui-basic-form.c:2038 ../libgda-ui/gdaui-raw-grid.c:2446
 #, c-format
 msgid "'%s' document not parsed successfully"
 msgstr "Dokument '%s' blev ikke fortolket korrekt"
 
-#: ../libgda-ui/gdaui-basic-form.c:1985 ../libgda-ui/gdaui-raw-grid.c:2362
+#: ../libgda-ui/gdaui-basic-form.c:2048 ../libgda-ui/gdaui-raw-grid.c:2456
 #, c-format
 msgid ""
 "'%s' DTD not parsed successfully. XML data layout validation will not be "
@@ -4059,11 +4140,13 @@ msgstr ""
 "'%s' DTD ikke fortolket. Layoutvalidering af XML-data vil ikke blive udført "
 "(fejl kan opstå)"
 
-#: ../libgda-ui/gdaui-basic-form.c:2116
+#: ../libgda-ui/gdaui-basic-form.c:2179
 msgid ""
 "size group was not taken into account using "
 "gdaui_basic_form_add_to_size_group()"
 msgstr ""
+"der blev ikke taget højde for størrelsesgruppe under brug af "
+"gdaui_basic_form_add_to_size_group()"
 
 #: ../libgda-ui/gdaui-cloud.c:244 ../libgda-ui/gdaui-cloud.c:981
 #, c-format
@@ -4098,19 +4181,19 @@ msgstr "Forsøger at ændre en skrivebeskyttet række"
 msgid "Filter failed:"
 msgstr "Filter mislykkedes:"
 
-#: ../libgda-ui/gdaui-data-filter.c:213
+#: ../libgda-ui/gdaui-data-filter.c:216
 msgid "Filter"
 msgstr "Filter"
 
-#: ../libgda-ui/gdaui-data-filter.c:213
+#: ../libgda-ui/gdaui-data-filter.c:216
 msgid "any valid SQL expression"
 msgstr "ethvert gyldigt SQL-udtryk"
 
-#: ../libgda-ui/gdaui-data-filter.c:229
+#: ../libgda-ui/gdaui-data-filter.c:232
 msgid "Set filter"
 msgstr "Angiv filter"
 
-#: ../libgda-ui/gdaui-data-filter.c:234
+#: ../libgda-ui/gdaui-data-filter.c:237
 msgid "Clear filter"
 msgstr "Ryd filter"
 
@@ -4118,42 +4201,43 @@ msgstr "Ryd filter"
 msgid "Attempt to initialize an already initialized library"
 msgstr "Forsøg på at klargøre et allerede klargjort bibliotek"
 
-#: ../libgda-ui/gdaui-init.c:464
+#: ../libgda-ui/gdaui-init.c:465
 msgid "Could not open plugins directory, no plugin loaded."
 msgstr ""
 "Kunne ikke åbne mappe for udvidelsesmoduler, intet udvidelsesmodul indlæst."
 
-#: ../libgda-ui/gdaui-init.c:484
-#: ../tools/browser/query-exec/query-result.c:255 ../tools/web-server.c:2018
+#: ../libgda-ui/gdaui-init.c:485
+#: ../tools/browser/data-manager/xml-spec-editor.c:217
+#: ../tools/browser/query-exec/query-result.c:256 ../tools/web-server.c:2018
 #, c-format
 msgid "Error: %s"
 msgstr "Fejl: %s"
 
-#: ../libgda-ui/gdaui-init.c:491
+#: ../libgda-ui/gdaui-init.c:492
 #, c-format
 msgid "Loading file %s...\n"
 msgstr "Indlæser fil %s...\n"
 
-#: ../libgda-ui/gdaui-init.c:494
+#: ../libgda-ui/gdaui-init.c:495
 #, c-format
 msgid "Plugins load warning: %s"
 msgstr "Advarsel ved indlæsning af udvidelsesmodul: %s"
 
 #. radio buttons
-#: ../libgda-ui/gdaui-login.c:152
+#: ../libgda-ui/gdaui-login.c:169
 msgid "Use data source:"
 msgstr "Brug datakilde:"
 
-#: ../libgda-ui/gdaui-login.c:160
+#: ../libgda-ui/gdaui-login.c:177
 msgid "Specify connection:"
 msgstr "Angiv forbindelse:"
 
 #. Create the DSN add button
-#: ../libgda-ui/gdaui-login.c:174
+#: ../libgda-ui/gdaui-login.c:191
 msgid "Data sources..."
 msgstr "Datakilder..."
 
-#: ../libgda-ui/gdaui-login.c:400
+#: ../libgda-ui/gdaui-login.c:420
 msgid "Could not execute the Database access control center"
 msgstr "Kunne ikke køre adgangskontrolcentret for databasen"
 
@@ -4191,36 +4275,36 @@ msgstr "Kan ikke være NULL"
 msgid "No title"
 msgstr "Ingen titel"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1753
+#: ../libgda-ui/gdaui-raw-grid.c:1762
 msgid "Select _All"
 msgstr "Vælg _alle"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1758
+#: ../libgda-ui/gdaui-raw-grid.c:1767
 msgid "_Clear Selection"
 msgstr "_Ryd markering"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1761
+#: ../libgda-ui/gdaui-raw-grid.c:1770
 msgid "Show Column _Titles"
 msgstr "Vis kolonne_titler"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1766
+#: ../libgda-ui/gdaui-raw-grid.c:1775
 msgid "_Set filter"
 msgstr "_Angiv filter"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1769
+#: ../libgda-ui/gdaui-raw-grid.c:1778
 msgid "_Unset filter"
 msgstr "_Fravælg filter"
 
 #. create dialog box
-#: ../libgda-ui/gdaui-raw-grid.c:1868
+#: ../libgda-ui/gdaui-raw-grid.c:1878
 msgid "Saving Data"
 msgstr "Gemmer data"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1876
+#: ../libgda-ui/gdaui-raw-grid.c:1886
 msgid "Saving data to a file"
 msgstr "Gemmer data til en fil"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1877
+#: ../libgda-ui/gdaui-raw-grid.c:1887
 msgid ""
 "The data will be exported without any of the modifications which may have "
 "been made and have not been committed."
@@ -4228,48 +4312,83 @@ msgstr ""
 "Dataene vil blive eksporteret uden eventuelle ændringer, som ikke er blevet "
 "integreret."
 
-#: ../libgda-ui/gdaui-raw-grid.c:1892
+#: ../libgda-ui/gdaui-raw-grid.c:1902
 msgid "File name"
 msgstr "Filnavn"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1910
+#: ../libgda-ui/gdaui-raw-grid.c:1921
 msgid "Details"
 msgstr "Detaljer"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1930
-msgid "Limit to selection?"
-msgstr "Begræns til markering?"
-
-#: ../libgda-ui/gdaui-raw-grid.c:1949
+#. file type
+#: ../libgda-ui/gdaui-raw-grid.c:1942
 msgid "File type:"
 msgstr "Filtype:"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1959
+#: ../libgda-ui/gdaui-raw-grid.c:1952
 msgid "Tab-delimited"
 msgstr "Tabulatorafgrænset"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1960
+#: ../libgda-ui/gdaui-raw-grid.c:1953
 msgid "Comma-delimited"
 msgstr "Kommaafgrænset"
 
-#: ../libgda-ui/gdaui-raw-grid.c:1961
+#: ../libgda-ui/gdaui-raw-grid.c:1954
 msgid "XML"
 msgstr "XML"
 
-#: ../libgda-ui/gdaui-raw-grid.c:2090
+#. limit to selection ?
+#: ../libgda-ui/gdaui-raw-grid.c:1961
+msgid "Limit to selection?"
+msgstr "Begræns til markering?"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1982
+msgid "Other options"
+msgstr "Andre indstillinger"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1989
+msgid "Empty string when NULL?"
+msgstr "Tom streng når NUL?"
+
+# værdier der er NULL
+#: ../libgda-ui/gdaui-raw-grid.c:1992 ../libgda-ui/gdaui-raw-grid.c:1997
+msgid "Export NULL values as an empty \"\" string"
+msgstr "Eksporter NUL-værdier som en tom \"\"-streng"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1999
+msgid "Invalid data as NULL?"
+msgstr "Ugyldige data som NUL?"
+
+#: ../libgda-ui/gdaui-raw-grid.c:2002 ../libgda-ui/gdaui-raw-grid.c:2007
+msgid ""
+"Don't export invalid data,\n"
+"but export a NULL value instead"
+msgstr ""
+"Eksporter ikke ugyldige data,\n"
+"men eksporter en NUL-værdi i steden for"
+
+#: ../libgda-ui/gdaui-raw-grid.c:2009
+msgid "Field names on first row?"
+msgstr "Feltnavne på første række?"
+
+#: ../libgda-ui/gdaui-raw-grid.c:2012 ../libgda-ui/gdaui-raw-grid.c:2017
+msgid "Add a row at beginning with columns names"
+msgstr "Tilføj en række i begyndelsen med kolonnenavne"
+
+#: ../libgda-ui/gdaui-raw-grid.c:2184
 #, c-format
 msgid "Could not save file %s"
 msgstr "Kunne ikke gemme fil %s"
 
-#: ../libgda-ui/gdaui-raw-grid.c:2098
+#: ../libgda-ui/gdaui-raw-grid.c:2192
 msgid "You must specify a file name"
 msgstr "Du skal angive et filnavn"
 
-#: ../libgda-ui/gdaui-raw-grid.c:2104
+#: ../libgda-ui/gdaui-raw-grid.c:2198
 msgid "Got empty file while converting the data"
 msgstr "Fik tom fil under konvertering af data"
 
-#: ../libgda-ui/gdaui-raw-grid.c:2117
+#: ../libgda-ui/gdaui-raw-grid.c:2211
 #, c-format
 msgid ""
 "File '%s' already exists.\n"
@@ -4278,7 +4397,7 @@ msgstr ""
 "Filen '%s' findes allerede.\n"
 "Ã?nsker du at overskrive den?"
 
-#: ../libgda-ui/gdaui-raw-grid.c:2127
+#: ../libgda-ui/gdaui-raw-grid.c:2221
 msgid "If you choose yes, the contents will be lost."
 msgstr "Hvis du vælger ja, vil indholdet gå tabt."
 
@@ -4654,6 +4773,7 @@ msgstr "Globale begrænsninger"
 #: ../providers/postgres/postgres_specs_add_column.xml.in.h:11
 #: ../providers/postgres/postgres_specs_create_table.xml.in.h:52
 #: ../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:196
 #: ../tools/command-exec.c:809
 msgid "Primary key"
@@ -4834,12 +4954,11 @@ msgstr "Tabel der skal omdøbes"
 
 #: ../providers/bdbsql/libmain.c:50
 msgid "Can't find libdb_sql-5."
-msgstr ""
+msgstr "Kan ikke finde libdb_sql-5."
 
 #: ../providers/bdbsql/libmain.c:88
-#, fuzzy
 msgid "Provider for BDB SQL databases"
-msgstr "Leverandør til MySQL-databaser"
+msgstr "Leverandør til BDB SQL-databaser"
 
 #: ../providers/jdbc/GdaInputStream.c:34
 #: ../providers/jdbc/GdaInputStream.c:108 ../providers/jdbc/GdaJValue.c:187
@@ -4863,7 +4982,7 @@ msgstr "Ugyldig dato: �r %d, måned %d og dag %d"
 msgid "Can't get BLOB's size"
 msgstr "Kan ikke indhente BLOB's størrelse"
 
-#: ../providers/jdbc/gda-jdbc-provider.c:359
+#: ../providers/jdbc/gda-jdbc-provider.c:363
 msgid "The connection string must contain the URL value"
 msgstr "Forbindelsesstrengen skal indeholde URL-værdien"
 
@@ -4949,13 +5068,13 @@ msgstr "Ukorrekt angivet kolonnenavn"
 msgid "MySQL boolean representation"
 msgstr "Boolesk repræsentation for MySQL"
 
-#: ../providers/mysql/gda-mysql-provider.c:476
+#: ../providers/mysql/gda-mysql-provider.c:480
 msgid "Cannot give a UNIX SOCKET if you also provide either a HOST or a PORT"
 msgstr ""
 "Kan ikke tildele en UNIX SOCKET hvis du også tildeler enten en HOST (V�RT) "
 "eller en PORT"
 
-#: ../providers/mysql/gda-mysql-provider.c:528
+#: ../providers/mysql/gda-mysql-provider.c:532
 #, c-format
 msgid ""
 "Could not set client charset to UTF8. Using %s. It'll be problems with non "
@@ -4964,25 +5083,25 @@ msgstr ""
 "Kunne ikke angive klienttegnsæt til UTF8. Bruger %s. Der vil opstå problemer "
 "med tegn uden for tegnsættet UTF-8"
 
-#: ../providers/mysql/gda-mysql-provider.c:584
+#: ../providers/mysql/gda-mysql-provider.c:588
 msgid "The connection string must contain the DB_NAME values"
 msgstr "Forbindelsesstrengen skal indeholde værdierne fra DB_NAME"
 
-#: ../providers/mysql/gda-mysql-provider.c:622
+#: ../providers/mysql/gda-mysql-provider.c:626
 #: ../providers/mysql/gda-mysql-util.c:69
 msgid "No description"
 msgstr "Ingen beskrivelse"
 
-#: ../providers/mysql/gda-mysql-provider.c:1658
+#: ../providers/mysql/gda-mysql-provider.c:1752
 msgid "Unnamed statement parameter is not allowed in prepared statement."
 msgstr "Unavngivet udtryksparameter er ikke tilladt i forberedt udtryk."
 
 #. force reading the complete BLOB into memory
-#: ../providers/mysql/gda-mysql-provider.c:2217
+#: ../providers/mysql/gda-mysql-provider.c:2340
 msgid "Can't read whole BLOB into memory"
 msgstr "Kan ikke indlæse hele BLOB til hukommelsen"
 
-#: ../providers/mysql/gda-mysql-provider.c:2307
+#: ../providers/mysql/gda-mysql-provider.c:2430
 msgid ""
 "Could not use CURSOR. Mysql version 5.0 at least is required. Using random "
 "access anyway."
@@ -5536,6 +5655,7 @@ msgstr "Fast"
 #. 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:852
 msgid "Foreign key"
 msgstr "Fremmed nøgle"
@@ -5823,11 +5943,11 @@ msgstr ""
 "Utilstrækkelig hukommelse til at konvertere streng til binært mellemlager "
 "(buffer)"
 
-#: ../providers/postgres/gda-postgres-provider.c:446
+#: ../providers/postgres/gda-postgres-provider.c:456
 msgid "The connection string must contain a DB_NAME value"
 msgstr "Forbindelsesstrengen skal indeholde en DB_NAME-værdi"
 
-#: ../providers/postgres/gda-postgres-provider.c:450
+#: ../providers/postgres/gda-postgres-provider.c:460
 msgid ""
 "The connection string format has changed: replace DATABASE with DB_NAME and "
 "the same contents"
@@ -5837,12 +5957,12 @@ msgstr ""
 
 # Tror search_path er navnet på en intern variabel
 # (jeg kan ikke tro at der kan være en genvejstast i en fejlmeddelelse)
-#: ../providers/postgres/gda-postgres-provider.c:578
+#: ../providers/postgres/gda-postgres-provider.c:588
 #, c-format
 msgid "Could not set search_path to %s"
 msgstr "Kunne ikke angive search_path (søgesti) til %s"
 
-#: ../providers/postgres/gda-postgres-provider.c:587
+#: ../providers/postgres/gda-postgres-provider.c:597
 #, c-format
 msgid "Search path %s is invalid"
 msgstr "Søgesti %s er ugyldig"
@@ -5852,44 +5972,44 @@ msgstr "Søgesti %s er ugyldig"
 # uncommitted isolation"
 # (uden nærmere undersøgelse, tror jeg der er stor sandsynlighed for
 # misforståelser hvis det oversættes)
-#: ../providers/postgres/gda-postgres-provider.c:1026
-#: ../providers/postgres/gda-postgres-provider.c:1028
+#: ../providers/postgres/gda-postgres-provider.c:1036
+#: ../providers/postgres/gda-postgres-provider.c:1038
 msgid "Transactions are not supported in read uncommitted isolation level"
 msgstr ""
 "Transaktioner er ikke understøttet i read uncommitted isolation level (læst "
 "ikkeintegreret isolationsniveau)"
 
-#: ../providers/postgres/gda-postgres-provider.c:1032
-#: ../providers/postgres/gda-postgres-provider.c:1034
+#: ../providers/postgres/gda-postgres-provider.c:1042
+#: ../providers/postgres/gda-postgres-provider.c:1044
 msgid "Transactions are not supported in repeatable read isolation level"
 msgstr ""
 "Transaktioner er ikke understøttet i repeatable read isolation level "
 "(gentagbar læst isolationsniveau)"
 
-#: ../providers/postgres/gda-postgres-provider.c:1051
-#: ../providers/postgres/gda-postgres-provider.c:1149
-#: ../providers/postgres/gda-postgres-provider.c:1199
-#: ../providers/postgres/gda-postgres-provider.c:1249
+#: ../providers/postgres/gda-postgres-provider.c:1061
+#: ../providers/postgres/gda-postgres-provider.c:1159
+#: ../providers/postgres/gda-postgres-provider.c:1209
+#: ../providers/postgres/gda-postgres-provider.c:1259
 #: ../providers/postgres/gda-postgres-recordset.c:431
 #: ../providers/postgres/gda-postgres-recordset.c:459
 msgid "Internal error"
 msgstr "Intern fejl"
 
-#: ../providers/postgres/gda-postgres-provider.c:1155
-#: ../providers/postgres/gda-postgres-provider.c:1205
-#: ../providers/postgres/gda-postgres-provider.c:1255
+#: ../providers/postgres/gda-postgres-provider.c:1165
+#: ../providers/postgres/gda-postgres-provider.c:1215
+#: ../providers/postgres/gda-postgres-provider.c:1265
 #, c-format
 msgid "Wrong savepoint name '%s'"
 msgstr "Forkert gemningspunktnavn '%s'"
 
-#: ../providers/postgres/gda-postgres-provider.c:2000
-#: ../providers/postgres/gda-postgres-provider.c:2002
+#: ../providers/postgres/gda-postgres-provider.c:2043
+#: ../providers/postgres/gda-postgres-provider.c:2045
 msgid "Cannot start transaction"
 msgstr "Kan ikke starte transaktion"
 
-#: ../providers/postgres/gda-postgres-provider.c:2192
-#: ../providers/postgres/gda-postgres-provider.c:2228
-#: ../providers/postgres/gda-postgres-provider.c:2263
+#: ../providers/postgres/gda-postgres-provider.c:2254
+#: ../providers/postgres/gda-postgres-provider.c:2290
+#: ../providers/postgres/gda-postgres-provider.c:2325
 msgid "Could not set the XA transaction ID parameter"
 msgstr "Kunne ikke angive id-parameteren for XA-transaktionen"
 
@@ -6147,18 +6267,16 @@ msgstr "Prædikat"
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:5
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:2
-#, fuzzy
 msgid "Can create databases"
-msgstr "Opret en ny database:"
+msgstr "Kan oprette databaser"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
 #. available since PostgreSQL 8.1
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:10
-#, fuzzy
 msgid "Can create roles"
-msgstr "Kan ikke oprette mappe '%s'"
+msgstr "Kan oprette roller"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6166,8 +6284,10 @@ msgstr "Kan ikke oprette mappe '%s'"
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:15
 msgid "Can login"
-msgstr ""
+msgstr "Kan logge ind"
 
+# Kontrollerer hvorvidt -> [Styrer/Angiver] om
+# evt.: er gemt -> (skal) gemmes
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
 #. available since PostgreSQL 8.1
@@ -6179,15 +6299,17 @@ msgid ""
 "the presented password string is already in MD5-encrypted format, then it is "
 "stored encrypted as-is."
 msgstr ""
+"Kontrollerer hvorvidt adgangskoden er gemt krypteret i systemkatalogerne. "
+"Hvis den præsenterede adgangskodestreng allerede er i MD5-krypteret format, "
+"så gemmes den krypteret som den er."
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
 #. available since PostgreSQL 8.1
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:25
-#, fuzzy
 msgid "Database superuser"
-msgstr "Databaseserver"
+msgstr "Databasesuperbruger"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6195,20 +6317,23 @@ msgstr "Databaseserver"
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:30
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:5
-#, fuzzy
 msgid "Encrypt password"
-msgstr "Adgangskode for administrator"
+msgstr "Krypter adgangskode"
 
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:31
-#, fuzzy
 msgid "Existing role"
-msgstr "Eksisterende handlingstyper:\n"
+msgstr "Eksisterende rolle"
 
+# synes det er lidt svært at læse (enig)
+# Eksisterende roller hvortil den nye rolle umiddelbart vil blive tilføjet som nyt medlem"
+# (ved ikke om det er så meget bedre)
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:32
 msgid ""
 "Existing roles to which the new role will be immediately added as a new "
 "member"
 msgstr ""
+"Eksisterende roller som den nye rolle umiddelbart vil blive tilføjet som et "
+"nyt medlem"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6219,21 +6344,24 @@ msgid ""
 "If the role is allowed to log in, defines the number of concurrent "
 "connections the role can make (-1 or unset for unlimited)"
 msgstr ""
+"Hvis rollen har tilladelse til at logge ind, så definerer dette antallet af "
+"samtidige forbindelser rollen kan foretage (-1 eller usat for ubegrænset)"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
 #. available since PostgreSQL 8.1
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:42
-#, fuzzy
 msgid "Inherit"
-msgstr "Nedarving"
+msgstr "Nedarv"
 
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:43
 msgid ""
 "Lists one or more existing roles which are automatically added as members of "
 "the new role"
 msgstr ""
+"Viser en eller flere eksisterende roller som automatisk tilføjes som "
+"medlemmer af den nye rolle"
 
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:44
 msgid ""
@@ -6241,28 +6369,34 @@ msgid ""
 "the new role, giving them the right to grant membership in this role to "
 "others"
 msgstr ""
+"Viser en eller flere eksisterende roller som automatisk tilføjes som "
+"medlemmer af den nye rolle, hvilket giver dem rettigheder til at tildele "
+"medlemskab i denne rolle til andre"
 
+# måske Begrænsning på log ind
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
 #. available since PostgreSQL 8.1
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:49
 msgid "Login limit"
-msgstr ""
+msgstr "Logind-begrænsning"
 
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:50
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:8
 msgid "Member of"
-msgstr ""
+msgstr "Medlem af"
 
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:61
-#, fuzzy
 msgid "Role"
-msgstr "Fjern"
+msgstr "Rolle"
 
+# Administratorroller
+# opfatter det som:
+# Rollens administratorer
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:62
 msgid "Role's admins"
-msgstr ""
+msgstr "Rollens administratorer"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6270,13 +6404,12 @@ msgstr ""
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:67
 #: ../providers/postgres/postgres_specs_drop_role.xml.in.h:4
-#, fuzzy
 msgid "Role's definition"
-msgstr "Visningens definition"
+msgstr "Rolles definition"
 
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:68
 msgid "Role's members"
-msgstr ""
+msgstr "Rollens medlemmer"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6284,18 +6417,16 @@ msgstr ""
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:73
 #: ../providers/postgres/postgres_specs_drop_role.xml.in.h:5
-#, fuzzy
 msgid "Role's name"
-msgstr "Tabellens navn"
+msgstr "Rolles navn"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
 #. available since PostgreSQL 8.1
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:78
-#, fuzzy
 msgid "Role's password"
-msgstr "Adgangskode"
+msgstr "Rolles adgangskode"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6306,6 +6437,8 @@ msgid ""
 "Set to TRUE if the created role inherits the privileges of roles it is a "
 "member of"
 msgstr ""
+"Angiv som TRUE (SAND) hvis den oprettede rolle arver privilegierne på de "
+"roller, den er medlem af"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6313,7 +6446,7 @@ msgstr ""
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:88
 msgid "Set to TRUE if the role is a database superuser"
-msgstr ""
+msgstr "Angiv som TRUE (SAND) hvis rollen er en databasesuperbruger"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6321,7 +6454,7 @@ msgstr ""
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:93
 msgid "Set to TRUE if the role is allowed to create databases"
-msgstr ""
+msgstr "Angiv som TRUE (SAND) hvis rollen har lov til at oprette databaser"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6329,7 +6462,7 @@ msgstr ""
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:98
 msgid "Set to TRUE if the role is allowed to create roles"
-msgstr ""
+msgstr "Angiv som TRUE (SAND) hvis rollen har tilladelse til at oprette roller"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6337,7 +6470,7 @@ msgstr ""
 #.
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:103
 msgid "Set to TRUE if the role is allowed to log in"
-msgstr ""
+msgstr "Angiv som TRUE (SAND) hvis rollen har tilladelse til at logge ind"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6350,6 +6483,9 @@ msgid ""
 "per se: the expiration time is not enforced when logging in using a non-"
 "password-based authentication method)"
 msgstr ""
+"Angiver en udløbsdato for en adgangskode (gælder ikke for brugerkontoen: "
+"Udløbsdatoen iværksættes ikke når der logges ind med brug af en "
+"godkendelsesmetode der ikke er adgangskodebaseret)"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6358,7 +6494,7 @@ msgstr ""
 #: ../providers/postgres/postgres_specs_create_role.xml.in.h:113
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:19
 msgid "Valid until"
-msgstr ""
+msgstr "Gyldig indtil"
 
 #: ../providers/postgres/postgres_specs_create_table.xml.in.h:8
 msgid "Copy default expressions"
@@ -6422,54 +6558,51 @@ msgstr "Med OID'er"
 
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:1
 msgid "Can be used to choose the PostgreSQL user ID of the new user"
-msgstr ""
+msgstr "Kan bruges til at vælge PostgreSQL-bruger-id'et på den nye bruger"
 
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:3
-#, fuzzy
 msgid "Can create users"
-msgstr "Afbrudt af bruger"
+msgstr "Kan oprette brugere"
 
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:6
 msgid ""
 "Existing groups to which the new user will be immediately added as a new "
 "member"
 msgstr ""
+"Eksisterende grupper som en ny bruger umiddelbart vil blive tilføjet til som "
+"et nyt medlem"
 
-# tror de mener 'Kører en..'
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:7
-#, fuzzy
 msgid "Existing user"
-msgstr "Kører en forespørgsel"
+msgstr "Eksisterende bruger"
 
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:11
 msgid "Set to TRUE if the user is allowed to create databases"
 msgstr ""
+"Angiv som TRUE (SAND) hvis brugeren har tilladelse til at oprette databaser"
 
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:12
 msgid "Set to TRUE if the user is allowed to create users"
 msgstr ""
+"Angiv som TRUE (SAND) hvis brugeren har tilladelse til at oprette brugere"
 
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:15
-#, fuzzy
 msgid "User ID"
-msgstr "Bruger"
+msgstr "Bruger-id"
 
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:16
 #: ../providers/postgres/postgres_specs_drop_user.xml.in.h:4
-#, fuzzy
 msgid "User's definition"
-msgstr "Visningens definition"
+msgstr "Brugers definition"
 
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:17
 #: ../providers/postgres/postgres_specs_drop_user.xml.in.h:5
-#, fuzzy
 msgid "User's name"
-msgstr "Brugernavn"
+msgstr "Brugers navn"
 
 #: ../providers/postgres/postgres_specs_create_user.xml.in.h:18
-#, fuzzy
 msgid "User's password"
-msgstr "Adgangskode"
+msgstr "Brugers adgangskode"
 
 # Drop automatisk el. lign.
 #: ../providers/postgres/postgres_specs_drop_column.xml.in.h:1
@@ -6490,14 +6623,12 @@ msgid "The name of a database to drop"
 msgstr "Navnet på en database der skal smides"
 
 #: ../providers/postgres/postgres_specs_drop_role.xml.in.h:1
-#, fuzzy
 msgid "Drop role only if it exists"
-msgstr "Smid kun tabel hvis den findes"
+msgstr "Smid kun rolle hvis den findes"
 
 #: ../providers/postgres/postgres_specs_drop_user.xml.in.h:1
-#, fuzzy
 msgid "Drop user only if it exists"
-msgstr "Smid kun visning hvis den findes"
+msgstr "Smid kun bruger hvis denne findes"
 
 #: ../providers/postgres/postgres_specs_drop_view.xml.in.h:1
 msgid "Automatically drop objects that depend on the view (CASCADE)"
@@ -6553,44 +6684,44 @@ msgstr "kunne ikke afklare de indekserede kolonner for indeks"
 msgid "Provider for SQLite databases"
 msgstr "Leverandør af SQLite-databaser"
 
-#: ../providers/web/gda-web-provider.c:287 ../providers/web/gda-web-util.c:296
+#: ../providers/web/gda-web-provider.c:290 ../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 "Ugyldig HOST/SCRIPT '%s'"
 
-#: ../providers/web/gda-web-provider.c:348
-#: ../providers/web/gda-web-provider.c:354
-#: ../providers/web/gda-web-provider.c:360
-#: ../providers/web/gda-web-provider.c:368
+#: ../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
 #, c-format
 msgid "The connection string must contain the %s value"
 msgstr "Forbindelsesstrengen skal indeholde værdien %s"
 
-#: ../providers/web/gda-web-provider.c:624
-#: ../providers/web/gda-web-provider.c:649
+#: ../providers/web/gda-web-provider.c:627
+#: ../providers/web/gda-web-provider.c:652
 #, c-format
 msgid "Not supported"
 msgstr "Ikke understøttet"
 
-#: ../providers/web/gda-web-provider.c:629
-#: ../providers/web/gda-web-provider.c:654
+#: ../providers/web/gda-web-provider.c:632
+#: ../providers/web/gda-web-provider.c:657
 #, c-format
 msgid "Server operations not yet implemented"
 msgstr "Serverhandlinger endnu ikke implementeret"
 
-#: ../providers/web/gda-web-provider.c:704
-#: ../providers/web/gda-web-provider.c:769
-#: ../providers/web/gda-web-provider.c:829
+#: ../providers/web/gda-web-provider.c:707
+#: ../providers/web/gda-web-provider.c:772
+#: ../providers/web/gda-web-provider.c:832
 msgid "Named transaction is not supported"
 msgstr "Navngivet transaktion er ikke understøttet"
 
-#: ../providers/web/gda-web-provider.c:709
+#: ../providers/web/gda-web-provider.c:712
 msgid "Transaction level is not supported"
 msgstr "Transaktionsniveau er ikke understøttet"
 
-#: ../providers/web/gda-web-provider.c:889
-#: ../providers/web/gda-web-provider.c:950
+#: ../providers/web/gda-web-provider.c:892
+#: ../providers/web/gda-web-provider.c:953
 msgid "Unnamed savepoint is not supported"
 msgstr "Unavngivet gemningspunkt er ikke understøttet"
 
@@ -6772,15 +6903,15 @@ msgstr "Angiv som original"
 msgid "Set as default"
 msgstr "Angiv som standard"
 
-#: ../tools/browser/auth-dialog.c:435
+#: ../tools/browser/auth-dialog.c:522
 msgid "For connection"
 msgstr "For forbindelse"
 
-#: ../tools/browser/auth-dialog.c:436
+#: ../tools/browser/auth-dialog.c:523
 msgid "enter authentication information"
 msgstr "indtast godkendelsesinformation"
 
-#: ../tools/browser/auth-dialog.c:622 ../tools/browser/login-dialog.c:238
+#: ../tools/browser/auth-dialog.c:679 ../tools/browser/login-dialog.c:238
 #, c-format
 msgid ""
 "Could not open connection:\n"
@@ -6794,48 +6925,48 @@ msgstr ""
 msgid "c%u"
 msgstr "c%u"
 
-#: ../tools/browser/browser-connection.c:348
-#: ../tools/browser/browser-connection.c:428
+#: ../tools/browser/browser-connection.c:350
+#: ../tools/browser/browser-connection.c:436
 msgid "Analysing database schema"
 msgstr "Analyserer databaseskema"
 
-#: ../tools/browser/browser-connection.c:350
-#: ../tools/browser/browser-connection.c:410
-#: ../tools/browser/browser-connection.c:430
-#: ../tools/browser/browser-connection.c:832
+#: ../tools/browser/browser-connection.c:352
+#: ../tools/browser/browser-connection.c:418
+#: ../tools/browser/browser-connection.c:438
+#: ../tools/browser/browser-connection.c:850
 #, c-format
 msgid "Error while fetching meta data from the connection: %s"
 msgstr "Fejl ved hentning af metadata fra forbindelsen: %s"
 
-#: ../tools/browser/browser-connection.c:408
-#: ../tools/browser/browser-connection.c:830
+#: ../tools/browser/browser-connection.c:416
+#: ../tools/browser/browser-connection.c:848
 msgid "Getting database schema information"
 msgstr "Indhenter information for databaseskema"
 
-#: ../tools/browser/browser-connection.c:604
-#: ../tools/browser/browser-connection.c:624
+#: ../tools/browser/browser-connection.c:622
+#: ../tools/browser/browser-connection.c:642
 #, c-format
 msgid "Error while analysing database schema: %s"
 msgstr "Fejl ved analyse af databaseskema: %s"
 
 # tror de mener 'Kører en..'
-#: ../tools/browser/browser-connection.c:1085
-#: ../tools/browser/browser-connection.c:1128
+#: ../tools/browser/browser-connection.c:1104
+#: ../tools/browser/browser-connection.c:1154
 msgid "Executing a query"
 msgstr "Kører en forespørgsel"
 
-#: ../tools/browser/browser-connection.c:1240
+#: ../tools/browser/browser-connection.c:1416
 #, c-format
 msgid "Connection not yet opened"
 msgstr "Forbindelse endnu ikke åbnet"
 
-#: ../tools/browser/browser-connection.c:1246
+#: ../tools/browser/browser-connection.c:1422
 msgid "Can't initialize dictionary to store table preferences"
 msgstr "Kan ikke starte ordbog der skal gemme tabelpræferencer"
 
-#: ../tools/browser/browser-connection.c:1292
-#: ../tools/browser/browser-connection.c:1298
-#: ../tools/browser/browser-connection.c:1434
+#: ../tools/browser/browser-connection.c:1468
+#: ../tools/browser/browser-connection.c:1474
+#: ../tools/browser/browser-connection.c:1610
 #: ../tools/browser/browser-favorites.c:523
 #: ../tools/browser/browser-favorites.c:529
 #: ../tools/browser/browser-favorites.c:958
@@ -6843,7 +6974,7 @@ msgstr "Kan ikke starte ordbog der skal gemme tabelpræferencer"
 msgid "Can't initialize transaction to access favorites"
 msgstr "Kan ikke starte transaktion der skal tilgå favoritter"
 
-#: ../tools/browser/browser-connection.c:1379
+#: ../tools/browser/browser-connection.c:1555
 #: ../tools/browser/browser-favorites.c:702
 #: ../tools/browser/browser-favorites.c:1016
 msgid "Can't commit transaction to access favorites"
@@ -6883,7 +7014,7 @@ msgstr ""
 msgid "Opened connections"
 msgstr "Ã?bnede forbindelser"
 
-#: ../tools/browser/browser-connections-list.c:354 ../tools/gda-sql.c:3080
+#: ../tools/browser/browser-connections-list.c:354 ../tools/gda-sql.c:3088
 msgid "List of opened connections"
 msgstr "Liste over åbnede forbindelser"
 
@@ -6925,17 +7056,17 @@ msgid "Bookmarks"
 msgstr "Bogmærker"
 
 #: ../tools/browser/browser-stock-icons.c:47
-#: ../tools/browser/browser-window.c:248
+#: ../tools/browser/browser-window.c:270
 msgid "Begin"
 msgstr "Begynd"
 
 #: ../tools/browser/browser-stock-icons.c:48
-#: ../tools/browser/browser-window.c:250
+#: ../tools/browser/browser-window.c:272
 msgid "Commit"
 msgstr "Integrer (commit)"
 
 #: ../tools/browser/browser-stock-icons.c:49
-#: ../tools/browser/browser-window.c:252
+#: ../tools/browser/browser-window.c:274
 msgid "Rollback"
 msgstr "Rul tilbage"
 
@@ -6951,19 +7082,19 @@ msgstr "Bundet forbindelse er i brug"
 msgid "Virtual connection using this connection is busy"
 msgstr "Virtuel forbindelse der bruger denne forbindelse er optaget"
 
-#: ../tools/browser/browser-window.c:223
+#: ../tools/browser/browser-window.c:244
 msgid "_Fullscreen"
 msgstr "_Fuldskærm"
 
-#: ../tools/browser/browser-window.c:223
+#: ../tools/browser/browser-window.c:244
 msgid "Use the whole screen"
 msgstr "Brug hele skærmen"
 
-#: ../tools/browser/browser-window.c:229
+#: ../tools/browser/browser-window.c:250
 msgid "_Bind connection"
 msgstr "_Tildel forbindelse"
 
-#: ../tools/browser/browser-window.c:229
+#: ../tools/browser/browser-window.c:250
 msgid ""
 "Use connection to create\n"
 "a new binding connection to access data\n"
@@ -6973,81 +7104,86 @@ msgstr ""
 "en ny tildelingsforbindelse for at tilgå\n"
 "data fra flere databaser på en gang"
 
-#: ../tools/browser/browser-window.c:248
+#: ../tools/browser/browser-window.c:270
 msgid "Begin a new transaction"
 msgstr "Begynd på ny transaktion"
 
-#: ../tools/browser/browser-window.c:250
+#: ../tools/browser/browser-window.c:272
 msgid "Commit current transaction"
 msgstr "Integrer aktuel transaktion"
 
-#: ../tools/browser/browser-window.c:252
+#: ../tools/browser/browser-window.c:274
 msgid "Rollback current transaction"
 msgstr "Rul aktuel transaktion tilbage"
 
-#: ../tools/browser/browser-window.c:340
+#: ../tools/browser/browser-window.c:364
 msgid "unnamed"
 msgstr "unavngivet"
 
-#: ../tools/browser/browser-window.c:341
+#: ../tools/browser/browser-window.c:365
 #, c-format
 msgid "Connection: %s"
 msgstr "Forbindelse: %s"
 
-#: ../tools/browser/browser-window.c:703 ../tools/browser/support.c:75
+#: ../tools/browser/browser-window.c:740 ../tools/browser/support.c:75
 #, c-format
 msgid "Do you want to close the '%s' connection?"
 msgstr "Ã?nsker du at lukke forbindelsen '%s'?"
 
-#: ../tools/browser/browser-window.c:745 ../tools/browser/browser-window.c:752
+#: ../tools/browser/browser-window.c:782 ../tools/browser/browser-window.c:789
 msgid "Do you want to quit the application?"
 msgstr "Vil du afslutte programmet?"
 
-#: ../tools/browser/browser-window.c:746
+#: ../tools/browser/browser-window.c:783
 msgid "all the connections will be closed."
 msgstr "alle forbindelserne vil blive lukket."
 
-#: ../tools/browser/browser-window.c:753
+#: ../tools/browser/browser-window.c:790
 msgid "the connection will be closed."
 msgstr "forbindelsen vil blive lukket."
 
-#: ../tools/browser/browser-window.c:804
+#: ../tools/browser/browser-window.c:841
 #, c-format
 msgid "Error starting transaction: %s"
 msgstr "Fejl ved start af transaktion: %s"
 
-#: ../tools/browser/browser-window.c:818
+#: ../tools/browser/browser-window.c:855
 #, c-format
 msgid "Error committing transaction: %s"
 msgstr "Fejl ved integrering af transaktion: %s"
 
-#: ../tools/browser/browser-window.c:832
+#: ../tools/browser/browser-window.c:869
 #, c-format
 msgid "Error rolling back transaction: %s"
 msgstr "Fejl ved tilbagerulning af transaktion: %s"
 
-#: ../tools/browser/browser-window.c:944
+#: ../tools/browser/browser-window.c:985
 #, c-format
 msgid "Error updating bound connection: %s"
 msgstr "Fejl ved opdatering af bundet forbindelse: %s"
 
-#: ../tools/browser/browser-window.c:985
+#: ../tools/browser/browser-window.c:1026
 #, c-format
 msgid "Could not open binding connection: %s"
 msgstr "Kunne ikke åbne bundet forbindelse: %s"
 
-#: ../tools/browser/browser-window.c:1025
+#: ../tools/browser/browser-window.c:1066
 #: ../tools/browser/gda-browser-4.0.desktop.in.h:2
 msgid "Database browser"
 msgstr "Databasebrowser"
 
-#: ../tools/browser/browser-window.c:1279
+# ville nok opdele: ...perspektivet '%s'. Du kan...
+# ellers bør der i princippet noget andet tegnsætning til
+#: ../tools/browser/browser-window.c:1320
 #, c-format
 msgid ""
 "The current perspective has changed to the '%s' perspective, you can switch "
 "back to previous perspective through the 'Perspective/%s' menu, or using the "
 "'%s' shortcut"
 msgstr ""
+"Det aktuelle perspektiv er ændret til perspektivet '%s'. Du kan skifte "
+"tilbage til det forrige perspektiv igennem menuen 'Perspektiv/%s', eller "
+"bruge genvejen '%s'"
 
 #: ../tools/browser/connection-binding-properties.c:142
 msgid "New virtual connection"
@@ -7188,7 +7324,7 @@ msgstr "DELETE SAVEPOINT-udtryk"
 msgid "Unknown statement"
 msgstr "Ukendt udtryk"
 
-#: ../tools/browser/mgr-favorites.c:541
+#: ../tools/browser/mgr-favorites.c:547
 msgid ""
 "Getting\n"
 "favorites..."
@@ -7196,7 +7332,7 @@ msgstr ""
 "Indhenter\n"
 "favoritter..."
 
-#: ../tools/browser/mgr-favorites.c:553
+#: ../tools/browser/mgr-favorites.c:559
 msgid ""
 "No favorite:\n"
 "drag item to\n"
@@ -7206,30 +7342,29 @@ msgstr ""
 "Træk punkt for\n"
 "at definere en"
 
-#: ../tools/browser/support.c:208
+#: ../tools/browser/support.c:211
 msgid "Note:"
 msgstr "Note:"
 
-#: ../tools/browser/support.c:211
+#: ../tools/browser/support.c:214
 msgid "Don't show this message again"
 msgstr "Vis ikke denne besked igen"
 
-#: ../tools/browser/support.c:272
+#: ../tools/browser/support.c:275
 msgid ""
 "Unable to display help. Please make sure the documentation package is "
 "installed."
-msgstr ""
+msgstr "Kan ikke vise hjælp. Sikr dig at dokumentationspakken er installeret."
 
-#: ../tools/browser/support.c:298
-#, fuzzy
+#: ../tools/browser/support.c:301
 msgid "Unable to open help file"
-msgstr "Kunne ikke åbne BLOB"
+msgstr "Kunne ikke åbne hjælpefil"
 
-#: ../tools/browser/support.c:352
+#: ../tools/browser/support.c:355
 msgid "Close tab"
 msgstr "Luk faneblad"
 
-#: ../tools/browser/support.h:91
+#: ../tools/browser/support.h:95
 msgid ""
 "<small>This area allows to give values to\n"
 "variables defined in the SQL code\n"
@@ -7428,7 +7563,7 @@ msgid "Data set import from file"
 msgstr "Datasætimport fra fil"
 
 #: ../tools/browser/common/gdaui-entry-import.c:202
-#: ../tools/browser/query-exec/query-result.c:216
+#: ../tools/browser/query-exec/query-result.c:217
 #, c-format
 msgid "%d row"
 msgid_plural "%d rows"
@@ -7436,7 +7571,7 @@ msgstr[0] "%d række"
 msgstr[1] "%d rækker"
 
 #: ../tools/browser/common/gdaui-entry-import.c:203
-#: ../tools/browser/query-exec/query-result.c:217
+#: ../tools/browser/query-exec/query-result.c:218
 #, c-format
 msgid "%d column"
 msgid_plural "%d columns"
@@ -7444,7 +7579,7 @@ msgstr[0] "%d kolonne"
 msgstr[1] "%d kolonner"
 
 #: ../tools/browser/common/gdaui-entry-import.c:204
-#: ../tools/browser/query-exec/query-result.c:219
+#: ../tools/browser/query-exec/query-result.c:220
 #, c-format
 msgid "Data set with %s and %s"
 msgstr "Datasæt med %s og %s"
@@ -7477,27 +7612,34 @@ msgstr[1] "%d tabeller i skema '%s':"
 msgid "None"
 msgstr "Ingen"
 
-#: ../tools/browser/data-manager/data-console.c:197
+#: ../tools/browser/common/ui-formgrid.c:162
+msgid "Toggle between grid and form presentations"
+msgstr "Skift mellem gitter- og formularpræsentationer"
+
+#: ../tools/browser/data-manager/data-console.c:265
 msgid "Data Manager"
 msgstr "Datahåndtering"
 
-#: ../tools/browser/data-manager/data-console.c:215
+#: ../tools/browser/data-manager/data-console.c:265
+#: ../tools/browser/data-manager/data-console.c:459
+#: ../tools/browser/schema-browser/relations-diagram.c:327
+#: ../tools/browser/schema-browser/relations-diagram.c:475
+#, fuzzy
+msgid "Unsaved"
+msgstr "Unavngivet"
+
+#: ../tools/browser/data-manager/data-console.c:296
 #: ../tools/browser/query-exec/query-console.c:336
 msgid "Variables' values:"
 msgstr "Variablers værdier:"
 
-#: ../tools/browser/data-manager/data-console.c:249
-#: ../tools/browser/query-exec/query-console.c:315
-msgid "SQL code to execute:"
-msgstr "SQL-kode til kørsel:"
-
-#: ../tools/browser/data-manager/data-console.c:295
+#: ../tools/browser/data-manager/data-console.c:351
 #: ../tools/browser/query-exec/query-console.c:363
 #: ../tools/browser/query-exec/query-console.c:427
 msgid "Clear"
 msgstr "Ryd"
 
-#: ../tools/browser/data-manager/data-console.c:295
+#: ../tools/browser/data-manager/data-console.c:351
 #: ../tools/browser/query-exec/query-console.c:363
 msgid ""
 "Clear the editor's\n"
@@ -7506,21 +7648,21 @@ msgstr ""
 "Ryd redigeringens\n"
 "indhold"
 
-#: ../tools/browser/data-manager/data-console.c:300
+#: ../tools/browser/data-manager/data-console.c:356
 #: ../tools/browser/query-exec/query-console.c:368
 msgid "Variables"
 msgstr "Variabler"
 
-#: ../tools/browser/data-manager/data-console.c:300
+#: ../tools/browser/data-manager/data-console.c:356
 msgid "Show variables needed"
 msgstr "Vis krævede variabler"
 
-#: ../tools/browser/data-manager/data-console.c:306
+#: ../tools/browser/data-manager/data-console.c:362
 #: ../tools/browser/query-exec/query-console.c:374
 msgid "Execute"
 msgstr "Kør"
 
-#: ../tools/browser/data-manager/data-console.c:306
+#: ../tools/browser/data-manager/data-console.c:362
 msgid ""
 "Execute specified\n"
 "data manager"
@@ -7528,11 +7670,11 @@ msgstr ""
 "Kør angivet\n"
 "datahåndtering"
 
-#: ../tools/browser/data-manager/data-console.c:312
+#: ../tools/browser/data-manager/data-console.c:368
 msgid "View XML"
 msgstr "Vis XML"
 
-#: ../tools/browser/data-manager/data-console.c:312
+#: ../tools/browser/data-manager/data-console.c:368
 msgid ""
 "View specifications\n"
 "as XML (advanced)"
@@ -7540,38 +7682,60 @@ msgstr ""
 "Vis specifikationer\n"
 "som XML (avanceret)"
 
-#: ../tools/browser/data-manager/data-console.c:322 ../tools/html-doc.c:95
+#: ../tools/browser/data-manager/data-console.c:376 ../tools/html-doc.c:95
 msgid "Help"
 msgstr "Hjælp"
 
-#: ../tools/browser/data-manager/data-console.c:337
+#: ../tools/browser/data-manager/data-console.c:389
 msgid "BBB:"
 msgstr "BBB:"
 
-#: ../tools/browser/data-manager/data-console.c:427
+#: ../tools/browser/data-manager/data-console.c:447
+#, fuzzy, c-format
+msgid "'%s' data manager"
+msgstr "Datahåndtering"
+
+#: ../tools/browser/data-manager/data-console.c:448
+#: ../tools/browser/data-manager/data-console.c:459
+#: ../tools/browser/data-manager/data-console.c:492
+#: ../tools/browser/data-manager/data-console.c:767
+msgid "Data manager"
+msgstr "Datahåndtering"
+
+#: ../tools/browser/data-manager/data-console.c:502
+#, fuzzy
+msgid "Could not save data manager"
+msgstr "Kunne ikke gemme diagram"
+
+#: ../tools/browser/data-manager/data-console.c:528
+#, fuzzy
+msgid "Data manager's name"
+msgstr "Datahåndtering"
+
+#: ../tools/browser/data-manager/data-console.c:548
+#: ../tools/browser/schema-browser/relations-diagram.c:286
+msgid "Save"
+msgstr "Gem"
+
+#: ../tools/browser/data-manager/data-console.c:646
 #, c-format
 msgid "No data source defined"
 msgstr "Ingen datakilde defineret"
 
-#: ../tools/browser/data-manager/data-console.c:486
-#: ../tools/browser/data-manager/spec-editor.c:538
-#: ../tools/browser/data-manager/spec-editor.c:596
+#: ../tools/browser/data-manager/data-console.c:706
+#: ../tools/browser/data-manager/xml-spec-editor.c:161
 #, c-format
 msgid "Error parsing XML specifications"
 msgstr "Fejl ved fortolkning af XML-specifikationer"
 
-#: ../tools/browser/data-manager/data-console.c:503
+#: ../tools/browser/data-manager/data-console.c:723
 msgid "_Toggle mode"
 msgstr "_Skift tilstand"
 
-#: ../tools/browser/data-manager/data-console.c:503
+#: ../tools/browser/data-manager/data-console.c:723
 msgid "Switch between compose and execute modes"
 msgstr "Skift mellem komponer- og kørselstilstande"
 
-#: ../tools/browser/data-manager/data-console.c:547
-msgid "Data manager"
-msgstr "Datahåndtering"
-
 #: ../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
@@ -7585,7 +7749,7 @@ msgstr "Kunne ikke fjerne favorit: %s"
 #: ../tools/browser/query-exec/query-favorite-selector.c:242
 #: ../tools/browser/query-exec/query-favorite-selector.c:600
 #: ../tools/browser/schema-browser/favorite-selector.c:358
-#: ../tools/browser/schema-browser/table-info.c:453
+#: ../tools/browser/schema-browser/table-info.c:474
 #, c-format
 msgid "Could not add favorite: %s"
 msgstr "Kunne ikke tilføje favorit: %s"
@@ -7609,9 +7773,23 @@ msgstr "Favoritter"
 msgid "Unnamed data manager"
 msgstr "Unavngivet datahåndtering"
 
+#: ../tools/browser/data-manager/data-manager-perspective.c:388
+#: ../tools/browser/query-exec/query-exec-perspective.c:385
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:317
+#, fuzzy
+msgid "_Show favorites"
+msgstr "Favoritter"
+
+#: ../tools/browser/data-manager/data-manager-perspective.c:388
+#: ../tools/browser/query-exec/query-exec-perspective.c:385
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:317
+#, fuzzy
+msgid "Show or hide favorites"
+msgstr "Kunne ikke tilføje favorit: %s"
+
 # tror de skal være uoversat
 #. Translators: Do not translate "table" nor "query"
-#: ../tools/browser/data-manager/data-source.c:249
+#: ../tools/browser/data-manager/data-source.c:252
 #, c-format
 msgid "Node must be \"table\" or \"query\", and is \"%s\""
 msgstr ""
@@ -7619,67 +7797,82 @@ msgstr ""
 
 # blev opdaget
 # (evt. Der blev fundet flere udtryk - kun det første....)
-#: ../tools/browser/data-manager/data-source.c:278
+#: ../tools/browser/data-manager/data-source.c:284
 #, c-format
 msgid "Multiple statements detected, only the first will be used"
 msgstr "Flere udtryk er opdaget, kun det første vil blive brugt"
 
-#: ../tools/browser/data-manager/data-source.c:348
+#: ../tools/browser/data-manager/data-source.c:368
 #: ../tools/browser/schema-browser/mgr-columns.c:274
 #, c-format
 msgid "Not ready"
 msgstr "Ikke klar"
 
-#: ../tools/browser/data-manager/data-source.c:357
+#: ../tools/browser/data-manager/data-source.c:375
+#, c-format
+msgid "Malformed table name \"%s\""
+msgstr "Forkert udformet tabelnavn \"%s\""
+
+#: ../tools/browser/data-manager/data-source.c:392
 #, c-format
 msgid "Could not find the \"%s\" table"
 msgstr "Kunne ikke finde tabellen \"%s\""
 
-#: ../tools/browser/data-manager/data-source.c:362
+#: ../tools/browser/data-manager/data-source.c:397
 #, c-format
 msgid "The \"%s\" object is not a table"
 msgstr "Objeketet \"%s\" er ikke en tabel"
 
 #. Translators: Do not translate "name"
-#: ../tools/browser/data-manager/data-source.c:376
+#: ../tools/browser/data-manager/data-source.c:415
 #, c-format
 msgid "Missing attribute \"name\" for table"
 msgstr "Manglende attribut \"navn\" for tabel"
 
-#: ../tools/browser/data-manager/data-source.c:381
+#: ../tools/browser/data-manager/data-source.c:420
 #, c-format
 msgid "Contents of '%s'"
 msgstr "Indhold af '%s'"
 
-#: ../tools/browser/data-manager/data-source.c:399
+#: ../tools/browser/data-manager/data-source.c:438
 #, c-format
 msgid "Could not build SELECT statement"
 msgstr "Kunne ikke kompilere SELECT-udtryk"
 
-#: ../tools/browser/data-manager/data-source.c:476
+#: ../tools/browser/data-manager/data-source.c:519
 #, c-format
 msgid "Could not find any foreign key to \"%s\""
 msgstr "Kunne ikke finde en fremmed nøgle til \"%s\""
 
-#: ../tools/browser/data-manager/data-source.c:484
+#: ../tools/browser/data-manager/data-source.c:527
 #, c-format
 msgid "The fields involved in the foreign key to \"%s\" are not known"
 msgstr "Felterne involveret i den fremmede nøgle til \"%s\" er ikke kendt"
 
-#: ../tools/browser/data-manager/data-source.c:575
+#: ../tools/browser/data-manager/data-source.c:648
 #, c-format
 msgid "Statement to execute is not a selection statement"
 msgstr "Udtryk til kørsel er ikke et udvælgelsesudtryk"
 
-#: ../tools/browser/data-manager/data-source.c:705
+#: ../tools/browser/data-manager/data-source.c:788
 #, c-format
 msgid "No SELECT statement to execute"
 msgstr "Intet SELECT-udtryk at køre"
 
-#: ../tools/browser/data-manager/data-widget.c:347
+#: ../tools/browser/data-manager/data-widget.c:357
 msgid "Error: no detail"
 msgstr "Fejl: Ingen detalje"
 
+#: ../tools/browser/data-manager/xml-spec-editor.c:175
+#, fuzzy, c-format
+msgid "Expecting <%s> root node"
+msgstr "Forventet mærke <%s>, fik <%s>"
+
+#: ../tools/browser/data-manager/xml-spec-editor.c:259
+#: ../tools/browser/query-exec/query-console.c:315
+msgid "SQL code to execute:"
+msgstr "SQL-kode til kørsel:"
+
 #: ../tools/browser/query-exec/query-console.c:289
 #: ../tools/browser/query-exec/query-console.c:1083
 msgid "Query editor"
@@ -7754,6 +7947,7 @@ msgid "Invalid variable's contents"
 msgstr "Ugyldig variabels indhold"
 
 #: ../tools/browser/query-exec/query-console.c:774
+#: ../tools/browser/schema-browser/table-info.c:919
 msgid "assign values to the following variables"
 msgstr "tildel værdier til følgende variabler"
 
@@ -7771,12 +7965,14 @@ msgstr ""
 "Ã¥bnes en ny forbindelse."
 
 #: ../tools/browser/query-exec/query-console.c:873
+#: ../tools/browser/schema-browser/table-info.c:553
 #, c-format
 msgid "Error executing query: %s"
 msgstr "Fejl ved kørsel af forespørgsel: %s"
 
 #: ../tools/browser/query-exec/query-console.c:926
 #: ../tools/browser/query-exec/query-console.c:976
+#: ../tools/browser/schema-browser/table-info.c:526
 #, c-format
 msgid ""
 "Error executing query:\n"
@@ -7821,44 +8017,44 @@ msgstr "_Fortryd"
 msgid "Undo last change"
 msgstr "Fortryd sidste ændring"
 
-#: ../tools/browser/query-exec/query-editor.c:1185
+#: ../tools/browser/query-exec/query-editor.c:1186
 msgid "In the future:\n"
 msgstr "I fremtiden:\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1189
+#: ../tools/browser/query-exec/query-editor.c:1190
 msgid "Less than a minute ago:\n"
 msgstr "Mindre end en minut siden:\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1194
+#: ../tools/browser/query-exec/query-editor.c:1195
 #, c-format
 msgid "%lu minute ago:\n"
 msgid_plural "%lu minutes ago:\n"
 msgstr[0] "%lu minut siden:\n"
 msgstr[1] "%lu minutter siden:\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1201
+#: ../tools/browser/query-exec/query-editor.c:1202
 #, c-format
 msgid "%lu hour ago\n"
 msgid_plural "%lu hours ago\n"
 msgstr[0] "%lu time siden\n"
 msgstr[1] "%lu timer siden\n"
 
-#: ../tools/browser/query-exec/query-editor.c:1207
+#: ../tools/browser/query-exec/query-editor.c:1208
 #, c-format
 msgid "%lu day ago\n"
 msgid_plural "%lu days ago\n"
 msgstr[0] "%lu dag siden\n"
 msgstr[1] "%lu dage siden\n"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:314
+#: ../tools/browser/query-exec/query-exec-perspective.c:389
 msgid "_Query"
 msgstr "_Forespørgsel"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:315
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
 msgid "_New editor"
 msgstr "_Ny redigering"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:315
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
 msgid "Open a new query editor"
 msgstr "�bn en ny forespørgselsredigering"
 
@@ -7866,27 +8062,27 @@ msgstr "�bn en ny forespørgselsredigering"
 msgid "SQL Code"
 msgstr "SQL-kode"
 
-#: ../tools/browser/query-exec/query-result.c:206
+#: ../tools/browser/query-exec/query-result.c:207
 msgid "Statement:"
 msgstr "Udtryk:"
 
-#: ../tools/browser/query-exec/query-result.c:240
+#: ../tools/browser/query-exec/query-result.c:241
 msgid "Number of rows impacted"
 msgstr "Antal påvirkede rækker"
 
-#: ../tools/browser/query-exec/query-result.c:264
+#: ../tools/browser/query-exec/query-result.c:265
 msgid "Execution Parameters"
 msgstr "Kørselsparametre"
 
-#: ../tools/browser/query-exec/query-result.c:326
+#: ../tools/browser/query-exec/query-result.c:327
 msgid "No result selected"
 msgstr "Intet resultat valgt"
 
-#: ../tools/browser/query-exec/query-result.c:432
+#: ../tools/browser/query-exec/query-result.c:386
 msgid "Number of rows impacted:"
 msgstr "Antal påvirkede rækker:"
 
-#: ../tools/browser/query-exec/query-result.c:471
+#: ../tools/browser/query-exec/query-result.c:425
 msgid "Execution error:\n"
 msgstr "Kørselsfejl:\n"
 
@@ -7900,6 +8096,12 @@ msgstr "Tabel ikke fundet"
 msgid "Requested object is not a table or view"
 msgstr "Anmodet objekt er ikke en tabel eller visning"
 
+# Måske Autoforøgelse
+#: ../tools/browser/schema-browser/mgr-columns.c:390
+#, fuzzy
+msgid "Auto incremented"
+msgstr "Autoforøge"
+
 #: ../tools/browser/schema-browser/objects-index.c:170
 msgid "Tables' index"
 msgstr "Tabels indeks"
@@ -7921,10 +8123,6 @@ msgstr "Kunne ikke gemme diagram"
 msgid "Canvas's name"
 msgstr "Lærredsnavn"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:286
-msgid "Save"
-msgstr "Gem"
-
 #: ../tools/browser/schema-browser/relations-diagram.c:327
 #: ../tools/browser/schema-browser/relations-diagram.c:384
 #: ../tools/browser/schema-browser/relations-diagram.c:464
@@ -7932,11 +8130,6 @@ msgstr "Gem"
 msgid "Relations diagram"
 msgstr "Relationsdiagram"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:327
-#: ../tools/browser/schema-browser/relations-diagram.c:475
-msgid "Unsaved diagram"
-msgstr "Ugemt diagram"
-
 #: ../tools/browser/schema-browser/relations-diagram.c:374
 #, c-format
 msgid "Error parsing favorite's contents"
@@ -7954,18 +8147,15 @@ msgid "Missing table attribute in favorite's contents"
 msgstr "Manglende tabelattribut i favorits indhold"
 
 #: ../tools/browser/schema-browser/relations-diagram.c:519
-#: ../tools/browser/schema-browser/table-info.c:491
-#, fuzzy
+#: ../tools/browser/schema-browser/table-info.c:951
 msgid "_Contents"
-msgstr "Kommentarer"
+msgstr "_Indhold"
 
 #: ../tools/browser/schema-browser/relations-diagram.c:519
-#: ../tools/browser/schema-browser/table-info.c:491
-#, fuzzy
 msgid "View contents"
-msgstr "Feltkommentar"
+msgstr "Vis indhold"
 
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:384
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:416
 msgid "Could not load diagram"
 msgstr "Kunne ikke indlæse diagram"
 
@@ -7977,15 +8167,19 @@ msgstr "Fremmed nøgle på "
 msgid "Unique constraint"
 msgstr "Unik begrænsning"
 
-#: ../tools/browser/schema-browser/table-columns.c:396
+#: ../tools/browser/schema-browser/table-columns.c:337
+msgid "Tables referencing this one"
+msgstr "Tabeller der har reference til den her"
+
+#: ../tools/browser/schema-browser/table-columns.c:451
 msgid "Column Name"
 msgstr "Kolonnenavn"
 
-#: ../tools/browser/schema-browser/table-columns.c:445
+#: ../tools/browser/schema-browser/table-columns.c:506
 msgid "Constraints and integrity rules"
 msgstr "Begrænsninger og integritetsregler"
 
-#: ../tools/browser/schema-browser/table-info.c:342
+#: ../tools/browser/schema-browser/table-info.c:363
 msgid ""
 "Table not found. If you think this is an error,\n"
 "please refresh the meta data from the database\n"
@@ -7995,22 +8189,72 @@ msgstr ""
 "så opdater venligst metadataene fra databasen\n"
 "(menu Forbindelse/Hent metadata)."
 
-#: ../tools/browser/schema-browser/table-info.c:373
+#: ../tools/browser/schema-browser/table-info.c:394
 msgid "Relations"
 msgstr "Relationer"
 
-#: ../tools/browser/schema-browser/table-info.c:383
+#: ../tools/browser/schema-browser/table-info.c:404
 msgid "Preferences"
 msgstr "Referencer"
 
-#: ../tools/browser/schema-browser/table-info.c:489
-msgid "_Favorite"
-msgstr "_Favorit"
+#: ../tools/browser/schema-browser/table-info.c:532
+msgid "Data successfully inserted"
+msgstr "Data indsat"
+
+# måske er tilgængeligE bedre
+#: ../tools/browser/schema-browser/table-info.c:671
+msgid "Meta data not yet available"
+msgstr "Metadata er endnu ikke tilgængelig"
+
+#: ../tools/browser/schema-browser/table-info.c:688
+msgid "Can't find information about table"
+msgstr "Kan ikke finde information om tabel"
 
-#: ../tools/browser/schema-browser/table-info.c:489
+#: ../tools/browser/schema-browser/table-info.c:724
+#, c-format
+msgid ""
+"Internal error while building INSERT statement:\n"
+"%s"
+msgstr ""
+"Intern fejl under kompilering af INSERT-udtryk:\n"
+"%s"
+
+#: ../tools/browser/schema-browser/table-info.c:770
+#, fuzzy, c-format
+msgid "Default value: '%s'"
+msgstr "Standardværdi"
+
+#: ../tools/browser/schema-browser/table-info.c:780
+#, fuzzy
+msgid "Default value: auto incremented value"
+msgstr "Værdi for autoforøgelse"
+
+#: ../tools/browser/schema-browser/table-info.c:894
+#: ../tools/browser/schema-browser/table-info.c:918
+msgid "Values to insert into table"
+msgstr "Værdier der skal indsættes i tabel"
+
+#: ../tools/browser/schema-browser/table-info.c:949
+msgid "Add to _Favorites"
+msgstr "Tilføj til _favoritter"
+
+#: ../tools/browser/schema-browser/table-info.c:949
 msgid "Add table to favorites"
 msgstr "Tilføj tabel til favorit"
 
+#: ../tools/browser/schema-browser/table-info.c:951
+#, fuzzy
+msgid "View table's contents"
+msgstr "Vis indhold"
+
+#: ../tools/browser/schema-browser/table-info.c:953
+msgid "_Insert data"
+msgstr "_Indsæt data"
+
+#: ../tools/browser/schema-browser/table-info.c:953
+msgid "Insert data into table"
+msgstr "Indsæt data i tabel"
+
 #: ../tools/browser/schema-browser/table-preferences.c:267
 msgid "default"
 msgstr "standard"
@@ -8066,8 +8310,8 @@ msgstr "Historik er ikke understøttet"
 
 #: ../tools/command-exec.c:342 ../tools/command-exec.c:378
 #: ../tools/command-exec.c:421 ../tools/command-exec.c:463
-#: ../tools/command-exec.c:596 ../tools/gda-sql.c:2982 ../tools/gda-sql.c:4115
-#: ../tools/gda-sql.c:4205 ../tools/gda-sql.c:4430 ../tools/gda-sql.c:4531
+#: ../tools/command-exec.c:596 ../tools/gda-sql.c:2990 ../tools/gda-sql.c:4123
+#: ../tools/gda-sql.c:4213 ../tools/gda-sql.c:4438 ../tools/gda-sql.c:4539
 msgid "No current connection"
 msgstr "Ingen aktuel forbindelse"
 
@@ -8175,12 +8419,12 @@ msgstr "Kan ikke fortolke fil '%s', ignorerer den"
 msgid "GDA SQL console version "
 msgstr "GDA SQL-konsolversion "
 
-#: ../tools/gda-sql.c:237
+#: ../tools/gda-sql.c:238
 #, c-format
 msgid "Welcome to the GDA SQL console, version "
 msgstr "Velkommen til GDA SQL-konsol, version "
 
-#: ../tools/gda-sql.c:239
+#: ../tools/gda-sql.c:240
 #, c-format
 msgid ""
 "Type: .copyright to show usage and distribution terms\n"
@@ -8197,115 +8441,116 @@ msgstr ""
 "      eller enhver forspørgsel afsluttet med et semikolon\n"
 "\n"
 
-#: ../tools/gda-sql.c:263
+#: ../tools/gda-sql.c:264
 #, c-format
 msgid "Opening connection '%s' for: %s\n"
 msgstr "Ã?bner forbindelse '%s' for: %s\n"
 
-#: ../tools/gda-sql.c:267
+#: ../tools/gda-sql.c:268
 #, c-format
 msgid "Can't open connection %d: %s\n"
 msgstr "Kan ikke åbne forbindelse %d: %s\n"
 
-#: ../tools/gda-sql.c:279
+#: ../tools/gda-sql.c:280
 #, c-format
 msgid "Opening connection '%s' for: %s (GDA_SQL_CNC environment variable)\n"
 msgstr "�bner forbindelse '%s' for: %s (miljøvariabel GDA_SQL_CNC)\n"
 
-#: ../tools/gda-sql.c:284
+#: ../tools/gda-sql.c:285
 #, c-format
 msgid "Can't open connection defined by GDA_SQL_CNC: %s\n"
 msgstr "Kan ikke åbne forbindelse defineret af GDA_SQL_CNC: %s\n"
 
-#: ../tools/gda-sql.c:299
+#: ../tools/gda-sql.c:300
 #, c-format
 msgid "Can't run HTTP server on port %d\n"
 msgstr "Kan ikke køre HTTP-server på port %d\n"
 
-#: ../tools/gda-sql.c:766
+#: ../tools/gda-sql.c:767
 msgid "Connection closed"
 msgstr "Forbindelse lukket"
 
-#: ../tools/gda-sql.c:779
+#: ../tools/gda-sql.c:780
 msgid "Invalid unnamed command"
 msgstr "Ugyldig unavngivet kommando"
 
-#: ../tools/gda-sql.c:890
+#: ../tools/gda-sql.c:891
 msgid "Unknown internal command"
 msgstr "Ukendt intern kommando"
 
-#: ../tools/gda-sql.c:896
+#: ../tools/gda-sql.c:897
 msgid "Internal command not correctly defined"
 msgstr "Intern kommando er ikke korrekt defineret"
 
-#: ../tools/gda-sql.c:902
+#: ../tools/gda-sql.c:903
 msgid "Incomplete internal command"
 msgstr "Ufuldstændig intern kommando"
 
-#: ../tools/gda-sql.c:1012
+#: ../tools/gda-sql.c:1013
 #, c-format
 msgid "Could not interpret the '%s' parameter's value"
 msgstr "Kunne ikke tolke parameterværdien '%s'"
 
-#: ../tools/gda-sql.c:1029
+#: ../tools/gda-sql.c:1030
 #, c-format
 msgid "No internal parameter named '%s' required by query"
 msgstr "Ingen intern parameter navngivet '%s' krævet af forespørgsel"
 
-#: ../tools/gda-sql.c:1146
+#: ../tools/gda-sql.c:1147
 #, c-format
 msgid "Can't open file '%s' for writing: %s\n"
 msgstr "Kan ikke åbne fil '%s' til skrivning: %s\n"
 
-#: ../tools/gda-sql.c:1159
+#: ../tools/gda-sql.c:1160
 #, c-format
 msgid "Can't open pipe '%s': %s\n"
 msgstr "Kan ikke åbne datakanal '%s': %s\n"
 
-#: ../tools/gda-sql.c:1198
+#: ../tools/gda-sql.c:1199
 #, c-format
 msgid "Can't open file '%s' for reading: %s\n"
 msgstr "Kan ikke åbne fil '%s' til læsning: %s\n"
 
-#: ../tools/gda-sql.c:1265 ../tools/gda-sql.c:3222
+#: ../tools/gda-sql.c:1266 ../tools/gda-sql.c:3230
 #, c-format
 msgid "Connection name '%s' is invalid"
 msgstr "Forbindelsesnavn '%s' er ugyldigt"
 
-#: ../tools/gda-sql.c:1324
+#: ../tools/gda-sql.c:1332
 #, c-format
 msgid "\tUsername for '%s': "
 msgstr "\tBrugernavn for '%s': "
 
-#: ../tools/gda-sql.c:1331
+#: ../tools/gda-sql.c:1339
 #, c-format
 msgid "No username for '%s'"
 msgstr "Intet brugernavn for '%s'"
 
-#: ../tools/gda-sql.c:1346
+#: ../tools/gda-sql.c:1354
 #, c-format
 msgid "\tPassword for '%s': "
 msgstr "\tAdgangskode for '%s': "
 
-#: ../tools/gda-sql.c:1355
+#: ../tools/gda-sql.c:1363
 #, c-format
 msgid "No password for '%s'"
 msgstr "Ingen adgangskode for '%s'"
 
-#: ../tools/gda-sql.c:1428
+#: ../tools/gda-sql.c:1436
 #, c-format
 msgid ""
 "All the meta data associated to the '%s' connection will be stored in the '%"
 "s' file\n"
 msgstr ""
+"Alle metadata associeret med forbindelsen '%s' vil blive gemt i filen '%s'\n"
 
-#: ../tools/gda-sql.c:1456
+#: ../tools/gda-sql.c:1464
 #, c-format
 msgid "Error getting meta data in background: %s\n"
 msgstr "Fejl ved indhentning af metadata i baggrunden: %s\n"
 
 # dette kan tage
-#: ../tools/gda-sql.c:1464 ../tools/gda-sql.c:1601
+#: ../tools/gda-sql.c:1472 ../tools/gda-sql.c:1609
 #, c-format
 msgid ""
 "Getting database schema information for connection '%s', this may take some "
@@ -8314,49 +8559,49 @@ msgstr ""
 "Indhenter skemainformation til database for forbindelse '%s'. Det kan tage "
 "et stykke tid... "
 
-#: ../tools/gda-sql.c:1471 ../tools/gda-sql.c:1608 ../tools/gda-sql.c:3038
+#: ../tools/gda-sql.c:1479 ../tools/gda-sql.c:1616 ../tools/gda-sql.c:3046
 #, c-format
 msgid "error: %s\n"
 msgstr "fejl: %s\n"
 
-#: ../tools/gda-sql.c:1478 ../tools/gda-sql.c:1615 ../tools/gda-sql.c:3045
+#: ../tools/gda-sql.c:1486 ../tools/gda-sql.c:1623 ../tools/gda-sql.c:3053
 #, c-format
 msgid "Done.\n"
 msgstr "Færdig.\n"
 
-#: ../tools/gda-sql.c:1742
+#: ../tools/gda-sql.c:1750
 #, c-format
 msgid "(%d row)"
 msgid_plural "(%d rows)"
 msgstr[0] "(%d række)"
 msgstr[1] "(%d rækker)"
 
-#: ../tools/gda-sql.c:1844 ../tools/gda-sql.c:2862
+#: ../tools/gda-sql.c:1852 ../tools/gda-sql.c:2870
 msgid "Installed providers list"
 msgstr "Installeret leverandørliste"
 
-#: ../tools/gda-sql.c:1987 ../tools/gda-sql.c:2182 ../tools/gda-sql.c:2254
-#: ../tools/gda-sql.c:2266
+#: ../tools/gda-sql.c:1995 ../tools/gda-sql.c:2190 ../tools/gda-sql.c:2262
+#: ../tools/gda-sql.c:2274
 #, c-format
 msgid "%s [FILE]"
 msgstr "%s [FIL]"
 
-#: ../tools/gda-sql.c:1988
+#: ../tools/gda-sql.c:1996
 msgid "Show commands history, or save it to file"
 msgstr "Vis kommandohistorik, eller gem den til fil"
 
-#: ../tools/gda-sql.c:1998 ../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:2071
+#: ../tools/gda-sql.c:2006 ../tools/gda-sql.c:2018 ../tools/gda-sql.c:2030
+#: ../tools/gda-sql.c:2042 ../tools/gda-sql.c:2054 ../tools/gda-sql.c:2066
+#: ../tools/gda-sql.c:2079
 msgid "Information"
 msgstr "Information"
 
-#: ../tools/gda-sql.c:1999
+#: ../tools/gda-sql.c:2007
 #, c-format
 msgid "%s [META DATA TYPE]"
 msgstr "%s [METADATATYPE]"
 
-#: ../tools/gda-sql.c:2000
+#: ../tools/gda-sql.c:2008
 msgid ""
 "Force reading the database meta data (or part of the meta data, ex:\"tables"
 "\")"
@@ -8364,266 +8609,265 @@ msgstr ""
 "Fremtving læsning af databasemetadata (eller dele af metadataene, for "
 "eksempel \"tabeller\" (tables))"
 
-#: ../tools/gda-sql.c:2011
+#: ../tools/gda-sql.c:2019
 #, c-format
 msgid "%s [TABLE]"
 msgstr "%s [TABEL]"
 
-#: ../tools/gda-sql.c:2012
+#: ../tools/gda-sql.c:2020
 msgid "List all tables (or named table)"
 msgstr "Vis alle tabeller (eller navngivet tabel)"
 
-#: ../tools/gda-sql.c:2023
+#: ../tools/gda-sql.c:2031
 #, c-format
 msgid "%s [VIEW]"
 msgstr "%s [VISNING]"
 
-#: ../tools/gda-sql.c:2024
+#: ../tools/gda-sql.c:2032
 msgid "List all views (or named view)"
 msgstr "Vis alle visninger (eller navngivet visning)"
 
-#: ../tools/gda-sql.c:2035
+#: ../tools/gda-sql.c:2043
 #, c-format
 msgid "%s [SCHEMA]"
 msgstr "%s [SKEMA]"
 
-#: ../tools/gda-sql.c:2036
+#: ../tools/gda-sql.c:2044
 msgid "List all schemas (or named schema)"
 msgstr "Vis alle skemaer (eller navngivet skema)"
 
-#: ../tools/gda-sql.c:2047
+#: ../tools/gda-sql.c:2055
 #, c-format
 msgid "%s [OBJ_NAME|SCHEMA.*]"
 msgstr "%s [OBJ_NAVN|SKEMA.*]"
 
-#: ../tools/gda-sql.c:2048
+#: ../tools/gda-sql.c:2056
 msgid "Describe object or full list of objects"
 msgstr "Beskriv objekt eller fuldstændig liste over objekter"
 
-#: ../tools/gda-sql.c:2059
+#: ../tools/gda-sql.c:2067
 #, c-format
 msgid "%s [TABLE1 [TABLE2...]]"
 msgstr "%s [TABEL1 [TABEL2...]]"
 
-#: ../tools/gda-sql.c:2060
+#: ../tools/gda-sql.c:2068
 msgid "Create a graph of all or the listed tables"
 msgstr "Opret en graf over alle eller de viste tabeller"
 
-#: ../tools/gda-sql.c:2072
+#: ../tools/gda-sql.c:2080
 #, c-format
 msgid "%s [port [authentication token]]"
 msgstr "%s [port [godkendelsessymbol]]"
 
-#: ../tools/gda-sql.c:2073
+#: ../tools/gda-sql.c:2081
 msgid "Start/stop embedded HTTP server (on given port or on 12345 by default)"
 msgstr ""
 "Start/stop indlejret HTTP-server (på givet port eller på 12345 som standard)"
 
-#: ../tools/gda-sql.c:2086
-#, fuzzy, c-format
+#: ../tools/gda-sql.c:2094
+#, c-format
 msgid "%s [CNC_NAME [DSN|CONNECTION STRING]]"
-msgstr "%s DSN_NAVN DSN_DEFINITION [BESKRIVELSE]"
+msgstr "%s [CNC_NAVN [DSN|FORBINDELSESSTRENG]]"
 
-#: ../tools/gda-sql.c:2087
-#, fuzzy
+#: ../tools/gda-sql.c:2095
 msgid "Opens a new connection or lists opened connections"
-msgstr "Liste over åbnede forbindelser"
+msgstr "�bner en ny forbindelse eller viser åbnede forbindelser"
 
-#: ../tools/gda-sql.c:2098
+#: ../tools/gda-sql.c:2106
 #, c-format
 msgid "%s [CNC_NAME]"
 msgstr "%s [CNC_NAVN]"
 
-#: ../tools/gda-sql.c:2099
+#: ../tools/gda-sql.c:2107
 msgid "Close a connection"
 msgstr "Luk en forbindelse"
 
-#: ../tools/gda-sql.c:2110
+#: ../tools/gda-sql.c:2118
 #, c-format
 msgid "%s CNC_NAME CNC_NAME1 CNC_NAME2 [CNC_NAME ...]"
 msgstr "%s CNC_NAVN CNC_NAVN1 CNC_NAVN2 [CNC_NAVN ...]"
 
-#: ../tools/gda-sql.c:2111
+#: ../tools/gda-sql.c:2119
 msgid "Bind several connections together into the CNC_NAME virtual connection"
 msgstr "Forbind flere forbindelser sammen i den virtuelle forbindelse CNC_NAVN"
 
-#: ../tools/gda-sql.c:2121 ../tools/gda-sql.c:2133 ../tools/gda-sql.c:2145
-#: ../tools/gda-sql.c:2157
+#: ../tools/gda-sql.c:2129 ../tools/gda-sql.c:2141 ../tools/gda-sql.c:2153
+#: ../tools/gda-sql.c:2165
 msgid "DSN (data sources) management"
 msgstr "DSN-håndtering (datakilder)"
 
-#: ../tools/gda-sql.c:2122
+#: ../tools/gda-sql.c:2130
 #, c-format
 msgid "%s [DSN]"
 msgstr "%s [DSN]"
 
-#: ../tools/gda-sql.c:2123
+#: ../tools/gda-sql.c:2131
 msgid "List all DSN (or named DSN's attributes)"
 msgstr "Vis alle DSN (eller navngivne DSN's attributter)"
 
-#: ../tools/gda-sql.c:2134
+#: ../tools/gda-sql.c:2142
 #, c-format
 msgid "%s DSN_NAME DSN_DEFINITION [DESCRIPTION]"
 msgstr "%s DSN_NAVN DSN_DEFINITION [BESKRIVELSE]"
 
-#: ../tools/gda-sql.c:2135
+#: ../tools/gda-sql.c:2143
 msgid "Create (or modify) a DSN"
 msgstr "Opret (eller ændr) en DSN"
 
-#: ../tools/gda-sql.c:2146
+#: ../tools/gda-sql.c:2154
 #, c-format
 msgid "%s DSN_NAME [DSN_NAME...]"
 msgstr "%s DSN_NAVN [DSN_NAVN...]"
 
-#: ../tools/gda-sql.c:2147
+#: ../tools/gda-sql.c:2155
 msgid "Remove a DSN"
 msgstr "Fjern en DSN"
 
-#: ../tools/gda-sql.c:2158
+#: ../tools/gda-sql.c:2166
 #, c-format
 msgid "%s [PROVIDER]"
 msgstr "%s [LEVERANDÃ?R]"
 
-#: ../tools/gda-sql.c:2159
+#: ../tools/gda-sql.c:2167
 msgid "List all installed database providers (or named one's attributes)"
 msgstr ""
 "Vis liste over alle installerede databaseleverandører (eller navngivnes "
 "attributter)"
 
-#: ../tools/gda-sql.c:2169 ../tools/gda-sql.c:2181 ../tools/gda-sql.c:2193
-#: ../tools/gda-sql.c:2205
+#: ../tools/gda-sql.c:2177 ../tools/gda-sql.c:2189 ../tools/gda-sql.c:2201
+#: ../tools/gda-sql.c:2213
 msgid "Input/Output"
 msgstr "Inddata/uddata"
 
-#: ../tools/gda-sql.c:2170 ../tools/gda-sql.c:2302
+#: ../tools/gda-sql.c:2178 ../tools/gda-sql.c:2310
 #, c-format
 msgid "%s FILE"
 msgstr "%s FIL"
 
-#: ../tools/gda-sql.c:2171
+#: ../tools/gda-sql.c:2179
 msgid "Execute commands from file"
 msgstr "Kør kommandoer fra fil"
 
-#: ../tools/gda-sql.c:2183
+#: ../tools/gda-sql.c:2191
 msgid "Send output to a file or |pipe"
 msgstr "Send uddata til en fil eller |datakanal"
 
-#: ../tools/gda-sql.c:2194 ../tools/gda-sql.c:2206
+#: ../tools/gda-sql.c:2202 ../tools/gda-sql.c:2214
 #, c-format
 msgid "%s [TEXT]"
 msgstr "%s [TEKST]"
 
-#: ../tools/gda-sql.c:2195
+#: ../tools/gda-sql.c:2203
 msgid "Send output to stdout"
 msgstr "Send uddata til stdout"
 
-#: ../tools/gda-sql.c:2207
+#: ../tools/gda-sql.c:2215
 msgid "Send output to output stream"
 msgstr "Send uddata til uddatastrøm"
 
-#: ../tools/gda-sql.c:2219
+#: ../tools/gda-sql.c:2227
 msgid "Quit"
 msgstr "Afslut"
 
-#: ../tools/gda-sql.c:2230
+#: ../tools/gda-sql.c:2238
 #, c-format
 msgid "%s [DIR]"
 msgstr "%s [MAPPE]"
 
-#: ../tools/gda-sql.c:2231
+#: ../tools/gda-sql.c:2239
 msgid "Change the current working directory"
 msgstr "Ã?ndr den aktuelle arbejdsmappe"
 
-#: ../tools/gda-sql.c:2243
+#: ../tools/gda-sql.c:2251
 msgid "Show usage and distribution terms"
 msgstr "Vis brug og distributionsbetingelser"
 
-#: ../tools/gda-sql.c:2253 ../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:2410
-#: ../tools/gda-sql.c:2422
+#: ../tools/gda-sql.c:2261 ../tools/gda-sql.c:2273 ../tools/gda-sql.c:2285
+#: ../tools/gda-sql.c:2297 ../tools/gda-sql.c:2309 ../tools/gda-sql.c:2321
+#: ../tools/gda-sql.c:2333 ../tools/gda-sql.c:2345 ../tools/gda-sql.c:2357
+#: ../tools/gda-sql.c:2369 ../tools/gda-sql.c:2381 ../tools/gda-sql.c:2418
+#: ../tools/gda-sql.c:2430
 msgid "Query buffer"
 msgstr "Forespørgelseslager"
 
-#: ../tools/gda-sql.c:2255
+#: ../tools/gda-sql.c:2263
 msgid "Edit the query buffer (or file) with external editor"
 msgstr "Rediger forespørgelseslageret (eller fil) med ekstern redigering"
 
-#: ../tools/gda-sql.c:2267
+#: ../tools/gda-sql.c:2275
 msgid "Reset the query buffer (fill buffer with contents of file)"
 msgstr "Nulstil forespørgselslager (fyld lager med filindhold)"
 
-#: ../tools/gda-sql.c:2279
+#: ../tools/gda-sql.c:2287
 msgid "Show the contents of the query buffer"
 msgstr "Vis indholdet af forespørgelseslageret"
 
-#: ../tools/gda-sql.c:2290
+#: ../tools/gda-sql.c:2298
 #, c-format
 msgid "%s [QUERY_BUFFER_NAME]"
 msgstr "%s [FORESPÃ?RGSELMELLEMLAGERNAVN]"
 
-#: ../tools/gda-sql.c:2291
+#: ../tools/gda-sql.c:2299
 msgid "Execute contents of query buffer, or named query buffer"
 msgstr "Kør indhold af forespørgselslager, eller navngivet forespørgselslager"
 
-#: ../tools/gda-sql.c:2303
+#: ../tools/gda-sql.c:2311
 msgid "Write query buffer to file"
 msgstr "Skriv forespørgselslager til fil"
 
-#: ../tools/gda-sql.c:2314 ../tools/gda-sql.c:2326 ../tools/gda-sql.c:2338
+#: ../tools/gda-sql.c:2322 ../tools/gda-sql.c:2334 ../tools/gda-sql.c:2346
 #, c-format
 msgid "%s QUERY_BUFFER_NAME"
 msgstr "%s FORESPÃ?RGSELSMELLEMLAGERNAVN"
 
-#: ../tools/gda-sql.c:2315
+#: ../tools/gda-sql.c:2323
 msgid "Save query buffer to dictionary"
 msgstr "Gem forespørgelsesmellemlager til ordbog"
 
-#: ../tools/gda-sql.c:2327
+#: ../tools/gda-sql.c:2335
 msgid "Load query buffer from dictionary"
 msgstr "Indlæs forespørgselsmellemlager fra ordbog"
 
-#: ../tools/gda-sql.c:2339
+#: ../tools/gda-sql.c:2347
 msgid "Delete query buffer from dictionary"
 msgstr "Slet forespørgselsmellemlager fra ordbog"
 
-#: ../tools/gda-sql.c:2350
+#: ../tools/gda-sql.c:2358
 #, c-format
 msgid "%s"
 msgstr "%s"
 
-#: ../tools/gda-sql.c:2351
+#: ../tools/gda-sql.c:2359
 msgid "List all saved query buffers in dictionary"
 msgstr "Vis alle gemte forspørgselsmellemlagre i mappe"
 
-#: ../tools/gda-sql.c:2362
+#: ../tools/gda-sql.c:2370
 #, c-format
 msgid "%s [NAME [VALUE|_null_]]"
 msgstr "%s [NAVN [VÃ?RDI|_null_]]"
 
-#: ../tools/gda-sql.c:2363
+#: ../tools/gda-sql.c:2371
 msgid "Set or show internal parameter, or list all if no parameters"
 msgstr "Angiv eller vis interne parametre, eller vis alle hvis ingen parametre"
 
-#: ../tools/gda-sql.c:2374
+#: ../tools/gda-sql.c:2382
 #, c-format
 msgid "%s [NAME]"
 msgstr "%s [NAVN]"
 
-#: ../tools/gda-sql.c:2375
+#: ../tools/gda-sql.c:2383
 msgid "Unset (delete) internal named parameter (or all parameters)"
 msgstr "Fravælg (slet) internt navngivet parameter (eller alle parametre)"
 
-#: ../tools/gda-sql.c:2385
+#: ../tools/gda-sql.c:2393
 msgid "Formatting"
 msgstr "Formatering"
 
-#: ../tools/gda-sql.c:2387
+#: ../tools/gda-sql.c:2395
 msgid "Set output format"
 msgstr "Angiv uddataformat"
 
-#: ../tools/gda-sql.c:2411
+#: ../tools/gda-sql.c:2419
 #, c-format
 msgid "%s [NAME|TABLE COLUMN ROW_CONDITION] FILE"
 msgstr "%s [NAVN|TABEL KOLONNE RÃ?KKEBETINGELSE] FIL"
@@ -8638,16 +8882,16 @@ msgstr "%s [NAVN|TABEL KOLONNE RÃ?KKEBETINGELSE] FIL"
 # Eksempel:
 # FIL er en liste af filer.  Alt hvad programmet ser er de ting, man har
 # skrevet i stedet for navnet, så det skader ikke at navnet er oversat.
-#: ../tools/gda-sql.c:2412
+#: ../tools/gda-sql.c:2420
 msgid "Export internal parameter or table's value to the FILE file"
 msgstr "Eksporter intern parameter eller tabels værdi til filen FIL"
 
-#: ../tools/gda-sql.c:2423
+#: ../tools/gda-sql.c:2431
 #, c-format
 msgid "%s NAME [FILE|TABLE COLUMN ROW_CONDITION]"
 msgstr "%s NAVN [FIL|TABEL KOLONNE RÃ?KKEBETINGELSE]"
 
-#: ../tools/gda-sql.c:2424
+#: ../tools/gda-sql.c:2432
 msgid ""
 "Set internal parameter as the contents of the FILE file or from an existing "
 "table's value"
@@ -8655,188 +8899,188 @@ msgstr ""
 "Angiv intern parameter som indholdet af filen FIL eller fra en eksiterende "
 "tabels værdi"
 
-#: ../tools/gda-sql.c:2437
+#: ../tools/gda-sql.c:2445
 msgid "List all available commands"
 msgstr "Vis alle tilgængelige kommandoer"
 
-#: ../tools/gda-sql.c:2502
+#: ../tools/gda-sql.c:2510
 #, c-format
 msgid "Unknown output format: '%s', reset to default"
 msgstr "Ukendt uddataformat: '%s', nulstil til standard"
 
-#: ../tools/gda-sql.c:2647 ../tools/gda-sql.c:2822
+#: ../tools/gda-sql.c:2655 ../tools/gda-sql.c:2830
 msgid "Attribute"
 msgstr "Attribut"
 
-#: ../tools/gda-sql.c:2650
+#: ../tools/gda-sql.c:2658
 #, c-format
 msgid "DSN '%s' description"
 msgstr "DSN '%s' beskrivelse"
 
-#: ../tools/gda-sql.c:2678
+#: ../tools/gda-sql.c:2686
 #, c-format
 msgid "Could not find any DSN named '%s'"
 msgstr "Kunne ikke en DSN med navnet '%s'"
 
-#: ../tools/gda-sql.c:2689
+#: ../tools/gda-sql.c:2697
 msgid "DSN list"
 msgstr "DSN-liste"
 
-#: ../tools/gda-sql.c:2741 ../tools/gda-sql.c:4554
+#: ../tools/gda-sql.c:2749 ../tools/gda-sql.c:4562
 msgid "Missing arguments"
 msgstr "Manglende parametre"
 
-#: ../tools/gda-sql.c:2762
+#: ../tools/gda-sql.c:2770
 msgid "Missing provider name"
 msgstr "Manglende leverandørnavn"
 
-#: ../tools/gda-sql.c:2785
+#: ../tools/gda-sql.c:2793
 msgid "Missing DSN name"
 msgstr "Manglende DSN-navn"
 
-#: ../tools/gda-sql.c:2825
+#: ../tools/gda-sql.c:2833
 #, c-format
 msgid "Provider '%s' description"
 msgstr "Beskrivelse for leverandør '%s'"
 
-#: ../tools/gda-sql.c:2853
+#: ../tools/gda-sql.c:2861
 #, c-format
 msgid "Could not find any provider named '%s'"
 msgstr "Kunne ikke finde en leverandør med navnet '%s'"
 
-#: ../tools/gda-sql.c:2928 ../tools/gda-sql.c:3217
+#: ../tools/gda-sql.c:2936 ../tools/gda-sql.c:3225
 #, c-format
 msgid "A connection named '%s' already exists"
 msgstr "En forbindelse med navnet '%s' findes allerede"
 
-#: ../tools/gda-sql.c:3032
+#: ../tools/gda-sql.c:3040
 #, c-format
 msgid "Getting database schema information, this may take some time... "
 msgstr "Indhenter skemainformation for database. Det kan tage noget tid... "
 
-#: ../tools/gda-sql.c:3067
+#: ../tools/gda-sql.c:3075
 msgid "No opened connection"
 msgstr "Ingen åbnet forbindelse"
 
-#: ../tools/gda-sql.c:3078
+#: ../tools/gda-sql.c:3086
 msgid "DSN or connection string"
 msgstr "DSN eller forbindelsesstreng"
 
-#: ../tools/gda-sql.c:3169
+#: ../tools/gda-sql.c:3177
 msgid "No connection currently opened"
 msgstr "Ingen forbindelse er aktuelt åbnet"
 
-#: ../tools/gda-sql.c:3209
+#: ../tools/gda-sql.c:3217
 msgid "Missing required connection names"
 msgstr "Mangler påkrævede forbindelsesnavne"
 
 #. add existing connections to virtual connection
-#: ../tools/gda-sql.c:3246
+#: ../tools/gda-sql.c:3254
 msgid "Bound connections are as:"
 msgstr "Bundne forbindelser er som:"
 
-#: ../tools/gda-sql.c:3349
+#: ../tools/gda-sql.c:3357
 #, c-format
 msgid "Could not get home directory: %s"
 msgstr "Kunne ikke indhente hjemmemappe: %s"
 
-#: ../tools/gda-sql.c:3375
+#: ../tools/gda-sql.c:3383
 #, c-format
 msgid "Working directory is now: %s"
 msgstr "Arbejdsmappe er nu: %s"
 
-#: ../tools/gda-sql.c:3379
+#: ../tools/gda-sql.c:3387
 #, c-format
 msgid "Could not change working directory to '%s': %s"
 msgstr "Kunne ikke ændre arbejdsmappe til '%s': %s"
 
-#: ../tools/gda-sql.c:3406 ../tools/gda-sql.c:3509 ../tools/gda-sql.c:3552
-#: ../tools/gda-sql.c:3581 ../tools/gda-sql.c:3622 ../tools/gda-sql.c:3673
-#: ../tools/gda-sql.c:3726 ../tools/gda-sql.c:3817 ../tools/gda-sql.c:3889
+#: ../tools/gda-sql.c:3414 ../tools/gda-sql.c:3517 ../tools/gda-sql.c:3560
+#: ../tools/gda-sql.c:3589 ../tools/gda-sql.c:3630 ../tools/gda-sql.c:3681
+#: ../tools/gda-sql.c:3734 ../tools/gda-sql.c:3825 ../tools/gda-sql.c:3897
 msgid "No connection opened"
 msgstr "Ingen forbindelse åbnet"
 
-#: ../tools/gda-sql.c:3424
+#: ../tools/gda-sql.c:3432
 #, c-format
 msgid "Could not write to temporary file '%s': %s"
 msgstr "Kunne ikke skrive til midlertidig fil '%s': %s"
 
-#: ../tools/gda-sql.c:3460
+#: ../tools/gda-sql.c:3468
 #, c-format
 msgid "could not start editor '%s'"
 msgstr "kunne ikke starte redigering '%s'"
 
-#: ../tools/gda-sql.c:3465
+#: ../tools/gda-sql.c:3473
 #, c-format
 msgid "Could not start /bin/sh"
 msgstr "Kunne ikke starte /bin/sh"
 
-#: ../tools/gda-sql.c:3630
+#: ../tools/gda-sql.c:3638
 msgid "Missing FILE to write to"
 msgstr "Manglende FIL der skal skrives til"
 
-#: ../tools/gda-sql.c:3682 ../tools/gda-sql.c:3748 ../tools/gda-sql.c:3830
-#: ../tools/gda-sql.c:3902
+#: ../tools/gda-sql.c:3690 ../tools/gda-sql.c:3756 ../tools/gda-sql.c:3838
+#: ../tools/gda-sql.c:3910
 msgid "Can't initialize dictionary to store query buffers"
 msgstr "Kan ikke opstarte ordbog der skal gemme forespørgselslagre"
 
-#: ../tools/gda-sql.c:3701
+#: ../tools/gda-sql.c:3709
 msgid "Query buffer name"
 msgstr "Forespørg lagernavn"
 
-#: ../tools/gda-sql.c:3702
+#: ../tools/gda-sql.c:3710
 msgid "SQL"
 msgstr "SQL"
 
-#: ../tools/gda-sql.c:3739 ../tools/gda-sql.c:3868 ../tools/gda-sql.c:3929
+#: ../tools/gda-sql.c:3747 ../tools/gda-sql.c:3876 ../tools/gda-sql.c:3937
 msgid "Missing query buffer name"
 msgstr "Manglende forespørgelseslagernavn"
 
-#: ../tools/gda-sql.c:3796
+#: ../tools/gda-sql.c:3804
 msgid "Query buffer is empty"
 msgstr "Forespørgelseslager er tomt"
 
-#: ../tools/gda-sql.c:3863
+#: ../tools/gda-sql.c:3871
 #, c-format
 msgid "Could not find query buffer named '%s'"
 msgstr "Kunne ikke finde forespørgelseslager navngivet '%s'"
 
-#: ../tools/gda-sql.c:3993 ../tools/gda-sql.c:4243 ../tools/gda-sql.c:4321
+#: ../tools/gda-sql.c:4001 ../tools/gda-sql.c:4251 ../tools/gda-sql.c:4329
 #, c-format
 msgid "No parameter named '%s' defined"
 msgstr "Ingen parameter navngivet '%s' defineret"
 
-#: ../tools/gda-sql.c:4004
+#: ../tools/gda-sql.c:4012
 msgid "List of defined parameters"
 msgstr "Liste over definerede parametre"
 
-#: ../tools/gda-sql.c:4060 ../tools/gda-sql.c:4582
+#: ../tools/gda-sql.c:4068 ../tools/gda-sql.c:4590
 msgid "Wrong row condition"
 msgstr "Forkert rækkebetingelse"
 
-#: ../tools/gda-sql.c:4088
+#: ../tools/gda-sql.c:4096
 msgid "No unique row identified"
 msgstr "Ingen unik række identificeret"
 
-#: ../tools/gda-sql.c:4129 ../tools/gda-sql.c:4221 ../tools/gda-sql.c:4545
+#: ../tools/gda-sql.c:4137 ../tools/gda-sql.c:4229 ../tools/gda-sql.c:4553
 #, c-format
 msgid "Too many arguments"
 msgstr "For mange parametre"
 
-#: ../tools/gda-sql.c:4177 ../tools/gda-sql.c:4249
+#: ../tools/gda-sql.c:4185 ../tools/gda-sql.c:4257
 msgid "Wrong number of arguments"
 msgstr "Forkert antal parametre"
 
-#: ../tools/gda-sql.c:4261 ../tools/gda-sql.c:4275
+#: ../tools/gda-sql.c:4269 ../tools/gda-sql.c:4283
 msgid "Could not write file"
 msgstr "Kunne ikke skrive fil"
 
-#: ../tools/gda-sql.c:4400
+#: ../tools/gda-sql.c:4408
 #, c-format
 msgid "Graph written to '%s'\n"
 msgstr "Graf skrevet til '%s'\n"
 
-#: ../tools/gda-sql.c:4403
+#: ../tools/gda-sql.c:4411
 #, c-format
 msgid ""
 "Graph written to '%s'\n"
@@ -8851,23 +9095,23 @@ msgstr ""
 "Bemærk: Angiv miljøvariablerne GDA_SQL_VIEWER_PNG eller GDA_SQL_VIEWER_PDF "
 "for at vise grafen\n"
 
-#: ../tools/gda-sql.c:4474
+#: ../tools/gda-sql.c:4482
 msgid "HTTPD server stopped"
 msgstr "HTTPD-server stoppet"
 
-#: ../tools/gda-sql.c:4493
+#: ../tools/gda-sql.c:4501
 msgid "Could not start HTTPD server"
 msgstr "Kunne ikke starte HTTPD-server"
 
-#: ../tools/gda-sql.c:4497
+#: ../tools/gda-sql.c:4505
 msgid "HTTPD server started"
 msgstr "HTTPD-server startet"
 
-#: ../tools/gda-sql.c:4502
+#: ../tools/gda-sql.c:4510
 msgid "Invalid port specification"
 msgstr "Ugyldig portspecifikation"
 
-#: ../tools/gda-sql.c:4716
+#: ../tools/gda-sql.c:4724
 #, c-format
 msgid "Command is incomplete"
 msgstr "Kommando er ufuldstændig"
@@ -8991,6 +9235,12 @@ msgstr "Objekter"
 msgid "Triggers"
 msgstr "Udløsere"
 
+#~ msgid "Unsaved diagram"
+#~ msgstr "Ugemt diagram"
+
+#~ msgid "_Favorite"
+#~ msgstr "_Favorit"
+
 #~ msgid "%s [CNC_NAME [DSN [USER [PASSWORD]]]]"
 #~ msgstr "%s [CNC_NAVN [DSN [BRUGER [ADGANGSKODE]]]]"
 
diff --git a/po/de.po b/po/de.po
index bd97bb8..7627bcd 100644
--- a/po/de.po
+++ b/po/de.po
@@ -24,8 +24,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-07-28 15:47+0000\n"
-"PO-Revision-Date: 2010-07-28 22:09+0100\n"
+"POT-Creation-Date: 2010-08-04 17:53+0000\n"
+"PO-Revision-Date: 2010-08-06 22:38+0100\n"
 "Last-Translator: Mario Blättermann <mariobl gnome org>\n"
 "Language-Team: Deutsch <gnome-de gnome org>\n"
 "MIME-Version: 1.0\n"
@@ -118,8 +118,8 @@ msgstr "Browser-Programm konnte nicht ausgeführt werden"
 
 #. FIXME: add a notice somewhere in the UI
 #: ../control-center/dsn-properties-dialog.c:283
-#: ../libgda/gda-connection.c:1523 ../libgda/gda-data-model.c:2029
-#: ../libgda/gda-data-model.c:2037 ../libgda/gda-data-model-dir.c:382
+#: ../libgda/gda-connection.c:1523 ../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
@@ -157,20 +157,20 @@ msgstr "Browser-Programm konnte nicht ausgeführt werden"
 #: ../providers/mysql/gda-mysql-util.c:73
 #: ../providers/postgres/gda-postgres-provider.c:1706
 #: ../providers/postgres/gda-postgres-provider.c:1721
-#: ../providers/postgres/gda-postgres-util.c:87
-#: ../providers/postgres/gda-postgres-util.c:90
-#: ../tools/browser/auth-dialog.c:676 ../tools/browser/auth-dialog.c:679
-#: ../tools/browser/browser-connection.c:351
-#: ../tools/browser/browser-connection.c:411
-#: ../tools/browser/browser-connection.c:431
-#: ../tools/browser/browser-connection.c:615
-#: ../tools/browser/browser-connection.c:635
-#: ../tools/browser/browser-connection.c:843
-#: ../tools/browser/browser-window.c:805 ../tools/browser/browser-window.c:819
-#: ../tools/browser/browser-window.c:833 ../tools/browser/browser-window.c:945
-#: ../tools/browser/browser-window.c:986 ../tools/browser/login-dialog.c:239
+#: ../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:353
+#: ../tools/browser/browser-connection.c:419
+#: ../tools/browser/browser-connection.c:439
+#: ../tools/browser/browser-connection.c:623
+#: ../tools/browser/browser-connection.c:643
+#: ../tools/browser/browser-connection.c:851
+#: ../tools/browser/browser-window.c:842 ../tools/browser/browser-window.c:856
+#: ../tools/browser/browser-window.c:870 ../tools/browser/browser-window.c:986
+#: ../tools/browser/browser-window.c:1027 ../tools/browser/login-dialog.c:239
 #: ../tools/browser/main.c:96 ../tools/browser/main.c:110
-#: ../tools/browser/main.c:136
+#: ../tools/browser/main.c:136 ../tools/browser/data-manager/data-console.c:503
 #: ../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:629
@@ -402,7 +402,7 @@ msgstr ""
 "�ffnen der Verbindung bestätigen"
 
 #: ../control-center/main.c:57 ../libgda-ui/internal/utility.c:529
-#: ../tools/browser/support.c:137
+#: ../tools/browser/support.c:138
 msgid "Error:"
 msgstr "Fehler:"
 
@@ -414,7 +414,7 @@ msgstr "Neue Datenquelle konnte nicht deklariert werden"
 msgid "No valid data source info was created"
 msgstr "Information zur Datenquelle wurde nicht erzeugt"
 
-#: ../control-center/main.c:184 ../tools/browser/browser-window.c:1028
+#: ../control-center/main.c:184 ../tools/browser/browser-window.c:1069
 msgid "Database access services for the GNOME Desktop"
 msgstr "Dienste zum Datenbankzugriff für die GNOME-Arbeitsumgebung"
 
@@ -453,14 +453,15 @@ msgstr "Fehler beim �ffnen der Verbindung für DSN »%s«: %s"
 #: ../libgda/gda-config.c:542
 #, c-format
 msgid "Error creating user specific configuration directory '%s'"
-msgstr "Fehler beim Erstellen des benutzerdefinierten Konfigurationsordners »%s«"
+msgstr ""
+"Fehler beim Erstellen des benutzerdefinierten Konfigurationsordners »%s«"
 
 #: ../libgda/gda-config.c:591 ../libgda/gda-config.c:604
 #, c-format
 msgid "User specific configuration directory '%s' exists and is not a directory"
 msgstr ""
-"Ordner für die benutzerspezifische Konfiguration »%s« existiert, ist aber kein "
-"Ordner"
+"Ordner für die benutzerspezifische Konfiguration »%s« existiert, ist aber "
+"kein Ordner"
 
 #: ../libgda/gda-config.c:818
 #, c-format
@@ -658,8 +659,8 @@ msgstr "Datenquelle %s nicht in der Konfiguration gefunden"
 msgid "Datasource configuration error: no provider specified"
 msgstr "Konfigurationsfehler der Datenquelle: Kein Treiber angegeben"
 
-#: ../libgda/gda-connection.c:1118 ../tools/browser/auth-dialog.c:415
-#: ../tools/browser/auth-dialog.c:451 ../tools/gda-sql.c:1309
+#: ../libgda/gda-connection.c:1118 ../tools/browser/auth-dialog.c:417
+#: ../tools/browser/auth-dialog.c:453 ../tools/gda-sql.c:1309
 #, c-format
 msgid "Malformed connection string '%s'"
 msgstr "Ungültige Verbindungszeichenkette »%s«"
@@ -768,7 +769,7 @@ msgstr "Interner Fehler: Ungültiger Treiber-Handle"
 #: ../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:3475
+#: ../libgda/gda-data-model-iter.c:1018 ../libgda/gda-data-proxy.c:3494
 #: ../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
@@ -824,8 +825,8 @@ msgstr "Legt fest, ob das Datenmodell geändert werden kann"
 #: ../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:3424
-#: ../libgda/gda-data-proxy.c:3462 ../libgda/gda-data-select.c:1649
+#: ../libgda/gda-data-model-dsn-list.c:319 ../libgda/gda-data-proxy.c:3443
+#: ../libgda/gda-data-proxy.c:3481 ../libgda/gda-data-select.c:1649
 #: ../libgda/gda-data-select.c:1703
 #, c-format
 msgid "Row %d out of range (0-%d)"
@@ -834,8 +835,8 @@ msgstr "Zeile %d auÃ?erhalb des Bereichs (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:3427
-#: ../libgda/gda-data-proxy.c:3465 ../libgda/gda-data-select.c:1652
+#: ../libgda/gda-data-model-dsn-list.c:322 ../libgda/gda-data-proxy.c:3446
+#: ../libgda/gda-data-proxy.c:3484 ../libgda/gda-data-select.c:1652
 #: ../libgda/gda-data-select.c:1706
 #, c-format
 msgid "Row %d not found (empty data model)"
@@ -895,94 +896,94 @@ msgstr "GdaBinary-Wert wurde erwartet, %s wurde erhalten"
 msgid "Key modification is not supported"
 msgstr "�nderung von Schlüsseln wird nicht unterstützt"
 
-#: ../libgda/gda-data-model.c:618
+#: ../libgda/gda-data-model.c:620
 msgid "Data model does not support getting individual value"
 msgstr "Das Datenmodell unterstützt das Ermitteln individueller Werte nicht"
 
-#: ../libgda/gda-data-model.c:661 ../libgda/gda-data-model.c:671
+#: ../libgda/gda-data-model.c:663 ../libgda/gda-data-model.c:673
 #, c-format
 msgid "Data model returned value of invalid '%s' type"
 msgstr "Datenmodell gab einen des ungültigen Typs »%s« zurück"
 
-#: ../libgda/gda-data-model.c:668
+#: ../libgda/gda-data-model.c:670
 msgid "Data model returned invalid NULL value"
 msgstr "Datenmodell gab den ungültigen Wert NULL zurück"
 
-#: ../libgda/gda-data-model.c:728
+#: ../libgda/gda-data-model.c:730
 msgid "Data model does not support setting individual value"
 msgstr "Das Datenmodell unterstützt das Setzen individueller Werte nicht"
 
-#: ../libgda/gda-data-model.c:761
+#: ../libgda/gda-data-model.c:763
 msgid "Data model does not support setting values"
 msgstr "Das Datenmodell unterstützt das Setzen von Werten nicht"
 
-#: ../libgda/gda-data-model.c:824 ../libgda/gda-data-model.c:858
+#: ../libgda/gda-data-model.c:826 ../libgda/gda-data-model.c:860
 msgid "Data model does not support row append"
 msgstr "Das Datenmodell unterstützt das Anhängen von Zeilen nicht"
 
-#: ../libgda/gda-data-model.c:849
+#: ../libgda/gda-data-model.c:851
 msgid "Model does not allow row insertion"
 msgstr "Modell unterstützt das Einfügen von Zeilen nicht"
 
-#: ../libgda/gda-data-model.c:884
+#: ../libgda/gda-data-model.c:886
 msgid "Model does not allow row deletion"
 msgstr "Modell unterstützt das Entfernen von Zeilen nicht"
 
-#: ../libgda/gda-data-model.c:893
+#: ../libgda/gda-data-model.c:895
 msgid "Data model does not support row removal"
 msgstr "Das Datenmodell unterstützt das Entfernen von Zeilen nicht"
 
-#: ../libgda/gda-data-model.c:1036 ../libgda/gda-data-model.c:1077
-#: ../libgda/gda-data-model.c:1091
+#: ../libgda/gda-data-model.c:1038 ../libgda/gda-data-model.c:1079
+#: ../libgda/gda-data-model.c:1093
 #, c-format
 msgid "The '%s' parameter must hold a string value, ignored."
 msgstr ""
 "Der Parameter »%s« muss einen Zeichenketten-Wert enthalten,wird ignoriert."
 
-#: ../libgda/gda-data-model.c:1100 ../libgda/gda-data-model.c:1110
-#: ../libgda/gda-data-model.c:1120 ../libgda/gda-data-model.c:1158
-#: ../libgda/gda-data-model.c:1251
+#: ../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
 #, c-format
 msgid "The '%s' parameter must hold a boolean value, ignored."
 msgstr "Der Parameter »%s« muss einen booleschen Wert enthalten,wird ignoriert."
 
-#: ../libgda/gda-data-model.c:1259
+#: ../libgda/gda-data-model.c:1261
 #, c-format
 msgid "File '%s' already exists"
 msgstr "Datei »%s« existiert bereits"
 
-#: ../libgda/gda-data-model.c:1399
+#: ../libgda/gda-data-model.c:1401
 msgid "Exported Data"
 msgstr "Exportierte Daten"
 
-#: ../libgda/gda-data-model.c:1516
+#: ../libgda/gda-data-model.c:1518
 #, c-format
 msgid "Expected tag <gda_value> or <gda_array_value>, got <%s>, ignoring"
 msgstr ""
 "Erwarteter Tag <gda_value> oder <gda_array_value>, erhalten wurde <%s>, wird "
 "ignoriert"
 
-#: ../libgda/gda-data-model.c:1547
+#: ../libgda/gda-data-model.c:1549
 msgid "Cannot retrieve column data type (type is UNKNOWN or not specified)"
 msgstr ""
 "Datentyp der Spalte konnte nicht ermittelt werden (Typ ist UNKNOWN oder wurde "
 "nicht angegeben)"
 
-#: ../libgda/gda-data-model.c:1633
+#: ../libgda/gda-data-model.c:1635
 #, c-format
 msgid "Expected tag <gda_array_data>, got <%s>"
 msgstr "Erwarteter Tag <gda_array_data>, erhalten wurde <%s>"
 
-#: ../libgda/gda-data-model.c:1696
+#: ../libgda/gda-data-model.c:1698
 msgid "Could not get an iterator for source data model"
 msgstr "Es konnte kein Iterator für das Quelldatenmodell angefordert werden"
 
-#: ../libgda/gda-data-model.c:1713
+#: ../libgda/gda-data-model.c:1715
 #, c-format
 msgid "Inexistent column in source data model: %d"
 msgstr "Nicht vorhandene Spalte im Quelldatenmodell: %d"
 
-#: ../libgda/gda-data-model.c:1727
+#: ../libgda/gda-data-model.c:1729
 #, c-format
 msgid ""
 "Destination column %d can't be NULL but has no correspondence in the source "
@@ -991,7 +992,7 @@ msgstr ""
 "Zielspalte %d kann nicht NULL sein, hat aber keine Zuordnung im "
 "Quelldatenmodell"
 
-#: ../libgda/gda-data-model.c:1737
+#: ../libgda/gda-data-model.c:1739
 #, c-format
 msgid ""
 "Destination column %d has a gda type (%s) incompatible with source column %d "
@@ -1000,28 +1001,28 @@ msgstr ""
 "Zielspalte %d hat einen GDA-Typ (%s), der inkompatibel zum Typ der "
 "Quellspalte %d ist (%s)"
 
-#: ../libgda/gda-data-model.c:1834
+#: ../libgda/gda-data-model.c:1836
 #, c-format
 msgid "Can't transform '%s' from GDA type %s to GDA type %s"
 msgstr "»%s« kann nicht aus GDA-Typ %s in GDA-Typ %s umgewandelt werden"
 
-#: ../libgda/gda-data-model.c:2028
+#: ../libgda/gda-data-model.c:2030
 #, c-format
 msgid "Could not dump data model's attributes: %s"
 msgstr "Die Attribute des Datenmodells konnten nicht abgelegt werden: %s"
 
-#: ../libgda/gda-data-model.c:2036
+#: ../libgda/gda-data-model.c:2038
 #, c-format
 msgid "Could not dump data model's contents: %s"
 msgstr "Die Inhalte des Datenmodells konnten nicht abgelegt werden: %s"
 
-#: ../libgda/gda-data-model.c:2282
+#: ../libgda/gda-data-model.c:2286
 msgid "Data model does not support backward cursor move, not displaying data"
 msgstr ""
 "Das Datenmodell unterstützt keine Rückwärtsbewegung der Positionsmarke, Daten "
 "werden nicht angezeigt"
 
-#: ../libgda/gda-data-model.c:2401
+#: ../libgda/gda-data-model.c:2405
 #, c-format
 msgid "(%d row)\n"
 msgid_plural "(%d rows)\n"
@@ -1107,7 +1108,8 @@ msgstr "Liste der definierten Datenquellen"
 #: ../libgda/gda-data-model-import.c:447
 #, c-format
 msgid "The '%s' option must hold a string value, ignored."
-msgstr "Die Option »%s« muss einen Zeichenketten-Wert enthalten, wird ignoriert."
+msgstr ""
+"Die Option »%s« muss einen Zeichenketten-Wert enthalten, wird ignoriert."
 
 #: ../libgda/gda-data-model-import.c:463
 #, c-format
@@ -1230,7 +1232,7 @@ msgstr ""
 "GdaStatement kann nicht mit Datenmodellen umgehen, die Zufallszugriff nicht "
 "unterstützen"
 
-#: ../libgda/gda-data-proxy.c:1538 ../libgda/gda-data-proxy.c:3880
+#: ../libgda/gda-data-proxy.c:1538 ../libgda/gda-data-proxy.c:3899
 msgid ""
 "The first row is an empty row artificially prepended and cannot be removed"
 msgstr ""
@@ -1245,9 +1247,9 @@ msgid ""
 "signal. This is a bug of the %s's implementation (please report a bug)."
 msgstr ""
 "Proxy-Datenmodelle erstellen Berichte der Ã?nderungen nach Zugriff, aber geben "
-"nicht die zugehörigen Signale »row-inserted«, »row-updated« oder »row-removed« "
-"aus. Dies ist ein Fehler in der Implementation von %s. Bitte melden Sie "
-"diesen Fehler."
+"nicht die zugehörigen Signale »row-inserted«, »row-updated« oder »row-"
+"removed« aus. Dies ist ein Fehler in der Implementation von %s. Bitte melden "
+"Sie diesen Fehler."
 
 #: ../libgda/gda-data-proxy.c:2084
 #, c-format
@@ -1273,24 +1275,24 @@ msgstr "Fehler im Filterausdruck"
 msgid "Incorrect filter expression"
 msgstr "Ungültiger Filterausdruck"
 
-#: ../libgda/gda-data-proxy.c:3635
+#: ../libgda/gda-data-proxy.c:3654
 msgid ""
 "The first row is an empty row artificially prepended and cannot be altered"
 msgstr ""
 "Die erste Zeile ist eine absichtlich vorangestellte leere Zeile und kann "
 "nicht geändert werden"
 
-#: ../libgda/gda-data-proxy.c:3657
+#: ../libgda/gda-data-proxy.c:3676
 #, c-format
 msgid "Wrong value type: expected '%s' and got '%s'"
 msgstr "Falscher Werttyp: Erwarteter Typ war »%s«, erhalten wurde »%s«"
 
-#: ../libgda/gda-data-proxy.c:3743
+#: ../libgda/gda-data-proxy.c:3762
 #, c-format
 msgid "Trying to change read-only column: %d"
 msgstr "Versuch, eine nur lesbare Spalte zu ändern: %d"
 
-#: ../libgda/gda-data-proxy.c:3780
+#: ../libgda/gda-data-proxy.c:3799
 #, c-format
 msgid "Value type mismatch %s instead of %s"
 msgstr "Keine Ã?bereinstimmung der Werttypen (%s anstelle von %s)"
@@ -1632,7 +1634,8 @@ msgstr "Spalte »%s« existiert und hat unterschiedliche Charakteristiken"
 #: ../libgda/gda-meta-store.c:1584
 #, c-format
 msgid "Missing foreign key's referenced table name (for table '%s')"
-msgstr "Fehlender Name der Referenztabelle für Fremdschlüssel (für Tabelle »%s«)"
+msgstr ""
+"Fehlender Name der Referenztabelle für Fremdschlüssel (für Tabelle »%s«)"
 
 #: ../libgda/gda-meta-store.c:1637
 #, c-format
@@ -1830,8 +1833,8 @@ msgid ""
 "Meta data incoherence in foreign key constraint for table %s.%s.%s "
 "referencing table %s.%s.%s"
 msgstr ""
-"Zusammenhanglose Metadaten in Fremdschlüssel-Beschränkung für Tabelle %s.%s.%"
-"s in Bezug auf Tabelle %s.%s.%s"
+"Zusammenhanglose Metadaten in Fremdschlüssel-Beschränkung für Tabelle %s.%s."
+"%s in Bezug auf Tabelle %s.%s.%s"
 
 #: ../libgda/gda-meta-struct.c:2258
 msgid "Missing object name in GdaMetaDbObject structure"
@@ -1966,8 +1969,8 @@ msgid ""
 "implement the %s one, please report this bug to http://bugzilla.gnome.org/ "
 "for the \"libgda\" product."
 msgstr ""
-"GdaServerProvider-Objekt implementiert die virtuelle Methode %s, aber nicht %"
-"s, Fehlerbericht bitte an http://bugzilla.gnome.org/ für das Modul »libgda«"
+"GdaServerProvider-Objekt implementiert die virtuelle Methode %s, aber nicht "
+"%s, Fehlerbericht bitte an http://bugzilla.gnome.org/ für das Modul »libgda«"
 
 #. To translators: "Aggregate": the noun
 #: ../libgda/gda-server-provider-extra.c:312
@@ -2127,8 +2130,8 @@ msgstr "Weitere Attribute"
 #: ../providers/mysql/mysql_specs_drop_index.xml.in.h:1
 #: ../providers/postgres/postgres_specs_drop_index.xml.in.h:2
 #: ../providers/sqlite/sqlite_specs_drop_index.xml.in.h:3
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:158
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:164
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:166
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:172
 msgid "Index"
 msgstr "Index"
 
@@ -2265,13 +2268,15 @@ msgstr "Datenmodell des Schemas enthält eine falsche Spaltenanzahl"
 #, c-format
 msgid "Data model for schema has a wrong column title: '%s' instead of '%s'"
 msgstr ""
-"Datenmodell des Schemas hat einen falschen Spaltentitel: »%s« anstelle von »%s«"
+"Datenmodell des Schemas hat einen falschen Spaltentitel: »%s« anstelle von "
+"»%s«"
 
 #: ../libgda/gda-server-provider-extra.c:548
 #, c-format
 msgid "Data model for schema has a wrong column name: '%s' instead of '%s'"
 msgstr ""
-"Datenmodell des Schemas hat einen falschen Spaltennamen: »%s« anstelle von »%s«"
+"Datenmodell des Schemas hat einen falschen Spaltennamen: »%s« anstelle von "
+"»%s«"
 
 #: ../libgda/gda-server-provider-extra.c:555
 #, c-format
@@ -2456,7 +2461,7 @@ msgstr "Spaltenname konnte nicht erhalten werden werden"
 
 #: ../libgda/gda-tree-mgr-label.c:207
 #: ../tools/browser/canvas/browser-canvas-table.c:309
-#: ../tools/browser/data-manager/data-source.c:882
+#: ../tools/browser/data-manager/data-source.c:914
 msgid "No name"
 msgstr "Kein Name"
 
@@ -2702,8 +2707,8 @@ msgid ""
 "end)."
 msgstr ""
 "Das Format der Verbindungszeichenkette wurde geändert: Ersetzen Sie »URI« "
-"durch »DB_DIR« (Pfad zur Datenbankdatei) und »DB_NAME« (Datenbankdatei ohne »%s« "
-"am Ende)"
+"durch »DB_DIR« (Pfad zur Datenbankdatei) und »DB_NAME« (Datenbankdatei ohne "
+"»%s« am Ende)"
 
 #: ../libgda/sqlite/gda-sqlite-provider.c:632
 #: ../providers/mdb/gda-mdb-provider.c:288
@@ -3387,7 +3392,7 @@ msgstr "Unbekannt"
 #: ../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:807 ../libgda-ui/gdaui-basic-form.c:876
+#: ../libgda-ui/gdaui-basic-form.c:807 ../libgda-ui/gdaui-basic-form.c:875
 #: ../libgda-ui/gdaui-raw-grid.c:739 ../tools/gda-sql.c:2656
 #: ../tools/gda-sql.c:2831 ../tools/gda-sql.c:4011
 msgid "Value"
@@ -3452,8 +3457,8 @@ msgstr ""
 #: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:279
 #, c-format
 msgid ""
-"Data cell renderer asked to display values of different data types, at least %"
-"s and %s, which means the data model has some incoherencies"
+"Data cell renderer asked to display values of different data types, at least "
+"%s and %s, which means the data model has some incoherencies"
 msgstr ""
 "Das Element zur Dateneingabe fordert die Anzeige von Werten verschiedener "
 "Datentypen, zumindest %s und %s, was bedeutet, dass das Datenmodell unstimmig "
@@ -3471,7 +3476,7 @@ msgid "Invalid UTF-8 format!"
 msgstr "Ungültiges UTF-8-Format!"
 
 #. format tooltip
-#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1044
+#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1053
 msgid "Format is hh:mm:ss"
 msgstr "Format ist hh:mm:ss"
 
@@ -4067,20 +4072,20 @@ msgstr "WAHR, falls das vertikale Ausklappen des Formulars sinnvoll ist"
 msgid "The '%s' attribute should be a G_TYPE_STRING value"
 msgstr "Das Attribut »%s« sollte einen G_TYPE_STRING-Wert haben"
 
-#: ../libgda-ui/gdaui-basic-form.c:1687
+#: ../libgda-ui/gdaui-basic-form.c:1686
 msgid "Can't find data entry for GdaHolder"
 msgstr "Dateneintrag für GdaHolder konnte nicht gefunden werden"
 
-#: ../libgda-ui/gdaui-basic-form.c:1959
+#: ../libgda-ui/gdaui-basic-form.c:1958
 msgid "Values to be filled"
 msgstr "Werte müssen eingegeben werden"
 
-#: ../libgda-ui/gdaui-basic-form.c:2040 ../libgda-ui/gdaui-raw-grid.c:2446
+#: ../libgda-ui/gdaui-basic-form.c:2039 ../libgda-ui/gdaui-raw-grid.c:2446
 #, c-format
 msgid "'%s' document not parsed successfully"
 msgstr "Dokument »%s« konnte nicht erfolgreich eingelesen werden"
 
-#: ../libgda-ui/gdaui-basic-form.c:2050 ../libgda-ui/gdaui-raw-grid.c:2456
+#: ../libgda-ui/gdaui-basic-form.c:2049 ../libgda-ui/gdaui-raw-grid.c:2456
 #, c-format
 msgid ""
 "'%s' DTD not parsed successfully. XML data layout validation will not be "
@@ -4089,7 +4094,7 @@ msgstr ""
 "DTD »%s« konnte nicht erfolgreich eingelesen werden: �berprüfung des XML-"
 "Datenimports wird nicht ausgeführt (einige Fehler könnten auftreten)"
 
-#: ../libgda-ui/gdaui-basic-form.c:2181
+#: ../libgda-ui/gdaui-basic-form.c:2180
 msgid ""
 "size group was not taken into account using gdaui_basic_form_add_to_size_group"
 "()"
@@ -4132,19 +4137,19 @@ msgstr "Versuch, eine nur lesbare Zeile zu ändern"
 msgid "Filter failed:"
 msgstr "Filter gescheitert:"
 
-#: ../libgda-ui/gdaui-data-filter.c:213
+#: ../libgda-ui/gdaui-data-filter.c:216
 msgid "Filter"
 msgstr "Filter"
 
-#: ../libgda-ui/gdaui-data-filter.c:213
+#: ../libgda-ui/gdaui-data-filter.c:216
 msgid "any valid SQL expression"
 msgstr "jeder gültige SQL-Ausdruck"
 
-#: ../libgda-ui/gdaui-data-filter.c:229
+#: ../libgda-ui/gdaui-data-filter.c:232
 msgid "Set filter"
 msgstr "Filter setzen"
 
-#: ../libgda-ui/gdaui-data-filter.c:234
+#: ../libgda-ui/gdaui-data-filter.c:237
 msgid "Clear filter"
 msgstr "Filter leeren"
 
@@ -4156,8 +4161,9 @@ msgstr "Versuch der Neuinitialisierung einer bereits initialisierten Bibliothek"
 msgid "Could not open plugins directory, no plugin loaded."
 msgstr "Plugin-Ordner konnte nicht geöffnet werden, kein Plugin geladen."
 
-#: ../libgda-ui/gdaui-init.c:485 ../tools/browser/query-exec/query-result.c:256
-#: ../tools/web-server.c:2018
+#: ../libgda-ui/gdaui-init.c:485
+#: ../tools/browser/data-manager/xml-spec-editor.c:217
+#: ../tools/browser/query-exec/query-result.c:256 ../tools/web-server.c:2018
 #, c-format
 msgid "Error: %s"
 msgstr "Fehler: %s"
@@ -4960,8 +4966,8 @@ msgid ""
 "the end)."
 msgstr ""
 "Das Format der Verbindungszeichenkette wurde geändert: Ersetzen Sie FILENAME "
-"durch DB_DIR (der Pfad zur Datenbankdatei) und DB_NAME (Datenbankdatei ohne »%"
-"s« am Ende)"
+"durch DB_DIR (der Pfad zur Datenbankdatei) und DB_NAME (Datenbankdatei ohne "
+"»%s« am Ende)"
 
 #: ../providers/mdb/gda-mdb-provider.c:307
 #, c-format
@@ -6277,8 +6283,8 @@ msgid ""
 "connections the role can make (-1 or unset for unlimited)"
 msgstr ""
 "Wenn der Rolle eine Anmeldung erlaubt ist, so wird die Anzahl der "
-"gleichzeitig möglichen Verbindungen für die Rolle festgelegt (»-1« oder leeres "
-"Feld bedeutet unbegrenzt)"
+"gleichzeitig möglichen Verbindungen für die Rolle festgelegt (»-1« oder "
+"leeres Feld bedeutet unbegrenzt)"
 
 #.
 #. This file contains the CREATE ROLE operation's parameters, which is
@@ -6824,15 +6830,15 @@ msgstr "Als Original setzen"
 msgid "Set as default"
 msgstr "Als Vorgabe verwenden"
 
-#: ../tools/browser/auth-dialog.c:520
+#: ../tools/browser/auth-dialog.c:522
 msgid "For connection"
 msgstr "Für Verbindung"
 
-#: ../tools/browser/auth-dialog.c:521
+#: ../tools/browser/auth-dialog.c:523
 msgid "enter authentication information"
 msgstr "Legitimierungsinformationen eingeben"
 
-#: ../tools/browser/auth-dialog.c:677 ../tools/browser/login-dialog.c:238
+#: ../tools/browser/auth-dialog.c:679 ../tools/browser/login-dialog.c:238
 #, c-format
 msgid ""
 "Could not open connection:\n"
@@ -6846,49 +6852,49 @@ msgstr ""
 msgid "c%u"
 msgstr "c%u"
 
-#: ../tools/browser/browser-connection.c:348
-#: ../tools/browser/browser-connection.c:428
+#: ../tools/browser/browser-connection.c:350
+#: ../tools/browser/browser-connection.c:436
 msgid "Analysing database schema"
 msgstr "Datenbankschema wird analysiert"
 
-#: ../tools/browser/browser-connection.c:350
-#: ../tools/browser/browser-connection.c:410
-#: ../tools/browser/browser-connection.c:430
-#: ../tools/browser/browser-connection.c:842
+#: ../tools/browser/browser-connection.c:352
+#: ../tools/browser/browser-connection.c:418
+#: ../tools/browser/browser-connection.c:438
+#: ../tools/browser/browser-connection.c:850
 #, c-format
 msgid "Error while fetching meta data from the connection: %s"
 msgstr "Fehler beim Holen der Metadaten von der Verbindung: %s"
 
-#: ../tools/browser/browser-connection.c:408
-#: ../tools/browser/browser-connection.c:840
+#: ../tools/browser/browser-connection.c:416
+#: ../tools/browser/browser-connection.c:848
 msgid "Getting database schema information"
 msgstr "Informationen des Datenbankschemas werden ermittelt"
 
-#: ../tools/browser/browser-connection.c:614
-#: ../tools/browser/browser-connection.c:634
+#: ../tools/browser/browser-connection.c:622
+#: ../tools/browser/browser-connection.c:642
 #, c-format
 msgid "Error while analysing database schema: %s"
 msgstr "Fehler beim Analysieren des Datenbankschemas: %s"
 
-#: ../tools/browser/browser-connection.c:1096
-#: ../tools/browser/browser-connection.c:1146
+#: ../tools/browser/browser-connection.c:1104
+#: ../tools/browser/browser-connection.c:1154
 msgid "Executing a query"
 msgstr "Abfrage wird ausgeführt"
 
-#: ../tools/browser/browser-connection.c:1408
+#: ../tools/browser/browser-connection.c:1416
 #, c-format
 msgid "Connection not yet opened"
 msgstr "Verbindung noch nicht geöffnet"
 
-#: ../tools/browser/browser-connection.c:1414
+#: ../tools/browser/browser-connection.c:1422
 msgid "Can't initialize dictionary to store table preferences"
 msgstr ""
 "Beschreibung zum Speichern der Tabelleneinstellungen kann nicht initialisiert "
 "werden"
 
-#: ../tools/browser/browser-connection.c:1460
-#: ../tools/browser/browser-connection.c:1466
-#: ../tools/browser/browser-connection.c:1602
+#: ../tools/browser/browser-connection.c:1468
+#: ../tools/browser/browser-connection.c:1474
+#: ../tools/browser/browser-connection.c:1610
 #: ../tools/browser/browser-favorites.c:523
 #: ../tools/browser/browser-favorites.c:529
 #: ../tools/browser/browser-favorites.c:958
@@ -6896,7 +6902,7 @@ msgstr ""
 msgid "Can't initialize transaction to access favorites"
 msgstr "Vorgang zum Zugriff auf Favoriten konnte nicht initialisiert werden"
 
-#: ../tools/browser/browser-connection.c:1547
+#: ../tools/browser/browser-connection.c:1555
 #: ../tools/browser/browser-favorites.c:702
 #: ../tools/browser/browser-favorites.c:1016
 msgid "Can't commit transaction to access favorites"
@@ -6979,17 +6985,17 @@ msgid "Bookmarks"
 msgstr "Lesezeichen"
 
 #: ../tools/browser/browser-stock-icons.c:47
-#: ../tools/browser/browser-window.c:248
+#: ../tools/browser/browser-window.c:270
 msgid "Begin"
 msgstr "Start"
 
 #: ../tools/browser/browser-stock-icons.c:48
-#: ../tools/browser/browser-window.c:250
+#: ../tools/browser/browser-window.c:272
 msgid "Commit"
 msgstr "Einspielen"
 
 #: ../tools/browser/browser-stock-icons.c:49
-#: ../tools/browser/browser-window.c:252
+#: ../tools/browser/browser-window.c:274
 msgid "Rollback"
 msgstr "Zurücknehmen"
 
@@ -7005,19 +7011,19 @@ msgstr "Gekoppelte Verbindung wird verwendet"
 msgid "Virtual connection using this connection is busy"
 msgstr "Die virtuelle Verbindung, welche diese Verbindung verwendet, ist belegt"
 
-#: ../tools/browser/browser-window.c:223
+#: ../tools/browser/browser-window.c:244
 msgid "_Fullscreen"
 msgstr "_Vollbild"
 
-#: ../tools/browser/browser-window.c:223
+#: ../tools/browser/browser-window.c:244
 msgid "Use the whole screen"
 msgstr "Den gesamten Bildschirm verwenden"
 
-#: ../tools/browser/browser-window.c:229
+#: ../tools/browser/browser-window.c:250
 msgid "_Bind connection"
 msgstr "Verbindung _koppeln"
 
-#: ../tools/browser/browser-window.c:229
+#: ../tools/browser/browser-window.c:250
 msgid ""
 "Use connection to create\n"
 "a new binding connection to access data\n"
@@ -7028,75 +7034,75 @@ msgstr ""
 "auf mehrere Datenbanken gleichzeitig\n"
 "verwenden"
 
-#: ../tools/browser/browser-window.c:248
+#: ../tools/browser/browser-window.c:270
 msgid "Begin a new transaction"
 msgstr "Eine neue Transaktion starten"
 
-#: ../tools/browser/browser-window.c:250
+#: ../tools/browser/browser-window.c:272
 msgid "Commit current transaction"
 msgstr "Aktuelle Transaktion einspielen"
 
-#: ../tools/browser/browser-window.c:252
+#: ../tools/browser/browser-window.c:274
 msgid "Rollback current transaction"
 msgstr "Aktuelle Transaktion zurücknehmen"
 
-#: ../tools/browser/browser-window.c:340
+#: ../tools/browser/browser-window.c:364
 msgid "unnamed"
 msgstr "Unbenannt"
 
-#: ../tools/browser/browser-window.c:341
+#: ../tools/browser/browser-window.c:365
 #, c-format
 msgid "Connection: %s"
 msgstr "Verbindung: %s"
 
-#: ../tools/browser/browser-window.c:703 ../tools/browser/support.c:75
+#: ../tools/browser/browser-window.c:740 ../tools/browser/support.c:75
 #, c-format
 msgid "Do you want to close the '%s' connection?"
 msgstr "Wollen Sie die Verbindung »%s« schlie�en?"
 
-#: ../tools/browser/browser-window.c:745 ../tools/browser/browser-window.c:752
+#: ../tools/browser/browser-window.c:782 ../tools/browser/browser-window.c:789
 msgid "Do you want to quit the application?"
 msgstr "Wollen Sie diese Anwendung beenden?"
 
-#: ../tools/browser/browser-window.c:746
+#: ../tools/browser/browser-window.c:783
 msgid "all the connections will be closed."
 msgstr "Alle Verbindungen werden geschlossen."
 
-#: ../tools/browser/browser-window.c:753
+#: ../tools/browser/browser-window.c:790
 msgid "the connection will be closed."
 msgstr "Verbindung wird geschlossen."
 
-#: ../tools/browser/browser-window.c:804
+#: ../tools/browser/browser-window.c:841
 #, c-format
 msgid "Error starting transaction: %s"
 msgstr "Fehler beim Starten der Transaktion: %s"
 
-#: ../tools/browser/browser-window.c:818
+#: ../tools/browser/browser-window.c:855
 #, c-format
 msgid "Error committing transaction: %s"
 msgstr "Fehler beim Einspielen der Transaktion: %s"
 
-#: ../tools/browser/browser-window.c:832
+#: ../tools/browser/browser-window.c:869
 #, c-format
 msgid "Error rolling back transaction: %s"
 msgstr "Fehler beim Zurücknehmen der Transaktion: %s"
 
-#: ../tools/browser/browser-window.c:944
+#: ../tools/browser/browser-window.c:985
 #, c-format
 msgid "Error updating bound connection: %s"
 msgstr "Fehler beim Aktualisieren der gekoppelten Verbindung: %s"
 
-#: ../tools/browser/browser-window.c:985
+#: ../tools/browser/browser-window.c:1026
 #, c-format
 msgid "Could not open binding connection: %s"
 msgstr "Gekoppelte Verbindung konnte nicht geöffnet werden: %s"
 
-#: ../tools/browser/browser-window.c:1025
+#: ../tools/browser/browser-window.c:1066
 #: ../tools/browser/gda-browser-4.0.desktop.in.h:2
 msgid "Database browser"
 msgstr "Datenbankbrowser"
 
-#: ../tools/browser/browser-window.c:1279
+#: ../tools/browser/browser-window.c:1320
 #, c-format
 msgid ""
 "The current perspective has changed to the '%s' perspective, you can switch "
@@ -7245,7 +7251,7 @@ msgstr "DELETE SAVEPOINT-Anweisung"
 msgid "Unknown statement"
 msgstr "Unbekannte Anweisung"
 
-#: ../tools/browser/mgr-favorites.c:541
+#: ../tools/browser/mgr-favorites.c:547
 msgid ""
 "Getting\n"
 "favorites..."
@@ -7253,7 +7259,7 @@ msgstr ""
 "Favoriten\n"
 "werden geholt â?¦"
 
-#: ../tools/browser/mgr-favorites.c:553
+#: ../tools/browser/mgr-favorites.c:559
 msgid ""
 "No favorite:\n"
 "drag item to\n"
@@ -7263,15 +7269,15 @@ msgstr ""
 "Objekt zum\n"
 "Festlegen ziehen"
 
-#: ../tools/browser/support.c:208
+#: ../tools/browser/support.c:211
 msgid "Note:"
 msgstr "Achtung:"
 
-#: ../tools/browser/support.c:211
+#: ../tools/browser/support.c:214
 msgid "Don't show this message again"
 msgstr "Diese Meldung nicht wieder anzeigen"
 
-#: ../tools/browser/support.c:272
+#: ../tools/browser/support.c:275
 msgid ""
 "Unable to display help. Please make sure the documentation package is "
 "installed."
@@ -7279,11 +7285,11 @@ msgstr ""
 "Die Hilfe kann nicht angezeigt werden. Bitte stellen Sie sicher, dass das "
 "Dokumentationspaket installiert ist."
 
-#: ../tools/browser/support.c:298
+#: ../tools/browser/support.c:301
 msgid "Unable to open help file"
 msgstr "Die Hilfedatei kann nicht geöffnet werden"
 
-#: ../tools/browser/support.c:352
+#: ../tools/browser/support.c:355
 msgid "Close tab"
 msgstr "Reiter schlieÃ?en"
 
@@ -7539,27 +7545,29 @@ msgstr "Kein"
 msgid "Toggle between grid and form presentations"
 msgstr "Zwischen Raster- und Formulardarstellung umschalten"
 
-#: ../tools/browser/data-manager/data-console.c:205
+#: ../tools/browser/data-manager/data-console.c:265
 msgid "Data Manager"
 msgstr "Datenverwaltung"
 
-#: ../tools/browser/data-manager/data-console.c:223
+#: ../tools/browser/data-manager/data-console.c:265
+#: ../tools/browser/data-manager/data-console.c:459
+#: ../tools/browser/schema-browser/relations-diagram.c:327
+#: ../tools/browser/schema-browser/relations-diagram.c:475
+msgid "Unsaved"
+msgstr "Ungespeichert"
+
+#: ../tools/browser/data-manager/data-console.c:296
 #: ../tools/browser/query-exec/query-console.c:336
 msgid "Variables' values:"
 msgstr "Werte der Variablen:"
 
-#: ../tools/browser/data-manager/data-console.c:257
-#: ../tools/browser/query-exec/query-console.c:315
-msgid "SQL code to execute:"
-msgstr "Auszuführender SQL-Code:"
-
-#: ../tools/browser/data-manager/data-console.c:301
+#: ../tools/browser/data-manager/data-console.c:351
 #: ../tools/browser/query-exec/query-console.c:363
 #: ../tools/browser/query-exec/query-console.c:427
 msgid "Clear"
 msgstr "Leeren"
 
-#: ../tools/browser/data-manager/data-console.c:301
+#: ../tools/browser/data-manager/data-console.c:351
 #: ../tools/browser/query-exec/query-console.c:363
 msgid ""
 "Clear the editor's\n"
@@ -7568,21 +7576,21 @@ msgstr ""
 "Inhalt des\n"
 "Editors leeren"
 
-#: ../tools/browser/data-manager/data-console.c:306
+#: ../tools/browser/data-manager/data-console.c:356
 #: ../tools/browser/query-exec/query-console.c:368
 msgid "Variables"
 msgstr "Variablen"
 
-#: ../tools/browser/data-manager/data-console.c:306
+#: ../tools/browser/data-manager/data-console.c:356
 msgid "Show variables needed"
 msgstr "Benötigte Variablen anzeigen"
 
-#: ../tools/browser/data-manager/data-console.c:312
+#: ../tools/browser/data-manager/data-console.c:362
 #: ../tools/browser/query-exec/query-console.c:374
 msgid "Execute"
 msgstr "Ausführen"
 
-#: ../tools/browser/data-manager/data-console.c:312
+#: ../tools/browser/data-manager/data-console.c:362
 msgid ""
 "Execute specified\n"
 "data manager"
@@ -7590,11 +7598,11 @@ msgstr ""
 "Angegebene Daten-\n"
 "verwaltung ausführen"
 
-#: ../tools/browser/data-manager/data-console.c:318
+#: ../tools/browser/data-manager/data-console.c:368
 msgid "View XML"
 msgstr "XML-Ansicht"
 
-#: ../tools/browser/data-manager/data-console.c:318
+#: ../tools/browser/data-manager/data-console.c:368
 msgid ""
 "View specifications\n"
 "as XML (advanced)"
@@ -7602,37 +7610,58 @@ msgstr ""
 "Spezifikationen als\n"
 "XML zeigen (fortgeschritten)"
 
-#: ../tools/browser/data-manager/data-console.c:328 ../tools/html-doc.c:95
+#: ../tools/browser/data-manager/data-console.c:376 ../tools/html-doc.c:95
 msgid "Help"
 msgstr "Hilfe"
 
-#: ../tools/browser/data-manager/data-console.c:343
+#: ../tools/browser/data-manager/data-console.c:389
 msgid "BBB:"
 msgstr "BBB:"
 
-#: ../tools/browser/data-manager/data-console.c:434
+#: ../tools/browser/data-manager/data-console.c:447
+#, c-format
+msgid "'%s' data manager"
+msgstr "Datenverwaltung »%s«"
+
+#: ../tools/browser/data-manager/data-console.c:448
+#: ../tools/browser/data-manager/data-console.c:459
+#: ../tools/browser/data-manager/data-console.c:492
+#: ../tools/browser/data-manager/data-console.c:767
+msgid "Data manager"
+msgstr "Datenverwaltung"
+
+#: ../tools/browser/data-manager/data-console.c:502
+msgid "Could not save data manager"
+msgstr "Datenverwaltung konnte nicht gespeichert werden"
+
+#: ../tools/browser/data-manager/data-console.c:528
+msgid "Data manager's name"
+msgstr "Name der Datenverwaltung"
+
+#: ../tools/browser/data-manager/data-console.c:548
+#: ../tools/browser/schema-browser/relations-diagram.c:286
+msgid "Save"
+msgstr "Speichern"
+
+#: ../tools/browser/data-manager/data-console.c:646
 #, c-format
 msgid "No data source defined"
 msgstr "Keine Datenquelle definiert"
 
-#: ../tools/browser/data-manager/data-console.c:493
-#: ../tools/browser/data-manager/spec-editor.c:155
+#: ../tools/browser/data-manager/data-console.c:706
+#: ../tools/browser/data-manager/xml-spec-editor.c:161
 #, c-format
 msgid "Error parsing XML specifications"
 msgstr "Fehler beim Verarbeiten der XML-Spezifikation"
 
-#: ../tools/browser/data-manager/data-console.c:510
+#: ../tools/browser/data-manager/data-console.c:723
 msgid "_Toggle mode"
 msgstr "Modus umschal_ten"
 
-#: ../tools/browser/data-manager/data-console.c:510
+#: ../tools/browser/data-manager/data-console.c:723
 msgid "Switch between compose and execute modes"
 msgstr "Zwischen Erstellungs- und Ausführungsmodus umschalten"
 
-#: ../tools/browser/data-manager/data-console.c:554
-msgid "Data manager"
-msgstr "Datenverwaltung"
-
 #: ../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
@@ -7670,78 +7699,100 @@ msgstr "Favoriten"
 msgid "Unnamed data manager"
 msgstr "Unbenannte Datenverwaltung"
 
+#: ../tools/browser/data-manager/data-manager-perspective.c:388
+#: ../tools/browser/query-exec/query-exec-perspective.c:385
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:317
+msgid "_Show favorites"
+msgstr "Favoriten an_zeigen"
+
+#: ../tools/browser/data-manager/data-manager-perspective.c:388
+#: ../tools/browser/query-exec/query-exec-perspective.c:385
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:317
+msgid "Show or hide favorites"
+msgstr "Favoriten anzeigen oder verbergen"
+
 #. Translators: Do not translate "table" nor "query"
-#: ../tools/browser/data-manager/data-source.c:250
+#: ../tools/browser/data-manager/data-source.c:252
 #, c-format
 msgid "Node must be \"table\" or \"query\", and is \"%s\""
 msgstr "Knoten muss »table« oder »query« sein, ist aber »%s«"
 
-#: ../tools/browser/data-manager/data-source.c:279
+#: ../tools/browser/data-manager/data-source.c:284
 #, c-format
 msgid "Multiple statements detected, only the first will be used"
 msgstr "Mehrere Anweisungen gefunden, nur die erste wird verwendet"
 
-#: ../tools/browser/data-manager/data-source.c:351
+#: ../tools/browser/data-manager/data-source.c:368
 #: ../tools/browser/schema-browser/mgr-columns.c:274
 #, c-format
 msgid "Not ready"
 msgstr "Nicht bereit"
 
-#: ../tools/browser/data-manager/data-source.c:358
+#: ../tools/browser/data-manager/data-source.c:375
 #, c-format
 msgid "Malformed table name \"%s\""
 msgstr "Ungültiger Tabellenname »%s«"
 
-#: ../tools/browser/data-manager/data-source.c:375
+#: ../tools/browser/data-manager/data-source.c:392
 #, c-format
 msgid "Could not find the \"%s\" table"
 msgstr "Tabelle »%s« konnte nicht gefunden werden"
 
-#: ../tools/browser/data-manager/data-source.c:380
+#: ../tools/browser/data-manager/data-source.c:397
 #, c-format
 msgid "The \"%s\" object is not a table"
 msgstr "Das »%s«-Objekt ist keine Tabelle"
 
 #. Translators: Do not translate "name"
-#: ../tools/browser/data-manager/data-source.c:394
+#: ../tools/browser/data-manager/data-source.c:415
 #, c-format
 msgid "Missing attribute \"name\" for table"
 msgstr "Fehlendes Attribut namens »name« für Tabelle"
 
-#: ../tools/browser/data-manager/data-source.c:399
+#: ../tools/browser/data-manager/data-source.c:420
 #, c-format
 msgid "Contents of '%s'"
 msgstr "Inhalt von »%s«"
 
-#: ../tools/browser/data-manager/data-source.c:417
+#: ../tools/browser/data-manager/data-source.c:438
 #, c-format
 msgid "Could not build SELECT statement"
 msgstr "SELECT-Anweisung konnte nicht erzeugt werden"
 
-#: ../tools/browser/data-manager/data-source.c:494
+#: ../tools/browser/data-manager/data-source.c:519
 #, c-format
 msgid "Could not find any foreign key to \"%s\""
 msgstr "Fremdschlüssel für »%s« konnte nicht gefunden werden"
 
-#: ../tools/browser/data-manager/data-source.c:502
+#: ../tools/browser/data-manager/data-source.c:527
 #, c-format
 msgid "The fields involved in the foreign key to \"%s\" are not known"
 msgstr "Die betroffenen Felder im Fremdschlüssel für »%s« sind unbekannt"
 
-#: ../tools/browser/data-manager/data-source.c:616
+#: ../tools/browser/data-manager/data-source.c:648
 #, c-format
 msgid "Statement to execute is not a selection statement"
 msgstr "Auszuführende Anweisung ist keine Auswahl-Anweisung"
 
-#: ../tools/browser/data-manager/data-source.c:756
+#: ../tools/browser/data-manager/data-source.c:788
 #, c-format
 msgid "No SELECT statement to execute"
 msgstr "Keine auszuführende SELECT-Anweisung"
 
-#: ../tools/browser/data-manager/data-widget.c:349
+#: ../tools/browser/data-manager/data-widget.c:357
 msgid "Error: no detail"
 msgstr "Fehler: Kein Detail"
 
+#: ../tools/browser/data-manager/xml-spec-editor.c:175
+#, c-format
+msgid "Expecting <%s> root node"
+msgstr "Root-Knoten <%s> wurde erwartet"
+
+#: ../tools/browser/data-manager/xml-spec-editor.c:259
+#: ../tools/browser/query-exec/query-console.c:315
+msgid "SQL code to execute:"
+msgstr "Auszuführender SQL-Code:"
+
 #: ../tools/browser/query-exec/query-console.c:289
 #: ../tools/browser/query-exec/query-console.c:1083
 msgid "Query editor"
@@ -7915,15 +7966,15 @@ msgid_plural "%lu days ago\n"
 msgstr[0] "vor %lu Tag\n"
 msgstr[1] "vor %lu Tagen\n"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:314
+#: ../tools/browser/query-exec/query-exec-perspective.c:389
 msgid "_Query"
 msgstr "_Abfrage"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:315
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
 msgid "_New editor"
 msgstr "_Neuer Editor"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:315
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
 msgid "Open a new query editor"
 msgstr "Einen neuen Abfrageeditor öffnen"
 
@@ -7990,10 +8041,6 @@ msgstr "Diagramm konnte nicht gespeichert werden"
 msgid "Canvas's name"
 msgstr "Name des Arbeitsbereichs"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:286
-msgid "Save"
-msgstr "Speichern"
-
 #: ../tools/browser/schema-browser/relations-diagram.c:327
 #: ../tools/browser/schema-browser/relations-diagram.c:384
 #: ../tools/browser/schema-browser/relations-diagram.c:464
@@ -8001,11 +8048,6 @@ msgstr "Speichern"
 msgid "Relations diagram"
 msgstr "Beziehungsdiagramm"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:327
-#: ../tools/browser/schema-browser/relations-diagram.c:475
-msgid "Unsaved diagram"
-msgstr "Ungespeichertes Diagramm"
-
 #: ../tools/browser/schema-browser/relations-diagram.c:374
 #, c-format
 msgid "Error parsing favorite's contents"
@@ -8031,7 +8073,7 @@ msgstr "_Inhalt"
 msgid "View contents"
 msgstr "Inhalt anzeigen"
 
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:380
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:416
 msgid "Could not load diagram"
 msgstr "Diagramm konnte nicht geladen werden"
 
@@ -8413,8 +8455,8 @@ msgstr "Kein Passwort für »%s«"
 #: ../tools/gda-sql.c:1436
 #, 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 ""
 "Alle der Verbindung »%s« zugeordneten Metadaten werden in der Datei »%s« "
 "gespeichert\n"
@@ -9103,6 +9145,9 @@ msgstr "Objekte"
 msgid "Triggers"
 msgstr "Auslöser"
 
+#~ msgid "Unsaved diagram"
+#~ msgstr "Ungespeichertes Diagramm"
+
 #~ msgid "_Favorite"
 #~ msgstr "_Favorit"
 
@@ -9115,9 +9160,9 @@ msgstr "Auslöser"
 #~ "werden (DSN, siehe \\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"
@@ -9154,7 +9199,8 @@ msgstr "Auslöser"
 #~ " - <span foreground=\"#4e9a06\">»id«</span> zum Festlegen einer "
 #~ "spezifischen Kennung der Datenquelle. Diese wird verwendet, wenn "
 #~ "Datenquellen miteinander verknüpft werden;\n"
-#~ " - <span foreground=\"#4e9a06\">»title«</span> zum Festlegen eines Titels.\n"
+#~ " - <span foreground=\"#4e9a06\">»title«</span> zum Festlegen eines "
+#~ "Titels.\n"
 #~ "\n"
 #~ "Verwenden Sie die <span foreground=\"#4e9a06\"><tt>&lt;query&gt;</tt></"
 #~ "span>-Markierung, um eine SELECT-Anweisung für SQL anzugeben, als Inhalt "
@@ -9169,8 +9215,9 @@ msgstr "Auslöser"
 #~ "welches den Tabellennamen repräsentiert.\n"
 #~ " - kann einen <span foreground=\"#4e9a06\"><tt>&lt;depend&gt;</tt></span>-"
 #~ "Knoten enthalten, der eine Abhängigkeit zu einer anderen Datenquelle \n"
-#~ "   mit dem <span foreground=\"#4e9a06\">»foreign_key_table«</span>-Attribut "
-#~ "definiert, welche den Namen der Tabelle angibt, für die abhängige\n"
+#~ "   mit dem <span foreground=\"#4e9a06\">»foreign_key_table«</span>-"
+#~ "Attribut definiert, welche den Namen der Tabelle angibt, für die "
+#~ "abhängige\n"
 #~ "   Fremdschlüssel definiert werden. Das <span foreground=\"#4e9a06\">»id«</"
 #~ "span>-Attribute kann hierbei eine Datenquellenkennung angeben,\n"
 #~ "   falls sich diese von der zuerst angegebenen Tabelle unterscheidet.\n"
diff --git a/po/es.po b/po/es.po
index d5ba297..5bea374 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-07-31 09:13+0000\n"
-"PO-Revision-Date: 2010-07-31 11:25+0200\n"
+"POT-Creation-Date: 2010-08-04 17:53+0000\n"
+"PO-Revision-Date: 2010-08-05 10:30+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"
@@ -105,8 +105,8 @@ 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:1523 ../libgda/gda-data-model.c:2029
-#: ../libgda/gda-data-model.c:2037 ../libgda/gda-data-model-dir.c:382
+#: ../libgda/gda-connection.c:1523 ../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
@@ -144,20 +144,21 @@ msgstr "No se pudo ejecutar el programa del examinador"
 #: ../providers/mysql/gda-mysql-util.c:73
 #: ../providers/postgres/gda-postgres-provider.c:1706
 #: ../providers/postgres/gda-postgres-provider.c:1721
-#: ../providers/postgres/gda-postgres-util.c:87
-#: ../providers/postgres/gda-postgres-util.c:90
-#: ../tools/browser/auth-dialog.c:676 ../tools/browser/auth-dialog.c:679
-#: ../tools/browser/browser-connection.c:351
-#: ../tools/browser/browser-connection.c:411
-#: ../tools/browser/browser-connection.c:431
-#: ../tools/browser/browser-connection.c:615
-#: ../tools/browser/browser-connection.c:635
-#: ../tools/browser/browser-connection.c:843
-#: ../tools/browser/browser-window.c:805 ../tools/browser/browser-window.c:819
-#: ../tools/browser/browser-window.c:833 ../tools/browser/browser-window.c:945
-#: ../tools/browser/browser-window.c:986 ../tools/browser/login-dialog.c:239
+#: ../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:353
+#: ../tools/browser/browser-connection.c:419
+#: ../tools/browser/browser-connection.c:439
+#: ../tools/browser/browser-connection.c:623
+#: ../tools/browser/browser-connection.c:643
+#: ../tools/browser/browser-connection.c:851
+#: ../tools/browser/browser-window.c:842 ../tools/browser/browser-window.c:856
+#: ../tools/browser/browser-window.c:870 ../tools/browser/browser-window.c:986
+#: ../tools/browser/browser-window.c:1027 ../tools/browser/login-dialog.c:239
 #: ../tools/browser/main.c:96 ../tools/browser/main.c:110
 #: ../tools/browser/main.c:136
+#: ../tools/browser/data-manager/data-console.c:503
 #: ../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:629
@@ -389,7 +390,7 @@ msgstr ""
 "confirme la apertura de la conexión"
 
 #: ../control-center/main.c:57 ../libgda-ui/internal/utility.c:529
-#: ../tools/browser/support.c:137
+#: ../tools/browser/support.c:138
 msgid "Error:"
 msgstr "Error:"
 
@@ -401,7 +402,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:1028
+#: ../control-center/main.c:184 ../tools/browser/browser-window.c:1069
 msgid "Database access services for the GNOME Desktop"
 msgstr "Servicios de acceso a bases de datos para el Escritorio GNOME"
 
@@ -645,8 +646,8 @@ 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:1118 ../tools/browser/auth-dialog.c:415
-#: ../tools/browser/auth-dialog.c:451 ../tools/gda-sql.c:1309
+#: ../libgda/gda-connection.c:1118 ../tools/browser/auth-dialog.c:417
+#: ../tools/browser/auth-dialog.c:453 ../tools/gda-sql.c:1309
 #, c-format
 msgid "Malformed connection string '%s'"
 msgstr "Cadena de conexión «%s» mal formada"
@@ -754,7 +755,7 @@ msgstr "Error interno: manejo del proveedor no válido"
 #: ../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:3475
+#: ../libgda/gda-data-model-iter.c:1018 ../libgda/gda-data-proxy.c:3494
 #: ../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
@@ -811,8 +812,8 @@ 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:3424
-#: ../libgda/gda-data-proxy.c:3462 ../libgda/gda-data-select.c:1649
+#: ../libgda/gda-data-model-dsn-list.c:319 ../libgda/gda-data-proxy.c:3443
+#: ../libgda/gda-data-proxy.c:3481 ../libgda/gda-data-select.c:1649
 #: ../libgda/gda-data-select.c:1703
 #, c-format
 msgid "Row %d out of range (0-%d)"
@@ -821,8 +822,8 @@ 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:3427
-#: ../libgda/gda-data-proxy.c:3465 ../libgda/gda-data-select.c:1652
+#: ../libgda/gda-data-model-dsn-list.c:322 ../libgda/gda-data-proxy.c:3446
+#: ../libgda/gda-data-proxy.c:3484 ../libgda/gda-data-select.c:1652
 #: ../libgda/gda-data-select.c:1706
 #, c-format
 msgid "Row %d not found (empty data model)"
@@ -881,93 +882,93 @@ msgstr "Se esperaba un valor GdaBinary, se obtuvo %s"
 msgid "Key modification is not supported"
 msgstr "No se soporta la modificación de claves"
 
-#: ../libgda/gda-data-model.c:618
+#: ../libgda/gda-data-model.c:620
 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:661 ../libgda/gda-data-model.c:671
+#: ../libgda/gda-data-model.c:663 ../libgda/gda-data-model.c:673
 #, 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:668
+#: ../libgda/gda-data-model.c:670
 msgid "Data model returned invalid NULL value"
 msgstr "El modelo de datos devolvió un valor NULL no válido"
 
-#: ../libgda/gda-data-model.c:728
+#: ../libgda/gda-data-model.c:730
 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:761
+#: ../libgda/gda-data-model.c:763
 msgid "Data model does not support setting values"
 msgstr "El modelo de datos no soporta los valores configurados"
 
-#: ../libgda/gda-data-model.c:824 ../libgda/gda-data-model.c:858
+#: ../libgda/gda-data-model.c:826 ../libgda/gda-data-model.c:860
 msgid "Data model does not support row append"
 msgstr "El modelo de datos no soporta agregación de filas"
 
-#: ../libgda/gda-data-model.c:849
+#: ../libgda/gda-data-model.c:851
 msgid "Model does not allow row insertion"
 msgstr "El modelo no permite inserción de filas"
 
-#: ../libgda/gda-data-model.c:884
+#: ../libgda/gda-data-model.c:886
 msgid "Model does not allow row deletion"
 msgstr "El modelo no permite borrado de filas"
 
-#: ../libgda/gda-data-model.c:893
+#: ../libgda/gda-data-model.c:895
 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:1036 ../libgda/gda-data-model.c:1077
-#: ../libgda/gda-data-model.c:1091
+#: ../libgda/gda-data-model.c:1038 ../libgda/gda-data-model.c:1079
+#: ../libgda/gda-data-model.c:1093
 #, 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:1100 ../libgda/gda-data-model.c:1110
-#: ../libgda/gda-data-model.c:1120 ../libgda/gda-data-model.c:1158
-#: ../libgda/gda-data-model.c:1251
+#: ../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
 #, 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:1259
+#: ../libgda/gda-data-model.c:1261
 #, c-format
 msgid "File '%s' already exists"
 msgstr "El archivo «%s» ya existe"
 
-#: ../libgda/gda-data-model.c:1399
+#: ../libgda/gda-data-model.c:1401
 msgid "Exported Data"
 msgstr "Datos exportados"
 
-#: ../libgda/gda-data-model.c:1516
+#: ../libgda/gda-data-model.c:1518
 #, 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:1547
+#: ../libgda/gda-data-model.c:1549
 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:1633
+#: ../libgda/gda-data-model.c:1635
 #, 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:1696
+#: ../libgda/gda-data-model.c:1698
 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:1713
+#: ../libgda/gda-data-model.c:1715
 #, 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:1727
+#: ../libgda/gda-data-model.c:1729
 #, c-format
 msgid ""
 "Destination column %d can't be NULL but has no correspondence in the source "
@@ -976,7 +977,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:1737
+#: ../libgda/gda-data-model.c:1739
 #, c-format
 msgid ""
 "Destination column %d has a gda type (%s) incompatible with source column %d "
@@ -985,27 +986,27 @@ 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:1834
+#: ../libgda/gda-data-model.c:1836
 #, 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:2028
+#: ../libgda/gda-data-model.c:2030
 #, 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:2036
+#: ../libgda/gda-data-model.c:2038
 #, 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:2282
+#: ../libgda/gda-data-model.c:2286
 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:2401
+#: ../libgda/gda-data-model.c:2405
 #, c-format
 msgid "(%d row)\n"
 msgid_plural "(%d rows)\n"
@@ -1217,7 +1218,7 @@ 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:3880
+#: ../libgda/gda-data-proxy.c:1538 ../libgda/gda-data-proxy.c:3899
 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"
@@ -1258,22 +1259,22 @@ msgstr "Error en la expresión de filtrado"
 msgid "Incorrect filter expression"
 msgstr "Expresión de filtrado incorrecta"
 
-#: ../libgda/gda-data-proxy.c:3635
+#: ../libgda/gda-data-proxy.c:3654
 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:3657
+#: ../libgda/gda-data-proxy.c:3676
 #, 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:3743
+#: ../libgda/gda-data-proxy.c:3762
 #, 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:3780
+#: ../libgda/gda-data-proxy.c:3799
 #, c-format
 msgid "Value type mismatch %s instead of %s"
 msgstr "El tipo del valor no coincide %s en lugar de %s"
@@ -2126,8 +2127,8 @@ msgstr "Atributos adicionales"
 #: ../providers/mysql/mysql_specs_drop_index.xml.in.h:1
 #: ../providers/postgres/postgres_specs_drop_index.xml.in.h:2
 #: ../providers/sqlite/sqlite_specs_drop_index.xml.in.h:3
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:158
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:164
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:166
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:172
 msgid "Index"
 msgstr "Ã?ndice"
 
@@ -2455,7 +2456,7 @@ 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
-#: ../tools/browser/data-manager/data-source.c:882
+#: ../tools/browser/data-manager/data-source.c:914
 msgid "No name"
 msgstr "Sin nombre"
 
@@ -3477,7 +3478,7 @@ msgid "Invalid UTF-8 format!"
 msgstr "Formato UTF-8 no válido."
 
 #. format tooltip
-#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1044
+#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1053
 msgid "Format is hh:mm:ss"
 msgstr "El formato es hh:mm:ss"
 
@@ -4131,19 +4132,19 @@ msgstr "Intentando modificar una fila de sólo lectura"
 msgid "Filter failed:"
 msgstr "Falló el filtro:"
 
-#: ../libgda-ui/gdaui-data-filter.c:213
+#: ../libgda-ui/gdaui-data-filter.c:216
 msgid "Filter"
 msgstr "Filtro"
 
-#: ../libgda-ui/gdaui-data-filter.c:213
+#: ../libgda-ui/gdaui-data-filter.c:216
 msgid "any valid SQL expression"
 msgstr "cualquier expresión SQL válida"
 
-#: ../libgda-ui/gdaui-data-filter.c:229
+#: ../libgda-ui/gdaui-data-filter.c:232
 msgid "Set filter"
 msgstr "Activar filtro"
 
-#: ../libgda-ui/gdaui-data-filter.c:234
+#: ../libgda-ui/gdaui-data-filter.c:237
 msgid "Clear filter"
 msgstr "Limpiar filtro"
 
@@ -4158,6 +4159,7 @@ msgstr ""
 "cargado."
 
 #: ../libgda-ui/gdaui-init.c:485
+#: ../tools/browser/data-manager/xml-spec-editor.c:217
 #: ../tools/browser/query-exec/query-result.c:256 ../tools/web-server.c:2018
 #, c-format
 msgid "Error: %s"
@@ -6829,15 +6831,15 @@ msgstr "Establecer como original"
 msgid "Set as default"
 msgstr "Establecer como predeterminado"
 
-#: ../tools/browser/auth-dialog.c:520
+#: ../tools/browser/auth-dialog.c:522
 msgid "For connection"
 msgstr "Para la conexión"
 
-#: ../tools/browser/auth-dialog.c:521
+#: ../tools/browser/auth-dialog.c:523
 msgid "enter authentication information"
 msgstr "introducir información de autenticación"
 
-#: ../tools/browser/auth-dialog.c:677 ../tools/browser/login-dialog.c:238
+#: ../tools/browser/auth-dialog.c:679 ../tools/browser/login-dialog.c:238
 #, c-format
 msgid ""
 "Could not open connection:\n"
@@ -6851,49 +6853,49 @@ msgstr ""
 msgid "c%u"
 msgstr "c%u"
 
-#: ../tools/browser/browser-connection.c:348
-#: ../tools/browser/browser-connection.c:428
+#: ../tools/browser/browser-connection.c:350
+#: ../tools/browser/browser-connection.c:436
 msgid "Analysing database schema"
 msgstr "Analizando el esquema de la base de datos"
 
-#: ../tools/browser/browser-connection.c:350
-#: ../tools/browser/browser-connection.c:410
-#: ../tools/browser/browser-connection.c:430
-#: ../tools/browser/browser-connection.c:842
+#: ../tools/browser/browser-connection.c:352
+#: ../tools/browser/browser-connection.c:418
+#: ../tools/browser/browser-connection.c:438
+#: ../tools/browser/browser-connection.c:850
 #, 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:408
-#: ../tools/browser/browser-connection.c:840
+#: ../tools/browser/browser-connection.c:416
+#: ../tools/browser/browser-connection.c:848
 msgid "Getting database schema information"
 msgstr "Obteniendo la información de esquema de la base de datos"
 
-#: ../tools/browser/browser-connection.c:614
-#: ../tools/browser/browser-connection.c:634
+#: ../tools/browser/browser-connection.c:622
+#: ../tools/browser/browser-connection.c:642
 #, 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:1096
-#: ../tools/browser/browser-connection.c:1146
+#: ../tools/browser/browser-connection.c:1104
+#: ../tools/browser/browser-connection.c:1154
 msgid "Executing a query"
 msgstr "Ejecutando una consulta"
 
-#: ../tools/browser/browser-connection.c:1408
+#: ../tools/browser/browser-connection.c:1416
 #, c-format
 msgid "Connection not yet opened"
 msgstr "La conexión aún no está abierta"
 
-#: ../tools/browser/browser-connection.c:1414
+#: ../tools/browser/browser-connection.c:1422
 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:1460
-#: ../tools/browser/browser-connection.c:1466
-#: ../tools/browser/browser-connection.c:1602
+#: ../tools/browser/browser-connection.c:1468
+#: ../tools/browser/browser-connection.c:1474
+#: ../tools/browser/browser-connection.c:1610
 #: ../tools/browser/browser-favorites.c:523
 #: ../tools/browser/browser-favorites.c:529
 #: ../tools/browser/browser-favorites.c:958
@@ -6901,7 +6903,7 @@ msgstr ""
 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:1547
+#: ../tools/browser/browser-connection.c:1555
 #: ../tools/browser/browser-favorites.c:702
 #: ../tools/browser/browser-favorites.c:1016
 msgid "Can't commit transaction to access favorites"
@@ -6983,17 +6985,17 @@ msgid "Bookmarks"
 msgstr "Marcadores"
 
 #: ../tools/browser/browser-stock-icons.c:47
-#: ../tools/browser/browser-window.c:248
+#: ../tools/browser/browser-window.c:270
 msgid "Begin"
 msgstr "Inicio"
 
 #: ../tools/browser/browser-stock-icons.c:48
-#: ../tools/browser/browser-window.c:250
+#: ../tools/browser/browser-window.c:272
 msgid "Commit"
 msgstr "Efectuar"
 
 #: ../tools/browser/browser-stock-icons.c:49
-#: ../tools/browser/browser-window.c:252
+#: ../tools/browser/browser-window.c:274
 msgid "Rollback"
 msgstr "Deshacer"
 
@@ -7009,19 +7011,19 @@ msgstr "Se está usando una conexión vinculada"
 msgid "Virtual connection using this connection is busy"
 msgstr "La conexión virtual usando esta conexión está ocupada"
 
-#: ../tools/browser/browser-window.c:223
+#: ../tools/browser/browser-window.c:244
 msgid "_Fullscreen"
 msgstr "Pantalla _completa"
 
-#: ../tools/browser/browser-window.c:223
+#: ../tools/browser/browser-window.c:244
 msgid "Use the whole screen"
 msgstr "Usar la pantalla completa"
 
-#: ../tools/browser/browser-window.c:229
+#: ../tools/browser/browser-window.c:250
 msgid "_Bind connection"
 msgstr "_Vincular conexión"
 
-#: ../tools/browser/browser-window.c:229
+#: ../tools/browser/browser-window.c:250
 msgid ""
 "Use connection to create\n"
 "a new binding connection to access data\n"
@@ -7032,75 +7034,75 @@ msgstr ""
 "acceder a los datos desde varias\n"
 "bases de datos a la vez"
 
-#: ../tools/browser/browser-window.c:248
+#: ../tools/browser/browser-window.c:270
 msgid "Begin a new transaction"
 msgstr "Iniciar una transacción nueva"
 
-#: ../tools/browser/browser-window.c:250
+#: ../tools/browser/browser-window.c:272
 msgid "Commit current transaction"
 msgstr "Efectuar la transacción actual"
 
-#: ../tools/browser/browser-window.c:252
+#: ../tools/browser/browser-window.c:274
 msgid "Rollback current transaction"
 msgstr "Deshacer la transacción actual"
 
-#: ../tools/browser/browser-window.c:340
+#: ../tools/browser/browser-window.c:364
 msgid "unnamed"
 msgstr "sin nombre"
 
-#: ../tools/browser/browser-window.c:341
+#: ../tools/browser/browser-window.c:365
 #, c-format
 msgid "Connection: %s"
 msgstr "Conexión: %s"
 
-#: ../tools/browser/browser-window.c:703 ../tools/browser/support.c:75
+#: ../tools/browser/browser-window.c:740 ../tools/browser/support.c:75
 #, c-format
 msgid "Do you want to close the '%s' connection?"
 msgstr "¿Quiere cerrar la conexión «%s»?"
 
-#: ../tools/browser/browser-window.c:745 ../tools/browser/browser-window.c:752
+#: ../tools/browser/browser-window.c:782 ../tools/browser/browser-window.c:789
 msgid "Do you want to quit the application?"
 msgstr "¿Quiere salir de la aplicación?"
 
-#: ../tools/browser/browser-window.c:746
+#: ../tools/browser/browser-window.c:783
 msgid "all the connections will be closed."
 msgstr "se cerrarán todas las conexiones."
 
-#: ../tools/browser/browser-window.c:753
+#: ../tools/browser/browser-window.c:790
 msgid "the connection will be closed."
 msgstr "se cerrará la conexión."
 
-#: ../tools/browser/browser-window.c:804
+#: ../tools/browser/browser-window.c:841
 #, c-format
 msgid "Error starting transaction: %s"
 msgstr "Error al iniciar la transacción: %s"
 
-#: ../tools/browser/browser-window.c:818
+#: ../tools/browser/browser-window.c:855
 #, c-format
 msgid "Error committing transaction: %s"
 msgstr "Error al efectuar la transacción: %s"
 
-#: ../tools/browser/browser-window.c:832
+#: ../tools/browser/browser-window.c:869
 #, c-format
 msgid "Error rolling back transaction: %s"
 msgstr "Error al deshacer la transacción: %s"
 
-#: ../tools/browser/browser-window.c:944
+#: ../tools/browser/browser-window.c:985
 #, c-format
 msgid "Error updating bound connection: %s"
 msgstr "Error al actualizar la conexión vinculada: %s"
 
-#: ../tools/browser/browser-window.c:985
+#: ../tools/browser/browser-window.c:1026
 #, 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:1025
+#: ../tools/browser/browser-window.c:1066
 #: ../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:1279
+#: ../tools/browser/browser-window.c:1320
 #, c-format
 msgid ""
 "The current perspective has changed to the '%s' perspective, you can switch "
@@ -7247,7 +7249,7 @@ msgstr "Declaración DELETE SAVEPOINT"
 msgid "Unknown statement"
 msgstr "Declaración desconocida"
 
-#: ../tools/browser/mgr-favorites.c:541
+#: ../tools/browser/mgr-favorites.c:547
 msgid ""
 "Getting\n"
 "favorites..."
@@ -7255,7 +7257,7 @@ msgstr ""
 "Obteniendo\n"
 "favoritos..."
 
-#: ../tools/browser/mgr-favorites.c:553
+#: ../tools/browser/mgr-favorites.c:559
 msgid ""
 "No favorite:\n"
 "drag item to\n"
@@ -7265,15 +7267,15 @@ msgstr ""
 "arrastre un elemento\n"
 "para definir uno"
 
-#: ../tools/browser/support.c:208
+#: ../tools/browser/support.c:211
 msgid "Note:"
 msgstr "Nota:"
 
-#: ../tools/browser/support.c:211
+#: ../tools/browser/support.c:214
 msgid "Don't show this message again"
 msgstr "No mostrar este mensaje de nuevo"
 
-#: ../tools/browser/support.c:272
+#: ../tools/browser/support.c:275
 msgid ""
 "Unable to display help. Please make sure the documentation package is "
 "installed."
@@ -7281,11 +7283,11 @@ msgstr ""
 "No se pudo mostrar la ayuda. Asegúrese de que el paquete de documentación "
 "está instalado."
 
-#: ../tools/browser/support.c:298
+#: ../tools/browser/support.c:301
 msgid "Unable to open help file"
 msgstr "No se puede abrir el archivo de ayuda"
 
-#: ../tools/browser/support.c:352
+#: ../tools/browser/support.c:355
 msgid "Close tab"
 msgstr "Cerrar solapa"
 
@@ -7541,27 +7543,30 @@ msgstr "Ninguno"
 msgid "Toggle between grid and form presentations"
 msgstr "Conmutar entre las presentaciones de rejilla y formulario"
 
-#: ../tools/browser/data-manager/data-console.c:205
+#: ../tools/browser/data-manager/data-console.c:265
 msgid "Data Manager"
 msgstr "Gestor de datos"
 
-#: ../tools/browser/data-manager/data-console.c:223
+#: ../tools/browser/data-manager/data-console.c:265
+#: ../tools/browser/data-manager/data-console.c:459
+#: ../tools/browser/schema-browser/relations-diagram.c:327
+#: ../tools/browser/schema-browser/relations-diagram.c:475
+#| msgid "Unnamed"
+msgid "Unsaved"
+msgstr "Sin guardar"
+
+#: ../tools/browser/data-manager/data-console.c:296
 #: ../tools/browser/query-exec/query-console.c:336
 msgid "Variables' values:"
 msgstr "Valores de las variables:"
 
-#: ../tools/browser/data-manager/data-console.c:257
-#: ../tools/browser/query-exec/query-console.c:315
-msgid "SQL code to execute:"
-msgstr "Código SQL que ejecutar:"
-
-#: ../tools/browser/data-manager/data-console.c:301
+#: ../tools/browser/data-manager/data-console.c:351
 #: ../tools/browser/query-exec/query-console.c:363
 #: ../tools/browser/query-exec/query-console.c:427
 msgid "Clear"
 msgstr "Limpiar"
 
-#: ../tools/browser/data-manager/data-console.c:301
+#: ../tools/browser/data-manager/data-console.c:351
 #: ../tools/browser/query-exec/query-console.c:363
 msgid ""
 "Clear the editor's\n"
@@ -7570,21 +7575,21 @@ msgstr ""
 "Limpiar el contenido\n"
 "del editor"
 
-#: ../tools/browser/data-manager/data-console.c:306
+#: ../tools/browser/data-manager/data-console.c:356
 #: ../tools/browser/query-exec/query-console.c:368
 msgid "Variables"
 msgstr "Variables"
 
-#: ../tools/browser/data-manager/data-console.c:306
+#: ../tools/browser/data-manager/data-console.c:356
 msgid "Show variables needed"
 msgstr "Mostrar las variables necesarias"
 
-#: ../tools/browser/data-manager/data-console.c:312
+#: ../tools/browser/data-manager/data-console.c:362
 #: ../tools/browser/query-exec/query-console.c:374
 msgid "Execute"
 msgstr "Ejecutar"
 
-#: ../tools/browser/data-manager/data-console.c:312
+#: ../tools/browser/data-manager/data-console.c:362
 msgid ""
 "Execute specified\n"
 "data manager"
@@ -7592,11 +7597,11 @@ msgstr ""
 "Ejecutar el gestor\n"
 "de datos especificado"
 
-#: ../tools/browser/data-manager/data-console.c:318
+#: ../tools/browser/data-manager/data-console.c:368
 msgid "View XML"
 msgstr "Ver XML"
 
-#: ../tools/browser/data-manager/data-console.c:318
+#: ../tools/browser/data-manager/data-console.c:368
 msgid ""
 "View specifications\n"
 "as XML (advanced)"
@@ -7604,37 +7609,61 @@ msgstr ""
 "Ver las especificaciones\n"
 "como XML (avanzado)"
 
-#: ../tools/browser/data-manager/data-console.c:328 ../tools/html-doc.c:95
+#: ../tools/browser/data-manager/data-console.c:376 ../tools/html-doc.c:95
 msgid "Help"
 msgstr "Ayuda"
 
-#: ../tools/browser/data-manager/data-console.c:343
+#: ../tools/browser/data-manager/data-console.c:389
 msgid "BBB:"
 msgstr "BBB:"
 
-#: ../tools/browser/data-manager/data-console.c:434
+#: ../tools/browser/data-manager/data-console.c:447
+#, c-format
+#| msgid "Data manager"
+msgid "'%s' data manager"
+msgstr "Gestor de datos de «%s»"
+
+#: ../tools/browser/data-manager/data-console.c:448
+#: ../tools/browser/data-manager/data-console.c:459
+#: ../tools/browser/data-manager/data-console.c:492
+#: ../tools/browser/data-manager/data-console.c:767
+msgid "Data manager"
+msgstr "Gestor de datos"
+
+#: ../tools/browser/data-manager/data-console.c:502
+#| msgid "Could not save diagram"
+msgid "Could not save data manager"
+msgstr "No se pudo guardar el gestor de datos"
+
+#: ../tools/browser/data-manager/data-console.c:528
+#| msgid "Data manager"
+msgid "Data manager's name"
+msgstr "Nombre del gestor de datos"
+
+#: ../tools/browser/data-manager/data-console.c:548
+#: ../tools/browser/schema-browser/relations-diagram.c:286
+msgid "Save"
+msgstr "Guardar"
+
+#: ../tools/browser/data-manager/data-console.c:646
 #, c-format
 msgid "No data source defined"
 msgstr "No se definió un origen de datos"
 
-#: ../tools/browser/data-manager/data-console.c:493
-#: ../tools/browser/data-manager/spec-editor.c:155
+#: ../tools/browser/data-manager/data-console.c:706
+#: ../tools/browser/data-manager/xml-spec-editor.c:161
 #, c-format
 msgid "Error parsing XML specifications"
 msgstr "Error al analizar las especificaciones XML"
 
-#: ../tools/browser/data-manager/data-console.c:510
+#: ../tools/browser/data-manager/data-console.c:723
 msgid "_Toggle mode"
 msgstr "C_onmutar modo"
 
-#: ../tools/browser/data-manager/data-console.c:510
+#: ../tools/browser/data-manager/data-console.c:723
 msgid "Switch between compose and execute modes"
 msgstr "Cambiar entre los modos de composición y ejecución"
 
-#: ../tools/browser/data-manager/data-console.c:554
-msgid "Data manager"
-msgstr "Gestor de datos"
-
 #: ../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
@@ -7672,78 +7701,103 @@ msgstr "Favoritos"
 msgid "Unnamed data manager"
 msgstr "Gestor de datos sin nombre"
 
+#: ../tools/browser/data-manager/data-manager-perspective.c:388
+#: ../tools/browser/query-exec/query-exec-perspective.c:385
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:317
+#| msgid "Favorites"
+msgid "_Show favorites"
+msgstr "_Mostrar favoritos"
+
+#: ../tools/browser/data-manager/data-manager-perspective.c:388
+#: ../tools/browser/query-exec/query-exec-perspective.c:385
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:317
+#| msgid "Could not add favorite: %s"
+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:250
+#: ../tools/browser/data-manager/data-source.c:252
 #, 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:279
+#: ../tools/browser/data-manager/data-source.c:284
 #, 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.c:351
+#: ../tools/browser/data-manager/data-source.c:368
 #: ../tools/browser/schema-browser/mgr-columns.c:274
 #, c-format
 msgid "Not ready"
 msgstr "No está preparado"
 
-#: ../tools/browser/data-manager/data-source.c:358
+#: ../tools/browser/data-manager/data-source.c:375
 #, c-format
 msgid "Malformed table name \"%s\""
 msgstr "El nombre de la tabla «%s» está mal formado"
 
-#: ../tools/browser/data-manager/data-source.c:375
+#: ../tools/browser/data-manager/data-source.c:392
 #, c-format
 msgid "Could not find the \"%s\" table"
 msgstr "No se pudo encontrar la tabla «%s»"
 
-#: ../tools/browser/data-manager/data-source.c:380
+#: ../tools/browser/data-manager/data-source.c:397
 #, 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:394
+#: ../tools/browser/data-manager/data-source.c:415
 #, c-format
 msgid "Missing attribute \"name\" for table"
 msgstr "Falta el atributo «nombre» para la tabla"
 
-#: ../tools/browser/data-manager/data-source.c:399
+#: ../tools/browser/data-manager/data-source.c:420
 #, c-format
 msgid "Contents of '%s'"
 msgstr "Contenido de «%s»"
 
-#: ../tools/browser/data-manager/data-source.c:417
+#: ../tools/browser/data-manager/data-source.c:438
 #, c-format
 msgid "Could not build SELECT statement"
 msgstr "No se pudo construir la declaración SELECT"
 
-#: ../tools/browser/data-manager/data-source.c:494
+#: ../tools/browser/data-manager/data-source.c:519
 #, 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:502
+#: ../tools/browser/data-manager/data-source.c:527
 #, 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:616
+#: ../tools/browser/data-manager/data-source.c:648
 #, 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:756
+#: ../tools/browser/data-manager/data-source.c:788
 #, c-format
 msgid "No SELECT statement to execute"
 msgstr "Sin declaración SELECT para ejecutar"
 
-#: ../tools/browser/data-manager/data-widget.c:349
+#: ../tools/browser/data-manager/data-widget.c:357
 msgid "Error: no detail"
 msgstr "Error: sin detalles"
 
+#: ../tools/browser/data-manager/xml-spec-editor.c:175
+#, c-format
+#| msgid "Expected tag <%s>, got <%s>"
+msgid "Expecting <%s> root node"
+msgstr "Esperando el nodo raíz <%s>"
+
+#: ../tools/browser/data-manager/xml-spec-editor.c:259
+#: ../tools/browser/query-exec/query-console.c:315
+msgid "SQL code to execute:"
+msgstr "Código SQL que ejecutar:"
+
 #: ../tools/browser/query-exec/query-console.c:289
 #: ../tools/browser/query-exec/query-console.c:1083
 msgid "Query editor"
@@ -7917,15 +7971,15 @@ 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:314
+#: ../tools/browser/query-exec/query-exec-perspective.c:389
 msgid "_Query"
 msgstr "_Consultar"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:315
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
 msgid "_New editor"
 msgstr "Editor _nuevo"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:315
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
 msgid "Open a new query editor"
 msgstr "Abrir una consulta de edición nueva"
 
@@ -7968,7 +8022,6 @@ 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
-#| msgid "Auto increment"
 msgid "Auto incremented"
 msgstr "Autoincrementar"
 
@@ -7993,10 +8046,6 @@ msgstr "No se pudo guardar el diagrama"
 msgid "Canvas's name"
 msgstr "Nombre del marco"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:286
-msgid "Save"
-msgstr "Guardar"
-
 #: ../tools/browser/schema-browser/relations-diagram.c:327
 #: ../tools/browser/schema-browser/relations-diagram.c:384
 #: ../tools/browser/schema-browser/relations-diagram.c:464
@@ -8004,11 +8053,6 @@ msgstr "Guardar"
 msgid "Relations diagram"
 msgstr "Diagrama de relaciones"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:327
-#: ../tools/browser/schema-browser/relations-diagram.c:475
-msgid "Unsaved diagram"
-msgstr "Diagrama sin guardar"
-
 #: ../tools/browser/schema-browser/relations-diagram.c:374
 #, c-format
 msgid "Error parsing favorite's contents"
@@ -8034,7 +8078,7 @@ msgstr "Ã?nd_ice"
 msgid "View contents"
 msgstr "Ver contenido"
 
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:380
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:416
 msgid "Could not load diagram"
 msgstr "No se pudo cargar el diagrama"
 
@@ -8099,12 +8143,10 @@ msgstr ""
 
 #: ../tools/browser/schema-browser/table-info.c:770
 #, c-format
-#| msgid "Default value"
 msgid "Default value: '%s'"
 msgstr "Valor predeterminado: «%s»"
 
 #: ../tools/browser/schema-browser/table-info.c:780
-#| msgid "Auto increment value"
 msgid "Default value: auto incremented value"
 msgstr "Valor predeterminado: valor autoincrementado"
 
@@ -8122,7 +8164,6 @@ msgid "Add table to favorites"
 msgstr "Añadir tabla a los favoritos"
 
 #: ../tools/browser/schema-browser/table-info.c:951
-#| msgid "View contents"
 msgid "View table's contents"
 msgstr "Ver contenido de la tabla"
 
@@ -9111,6 +9152,9 @@ msgstr "Objetos"
 msgid "Triggers"
 msgstr "Disparadores"
 
+#~ msgid "Unsaved diagram"
+#~ msgstr "Diagrama sin guardar"
+
 #~ msgid "_Favorite"
 #~ msgstr "_Favoritos"
 
diff --git a/po/id.po b/po/id.po
new file mode 100644
index 0000000..03ec001
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,8802 @@
+# Indonesian translation for libgda.
+# Copyright (C) 2010 libgda's COPYRIGHT HOLDER
+# This file is distributed under the same license as the libgda package.
+# Andika Triwidada <andika gmail com>, 2010.
+#
+msgid ""
+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-08 19:35+0000\n"
+"PO-Revision-Date: 2010-09-09 21:38+0700\n"
+"Last-Translator: Andika Triwidada <andika gmail com>\n"
+"Language-Team: GNOME Indonesian Translation Team <gnome i15n org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. title
+#: ../control-center/dsn-config.c:125 ../control-center/main.c:425
+msgid "Data Sources"
+msgstr "Sumber Data"
+
+#: ../control-center/dsn-config.c:126
+msgid "Configured data sources in the system"
+msgstr "Sumber data yang telah tertata di sistem"
+
+#: ../control-center/dsn-config.c:184
+msgid ""
+"Data sources are the means by which database connections are identified: all "
+"the information needed to open a connection to a specific database using a "
+"'provider' is referenced using a unique name."
+msgstr ""
+"Sumber data adalah suatu cara mengidentifikasi koneksi basis data: semua "
+"informasi yang diperlukan untuk membuka suatu koneksi ke suatu basis data "
+"spesifik memakai suatu penyedia diacu memakai suatu nama yang unik."
+
+#: ../control-center/dsn-config.c:267
+#, c-format
+msgid "Are you sure you want to remove the data source '%s'?"
+msgstr "Anda yakin ingin menghapus sumber data '%s'?"
+
+#: ../control-center/dsn-config.c:271
+msgid "Data source removal confirmation"
+msgstr "Konfirmasi penghapusan sumber data"
+
+#. create the dialog
+#: ../control-center/dsn-properties-dialog.c:109
+#: ../control-center/dsn-properties-dialog.c:150
+#: ../control-center/dsn-properties-dialog.c:154
+msgid "Data Source Properties"
+msgstr "Properti Sumber Data"
+
+#: ../control-center/dsn-properties-dialog.c:111
+msgid "Test"
+msgstr "Tes"
+
+#: ../control-center/dsn-properties-dialog.c:112
+msgid "Browse"
+msgstr "Ramban"
+
+#: ../control-center/dsn-properties-dialog.c:151
+msgid "Change the data source properties (the name can't be modified)."
+msgstr "Ubah properti sumber data (nama tak bisa diubah)."
+
+#: ../control-center/dsn-properties-dialog.c:155
+msgid ""
+"For information only, this data source is a system wide data source\n"
+"and you don't have the permission change it."
+msgstr ""
+"Hanya untuk informasi, sumber data ini dikenal di seluruh sistem\n"
+"dan Anda tak memiliki hak untuk mengubahnya."
+
+#: ../control-center/dsn-properties-dialog.c:209
+#, c-format
+msgid "Login for %s"
+msgstr "Log masuk bagi %s"
+
+#: ../control-center/dsn-properties-dialog.c:231
+msgid "Connection successfully opened!"
+msgstr "Koneksi sukses dibuka!"
+
+#: ../control-center/dsn-properties-dialog.c:238
+msgid "Could not open connection"
+msgstr "Tak bisa membuka koneksi"
+
+#: ../control-center/dsn-properties-dialog.c:239
+#: ../control-center/gdaui-dsn-assistant.c:141
+#: ../libgda-ui/gdaui-raw-form.c:606
+msgid "Unknown error"
+msgstr "Galat tak dikenal"
+
+#: ../control-center/dsn-properties-dialog.c:282
+msgid "Could not execute browser program"
+msgstr "Tak bisa mengeksekusi program peramban"
+
+#. 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:553 ../libgda/gda-tree-mgr-select.c:188
+#: ../libgda/gda-tree-mgr-select.c:220
+#: ../libgda/sqlite/gda-sqlite-provider.c:2046
+#: ../libgda/sqlite/gda-sqlite-provider.c:2058
+#: ../libgda/sqlite/gda-sqlite-provider.c:2080
+#: ../libgda/sqlite/gda-sqlite-provider.c:2270
+#: ../libgda/sqlite/gda-sqlite-provider.c:2555
+#: ../libgda/sqlite/gda-sqlite-provider.c:2567
+#: ../libgda/thread-wrapper/gda-thread-provider.c:454
+#: ../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
+#: ../libgda-ui/data-entries/plugins/common-pict.c:222
+#: ../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
+#: ../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-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/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:345
+#: ../tools/browser/data-manager/data-widget.c:613
+#: ../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/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:1465 ../tools/gda-sql.c:1480 ../tools/gda-sql.c:1617
+#: ../tools/gda-sql.c:3049 ../tools/tools-input.c:129
+#: ../tools/web-server.c:2018
+msgid "No detail"
+msgstr "Tak ada rincian"
+
+#: ../control-center/gda-control-center-4.0.desktop.in.h:1
+msgid "Configure your database access environment"
+msgstr "Tata lingkungan akses basis data Anda"
+
+#: ../control-center/gda-control-center-4.0.desktop.in.h:2
+#: ../control-center/main.c:181 ../control-center/main.c:270
+msgid "Database access control center"
+msgstr "Pusat kendali akses basis data"
+
+#: ../control-center/gdaui-dsn-assistant.c:128
+msgid "Missing mandatory information, to create database"
+msgstr "Kekurangan informasi penting untuk membuat basis data"
+
+#: ../control-center/gdaui-dsn-assistant.c:140
+#, c-format
+msgid "Error creating database: %s"
+msgstr "Galat saat membuat basis data: %s"
+
+#: ../control-center/gdaui-dsn-assistant.c:408
+msgid "New data source definition"
+msgstr "Definisi sumber data baru"
+
+#: ../control-center/gdaui-dsn-assistant.c:431
+msgid ""
+"This assistant will guide you through the process of\n"
+"creating a new data source, and optionally will allow you to\n"
+"create a new database.\n"
+"\n"
+"Just follow the steps!"
+msgstr ""
+"Asisten ini akan memandu Anda melalui proses pembuatan\n"
+"suatu sumber data baru, dan mungkin juga mengijinkan Anda\n"
+"membuat suatu basis data baru.\n"
+"\n"
+"Ikuti saja langkahnya!"
+
+#: ../control-center/gdaui-dsn-assistant.c:437
+msgid "Add a new data source..."
+msgstr "Tambah sumber data baru..."
+
+#: ../control-center/gdaui-dsn-assistant.c:455
+msgid ""
+"The following fields represent the basic information items for your new data "
+"source. Mandatory fields are marked with a star.\n"
+"To create a local database in a file, select the 'SQLite' type of database.\n"
+msgstr ""
+"Ruas-ruas berikut merepresentasikan butir-butir informasi dasar bagi sumber "
+"data baru Anda. Ruas-ruas wajib ditandai dengan bintang.\n"
+"Untuk membuat suatu basis data lokal dalam suatu berkas, pilih jenis "
+"basisdata 'SQLite'.\n"
+
+#: ../control-center/gdaui-dsn-assistant.c:463
+msgid "Data source name"
+msgstr "Nama sumber data"
+
+#: ../control-center/gdaui-dsn-assistant.c:478
+msgid "System wide data source:"
+msgstr "Sumber data seluruh sistem:"
+
+#: ../control-center/gdaui-dsn-assistant.c:488
+msgid "Database type"
+msgstr "Jenis basis data"
+
+#: ../control-center/gdaui-dsn-assistant.c:500
+msgid "Description:"
+msgstr "Keterangan:"
+
+#: ../control-center/gdaui-dsn-assistant.c:512
+msgid "General Information"
+msgstr "Informasi Umum"
+
+#: ../control-center/gdaui-dsn-assistant.c:530
+msgid ""
+"This page lets you choose between using an existing database or to create a "
+"new database to use with this new data source\n"
+msgstr ""
+"Halaman ini memungkinkan Anda memilih antara memakai basis data yang telah "
+"ada atau membuat suatu basis data baru untuk dipakai dengan sumber data baru "
+"ini\n"
+
+#: ../control-center/gdaui-dsn-assistant.c:535
+msgid "Create a new database:"
+msgstr "Buat basis data baru:"
+
+#: ../control-center/gdaui-dsn-assistant.c:544
+msgid "Create a new database?"
+msgstr "Buat basis data baru?"
+
+#: ../control-center/gdaui-dsn-assistant.c:557
+msgid ""
+"The following fields represent the information needed to create a new "
+"database (mandatory fields are marked with a star).This information is "
+"database-specific, so check the manual for more information.\n"
+msgstr ""
+
+#: ../control-center/gdaui-dsn-assistant.c:581
+msgid "New database definition"
+msgstr "Definisi basis data baru"
+
+#: ../control-center/gdaui-dsn-assistant.c:594
+msgid ""
+"The following fields represent the information needed to open a connection "
+"(mandatory fields are marked with a star). This information is database-"
+"specific, so check the manual for more information.\n"
+msgstr ""
+
+#. connection's spec
+#: ../control-center/gdaui-dsn-assistant.c:607
+#: ../control-center/gdaui-dsn-editor.c:208
+msgid "Connection's parameters"
+msgstr ""
+
+#: ../control-center/gdaui-dsn-assistant.c:620
+msgid ""
+"The following fields represent the authentication information needed to open "
+"a connection."
+msgstr ""
+
+#: ../control-center/gdaui-dsn-assistant.c:631
+msgid "Authentication parameters"
+msgstr ""
+
+#: ../control-center/gdaui-dsn-assistant.c:644
+msgid ""
+"All information needed to create a new data source\n"
+"has been retrieved. Now, press 'Apply' to close\n"
+"this dialog."
+msgstr ""
+
+#: ../control-center/gdaui-dsn-assistant.c:653
+msgid "Ready to add a new data source"
+msgstr ""
+
+#: ../control-center/gdaui-dsn-editor.c:130
+#, fuzzy
+msgid "Data source _name:"
+msgstr "Nama sumber data"
+
+#: ../control-center/gdaui-dsn-editor.c:153
+msgid "_System wide data source:"
+msgstr ""
+
+#: ../control-center/gdaui-dsn-editor.c:165
+msgid "_Provider:"
+msgstr "_Penyedia:"
+
+#: ../control-center/gdaui-dsn-editor.c:182
+msgid "_Description:"
+msgstr "Ke_terangan:"
+
+#: ../control-center/gdaui-dsn-editor.c:199
+msgid ""
+"<span foreground='red'>The database provider used by this data source is not "
+"available,\n"
+"editing the data source's attributes is disabled</span>"
+msgstr ""
+
+#. connection's authentication
+#: ../control-center/gdaui-dsn-editor.c:223 ../libgda/gda-config.c:1337
+#: ../tools/browser/auth-dialog.c:281
+msgid "Authentication"
+msgstr "Otentikasi"
+
+#: ../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
+msgid "Connection opening"
+msgstr ""
+
+#: ../control-center/gdaui-login-dialog.c:80
+msgid ""
+"Fill in the following authentication elements\n"
+"to open a connection"
+msgstr ""
+
+#: ../control-center/gdaui-login-dialog.c:88
+msgid ""
+"No authentication required,\n"
+"confirm connection opening"
+msgstr ""
+
+#: ../control-center/main.c:57 ../libgda-ui/internal/utility.c:529
+#: ../tools/browser/support.c:152
+msgid "Error:"
+msgstr "Galat:"
+
+#: ../control-center/main.c:83
+msgid "Could not declare new data source"
+msgstr ""
+
+#: ../control-center/main.c:86
+msgid "No valid data source info was created"
+msgstr ""
+
+#: ../control-center/main.c:184 ../tools/browser/browser-window.c:1228
+msgid "Database access services for the GNOME Desktop"
+msgstr ""
+
+#. title
+#: ../control-center/main.c:435 ../control-center/provider-config.c:69
+msgid "Providers"
+msgstr "Penyedia"
+
+#: ../control-center/provider-config.c:70
+msgid "Installed providers"
+msgstr ""
+
+#: ../control-center/provider-config.c:117
+msgid ""
+"Providers are addons that actually implement the access to each database "
+"using the means provided by each database vendor."
+msgstr ""
+
+#: ../libgda/gda-batch.c:316
+msgid "Statement could not be found in batch's statements"
+msgstr ""
+
+#: ../libgda/gda-batch.c:441
+#, c-format
+msgid "Conflicting parameter '%s'"
+msgstr ""
+
+#: ../libgda/gda-config.c:264 ../libgda/gda-config.c:382
+#, c-format
+msgid "Error loading authentification information for '%s' DSN: %s"
+msgstr ""
+
+#: ../libgda/gda-config.c:542
+#, c-format
+msgid "Error creating user specific configuration directory '%s'"
+msgstr ""
+
+#: ../libgda/gda-config.c:591 ../libgda/gda-config.c:604
+#, c-format
+msgid ""
+"User specific configuration directory '%s' exists and is not a directory"
+msgstr ""
+
+#: ../libgda/gda-config.c:818
+#, c-format
+msgid "Malformed data source name '%s'"
+msgstr ""
+
+#: ../libgda/gda-config.c:842
+#, c-format
+msgid "Couldn't save authentification information for DSN '%s': %s"
+msgstr ""
+
+#: ../libgda/gda-config.c:874 ../libgda/gda-config.c:1002
+msgid "Can't manage system-wide configuration"
+msgstr ""
+
+#: ../libgda/gda-config.c:929
+#, c-format
+msgid "Authentification for the '%s' DSN"
+msgstr ""
+
+#: ../libgda/gda-config.c:964
+#, c-format
+msgid "Couldn't delete authentication information for DSN '%s': %s"
+msgstr ""
+
+#: ../libgda/gda-config.c:996 ../libgda-ui/gdaui-login.c:632
+#, c-format
+msgid "Unknown DSN '%s'"
+msgstr "DSN tak dikenal '%s'"
+
+#: ../libgda/gda-config.c:1067
+#, c-format
+msgid "Provider '%s' not found"
+msgstr "Penyedia '%s' tak ditemukan"
+
+#: ../libgda/gda-config.c:1252 ../libgda/gda-connection.c:1016
+#: ../libgda/gda-connection.c:1173
+#, c-format
+msgid "No provider '%s' installed"
+msgstr "Tak ada penyedia '%s' terpasang"
+
+#: ../libgda/gda-config.c:1267
+#, c-format
+msgid "Can't load provider: %s"
+msgstr "Tak bisa memuat penyedia: %s"
+
+#: ../libgda/gda-config.c:1290
+#, c-format
+msgid "Can't instantiate provider '%s'"
+msgstr ""
+
+#: ../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:1850
+#: ../tools/gda-sql.c:2698 ../tools/gda-sql.c:2870 ../tools/gda-sql.c:3087
+msgid "Provider"
+msgstr "Penyedia"
+
+#: ../libgda/gda-config.c:1335 ../libgda/gda-data-model-dsn-list.c:117
+#: ../libgda/gda-data-model-dsn-list.c:118
+#: ../libgda/gda-server-provider-extra.c:377
+#: ../libgda/gda-server-provider-extra.c:400
+#: ../tools/browser/data-manager/data-source-editor.c:130
+#: ../tools/gda-sql.c:1851 ../tools/gda-sql.c:2697 ../tools/gda-sql.c:2871
+msgid "Description"
+msgstr "Keterangan"
+
+#: ../libgda/gda-config.c:1336
+msgid "DSN parameters"
+msgstr "Parameter DSN"
+
+#: ../libgda/gda-config.c:1338
+msgid "File"
+msgstr "Berkas"
+
+#: ../libgda/gda-config.c:1339
+msgid "List of installed providers"
+msgstr "Daftar penyedia terpasang"
+
+#: ../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:3089
+msgid "Username"
+msgstr "Nama pengguna"
+
+#. other table options
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../libgda/gda-config.c:1505
+#: ../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
+#: ../providers/web/web_specs_auth.xml.in.h:2
+msgid "Password"
+msgstr "Kata Sandi"
+
+#: ../libgda/gda-config.c:1575
+#, c-format
+msgid "Error loading provider '%s': %s"
+msgstr "Galat saat memuat penyedia '%s': %s"
+
+#: ../libgda/gda-connection.c:306
+msgid "DSN to use"
+msgstr "DSN untuk dipakai"
+
+#: ../libgda/gda-connection.c:309
+msgid "Connection string to use"
+msgstr "String koneksi untuk dipakai"
+
+#: ../libgda/gda-connection.c:312
+msgid "Provider to use"
+msgstr "Penyedia untuk dipakai"
+
+#: ../libgda/gda-connection.c:317
+msgid "Authentication string to use"
+msgstr "String otentikasi untuk dipakai"
+
+#: ../libgda/gda-connection.c:321 ../libgda/gda-server-provider-extra.c:409
+#: ../libgda-ui/data/server_operation.glade.h:5
+#: ../libgda-ui/gdaui-server-operation.c:792
+#: ../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
+msgid "Options"
+msgstr "Opsi"
+
+#. To translators: Don't translate "GdaMetaStore", it's a class name
+#: ../libgda/gda-connection.c:326
+msgid "GdaMetaStore used by the connection"
+msgstr "GdaMetaStore yang dipakai oleh koneksi"
+
+#: ../libgda/gda-connection.c:332
+msgid ""
+"Unique GThread from which the connection will be available.This should only "
+"be modified by the database providers' implementation"
+msgstr ""
+
+#: ../libgda/gda-connection.c:343
+msgid ""
+"Tells if the connection acts as a thread wrapper around another connection, "
+"making it completely thread safe"
+msgstr ""
+
+#: ../libgda/gda-connection.c:358
+msgid ""
+"Make the connection set up a monitoring function in the mainloop to monitor "
+"the wrapped connection"
+msgstr ""
+
+#: ../libgda/gda-connection.c:645 ../libgda/gda-connection.c:673
+#: ../libgda/gda-connection.c:687 ../libgda/gda-connection.c:702
+#, c-format
+msgid "Could not set the '%s' property when the connection is opened"
+msgstr ""
+
+#: ../libgda/gda-connection.c:653
+#, c-format
+msgid "No DSN named '%s' defined"
+msgstr ""
+
+#: ../libgda/gda-connection.c:723
+#, c-format
+msgid "Can't set the '%s' property once the connection is opened"
+msgstr ""
+
+#: ../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
+msgid "Multi threading is not supported or enabled"
+msgstr ""
+
+#: ../libgda/gda-connection.c:970
+#, c-format
+msgid "Malformed data source specification '%s'"
+msgstr ""
+
+#: ../libgda/gda-connection.c:978 ../libgda/gda-connection.c:1361
+#: ../libgda/gda-connection.c:1363
+#, c-format
+msgid "Data source %s not found in configuration"
+msgstr ""
+
+#: ../libgda/gda-connection.c:1044
+msgid "Datasource configuration error: no provider specified"
+msgstr ""
+
+#: ../libgda/gda-connection.c:1124 ../tools/browser/auth-dialog.c:417
+#: ../tools/browser/auth-dialog.c:453 ../tools/gda-sql.c:1309
+#, c-format
+msgid "Malformed connection string '%s'"
+msgstr ""
+
+#: ../libgda/gda-connection.c:1130 ../libgda/gda-connection.c:1385
+msgid "No provider specified"
+msgstr ""
+
+#: ../libgda/gda-connection.c:1373 ../libgda/gda-connection.c:1375
+msgid "No DSN or connection string specified"
+msgstr ""
+
+#: ../libgda/gda-connection.c:1405
+msgid "Provider does not allow usage from this thread"
+msgstr ""
+
+#: ../libgda/gda-connection.c:1419
+msgid ""
+"Internal error: provider does not implement the open_connection() virtual "
+"method"
+msgstr ""
+
+#: ../libgda/gda-connection.c:1528
+#, c-format
+msgid "Error while maintaining the meta data up to date: %s"
+msgstr ""
+
+#: ../libgda/gda-connection.c:2179
+msgid "Provider does not support statement preparation"
+msgstr ""
+
+#: ../libgda/gda-connection.c:2374 ../libgda/gda-connection.c:2460
+#: ../libgda/gda-connection.c:2530 ../libgda/gda-meta-store.c:659
+#, c-format
+msgid "Can't obtain connection lock"
+msgstr ""
+
+#: ../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
+#, c-format
+msgid "Connection is closed"
+msgstr "Sambungan tertutup"
+
+#: ../libgda/gda-connection.c:2475 ../libgda/gda-connection.c:2565
+#, c-format
+msgid "Can't find task %u"
+msgstr ""
+
+#: ../libgda/gda-connection.c:2553 ../libgda/sqlite/gda-sqlite-provider.c:1008
+#: ../libgda/thread-wrapper/gda-thread-provider.c:917
+#: ../providers/jdbc/gda-jdbc-provider.c:575
+#: ../providers/mysql/gda-mysql-provider.c:963
+#: ../providers/postgres/gda-postgres-provider.c:863
+#: ../providers/web/gda-web-provider.c:674
+msgid "Provider does not support asynchronous server operation"
+msgstr ""
+
+#: ../libgda/gda-connection.c:2739 ../libgda/gda-connection.c:2754
+msgid "Statement is a selection statement"
+msgstr ""
+
+#: ../libgda/gda-connection.c:2812 ../libgda/gda-connection.c:2888
+#: ../libgda/gda-connection.c:2958
+msgid "Statement is not a selection statement"
+msgstr ""
+
+#: ../libgda/gda-connection.c:3417
+msgid "Invalid argument"
+msgstr "Argumen tidak valid"
+
+#: ../libgda/gda-connection.c:3426
+#, c-format
+msgid "Missing or wrong arguments for table '%s': %s"
+msgstr ""
+
+#: ../libgda/gda-connection.c:4181
+msgid "Meta update error"
+msgstr ""
+
+#: ../libgda/gda-connection.c:4744
+msgid "Wrong filter arguments"
+msgstr ""
+
+#: ../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
+#, c-format
+msgid "Connection transaction status tracking: no transaction exists for %s"
+msgstr ""
+
+#: ../libgda/gda-connection.c:5422
+#: ../libgda/sqlite/virtual/gda-virtual-connection.c:235
+msgid "Internal error: invalid provider handle"
+msgstr ""
+
+#: ../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:3494
+#: ../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
+#, c-format
+msgid "Column %d out of range (0-%d)"
+msgstr ""
+
+#: ../libgda/gda-data-access-wrapper.c:519
+msgid "Can't set iterator's position"
+msgstr ""
+
+#: ../libgda/gda-data-access-wrapper.c:592
+msgid "Can't access data"
+msgstr ""
+
+#: ../libgda/gda-data-comparator.c:160
+msgid "Old data model"
+msgstr ""
+
+#: ../libgda/gda-data-comparator.c:164
+msgid "New data model"
+msgstr ""
+
+#: ../libgda/gda-data-comparator.c:441
+msgid "Missing original data model"
+msgstr ""
+
+#: ../libgda/gda-data-comparator.c:446
+msgid "Missing new data model"
+msgstr ""
+
+#: ../libgda/gda-data-comparator.c:452
+msgid "Data models must support random access model"
+msgstr ""
+
+#: ../libgda/gda-data-comparator.c:461
+msgid "Data models to compare don't have the same number of columns"
+msgstr ""
+
+#: ../libgda/gda-data-comparator.c:472
+#, c-format
+msgid "Type mismatch for column %d: '%s' and '%s'"
+msgstr ""
+
+#: ../libgda/gda-data-comparator.c:561 ../libgda/gda-data-comparator.c:597
+msgid "Differences computation cancelled on signal handling"
+msgstr ""
+
+#: ../libgda/gda-data-model-array.c:170
+msgid "Whether data model can be modified"
+msgstr ""
+
+#: ../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:3443
+#: ../libgda/gda-data-proxy.c:3481 ../libgda/gda-data-select.c:1649
+#: ../libgda/gda-data-select.c:1703
+#, c-format
+msgid "Row %d out of range (0-%d)"
+msgstr ""
+
+#: ../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:3446
+#: ../libgda/gda-data-proxy.c:3484 ../libgda/gda-data-select.c:1652
+#: ../libgda/gda-data-select.c:1706
+#, c-format
+msgid "Row %d not found (empty data model)"
+msgstr ""
+
+#: ../libgda/gda-data-model-array.c:528
+msgid "No row in data model"
+msgstr ""
+
+#: ../libgda/gda-data-model-array.c:560
+msgid "Data model has no data"
+msgstr ""
+
+#: ../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
+msgid "Attempting to modify a read-only data model"
+msgstr ""
+
+#: ../libgda/gda-data-model-array.c:665 ../libgda/gda-data-model-array.c:704
+msgid "Too many values in list"
+msgstr ""
+
+#: ../libgda/gda-data-model-array.c:758
+msgid "Row not found in data model"
+msgstr ""
+
+#: ../libgda/gda-data-model-bdb.c:263
+#, c-format
+msgid "Could not load the Berkeley DB library: %s"
+msgstr ""
+
+#: ../libgda/gda-data-model-bdb.c:267 ../libgda/gda-data-model-bdb.c:271
+#, c-format
+msgid "Could not load the '%s' symbol from the Berkeley DB library"
+msgstr ""
+
+#: ../libgda/gda-data-model-bdb.c:294 ../libgda/gda-data-model-bdb.c:365
+msgid "Berkeley DB library not loaded"
+msgstr ""
+
+#: ../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
+#, c-format
+msgid ""
+"Custom BDB model implementation is not complete: the '%s' method is missing"
+msgstr ""
+
+#: ../libgda/gda-data-model-bdb.c:854 ../libgda/gda-data-model-bdb.c:940
+#, c-format
+msgid "Expected GdaBinary value, got %s"
+msgstr ""
+
+#: ../libgda/gda-data-model-bdb.c:900
+msgid "Key modification is not supported"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:620
+msgid "Data model does not support getting individual value"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:663 ../libgda/gda-data-model.c:673
+#, c-format
+msgid "Data model returned value of invalid '%s' type"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:670
+msgid "Data model returned invalid NULL value"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:730
+msgid "Data model does not support setting individual value"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:763
+msgid "Data model does not support setting values"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:826 ../libgda/gda-data-model.c:860
+msgid "Data model does not support row append"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:851
+msgid "Model does not allow row insertion"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:886
+msgid "Model does not allow row deletion"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:895
+msgid "Data model does not support row removal"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:1038 ../libgda/gda-data-model.c:1079
+#: ../libgda/gda-data-model.c:1093
+#, c-format
+msgid "The '%s' parameter must hold a string value, ignored."
+msgstr ""
+
+#: ../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
+#, c-format
+msgid "The '%s' parameter must hold a boolean value, ignored."
+msgstr ""
+
+#: ../libgda/gda-data-model.c:1261
+#, c-format
+msgid "File '%s' already exists"
+msgstr "Berkas '%s' sudah ada"
+
+#: ../libgda/gda-data-model.c:1401
+msgid "Exported Data"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:1518
+#, c-format
+msgid "Expected tag <gda_value> or <gda_array_value>, got <%s>, ignoring"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:1549
+msgid "Cannot retrieve column data type (type is UNKNOWN or not specified)"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:1635
+#, c-format
+msgid "Expected tag <gda_array_data>, got <%s>"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:1698
+msgid "Could not get an iterator for source data model"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:1715
+#, c-format
+msgid "Inexistent column in source data model: %d"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:1729
+#, c-format
+msgid ""
+"Destination column %d can't be NULL but has no correspondence in the source "
+"data model"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:1739
+#, c-format
+msgid ""
+"Destination column %d has a gda type (%s) incompatible with source column %d "
+"type (%s)"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:1836
+#, c-format
+msgid "Can't transform '%s' from GDA type %s to GDA type %s"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:2030
+#, c-format
+msgid "Could not dump data model's attributes: %s"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:2038
+#, c-format
+msgid "Could not dump data model's contents: %s"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:2286
+msgid "Data model does not support backward cursor move, not displaying data"
+msgstr ""
+
+#: ../libgda/gda-data-model.c:2405
+#, c-format
+msgid "(%d row)\n"
+msgid_plural "(%d rows)\n"
+msgstr[0] "(%d baris)\n"
+
+#: ../libgda/gda-data-model-dir.c:859
+msgid "Row not found"
+msgstr ""
+
+#: ../libgda/gda-data-model-dir.c:984 ../libgda/gda-data-model-dir.c:986
+msgid "Column cannot be modified"
+msgstr ""
+
+#: ../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
+msgid "New path must be a subpath of the base directory"
+msgstr ""
+
+#: ../libgda/gda-data-model-dir.c:1045 ../libgda/gda-data-model-dir.c:1089
+#, c-format
+msgid "Could not rename file '%s' to '%s'"
+msgstr ""
+
+#: ../libgda/gda-data-model-dir.c:1069
+#, c-format
+msgid "Could not create directory '%s'"
+msgstr "Tidak dapat membuat direktori '%s'"
+
+#: ../libgda/gda-data-model-dir.c:1138
+#, c-format
+msgid "Could not overwrite contents of file '%s'"
+msgstr ""
+
+#: ../libgda/gda-data-model-dir.c:1156 ../libgda/gda-data-model-dir.c:1157
+msgid "Wrong type of data"
+msgstr ""
+
+#: ../libgda/gda-data-model-dir.c:1198 ../libgda/gda-data-model-dir.c:1200
+msgid "Column cannot be set"
+msgstr ""
+
+#: ../libgda/gda-data-model-dir.c:1271
+#, c-format
+msgid "Cannot set contents of filename '%s'"
+msgstr ""
+
+#: ../libgda/gda-data-model-dir.c:1282
+#, c-format
+msgid "Cannot create directory '%s'"
+msgstr "Tak bisa membuat direktori: '%s'"
+
+#: ../libgda/gda-data-model-dir.c:1290 ../libgda/gda-data-model-dir.c:1292
+msgid "Cannot add row: filename missing"
+msgstr ""
+
+#: ../libgda/gda-data-model-dir.c:1332
+#, c-format
+msgid "Cannot remove file '%s'"
+msgstr ""
+
+#: ../libgda/gda-data-model-dsn-list.c:105
+#: ../libgda/gda-data-model-dsn-list.c:106 ../tools/gda-sql.c:2696
+#, fuzzy
+msgid "DSN"
+msgstr "%s [DSN]"
+
+#. To translators: a "Connection string" is a semi-colon delimited list of key=value pairs which
+#. * define the parameters for a connection, such as "DB_NAME=thedb;HOSTNAME=moon
+#: ../libgda/gda-data-model-dsn-list.c:125
+#: ../libgda/gda-data-model-dsn-list.c:126
+msgid "Connection string"
+msgstr ""
+
+#: ../libgda/gda-data-model-dsn-list.c:137
+#: ../libgda/gda-data-model-dsn-list.c:138
+msgid "Global"
+msgstr "Global"
+
+#: ../libgda/gda-data-model-dsn-list.c:142
+msgid "List of defined data sources"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:447
+#, c-format
+msgid "The '%s' option must hold a string value, ignored."
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:463
+#, c-format
+msgid "The '%s' option must hold a boolean value, ignored."
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:572
+msgid "\"options\" property is not a GdaSet object"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:835
+#, c-format
+msgid "The '%s' option must hold a GType value, ignored."
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:901
+#, c-format
+msgid "Character conversion at line %d, error: %s"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:904
+#: ../libgda/sqlite/gda-sqlite-provider.c:691
+#: ../providers/bdb/gda-bdb-provider.c:208
+#: ../tools/browser/common/gdaui-data-import.c:177
+#, fuzzy
+msgid "no detail"
+msgstr "Tak ada rincian"
+
+#: ../libgda/gda-data-model-import.c:942
+#, c-format
+msgid "Could not convert string '%s' to a '%s' value"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:998
+#, c-format
+msgid "Error while parsing CSV file: %s"
+msgstr ""
+
+#. error
+#: ../libgda/gda-data-model-import.c:1101
+msgid "Failed to read node in XML file"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1120
+#, c-format
+msgid "Expected <gda_array> node in XML file, got <%s>"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1164
+#: ../libgda/gda-data-model-import.c:1483
+msgid "No \"gdatype\" attribute specified in <gda_array_field>"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1211
+msgid "Expected <gda_array_field> in <gda_array>"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1245
+#, c-format
+msgid "Expected <gda_array_data> in <gda_array>, got <%s>"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1247
+msgid "Expected <gda_array_data> in <gda_array>"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1259
+msgid "Can't read the contents of the <gda_array_data> node"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1308
+#, c-format
+msgid "Expected <gda_array_row> in <gda_array_data>, got <%s>"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1332
+msgid "Row has too many values (which are ignored)"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1379
+#, c-format
+msgid "Could not convert '%s' to a value of type %s"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1452
+#, c-format
+msgid "Expected <gda_array> node but got <%s>"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1530
+msgid "No <gda_array_field> specified in <gda_array>"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1708
+msgid "Data model does not support random access"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1764
+#, c-format
+msgid "Row at line %d does not have enough values, completed with NULL values"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1784
+#, c-format
+msgid "Row at line %d does not have enough values (which are thus ignored)"
+msgstr ""
+
+#: ../libgda/gda-data-model-import.c:1856
+#: ../libgda/gda-data-model-import.c:1929
+#, c-format
+msgid "Could not set iterator's value: %s"
+msgstr ""
+
+#: ../libgda/gda-data-model-iter.c:301 ../libgda/gda-data-model-iter.c:308
+msgid "GdaDataModel refused value change"
+msgstr ""
+
+#: ../libgda/gda-data-proxy.c:912
+msgid "GdaDataProxy can't handle non random access data models"
+msgstr ""
+
+#: ../libgda/gda-data-proxy.c:1538 ../libgda/gda-data-proxy.c:3899
+msgid ""
+"The first row is an empty row artificially prepended and cannot be removed"
+msgstr ""
+
+#: ../libgda/gda-data-proxy.c:2048
+#, c-format
+msgid ""
+"Proxied data model reports the modifications as accepted, yet did not emit "
+"the corresponding \"row-inserted\", \"row-updated\" or \"row-removed\" "
+"signal. This is a bug of the %s's implementation (please report a bug)."
+msgstr ""
+
+#: ../libgda/gda-data-proxy.c:2084
+#, c-format
+msgid ""
+"Proxied data model reports the modifications as accepted, yet did not emit "
+"the corresponding \"row-inserted\", \"row-updated\" or \"row-removed\" "
+"signal. This may be a bug of the %s's implementation (please report a bug)."
+msgstr ""
+
+#: ../libgda/gda-data-proxy.c:2930 ../tools/gda-sql.c:3251
+msgid "Could not create virtual connection"
+msgstr ""
+
+#: ../libgda/gda-data-proxy.c:2971 ../libgda/gda-data-proxy.c:2984
+msgid "Error in filter expression"
+msgstr ""
+
+#: ../libgda/gda-data-proxy.c:3098 ../libgda/gda-data-select.c:1445
+msgid "Incorrect filter expression"
+msgstr ""
+
+#: ../libgda/gda-data-proxy.c:3654
+msgid ""
+"The first row is an empty row artificially prepended and cannot be altered"
+msgstr ""
+
+#: ../libgda/gda-data-proxy.c:3676
+#, c-format
+msgid "Wrong value type: expected '%s' and got '%s'"
+msgstr ""
+
+#: ../libgda/gda-data-proxy.c:3762
+#, c-format
+msgid "Trying to change read-only column: %d"
+msgstr ""
+
+#: ../libgda/gda-data-proxy.c:3799
+#, c-format
+msgid "Value type mismatch %s instead of %s"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:367
+#, c-format
+msgid "Could not re-run SELECT statement: %s"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:953
+msgid "Incorrect SQL expression"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:978
+msgid "Internal error: the \"prepared-stmt\" property has not been set"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:985
+msgid "Can't get the prepared statement's actual statement"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:991
+msgid "Unsupported type of SELECT statement"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1060
+msgid "INSERT statement must contain values to insert"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1066
+msgid "INSERT statement must insert only one row"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1093
+msgid "DELETE statement must have a WHERE part"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1133
+msgid "UPDATE statement must have a WHERE part"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1187
+#, c-format
+msgid "Modification statement uses an unknown '%s' parameter"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1209
+#, c-format
+msgid "Modification statement's  '%s' parameter is a %s when it should be a %s"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1246
+msgid "Modification statement must be an INSERT, UPDATE or DELETE statement"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1294 ../libgda/gda-data-select.c:1500
+#: ../libgda/gda-data-select.c:3320
+msgid "No connection to use"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1340
+msgid "Invalid unique row condition (only equal operators are allowed)"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1372 ../libgda/gda-data-select.c:1427
+msgid "Unique row condition has already been specified"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1509 ../libgda/gda-data-select.c:1520
+msgid "No table to select from in SELECT statement"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1514
+msgid "SELECT statement uses more than one table to select from"
+msgstr ""
+
+#: ../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
+msgid "Data model does only support random access"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1721
+msgid "Unable to retrieve data after modifications"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1740 ../libgda/gda-data-select.c:1748
+#: ../libgda/gda-data-select.c:1770
+msgid ""
+"Unable to retrieve data after modifications, no further modification will be "
+"allowed"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:1805
+#, c-format
+msgid "Unable to get value for row %d and column %d"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2031 ../libgda/gda-data-select.c:2040
+#: ../libgda/gda-data-select.c:2050
+#, c-format
+msgid "Could not change iter's value for column %d: %s"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2045
+msgid "Allowed GdaHolder's value to be NULL for the iterator to be updated"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2125 ../libgda/gda-data-select.c:2218
+msgid "Some columns can't be modified"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2272
+msgid "Internal error: can't get the prepared statement's actual statement"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2312
+msgid "Unable to identify a way to fetch a single row"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2319
+msgid "Can only operate on non compound SELECT statements"
+msgstr ""
+
+#: ../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
+msgid "Modifications are not allowed anymore"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2410 ../libgda/gda-data-select.c:2580
+#: ../libgda/gda-data-select.c:2646 ../libgda/gda-data-select.c:2732
+msgid "No UPDATE statement provided"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2450
+msgid "Could not get iterator's value"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2607 ../libgda/gda-data-select.c:2674
+#, c-format
+msgid "Column %d can't be modified"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2740
+#, c-format
+msgid "Too many values (%d as maximum)"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2820
+msgid "No INSERT statement provided"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2825
+msgid "Cannot add a row because the number of rows in unknown"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:2854
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:385
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:394
+msgid "Missing values to insert in INSERT statement"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:3014
+msgid "No DELETE statement provided"
+msgstr ""
+
+#: ../libgda/gda-data-select.c:3444
+#, c-format
+msgid ""
+"An error has occurred, the value returned by the \"exec-params\" property "
+"will be wrong: %s"
+msgstr ""
+
+#: ../libgda/gda-easy.c:295
+msgid "Unspecified table name"
+msgstr ""
+
+#: ../libgda/gda-easy.c:334
+msgid "Invalid type"
+msgstr "Jenis tak valid"
+
+#: ../libgda/gda-easy.c:429
+msgid "CREATE TABLE operation is not supported by the database server"
+msgstr ""
+
+#: ../libgda/gda-holder.c:487 ../libgda/gda-set.c:552
+#, c-format
+msgid "Unable to set holder's value: %s"
+msgstr ""
+
+#: ../libgda/gda-holder.c:581
+msgid "The 'g-type' property cannot be changed"
+msgstr ""
+
+#: ../libgda/gda-holder.c:848
+#, c-format
+msgid "Unable to convert string to '%s' type"
+msgstr ""
+
+#: ../libgda/gda-holder.c:908
+msgid ""
+"Can't use this method to set value because there is already a static value"
+msgstr ""
+
+#: ../libgda/gda-holder.c:927 ../libgda/gda-holder.c:1061
+#, c-format
+msgid "(%s): Holder does not allow NULL values"
+msgstr ""
+
+#: ../libgda/gda-holder.c:934
+#, c-format
+msgid ""
+"(%s): Wrong Holder value type, expected type '%s' when value's type is '%s'"
+msgstr ""
+
+#: ../libgda/gda-holder.c:1068
+#, c-format
+msgid "(%s): Wrong value type: expected type '%s' when value's type is '%s'"
+msgstr ""
+
+#. break holder's binding because type differ
+#: ../libgda/gda-holder.c:1522
+#, c-format
+msgid ""
+"Cannot bind holders if their type is not the same, breaking existing bind "
+"where '%s' was bound to '%s'"
+msgstr ""
+
+#: ../libgda/gda-holder.c:1567
+msgid "Cannot bind holders if their type is not the same"
+msgstr ""
+
+#: ../libgda/gda-holder.c:1707
+#, c-format
+msgid "Could not change GdaHolder to match value change in bound GdaHolder: %s"
+msgstr ""
+
+#: ../libgda/gda-init.c:73
+msgid "Ignoring attempt to re-initialize GDA library."
+msgstr ""
+
+#: ../libgda/gda-init.c:95
+msgid "libgda needs GModule. Finishing..."
+msgstr ""
+
+#: ../libgda/gda-init.c:155 ../libgda/gda-init.c:176
+#, c-format
+msgid ""
+"Could not parse '%s': XML data import validation will not be performed (some "
+"weird errors may occur)"
+msgstr ""
+
+#: ../libgda/gda-init.c:197
+#, c-format
+msgid ""
+"Could not parse '%s': Validation for XML files for server operations will "
+"not be performed (some weird errors may occur)"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:427
+msgid "Connection string for the internal connection to use"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:430
+msgid "Connection object internally used"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:433
+msgid "Catalog in which the database objects will be created"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:436
+msgid "Schema in which the database objects will be created"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:579
+msgid "Catalog specified but no schema specified, store will not be usable"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:899 ../libgda/gda-meta-store.c:908
+#: ../libgda/gda-meta-store.c:2024 ../libgda/gda-meta-store.c:2033
+msgid "Could not set the internal schema's version"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:1213
+msgid "Missing view name from <view> node"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:1253
+msgid "Missing view definition from <view> node"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:1267
+#, c-format
+msgid "View definition contains more than one statement (for view '%s')"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:1294
+#, c-format
+msgid "View definition is not a selection statement (for view '%s')"
+msgstr ""
+
+#. FIXME
+#: ../libgda/gda-meta-store.c:1321 ../libgda/gda-meta-struct-io.c:172
+msgid "Missing table name from <table> node"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:1550
+#, c-format
+msgid "Column '%s' already exists and has different characteristics"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:1584
+#, c-format
+msgid "Missing foreign key's referenced table name (for table '%s')"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:1637
+#, c-format
+msgid "Missing foreign key's column name (for table '%s')"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:1648
+#, c-format
+msgid "Column '%s' not found in table '%s'"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:1901 ../libgda/gda-meta-struct.c:1026
+#, c-format
+msgid "Foreign key column '%s' not found in table '%s'"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:2081
+#, c-format
+msgid "Schema description does not contain the object '%s', check installation"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:2142 ../libgda/gda-meta-store.c:2153
+#: ../libgda/gda-meta-store.c:2183
+msgid "Could not get the internal schema's version"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:2167
+#, c-format
+msgid "Unknown internal schema's version: '%s'"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:2306 ../tools/gda-sql.c:967
+msgid "More than one SQL statement"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:2335
+#, c-format
+msgid "Parameter '%s' is not present in statement"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:2352
+#, c-format
+msgid "No value set for parameter '%s'"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:2909
+msgid "Data models should have the same number of columns"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:2970 ../libgda/gda-meta-store.c:4024
+#: ../libgda/gda-meta-store.c:4127
+#, c-format
+msgid "Unknown database object '%s'"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:2986
+#, c-format
+msgid "Could not set value for parameter '%s'"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3015
+msgid "Could not create SELECT statement"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3030
+msgid "Could not create DELETE statement"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3080
+msgid "A transaction has already been started"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3474
+#, c-format
+msgid "Attribute '%s' not found"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3477
+#, c-format
+msgid "Attribute '%s' has %d value"
+msgid_plural "Attribute '%s' has %d values"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../libgda/gda-meta-store.c:3524
+msgid "Attributes names starting with a '_' are reserved for internal usage"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3552
+msgid ""
+"Could not start a transaction because one already started, this could lead "
+"to GdaMetaStore attributes problems"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3666
+msgid "Could not parse XML description of custom database object to add"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3680
+msgid "Missing custom database object name"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3685
+msgid ""
+"Custom database object names starting with a '_' are reserved for internal "
+"usage"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3783
+msgid "Another object with the same name already exists"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3886
+#, c-format
+msgid "Missing table name in meta data context"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3913
+#, c-format
+msgid "Missing column name in meta data context"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3929
+#, c-format
+msgid "Missing condition in meta data context"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3954
+#, c-format
+msgid "Malformed condition in meta data context"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3971
+#, c-format
+msgid "Unknown column name '%s' in meta data context"
+msgstr ""
+
+#: ../libgda/gda-meta-store.c:3993
+#, c-format
+msgid "Unknown table in meta data context"
+msgstr ""
+
+#: ../libgda/gda-meta-struct.c:128
+msgid "GdaMetaStore object to fetch information from"
+msgstr ""
+
+#. 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
+msgid "Features to compute"
+msgstr ""
+
+#: ../libgda/gda-meta-struct.c:498 ../libgda/gda-meta-struct.c:513
+#: ../libgda/gda-meta-struct.c:530
+#, c-format
+msgid "Could not find object named '%s'"
+msgstr ""
+
+#: ../libgda/gda-meta-struct.c:579
+#, c-format
+msgid ""
+"Object %s.%s.%s already exists in GdaMetaStruct and has a different object "
+"type"
+msgstr ""
+
+#: ../libgda/gda-meta-struct.c:605
+#, c-format
+msgid "View %s.%s.%s not found in meta store object"
+msgstr ""
+
+#: ../libgda/gda-meta-struct.c:687
+#, c-format
+msgid "Table %s.%s.%s not found (or missing columns information)"
+msgstr ""
+
+#: ../libgda/gda-meta-struct.c:813
+#, c-format
+msgid "Internal GdaMetaStore error: column %s not found"
+msgstr ""
+
+#: ../libgda/gda-meta-struct.c:943
+#, c-format
+msgid ""
+"Meta data incoherence in foreign key constraint for table %s.%s.%s "
+"referencing table %s.%s.%s"
+msgstr ""
+
+#: ../libgda/gda-meta-struct.c:2258
+msgid "Missing object name in GdaMetaDbObject structure"
+msgstr ""
+
+#: ../libgda/gda-meta-struct.c:2283
+#, c-format
+msgid "Database object '%s' already exists"
+msgstr ""
+
+#. FIXME
+#: ../libgda/gda-meta-struct-io.c:78
+#, c-format
+msgid "Could not load file '%s'"
+msgstr ""
+
+#. FIXME
+#: ../libgda/gda-meta-struct-io.c:85
+#, c-format
+msgid "Root node of file '%s' should be <schema>."
+msgstr ""
+
+#. FIXME
+#: ../libgda/gda-meta-struct-io.c:231
+#, c-format
+msgid "Missing column name for table '%s'"
+msgstr ""
+
+#. FIXME
+#: ../libgda/gda-meta-struct-io.c:283
+#, c-format
+msgid "Missing foreign key's referenced table name for table '%s'"
+msgstr ""
+
+#. FIXME
+#: ../libgda/gda-meta-struct-io.c:294 ../libgda/gda-meta-struct-io.c:300
+#: ../libgda/gda-meta-struct-io.c:306
+#, c-format
+msgid "Invalid referenced table name '%s'"
+msgstr ""
+
+#. FIXME
+#: ../libgda/gda-meta-struct-io.c:345
+#, c-format
+msgid "Missing foreign key's column name for table '%s'"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:587
+#, c-format
+msgid "GdaServerOperation: could not find file '%s'"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:598
+#, c-format
+msgid "GdaServerOperation: could not load file '%s'"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:613 ../libgda/gda-server-operation.c:1004
+#, c-format
+msgid "Could not load XML specifications: %s"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:680
+#, c-format
+msgid ""
+"GdaServerOperation: file '%s' does not conform to DTD:\n"
+"%s"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:683
+#, c-format
+msgid ""
+"GdaServerOperation specification does not conform to DTD:\n"
+"%s"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:690
+#, c-format
+msgid "GdaServerOperation: file '%s' does not conform to DTD"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:693
+msgid "GdaServerOperation specification does not conform to DTD\n"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:1233
+msgid ""
+"Non handled GdaServerOperationType, please report error to http://bugzilla.";
+"gnome.org/ for the \"libgda\" product"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:1467 ../libgda/gda-server-operation.c:1481
+#, c-format
+msgid "Expected tag <%s>, got <%s>"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:1512 ../libgda/gda-server-operation.c:2198
+msgid ""
+"Parameterlist values can only be set for individual parameters within it"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:1569
+msgid "Missing attribute named 'path'"
+msgstr ""
+
+#: ../libgda/gda-server-operation.c:2327
+#, c-format
+msgid "Missing required value for '%s'"
+msgstr ""
+
+#: ../libgda/gda-server-provider.c:508
+#, c-format
+msgid "Provider %s created a GdaServerOperation without node for '%s'"
+msgstr ""
+
+#: ../libgda/gda-server-provider.c:512
+#, c-format
+msgid "Provider %s created a GdaServerOperation with wrong node type for '%s'"
+msgstr ""
+
+#: ../libgda/gda-server-provider.c:936 ../libgda/gda-server-provider.c:970
+#, c-format
+msgid ""
+"GdaServerProvider object implements the %s virtual method but does not "
+"implement the %s one, please report this bug to http://bugzilla.gnome.org/ "
+"for the \"libgda\" product."
+msgstr ""
+
+#. To translators: "Aggregate": the noun
+#: ../libgda/gda-server-provider-extra.c:312
+#, fuzzy
+msgid "Aggregate"
+msgstr "Agregat"
+
+#: ../libgda/gda-server-provider-extra.c:313
+#: ../libgda/gda-server-provider-extra.c:357
+#: ../tools/browser/data-manager/data-source-editor.c:123
+msgid "Id"
+msgstr "Id"
+
+#: ../libgda/gda-server-provider-extra.c:314
+#: ../libgda/gda-server-provider-extra.c:358
+#: ../libgda/gda-server-provider-extra.c:369
+#: ../libgda/gda-server-provider-extra.c:376
+#: ../libgda/gda-server-provider-extra.c:387
+#: ../libgda/gda-server-provider-extra.c:399
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:56
+#: ../tools/command-exec.c:643
+msgid "Owner"
+msgstr "Pemilik"
+
+#: ../libgda/gda-server-provider-extra.c:315
+#: ../libgda/gda-server-provider-extra.c:359
+#: ../libgda/gda-server-provider-extra.c:370
+#: ../libgda/gda-server-provider-extra.c:388
+msgid "Comments"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:316
+msgid "OutType"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:317
+msgid "InType"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:318
+#: ../libgda/gda-server-provider-extra.c:364
+#: ../libgda/gda-server-provider-extra.c:371
+#: ../libgda/gda-server-provider-extra.c:378
+#: ../libgda/gda-server-provider-extra.c:401
+#: ../libgda/gda-server-provider-extra.c:408
+#: ../providers/bdbsql/bdbsql_specs_create_view.xml.in.h:2
+#: ../providers/mysql/mysql_specs_create_view.xml.in.h:2
+#: ../providers/postgres/postgres_specs_create_view.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_create_view.xml.in.h:2
+msgid "Definition"
+msgstr "Definisi"
+
+#: ../libgda/gda-server-provider-extra.c:322
+msgid "Database"
+msgstr "Basis Data"
+
+#. list of fields
+#: ../libgda/gda-server-provider-extra.c:326
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:7
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:23
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:12
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:13
+#: ../providers/mysql/mysql_specs_comment_column.xml.in.h:3
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:75
+#: ../providers/mysql/mysql_specs_drop_column.xml.in.h:2
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:12
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:8
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:23
+#: ../providers/postgres/postgres_specs_drop_column.xml.in.h:3
+#: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:7
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:23
+msgid "Field name"
+msgstr "Nama ruas"
+
+#. list of fields
+#: ../libgda/gda-server-provider-extra.c:327
+#: ../libgda-ui/data-entries/common-bin.c:325
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:4
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:17
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:6
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:10
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:53
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:6
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:4
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:11
+#: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:4
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:17
+msgid "Data type"
+msgstr "Jenis data"
+
+#. list of fields
+#: ../libgda/gda-server-provider-extra.c:328
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:10
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:35
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:17
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:167
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:13
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:65
+#: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:10
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:35
+msgid "Size"
+msgstr "Ukuran"
+
+#. list of fields
+#: ../libgda/gda-server-provider-extra.c:329
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:9
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:33
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:16
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:161
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:12
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:59
+#: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:9
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:33
+msgid "Scale"
+msgstr "Skala"
+
+#: ../libgda/gda-server-provider-extra.c:330
+msgid "Not null?"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:331
+#, fuzzy
+msgid "Primary key?"
+msgstr "Kunci primer:"
+
+#: ../libgda/gda-server-provider-extra.c:332
+msgid "Unique index?"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:333
+#: ../providers/mysql/mysql_specs_drop_table.xml.in.h:5
+#: ../providers/postgres/postgres_specs_drop_column.xml.in.h:4
+#: ../providers/postgres/postgres_specs_drop_index.xml.in.h:4
+#: ../providers/postgres/postgres_specs_drop_table.xml.in.h:2
+#: ../providers/postgres/postgres_specs_drop_view.xml.in.h:4
+msgid "References"
+msgstr "Rujukan"
+
+#. list of fields
+#: ../libgda/gda-server-provider-extra.c:334
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:21
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:10
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:12
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:57
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:10
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:6
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:15
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:21
+msgid "Default value"
+msgstr "Nilai baku"
+
+#: ../libgda/gda-server-provider-extra.c:335
+msgid "Extra attributes"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:339
+#: ../providers/bdbsql/bdbsql_specs_drop_index.xml.in.h:3
+#: ../providers/mysql/mysql_specs_drop_index.xml.in.h:1
+#: ../providers/postgres/postgres_specs_drop_index.xml.in.h:2
+#: ../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
+msgid "Index"
+msgstr "Indeks"
+
+#: ../libgda/gda-server-provider-extra.c:343
+msgid "Language"
+msgstr "Bahasa"
+
+#: ../libgda/gda-server-provider-extra.c:347
+msgid "Namespace"
+msgstr "Namespace"
+
+#: ../libgda/gda-server-provider-extra.c:351
+#: ../libgda/gda-server-provider-extra.c:375
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:11
+#: ../providers/bdbsql/bdbsql_specs_drop_table.xml.in.h:3
+#: ../providers/bdbsql/bdbsql_specs_rename_table.xml.in.h:3
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:18
+#: ../providers/mysql/mysql_specs_comment_column.xml.in.h:4
+#: ../providers/mysql/mysql_specs_comment_table.xml.in.h:1
+#: ../providers/mysql/mysql_specs_drop_column.xml.in.h:3
+#: ../providers/mysql/mysql_specs_drop_table.xml.in.h:7
+#: ../providers/mysql/mysql_specs_rename_table.xml.in.h:3
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:14
+#: ../providers/postgres/postgres_specs_drop_column.xml.in.h:6
+#: ../providers/postgres/postgres_specs_drop_table.xml.in.h:4
+#: ../providers/postgres/postgres_specs_rename_table.xml.in.h:3
+#: ../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
+msgid "Table"
+msgstr "Tabel"
+
+#: ../libgda/gda-server-provider-extra.c:352
+#: ../libgda/gda-server-provider-extra.c:368
+msgid "Sequence"
+msgstr "Urutan"
+
+#: ../libgda/gda-server-provider-extra.c:356
+msgid "Procedure"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:360
+msgid "Return type"
+msgstr ""
+
+#. To translators: "Nb args": the procedure's number of arguments
+#: ../libgda/gda-server-provider-extra.c:362
+msgid "Nb args"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:363
+msgid "Args types"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:382
+#, fuzzy
+msgid "Trigger"
+msgstr "Trigger"
+
+#: ../libgda/gda-server-provider-extra.c:386
+#: ../libgda/gda-server-provider-extra.c:406
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:17
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:17
+#: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:17
+#: ../tools/command-exec.c:642 ../tools/command-exec.c:716
+#: ../tools/web-server.c:926
+msgid "Type"
+msgstr "Jenis"
+
+#: ../libgda/gda-server-provider-extra.c:389
+msgid "GDA type"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:390
+msgid "Synonyms"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:394
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:14
+msgid "User"
+msgstr "Pengguna"
+
+#: ../libgda/gda-server-provider-extra.c:398
+#: ../providers/bdbsql/bdbsql_specs_drop_view.xml.in.h:3
+#: ../providers/mysql/mysql_specs_drop_view.xml.in.h:3
+#: ../providers/postgres/postgres_specs_drop_view.xml.in.h:6
+#: ../providers/sqlite/sqlite_specs_drop_view.xml.in.h:3
+#, fuzzy
+msgid "View"
+msgstr "Lihat"
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../libgda/gda-server-provider-extra.c:405
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:12
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:26
+#: ../providers/bdbsql/bdbsql_specs_create_view.xml.in.h:3
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:15
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:11
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:134
+#: ../providers/mysql/mysql_specs_create_view.xml.in.h:3
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:15
+#: ../providers/postgres/postgres_specs_create_index.xml.in.h:9
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:55
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:40
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:9
+#: ../providers/postgres/postgres_specs_create_view.xml.in.h:3
+#: ../providers/postgres/postgres_specs_drop_role.xml.in.h:3
+#: ../providers/postgres/postgres_specs_drop_user.xml.in.h:3
+#: ../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:641 ../tools/gda-sql.c:3086 ../tools/gda-sql.c:4012
+msgid "Name"
+msgstr "Nama"
+
+#. foreign key spec
+#: ../libgda/gda-server-provider-extra.c:407
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:77
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:25
+msgid "Fields"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:529
+msgid "Data model for schema has a wrong number of columns"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:541
+#, c-format
+msgid "Data model for schema has a wrong column title: '%s' instead of '%s'"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:548
+#, c-format
+msgid "Data model for schema has a wrong column name: '%s' instead of '%s'"
+msgstr ""
+
+#: ../libgda/gda-server-provider-extra.c:555
+#, c-format
+msgid "Data model for schema has a wrong gda type: %s instead of %s"
+msgstr ""
+
+#: ../libgda/gda-set.c:544 ../libgda/gda-set.c:645
+#, c-format
+msgid "%s() does not handle values of type '%s'."
+msgstr ""
+
+#: ../libgda/gda-set.c:599
+#, c-format
+msgid "GdaHolder with ID '%s' not found in set"
+msgstr ""
+
+#: ../libgda/gda-set.c:779
+#, c-format
+msgid "Spec's root node != 'data-set-spec': '%s'"
+msgstr ""
+
+#: ../libgda/gda-set.c:818
+#, c-format
+msgid "Missing node <parameters>: '%s'"
+msgstr ""
+
+#: ../libgda/gda-set.c:1030
+#, c-format
+msgid "Data set does not allow modifications"
+msgstr ""
+
+#: ../libgda/gda-set.c:1295
+msgid "GdaHolder needs to have an ID"
+msgstr ""
+
+#: ../libgda/gda-set.c:1408
+msgid "One or more values are invalid"
+msgstr ""
+
+#: ../libgda/gda-set.c:1625 ../libgda/gda-set.c:1638
+msgid ""
+"Replacing data model must have the same characteristics as the data model it "
+"replaces"
+msgstr ""
+
+#: ../libgda/gda-sql-builder.c:286 ../libgda/gda-sql-builder.c:1391
+#, c-format
+msgid "Unknown part ID %u"
+msgstr ""
+
+#: ../libgda/gda-sql-builder.c:290
+msgid "Unknown part type"
+msgstr ""
+
+#: ../libgda/gda-sql-builder.c:334
+#, c-format
+msgid "SqlBuilder is empty"
+msgstr ""
+
+#: ../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
+msgid "Wrong statement type"
+msgstr ""
+
+#: ../libgda/gda-sql-builder.c:588
+#, c-format
+msgid "Could not convert value to type '%s', value not defined"
+msgstr ""
+
+#: ../libgda/gda-sql-builder.c:712
+msgid "Wrong field format"
+msgstr ""
+
+#: ../libgda/gda-sql-builder.c:815 ../libgda/gda-sql-builder.c:820
+#, c-format
+msgid "Unhandled data type '%s'"
+msgstr ""
+
+#: ../libgda/gda-sql-builder.c:836
+#, c-format
+msgid "Could not convert value to type '%s'"
+msgstr ""
+
+#: ../libgda/gda-sql-builder.c:1304
+#, c-format
+msgid "Unknown left part target ID %u"
+msgstr ""
+
+#: ../libgda/gda-sql-builder.c:1309
+#, c-format
+msgid "Unknown right part target ID %u"
+msgstr ""
+
+#: ../libgda/gda-statement.c:483
+#, c-format
+msgid "Could not determine GType for parameter '%s'"
+msgstr ""
+
+#: ../libgda/gda-statement.c:484
+msgid "Unnamed"
+msgstr "Tanpa nama"
+
+#: ../libgda/gda-statement.c:683
+msgid "Missing SQL code"
+msgstr ""
+
+#: ../libgda/gda-statement.c:700
+#, c-format
+msgid "No data handler for type '%s'"
+msgstr ""
+
+#: ../libgda/gda-statement.c:1219
+#, c-format
+msgid "Wrong parameter type for '%s': expected type '%s' and got '%s'"
+msgstr ""
+
+#: ../libgda/gda-statement.c:1231
+#, c-format
+msgid "Missing parameter '%s'"
+msgstr ""
+
+#: ../libgda/gda-statement.c:1243 ../libgda/sqlite/gda-sqlite-provider.c:2448
+#: ../providers/jdbc/gda-jdbc-provider.c:1347
+#: ../providers/mysql/gda-mysql-provider.c:2188
+#: ../providers/postgres/gda-postgres-provider.c:1949
+#: ../providers/web/gda-web-provider.c:1508
+#, c-format
+msgid "Parameter '%s' is invalid"
+msgstr ""
+
+#: ../libgda/gda-statement.c:1289
+msgid "Unnamed parameter"
+msgstr ""
+
+#: ../libgda/gda-statement.c:1507
+msgid "Malformed table name"
+msgstr ""
+
+#: ../libgda/gda-statement.c:1956
+msgid "Join is not in a FROM statement"
+msgstr ""
+
+#: ../libgda/gda-statement.c:1963
+msgid "Could not find target the join is for"
+msgstr ""
+
+#: ../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
+#: ../tools/gda-sql.c:947
+#, c-format
+msgid "No connection specified"
+msgstr ""
+
+#: ../libgda/gda-tree-mgr-columns.c:347
+#, c-format
+msgid "No schema specified"
+msgstr ""
+
+#: ../libgda/gda-tree-mgr-columns.c:355
+#, c-format
+msgid "No table specified"
+msgstr ""
+
+#: ../libgda/gda-tree-mgr-columns.c:384
+#, c-format
+msgid "Unable to get column name"
+msgstr ""
+
+#: ../libgda/gda-tree-mgr-label.c:207
+#: ../tools/browser/canvas/browser-canvas-table.c:309
+msgid "No name"
+msgstr "Tanpa nama"
+
+#: ../libgda/gda-tree-mgr-schemas.c:269
+#, c-format
+msgid "Unable to get schema name"
+msgstr ""
+
+#: ../libgda/gda-tree-mgr-select.c:187
+#, c-format
+msgid "Could not get SELECT statement's parameters: %s"
+msgstr ""
+
+#: ../libgda/gda-tree-mgr-select.c:217
+#, c-format
+msgid ""
+"Could not bind SELECT statement's parameter '%s' to provided parameters: %s"
+msgstr ""
+
+#: ../libgda/gda-tree-mgr-select.c:302
+#, c-format
+msgid "No SELECT statement specified"
+msgstr ""
+
+#: ../libgda/gda-tree-mgr-select.c:324
+#, c-format
+msgid "No value specified for parameter '%s'"
+msgstr ""
+
+#: ../libgda/gda-tree-mgr-select.c:358
+#, c-format
+msgid "Unable to get iterator's value"
+msgstr ""
+
+#: ../libgda/gda-tree-mgr-tables.c:349
+#, c-format
+msgid "Unable to get table name"
+msgstr ""
+
+#: ../libgda/gda-tree.c:174
+msgid "Tells if the GdaTree is a list or a tree"
+msgstr ""
+
+#: ../libgda/gda-tree.c:737 ../libgda/gda-tree.c:745
+#, c-format
+msgid "Path format error: %s"
+msgstr ""
+
+#: ../libgda/gda-util.c:596
+#, c-format
+msgid "Field number %d not found in source named '%s'"
+msgstr ""
+
+#: ../libgda/gda-util.c:783
+msgid "SELECT statement has no FROM part"
+msgstr ""
+
+#: ../libgda/gda-util.c:788 ../libgda/gda-util.c:795
+msgid "SELECT statement involves more than one table or expression"
+msgstr ""
+
+#: ../libgda/gda-util.c:805
+msgid "Can only build modification statement for tables"
+msgstr ""
+
+#: ../libgda/gda-util.c:839 ../libgda/gda-util.c:847
+msgid "Table does not have any primary key"
+msgstr ""
+
+#: ../libgda/gda-util.c:873
+msgid "Table's primary key is not selected"
+msgstr ""
+
+#: ../libgda/gda-util.c:1122
+msgid "Could not compute any field to insert into"
+msgstr ""
+
+#: ../libgda/gda-util.c:1185
+msgid "Missing table name in UPDATE statement"
+msgstr ""
+
+#: ../libgda/gda-util.c:1264
+#, c-format
+msgid "Can't rewrite UPDATE statement to handle default values"
+msgstr ""
+
+#: ../libgda/gda-util.c:1316 ../libgda/gda-util.c:1373
+#: ../libgda/gda-util.c:1413 ../libgda/sqlite/gda-sqlite-provider.c:2429
+#: ../providers/jdbc/gda-jdbc-provider.c:1318
+#: ../providers/mysql/gda-mysql-provider.c:2168
+#: ../providers/postgres/gda-postgres-provider.c:1931
+#: ../providers/web/gda-web-provider.c:1488
+#, c-format
+msgid "Missing parameter '%s' to execute query"
+msgstr ""
+
+#: ../libgda/gda-xa-transaction.c:159
+msgid "Global transaction ID can not have more than 64 bytes"
+msgstr ""
+
+#: ../libgda/gda-xa-transaction.c:295
+msgid "Connection already registered with another GdaXaTransaction object"
+msgstr ""
+
+#: ../libgda/gda-xa-transaction.c:308
+msgid "Connection does not support distributed transaction"
+msgstr ""
+
+#: ../libgda/gda-xa-transaction.c:342
+msgid ""
+"Cannot unregister connection not registered with GdaXaTransaction object"
+msgstr ""
+
+#: ../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:646
+#: ../libgda/gda-xa-transaction.c:680
+#, c-format
+msgid "Provider error: %s method not implemented for provider %s"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-bin.c:117
+msgid "Binary handler"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-bin.c:124
+msgid "Binary representation"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-boolean.c:117
+#: ../libgda/sqlite/gda-sqlite-handler-boolean.c:121
+#: ../providers/mysql/gda-mysql-handler-boolean.c:117
+msgid "Boolean values handler"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-boolean.c:123
+msgid "Boolean representation"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-numerical.c:136
+msgid "Numerical representation"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-string.c:121
+msgid "Strings handler"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-string.c:126
+msgid "InternalString"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-string.c:127
+msgid "Strings representation"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-time.c:143
+msgid "Time and Date handler"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-time.c:168
+msgid "Time, Date and TimeStamp representation"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-type.c:115
+msgid "Gda type handler"
+msgstr ""
+
+#: ../libgda/handlers/gda-handler-type.c:121
+msgid "Gda type representation"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-ddl.c:221 ../providers/jdbc/gda-jdbc-ddl.c:142
+#: ../providers/mysql/gda-mysql-ddl.c:328
+#: ../providers/oracle/gda-oracle-ddl.c:142
+#: ../providers/postgres/gda-postgres-ddl.c:365
+#: ../providers/web/gda-web-ddl.c:141
+msgid "Table to create must have at least one row"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-handler-bin.c:119
+msgid "SQlite binary handler"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-handler-bin.c:125
+msgid "SQlite binary representation"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-handler-boolean.c:127
+msgid "Sqlite boolean representation"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:109
+#: ../libgda/sqlite/gda-sqlite-provider.c:146
+#, c-format
+msgid "Parameter '%s' not found is statement"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:117
+#: ../libgda/sqlite/gda-sqlite-provider.c:154
+#, c-format
+msgid "Parameter '%s' does not correspond to a table's column"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:166
+msgid "Binding a BLOB for this type of statement is not supported"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:510
+msgid "Can't find libsqlite3."
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:560
+#: ../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
+#: ../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
+msgid "Provider does not support asynchronous connection open"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:582
+#: ../providers/mdb/gda-mdb-provider.c:246
+msgid "The connection string must contain DB_DIR and DB_NAME values"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:609
+#: ../libgda/sqlite/gda-sqlite-provider.c:617
+#, c-format
+msgid ""
+"The connection string format has changed: replace URI with DB_DIR (the path "
+"to the database file) and DB_NAME (the database file without the '%s' at the "
+"end)."
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:632
+#: ../providers/mdb/gda-mdb-provider.c:288
+msgid ""
+"The DB_DIR part of the connection string must point to a valid directory"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:690
+#, c-format
+msgid "Could not set empty_result_callbacks SQLite option: %s"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:905
+#: ../libgda/sqlite/gda-sqlite-provider.c:944
+#: ../libgda-ui/data-entries/plugins/libmain.c:85
+#: ../libgda-ui/data-entries/plugins/libmain.c:123
+#: ../libgda-ui/data-entries/plugins/libmain.c:151
+#: ../libgda-ui/data-entries/plugins/libmain.c:158
+#: ../libgda-ui/data-entries/plugins/libmain.c:233
+#: ../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
+#, c-format
+msgid "Missing spec. file '%s'"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:1074
+msgid "Missing database name or directory"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:1100
+#: ../providers/postgres/gda-postgres-provider.c:992
+#: ../providers/postgres/gda-postgres-provider.c:993
+msgid "Transactions are not supported in read-only mode"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:1933
+#: ../providers/jdbc/gda-jdbc-provider.c:1115
+#: ../providers/postgres/gda-postgres-provider.c:1528
+#: ../providers/web/gda-web-provider.c:1259
+msgid "Unnamed parameter is not allowed in prepared statements"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2045
+#: ../libgda/sqlite/gda-sqlite-provider.c:2057
+#: ../providers/mysql/gda-mysql-provider.c:1955
+#: ../providers/postgres/gda-postgres-provider.c:1672
+#, c-format
+msgid "Can't build SELECT statement to get last inserted row: %s)"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2079
+#: ../providers/mysql/gda-mysql-provider.c:1970
+#: ../providers/postgres/gda-postgres-provider.c:1687
+#, c-format
+msgid "Can't execute SELECT statement to get last inserted row: %s"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2092
+#: ../providers/mysql/gda-mysql-provider.c:1983
+#: ../providers/postgres/gda-postgres-provider.c:1700
+msgid "SELECT statement to get last inserted row did not return any row"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2096
+#: ../providers/mysql/gda-mysql-provider.c:1987
+#: ../providers/postgres/gda-postgres-provider.c:1704
+#, c-format
+msgid "SELECT statement to get last inserted row returned too many (%d) rows"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2161
+msgid "Prepared statement has no associated GdaStatement"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2201
+#: ../libgda/sqlite/gda-sqlite-provider.c:2238
+msgid "Can't create SQLite BLOB handle"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2205
+#: ../libgda/sqlite/gda-sqlite-provider.c:2243
+msgid "Can't write to SQLite's BLOB"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2228
+#, c-format
+msgid ""
+"Can't obtain SQLite BLOB handle (reported type is '%s'), please report this "
+"bug to http://bugzilla.gnome.org/ for the \"libgda\" product."
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2253
+msgid "Can't identify the ROWID of the blob to fill"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2301
+#: ../providers/jdbc/gda-jdbc-provider.c:1213
+#: ../providers/mysql/gda-mysql-provider.c:2076
+#: ../providers/postgres/gda-postgres-provider.c:1799
+#: ../providers/web/gda-web-provider.c:1392
+msgid "Provider does not support asynchronous statement execution"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2369
+#: ../tools/browser/mgr-favorites.c:217 ../tools/browser/mgr-favorites.c:259
+msgid "Empty statement"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2411
+#: ../libgda/sqlite/gda-sqlite-provider.c:2414
+#: ../providers/jdbc/gda-jdbc-provider.c:1300
+#: ../providers/jdbc/gda-jdbc-provider.c:1303
+#: ../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
+#, c-format
+msgid "Missing parameter(s) to execute query"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2473
+#: ../providers/jdbc/gda-jdbc-provider.c:1382
+#: ../providers/mysql/gda-mysql-provider.c:2214
+#: ../providers/postgres/gda-postgres-provider.c:1974
+#: ../providers/web/gda-web-provider.c:1537
+msgid "Can't rewrite statement handle default values"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2537
+#: ../providers/mysql/gda-mysql-provider.c:2346
+msgid "Can't get BLOB's length"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2539
+#: ../providers/mysql/gda-mysql-provider.c:2348
+msgid "BLOB is too big"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2621
+#, c-format
+msgid "Non handled data type '%s'"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2805
+#: ../libgda/sqlite/gda-sqlite-provider.c:2826
+#: ../libgda/sqlite/gda-sqlite-provider.c:2892
+msgid "Function requires one argument"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-provider.c:2858
+#: ../libgda/sqlite/gda-sqlite-provider.c:2924
+msgid "Function requires two arguments"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-recordset.c:238
+#: ../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
+#, c-format
+msgid "Column %d out of range (0-%d), ignoring its specified type"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-recordset.c:389
+#: ../libgda/sqlite/gda-sqlite-recordset.c:401
+msgid "Integer value is too big"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-recordset.c:466
+msgid "Unable to open BLOB"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-recordset.c:486
+#: ../providers/postgres/gda-postgres-recordset.c:620
+#, c-format
+msgid "Invalid date '%s' (date format should be YYYY-MM-DD)"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-recordset.c:500
+#: ../providers/postgres/gda-postgres-recordset.c:631
+#, c-format
+msgid "Invalid time '%s' (time format should be HH:MM:SS[.ms])"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-recordset.c:514
+#: ../providers/postgres/gda-postgres-recordset.c:675
+#, c-format
+msgid "Invalid timestamp '%s' (format should be YYYY-MM-DD HH:MM:SS[.ms])"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-recordset.c:548
+msgid "SQLite provider fatal internal error"
+msgstr ""
+
+#: ../libgda/sqlite/gda-sqlite-recordset.c:596
+#: ../providers/jdbc/gda-jdbc-recordset.c:490
+#, c-format
+msgid "Row %d not found"
+msgstr ""
+
+#: ../libgda/sqlite/virtual/gda-vconnection-data-model.c:305
+msgid "Table to remove not found"
+msgstr ""
+
+#: ../libgda/sqlite/virtual/gda-vconnection-hub.c:208
+msgid "Namespace must be specified"
+msgstr ""
+
+#: ../libgda/sqlite/virtual/gda-vconnection-hub.c:258
+msgid "Connection was not represented in hub"
+msgstr ""
+
+#: ../libgda/sqlite/virtual/gda-virtual-connection.c:153
+#: ../libgda/sqlite/virtual/gda-virtual-connection.c:190
+msgid ""
+"Internal error: virtual provider does not implement the create_operation() "
+"virtual method"
+msgstr ""
+
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:384
+msgid "Data model must have at least one column"
+msgstr ""
+
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:402
+msgid "Could not compute virtual table's columns"
+msgstr ""
+
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:427
+#, c-format
+msgid "Can't get data model description for column %d"
+msgstr ""
+
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:441
+#, c-format
+msgid "Can't get data model's column type or type for column %d"
+msgstr ""
+
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:489
+#, c-format
+msgid "Can't declare virtual table (%s)"
+msgstr ""
+
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:649
+msgid "Column not found"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-sql-parser.c:635
+#: ../libgda/sql-parser/gda-sql-parser.c:726
+msgid "SQL code does not contain any statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-sql-parser.c:809
+#, c-format
+msgid "Syntax error at line %d, column %d"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-sql-parser.c:822
+#, c-format
+msgid "Overflow error at line %d, column %d"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:578
+msgid "GdaSqlField is not part of an INSERT or UPDATE statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:591
+msgid "Missing table in statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:611
+#: ../libgda/sql-parser/gda-statement-struct.c:824
+#, c-format
+msgid "Column '%s' not found"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:646
+#: ../libgda/sql-parser/gda-statement-struct.c:757
+msgid "GdaSqlSelectField is not part of a SELECT statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:705
+msgid "Missing table name in statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:713
+#: ../libgda/sql-parser/gda-statement-struct.c:806
+#: ../libgda/sql-parser/gda-statement-struct.c:853
+#, fuzzy, c-format
+msgid "Table '%s' not found"
+msgstr "Tabel tak ditemukan"
+
+#: ../libgda/sql-parser/gda-statement-struct.c:779
+#: ../libgda/sql-parser/gda-statement-struct.c:794
+#, c-format
+msgid "Could not identify table for field '%s'"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:983
+msgid "Expression can't have both a type cast and a parameter specification"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:993
+#: ../libgda/sql-parser/gda-statement-struct.c:1006
+#: ../libgda/sql-parser/gda-statement-struct.c:1019
+#, c-format
+msgid "'%s' is not a valid identifier"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:996
+#: ../libgda/sql-parser/gda-statement-struct.c:1009
+#: ../libgda/sql-parser/gda-statement-struct.c:1022
+msgid "Empty identifier"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:1031
+msgid "Operation has no operand"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:1054
+#: ../libgda/sql-parser/gda-statement-struct.c:1061
+#: ../libgda/sql-parser/gda-statement-struct.c:1071
+#: ../libgda/sql-parser/gda-statement-struct.c:1083
+#: ../libgda/sql-parser/gda-statement-struct.c:1091
+msgid "Wrong number of operands"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:1097
+#, c-format
+msgid "Unknown operator %d"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:1120
+msgid "Missing expression in select field"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:1129
+msgid "Missing expression in select target"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:1138
+msgid ""
+"Join can't at the same time specify a join condition and a list of fields to "
+"join on"
+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 ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:1152
+msgid "Empty FROM clause"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct.c:1427
+msgid "Select field is not in a SELECT statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:220
+msgid "COMPOUND statement contains an undefined COMPOUND statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:229
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:268
+msgid "COMPOUND statement contains an undefined SELECT statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:238
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:280
+msgid "COMPOUND statement contains a non SELECT statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:252
+msgid "COMPOUND statement does not contain any SELECT statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:258
+msgid "COMPOUND statement only contains one SELECT statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:288
+msgid "COMPOUND statement contains an empty SELECT statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-compound.c:294
+msgid "All statements in a COMPOUND must have the same number of columns"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-delete.c:160
+msgid "DELETE statement needs a table to delete from"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:351
+msgid "INSERT statement needs a table to insert into"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:357
+msgid "Can't specify values to insert and SELECT statement in INSERT statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:376
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:402
+msgid ""
+"INSERT statement does not have the same number of target columns and "
+"expressions"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-insert.c:405
+msgid "VALUES lists must all be the same length in INSERT statement"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-select.c:400
+msgid "SELECT does not contain any expression"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-select.c:406
+msgid "SELECT can't have a DISTINCT expression if DISTINCT is not set"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-select.c:412
+msgid "SELECT can't have a HAVING without GROUP BY"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-select.c:418
+msgid "SELECT can't have a limit offset without a limit"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-select.c:443
+#: ../libgda/sql-parser/gda-statement-struct-select.c:452
+#, c-format
+msgid "Multiple targets named or aliased '%s'"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-update.c:277
+msgid "UPDATE statement needs a table to update data"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-update.c:283
+msgid ""
+"UPDATE statement does not have the same number of target columns and "
+"expressions"
+msgstr ""
+
+#: ../libgda/sql-parser/gda-statement-struct-update.c:289
+msgid "UPDATE statement does not have any target columns to update"
+msgstr ""
+
+#: ../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
+#, c-format
+msgid "A connection is required"
+msgstr ""
+
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1059
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1153
+msgid "Signal does not exist\n"
+msgstr ""
+
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1068
+msgid "Signal to connect to must not have a return value\n"
+msgstr ""
+
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1140
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1207
+#, c-format
+msgid "Signal %lu does not exist"
+msgstr ""
+
+#: ../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
+#, c-format
+msgid "Could not find the '%s' program"
+msgstr ""
+
+#: ../libgda-report/DocBook/gda-report-docbook-document.c:299
+msgid "Could not find the DocBook XSL stylesheet for HTML"
+msgstr ""
+
+#: ../libgda-report/DocBook/gda-report-docbook-document.c:367
+msgid "Could not find the DocBook XSL stylesheet for Formatting Objects"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:308
+#, c-format
+msgid "Object type '%s' cannot be declared in this context"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:316
+#, c-format
+msgid "An object with the '%s' name has already been declared"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:351
+#, c-format
+msgid "Object type '%s' cannot be requested in this context"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:570
+#, c-format
+msgid "Unknown query '%s'"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:581
+#: ../libgda-report/engine/gda-report-engine.c:608 ../tools/gda-sql.c:2981
+#: ../tools/gda-sql.c:3063 ../tools/gda-sql.c:3163 ../tools/gda-sql.c:3239
+#, c-format
+msgid "No connection named '%s' found"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:653
+msgid "Query is not specified (not named and not defined)"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:817
+#: ../libgda-report/engine/gda-report-engine.c:959
+#: ../libgda-report/engine/gda-report-engine.c:1016
+#, c-format
+msgid "Unknown parameter '%s'"
+msgstr "Parameter tak dikenal '%s'"
+
+#: ../libgda-report/engine/gda-report-engine.c:834
+msgid "Parameter name not specified"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:884
+msgid "No expression specified"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:907
+#, c-format
+msgid "Cannot cast value from type '%s' to type '%s'"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:1045
+#, c-format
+msgid "Cannot cast parameter from type '%s' to type '%s'"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:1138
+#, c-format
+msgid "Expression '%s' should return exactly one value"
+msgstr ""
+
+#: ../libgda-report/engine/gda-report-engine.c:1175
+msgid "Binary data"
+msgstr ""
+
+#: ../libgda-report/gda-report-document.c:254
+msgid "Document not specified"
+msgstr ""
+
+#: ../libgda-report/gda-report-document.c:281
+msgid "Cannot create temporary file"
+msgstr ""
+
+#: ../libgda-report/gda-report-document.c:308
+#, c-format
+msgid "Execution of the %s program failed: %s"
+msgstr ""
+
+#: ../libgda-report/gda-report-document.c:346
+#: ../libgda-report/gda-report-document.c:371
+#, c-format
+msgid "This report document does not handle %s output"
+msgstr ""
+
+#: ../libgda-ui/data-entries/common-bin.c:38
+msgid "Select file to load"
+msgstr ""
+
+#: ../libgda-ui/data-entries/common-bin.c:77
+#: ../libgda-ui/data-entries/plugins/common-pict.c:398
+#, c-format
+msgid ""
+"Could not load the contents of '%s':\n"
+" %s"
+msgstr ""
+
+#: ../libgda-ui/data-entries/common-bin.c:108
+msgid "Select a file to save data to"
+msgstr ""
+
+#: ../libgda-ui/data-entries/common-bin.c:154
+#, c-format
+msgid ""
+"Could not save data to '%s':\n"
+" %s"
+msgstr ""
+
+#: ../libgda-ui/data-entries/common-bin.c:194
+msgid "Properties"
+msgstr "Properti"
+
+#: ../libgda-ui/data-entries/common-bin.c:234
+#, c-format
+msgid "%lu Byte"
+msgid_plural "%lu Bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../libgda-ui/data-entries/common-bin.c:266
+#: ../libgda-ui/data-entries/common-bin.c:316
+#: ../libgda-ui/data-entries/plugins/common-pict.c:39
+#: ../libgda-ui/data-entries/plugins/common-pict.c:71
+#, c-format
+msgid "No data"
+msgstr "Tak ada data"
+
+#: ../libgda-ui/data-entries/common-bin.c:271
+#: ../libgda-ui/data-entries/common-bin.c:287
+#: ../libgda-ui/data-entries/common-bin.c:301
+#: ../libgda-ui/data-entries/common-bin.c:305
+msgid "Data size"
+msgstr ""
+
+#: ../libgda-ui/data-entries/common-bin.c:301
+#: ../providers/mysql/gda-mysql-provider.c:623
+#: ../providers/mysql/gda-mysql-util.c:67
+msgid "Unknown"
+msgstr "Tak dikenal"
+
+#. 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:739 ../tools/gda-sql.c:2658
+#: ../tools/gda-sql.c:2833 ../tools/gda-sql.c:4013
+msgid "Value"
+msgstr "Nilai"
+
+#: ../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
+msgid "GValue to render"
+msgstr ""
+
+#: ../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
+msgid "Editable"
+msgstr "Dapat disunting"
+
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-boolean.c:169
+#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-pict.c:196
+msgid "The toggle button can be activated"
+msgstr "Tombol jungkit dapat diaktifkan"
+
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:161
+msgid "Values limited to PK fields"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:162
+msgid "GList of GValue to render, limited to PK fields"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:168
+msgid "Values"
+msgstr "Nilai"
+
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c:169
+msgid "GList of GValue to render, not limited to PK fields "
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-info.c:161
+msgid "The information and status changer can be activated"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:408
+#: ../libgda-ui/data-entries/gdaui-entry-string.c:399
+msgid "<string cut because too long>"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:433
+#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:273
+#, c-format
+msgid ""
+"Data cell renderer's specified type (%s) differs from actual value to "
+"display type (%s)"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:440
+#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:279
+#, c-format
+msgid ""
+"Data cell renderer asked to display values of different data types, at least "
+"%s and %s, which means the data model has some incoherencies"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-data-cell-renderer-textual.c:490
+#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-password.c:298
+msgid "<non-printable>"
+msgstr ""
+
+#: ../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
+msgid "Invalid UTF-8 format!"
+msgstr ""
+
+#. format tooltip
+#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1053
+msgid "Format is hh:mm:ss"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-shell.c:245
+#, 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 ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-shell.c:407
+msgid "Value is NULL"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-shell.c:413
+msgid "Value will be determined by default"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-shell.c:419
+msgid "Value is invalid"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-number.xml.in.h:1
+#, fuzzy
+msgid "A currency symbol"
+msgstr "Simbol, Keuangan"
+
+#: ../libgda-ui/data-entries/gdaui-entry-number.xml.in.h:2
+#, fuzzy
+msgid "Currency symbol"
+msgstr "Simbol, Keuangan"
+
+#: ../libgda-ui/data-entries/gdaui-entry-number.xml.in.h:3
+msgid "Decimals"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-number.xml.in.h:4
+msgid "Number of decimals"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-number.xml.in.h:5
+msgid "Use 1000s separators"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-number.xml.in.h:6
+msgid "Use thousands separator as specified by current locale"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-string.xml.in.h:1
+msgid "Display only one line, or a complete text editor"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-string.xml.in.h:2
+msgid "Hidden"
+msgstr "Tersembunyi"
+
+#: ../libgda-ui/data-entries/gdaui-entry-string.xml.in.h:3
+msgid ""
+"If set to TRUE, characters are all displayed using a single 'invisible' "
+"character, suitable to enter passwords"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-string.xml.in.h:4
+msgid "Maximum acceptable length of the text"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-entry-string.xml.in.h:5
+msgid "Maximum length"
+msgstr "Panjang maksimum"
+
+#: ../libgda-ui/data-entries/gdaui-entry-string.xml.in.h:6
+msgid "Multiline"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-formatted-entry.c:274
+#, c-format
+msgid "Unknown format character starting at %s"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-numeric-entry.c:266
+#, c-format
+msgid "Type %s is not numerical"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-numeric-entry.c:279
+#, c-format
+msgid "Decimal separator cannot be the '%c' character"
+msgstr ""
+
+#: ../libgda-ui/data-entries/gdaui-numeric-entry.c:288
+#, c-format
+msgid "Decimal thousands cannot be the '%c' character"
+msgstr ""
+
+#: ../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
+#, c-format
+msgid "Empty data"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/common-pict.c:114
+#, c-format
+msgid "Unhandled type of data"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/common-pict.c:211
+#, c-format
+msgid ""
+"Error while deserializing data:\n"
+"%s"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/common-pict.c:221
+#: ../libgda-ui/data-entries/plugins/common-pict.c:264
+#, c-format
+msgid ""
+"Error while interpreting data as an image:\n"
+"%s"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/common-pict.c:315
+msgid "_Load image from file"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/common-pict.c:322
+msgid "_Save image"
+msgstr "_Simpan gambar"
+
+#: ../libgda-ui/data-entries/plugins/common-pict.c:339
+msgid "Select image to load"
+msgstr ""
+
+#. determine writable formats
+#: ../libgda-ui/data-entries/plugins/common-pict.c:444
+msgid "Image format"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/common-pict.c:448
+msgid "Format image as:"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/common-pict.c:460
+msgid "Current format"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/common-pict.c:463
+msgid "Select a file to save the image to"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/common-pict.c:507
+#, c-format
+msgid ""
+"Could not save the image to '%s':\n"
+" %s"
+msgstr ""
+
+#. list of fields
+#: ../libgda-ui/data-entries/plugins/gda-sql.lang.h:1
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:9
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:34
+msgid "Comment"
+msgstr "Komentar"
+
+#: ../libgda-ui/data-entries/plugins/gda-sql.lang.h:2
+msgid "Data Type"
+msgstr "Jenis Data"
+
+#: ../libgda-ui/data-entries/plugins/gda-sql.lang.h:3
+msgid "Decimal"
+msgstr "Desimal"
+
+#: ../libgda-ui/data-entries/plugins/gda-sql.lang.h:4
+#, fuzzy
+msgid "Floating Point"
+msgstr "Titik Ambang"
+
+#: ../libgda-ui/data-entries/plugins/gda-sql.lang.h:5
+msgid "Function"
+msgstr "Fungsi"
+
+#: ../libgda-ui/data-entries/plugins/gda-sql.lang.h:6
+msgid "GDA-SQL"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gda-sql.lang.h:7
+msgid "Keyword"
+msgstr "Kata Kunci"
+
+#: ../libgda-ui/data-entries/plugins/gda-sql.lang.h:8
+msgid "No idea what it is"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gda-sql.lang.h:9
+msgid "Sources"
+msgstr "Sumber"
+
+#: ../libgda-ui/data-entries/plugins/gda-sql.lang.h:10
+msgid "String"
+msgstr "String"
+
+#: ../libgda-ui/data-entries/plugins/gda-sql.lang.h:11
+msgid "Variable"
+msgstr "Variabel"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cidr.c:257
+msgid "Mask settings"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cidr.c:263
+msgid "Set to host mask"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-cidr.c:272
+#, c-format
+msgid "Set to class %c network"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel-spec.xml.in.h:1
+msgid "Let the user name an existing or new folder"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel-spec.xml.in.h:2
+msgid "Let the user pick an existing file, or type in a new filename"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel-spec.xml.in.h:3
+msgid "Let the user pick an existing folder"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel-spec.xml.in.h:4
+msgid "Only let the user pick an existing file"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel-spec.xml.in.h:5
+msgid "Selection model"
+msgstr "Model pilihan"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel-spec.xml.in.h:6
+msgid "Specifies what the user will be allowed to select"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel.c:194
+msgid "Choose a file"
+msgstr "Pilih berkas"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel.c:196
+msgid "Choose a directory"
+msgstr "Pilih direktori"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-filesel.c:232
+msgid "Choose"
+msgstr "Pilih"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-password.xml.in.h:1
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict-spec_string.xml.in.h:2
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:14
+msgid "Encoding"
+msgstr "Pengkodean"
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-password.xml.in.h:2
+msgid "How password should be encoded"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-password.xml.in.h:3
+msgid "MD5 Sum"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-password.xml.in.h:4
+msgid "No encoding"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict-spec.xml.in.h:1
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict-spec_string.xml.in.h:4
+msgid "Serialized picture"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict-spec.xml.in.h:2
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict-spec_string.xml.in.h:5
+msgid ""
+"Set to TRUE if data comes from a serialized GdkPixbuf (F-Spot for example)"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict-spec_string.xml.in.h:1
+msgid "Base 64"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict-spec_string.xml.in.h:3
+msgid "Encoding used to convert binary data to the string"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-pict.c:258
+msgid "No data to display"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:1
+msgid "Break lines in between words"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:2
+msgid "Break lines in between words or graphemes"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:3
+msgid "Define to enable syntactical colourisation"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:4
+msgid "Defines how long lines are wrapped"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:5
+msgid "Do not wrap lines"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:6
+msgid "Lines wrapping"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:7
+msgid "Programming language"
+msgstr ""
+
+#: ../libgda-ui/data-entries/plugins/gdaui-entry-text-spec.xml.in.h:8
+msgid "break lines anywhere the cursor can appear"
+msgstr ""
+
+#: ../libgda-ui/data/server_operation.glade.h:1
+#: ../tools/browser/schema-browser/table-info.c:378
+msgid "Columns"
+msgstr "Kolom"
+
+#: ../libgda-ui/data/server_operation.glade.h:2
+msgid "Constraints"
+msgstr ""
+
+#: ../libgda-ui/data/server_operation.glade.h:3
+#, fuzzy
+msgid "Foreign keys"
+msgstr "Kunci foreign:"
+
+#: ../libgda-ui/data/server_operation.glade.h:4 ../tools/gda-sql.c:1996
+#: ../tools/gda-sql.c:2095 ../tools/gda-sql.c:2107 ../tools/gda-sql.c:2119
+#: ../tools/gda-sql.c:2227 ../tools/gda-sql.c:2239 ../tools/gda-sql.c:2251
+#: ../tools/gda-sql.c:2445
+msgid "General"
+msgstr "Umum"
+
+#: ../libgda-ui/data/server_operation.glade.h:6
+msgid "hello"
+msgstr ""
+
+#: ../libgda-ui/demos/main.c:760
+#, c-format
+msgid "Can't find demo database file: %s"
+msgstr ""
+
+#: ../libgda-ui/demos/main.c:770
+#, c-format
+msgid ""
+"Error opening the connection for file '%s':\n"
+"%s\n"
+msgstr ""
+
+#: ../libgda-ui/demos/main.c:798
+msgid "Libgda-ui Code Demos"
+msgstr ""
+
+#: ../libgda-ui/demos/main.c:853
+#, c-format
+msgid ""
+"<b><big>Note:\n"
+"</big></b>Many of the demonstrated items use an\n"
+"opened connection to the SQLite using the\n"
+"'%s' file.\n"
+"\n"
+"In the source code shown here, the <i>demo_cnc</i> and \n"
+"<i>demo_parser</i> objects are created by the framework and\n"
+"made available to all the demonstrated items."
+msgstr ""
+
+#: ../libgda-ui/internal/gdaui-provider-auth-editor.c:406
+msgid "Can't set authentification string: no authentication is needed"
+msgstr ""
+
+#: ../libgda-ui/internal/gdaui-provider-spec-editor.c:196
+#, c-format
+msgid "Unknown provider '%s'"
+msgstr ""
+
+#: ../libgda-ui/internal/gdaui-provider-spec-editor.c:200
+#, c-format
+msgid "Provider '%s' does not report the required parameters for DSN"
+msgstr ""
+
+#. set to NULL item
+#: ../libgda-ui/internal/utility.c:80
+#, fuzzy
+msgid "Unset"
+msgstr "Belum diset"
+
+#. default value item
+#: ../libgda-ui/internal/utility.c:93
+msgid "Set to default value"
+msgstr ""
+
+#. reset to original value item
+#: ../libgda-ui/internal/utility.c:106
+msgid "Reset to original value"
+msgstr ""
+
+#: ../libgda-ui/internal/utility.c:394
+msgid "Current modified data is invalid"
+msgstr ""
+
+#: ../libgda-ui/internal/utility.c:396
+msgid ""
+"You may now choose to correct it, or to discard\n"
+"the modifications.\n"
+"\n"
+"What do you wan to do?"
+msgstr ""
+
+#: ../libgda-ui/internal/utility.c:400
+msgid ""
+"please correct it and try again, or discard\n"
+"the modifications."
+msgstr ""
+
+#: ../libgda-ui/internal/utility.c:407
+msgid "Part of the current modified data was invalid"
+msgstr ""
+
+#: ../libgda-ui/internal/utility.c:408
+msgid ""
+"As no transaction was used, only a part of the valid data\n"
+"has been written, and the remaining modification have been discarded."
+msgstr ""
+
+#: ../libgda-ui/internal/utility.c:424
+msgid "Error details"
+msgstr "Rincian galat"
+
+#: ../libgda-ui/internal/utility.c:479
+msgid "Discard modified data"
+msgstr ""
+
+#: ../libgda-ui/internal/utility.c:480
+msgid "Correct data first"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:260
+msgid ""
+"Pointer to an XML layout specification  (as an xmlNodePtr to a <gdaui_form> "
+"node)"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:264
+msgid "List of parameters to show in the form"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:268
+msgid "Entry headers are sensitive"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:273
+msgid "Show Entry actions"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:278
+msgid "Entries Auto-default"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:283
+msgid "TRUE if expanding the form vertically makes sense"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:839 ../libgda-ui/gdaui-raw-grid.c:780
+#: ../libgda-ui/gdaui-raw-grid.c:2619
+#, c-format
+msgid "The '%s' attribute should be a G_TYPE_STRING value"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:1738
+msgid "Can't find data entry for GdaHolder"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:2010
+msgid "Values to be filled"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:2091 ../libgda-ui/gdaui-raw-grid.c:2446
+#, c-format
+msgid "'%s' document not parsed successfully"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:2101 ../libgda-ui/gdaui-raw-grid.c:2456
+#, c-format
+msgid ""
+"'%s' DTD not parsed successfully. XML data layout validation will not be "
+"performed (some errors may occur)"
+msgstr ""
+
+#: ../libgda-ui/gdaui-basic-form.c:2233
+msgid ""
+"size group was not taken into account using "
+"gdaui_basic_form_add_to_size_group()"
+msgstr ""
+
+#: ../libgda-ui/gdaui-cloud.c:244 ../libgda-ui/gdaui-cloud.c:981
+#, c-format
+msgid "Wrong column type for label: expecting a string and got a %s"
+msgstr ""
+
+#: ../libgda-ui/gdaui-cloud.c:1074 ../tools/browser/common/objects-cloud.c:457
+msgid "Find:"
+msgstr "Cari:"
+
+#: ../libgda-ui/gdaui-combo.c:128
+msgid "The data model to display"
+msgstr ""
+
+#: ../libgda-ui/gdaui-combo.c:132
+msgid "Display popup as list"
+msgstr ""
+
+#: ../libgda-ui/gdaui-data-store.c:135
+msgid "Data model"
+msgstr ""
+
+#: ../libgda-ui/gdaui-data-store.c:139
+msgid "Internal GdaDataProxy data model"
+msgstr ""
+
+#: ../libgda-ui/gdaui-data-store.c:382
+msgid "Trying to modify a read-only row"
+msgstr ""
+
+#: ../libgda-ui/gdaui-data-filter.c:182
+msgid "Filter failed:"
+msgstr ""
+
+#: ../libgda-ui/gdaui-data-filter.c:216
+msgid "Filter"
+msgstr "Tapis"
+
+#: ../libgda-ui/gdaui-data-filter.c:216
+msgid "any valid SQL expression"
+msgstr ""
+
+#: ../libgda-ui/gdaui-data-filter.c:232
+msgid "Set filter"
+msgstr ""
+
+#: ../libgda-ui/gdaui-data-filter.c:237
+msgid "Clear filter"
+msgstr ""
+
+#: ../libgda-ui/gdaui-init.c:70
+msgid "Attempt to initialize an already initialized library"
+msgstr ""
+
+#: ../libgda-ui/gdaui-init.c:465
+msgid "Could not open plugins directory, no plugin loaded."
+msgstr ""
+
+#: ../libgda-ui/gdaui-init.c:485
+#: ../tools/browser/data-manager/data-widget.c:608
+#: ../tools/browser/data-manager/data-widget.c:613
+#: ../tools/browser/data-manager/data-widget.c:615
+#: ../tools/browser/data-manager/xml-spec-editor.c:235
+#: ../tools/browser/query-exec/query-result.c:256 ../tools/web-server.c:2017
+#, c-format
+msgid "Error: %s"
+msgstr "Galat: %s"
+
+#: ../libgda-ui/gdaui-init.c:492
+#, fuzzy, c-format
+msgid "Loading file %s...\n"
+msgstr "Membuka berkas '%s'..."
+
+#: ../libgda-ui/gdaui-init.c:495
+#, c-format
+msgid "Plugins load warning: %s"
+msgstr ""
+
+#. radio buttons
+#: ../libgda-ui/gdaui-login.c:169
+msgid "Use data source:"
+msgstr ""
+
+#: ../libgda-ui/gdaui-login.c:177
+msgid "Specify connection:"
+msgstr ""
+
+#. Create the DSN add button
+#: ../libgda-ui/gdaui-login.c:191
+#, fuzzy
+msgid "Data sources..."
+msgstr "Sumber Data"
+
+#: ../libgda-ui/gdaui-login.c:420
+msgid "Could not execute the Database access control center"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-form.c:179 ../libgda-ui/gdaui-raw-grid.c:285
+msgid "Data to display"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-form.c:605
+#, c-format
+msgid "Can't append row to data model: %s"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:290
+msgid ""
+"Pointer to an XML layout specification (as an xmlNodePtr to a <gdaui_grid> "
+"node)"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:293
+msgid "Info cell visible"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:297
+msgid "Global Actions visible"
+msgstr ""
+
+#. FIXME: if nullok is FALSE, then set the column title in bold
+#: ../libgda-ui/gdaui-raw-grid.c:742 ../libgda-ui/gdaui-raw-grid.c:765
+msgid "Can't be NULL"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:773
+msgid "No title"
+msgstr "Tanpa Judul"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1762
+msgid "Select _All"
+msgstr "Pilih Semu_a"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1767
+#, fuzzy
+msgid "_Clear Selection"
+msgstr "Hapus bagian yang dipilih"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1770
+msgid "Show Column _Titles"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:1775
+msgid "_Set filter"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:1778
+msgid "_Unset filter"
+msgstr ""
+
+#. create dialog box
+#: ../libgda-ui/gdaui-raw-grid.c:1878
+msgid "Saving Data"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:1886
+msgid "Saving data to a file"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:1887
+msgid ""
+"The data will be exported without any of the modifications which may have "
+"been made and have not been committed."
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:1902
+msgid "File name"
+msgstr "Nama berkas"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1921
+msgid "Details"
+msgstr "Rincian"
+
+#. file type
+#: ../libgda-ui/gdaui-raw-grid.c:1942
+msgid "File type:"
+msgstr "Jenis berkas:"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1952
+msgid "Tab-delimited"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:1953
+msgid "Comma-delimited"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:1954
+msgid "XML"
+msgstr "XML"
+
+#. limit to selection ?
+#: ../libgda-ui/gdaui-raw-grid.c:1961
+msgid "Limit to selection?"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:1982
+msgid "Other options"
+msgstr "Opsi lain"
+
+#: ../libgda-ui/gdaui-raw-grid.c:1989
+msgid "Empty string when NULL?"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:1992 ../libgda-ui/gdaui-raw-grid.c:1997
+msgid "Export NULL values as an empty \"\" string"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:1999
+msgid "Invalid data as NULL?"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:2002 ../libgda-ui/gdaui-raw-grid.c:2007
+msgid ""
+"Don't export invalid data,\n"
+"but export a NULL value instead"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:2009
+msgid "Field names on first row?"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:2012 ../libgda-ui/gdaui-raw-grid.c:2017
+msgid "Add a row at beginning with columns names"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:2184
+#, c-format
+msgid "Could not save file %s"
+msgstr "Tak dapat menyimpan berkas %s"
+
+#: ../libgda-ui/gdaui-raw-grid.c:2192
+msgid "You must specify a file name"
+msgstr "Anda harus menyatakan suatu nama berkas"
+
+#: ../libgda-ui/gdaui-raw-grid.c:2198
+msgid "Got empty file while converting the data"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:2211
+#, c-format
+msgid ""
+"File '%s' already exists.\n"
+"Do you want to overwrite it?"
+msgstr ""
+
+#: ../libgda-ui/gdaui-raw-grid.c:2221
+msgid "If you choose yes, the contents will be lost."
+msgstr ""
+
+#: ../libgda-ui/gdaui-server-operation.c:196
+msgid "The specification of the operation to implement"
+msgstr ""
+
+#: ../libgda-ui/gdaui-server-operation.c:202
+msgid "Request section header to be hidden if there is only one section"
+msgstr ""
+
+#. last row is for new entries
+#: ../libgda-ui/gdaui-server-operation.c:596
+#: ../tools/browser/data-manager/data-console.c:391
+msgid "Add"
+msgstr "Tambah"
+
+#: ../libgda-ui/gdaui-server-operation.c:1113
+msgid "Server operation specification"
+msgstr ""
+
+#: ../libgda-ui/gdaui-server-operation.c:1173
+msgid "<b>Field properties:</b>"
+msgstr ""
+
+#: ../libgda-ui/gdaui-server-operation.c:1192
+msgid "<b>Fields:</b>"
+msgstr ""
+
+#: ../libgda-ui/gdaui-server-operation.c:1241
+msgid "Add a new field"
+msgstr ""
+
+#: ../libgda-ui/gdaui-server-operation.c:1243
+msgid "Remove selected field"
+msgstr ""
+
+#: ../libgda-ui/gdaui-tree-store.c:267
+msgid "GdaTree to use"
+msgstr ""
+
+#: ../libgda-ui/gdaui-tree-store.c:595
+#, c-format
+msgid "Unknown column number %d"
+msgstr ""
+
+#: ../libgda-ui/gdaui-tree-store.c:611
+#, c-format
+msgid "Type mismatch: expected a value of type %s and got of type %s"
+msgstr ""
+
+#: ../providers/bdb/bdb_specs_dsn.xml.in.h:1
+msgid "Berkeley DB database filename to be used"
+msgstr ""
+
+#: ../providers/bdb/bdb_specs_dsn.xml.in.h:2
+msgid "Database file"
+msgstr ""
+
+#. DSN parameters
+#: ../providers/bdb/bdb_specs_dsn.xml.in.h:3
+#: ../providers/bdbsql/bdbsql_specs_create_db.xml.in.h:2
+#: ../providers/bdbsql/bdbsql_specs_drop_db.xml.in.h:2
+#: ../providers/bdbsql/bdbsql_specs_dsn.xml.in.h:1
+#: ../providers/mdb/mdb_specs_dsn.xml.in.h:1
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:32
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:4
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:2
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:9
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:6
+#: ../providers/postgres/postgres_specs_dsn.xml.in.h:1
+#: ../providers/sqlite/sqlite_specs_create_db.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_drop_db.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_dsn.xml.in.h:1
+#: ../providers/web/web_specs_dsn.xml.in.h:1
+msgid "Database name"
+msgstr ""
+
+#. DSN parameters
+#: ../providers/bdb/bdb_specs_dsn.xml.in.h:4
+#: ../providers/bdbsql/bdbsql_specs_create_db.xml.in.h:6
+#: ../providers/bdbsql/bdbsql_specs_drop_db.xml.in.h:6
+#: ../providers/bdbsql/bdbsql_specs_dsn.xml.in.h:2
+#: ../providers/mdb/mdb_specs_dsn.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_create_db.xml.in.h:6
+#: ../providers/sqlite/sqlite_specs_drop_db.xml.in.h:6
+#: ../providers/sqlite/sqlite_specs_dsn.xml.in.h:2
+msgid "Directory"
+msgstr "Direktori"
+
+#: ../providers/bdb/bdb_specs_dsn.xml.in.h:5
+#: ../providers/bdbsql/bdbsql_specs_dsn.xml.in.h:3
+#: ../providers/mdb/mdb_specs_dsn.xml.in.h:3
+#: ../providers/sqlite/sqlite_specs_dsn.xml.in.h:3
+msgid "Directory where the database file is stored"
+msgstr ""
+
+#: ../providers/bdb/bdb_specs_dsn.xml.in.h:6
+msgid "Name of the database in the database file to be used"
+msgstr ""
+
+#: ../providers/bdb/gda-bdb-provider.c:164
+msgid "The DB_NAME parameter is not defined in the connection string."
+msgstr ""
+
+#: ../providers/bdb/gda-bdb-provider.c:192
+msgid "An error occurred while accessing the BDB database"
+msgstr ""
+
+#: ../providers/bdb/gda-bdb-provider.c:200
+#: ../providers/mdb/gda-mdb-provider.c:315
+msgid "Can't open virtual connection"
+msgstr ""
+
+#: ../providers/bdb/gda-bdb-provider.c:207
+#, c-format
+msgid "Could not add BDB data model to connection: %s"
+msgstr ""
+
+#: ../providers/bdb/gda-bdb-provider.c:219
+msgid "-"
+msgstr "-"
+
+#: ../providers/bdb/libmain.c:72
+msgid "Provider for Berkeley databases"
+msgstr ""
+
+#. list of fields
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:1
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:4
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:2
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:6
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:24
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:2
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:1
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:5
+#: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:1
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:4
+msgid "Check"
+msgstr "Centang"
+
+#. list of fields
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:2
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:6
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:4
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:7
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:26
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:4
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:2
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:7
+#: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:6
+msgid "Check constraint"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:3
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:8
+#: ../providers/mysql/mysql_specs_comment_column.xml.in.h:1
+#: ../providers/mysql/mysql_specs_drop_column.xml.in.h:1
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:3
+#: ../providers/postgres/postgres_specs_drop_column.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:3
+msgid "Column's description"
+msgstr "Keterangan kolom"
+
+#. list of fields
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:5
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:19
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:8
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:11
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:55
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:8
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:5
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:13
+#: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:5
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:19
+#: ../tools/command-exec.c:718 ../tools/web-server.c:928
+msgid "Default"
+msgstr "Baku"
+
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:6
+#: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:6
+msgid "Default value, mandatory if column is NOT NULL"
+msgstr ""
+
+#. list of fields
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:8
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:28
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:17
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:14
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:137
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:17
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:10
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:43
+#: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:8
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:28
+msgid "Not NULL"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_add_column.xml.in.h:12
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:39
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:23
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:19
+#: ../providers/mysql/mysql_specs_comment_column.xml.in.h:5
+#: ../providers/mysql/mysql_specs_comment_table.xml.in.h:4
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:176
+#: ../providers/mysql/mysql_specs_drop_column.xml.in.h:4
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:23
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:15
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:69
+#: ../providers/postgres/postgres_specs_drop_column.xml.in.h:7
+#: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:12
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:39
+msgid "Table's name"
+msgstr ""
+
+#. DSN parameters
+#: ../providers/bdbsql/bdbsql_specs_create_db.xml.in.h:4
+#: ../providers/bdbsql/bdbsql_specs_drop_db.xml.in.h:4
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:37
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:9
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:13
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:10
+#: ../providers/sqlite/sqlite_specs_create_db.xml.in.h:4
+#: ../providers/sqlite/sqlite_specs_drop_db.xml.in.h:4
+msgid "Database's description"
+msgstr ""
+
+#. DSN parameters
+#: ../providers/bdbsql/bdbsql_specs_create_db.xml.in.h:8
+#: ../providers/bdbsql/bdbsql_specs_drop_db.xml.in.h:8
+#: ../providers/sqlite/sqlite_specs_create_db.xml.in.h:8
+#: ../providers/sqlite/sqlite_specs_drop_db.xml.in.h:8
+msgid "Directory where the database file will be"
+msgstr ""
+
+#. DSN parameters
+#: ../providers/bdbsql/bdbsql_specs_create_db.xml.in.h:10
+#: ../providers/bdbsql/bdbsql_specs_drop_db.xml.in.h:10
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:86
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:22
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:67
+#: ../providers/sqlite/sqlite_specs_create_db.xml.in.h:10
+#: ../providers/sqlite/sqlite_specs_drop_db.xml.in.h:10
+msgid "The name of a database to create"
+msgstr ""
+
+#. To translators: "Compare method" refers to the method SQLite has to compare values
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:2
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:8
+#: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:8
+msgid "Collation name (BINARY|NOCASE)"
+msgstr ""
+
+#. To translators: "Compare method" refers to the method SQLite has to compare values
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:4
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:10
+#: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:4
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:10
+msgid "Compare method"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:5
+#: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:5
+msgid "Create index only if it does not yet exist"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:6
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:1
+#: ../providers/postgres/postgres_specs_create_index.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:6
+msgid "Index description"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:7
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:2
+#: ../providers/postgres/postgres_specs_create_index.xml.in.h:3
+#: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:7
+msgid "Index name"
+msgstr ""
+
+#. Index fields
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:9
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:5
+#: ../providers/postgres/postgres_specs_create_index.xml.in.h:5
+#: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:9
+msgid "Indexed field or expression"
+msgstr ""
+
+#. Index fields
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:11
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:7
+#: ../providers/postgres/postgres_specs_create_index.xml.in.h:7
+#: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:11
+msgid "Indexed field(s)"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:13
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:12
+#: ../providers/mysql/mysql_specs_drop_index.xml.in.h:3
+#: ../providers/postgres/postgres_specs_create_index.xml.in.h:10
+#: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:13
+msgid "On table"
+msgstr ""
+
+#. DSN parameters
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:14
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:29
+#: ../providers/bdbsql/bdbsql_specs_create_view.xml.in.h:4
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:75
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:142
+#: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:14
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:29
+#: ../providers/sqlite/sqlite_specs_create_view.xml.in.h:4
+msgid "Only if it does not yet exist"
+msgstr ""
+
+#. Index fields
+#: ../providers/bdbsql/bdbsql_specs_create_index.xml.in.h:16
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:14
+#: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:16
+msgid "Sort type"
+msgstr "Jenis pengurutan"
+
+#. list of fields
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:2
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:5
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:10
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:2
+#: ../tools/command-exec.c:581 ../tools/command-exec.c:584
+#: ../tools/web-server.c:898 ../tools/web-server.c:901
+msgid "Auto increment"
+msgstr ""
+
+#. list of fields
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:12
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:12
+msgid "Conflict"
+msgstr ""
+
+#. list of fields
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:14
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:14
+msgid "Conflict resolution method (ROLLBACK|ABORT|FAIL|IGNORE|REPLACE"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:15
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:39
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:15
+msgid "Create table only if it does not yet exist"
+msgstr ""
+
+#. other table constraints
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:25
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:14
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:91
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:14
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:31
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:25
+msgid "Global constraints"
+msgstr ""
+
+#. list of fields
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:31
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:19
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:15
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:149
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:19
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:11
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:52
+#: ../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:809
+#, fuzzy
+msgid "Primary key"
+msgstr "Kunci primer:"
+
+#. list of fields
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:37
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:21
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:171
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:21
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:67
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:37
+msgid "Table's columns"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:38
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:22
+#: ../providers/mysql/mysql_specs_comment_table.xml.in.h:3
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:173
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:22
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:68
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:38
+msgid "Table's description"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:40
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:179
+#: ../providers/mysql/mysql_specs_drop_table.xml.in.h:9
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:71
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:40
+msgid "Temporary table"
+msgstr ""
+
+#. list of fields
+#: ../providers/bdbsql/bdbsql_specs_create_table.xml.in.h:42
+#: ../providers/jdbc/jdbc_specs_create_table.xml.in.h:25
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:20
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:189
+#: ../providers/oracle/oracle_specs_create_table.xml.in.h:25
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:16
+#: ../providers/postgres/postgres_specs_create_index.xml.in.h:13
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:73
+#: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:42
+#: ../tools/command-exec.c:932
+msgid "Unique"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_create_view.xml.in.h:1
+#: ../providers/sqlite/sqlite_specs_create_view.xml.in.h:1
+msgid "Create view only if it does not yet exist"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_create_view.xml.in.h:5
+#: ../providers/postgres/postgres_specs_create_view.xml.in.h:6
+#: ../providers/sqlite/sqlite_specs_create_view.xml.in.h:5
+msgid "Temporary view"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_create_view.xml.in.h:6
+#: ../providers/mysql/mysql_specs_create_view.xml.in.h:6
+#: ../providers/postgres/postgres_specs_create_view.xml.in.h:7
+#: ../providers/sqlite/sqlite_specs_create_view.xml.in.h:6
+#, fuzzy
+msgid "View's definition"
+msgstr "Definisi view:"
+
+#: ../providers/bdbsql/bdbsql_specs_create_view.xml.in.h:7
+#: ../providers/mysql/mysql_specs_create_view.xml.in.h:7
+#: ../providers/postgres/postgres_specs_create_view.xml.in.h:8
+#: ../providers/sqlite/sqlite_specs_create_view.xml.in.h:7
+msgid "View's description"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_create_view.xml.in.h:8
+#: ../providers/mysql/mysql_specs_create_view.xml.in.h:8
+#: ../providers/postgres/postgres_specs_create_view.xml.in.h:9
+#: ../providers/sqlite/sqlite_specs_create_view.xml.in.h:8
+msgid "View's name"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_drop_index.xml.in.h:1
+#: ../providers/sqlite/sqlite_specs_drop_index.xml.in.h:1
+msgid "Drop index only if it exists"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_drop_index.xml.in.h:2
+#: ../providers/bdbsql/bdbsql_specs_drop_table.xml.in.h:2
+#: ../providers/bdbsql/bdbsql_specs_drop_view.xml.in.h:2
+#: ../providers/mysql/mysql_specs_drop_table.xml.in.h:4
+#: ../providers/mysql/mysql_specs_drop_view.xml.in.h:2
+#: ../providers/postgres/postgres_specs_drop_role.xml.in.h:2
+#: ../providers/postgres/postgres_specs_drop_user.xml.in.h:2
+#: ../providers/postgres/postgres_specs_drop_view.xml.in.h:3
+#: ../providers/sqlite/sqlite_specs_drop_index.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_drop_table.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_drop_view.xml.in.h:2
+msgid "If exists"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_drop_index.xml.in.h:4
+#: ../providers/mysql/mysql_specs_drop_index.xml.in.h:2
+#: ../providers/postgres/postgres_specs_drop_index.xml.in.h:3
+#: ../providers/sqlite/sqlite_specs_drop_index.xml.in.h:4
+msgid "Index to delete"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_drop_table.xml.in.h:1
+#: ../providers/mysql/mysql_specs_drop_table.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_drop_table.xml.in.h:1
+msgid "Drop table only if it exists"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_drop_table.xml.in.h:4
+#: ../providers/mysql/mysql_specs_drop_table.xml.in.h:8
+#: ../providers/postgres/postgres_specs_drop_table.xml.in.h:5
+#: ../providers/sqlite/sqlite_specs_drop_table.xml.in.h:4
+msgid "Table to delete"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_drop_view.xml.in.h:1
+#: ../providers/mysql/mysql_specs_drop_view.xml.in.h:1
+#: ../providers/postgres/postgres_specs_drop_view.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_drop_view.xml.in.h:1
+msgid "Drop view only if it exists"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_drop_view.xml.in.h:4
+#: ../providers/mysql/mysql_specs_drop_view.xml.in.h:4
+#: ../providers/postgres/postgres_specs_drop_view.xml.in.h:7
+#: ../providers/sqlite/sqlite_specs_drop_view.xml.in.h:4
+msgid "View to delete"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_dsn.xml.in.h:4
+#: ../providers/sqlite/sqlite_specs_dsn.xml.in.h:4
+msgid "Enable usage of some extra functions in SQL"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_dsn.xml.in.h:5
+#: ../providers/sqlite/sqlite_specs_dsn.xml.in.h:5
+msgid "Enforce foreign keys"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_dsn.xml.in.h:6
+#: ../providers/sqlite/sqlite_specs_dsn.xml.in.h:6
+msgid "Extra functions"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_dsn.xml.in.h:7
+#: ../providers/sqlite/sqlite_specs_dsn.xml.in.h:7
+msgid "The name of a database to use (without the .db)"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_dsn.xml.in.h:8
+#: ../providers/sqlite/sqlite_specs_dsn.xml.in.h:8
+msgid "With foreign keys"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_rename_table.xml.in.h:1
+#: ../providers/mysql/mysql_specs_rename_table.xml.in.h:1
+#: ../providers/postgres/postgres_specs_rename_table.xml.in.h:1
+#: ../providers/sqlite/sqlite_specs_rename_table.xml.in.h:1
+msgid "New name"
+msgstr "Nama baru"
+
+#: ../providers/bdbsql/bdbsql_specs_rename_table.xml.in.h:2
+#: ../providers/mysql/mysql_specs_rename_table.xml.in.h:2
+#: ../providers/postgres/postgres_specs_rename_table.xml.in.h:2
+#: ../providers/sqlite/sqlite_specs_rename_table.xml.in.h:2
+msgid "New table name"
+msgstr ""
+
+#: ../providers/bdbsql/bdbsql_specs_rename_table.xml.in.h:4
+#: ../providers/mysql/mysql_specs_rename_table.xml.in.h:4
+#: ../providers/postgres/postgres_specs_rename_table.xml.in.h:4
+#: ../providers/sqlite/sqlite_specs_rename_table.xml.in.h:4
+msgid "Table to rename"
+msgstr ""
+
+#: ../providers/bdbsql/libmain.c:50
+msgid "Can't find libdb_sql-5."
+msgstr ""
+
+#: ../providers/bdbsql/libmain.c:88
+msgid "Provider for BDB SQL databases"
+msgstr ""
+
+#: ../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
+msgid "Invalid argument: NULL"
+msgstr ""
+
+#: ../providers/jdbc/GdaInputStream.c:54
+#: ../providers/jdbc/GdaInputStream.c:127
+msgid "Can't read BLOB"
+msgstr ""
+
+#: ../providers/jdbc/GdaJValue.c:167
+#, c-format
+msgid "Invalid date: year %d, month %d and day %d"
+msgstr ""
+
+#: ../providers/jdbc/GdaJValue.c:385
+msgid "Can't get BLOB's size"
+msgstr ""
+
+#: ../providers/jdbc/gda-jdbc-provider.c:363
+msgid "The connection string must contain the URL value"
+msgstr ""
+
+#: ../providers/jdbc/jdbc_specs_dsn.xml.in.h:1
+msgid "Connection URL"
+msgstr ""
+
+#: ../providers/jdbc/libmain.c:154 ../providers/jdbc/libmain.c:164
+#, c-format
+msgid "Can't get list of installed JDBC drivers: %s"
+msgstr ""
+
+#: ../providers/jdbc/libmain.c:477
+#, c-format
+msgid "Can't create JAVA virtual machine: %s"
+msgstr ""
+
+#: ../providers/jdbc/libmain.c:485
+msgid "Could not the JVM runtime (libjvm.so), JDBC provider is unavailable."
+msgstr ""
+
+#: ../providers/mdb/gda-mdb-provider.c:273
+#: ../providers/mdb/gda-mdb-provider.c:280
+#, c-format
+msgid ""
+"The connection string format has changed: replace FILENAME with DB_DIR (the "
+"path to the database file) and DB_NAME (the database file without the '%s' "
+"at the end)."
+msgstr ""
+
+#: ../providers/mdb/gda-mdb-provider.c:307
+#, c-format
+msgid "Could not open file %s"
+msgstr "Tak dapat membuka berkas %s"
+
+#: ../providers/mdb/gda-mdb-provider.c:351
+#, c-format
+msgid "Could not map table '%s': %s"
+msgstr ""
+
+#: ../providers/mdb/libmain.c:73
+msgid "Provider for Microsoft Access files"
+msgstr ""
+
+#: ../providers/mdb/mdb_specs_dsn.xml.in.h:4
+msgid "The name of a database to use (filename without the .mdb)"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-ddl.c:263
+#: ../providers/postgres/gda-postgres-ddl.c:274
+msgid "No field specified in foreign key constraint"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-ddl.c:278
+#: ../providers/postgres/gda-postgres-ddl.c:289
+msgid "Empty field specified in foreign key constraint"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-ddl.c:291
+#: ../providers/postgres/gda-postgres-ddl.c:303
+msgid "No referenced table specified in foreign key constraint"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-ddl.c:307
+#: ../providers/postgres/gda-postgres-ddl.c:319
+msgid "Empty referenced field specified in foreign key constraint"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-ddl.c:920
+msgid "Incorrect specified column name"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-handler-boolean.c:123
+msgid "MySQL boolean representation"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-provider.c:480
+msgid "Cannot give a UNIX SOCKET if you also provide either a HOST or a PORT"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-provider.c:532
+#, c-format
+msgid ""
+"Could not set client charset to UTF8. Using %s. It'll be problems with non "
+"UTF-8 characters"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-provider.c:588
+msgid "The connection string must contain the DB_NAME values"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-provider.c:626
+#: ../providers/mysql/gda-mysql-util.c:69
+msgid "No description"
+msgstr "Tanpa keterangan"
+
+#: ../providers/mysql/gda-mysql-provider.c:1752
+msgid "Unnamed statement parameter is not allowed in prepared statement."
+msgstr ""
+
+#. force reading the complete BLOB into memory
+#: ../providers/mysql/gda-mysql-provider.c:2340
+msgid "Can't read whole BLOB into memory"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-provider.c:2430
+msgid ""
+"Could not use CURSOR. Mysql version 5.0 at least is required. Using random "
+"access anyway."
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-recordset.c:135
+msgid ""
+"Could not use CURSOR. Mysql version 5.0 at least is required. Chunk size "
+"ignored."
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-recordset.c:224
+#: ../providers/postgres/gda-postgres-recordset.c:137
+msgid "Number of rows fetched at a time"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-recordset.c:232
+msgid "Number of row chunks read since the object creation"
+msgstr ""
+
+#: ../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
+#, c-format
+msgid "Invalid column bind data type. %d\n"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-recordset.c:666
+#, c-format
+msgid "Type %s not mapped for value %d"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-recordset.c:683
+#, c-format
+msgid "Type %s not mapped for value %lld"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-recordset.c:729
+#, c-format
+msgid "Type %s not mapped for value %d/%d/%d %d:%d:%d.%lu"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-recordset.c:745
+#: ../providers/mysql/gda-mysql-recordset.c:759
+#, c-format
+msgid "Type %s not mapped for value %f"
+msgstr ""
+
+#: ../providers/mysql/gda-mysql-recordset.c:847
+#, c-format
+msgid "Type %s not mapped for value %s"
+msgstr ""
+
+#: ../providers/mysql/libmain.c:71
+msgid "Provider for MySQL databases"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:1
+msgid "Add the column after the specified column"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:2
+msgid "Add the column as the first column of the table"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:3
+msgid "After column"
+msgstr "Setelah kolom"
+
+#: ../providers/mysql/mysql_specs_add_column.xml.in.h:4
+msgid "As first column"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_comment_column.xml.in.h:2
+msgid "Field comment"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_comment_table.xml.in.h:2
+msgid "Table comment"
+msgstr ""
+
+#. To translators: Charset name
+#. other table options
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:2
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:3
+msgid "7bit Swedish"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:4
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:5
+msgid "ARMSCII-8 Armenian"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:5
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:1
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:3
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:2
+msgid "Administrator login"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:6
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:2
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:4
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:3
+msgid "Administrator password"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:8
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:17
+msgid "Big5 Traditional Chinese"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:10
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:19
+msgid "Binary pseudo charset"
+msgstr ""
+
+#. DSN parameters
+#. other table options
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:12
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:22
+msgid "Character set"
+msgstr "Gugus karakter"
+
+#. DSN parameters
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:14
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:5
+msgid "Character set encoding to use in the new database"
+msgstr ""
+
+#. DSN parameters
+#. other table options
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:16
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:31
+msgid "Collation"
+msgstr ""
+
+#. DSN parameters
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:18
+msgid "Collation method to use in the new database"
+msgstr ""
+
+#. DSN parameters
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:20
+msgid "Create database only if it does not yet exist"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:22
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:41
+msgid "DEC West European"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:24
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:43
+msgid "DOS Central European"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:26
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:45
+msgid "DOS Kamenicky Czech-Slovak"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:28
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:47
+msgid "DOS Russian"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:30
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:49
+msgid "DOS West European"
+msgstr ""
+
+#. Connection parameters
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:34
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:6
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:3
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:11
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:8
+#: ../providers/postgres/postgres_specs_dsn.xml.in.h:2
+msgid "Database server"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:35
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:7
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:4
+msgid "Database server port"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:39
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:63
+msgid "EUC-JP Japanese"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:41
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:65
+msgid "EUC-KR Korean"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:42
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:12
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:5
+msgid "Full path of the UNIX socket to use when connecting locally"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:44
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:85
+msgid "GB2312 Simplified Chinese"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:46
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:87
+msgid "GBK Simplified Chinese"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:48
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:89
+msgid "GEOSTD8 Georgian"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:50
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:93
+msgid "HP West European"
+msgstr ""
+
+#. Connection parameters
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:52
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:14
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:6
+msgid "Host on which the database server is running"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:54
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:96
+msgid "ISO 8859-1 West European"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:56
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:98
+#, fuzzy
+msgid "ISO 8859-13 Baltic"
+msgstr "Baltik (ISO-8859-13)"
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:58
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:100
+msgid "ISO 8859-2 Central European"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:60
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:102
+msgid "ISO 8859-7 Greek"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:62
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:104
+msgid "ISO 8859-8 Hebrew"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:64
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:106
+msgid "ISO 8859-9 Turkish"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:66
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:114
+msgid "KOI8-R Relcom Russian"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:68
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:116
+msgid "KOI8-U Ukrainian"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:69
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:15
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:54
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:32
+msgid "Login name (which has the rights to create databases)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:71
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:118
+msgid "Mac Central European"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:73
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:120
+msgid "Mac West European"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:76
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:18
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:7
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:57
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:34
+#: ../providers/postgres/postgres_specs_dsn.xml.in.h:7
+#: ../providers/web/web_specs_dsn.xml.in.h:3
+msgid "Port"
+msgstr "Port"
+
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:77
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:19
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:8
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:58
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:35
+#: ../providers/postgres/postgres_specs_dsn.xml.in.h:8
+#: ../providers/web/web_specs_dsn.xml.in.h:4
+msgid "Require SSL"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:79
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:159
+msgid "SJIS for Windows Japanese"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:80
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:20
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:59
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:36
+msgid "Server access parameters"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:82
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:165
+msgid "Shift-JIS Japanese"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:84
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:169
+msgid "TIS620 Thai"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:88
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:181
+msgid "UCS-2 Unicode"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:89
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:23
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:10
+msgid "UNIX Socket"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:91
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:183
+msgid "US ASCII"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:93
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:185
+msgid "UTF-8 Unicode"
+msgstr "Unicode UTF-8"
+
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:94
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:24
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:12
+#: ../providers/postgres/postgres_specs_dsn.xml.in.h:12
+#: ../providers/web/web_specs_dsn.xml.in.h:11
+msgid "Whether or not to use SSL to establish the connection"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:96
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:191
+msgid "Windows Arabic"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:98
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:193
+msgid "Windows Baltic"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:100
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:195
+msgid "Windows Central European"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/mysql/mysql_specs_create_db.xml.in.h:102
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:197
+msgid "Windows Cyrillic"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:3
+msgid "Index type (depending on table storage engine)"
+msgstr ""
+
+#. Index fields
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:9
+msgid "Length"
+msgstr "Panjang"
+
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:10
+#: ../providers/postgres/postgres_specs_create_index.xml.in.h:8
+msgid "Method"
+msgstr "Metode"
+
+#. Index fields
+#: ../providers/mysql/mysql_specs_create_index.xml.in.h:16
+msgid ""
+"The number of characters the index is on for columns of type CHAR or VARCHAR"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:7
+msgid "An approximation of the average row length for your table"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:8
+msgid "Archive"
+msgstr "Arsip"
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:12
+msgid "Auto increment value"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:14
+msgid "Average row length"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:15
+msgid "Berkeley DB"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:20
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:3
+#, fuzzy
+msgid "Cascade"
+msgstr "Cascade"
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:28
+msgid "Checksum"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:29
+msgid "Clustered, fault-tolerant, memory-based"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:32
+msgid "Comma Separated Value (CSV)"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:35
+#, fuzzy
+msgid "Compact"
+msgstr "Kompak"
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:36
+msgid "Compressed"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:38
+msgid ""
+"Counter for auto incremented fields is incremented by this value + 1 "
+"(DEFAULT: 0)"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:51
+msgid "Data directory"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:59
+msgid "Delay key write"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:60
+msgid "Don't pack keys"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:61
+#, fuzzy
+msgid "Dynamic"
+msgstr "Dinamis"
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:67
+msgid "Engine"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:68
+msgid "Example"
+msgstr "Contoh"
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:70
+msgid "FIRST, LAST or NO: only with MERGE engine"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:71
+msgid "Federated"
+msgstr ""
+
+#. foreign key spec
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:73
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:21
+msgid "Field"
+msgstr "Ruas"
+
+#. foreign key spec
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:79
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:27
+msgid "Fields in the foreign key"
+msgstr ""
+
+#. To translators: "Fixed" is a kind or MySQL's table's row format
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:81
+msgid "Fixed"
+msgstr "Tetap"
+
+#. 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:852
+msgid "Foreign key"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:94
+msgid "ISAM"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:107
+msgid "In Memory (MEMORY/HEAP)"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:109
+msgid "Index directory"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:110
+msgid "InnoDB"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:112
+msgid "Insert method"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:121
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:34
+msgid "Match full"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:122
+msgid "Match partial"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:123
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:35
+msgid "Match simple"
+msgstr ""
+
+#. foreign key spec
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:125
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:37
+msgid "Match type"
+msgstr ""
+
+#. foreign key spec
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:127
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:39
+msgid "Matching method if more than one field involved"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:129
+msgid "Max rows"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:130
+msgid "Merge"
+msgstr "Gabung"
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:132
+msgid "Min rows"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:133
+msgid "MyISAM (default)"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:135
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:41
+msgid "No action"
+msgstr ""
+
+#. foreign key spec
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:139
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:46
+msgid "On delete action"
+msgstr ""
+
+#. foreign key spec
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:141
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:48
+msgid "On update action"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:143
+msgid "Only pack long CHAR/VARCHAR columns"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:145
+msgid "Pack keys"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:150
+msgid "Redundant"
+msgstr ""
+
+#. foreign key spec
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:152
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:54
+msgid "Referenced field"
+msgstr ""
+
+#. foreign key spec
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:154
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:56
+msgid "Referenced table"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:155
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:57
+msgid "Restrict"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:157
+msgid "Row format"
+msgstr ""
+
+#. To translators: Action of setting a value to NULL
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:163
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:61
+msgid "Set to NULL"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:172
+msgid "Table's comment"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:175
+msgid "Table's engine (or type)"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:178
+msgid "Table's options"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:187
+msgid "Union"
+msgstr ""
+
+#. other table options
+#: ../providers/mysql/mysql_specs_create_table.xml.in.h:199
+msgid "tbl_name[,tbl_name]...: only with MERGE engine"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_view.xml.in.h:1
+#: ../providers/postgres/postgres_specs_create_view.xml.in.h:1
+msgid "Columns' names"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_view.xml.in.h:4
+#: ../providers/postgres/postgres_specs_create_view.xml.in.h:4
+msgid "Replace it already exists"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_view.xml.in.h:5
+#: ../providers/postgres/postgres_specs_create_view.xml.in.h:5
+msgid "Replace view definition if it already exists"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_create_view.xml.in.h:9
+#: ../providers/postgres/postgres_specs_create_view.xml.in.h:10
+msgid "column name"
+msgstr "nama kolom"
+
+#. DSN parameters
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:11
+msgid "Drop database only if it exists"
+msgstr ""
+
+#. DSN parameters
+#: ../providers/mysql/mysql_specs_drop_db.xml.in.h:17
+msgid "Only if existing"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_drop_table.xml.in.h:1
+#: ../providers/postgres/postgres_specs_drop_index.xml.in.h:1
+#: ../providers/postgres/postgres_specs_drop_table.xml.in.h:1
+msgid "Automatically drop objects that depend on the table (CASCADE)"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_drop_table.xml.in.h:3
+msgid "Drop table only if it is temporary"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_drop_table.xml.in.h:6
+#: ../providers/postgres/postgres_specs_drop_index.xml.in.h:5
+#: ../providers/postgres/postgres_specs_drop_table.xml.in.h:3
+msgid "Refuse to drop the table if any objects depend on it (RESTRICT)"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_drop_table.xml.in.h:10
+#: ../providers/postgres/postgres_specs_drop_index.xml.in.h:6
+#: ../providers/postgres/postgres_specs_drop_table.xml.in.h:6
+msgid "What to do with references"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:1
+msgid "Compress"
+msgstr "Mampatkan"
+
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:9
+#: ../providers/postgres/postgres_specs_dsn.xml.in.h:11
+msgid "The name of a database to connect to"
+msgstr ""
+
+#: ../providers/mysql/mysql_specs_dsn.xml.in.h:11
+msgid "Use compression protocol"
+msgstr ""
+
+#: ../providers/oracle/gda-oracle-meta.c:570
+msgid "Could not fetch next row"
+msgstr ""
+
+#: ../providers/oracle/gda-oracle-meta.c:598
+msgid "Could not get a description handle"
+msgstr ""
+
+#: ../providers/oracle/gda-oracle-meta.c:615
+msgid "Could not get parameter handle"
+msgstr ""
+
+#: ../providers/oracle/gda-oracle-meta.c:632
+#: ../providers/oracle/gda-oracle-meta.c:646
+#: ../providers/oracle/gda-oracle-meta.c:672
+#: ../providers/oracle/gda-oracle-meta.c:689
+#: ../providers/oracle/gda-oracle-meta.c:720
+#: ../providers/oracle/gda-oracle-meta.c:744
+#: ../providers/oracle/gda-oracle-meta.c:759
+#: ../providers/oracle/gda-oracle-meta.c:774
+#: ../providers/oracle/gda-oracle-meta.c:789
+#: ../providers/oracle/gda-oracle-meta.c:804
+#: ../providers/oracle/gda-oracle-meta.c:820
+msgid "Could not get attribute"
+msgstr ""
+
+#: ../providers/oracle/gda-oracle-util.c:78
+msgid "NO DESCRIPTION"
+msgstr "TANPA KETERANGAN"
+
+#: ../providers/oracle/gda-oracle-util.c:646
+msgid "Invalid Oracle handle"
+msgstr ""
+
+#: ../providers/oracle/gda-oracle-util.c:654
+msgid "Could not allocate Lob locator"
+msgstr ""
+
+#: ../providers/oracle/gda-oracle-util.c:661
+msgid "Could not copy Lob locator"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-handler-bin.c:119
+msgid "Postgresql binary handler"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-handler-bin.c:125
+msgid "PostgresqlBin"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-handler-bin.c:126
+msgid "PostgreSQL binary representation"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-handler-bin.c:218
+msgid "Insufficient memory to convert binary buffer to string"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-handler-bin.c:281
+msgid "Insufficient memory to convert string to binary buffer"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-provider.c:423
+msgid "The connection string must contain a DB_NAME value"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-provider.c:427
+msgid ""
+"The connection string format has changed: replace DATABASE with DB_NAME and "
+"the same contents"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-provider.c:555
+#, c-format
+msgid "Could not set search_path to %s"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-provider.c:564
+#, c-format
+msgid "Search path %s is invalid"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-provider.c:1003
+#: ../providers/postgres/gda-postgres-provider.c:1005
+msgid "Transactions are not supported in read uncommitted isolation level"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-provider.c:1009
+#: ../providers/postgres/gda-postgres-provider.c:1011
+msgid "Transactions are not supported in repeatable read isolation level"
+msgstr ""
+
+#: ../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
+msgid "Internal error"
+msgstr "Galat internal"
+
+#: ../providers/postgres/gda-postgres-provider.c:1132
+#: ../providers/postgres/gda-postgres-provider.c:1182
+#: ../providers/postgres/gda-postgres-provider.c:1232
+#, c-format
+msgid "Wrong savepoint name '%s'"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-provider.c:2010
+#: ../providers/postgres/gda-postgres-provider.c:2012
+msgid "Cannot start transaction"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-provider.c:2221
+#: ../providers/postgres/gda-postgres-provider.c:2257
+#: ../providers/postgres/gda-postgres-provider.c:2292
+msgid "Could not set the XA transaction ID parameter"
+msgstr ""
+
+#: ../providers/postgres/gda-postgres-recordset.c:142
+msgid "Number of rows chunks read since the object creation"
+msgstr ""
+
+#: ../providers/postgres/libmain.c:79
+msgid "Provider for PostgreSQL databases"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:7
+msgid "Don't add the column to descendants of the table"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_add_column.xml.in.h:9
+msgid "Ignore descendants"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:2
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:1
+#, fuzzy
+msgid "ASCII"
+msgstr "ASCII"
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:7
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:4
+msgid "Chinese EUC"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:12
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:9
+#: ../providers/postgres/postgres_specs_dsn.xml.in.h:3
+msgid ""
+"Database server port (for servers running on unix domain sockets, enter the "
+"socket's file name extension (usually 5432), or leave this field empty)"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:15
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:11
+#: ../providers/postgres/postgres_specs_dsn.xml.in.h:4
+msgid "Extra connection options"
+msgstr ""
+
+#. Connection parameters
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:17
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:13
+#: ../providers/postgres/postgres_specs_dsn.xml.in.h:5
+msgid ""
+"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)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:19
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:14
+msgid "ISO 8859-1/ECMA 94 (Latin alphabet no.1)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:21
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:15
+msgid "ISO 8859-1/ECMA 94 (Latin alphabet no.10)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:23
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:16
+msgid "ISO 8859-1/ECMA 94 (Latin alphabet no.2)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:25
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:17
+msgid "ISO 8859-1/ECMA 94 (Latin alphabet no.3)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:27
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:18
+msgid "ISO 8859-1/ECMA 94 (Latin alphabet no.4)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:29
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:19
+msgid "ISO 8859-1/ECMA 94 (Latin alphabet no.5)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:31
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:20
+msgid "ISO 8859-1/ECMA 94 (Latin alphabet no.6)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:33
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:21
+msgid "ISO 8859-1/ECMA 94 (Latin alphabet no.7)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:35
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:22
+msgid "ISO 8859-1/ECMA 94 (Latin alphabet no.8)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:37
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:23
+msgid "ISO 8859-1/ECMA 94 (Latin alphabet no.9)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:39
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:24
+msgid "ISO 8859-5/ECMA 113 (Latin/Cyrillic)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:41
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:25
+msgid "ISO 8859-6/ECMA 114 (Latin/Arabic)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:43
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:26
+msgid "ISO 8859-7/ECMA 118 (Latin/Greek)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:45
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:27
+msgid "ISO 8859-8/ECMA 121 (Latin/Hebrew)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:47
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:28
+msgid "Japanese EUC"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:49
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:29
+msgid "KOI8-R(U)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:51
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:30
+msgid "Korean EUC"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:53
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:31
+msgid "Korean EUC (Hangle base)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:61
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:37
+msgid "TCVN-5712/Windows CP1258 (Vietnamese)"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:62
+#: ../providers/postgres/postgres_specs_create_index.xml.in.h:12
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:70
+msgid "Tablespace"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:64
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:38
+msgid "Taiwan EUC"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:65
+msgid "Template"
+msgstr "Templat"
+
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:68
+msgid "The name of the database user who will own the new database"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:69
+msgid ""
+"The name of the tablespace that will be associated with the new database"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:70
+msgid "The name of the template from which to create the new database"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:72
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:41
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:73
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:42
+msgid "Whether to require SSL or not when connecting"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:75
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:43
+msgid "Windows CP1250"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:77
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:44
+msgid "Windows CP1251"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:79
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:45
+msgid "Windows CP1256 (Arabic)"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:81
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:46
+msgid "Windows CP866"
+msgstr ""
+
+#. To translators: Charset name
+#: ../providers/postgres/postgres_specs_create_db.xml.in.h:83
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:47
+msgid "Windows CP874 (Thai)"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_index.xml.in.h:1
+msgid "Constraint expression for a partial index"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_index.xml.in.h:11
+msgid "Predicate"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:5
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:2
+msgid "Can create databases"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:10
+msgid "Can create roles"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:15
+msgid "Can login"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:20
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:4
+msgid ""
+"Controls whether the password is stored encrypted in the system catalogs. If "
+"the presented password string is already in MD5-encrypted format, then it is "
+"stored encrypted as-is."
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:25
+msgid "Database superuser"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:30
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:5
+msgid "Encrypt password"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:31
+msgid "Existing role"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:32
+msgid ""
+"Existing roles to which the new role will be immediately added as a new "
+"member"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:37
+msgid ""
+"If the role is allowed to log in, defines the number of concurrent "
+"connections the role can make (-1 or unset for unlimited)"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:42
+msgid "Inherit"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:43
+msgid ""
+"Lists one or more existing roles which are automatically added as members of "
+"the new role"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:44
+msgid ""
+"Lists one or more existing roles which are automatically added as members of "
+"the new role, giving them the right to grant membership in this role to "
+"others"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:49
+msgid "Login limit"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:50
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:8
+msgid "Member of"
+msgstr "Anggota dari"
+
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:61
+msgid "Role"
+msgstr "Peran"
+
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:62
+msgid "Role's admins"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:67
+#: ../providers/postgres/postgres_specs_drop_role.xml.in.h:4
+msgid "Role's definition"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:68
+msgid "Role's members"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:73
+#: ../providers/postgres/postgres_specs_drop_role.xml.in.h:5
+msgid "Role's name"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:78
+msgid "Role's password"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:83
+msgid ""
+"Set to TRUE if the created role inherits the privileges of roles it is a "
+"member of"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:88
+msgid "Set to TRUE if the role is a database superuser"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:93
+msgid "Set to TRUE if the role is allowed to create databases"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:98
+msgid "Set to TRUE if the role is allowed to create roles"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:103
+msgid "Set to TRUE if the role is allowed to log in"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:108
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:13
+msgid ""
+"Specifies an expiration time for a password only (not for the user account "
+"per se: the expiration time is not enforced when logging in using a non-"
+"password-based authentication method)"
+msgstr ""
+
+#.
+#. This file contains the CREATE ROLE operation's parameters, which is
+#. available since PostgreSQL 8.1
+#.
+#: ../providers/postgres/postgres_specs_create_role.xml.in.h:113
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:19
+msgid "Valid until"
+msgstr "Berlaku hingga"
+
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:8
+msgid "Copy default expressions"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:9
+msgid "Copy defaults"
+msgstr ""
+
+#. foreign key spec
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:17
+msgid "Deferrable"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:18
+msgid "Deferrable initially deferred"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:19
+msgid "Deferrable initially immediate"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:32
+msgid "Inheritance"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:33
+msgid "Keep coupled"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:44
+msgid "Not deferrable"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:49
+msgid "Parent table"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:50
+msgid "Parent table(s)"
+msgstr ""
+
+#. To translators: Action of setting a value to its default value
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:63
+msgid "Set to default"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:74
+msgid "Use INHERIT instead of LIKE"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_table.xml.in.h:75
+msgid "With OIDs"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:1
+msgid "Can be used to choose the PostgreSQL user ID of the new user"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:3
+msgid "Can create users"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:6
+msgid ""
+"Existing groups to which the new user will be immediately added as a new "
+"member"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:7
+msgid "Existing user"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:11
+msgid "Set to TRUE if the user is allowed to create databases"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:12
+msgid "Set to TRUE if the user is allowed to create users"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:15
+msgid "User ID"
+msgstr "ID pengguna"
+
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:16
+#: ../providers/postgres/postgres_specs_drop_user.xml.in.h:4
+msgid "User's definition"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:17
+#: ../providers/postgres/postgres_specs_drop_user.xml.in.h:5
+msgid "User's name"
+msgstr "Nama pengguna"
+
+#: ../providers/postgres/postgres_specs_create_user.xml.in.h:18
+msgid "User's password"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_drop_column.xml.in.h:1
+msgid "Automatically drop objects that depend on the column (CASCADE)"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_drop_column.xml.in.h:5
+msgid "Refuse to drop the column if any objects depend on it (RESTRICT)"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_drop_column.xml.in.h:8
+msgid "What to do with references on the column to delete"
+msgstr ""
+
+#. DSN parameters
+#: ../providers/postgres/postgres_specs_drop_db.xml.in.h:40
+msgid "The name of a database to drop"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_drop_role.xml.in.h:1
+msgid "Drop role only if it exists"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_drop_user.xml.in.h:1
+msgid "Drop user only if it exists"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_drop_view.xml.in.h:1
+msgid "Automatically drop objects that depend on the view (CASCADE)"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_drop_view.xml.in.h:5
+msgid "Refuse to drop the view if any objects depend on it (RESTRICT)"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_drop_view.xml.in.h:8
+msgid "What to do with objects referencing the view"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_dsn.xml.in.h:9
+msgid "Search Path"
+msgstr ""
+
+#: ../providers/postgres/postgres_specs_dsn.xml.in.h:10
+msgid "Search path among database's schemas ('search_path' variable)"
+msgstr ""
+
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:781
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:844
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:1080
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:1146
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:1217
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:1526
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:1603
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:1646
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:1726
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:1826
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:1865
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:1917
+#: ../providers/reuseable/mysql/gda-mysql-meta.c:1956
+msgid "Mysql version 5.0 at least is required"
+msgstr ""
+
+#: ../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-meta.c:107
+msgid "Can't import data from web server"
+msgstr ""
+
+#: ../providers/reuseable/postgres/gda-postgres-meta.c:2108
+#, c-format
+msgid "could not determine the indexed columns for index"
+msgstr ""
+
+#: ../providers/sqlite/libmain.c:73
+msgid "Provider for SQLite databases"
+msgstr ""
+
+#: ../providers/web/gda-web-provider.c:290 ../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 ""
+
+#: ../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
+#, c-format
+msgid "The connection string must contain the %s value"
+msgstr ""
+
+#: ../providers/web/gda-web-provider.c:627
+#: ../providers/web/gda-web-provider.c:652
+#, c-format
+msgid "Not supported"
+msgstr "Tak didukung"
+
+#: ../providers/web/gda-web-provider.c:632
+#: ../providers/web/gda-web-provider.c:657
+#, c-format
+msgid "Server operations not yet implemented"
+msgstr ""
+
+#: ../providers/web/gda-web-provider.c:707
+#: ../providers/web/gda-web-provider.c:772
+#: ../providers/web/gda-web-provider.c:832
+msgid "Named transaction is not supported"
+msgstr ""
+
+#: ../providers/web/gda-web-provider.c:712
+msgid "Transaction level is not supported"
+msgstr ""
+
+#: ../providers/web/gda-web-provider.c:892
+#: ../providers/web/gda-web-provider.c:953
+msgid "Unnamed savepoint is not supported"
+msgstr ""
+
+#: ../providers/web/gda-web-recordset.c:183
+#, c-format
+msgid "Can't create temporary file '%s'"
+msgstr ""
+
+#: ../providers/web/gda-web-recordset.c:365
+#: ../providers/web/gda-web-recordset.c:371
+#: ../providers/web/gda-web-recordset.c:381
+msgid "Can't create temporary table to store data from web server"
+msgstr ""
+
+#: ../providers/web/gda-web-util.c:151 ../providers/web/gda-web-util.c:165
+msgid "Could not parse server's reponse"
+msgstr ""
+
+#: ../providers/web/gda-web-util.c:159
+msgid "Invalid response hash"
+msgstr ""
+
+#: ../providers/web/gda-web-util.c:347
+msgid "Can't start new thread"
+msgstr ""
+
+#: ../providers/web/gda-web-util.c:401 ../providers/web/gda-web-util.c:441
+msgid "Could not run PHP script on the server"
+msgstr ""
+
+#: ../providers/web/gda-web-util.c:428
+msgid "The transaction has been automatically rolled back"
+msgstr ""
+
+#: ../providers/web/gda-web-util.c:578
+#, c-format
+msgid "Error cleaning data on the server for session %s"
+msgstr ""
+
+#: ../providers/web/gda-web-util.c:610
+msgid "Non detailled error"
+msgstr ""
+
+#: ../providers/web/libmain.c:71
+msgid "Provider for web server proxies"
+msgstr ""
+
+#: ../providers/web/web_specs_auth.xml.in.h:1
+msgid "Connection password as defined on the web server"
+msgstr ""
+
+#: ../providers/web/web_specs_dsn.xml.in.h:2
+msgid "Path to PHP script"
+msgstr ""
+
+#: ../providers/web/web_specs_dsn.xml.in.h:5
+msgid "Server secret"
+msgstr ""
+
+#: ../providers/web/web_specs_dsn.xml.in.h:6
+msgid "The name of a database to use"
+msgstr ""
+
+#: ../providers/web/web_specs_dsn.xml.in.h:7
+msgid "The name of the web server which proxies connections"
+msgstr ""
+
+#: ../providers/web/web_specs_dsn.xml.in.h:8
+msgid ""
+"The path of the script to use if service is not at the web server's root"
+msgstr ""
+
+#: ../providers/web/web_specs_dsn.xml.in.h:9
+msgid "Web server name"
+msgstr ""
+
+#: ../providers/web/web_specs_dsn.xml.in.h:10
+msgid "Web server port (leave this field empty for default)"
+msgstr ""
+
+#: ../testing/gda-test-blob.c:78 ../testing/gda-test-connection.c:67
+#, c-format
+msgid "DSN '%s' is not declared"
+msgstr ""
+
+#: ../testing/gda-test-blob.c:83 ../testing/gda-test-connection.c:72
+#, c-format
+msgid "Can't open connection to DSN %s: %s\n"
+msgstr ""
+
+#: ../testing/gda-test-blob.c:94 ../testing/gda-test-connection.c:82
+#, c-format
+msgid "Can't open specified connection: %s\n"
+msgstr ""
+
+#: ../testing/gda-test-blob.c:101 ../testing/gda-test-connection.c:89
+#, fuzzy, c-format
+msgid "Connection successfully opened!\n"
+msgstr "Koneksi sukses dibuka!"
+
+#: ../testing/gdaui-test-data-entries.c:241
+msgid "_File"
+msgstr "_Berkas"
+
+#: ../testing/gdaui-test-data-entries.c:254
+msgid "_Tested Widgets"
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:261
+msgid "Default individual data entry widgets"
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:268
+msgid "Default data entry widgets in a form"
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:275
+msgid "Default data cell renderers in a grid"
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:285
+msgid "Plugins individual data entry widgets"
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:292
+msgid "Plugins data entry widgets in a form"
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:299
+msgid "Plugins data cell renderers in a grid"
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:675
+msgid "No GdaDataHandler available for this type"
+msgstr ""
+
+#. Other widgets
+#: ../testing/gdaui-test-data-entries.c:695
+msgid "Current flags: "
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:700
+msgid "--"
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:706
+msgid "Current value: "
+msgstr "Nilai kini:"
+
+#: ../testing/gdaui-test-data-entries.c:724
+msgid "NULL ok"
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:732
+msgid "DEFAULT ok"
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:740
+msgid "Actions?"
+msgstr "Tindakan?"
+
+#: ../testing/gdaui-test-data-entries.c:748
+msgid "Editable?"
+msgstr "Dapat disunting?"
+
+#: ../testing/gdaui-test-data-entries.c:762
+msgid "Set as original"
+msgstr ""
+
+#: ../testing/gdaui-test-data-entries.c:775
+msgid "Set as default"
+msgstr "Jadikan baku"
+
+#: ../tools/browser/auth-dialog.c:522
+msgid "For connection"
+msgstr ""
+
+#: ../tools/browser/auth-dialog.c:523
+msgid "enter authentication information"
+msgstr ""
+
+#: ../tools/browser/auth-dialog.c:679 ../tools/browser/login-dialog.c:238
+#, fuzzy, c-format
+msgid ""
+"Could not open connection:\n"
+"%s"
+msgstr "Tak bisa membuka koneksi"
+
+#: ../tools/browser/browser-connection.c:262
+#, c-format
+msgid "c%u"
+msgstr ""
+
+#: ../tools/browser/browser-connection.c:353
+#: ../tools/browser/browser-connection.c:439
+msgid "Analysing database schema"
+msgstr ""
+
+#: ../tools/browser/browser-connection.c:355
+#: ../tools/browser/browser-connection.c:421
+#: ../tools/browser/browser-connection.c:441
+#: ../tools/browser/browser-connection.c:853
+#, c-format
+msgid "Error while fetching meta data from the connection: %s"
+msgstr ""
+
+#: ../tools/browser/browser-connection.c:419
+#: ../tools/browser/browser-connection.c:851
+msgid "Getting database schema information"
+msgstr ""
+
+#: ../tools/browser/browser-connection.c:625
+#: ../tools/browser/browser-connection.c:645
+#, c-format
+msgid "Error while analysing database schema: %s"
+msgstr ""
+
+#: ../tools/browser/browser-connection.c:1107
+#: ../tools/browser/browser-connection.c:1157
+msgid "Executing a query"
+msgstr ""
+
+#: ../tools/browser/browser-connection.c:1437
+#, c-format
+msgid "Connection not yet opened"
+msgstr ""
+
+#: ../tools/browser/browser-connection.c:1443
+msgid "Can't initialize dictionary to store table preferences"
+msgstr ""
+
+#: ../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
+msgid "Can't initialize transaction to access favorites"
+msgstr ""
+
+#: ../tools/browser/browser-connection.c:1576
+#: ../tools/browser/browser-favorites.c:702
+#: ../tools/browser/browser-favorites.c:1016
+msgid "Can't commit transaction to access favorites"
+msgstr ""
+
+#: ../tools/browser/browser-connections-list.c:155
+#, fuzzy, c-format
+msgid "DSN: %s"
+msgstr "%s [DSN]"
+
+#: ../tools/browser/browser-connections-list.c:157
+#, c-format
+msgid "Provider: %s"
+msgstr "Penyedia: %s"
+
+#: ../tools/browser/browser-connections-list.c:203
+msgid "Database provider"
+msgstr ""
+
+#: ../tools/browser/browser-connections-list.c:210
+msgid "In memory"
+msgstr ""
+
+#: ../tools/browser/browser-connections-list.c:212
+msgid "Dictionary file"
+msgstr ""
+
+#: ../tools/browser/browser-connections-list.c:213
+msgid ""
+"File used to store any information associated\n"
+"to this connection (favorites, descriptions, ...)"
+msgstr ""
+
+#: ../tools/browser/browser-connections-list.c:326
+msgid "Opened connections"
+msgstr ""
+
+#: ../tools/browser/browser-connections-list.c:354 ../tools/gda-sql.c:3090
+msgid "List of opened connections"
+msgstr ""
+
+#: ../tools/browser/browser-connections-list.c:363 ../tools/web-server.c:707
+msgid "Connections"
+msgstr ""
+
+#: ../tools/browser/browser-connections-list.c:379
+#, fuzzy
+msgid "Connection's properties"
+msgstr "Properti Koneksi"
+
+#: ../tools/browser/browser-connections-list.c:390
+msgid "Close connection"
+msgstr "Tutup koneksi"
+
+#: ../tools/browser/browser-connections-list.c:394
+msgid "Close selected connection"
+msgstr ""
+
+#: ../tools/browser/browser-connections-list.c:397
+msgid "Connect"
+msgstr "Sambung"
+
+#: ../tools/browser/browser-connections-list.c:401
+msgid "Open a new connection"
+msgstr ""
+
+#: ../tools/browser/browser-favorites.c:181
+#: ../tools/browser/browser-favorites.c:190
+msgid "Can't initialize dictionary to store favorites"
+msgstr ""
+
+#: ../tools/browser/browser-stock-icons.c:45
+msgid "History"
+msgstr "Riwayat"
+
+#: ../tools/browser/browser-stock-icons.c:46
+msgid "Bookmarks"
+msgstr "Penanda Alamat"
+
+#: ../tools/browser/browser-stock-icons.c:47
+#: ../tools/browser/browser-window.c:297
+msgid "Begin"
+msgstr "Begin"
+
+#: ../tools/browser/browser-stock-icons.c:48
+#: ../tools/browser/browser-window.c:299
+msgid "Commit"
+msgstr "Commit"
+
+#: ../tools/browser/browser-stock-icons.c:49
+#: ../tools/browser/browser-window.c:301
+msgid "Rollback"
+msgstr "Rollback"
+
+#: ../tools/browser/browser-stock-icons.c:50
+msgid "Builder"
+msgstr ""
+
+#: ../tools/browser/browser-virtual-connection.c:88
+msgid "Bound connection is used"
+msgstr ""
+
+#: ../tools/browser/browser-virtual-connection.c:111
+msgid "Virtual connection using this connection is busy"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:271
+msgid "_Fullscreen"
+msgstr "Layar _Penuh"
+
+#: ../tools/browser/browser-window.c:271
+msgid "Use the whole screen"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:277
+msgid "_Bind connection"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:277
+msgid ""
+"Use connection to create\n"
+"a new binding connection to access data\n"
+"from multiple databases at once"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:297
+msgid "Begin a new transaction"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:299
+msgid "Commit current transaction"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:301
+msgid "Rollback current transaction"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:391
+msgid "unnamed"
+msgstr "tak bernama"
+
+#: ../tools/browser/browser-window.c:392
+#, c-format
+msgid "Connection: %s"
+msgstr "Koneksi: %s"
+
+#: ../tools/browser/browser-window.c:785 ../tools/browser/support.c:82
+#, c-format
+msgid "Do you want to close the '%s' connection?"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:827 ../tools/browser/browser-window.c:834
+msgid "Do you want to quit the application?"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:828
+msgid "all the connections will be closed."
+msgstr ""
+
+#: ../tools/browser/browser-window.c:835
+msgid "the connection will be closed."
+msgstr ""
+
+#: ../tools/browser/browser-window.c:886
+#, c-format
+msgid "Error starting transaction: %s"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:900
+#, c-format
+msgid "Error committing transaction: %s"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:914
+#, c-format
+msgid "Error rolling back transaction: %s"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:998
+msgid "Hit the Escape key to leave the fullscreen mode"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:1144
+#, c-format
+msgid "Error updating bound connection: %s"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:1185
+#, c-format
+msgid "Could not open binding connection: %s"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:1225
+#: ../tools/browser/gda-browser-4.0.desktop.in.h:2
+msgid "Database browser"
+msgstr ""
+
+#: ../tools/browser/browser-window.c:1543
+msgid "Don't show this message again"
+msgstr "Jangan tunjukkan pesan ini lagi"
+
+#: ../tools/browser/browser-window.c:1589
+msgid "Note:"
+msgstr "Catatan:"
+
+#: ../tools/browser/browser-window.c:1701
+#, c-format
+msgid ""
+"The current perspective has changed to the '%s' perspective, you can switch "
+"back to previous perspective through the 'Perspective/%s' menu, or using the "
+"'%s' shortcut"
+msgstr ""
+
+#: ../tools/browser/connection-binding-properties.c:142
+msgid "New virtual connection"
+msgstr ""
+
+#: ../tools/browser/connection-binding-properties.c:170
+#: ../tools/browser/connection-binding-properties.c:196
+msgid "Virtual connection's properties"
+msgstr ""
+
+#: ../tools/browser/connection-binding-properties.c:197
+msgid ""
+"Define the sources of data for which tables will\n"
+"appear in the virtual connection"
+msgstr ""
+
+#: ../tools/browser/connection-binding-properties.c:277
+msgid "Add binding"
+msgstr ""
+
+#: ../tools/browser/connection-binding-properties.c:328
+msgid "Bind a connection"
+msgstr ""
+
+#: ../tools/browser/connection-binding-properties.c:334
+msgid "Bind a data set"
+msgstr ""
+
+#: ../tools/browser/connection-binding-properties.c:413
+msgid "Table from a data set:"
+msgstr ""
+
+#: ../tools/browser/connection-binding-properties.c:463
+#, c-format
+msgid "Invalid schema name"
+msgstr ""
+
+#: ../tools/browser/connection-binding-properties.c:510
+msgid "All tables of a connection:"
+msgstr ""
+
+#: ../tools/browser/connection-binding-properties.c:514
+msgid ""
+"Each table in the selected connection will appear\n"
+"as a table in the virtual connection"
+msgstr ""
+
+#: ../tools/browser/connection-binding-properties.c:539
+msgid ""
+"Name of the schema the\n"
+"tables will be in"
+msgstr ""
+
+#: ../tools/browser/gda-browser-4.0.desktop.in.h:1
+msgid "Browse your database's contents"
+msgstr ""
+
+#: ../tools/browser/login-dialog.c:142
+msgid "Connection opening:"
+msgstr ""
+
+#: ../tools/browser/login-dialog.c:143
+msgid ""
+"Select a named data source, or specify\n"
+"parameters to open a connection to a \n"
+"non defined data source"
+msgstr ""
+
+#: ../tools/browser/login-dialog.c:252
+#, c-format
+msgid "Cancelled by the user"
+msgstr ""
+
+#: ../tools/browser/main.c:72 ../tools/gda-sql.c:166
+msgid "[DSN|connection string]..."
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:219
+msgid "Multiple statements"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:223
+msgid "SELECT statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:226
+msgid "INSERT statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:229
+msgid "UPDATE statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:232
+msgid "DELETE statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:235
+msgid "COMPOUND SELECT statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:238
+msgid "BEGIN statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:241
+msgid "ROLLBACK statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:244
+msgid "COMMIT statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:247
+msgid "ADD SAVEPOINT statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:250
+msgid "ROLLBACK SAVEPOINT statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:253
+msgid "DELETE SAVEPOINT statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:256
+msgid "Unknown statement"
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:547
+msgid ""
+"Getting\n"
+"favorites..."
+msgstr ""
+
+#: ../tools/browser/mgr-favorites.c:559
+msgid ""
+"No favorite:\n"
+"drag item to\n"
+"define one"
+msgstr ""
+
+#: ../tools/browser/support.c:205
+msgid ""
+"Unable to display help. Please make sure the documentation package is "
+"installed."
+msgstr ""
+
+#: ../tools/browser/support.c:231
+msgid "Unable to open help file"
+msgstr "Tak bisa membuka berkas bantuan"
+
+#: ../tools/browser/support.c:241
+msgid "Help is being loaded, please wait..."
+msgstr ""
+
+#: ../tools/browser/support.c:288
+msgid "Close tab"
+msgstr "Tutup tab"
+
+#: ../tools/browser/support.h:96
+msgid ""
+"<small>This area allows to give values to\n"
+"variables defined in the SQL code\n"
+"using the following syntax:\n"
+"<b><tt>##&lt;variable name&gt;::&lt;type&gt;[::null]</tt></b>\n"
+"For example:\n"
+"<span foreground=\"#4e9a06\"><b><tt>##id::int</tt></b></span>\n"
+"      defines <b>id</b> as a non NULL integer\n"
+"<span foreground=\"#4e9a06\"><b><tt>##age::string::null</tt></b></span>\n"
+"      defines <b>age</b> as a a string\n"
+"\n"
+"Valid types are: <tt>string</tt>, <tt>boolean</tt>, <tt>int</tt>,\n"
+"<tt>date</tt>, <tt>time</tt>, <tt>timestamp</tt>, <tt>guint</tt>, <tt>blob</"
+"tt> and\n"
+"<tt>binary</tt></small>"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-column.c:169
+#, c-format
+msgid "Type: %s"
+msgstr "Jenis: %s"
+
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:299
+msgid "Remove"
+msgstr "Buang"
+
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:303
+msgid "Add referenced tables"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:307
+msgid "Add tables referencing this table"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:505
+msgid "Add table"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:525
+msgid "Select tables to add to diagram"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-print.c:82
+msgid "Page size and zoom"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-print.c:179
+#, c-format
+msgid "Page %d of %d horizontally and %d of %d vertically"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-print.c:237
+msgid "Adjust page's size and orientation"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-print.c:243
+msgid "<b>Zoom</b>"
+msgstr "<b>Zum</b>"
+
+#: ../tools/browser/canvas/browser-canvas-print.c:255
+msgid "Number of pages used:"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-print.c:266
+msgid "horizontally"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-print.c:277
+msgid "vertically"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-print.c:281
+msgid "Zoom factor:"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-print.c:294
+msgid "<b>Page numbers</b>"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas-print.c:307
+msgid "Print page numbers"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas.c:389
+msgid "Linear layout"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas.c:394
+msgid "Radial layout"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas.c:508
+msgid "Save diagram as"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas.c:514
+msgid "PNG Image"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas.c:519
+msgid "SVG file"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas.c:556
+msgid "Failed to create SVG file"
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas.c:564
+msgid "File format to save to is not recognized."
+msgstr ""
+
+#: ../tools/browser/canvas/browser-canvas.c:584
+msgid "Failed to create PNG file"
+msgstr ""
+
+#: ../tools/browser/common/gdaui-data-import.c:123
+msgid "Import specifications"
+msgstr ""
+
+#. file to import from
+#: ../tools/browser/common/gdaui-data-import.c:142
+msgid "File to import from:"
+msgstr ""
+
+#: ../tools/browser/common/gdaui-data-import.c:146
+msgid "File to import data from"
+msgstr ""
+
+#: ../tools/browser/common/gdaui-data-import.c:149
+msgid "Comma separated values"
+msgstr ""
+
+#: ../tools/browser/common/gdaui-data-import.c:154
+msgid "XML exported"
+msgstr ""
+
+#: ../tools/browser/common/gdaui-data-import.c:158
+msgid "All files"
+msgstr "Semua berkas"
+
+#. Encoding
+#: ../tools/browser/common/gdaui-data-import.c:166
+msgid "Encoding:"
+msgstr "Pengkodean:"
+
+#. first line as title
+#: ../tools/browser/common/gdaui-data-import.c:192
+msgid "First line as title:"
+msgstr ""
+
+#. separator
+#: ../tools/browser/common/gdaui-data-import.c:204
+msgid "Separator:"
+msgstr "Pemisah:"
+
+#: ../tools/browser/common/gdaui-data-import.c:208
+msgid "Comma"
+msgstr ""
+
+#: ../tools/browser/common/gdaui-data-import.c:215
+msgid "Semi column"
+msgstr ""
+
+#: ../tools/browser/common/gdaui-data-import.c:222
+msgid "Tab"
+msgstr "Tab"
+
+#: ../tools/browser/common/gdaui-data-import.c:229
+msgid "Space"
+msgstr "Spasi"
+
+#: ../tools/browser/common/gdaui-data-import.c:236
+msgid "Pipe"
+msgstr ""
+
+#: ../tools/browser/common/gdaui-data-import.c:245
+msgid "Other:"
+msgstr "Lainnya:"
+
+#: ../tools/browser/common/gdaui-data-import.c:269
+msgid "Import preview"
+msgstr ""
+
+#: ../tools/browser/common/gdaui-data-import.c:284
+msgid "No data."
+msgstr "Tak ada data."
+
+#: ../tools/browser/common/gdaui-entry-import.c:172
+msgid "Data set import from file"
+msgstr ""
+
+#: ../tools/browser/common/gdaui-entry-import.c:202
+#: ../tools/browser/query-exec/query-result.c:217
+#, c-format
+msgid "%d row"
+msgid_plural "%d rows"
+msgstr[0] "%d baris"
+
+#: ../tools/browser/common/gdaui-entry-import.c:203
+#: ../tools/browser/query-exec/query-result.c:218
+#, c-format
+msgid "%d column"
+msgid_plural "%d columns"
+msgstr[0] "%d kolom"
+
+#: ../tools/browser/common/gdaui-entry-import.c:204
+#: ../tools/browser/query-exec/query-result.c:220
+#, c-format
+msgid "Data set with %s and %s"
+msgstr ""
+
+#: ../tools/browser/common/gdaui-entry-import.c:211
+#: ../tools/browser/common/gdaui-entry-import.c:234
+msgid "No data set"
+msgstr ""
+
+#: ../tools/browser/common/objects-cloud.c:249
+#, c-format
+msgid "%d table in current schema:"
+msgid_plural "%d tables in current schema:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../tools/browser/common/objects-cloud.c:253
+msgid "Tables in current schema:"
+msgstr ""
+
+#: ../tools/browser/common/objects-cloud.c:256
+#, c-format
+msgid "%d Table in schema '%s':"
+msgid_plural "%d Tables in schema '%s':"
+msgstr[0] ""
+msgstr[1] ""
+
+#. no connection at all or not authenticated
+#: ../tools/browser/common/objects-cloud.c:266 ../tools/web-server.c:712
+msgid "None"
+msgstr "Tak Ada"
+
+#: ../tools/browser/common/ui-formgrid.c:169
+msgid "Toggle between grid and form presentations"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:296
+msgid "Data Manager"
+msgstr ""
+
+#: ../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
+msgid "Unsaved"
+msgstr "Belum disimpan"
+
+#: ../tools/browser/data-manager/data-console.c:327
+#: ../tools/browser/query-exec/query-console.c:330
+msgid "Variables' values:"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:384
+#, fuzzy
+msgid "Reset"
+msgstr "Reset"
+
+#: ../tools/browser/data-manager/data-console.c:385
+msgid ""
+"Reset the editor's\n"
+"contents"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:392
+#, fuzzy
+msgid "Add a new data source"
+msgstr "Tambah sumber data baru..."
+
+#: ../tools/browser/data-manager/data-console.c:398
+#: ../tools/browser/query-exec/query-console.c:362
+msgid "Variables"
+msgstr "Variabel"
+
+#: ../tools/browser/data-manager/data-console.c:398
+msgid "Show variables needed"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:404
+#: ../tools/browser/query-exec/query-console.c:368
+msgid "Execute"
+msgstr "Jalankan"
+
+#: ../tools/browser/data-manager/data-console.c:404
+msgid ""
+"Execute specified\n"
+"data manager"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:410
+msgid "View XML"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:410
+msgid ""
+"View specifications\n"
+"as XML (advanced)"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:418 ../tools/html-doc.c:95
+msgid "Help"
+msgstr "Bantuan"
+
+#: ../tools/browser/data-manager/data-console.c:431
+msgid "BBB:"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:503
+#, c-format
+msgid "'%s' data manager"
+msgstr ""
+
+#: ../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
+msgid "Data manager"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:558
+msgid "Could not save data manager"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:584
+msgid "Data manager's name"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:604
+#: ../tools/browser/schema-browser/relations-diagram.c:280
+msgid "Save"
+msgstr "Simpan"
+
+#: ../tools/browser/data-manager/data-console.c:724
+#, fuzzy, c-format
+msgid "source%d"
+msgstr "Sumber"
+
+#: ../tools/browser/data-manager/data-console.c:767
+#, fuzzy
+msgid "Data source from query"
+msgstr "Nama sumber data"
+
+#: ../tools/browser/data-manager/data-console.c:805
+#, c-format
+msgid "In schema %s"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:815
+#, fuzzy, c-format
+msgid "For table: %s"
+msgstr "Bagi tabel '%s.%s':"
+
+#: ../tools/browser/data-manager/data-console.c:892
+msgid ""
+"Switching to execution mode. Hit the Escape key to return to the compose mode"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:898
+msgid "_Toggle mode"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-console.c:898
+msgid "Switch between compose and execute modes"
+msgstr ""
+
+#: ../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
+#, c-format
+msgid "Could not remove favorite: %s"
+msgstr ""
+
+#: ../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
+#, c-format
+msgid "Could not add favorite: %s"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-favorite-selector.c:289
+#: ../tools/browser/query-exec/query-favorite-selector.c:273
+msgid "Favorite's properties"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-favorite-selector.c:311
+msgid "Specifications"
+msgstr ""
+
+#: ../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
+msgid "Favorites"
+msgstr "Favorit"
+
+#: ../tools/browser/data-manager/data-favorite-selector.c:612
+msgid "Unnamed data manager"
+msgstr ""
+
+#: ../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
+msgid "_Show favorites"
+msgstr ""
+
+#: ../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
+msgid "Show or hide favorites"
+msgstr ""
+
+#. Translators: Do not translate "table" nor "query"
+#: ../tools/browser/data-manager/data-source.c:401
+#, c-format
+msgid "Node must be \"table\" or \"query\", and is \"%s\""
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source.c:434
+#: ../tools/browser/schema-browser/mgr-columns.c:274
+#, c-format
+msgid "Not ready"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source.c:441
+#, c-format
+msgid "Malformed table name \"%s\""
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source.c:458
+#, c-format
+msgid "Could not find the \"%s\" table"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source.c:463
+#, c-format
+msgid "The \"%s\" object is not a table"
+msgstr ""
+
+#. Translators: Do not translate "name"
+#: ../tools/browser/data-manager/data-source.c:482
+#, c-format
+msgid "Missing attribute \"name\" for table"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source.c:622
+#, c-format
+msgid "Could not find any foreign key to \"%s\""
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source.c:627
+#, c-format
+msgid "The fields involved in the foreign key to \"%s\" are not known"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source.c:808
+#, c-format
+msgid "Statement to execute is not a selection statement"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source.c:948
+#, c-format
+msgid "No SELECT statement to execute"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source.c:1231
+#, c-format
+msgid "Contents of '%s'"
+msgstr "Isi dari '%s'"
+
+#: ../tools/browser/data-manager/data-source.c:1242
+#, c-format
+msgid "Could not build SELECT statement"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source.c:1309
+#, c-format
+msgid "Multiple statements detected, only the first will be used"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source-editor.c:125
+msgid ""
+"Data source's ID\n"
+"(as referenced by other data sources)"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source-editor.c:131
+#, fuzzy
+msgid "Data source's description"
+msgstr "Keterangan kolom"
+
+#: ../tools/browser/data-manager/data-source-editor.c:135
+msgid ""
+"Table to display data from, leave empty\n"
+"to specify a SELECT statement instead"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source-editor.c:139
+msgid ""
+"SELECT\n"
+"SQL"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source-editor.c:140
+msgid ""
+"Actual SQL executed\n"
+"to select data"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-source-editor.c:150
+#, fuzzy
+msgid "Dependencies:"
+msgstr "Ketergantungan:"
+
+#: ../tools/browser/data-manager/data-source-editor.c:243
+#, fuzzy
+msgid "Requires:"
+msgstr "Memerlukan:"
+
+#: ../tools/browser/data-manager/data-source-editor.c:260
+msgid "Exports:"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-widget.c:247
+msgid "Link to other data"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-widget.c:343
+#, fuzzy, c-format
+msgid "Error adding new data source: %s"
+msgstr "Galat saat membuat basis data: %s"
+
+#: ../tools/browser/data-manager/data-widget.c:388
+#, fuzzy
+msgid "Remove data source"
+msgstr "Tambah sumber data baru..."
+
+#: ../tools/browser/data-manager/data-widget.c:394
+#, fuzzy
+msgid "Show data source's properties"
+msgstr "Properti Sumber Data"
+
+#: ../tools/browser/data-manager/data-widget.c:532
+#, fuzzy
+msgid "Obtain referenced data in table "
+msgstr "Sisipkan data ke dalam tabel"
+
+#: ../tools/browser/data-manager/data-widget.c:549
+msgid "List referencing data in "
+msgstr ""
+
+#: ../tools/browser/data-manager/data-widget.c:615
+msgid "No data source defined"
+msgstr ""
+
+#: ../tools/browser/data-manager/data-widget.c:850
+msgid "Error: no detail"
+msgstr ""
+
+#: ../tools/browser/data-manager/ui-spec-editor.c:153
+#, fuzzy
+msgid "Data sources:"
+msgstr "Sumber Data"
+
+#: ../tools/browser/data-manager/ui-spec-editor.c:204
+#, fuzzy
+msgid "Selected data source's properties:"
+msgstr "Properti Sumber Data"
+
+#: ../tools/browser/data-manager/xml-spec-editor.c:171
+#, c-format
+msgid "Error parsing XML specifications"
+msgstr ""
+
+#: ../tools/browser/data-manager/xml-spec-editor.c:185
+#, c-format
+msgid "Expecting <%s> root node"
+msgstr ""
+
+#: ../tools/browser/data-manager/xml-spec-editor.c:320
+#: ../tools/browser/query-exec/query-console.c:309
+msgid "SQL code to execute:"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:283
+#: ../tools/browser/query-exec/query-console.c:1078
+msgid "Query editor"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:357
+#: ../tools/browser/query-exec/query-console.c:421
+msgid "Clear"
+msgstr "Bersihkan"
+
+#: ../tools/browser/query-exec/query-console.c:357
+msgid ""
+"Clear the editor's\n"
+"contents"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:362
+msgid ""
+"Show variables needed\n"
+"to execute SQL"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:368
+msgid "Execute SQL in editor"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:374
+msgid "Indent"
+msgstr "Indentasi"
+
+#: ../tools/browser/query-exec/query-console.c:374
+msgid ""
+"Indent SQL in editor\n"
+"and make the code more readable\n"
+"(removes comments)"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:382
+msgid "Favorite"
+msgstr "Favorit"
+
+#: ../tools/browser/query-exec/query-console.c:382
+msgid "Add SQL to favorite"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:396
+msgid "Execution history:"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:414
+msgid "Copy"
+msgstr "Salin"
+
+#: ../tools/browser/query-exec/query-console.c:414
+msgid ""
+"Copy selected history\n"
+"to editor"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:421
+msgid "Clear history"
+msgstr "Hapus riwayat"
+
+#: ../tools/browser/query-exec/query-console.c:433
+msgid "Execution Results:"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:677
+#: ../tools/browser/query-exec/query-favorite-selector.c:583
+msgid "Unnamed query"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:767
+msgid "Invalid variable's contents"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:768
+#: ../tools/browser/schema-browser/table-info.c:914
+msgid "assign values to the following variables"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:822
+#, c-format
+msgid "Error while parsing code: %s"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:834
+msgid ""
+"A query is already being executed, to execute another query, open a new "
+"connection."
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:867
+#: ../tools/browser/schema-browser/table-info.c:548
+#, c-format
+msgid "Error executing query: %s"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:920
+#: ../tools/browser/query-exec/query-console.c:971
+#: ../tools/browser/schema-browser/table-info.c:520
+#, c-format
+msgid ""
+"Error executing query:\n"
+"%s"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:931
+msgid "Statement executed"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:940
+msgid ""
+"A transaction has automatically been started\n"
+"during this statement's execution, this usually\n"
+"happens when blobs are selected (and the transaction\n"
+"will have to remain opened while the blobs are still\n"
+"accessible, clear the corresponding history item before\n"
+"closing the transaction)."
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:1028
+msgid "_Execute"
+msgstr "_Jalankan"
+
+#: ../tools/browser/query-exec/query-console.c:1028
+msgid "Execute query"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-console.c:1031
+msgid "_Undo"
+msgstr "_Batalkan"
+
+#: ../tools/browser/query-exec/query-console.c:1031
+msgid "Undo last change"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-editor.c:1186
+msgid "In the future:\n"
+msgstr "Di masa mendatang:\n"
+
+#: ../tools/browser/query-exec/query-editor.c:1190
+msgid "Less than a minute ago:\n"
+msgstr "kurang dari 1 menit yang lalu:\n"
+
+#: ../tools/browser/query-exec/query-editor.c:1195
+#, c-format
+msgid "%lu minute ago:\n"
+msgid_plural "%lu minutes ago:\n"
+msgstr[0] "%lu menit yang lalu:\n"
+
+#: ../tools/browser/query-exec/query-editor.c:1202
+#, c-format
+msgid "%lu hour ago\n"
+msgid_plural "%lu hours ago\n"
+msgstr[0] "%lu jam yang lalu:\n"
+
+#: ../tools/browser/query-exec/query-editor.c:1208
+#, c-format
+msgid "%lu day ago\n"
+msgid_plural "%lu days ago\n"
+msgstr[0] "%lu hari yang lalu:\n"
+
+#: ../tools/browser/query-exec/query-exec-perspective.c:389
+msgid "_Query"
+msgstr "_Query"
+
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
+msgid "_New editor"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
+msgid "Open a new query editor"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-favorite-selector.c:295
+msgid "SQL Code"
+msgstr "Kode SQL"
+
+#: ../tools/browser/query-exec/query-result.c:207
+msgid "Statement:"
+msgstr "Statement:"
+
+#: ../tools/browser/query-exec/query-result.c:241
+msgid "Number of rows impacted"
+msgstr "Cacah baris yang terpengaruh"
+
+#: ../tools/browser/query-exec/query-result.c:265
+msgid "Execution Parameters"
+msgstr "Parameter Eksekusi"
+
+#: ../tools/browser/query-exec/query-result.c:327
+msgid "No result selected"
+msgstr ""
+
+#: ../tools/browser/query-exec/query-result.c:386
+msgid "Number of rows impacted:"
+msgstr "Cacah baris yang terpengaruh:"
+
+#: ../tools/browser/query-exec/query-result.c:425
+msgid "Execution error:\n"
+msgstr "Galat eksekusi:\n"
+
+#: ../tools/browser/schema-browser/mgr-columns.c:292
+#, c-format
+msgid "Table not found"
+msgstr "Tabel tak ditemukan"
+
+#: ../tools/browser/schema-browser/mgr-columns.c:299
+#, c-format
+msgid "Requested object is not a table or view"
+msgstr ""
+
+#: ../tools/browser/schema-browser/mgr-columns.c:390
+msgid "Auto incremented"
+msgstr ""
+
+#: ../tools/browser/schema-browser/objects-index.c:170
+msgid "Tables' index"
+msgstr ""
+
+#: ../tools/browser/schema-browser/perspective-main.c:32
+msgid "Schema browser"
+msgstr "Peramban skema"
+
+#: ../tools/browser/schema-browser/relations-diagram.c:224
+#: ../tools/browser/schema-browser/relations-diagram.c:561
+msgid "Diagram"
+msgstr "Diagram"
+
+#: ../tools/browser/schema-browser/relations-diagram.c:234
+msgid "Could not save diagram"
+msgstr "Tak bisa menyimpan diagram"
+
+#: ../tools/browser/schema-browser/relations-diagram.c:260
+msgid "Canvas's name"
+msgstr "Nama kanvas"
+
+#: ../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
+msgid "Relations diagram"
+msgstr "Diagram relasi"
+
+#: ../tools/browser/schema-browser/relations-diagram.c:368
+#, c-format
+msgid "Error parsing favorite's contents"
+msgstr ""
+
+#: ../tools/browser/schema-browser/relations-diagram.c:377
+#: ../tools/browser/schema-browser/relations-diagram.c:457
+#, c-format
+msgid "'%s' diagram"
+msgstr "Diagram '%s'"
+
+#: ../tools/browser/schema-browser/relations-diagram.c:427
+#, c-format
+msgid "Missing table attribute in favorite's contents"
+msgstr ""
+
+#: ../tools/browser/schema-browser/relations-diagram.c:513
+#: ../tools/browser/schema-browser/table-info.c:946
+msgid "_Contents"
+msgstr "_Isi"
+
+#: ../tools/browser/schema-browser/relations-diagram.c:513
+msgid "View contents"
+msgstr ""
+
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:416
+msgid "Could not load diagram"
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-columns.c:228
+msgid "Foreign key on "
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-columns.c:303
+msgid "Unique constraint"
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-columns.c:334
+msgid "Tables referencing this one"
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-columns.c:448
+msgid "Column Name"
+msgstr "Nama Kolom"
+
+#: ../tools/browser/schema-browser/table-columns.c:503
+msgid "Constraints and integrity rules"
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-info.c:357
+msgid ""
+"Table not found. If you think this is an error,\n"
+"please refresh the meta data from the database\n"
+"(menu Connection/Fetch meta data)."
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-info.c:388
+#, fuzzy
+msgid "Relations"
+msgstr "Relasi:"
+
+#: ../tools/browser/schema-browser/table-info.c:398
+msgid "Preferences"
+msgstr "Preferensi"
+
+#: ../tools/browser/schema-browser/table-info.c:527
+msgid "Data successfully inserted"
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-info.c:666
+msgid "Meta data not yet available"
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-info.c:683
+msgid "Can't find information about table"
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-info.c:719
+#, c-format
+msgid ""
+"Internal error while building INSERT statement:\n"
+"%s"
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-info.c:765
+#, c-format
+msgid "Default value: '%s'"
+msgstr "Nilai baku: '%s'"
+
+#: ../tools/browser/schema-browser/table-info.c:775
+msgid "Default value: auto incremented value"
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-info.c:889
+#: ../tools/browser/schema-browser/table-info.c:913
+msgid "Values to insert into table"
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-info.c:944
+msgid "Add to _Favorites"
+msgstr "Tambah ke _Favorit"
+
+#: ../tools/browser/schema-browser/table-info.c:944
+msgid "Add table to favorites"
+msgstr "Tambahkan tabel ke favorit"
+
+#: ../tools/browser/schema-browser/table-info.c:946
+msgid "View table's contents"
+msgstr "Tilik isi tabel"
+
+#: ../tools/browser/schema-browser/table-info.c:948
+msgid "_Insert data"
+msgstr "S_isipkan data"
+
+#: ../tools/browser/schema-browser/table-info.c:948
+msgid "Insert data into table"
+msgstr "Sisipkan data ke dalam tabel"
+
+#: ../tools/browser/schema-browser/table-preferences.c:261
+msgid "default"
+msgstr "baku"
+
+#: ../tools/browser/schema-browser/table-preferences.c:338
+msgid "Table's fields"
+msgstr "Ruas tabel"
+
+#: ../tools/browser/schema-browser/table-preferences.c:382
+msgid "Field's display preferences"
+msgstr "Preferensi tampilan ruas"
+
+#: ../tools/browser/schema-browser/table-preferences.c:459
+msgid "Data entry type:"
+msgstr "Jenis entri data:"
+
+#: ../tools/browser/schema-browser/table-preferences.c:460
+msgid ""
+"Defines how data for the selected column\n"
+"will be displayed in forms. Leave 'Default' to have\n"
+"the default display"
+msgstr ""
+
+#: ../tools/browser/schema-browser/table-preferences.c:469
+#: ../tools/browser/schema-browser/table-preferences.c:480
+msgid "none"
+msgstr "tak ada"
+
+#: ../tools/browser/schema-browser/table-preferences.c:473
+msgid "Options:"
+msgstr "Opsi:"
+
+#: ../tools/browser/schema-browser/table-preferences.c:484
+msgid "Preview:"
+msgstr "Pratilik:"
+
+#: ../tools/browser/schema-browser/table-preferences.c:485
+msgid ""
+"Free form to test the configured\n"
+"data entry"
+msgstr ""
+
+#: ../tools/command-exec.c:329
+msgid "History is not supported"
+msgstr "Riwayat tak didukung"
+
+#: ../tools/command-exec.c:342 ../tools/command-exec.c:378
+#: ../tools/command-exec.c:421 ../tools/command-exec.c:463
+#: ../tools/command-exec.c:596 ../tools/gda-sql.c:2992 ../tools/gda-sql.c:4125
+#: ../tools/gda-sql.c:4215 ../tools/gda-sql.c:4440 ../tools/gda-sql.c:4541
+msgid "No current connection"
+msgstr "Kini tak ada koneksi"
+
+#: ../tools/command-exec.c:405
+msgid "List of tables"
+msgstr "Daftar tabel"
+
+#: ../tools/command-exec.c:447
+msgid "List of views"
+msgstr "Daftar view"
+
+#: ../tools/command-exec.c:487
+msgid "List of schemas"
+msgstr "Daftar skema"
+
+#: ../tools/command-exec.c:561 ../tools/command-exec.c:686
+msgid "No object found"
+msgstr "Objek tak ada yang ditemukan"
+
+#: ../tools/command-exec.c:640
+msgid "Schema"
+msgstr "Skema"
+
+#: ../tools/command-exec.c:715 ../tools/web-server.c:925
+msgid "Column"
+msgstr "Kolom"
+
+#: ../tools/command-exec.c:717 ../tools/web-server.c:927
+msgid "Nullable"
+msgstr ""
+
+#: ../tools/command-exec.c:719 ../tools/web-server.c:929
+msgid "Extra"
+msgstr "Ekstra"
+
+#: ../tools/command-exec.c:722
+#, c-format
+msgid "List of columns for view '%s'"
+msgstr ""
+
+#: ../tools/command-exec.c:726
+#, c-format
+msgid "List of columns for table '%s'"
+msgstr ""
+
+#: ../tools/command-exec.c:738 ../tools/web-server.c:940
+msgid "yes"
+msgstr "ya"
+
+#: ../tools/command-exec.c:738 ../tools/web-server.c:940
+msgid "no"
+msgstr "tidak"
+
+#: ../tools/command-exec.c:770
+#, fuzzy, c-format
+msgid "View definition: %s"
+msgstr "Definisi view:"
+
+#: ../tools/gda-list-server-op.c:29
+msgid "Gda server operations list"
+msgstr ""
+
+#: ../tools/gda-list-server-op.c:39
+#, c-format
+msgid "Using XML descriptions in %s\n"
+msgstr ""
+
+#: ../tools/gda-list-server-op.c:46
+#, c-format
+msgid "Could not create provider object: %s\n"
+msgstr ""
+
+#: ../tools/gda-list-server-op.c:55
+#, c-format
+msgid "Existing operation types for provider '%s':\n"
+msgstr ""
+
+#: ../tools/gda-list-server-op.c:57
+#, c-format
+msgid "Existing operation types:\n"
+msgstr ""
+
+#: ../tools/gda-list-server-op.c:75
+#, c-format
+msgid "Description for type: %s\n"
+msgstr ""
+
+#: ../tools/gda-list-server-op.c:88
+#, c-format
+msgid "Operation not supported\n"
+msgstr "Operasi tak didukung\n"
+
+#: ../tools/gda-list-server-op.c:90
+#, c-format
+msgid "Error: %s\n"
+msgstr "Galat: %s\n"
+
+#: ../tools/gda-list-server-op.c:340
+#, c-format
+msgid "Can't parse file '%s', ignoring it"
+msgstr ""
+
+#: ../tools/gda-sql.c:176
+#, c-format
+msgid "GDA SQL console version "
+msgstr "Versi konsol SQL GDA"
+
+#: ../tools/gda-sql.c:238
+#, c-format
+msgid "Welcome to the GDA SQL console, version "
+msgstr ""
+
+#: ../tools/gda-sql.c:240
+#, c-format
+msgid ""
+"Type: .copyright to show usage and distribution terms\n"
+"      .? for help with internal commands\n"
+"      .q (or CTRL-D) to quit\n"
+"      (the '.' can be replaced by a '\\')\n"
+"      or any query terminated by a semicolon\n"
+"\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:264
+#, c-format
+msgid "Opening connection '%s' for: %s\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:268
+#, c-format
+msgid "Can't open connection %d: %s\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:280
+#, c-format
+msgid "Opening connection '%s' for: %s (GDA_SQL_CNC environment variable)\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:285
+#, c-format
+msgid "Can't open connection defined by GDA_SQL_CNC: %s\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:300
+#, c-format
+msgid "Can't run HTTP server on port %d\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:767
+msgid "Connection closed"
+msgstr "Koneksi ditutup"
+
+#: ../tools/gda-sql.c:780
+msgid "Invalid unnamed command"
+msgstr ""
+
+#: ../tools/gda-sql.c:891
+msgid "Unknown internal command"
+msgstr ""
+
+#: ../tools/gda-sql.c:897
+msgid "Internal command not correctly defined"
+msgstr ""
+
+#: ../tools/gda-sql.c:903
+msgid "Incomplete internal command"
+msgstr ""
+
+#: ../tools/gda-sql.c:1013
+#, c-format
+msgid "Could not interpret the '%s' parameter's value"
+msgstr ""
+
+#: ../tools/gda-sql.c:1030
+#, c-format
+msgid "No internal parameter named '%s' required by query"
+msgstr ""
+
+#: ../tools/gda-sql.c:1147
+#, c-format
+msgid "Can't open file '%s' for writing: %s\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:1160
+#, c-format
+msgid "Can't open pipe '%s': %s\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:1199
+#, c-format
+msgid "Can't open file '%s' for reading: %s\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:1266 ../tools/gda-sql.c:3232
+#, c-format
+msgid "Connection name '%s' is invalid"
+msgstr "Nama koneksi '%s' tak valid"
+
+#: ../tools/gda-sql.c:1332
+#, c-format
+msgid "\tUsername for '%s': "
+msgstr "\tNama pengguna bagi '%s':"
+
+#: ../tools/gda-sql.c:1339
+#, c-format
+msgid "No username for '%s'"
+msgstr "Tak ada nama pengguna bagi '%s'"
+
+#: ../tools/gda-sql.c:1354
+#, c-format
+msgid "\tPassword for '%s': "
+msgstr "\tKata sandi bagi '%s':"
+
+#: ../tools/gda-sql.c:1363
+#, c-format
+msgid "No password for '%s'"
+msgstr "Tak ada kata sandi bagi '%s'"
+
+#: ../tools/gda-sql.c:1436
+#, c-format
+msgid ""
+"All the meta data associated to the '%s' connection will be stored in the '%"
+"s' file\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:1464
+#, c-format
+msgid "Error getting meta data in background: %s\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:1472 ../tools/gda-sql.c:1609
+#, c-format
+msgid ""
+"Getting database schema information for connection '%s', this may take some "
+"time... "
+msgstr ""
+
+#: ../tools/gda-sql.c:1479 ../tools/gda-sql.c:1616 ../tools/gda-sql.c:3048
+#, c-format
+msgid "error: %s\n"
+msgstr "galat: %s\n"
+
+#: ../tools/gda-sql.c:1486 ../tools/gda-sql.c:1623 ../tools/gda-sql.c:3055
+#, c-format
+msgid "Done.\n"
+msgstr "Selesai.\n"
+
+#: ../tools/gda-sql.c:1750
+#, c-format
+msgid "(%d row)"
+msgid_plural "(%d rows)"
+msgstr[0] "(%d baris)"
+
+#: ../tools/gda-sql.c:1852 ../tools/gda-sql.c:2872
+#, fuzzy
+msgid "Installed providers list"
+msgstr "Daftar penyedia terpasang"
+
+#: ../tools/gda-sql.c:1997 ../tools/gda-sql.c:2192 ../tools/gda-sql.c:2264
+#: ../tools/gda-sql.c:2276
+#, c-format
+msgid "%s [FILE]"
+msgstr "%s [BERKAS]"
+
+#: ../tools/gda-sql.c:1998
+msgid "Show commands history, or save it to file"
+msgstr ""
+
+#: ../tools/gda-sql.c:2008 ../tools/gda-sql.c:2020 ../tools/gda-sql.c:2032
+#: ../tools/gda-sql.c:2044 ../tools/gda-sql.c:2056 ../tools/gda-sql.c:2068
+#: ../tools/gda-sql.c:2081
+msgid "Information"
+msgstr "Informasi"
+
+#: ../tools/gda-sql.c:2009
+#, c-format
+msgid "%s [META DATA TYPE]"
+msgstr "%s [JENIS META DATA]"
+
+#: ../tools/gda-sql.c:2010
+msgid ""
+"Force reading the database meta data (or part of the meta data, ex:\"tables"
+"\")"
+msgstr ""
+
+#: ../tools/gda-sql.c:2021
+#, c-format
+msgid "%s [TABLE]"
+msgstr "%s [TABEL]"
+
+#: ../tools/gda-sql.c:2022
+msgid "List all tables (or named table)"
+msgstr ""
+
+#: ../tools/gda-sql.c:2033
+#, c-format
+msgid "%s [VIEW]"
+msgstr "%s [VIEW]"
+
+#: ../tools/gda-sql.c:2034
+msgid "List all views (or named view)"
+msgstr ""
+
+#: ../tools/gda-sql.c:2045
+#, c-format
+msgid "%s [SCHEMA]"
+msgstr "%s [SKEMA]"
+
+#: ../tools/gda-sql.c:2046
+msgid "List all schemas (or named schema)"
+msgstr ""
+
+#: ../tools/gda-sql.c:2057
+#, c-format
+msgid "%s [OBJ_NAME|SCHEMA.*]"
+msgstr ""
+
+#: ../tools/gda-sql.c:2058
+msgid "Describe object or full list of objects"
+msgstr ""
+
+#: ../tools/gda-sql.c:2069
+#, c-format
+msgid "%s [TABLE1 [TABLE2...]]"
+msgstr "%s [TABEL1 [TABEL2...]]"
+
+#: ../tools/gda-sql.c:2070
+msgid "Create a graph of all or the listed tables"
+msgstr ""
+
+#: ../tools/gda-sql.c:2082
+#, c-format
+msgid "%s [port [authentication token]]"
+msgstr ""
+
+#: ../tools/gda-sql.c:2083
+msgid "Start/stop embedded HTTP server (on given port or on 12345 by default)"
+msgstr ""
+
+#: ../tools/gda-sql.c:2096
+#, c-format
+msgid "%s [CNC_NAME [DSN|CONNECTION STRING]]"
+msgstr ""
+
+#: ../tools/gda-sql.c:2097
+msgid "Opens a new connection or lists opened connections"
+msgstr ""
+
+#: ../tools/gda-sql.c:2108
+#, c-format
+msgid "%s [CNC_NAME]"
+msgstr "%s [NAMA_CNC]"
+
+#: ../tools/gda-sql.c:2109
+msgid "Close a connection"
+msgstr "Tutup koneksi"
+
+#: ../tools/gda-sql.c:2120
+#, c-format
+msgid "%s CNC_NAME CNC_NAME1 CNC_NAME2 [CNC_NAME ...]"
+msgstr ""
+
+#: ../tools/gda-sql.c:2121
+msgid "Bind several connections together into the CNC_NAME virtual connection"
+msgstr ""
+
+#: ../tools/gda-sql.c:2131 ../tools/gda-sql.c:2143 ../tools/gda-sql.c:2155
+#: ../tools/gda-sql.c:2167
+msgid "DSN (data sources) management"
+msgstr ""
+
+#: ../tools/gda-sql.c:2132
+#, c-format
+msgid "%s [DSN]"
+msgstr "%s [DSN]"
+
+#: ../tools/gda-sql.c:2133
+msgid "List all DSN (or named DSN's attributes)"
+msgstr ""
+
+#: ../tools/gda-sql.c:2144
+#, c-format
+msgid "%s DSN_NAME DSN_DEFINITION [DESCRIPTION]"
+msgstr ""
+
+#: ../tools/gda-sql.c:2145
+msgid "Create (or modify) a DSN"
+msgstr ""
+
+#: ../tools/gda-sql.c:2156
+#, c-format
+msgid "%s DSN_NAME [DSN_NAME...]"
+msgstr ""
+
+#: ../tools/gda-sql.c:2157
+msgid "Remove a DSN"
+msgstr "Hapus suatu DSN"
+
+#: ../tools/gda-sql.c:2168
+#, c-format
+msgid "%s [PROVIDER]"
+msgstr "%s [PENYEDIA]"
+
+#: ../tools/gda-sql.c:2169
+msgid "List all installed database providers (or named one's attributes)"
+msgstr ""
+
+#: ../tools/gda-sql.c:2179 ../tools/gda-sql.c:2191 ../tools/gda-sql.c:2203
+#: ../tools/gda-sql.c:2215
+msgid "Input/Output"
+msgstr "Masukan/Keluaran"
+
+#: ../tools/gda-sql.c:2180 ../tools/gda-sql.c:2312
+#, c-format
+msgid "%s FILE"
+msgstr "%s BERKAS"
+
+#: ../tools/gda-sql.c:2181
+msgid "Execute commands from file"
+msgstr "Eksekusi perintah dari berkas"
+
+#: ../tools/gda-sql.c:2193
+msgid "Send output to a file or |pipe"
+msgstr "Kirim keluaran ke suatu berkas atau |pipe"
+
+#: ../tools/gda-sql.c:2204 ../tools/gda-sql.c:2216
+#, c-format
+msgid "%s [TEXT]"
+msgstr "%s [TEKS]"
+
+#: ../tools/gda-sql.c:2205
+msgid "Send output to stdout"
+msgstr "Kirim keluaran ke stdout"
+
+#: ../tools/gda-sql.c:2217
+msgid "Send output to output stream"
+msgstr "Kirim keluaran ke stream keluaran"
+
+#: ../tools/gda-sql.c:2229
+msgid "Quit"
+msgstr "Keluar"
+
+#: ../tools/gda-sql.c:2240
+#, c-format
+msgid "%s [DIR]"
+msgstr "%s [DIR]"
+
+#: ../tools/gda-sql.c:2241
+msgid "Change the current working directory"
+msgstr "Ubah direktori kerja kini"
+
+#: ../tools/gda-sql.c:2253
+msgid "Show usage and distribution terms"
+msgstr "Tampilkan syarat distribusi dan penggunaan"
+
+#: ../tools/gda-sql.c:2263 ../tools/gda-sql.c:2275 ../tools/gda-sql.c:2287
+#: ../tools/gda-sql.c:2299 ../tools/gda-sql.c:2311 ../tools/gda-sql.c:2323
+#: ../tools/gda-sql.c:2335 ../tools/gda-sql.c:2347 ../tools/gda-sql.c:2359
+#: ../tools/gda-sql.c:2371 ../tools/gda-sql.c:2383 ../tools/gda-sql.c:2420
+#: ../tools/gda-sql.c:2432
+msgid "Query buffer"
+msgstr "Penyangga query"
+
+#: ../tools/gda-sql.c:2265
+msgid "Edit the query buffer (or file) with external editor"
+msgstr ""
+
+#: ../tools/gda-sql.c:2277
+msgid "Reset the query buffer (fill buffer with contents of file)"
+msgstr ""
+
+#: ../tools/gda-sql.c:2289
+msgid "Show the contents of the query buffer"
+msgstr ""
+
+#: ../tools/gda-sql.c:2300
+#, c-format
+msgid "%s [QUERY_BUFFER_NAME]"
+msgstr ""
+
+#: ../tools/gda-sql.c:2301
+msgid "Execute contents of query buffer, or named query buffer"
+msgstr ""
+
+#: ../tools/gda-sql.c:2313
+msgid "Write query buffer to file"
+msgstr ""
+
+#: ../tools/gda-sql.c:2324 ../tools/gda-sql.c:2336 ../tools/gda-sql.c:2348
+#, c-format
+msgid "%s QUERY_BUFFER_NAME"
+msgstr ""
+
+#: ../tools/gda-sql.c:2325
+msgid "Save query buffer to dictionary"
+msgstr ""
+
+#: ../tools/gda-sql.c:2337
+msgid "Load query buffer from dictionary"
+msgstr ""
+
+#: ../tools/gda-sql.c:2349
+msgid "Delete query buffer from dictionary"
+msgstr ""
+
+#: ../tools/gda-sql.c:2360
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../tools/gda-sql.c:2361
+msgid "List all saved query buffers in dictionary"
+msgstr ""
+
+#: ../tools/gda-sql.c:2372
+#, c-format
+msgid "%s [NAME [VALUE|_null_]]"
+msgstr ""
+
+#: ../tools/gda-sql.c:2373
+msgid "Set or show internal parameter, or list all if no parameters"
+msgstr ""
+
+#: ../tools/gda-sql.c:2384
+#, c-format
+msgid "%s [NAME]"
+msgstr "%s [NAMA]"
+
+#: ../tools/gda-sql.c:2385
+msgid "Unset (delete) internal named parameter (or all parameters)"
+msgstr ""
+
+#: ../tools/gda-sql.c:2395
+#, fuzzy
+msgid "Formatting"
+msgstr "Memformat %s (%s)"
+
+#: ../tools/gda-sql.c:2397
+msgid "Set output format"
+msgstr "Tata bentuk keluaran"
+
+#: ../tools/gda-sql.c:2421
+#, c-format
+msgid "%s [NAME|TABLE COLUMN ROW_CONDITION] FILE"
+msgstr ""
+
+#: ../tools/gda-sql.c:2422
+msgid "Export internal parameter or table's value to the FILE file"
+msgstr ""
+
+#: ../tools/gda-sql.c:2433
+#, c-format
+msgid "%s NAME [FILE|TABLE COLUMN ROW_CONDITION]"
+msgstr ""
+
+#: ../tools/gda-sql.c:2434
+msgid ""
+"Set internal parameter as the contents of the FILE file or from an existing "
+"table's value"
+msgstr ""
+
+#: ../tools/gda-sql.c:2447
+msgid "List all available commands"
+msgstr ""
+
+#: ../tools/gda-sql.c:2512
+#, c-format
+msgid "Unknown output format: '%s', reset to default"
+msgstr ""
+
+#: ../tools/gda-sql.c:2657 ../tools/gda-sql.c:2832
+msgid "Attribute"
+msgstr "Atribut"
+
+#: ../tools/gda-sql.c:2660
+#, c-format
+msgid "DSN '%s' description"
+msgstr ""
+
+#: ../tools/gda-sql.c:2688
+#, c-format
+msgid "Could not find any DSN named '%s'"
+msgstr ""
+
+#: ../tools/gda-sql.c:2699
+msgid "DSN list"
+msgstr "Daftar DSN"
+
+#: ../tools/gda-sql.c:2751 ../tools/gda-sql.c:4564
+msgid "Missing arguments"
+msgstr "Argumen hilang"
+
+#: ../tools/gda-sql.c:2772
+msgid "Missing provider name"
+msgstr "Nama penyedia hilang"
+
+#: ../tools/gda-sql.c:2795
+msgid "Missing DSN name"
+msgstr "Nama DSN hilang"
+
+#: ../tools/gda-sql.c:2835
+#, c-format
+msgid "Provider '%s' description"
+msgstr "Keterangan penyedia '%s'"
+
+#: ../tools/gda-sql.c:2863
+#, c-format
+msgid "Could not find any provider named '%s'"
+msgstr "Tak bisa temukan penyedia bernama '%s'"
+
+#: ../tools/gda-sql.c:2938 ../tools/gda-sql.c:3227
+#, c-format
+msgid "A connection named '%s' already exists"
+msgstr "Koneksi bernama '%s' telah ada"
+
+#: ../tools/gda-sql.c:3042
+#, c-format
+msgid "Getting database schema information, this may take some time... "
+msgstr ""
+
+#: ../tools/gda-sql.c:3077
+msgid "No opened connection"
+msgstr "Tak ada koneksi terbuka"
+
+#: ../tools/gda-sql.c:3088
+msgid "DSN or connection string"
+msgstr "String koneksi atau DSN"
+
+#: ../tools/gda-sql.c:3179
+msgid "No connection currently opened"
+msgstr "Tak ada koneksi yang kini terbuka"
+
+#: ../tools/gda-sql.c:3219
+msgid "Missing required connection names"
+msgstr "Kehilangan nama koneksi yang diperlukan"
+
+#. add existing connections to virtual connection
+#: ../tools/gda-sql.c:3256
+msgid "Bound connections are as:"
+msgstr ""
+
+#: ../tools/gda-sql.c:3359
+#, c-format
+msgid "Could not get home directory: %s"
+msgstr "Tak bisa mendapat direktori home: %s"
+
+#: ../tools/gda-sql.c:3385
+#, c-format
+msgid "Working directory is now: %s"
+msgstr "Direktori kerja kini: %s"
+
+#: ../tools/gda-sql.c:3389
+#, c-format
+msgid "Could not change working directory to '%s': %s"
+msgstr "Tak bisa mengubah direktori kerja ke '%s': %s"
+
+#: ../tools/gda-sql.c:3416 ../tools/gda-sql.c:3519 ../tools/gda-sql.c:3562
+#: ../tools/gda-sql.c:3591 ../tools/gda-sql.c:3632 ../tools/gda-sql.c:3683
+#: ../tools/gda-sql.c:3736 ../tools/gda-sql.c:3827 ../tools/gda-sql.c:3899
+msgid "No connection opened"
+msgstr "Tak ada koneksi terbuka"
+
+#: ../tools/gda-sql.c:3434
+#, c-format
+msgid "Could not write to temporary file '%s': %s"
+msgstr "Tak bisa menulis ke berkas temporer '%s': %s"
+
+#: ../tools/gda-sql.c:3470
+#, c-format
+msgid "could not start editor '%s'"
+msgstr ""
+
+#: ../tools/gda-sql.c:3475
+#, c-format
+msgid "Could not start /bin/sh"
+msgstr ""
+
+#: ../tools/gda-sql.c:3640
+msgid "Missing FILE to write to"
+msgstr ""
+
+#: ../tools/gda-sql.c:3692 ../tools/gda-sql.c:3758 ../tools/gda-sql.c:3840
+#: ../tools/gda-sql.c:3912
+msgid "Can't initialize dictionary to store query buffers"
+msgstr ""
+
+#: ../tools/gda-sql.c:3711
+msgid "Query buffer name"
+msgstr ""
+
+#: ../tools/gda-sql.c:3712
+msgid "SQL"
+msgstr "SQL"
+
+#: ../tools/gda-sql.c:3749 ../tools/gda-sql.c:3878 ../tools/gda-sql.c:3939
+msgid "Missing query buffer name"
+msgstr ""
+
+#: ../tools/gda-sql.c:3806
+msgid "Query buffer is empty"
+msgstr ""
+
+#: ../tools/gda-sql.c:3873
+#, c-format
+msgid "Could not find query buffer named '%s'"
+msgstr ""
+
+#: ../tools/gda-sql.c:4003 ../tools/gda-sql.c:4253 ../tools/gda-sql.c:4331
+#, c-format
+msgid "No parameter named '%s' defined"
+msgstr ""
+
+#: ../tools/gda-sql.c:4014
+msgid "List of defined parameters"
+msgstr ""
+
+#: ../tools/gda-sql.c:4070 ../tools/gda-sql.c:4592
+msgid "Wrong row condition"
+msgstr ""
+
+#: ../tools/gda-sql.c:4098
+msgid "No unique row identified"
+msgstr ""
+
+#: ../tools/gda-sql.c:4139 ../tools/gda-sql.c:4231 ../tools/gda-sql.c:4555
+#, c-format
+msgid "Too many arguments"
+msgstr "Terlalu banyak argumen"
+
+#: ../tools/gda-sql.c:4187 ../tools/gda-sql.c:4259
+msgid "Wrong number of arguments"
+msgstr "Cacah argumen salah"
+
+#: ../tools/gda-sql.c:4271 ../tools/gda-sql.c:4285
+msgid "Could not write file"
+msgstr "Tak bisa menulis berkas"
+
+#: ../tools/gda-sql.c:4410
+#, c-format
+msgid "Graph written to '%s'\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:4413
+#, c-format
+msgid ""
+"Graph written to '%s'\n"
+"Use 'dot' (from the GraphViz package) to create a picture, for example:\n"
+"\tdot -Tpng -o graph.png %s\n"
+"Note: set the GDA_SQL_VIEWER_PNG or GDA_SQL_VIEWER_PDF environment variables "
+"to view the graph\n"
+msgstr ""
+
+#: ../tools/gda-sql.c:4484
+msgid "HTTPD server stopped"
+msgstr "Server HTTPD dihentikan"
+
+#: ../tools/gda-sql.c:4503
+msgid "Could not start HTTPD server"
+msgstr "Tak bisa memulai server HTTPD"
+
+#: ../tools/gda-sql.c:4507
+msgid "HTTPD server started"
+msgstr "Server HTTP dijalankan"
+
+#: ../tools/gda-sql.c:4512
+msgid "Invalid port specification"
+msgstr "Spesifikasi port tak valid"
+
+#: ../tools/gda-sql.c:4726
+#, c-format
+msgid "Command is incomplete"
+msgstr "Perintah tak lengkap"
+
+#: ../tools/html-doc.c:69
+msgid "Generated by the GDA SQL console"
+msgstr ""
+
+#: ../tools/html-doc.c:91
+msgid "Console"
+msgstr "Konsol"
+
+#: ../tools/tools-input.c:322
+#, c-format
+msgid "Could not save history file to '%s': %s"
+msgstr ""
+
+#: ../tools/web-server.c:566 ../tools/web-server.c:567
+msgid "Authentication required"
+msgstr "Perlu otentikasi"
+
+#: ../tools/web-server.c:631
+msgid "Token:"
+msgstr "Token:"
+
+#: ../tools/web-server.c:772
+msgid "SQL console:"
+msgstr "Konsol SQL"
+
+#: ../tools/web-server.c:852 ../tools/web-server.c:1872
+msgid "Tables"
+msgstr "Tabel"
+
+#: ../tools/web-server.c:852
+#, c-format
+msgid "Tables in the '%s' schema"
+msgstr "Tabel dalam skema '%s'"
+
+#: ../tools/web-server.c:858 ../tools/web-server.c:1877
+msgid "Views"
+msgstr "View"
+
+#: ../tools/web-server.c:858
+#, c-format
+msgid "Views in the '%s' schema"
+msgstr "View dalam skema '%s'"
+
+#: ../tools/web-server.c:917
+#, c-format
+msgid "Columns for the '%s' table:"
+msgstr "Kolom bagi tabel '%s':"
+
+#: ../tools/web-server.c:963
+msgid "Primary key:"
+msgstr "Kunci primer:"
+
+#: ../tools/web-server.c:1068
+msgid "Relations:"
+msgstr "Relasi:"
+
+#: ../tools/web-server.c:1085
+msgid "Foreign keys:"
+msgstr "Kunci foreign:"
+
+#: ../tools/web-server.c:1097
+#, c-format
+msgid "To '%s':"
+msgstr "Ke '%s': "
+
+#: ../tools/web-server.c:1271
+msgid "View definition:"
+msgstr "Definisi view:"
+
+#: ../tools/web-server.c:1346
+#, c-format
+msgid "Trigger '%s' for the '%s.%s' table:"
+msgstr "Trigger '%s' bagi tabel '%s.%s':"
+
+#: ../tools/web-server.c:1366
+#, c-format
+msgid "Trigger fired for: %s"
+msgstr ""
+
+#: ../tools/web-server.c:1370
+#, c-format
+msgid "Time at which the trigger is fired: %s"
+msgstr ""
+
+#: ../tools/web-server.c:1374
+msgid "Action:"
+msgstr "Aksi:"
+
+#: ../tools/web-server.c:1604
+msgid "Triggers:"
+msgstr "Trigger:"
+
+#: ../tools/web-server.c:1636 ../tools/web-server.c:1730
+#, c-format
+msgid "For the '%s.%s' table:"
+msgstr "Bagi tabel '%s.%s':"
+
+#: ../tools/web-server.c:1702
+#, c-format
+msgid "Triggers in the '%s' schema:"
+msgstr "Trigger di skema '%s':"
+
+#: ../tools/web-server.c:1856
+#, c-format
+msgid "Database information for '%s'"
+msgstr "Informasi basis data bagi '%s'"
+
+#: ../tools/web-server.c:1861
+msgid "Database information"
+msgstr "Informasi basis data"
+
+#: ../tools/web-server.c:1870
+msgid "Objects"
+msgstr "Objek"
+
+#: ../tools/web-server.c:1882
+msgid "Triggers"
+msgstr "Trigger"
diff --git a/po/sl.po b/po/sl.po
index 1de28fe..629d413 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -9,8 +9,8 @@ msgid ""
 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-07-28 20:12+0000\n"
-"PO-Revision-Date: 2010-07-29 13:38+0100\n"
+"POT-Creation-Date: 2010-09-09 14:42+0000\n"
+"PO-Revision-Date: 2010-09-10 20:31+0100\n"
 "Last-Translator: Matej UrbanÄ?iÄ? <mateju svn gnome org>\n"
 "Language-Team: Slovenian GNOME Translation Team <gnome-si googlegroups com>\n"
 "MIME-Version: 1.0\n"
@@ -96,9 +96,9 @@ msgstr "Ni mogoÄ?e izvesti programa za brskanje"
 
 #. FIXME: add a notice somewhere in the UI
 #: ../control-center/dsn-properties-dialog.c:283
-#: ../libgda/gda-connection.c:1523
-#: ../libgda/gda-data-model.c:2029
-#: ../libgda/gda-data-model.c:2037
+#: ../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
@@ -145,49 +145,53 @@ msgstr "Ni mogoÄ?e izvesti programa za brskanje"
 #: ../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:1706
-#: ../providers/postgres/gda-postgres-provider.c:1721
-#: ../providers/postgres/gda-postgres-util.c:87
-#: ../providers/postgres/gda-postgres-util.c:90
-#: ../tools/browser/auth-dialog.c:676
-#: ../tools/browser/auth-dialog.c:679
-#: ../tools/browser/browser-connection.c:351
-#: ../tools/browser/browser-connection.c:411
-#: ../tools/browser/browser-connection.c:431
-#: ../tools/browser/browser-connection.c:615
-#: ../tools/browser/browser-connection.c:635
-#: ../tools/browser/browser-connection.c:843
-#: ../tools/browser/browser-window.c:805
-#: ../tools/browser/browser-window.c:819
-#: ../tools/browser/browser-window.c:833
-#: ../tools/browser/browser-window.c:945
-#: ../tools/browser/browser-window.c:986
+#: ../providers/postgres/gda-postgres-provider.c:1673
+#: ../providers/postgres/gda-postgres-provider.c:1688
+#: ../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/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:629
-#: ../tools/browser/query-exec/query-console.c:690
-#: ../tools/browser/query-exec/query-console.c:829
-#: ../tools/browser/query-exec/query-console.c:874
-#: ../tools/browser/query-exec/query-console.c:928
-#: ../tools/browser/query-exec/query-console.c:978
+#: ../tools/browser/data-manager/data-favorite-selector.c:627
+#: ../tools/browser/data-manager/data-widget.c:345
+#: ../tools/browser/data-manager/data-widget.c:613
+#: ../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:601
+#: ../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:359
-#: ../tools/browser/schema-browser/relations-diagram.c:241
-#: ../tools/browser/schema-browser/table-info.c:475
-#: ../tools/browser/schema-browser/table-info.c:528
-#: ../tools/browser/schema-browser/table-info.c:554
-#: ../tools/browser/schema-browser/table-info.c:848
-#: ../tools/browser/schema-browser/table-preferences.c:705
-#: ../tools/browser/schema-browser/table-preferences.c:778
+#: ../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/gda-list-server-op.c:47
 #: ../tools/gda-list-server-op.c:90
 #: ../tools/gda-sql.c:269
@@ -196,9 +200,9 @@ msgstr "Ni mogoÄ?e izvesti programa za brskanje"
 #: ../tools/gda-sql.c:1465
 #: ../tools/gda-sql.c:1480
 #: ../tools/gda-sql.c:1617
-#: ../tools/gda-sql.c:3047
+#: ../tools/gda-sql.c:3049
 #: ../tools/tools-input.c:129
-#: ../tools/web-server.c:2019
+#: ../tools/web-server.c:2018
 msgid "No detail"
 msgstr "Brez podrobnosti"
 
@@ -349,7 +353,7 @@ msgstr ""
 
 #. connection's authentication
 #: ../control-center/gdaui-dsn-editor.c:223
-#: ../libgda/gda-config.c:1331
+#: ../libgda/gda-config.c:1337
 #: ../tools/browser/auth-dialog.c:281
 msgid "Authentication"
 msgstr "Overitev"
@@ -379,7 +383,7 @@ msgstr ""
 
 #: ../control-center/main.c:57
 #: ../libgda-ui/internal/utility.c:529
-#: ../tools/browser/support.c:137
+#: ../tools/browser/support.c:152
 msgid "Error:"
 msgstr "Napaka:"
 
@@ -392,7 +396,7 @@ msgid "No valid data source info was created"
 msgstr "Ni ustvarjenih veljavnih podatkov o viru"
 
 #: ../control-center/main.c:184
-#: ../tools/browser/browser-window.c:1028
+#: ../tools/browser/browser-window.c:1228
 msgid "Database access services for the GNOME Desktop"
 msgstr "Storitev dostopa do podatkovnih zbirk za GNOME namizje."
 
@@ -446,86 +450,87 @@ msgstr "IzmaliÄ?eno ime podatkovnega vira '%s'"
 msgid "Couldn't save authentification information for DSN '%s': %s"
 msgstr "Ni mogoÄ?e shraniti podatkov overitve za DSN '%s': %s"
 
-#: ../libgda/gda-config.c:872
-#: ../libgda/gda-config.c:998
+#: ../libgda/gda-config.c:874
+#: ../libgda/gda-config.c:1002
 msgid "Can't manage system-wide configuration"
 msgstr "Ni mogoÄ?e upravljati s sistemskimi nastavitvami"
 
-#: ../libgda/gda-config.c:927
+#: ../libgda/gda-config.c:929
 #, c-format
 msgid "Authentification for the '%s' DSN"
 msgstr "Overitev za '%s' DSN"
 
-#: ../libgda/gda-config.c:962
+#: ../libgda/gda-config.c:964
 #, c-format
 msgid "Couldn't delete authentication information for DSN '%s': %s"
 msgstr "Ni mogoÄ?e izbrisati podatkov overitve za DSN '%s': %s"
 
-#: ../libgda/gda-config.c:992
+#: ../libgda/gda-config.c:996
 #: ../libgda-ui/gdaui-login.c:632
 #, c-format
 msgid "Unknown DSN '%s'"
 msgstr "Neznan DSN '%s'"
 
-#: ../libgda/gda-config.c:1063
+#: ../libgda/gda-config.c:1067
 #, c-format
 msgid "Provider '%s' not found"
 msgstr "Ponudnika '%s' ni mogoÄ?e najti"
 
-#: ../libgda/gda-config.c:1246
-#: ../libgda/gda-connection.c:1013
-#: ../libgda/gda-connection.c:1167
+#: ../libgda/gda-config.c:1252
+#: ../libgda/gda-connection.c:1016
+#: ../libgda/gda-connection.c:1173
 #, c-format
 msgid "No provider '%s' installed"
 msgstr "Ni nameÅ¡Ä?enega ponudnika '%s'"
 
-#: ../libgda/gda-config.c:1261
+#: ../libgda/gda-config.c:1267
 #, c-format
 msgid "Can't load provider: %s"
 msgstr "Ni mogoÄ?e naložiti ponudnika: %s"
 
-#: ../libgda/gda-config.c:1284
+#: ../libgda/gda-config.c:1290
 #, c-format
 msgid "Can't instantiate provider '%s'"
 msgstr "Ni mogoÄ?e naložiti ponudnika '%s'"
 
-#: ../libgda/gda-config.c:1328
+#: ../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:1850
-#: ../tools/gda-sql.c:2696
-#: ../tools/gda-sql.c:2868
-#: ../tools/gda-sql.c:3085
+#: ../tools/gda-sql.c:2698
+#: ../tools/gda-sql.c:2870
+#: ../tools/gda-sql.c:3087
 msgid "Provider"
 msgstr "Ponudnik"
 
-#: ../libgda/gda-config.c:1329
+#: ../libgda/gda-config.c:1335
 #: ../libgda/gda-data-model-dsn-list.c:117
 #: ../libgda/gda-data-model-dsn-list.c:118
 #: ../libgda/gda-server-provider-extra.c:377
 #: ../libgda/gda-server-provider-extra.c:400
+#: ../tools/browser/data-manager/data-source-editor.c:130
 #: ../tools/gda-sql.c:1851
-#: ../tools/gda-sql.c:2695
-#: ../tools/gda-sql.c:2869
+#: ../tools/gda-sql.c:2697
+#: ../tools/gda-sql.c:2871
 msgid "Description"
 msgstr "Opis"
 
-#: ../libgda/gda-config.c:1330
+#: ../libgda/gda-config.c:1336
 msgid "DSN parameters"
 msgstr "Parametri DSN"
 
-#: ../libgda/gda-config.c:1332
+#: ../libgda/gda-config.c:1338
 msgid "File"
 msgstr "Datoteka"
 
-#: ../libgda/gda-config.c:1333
+#: ../libgda/gda-config.c:1339
 msgid "List of installed providers"
 msgstr "Seznam nameÅ¡Ä?enih ponudnikov"
 
-#: ../libgda/gda-config.c:1497
+#: ../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:3087
+#: ../tools/gda-sql.c:3089
 msgid "Username"
 msgstr "Uporabniško ime"
 
@@ -534,7 +539,7 @@ msgstr "Uporabniško ime"
 #. This file contains the CREATE ROLE operation's parameters, which is
 #. available since PostgreSQL 8.1
 #.
-#: ../libgda/gda-config.c:1499
+#: ../libgda/gda-config.c:1505
 #: ../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
@@ -542,7 +547,7 @@ msgstr "Uporabniško ime"
 msgid "Password"
 msgstr "Geslo"
 
-#: ../libgda/gda-config.c:1569
+#: ../libgda/gda-config.c:1575
 #, c-format
 msgid "Error loading provider '%s': %s"
 msgstr "Napaka med nalaganjem ponudnika '%s': %s"
@@ -608,137 +613,137 @@ msgstr "Ni doloÄ?enega DSN z imenom '%s'"
 msgid "Can't set the '%s' property once the connection is opened"
 msgstr "Ni mogoÄ?e doloÄ?iti lastnosti '%s', ko je povezava odprta"
 
-#: ../libgda/gda-connection.c:958
-#: ../libgda/gda-connection.c:1108
+#: ../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
 msgid "Multi threading is not supported or enabled"
 msgstr "VeÄ?kratno nitenje ni podprto ali omogoÄ?eno"
 
-#: ../libgda/gda-connection.c:967
+#: ../libgda/gda-connection.c:970
 #, c-format
 msgid "Malformed data source specification '%s'"
 msgstr "Nepravilno oblikovani podatki vira '%s'"
 
-#: ../libgda/gda-connection.c:975
-#: ../libgda/gda-connection.c:1355
-#: ../libgda/gda-connection.c:1357
+#: ../libgda/gda-connection.c:978
+#: ../libgda/gda-connection.c:1361
+#: ../libgda/gda-connection.c:1363
 #, c-format
 msgid "Data source %s not found in configuration"
 msgstr "Vira podatkov %s ni mogoÄ?e najti med nastavitvami"
 
-#: ../libgda/gda-connection.c:1041
+#: ../libgda/gda-connection.c:1044
 msgid "Datasource configuration error: no provider specified"
 msgstr "Napaka nastavitve podatkovnega vira: ni navedenega ponudnika"
 
-#: ../libgda/gda-connection.c:1118
-#: ../tools/browser/auth-dialog.c:415
-#: ../tools/browser/auth-dialog.c:451
+#: ../libgda/gda-connection.c:1124
+#: ../tools/browser/auth-dialog.c:417
+#: ../tools/browser/auth-dialog.c:453
 #: ../tools/gda-sql.c:1309
 #, c-format
 msgid "Malformed connection string '%s'"
 msgstr "IzmaliÄ?en niz povezave '%s'"
 
-#: ../libgda/gda-connection.c:1124
-#: ../libgda/gda-connection.c:1379
+#: ../libgda/gda-connection.c:1130
+#: ../libgda/gda-connection.c:1385
 msgid "No provider specified"
 msgstr "Ni doloÄ?enega ponudnika"
 
-#: ../libgda/gda-connection.c:1367
-#: ../libgda/gda-connection.c:1369
+#: ../libgda/gda-connection.c:1373
+#: ../libgda/gda-connection.c:1375
 msgid "No DSN or connection string specified"
 msgstr "Ni doloÄ?enega DSN ali niza povezave"
 
-#: ../libgda/gda-connection.c:1399
+#: ../libgda/gda-connection.c:1405
 msgid "Provider does not allow usage from this thread"
 msgstr "Ponudnik ne dovoli uporabe iz te niti"
 
-#: ../libgda/gda-connection.c:1413
+#: ../libgda/gda-connection.c:1419
 msgid "Internal error: provider does not implement the open_connection() virtual method"
 msgstr "Notranja napaka: ponudnik ne omogoÄ?a navidezne metode open_connection()"
 
-#: ../libgda/gda-connection.c:1522
+#: ../libgda/gda-connection.c:1528
 #, c-format
 msgid "Error while maintaining the meta data up to date: %s"
 msgstr "Napaka med upravljanjem metapodatkov posodobitve: %s"
 
-#: ../libgda/gda-connection.c:2173
+#: ../libgda/gda-connection.c:2179
 msgid "Provider does not support statement preparation"
 msgstr "Ponudnik ne podpira priprave izjav"
 
-#: ../libgda/gda-connection.c:2368
-#: ../libgda/gda-connection.c:2454
-#: ../libgda/gda-connection.c:2524
+#: ../libgda/gda-connection.c:2374
+#: ../libgda/gda-connection.c:2460
+#: ../libgda/gda-connection.c:2530
 #: ../libgda/gda-meta-store.c:659
 #, c-format
 msgid "Can't obtain connection lock"
 msgstr "Ni mogoÄ?e pridobiti zaklepa povezave"
 
-#: ../libgda/gda-connection.c:2375
-#: ../libgda/gda-connection.c:2591
-#: ../libgda/gda-connection.c:2862
-#: ../libgda/gda-connection.c:2932
-#: ../libgda/gda-connection.c:3002
+#: ../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
 #, c-format
 msgid "Connection is closed"
 msgstr "Povezava je zaprta"
 
-#: ../libgda/gda-connection.c:2469
-#: ../libgda/gda-connection.c:2559
+#: ../libgda/gda-connection.c:2475
+#: ../libgda/gda-connection.c:2565
 #, c-format
 msgid "Can't find task %u"
 msgstr "Ni mogoÄ?e najti naloge %u"
 
-#: ../libgda/gda-connection.c:2547
+#: ../libgda/gda-connection.c:2553
 #: ../libgda/sqlite/gda-sqlite-provider.c:1008
 #: ../libgda/thread-wrapper/gda-thread-provider.c:917
 #: ../providers/jdbc/gda-jdbc-provider.c:575
 #: ../providers/mysql/gda-mysql-provider.c:963
-#: ../providers/postgres/gda-postgres-provider.c:896
+#: ../providers/postgres/gda-postgres-provider.c:863
 #: ../providers/web/gda-web-provider.c:674
 msgid "Provider does not support asynchronous server operation"
 msgstr "Ponudnik ne podpira neusklajenih opravil strežnika"
 
-#: ../libgda/gda-connection.c:2733
-#: ../libgda/gda-connection.c:2748
+#: ../libgda/gda-connection.c:2739
+#: ../libgda/gda-connection.c:2754
 msgid "Statement is a selection statement"
 msgstr "Izjava je izjava izbire"
 
-#: ../libgda/gda-connection.c:2806
-#: ../libgda/gda-connection.c:2882
-#: ../libgda/gda-connection.c:2952
+#: ../libgda/gda-connection.c:2812
+#: ../libgda/gda-connection.c:2888
+#: ../libgda/gda-connection.c:2958
 msgid "Statement is not a selection statement"
 msgstr "Izjava ni izjava izbire"
 
-#: ../libgda/gda-connection.c:3411
+#: ../libgda/gda-connection.c:3417
 msgid "Invalid argument"
 msgstr "Neveljaven argument"
 
-#: ../libgda/gda-connection.c:3420
+#: ../libgda/gda-connection.c:3426
 #, c-format
 msgid "Missing or wrong arguments for table '%s': %s"
 msgstr "Manjkajo ali pa so napaÄ?no navedeni argumenti preglednice '%s': %s"
 
-#: ../libgda/gda-connection.c:4175
+#: ../libgda/gda-connection.c:4181
 msgid "Meta update error"
 msgstr "Napaka med posodabljanjem metapodatkov"
 
-#: ../libgda/gda-connection.c:4738
+#: ../libgda/gda-connection.c:4744
 msgid "Wrong filter arguments"
 msgstr "Neveljavni argumenti filtra"
 
-#: ../libgda/gda-connection.c:4926
-#: ../libgda/gda-connection.c:4979
-#: ../libgda/gda-connection.c:5023
-#: ../libgda/gda-connection.c:5067
-#: ../libgda/gda-connection.c:5111
+#: ../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
 #, c-format
 msgid "Connection transaction status tracking: no transaction exists for %s"
 msgstr "Sledenje stanja povezave prenosa: ni prenosa za %s"
 
-#: ../libgda/gda-connection.c:5416
+#: ../libgda/gda-connection.c:5422
 #: ../libgda/sqlite/virtual/gda-virtual-connection.c:235
 msgid "Internal error: invalid provider handle"
 msgstr "Notranja napaka: neveljaven upravljalnik ponudnika"
@@ -755,7 +760,7 @@ msgstr "Notranja napaka: neveljaven upravljalnik ponudnika"
 #: ../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:3475
+#: ../libgda/gda-data-proxy.c:3494
 #: ../libgda/gda-data-select.c:1197
 #: ../libgda/gda-data-select.c:1693
 #: ../libgda/gda-data-select.c:2588
@@ -818,8 +823,8 @@ msgstr "Ali je mogoÄ?e podatkovni model spremeniti"
 #: ../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:3424
-#: ../libgda/gda-data-proxy.c:3462
+#: ../libgda/gda-data-proxy.c:3443
+#: ../libgda/gda-data-proxy.c:3481
 #: ../libgda/gda-data-select.c:1649
 #: ../libgda/gda-data-select.c:1703
 #, c-format
@@ -833,8 +838,8 @@ msgstr "Vrstica %d je izven obmoÄ?ja (0-%d)"
 #: ../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:3427
-#: ../libgda/gda-data-proxy.c:3465
+#: ../libgda/gda-data-proxy.c:3446
+#: ../libgda/gda-data-proxy.c:3484
 #: ../libgda/gda-data-select.c:1652
 #: ../libgda/gda-data-select.c:1706
 #, c-format
@@ -899,123 +904,123 @@ msgstr "PriÄ?akovana je vrednost GdaBinary, pridobljena pa %s"
 msgid "Key modification is not supported"
 msgstr "Spreminjanje kljuÄ?a ni podprto"
 
-#: ../libgda/gda-data-model.c:618
+#: ../libgda/gda-data-model.c:620
 msgid "Data model does not support getting individual value"
 msgstr "Podatkovni model ne podpira pridobivanja posameznih vrednosti"
 
-#: ../libgda/gda-data-model.c:661
-#: ../libgda/gda-data-model.c:671
+#: ../libgda/gda-data-model.c:663
+#: ../libgda/gda-data-model.c:673
 #, c-format
 msgid "Data model returned value of invalid '%s' type"
 msgstr "Podatkovni model je vrnil neveljavno vrednost vrste '%s'"
 
-#: ../libgda/gda-data-model.c:668
+#: ../libgda/gda-data-model.c:670
 msgid "Data model returned invalid NULL value"
 msgstr "Podatkovni model je vrnil neveljavno NULL vrednost"
 
-#: ../libgda/gda-data-model.c:728
+#: ../libgda/gda-data-model.c:730
 msgid "Data model does not support setting individual value"
 msgstr "Podatkovni model ne podpira doloÄ?anja posameznih vrednosti"
 
-#: ../libgda/gda-data-model.c:761
+#: ../libgda/gda-data-model.c:763
 msgid "Data model does not support setting values"
 msgstr "Podatkovni model ne podpira doloÄ?evanja vrednosti"
 
-#: ../libgda/gda-data-model.c:824
-#: ../libgda/gda-data-model.c:858
+#: ../libgda/gda-data-model.c:826
+#: ../libgda/gda-data-model.c:860
 msgid "Data model does not support row append"
 msgstr "Podatkovni model ne podpira pripenjanja vrstic"
 
-#: ../libgda/gda-data-model.c:849
+#: ../libgda/gda-data-model.c:851
 msgid "Model does not allow row insertion"
 msgstr "Model ne dovoli vstavljanja vrstic"
 
-#: ../libgda/gda-data-model.c:884
+#: ../libgda/gda-data-model.c:886
 msgid "Model does not allow row deletion"
 msgstr "Model ne dovoli brisanja vrstic"
 
-#: ../libgda/gda-data-model.c:893
+#: ../libgda/gda-data-model.c:895
 msgid "Data model does not support row removal"
 msgstr "Podatkovni model ne podpira odstranjevanja vrstic"
 
-#: ../libgda/gda-data-model.c:1036
-#: ../libgda/gda-data-model.c:1077
-#: ../libgda/gda-data-model.c:1091
+#: ../libgda/gda-data-model.c:1038
+#: ../libgda/gda-data-model.c:1079
+#: ../libgda/gda-data-model.c:1093
 #, c-format
 msgid "The '%s' parameter must hold a string value, ignored."
 msgstr "Parameter '%s' mora vsebovati vrednost niza, zato je opravilo prezrto."
 
-#: ../libgda/gda-data-model.c:1100
-#: ../libgda/gda-data-model.c:1110
-#: ../libgda/gda-data-model.c:1120
-#: ../libgda/gda-data-model.c:1158
-#: ../libgda/gda-data-model.c:1251
+#: ../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
 #, c-format
 msgid "The '%s' parameter must hold a boolean value, ignored."
 msgstr "Parameter '%s' mora vsebovati logiÄ?no vrednost, zato je opravilo prezrto."
 
-#: ../libgda/gda-data-model.c:1259
+#: ../libgda/gda-data-model.c:1261
 #, c-format
 msgid "File '%s' already exists"
 msgstr "Datoteka '%s' že obstaja"
 
-#: ../libgda/gda-data-model.c:1399
+#: ../libgda/gda-data-model.c:1401
 msgid "Exported Data"
 msgstr "Izvoženi podatki"
 
-#: ../libgda/gda-data-model.c:1516
+#: ../libgda/gda-data-model.c:1518
 #, c-format
 msgid "Expected tag <gda_value> or <gda_array_value>, got <%s>, ignoring"
 msgstr "PriÄ?akovana je oznaka <gda_value> ali <gda_array_value>, pridobljena pa <%s>, zato je opravilo prezrto."
 
-#: ../libgda/gda-data-model.c:1547
+#: ../libgda/gda-data-model.c:1549
 msgid "Cannot retrieve column data type (type is UNKNOWN or not specified)"
 msgstr "Ni mogoÄ?e pridobiti podatkov vrste stolpca (vrsta ni znana ali pa ni doloÄ?ena)"
 
-#: ../libgda/gda-data-model.c:1633
+#: ../libgda/gda-data-model.c:1635
 #, c-format
 msgid "Expected tag <gda_array_data>, got <%s>"
 msgstr "PriÄ?akovano <gda_array_data>, dobljeno <%s>"
 
-#: ../libgda/gda-data-model.c:1696
+#: ../libgda/gda-data-model.c:1698
 msgid "Could not get an iterator for source data model"
 msgstr "Ni mogoÄ?e pridobiti ponavljalnika podatkovnega modela vira"
 
-#: ../libgda/gda-data-model.c:1713
+#: ../libgda/gda-data-model.c:1715
 #, c-format
 msgid "Inexistent column in source data model: %d"
 msgstr "NeobstojeÄ? stolpec v izvornem podatkovnem modelu: %d"
 
-#: ../libgda/gda-data-model.c:1727
+#: ../libgda/gda-data-model.c:1729
 #, c-format
 msgid "Destination column %d can't be NULL but has no correspondence in the source data model"
 msgstr "Ciljni stolpec %d ne sme imeti doloÄ?ene vrednosti NULL, vendar nima povezave z izvornim podatkovnim modelom"
 
-#: ../libgda/gda-data-model.c:1737
+#: ../libgda/gda-data-model.c:1739
 #, c-format
 msgid "Destination column %d has a gda type (%s) incompatible with source column %d type (%s)"
 msgstr "Ciljni stolpec %d je vrste gda (%s) in je neskladen z izvornim stolpcem vrste %d (%s)"
 
-#: ../libgda/gda-data-model.c:1834
+#: ../libgda/gda-data-model.c:1836
 #, c-format
 msgid "Can't transform '%s' from GDA type %s to GDA type %s"
 msgstr "Ni mogoÄ?e pretvoriti '%s' iz GDA vrste %s v vrsto %s"
 
-#: ../libgda/gda-data-model.c:2028
+#: ../libgda/gda-data-model.c:2030
 #, c-format
 msgid "Could not dump data model's attributes: %s"
 msgstr "Ni mogoÄ?e spustiti atributov podatkovnega modela: %s"
 
-#: ../libgda/gda-data-model.c:2036
+#: ../libgda/gda-data-model.c:2038
 #, c-format
 msgid "Could not dump data model's contents: %s"
 msgstr "Ni mogoÄ?e spustiti vsebine podatkovnega modela: %s"
 
-#: ../libgda/gda-data-model.c:2282
+#: ../libgda/gda-data-model.c:2286
 msgid "Data model does not support backward cursor move, not displaying data"
 msgstr "Podatkovni model ne podpira povratnega premika kazalnika, zato podatki ne bodo prikazani."
 
-#: ../libgda/gda-data-model.c:2401
+#: ../libgda/gda-data-model.c:2405
 #, c-format
 msgid "(%d row)\n"
 msgid_plural "(%d rows)\n"
@@ -1088,7 +1093,7 @@ msgstr "Ni mogoÄ?e odstraniti datoteke '%s'"
 
 #: ../libgda/gda-data-model-dsn-list.c:105
 #: ../libgda/gda-data-model-dsn-list.c:106
-#: ../tools/gda-sql.c:2694
+#: ../tools/gda-sql.c:2696
 msgid "DSN"
 msgstr "DSN"
 
@@ -1234,7 +1239,7 @@ msgid "GdaDataProxy can't handle non random access data models"
 msgstr "Predmet GdaDataProxy ne podpira nakljuÄ?nih modelov dostopa do podatkov"
 
 #: ../libgda/gda-data-proxy.c:1538
-#: ../libgda/gda-data-proxy.c:3880
+#: ../libgda/gda-data-proxy.c:3899
 msgid "The first row is an empty row artificially prepended and cannot be removed"
 msgstr "Prva vrstica, ki je ni mogoÄ?e odstraniti, je dodana programsko in je vedno prazna"
 
@@ -1249,7 +1254,7 @@ msgid "Proxied data model reports the modifications as accepted, yet did not emi
 msgstr "PosredniÅ¡ki podatkovni model potrjuje sprejemanje sprememb, vendar pa ni objavljenih ustreznih objav \"row-inserted\" (vstavljena vrstica), \"row-updated\" (posodobljena vrstica) ali \"row-removed\" (odstranjena vrstica). To je najverjetneje hroÅ¡Ä? %s (poÅ¡ljite poroÄ?ilo o napaki)."
 
 #: ../libgda/gda-data-proxy.c:2930
-#: ../tools/gda-sql.c:3249
+#: ../tools/gda-sql.c:3251
 msgid "Could not create virtual connection"
 msgstr "Ni mogoÄ?e ustvariti navidezne povezave"
 
@@ -1263,21 +1268,21 @@ msgstr "Napaka v izrazu filtra"
 msgid "Incorrect filter expression"
 msgstr "Napaka v izrazu filtra"
 
-#: ../libgda/gda-data-proxy.c:3635
+#: ../libgda/gda-data-proxy.c:3654
 msgid "The first row is an empty row artificially prepended and cannot be altered"
 msgstr "Prva vrstica, ki je ni mogoÄ?e spreminjati, je dodana programsko in je vedno prazna"
 
-#: ../libgda/gda-data-proxy.c:3657
+#: ../libgda/gda-data-proxy.c:3676
 #, c-format
 msgid "Wrong value type: expected '%s' and got '%s'"
 msgstr "NapaÄ?na vrsta vrednosti: priÄ?akovano je '%s', pridobljeno pa '%s'"
 
-#: ../libgda/gda-data-proxy.c:3743
+#: ../libgda/gda-data-proxy.c:3762
 #, c-format
 msgid "Trying to change read-only column: %d"
 msgstr "Poskus spreminjanja stolpca le za branje: %d"
 
-#: ../libgda/gda-data-proxy.c:3780
+#: ../libgda/gda-data-proxy.c:3799
 #, c-format
 msgid "Value type mismatch %s instead of %s"
 msgstr "Neskladnost vrste vrednosti %s namesto %s"
@@ -1591,7 +1596,7 @@ msgstr "DoloÄ?ilo pogleda ni izjava izbire (za pogled '%s')"
 
 #. FIXME
 #: ../libgda/gda-meta-store.c:1321
-#: ../libgda/gda-meta-struct-io.c:170
+#: ../libgda/gda-meta-struct-io.c:172
 msgid "Missing table name from <table> node"
 msgstr "Manjka ime preglednice iz vozliÅ¡Ä?a <pogled>"
 
@@ -1603,12 +1608,12 @@ msgstr "Stolpec '%s' že obstaja in ima drugaÄ?ne znaÄ?ilnosti"
 #: ../libgda/gda-meta-store.c:1584
 #, c-format
 msgid "Missing foreign key's referenced table name (for table '%s')"
-msgstr "Manjka ime sklicne preglednice tujega kljuÄ?a (za razpredelnico '%s')"
+msgstr "Manjka ime sklicne preglednice tujega kljuÄ?a (za preglednico '%s')"
 
 #: ../libgda/gda-meta-store.c:1637
 #, c-format
 msgid "Missing foreign key's column name (for table '%s')"
-msgstr "Manjka ime stolpca tujega kljuÄ?a (za razpredelnico '%s')"
+msgstr "Manjka ime stolpca tujega kljuÄ?a (za preglednico '%s')"
 
 #: ../libgda/gda-meta-store.c:1648
 #, c-format
@@ -1801,42 +1806,42 @@ msgid "Database object '%s' already exists"
 msgstr "Predmet podatkovne zbirke '%s' že obstaja"
 
 #. FIXME
-#: ../libgda/gda-meta-struct-io.c:76
+#: ../libgda/gda-meta-struct-io.c:78
 #, c-format
 msgid "Could not load file '%s'"
 msgstr "Ni mogoÄ?e naložiti datoteke '%s'"
 
 #. FIXME
-#: ../libgda/gda-meta-struct-io.c:83
+#: ../libgda/gda-meta-struct-io.c:85
 #, c-format
 msgid "Root node of file '%s' should be <schema>."
 msgstr "Korensko vozliÅ¡Ä?e datoteke '%s' mora biti <shema>."
 
 #. FIXME
-#: ../libgda/gda-meta-struct-io.c:229
+#: ../libgda/gda-meta-struct-io.c:231
 #, c-format
 msgid "Missing column name for table '%s'"
 msgstr "Manjka ime stolpca za preglednico '%s'"
 
 #. FIXME
-#: ../libgda/gda-meta-struct-io.c:281
+#: ../libgda/gda-meta-struct-io.c:283
 #, c-format
 msgid "Missing foreign key's referenced table name for table '%s'"
-msgstr "Manjka ime sklicne preglednice tujega kljuÄ?a za razpredelnico '%s'"
+msgstr "Manjka ime sklicne preglednice tujega kljuÄ?a za preglednico '%s'"
 
 #. FIXME
-#: ../libgda/gda-meta-struct-io.c:292
-#: ../libgda/gda-meta-struct-io.c:298
-#: ../libgda/gda-meta-struct-io.c:304
+#: ../libgda/gda-meta-struct-io.c:294
+#: ../libgda/gda-meta-struct-io.c:300
+#: ../libgda/gda-meta-struct-io.c:306
 #, c-format
 msgid "Invalid referenced table name '%s'"
 msgstr "Neveljavno ime sklicne zbirke podatkov '%s'"
 
 #. FIXME
-#: ../libgda/gda-meta-struct-io.c:343
+#: ../libgda/gda-meta-struct-io.c:345
 #, c-format
 msgid "Missing foreign key's column name for table '%s'"
-msgstr "Manjka ime stolpca tujega kljuÄ?a za razpredelnico '%s'"
+msgstr "Manjka ime stolpca tujega kljuÄ?a za preglednico '%s'"
 
 #: ../libgda/gda-server-operation.c:587
 #, c-format
@@ -1928,6 +1933,7 @@ msgstr "Skupek"
 
 #: ../libgda/gda-server-provider-extra.c:313
 #: ../libgda/gda-server-provider-extra.c:357
+#: ../tools/browser/data-manager/data-source-editor.c:123
 msgid "Id"
 msgstr "ID"
 
@@ -2077,8 +2083,8 @@ msgstr "Dodatni atributi"
 #: ../providers/mysql/mysql_specs_drop_index.xml.in.h:1
 #: ../providers/postgres/postgres_specs_drop_index.xml.in.h:2
 #: ../providers/sqlite/sqlite_specs_drop_index.xml.in.h:3
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:158
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:164
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:166
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:172
 msgid "Index"
 msgstr "Kazalo"
 
@@ -2108,6 +2114,7 @@ msgstr "Imenski prostor"
 #: ../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
 msgid "Table"
 msgstr "Preglednica"
 
@@ -2144,7 +2151,7 @@ msgstr "Sprožilnik"
 #: ../providers/sqlite/sqlite_specs_create_index.xml.in.h:17
 #: ../tools/command-exec.c:642
 #: ../tools/command-exec.c:716
-#: ../tools/web-server.c:927
+#: ../tools/web-server.c:926
 msgid "Type"
 msgstr "Vrsta"
 
@@ -2195,8 +2202,8 @@ msgstr "Pogled"
 #: ../tools/browser/data-manager/data-favorite-selector.c:304
 #: ../tools/browser/query-exec/query-favorite-selector.c:288
 #: ../tools/command-exec.c:641
-#: ../tools/gda-sql.c:3084
-#: ../tools/gda-sql.c:4010
+#: ../tools/gda-sql.c:3086
+#: ../tools/gda-sql.c:4012
 msgid "Name"
 msgstr "Ime"
 
@@ -2247,86 +2254,86 @@ msgstr "Spec korensko vozliÅ¡Ä?e != 'data-set-spec': '%s'"
 msgid "Missing node <parameters>: '%s'"
 msgstr "Manjkajo <parametri> vozliÅ¡Ä?a: '%s'"
 
-#: ../libgda/gda-set.c:1031
+#: ../libgda/gda-set.c:1030
 #, c-format
 msgid "Data set does not allow modifications"
 msgstr "Podatkovni model ne dovoli spreminjanja"
 
-#: ../libgda/gda-set.c:1276
+#: ../libgda/gda-set.c:1295
 msgid "GdaHolder needs to have an ID"
 msgstr "GdaHolder zahteva doloÄ?itev ID"
 
-#: ../libgda/gda-set.c:1386
+#: ../libgda/gda-set.c:1408
 msgid "One or more values are invalid"
 msgstr "Ena ali veÄ? vrednosti ni veljavnih"
 
-#: ../libgda/gda-set.c:1603
-#: ../libgda/gda-set.c:1616
+#: ../libgda/gda-set.c:1625
+#: ../libgda/gda-set.c:1638
 msgid "Replacing data model must have the same characteristics as the data model it replaces"
 msgstr "Zamenjava podatkovnega modela mora imeti enake znaÄ?ilnosti kot prvotni podatkovni model."
 
-#: ../libgda/gda-sql-builder.c:294
-#: ../libgda/gda-sql-builder.c:1399
+#: ../libgda/gda-sql-builder.c:286
+#: ../libgda/gda-sql-builder.c:1391
 #, c-format
 msgid "Unknown part ID %u"
 msgstr "Neznani ID dela '%u"
 
-#: ../libgda/gda-sql-builder.c:298
+#: ../libgda/gda-sql-builder.c:290
 msgid "Unknown part type"
 msgstr "Neznana vrsta dela"
 
-#: ../libgda/gda-sql-builder.c:342
+#: ../libgda/gda-sql-builder.c:334
 #, c-format
 msgid "SqlBuilder is empty"
 msgstr "SqlBuilder je prazen"
 
-#: ../libgda/gda-sql-builder.c:418
-#: ../libgda/gda-sql-builder.c:475
-#: ../libgda/gda-sql-builder.c:504
-#: ../libgda/gda-sql-builder.c:625
-#: ../libgda/gda-sql-builder.c:667
-#: ../libgda/gda-sql-builder.c:729
-#: ../libgda/gda-sql-builder.c:789
-#: ../libgda/gda-sql-builder.c:1161
-#: ../libgda/gda-sql-builder.c:1245
-#: ../libgda/gda-sql-builder.c:1290
-#: ../libgda/gda-sql-builder.c:1381
-#: ../libgda/gda-sql-builder.c:1432
-#: ../libgda/gda-sql-builder.c:1474
-#: ../libgda/gda-sql-builder.c:1521
-#: ../libgda/gda-sql-builder.c:1571
-#: ../libgda/gda-sql-builder.c:1607
-#: ../libgda/gda-sql-builder.c:1773
-#: ../libgda/gda-sql-builder.c:1799
+#: ../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
 msgid "Wrong statement type"
 msgstr "NapaÄ?na vrsta izjave"
 
-#: ../libgda/gda-sql-builder.c:596
+#: ../libgda/gda-sql-builder.c:588
 #, c-format
 msgid "Could not convert value to type '%s', value not defined"
 msgstr "Ni mogoÄ?e pretvoriti vrednosti v vrsto '%s', saj vrednost ni doloÄ?ena"
 
-#: ../libgda/gda-sql-builder.c:720
+#: ../libgda/gda-sql-builder.c:712
 msgid "Wrong field format"
 msgstr "NapaÄ?en zapis polja"
 
-#: ../libgda/gda-sql-builder.c:823
-#: ../libgda/gda-sql-builder.c:828
+#: ../libgda/gda-sql-builder.c:815
+#: ../libgda/gda-sql-builder.c:820
 #, c-format
 msgid "Unhandled data type '%s'"
 msgstr "Neupravljana vrsta podatkov '%s'"
 
-#: ../libgda/gda-sql-builder.c:844
+#: ../libgda/gda-sql-builder.c:836
 #, c-format
 msgid "Could not convert value to type '%s'"
 msgstr "Ni mogoÄ?e pretvoriti vrednosti v vrsto '%s'"
 
-#: ../libgda/gda-sql-builder.c:1312
+#: ../libgda/gda-sql-builder.c:1304
 #, c-format
 msgid "Unknown left part target ID %u"
 msgstr "Neznani levi del cilja ID %u"
 
-#: ../libgda/gda-sql-builder.c:1317
+#: ../libgda/gda-sql-builder.c:1309
 #, c-format
 msgid "Unknown right part target ID %u"
 msgstr "Neznani desni del cilja ID %u"
@@ -2363,7 +2370,7 @@ msgstr "ManjkajoÄ?i parameter '%s'"
 #: ../libgda/sqlite/gda-sqlite-provider.c:2448
 #: ../providers/jdbc/gda-jdbc-provider.c:1347
 #: ../providers/mysql/gda-mysql-provider.c:2188
-#: ../providers/postgres/gda-postgres-provider.c:1982
+#: ../providers/postgres/gda-postgres-provider.c:1949
 #: ../providers/web/gda-web-provider.c:1508
 #, c-format
 msgid "Parameter '%s' is invalid"
@@ -2414,7 +2421,6 @@ msgstr "Ni mogoÄ?e pridobiti imena stolpce"
 
 #: ../libgda/gda-tree-mgr-label.c:207
 #: ../tools/browser/canvas/browser-canvas-table.c:309
-#: ../tools/browser/data-manager/data-source.c:882
 msgid "No name"
 msgstr "Brez imena"
 
@@ -2509,7 +2515,7 @@ msgstr "Ni mogoÄ?e prepisati privzete vrednosti roÄ?nika stavka UPDATE"
 #: ../libgda/sqlite/gda-sqlite-provider.c:2429
 #: ../providers/jdbc/gda-jdbc-provider.c:1318
 #: ../providers/mysql/gda-mysql-provider.c:2168
-#: ../providers/postgres/gda-postgres-provider.c:1964
+#: ../providers/postgres/gda-postgres-provider.c:1931
 #: ../providers/web/gda-web-provider.c:1488
 #, c-format
 msgid "Missing parameter '%s' to execute query"
@@ -2642,7 +2648,7 @@ msgstr "Ni mogoÄ?e najti libsqlite3."
 #: ../providers/jdbc/gda-jdbc-provider.c:354
 #: ../providers/mdb/gda-mdb-provider.c:230
 #: ../providers/mysql/gda-mysql-provider.c:578
-#: ../providers/postgres/gda-postgres-provider.c:431
+#: ../providers/postgres/gda-postgres-provider.c:398
 #: ../providers/web/gda-web-provider.c:341
 msgid "Provider does not support asynchronous connection open"
 msgstr "Ponudnik ne podpira asinhronega odpiranja povezave"
@@ -2670,16 +2676,16 @@ msgstr "Ni mogoÄ?e doloÄ?iti praznega rezultata SQLite možnosti: %s"
 
 #: ../libgda/sqlite/gda-sqlite-provider.c:905
 #: ../libgda/sqlite/gda-sqlite-provider.c:944
-#: ../libgda-ui/data-entries/plugins/libmain.c:89
-#: ../libgda-ui/data-entries/plugins/libmain.c:127
-#: ../libgda-ui/data-entries/plugins/libmain.c:155
-#: ../libgda-ui/data-entries/plugins/libmain.c:162
-#: ../libgda-ui/data-entries/plugins/libmain.c:237
-#: ../libgda-ui/data-entries/plugins/libmain.c:261
+#: ../libgda-ui/data-entries/plugins/libmain.c:85
+#: ../libgda-ui/data-entries/plugins/libmain.c:123
+#: ../libgda-ui/data-entries/plugins/libmain.c:151
+#: ../libgda-ui/data-entries/plugins/libmain.c:158
+#: ../libgda-ui/data-entries/plugins/libmain.c:233
+#: ../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:769
-#: ../providers/postgres/gda-postgres-provider.c:825
+#: ../providers/postgres/gda-postgres-provider.c:736
+#: ../providers/postgres/gda-postgres-provider.c:792
 #, c-format
 msgid "Missing spec. file '%s'"
 msgstr "Manjka doloÄ?ilna datoteka '%s'"
@@ -2689,14 +2695,14 @@ msgid "Missing database name or directory"
 msgstr "Manjka ime podatkovne zbirke ali mapa"
 
 #: ../libgda/sqlite/gda-sqlite-provider.c:1100
-#: ../providers/postgres/gda-postgres-provider.c:1025
-#: ../providers/postgres/gda-postgres-provider.c:1026
+#: ../providers/postgres/gda-postgres-provider.c:992
+#: ../providers/postgres/gda-postgres-provider.c:993
 msgid "Transactions are not supported in read-only mode"
 msgstr "Prenosi niso podprti v naÄ?inu le za branje"
 
 #: ../libgda/sqlite/gda-sqlite-provider.c:1933
 #: ../providers/jdbc/gda-jdbc-provider.c:1115
-#: ../providers/postgres/gda-postgres-provider.c:1561
+#: ../providers/postgres/gda-postgres-provider.c:1528
 #: ../providers/web/gda-web-provider.c:1259
 msgid "Unnamed parameter is not allowed in prepared statements"
 msgstr "Neimenovan parameter izjave ni dovoljen v pripravljeni izjavi."
@@ -2704,27 +2710,27 @@ msgstr "Neimenovan parameter izjave ni dovoljen v pripravljeni izjavi."
 #: ../libgda/sqlite/gda-sqlite-provider.c:2045
 #: ../libgda/sqlite/gda-sqlite-provider.c:2057
 #: ../providers/mysql/gda-mysql-provider.c:1955
-#: ../providers/postgres/gda-postgres-provider.c:1705
+#: ../providers/postgres/gda-postgres-provider.c:1672
 #, c-format
 msgid "Can't build SELECT statement to get last inserted row: %s)"
 msgstr "Ni mogoÄ?e izgraditi izjave SELECT za pridobitev zadnje vstavljene vrstice: %s)"
 
 #: ../libgda/sqlite/gda-sqlite-provider.c:2079
 #: ../providers/mysql/gda-mysql-provider.c:1970
-#: ../providers/postgres/gda-postgres-provider.c:1720
+#: ../providers/postgres/gda-postgres-provider.c:1687
 #, c-format
 msgid "Can't execute SELECT statement to get last inserted row: %s"
 msgstr "Ni mogoÄ?e izvesti izjave SELECT za pridobitev zadnje vstavljene vrstice: %s"
 
 #: ../libgda/sqlite/gda-sqlite-provider.c:2092
 #: ../providers/mysql/gda-mysql-provider.c:1983
-#: ../providers/postgres/gda-postgres-provider.c:1733
+#: ../providers/postgres/gda-postgres-provider.c:1700
 msgid "SELECT statement to get last inserted row did not return any row"
 msgstr "Z izjavo SELECT za izbiro zadnje vstavljene vrstice, ni bilo mogoÄ?e pridobiti nobene vrstice."
 
 #: ../libgda/sqlite/gda-sqlite-provider.c:2096
 #: ../providers/mysql/gda-mysql-provider.c:1987
-#: ../providers/postgres/gda-postgres-provider.c:1737
+#: ../providers/postgres/gda-postgres-provider.c:1704
 #, c-format
 msgid "SELECT statement to get last inserted row returned too many (%d) rows"
 msgstr "Z izjavo SELECT za izbiro zadnje vstavljene vrstice, je bilo pridobljeno preveÄ? (%d) vrstic."
@@ -2755,7 +2761,7 @@ msgstr "Ni mogoÄ?e doloÄ?iti vrednosti ROWID zbirke dvojiÅ¡kih podatkov za izpol
 #: ../libgda/sqlite/gda-sqlite-provider.c:2301
 #: ../providers/jdbc/gda-jdbc-provider.c:1213
 #: ../providers/mysql/gda-mysql-provider.c:2076
-#: ../providers/postgres/gda-postgres-provider.c:1832
+#: ../providers/postgres/gda-postgres-provider.c:1799
 #: ../providers/web/gda-web-provider.c:1392
 msgid "Provider does not support asynchronous statement execution"
 msgstr "Ponudnik ne podpira asinhronega izvajanja izjav"
@@ -2772,8 +2778,8 @@ msgstr "Prazna izjava"
 #: ../providers/jdbc/gda-jdbc-provider.c:1303
 #: ../providers/mysql/gda-mysql-provider.c:2150
 #: ../providers/mysql/gda-mysql-provider.c:2153
-#: ../providers/postgres/gda-postgres-provider.c:1946
-#: ../providers/postgres/gda-postgres-provider.c:1949
+#: ../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
 #, c-format
@@ -2783,7 +2789,7 @@ msgstr "Manjka parameter za izvedbo poizvedbe"
 #: ../libgda/sqlite/gda-sqlite-provider.c:2473
 #: ../providers/jdbc/gda-jdbc-provider.c:1382
 #: ../providers/mysql/gda-mysql-provider.c:2214
-#: ../providers/postgres/gda-postgres-provider.c:2007
+#: ../providers/postgres/gda-postgres-provider.c:1974
 #: ../providers/web/gda-web-provider.c:1537
 msgid "Can't rewrite statement handle default values"
 msgstr "Ni mogoÄ?e prepisati privzete vrednosti roÄ?nika stavka"
@@ -2900,7 +2906,7 @@ msgstr "Ni mogoÄ?e pridobiti vrste stolpca podatkovnega modela ali pa vrste stol
 msgid "Can't declare virtual table (%s)"
 msgstr "Ni mogoÄ?e deklarirati navidezne preglednice (%s)"
 
-#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:650
+#: ../libgda/sqlite/virtual/gda-vprovider-data-model.c:649
 msgid "Column not found"
 msgstr "Stolpca ni mogoÄ?e najti"
 
@@ -2919,97 +2925,97 @@ msgstr "Napaka skladnje v vrstici %d in stolpcu %d"
 msgid "Overflow error at line %d, column %d"
 msgstr "Napaka prekoraÄ?itve v vrstici %d in stolpcu %d"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:526
+#: ../libgda/sql-parser/gda-statement-struct.c:578
 msgid "GdaSqlField is not part of an INSERT or UPDATE statement"
 msgstr "Predmet GdaSqlField ni del izjave INSERT ali UPDATE"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:539
+#: ../libgda/sql-parser/gda-statement-struct.c:591
 msgid "Missing table in statement"
 msgstr "Manjka preglednica v izjavi"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:559
-#: ../libgda/sql-parser/gda-statement-struct.c:768
+#: ../libgda/sql-parser/gda-statement-struct.c:611
+#: ../libgda/sql-parser/gda-statement-struct.c:824
 #, c-format
 msgid "Column '%s' not found"
 msgstr "Stolpca '%s' ni mogoÄ?e najti"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:594
-#: ../libgda/sql-parser/gda-statement-struct.c:705
+#: ../libgda/sql-parser/gda-statement-struct.c:646
+#: ../libgda/sql-parser/gda-statement-struct.c:757
 msgid "GdaSqlSelectField is not part of a SELECT statement"
 msgstr "Predmet GdaSqlSelectField ni del izjave SELECT"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:653
+#: ../libgda/sql-parser/gda-statement-struct.c:705
 msgid "Missing table name in statement"
 msgstr "Manjka ime preglednice v izjavi"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:661
-#: ../libgda/sql-parser/gda-statement-struct.c:750
-#: ../libgda/sql-parser/gda-statement-struct.c:797
+#: ../libgda/sql-parser/gda-statement-struct.c:713
+#: ../libgda/sql-parser/gda-statement-struct.c:806
+#: ../libgda/sql-parser/gda-statement-struct.c:853
 #, c-format
 msgid "Table '%s' not found"
 msgstr "Preglednice '%s' ni mogoÄ?e najti"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:724
-#: ../libgda/sql-parser/gda-statement-struct.c:737
+#: ../libgda/sql-parser/gda-statement-struct.c:779
+#: ../libgda/sql-parser/gda-statement-struct.c:794
 #, c-format
 msgid "Could not identify table for field '%s'"
 msgstr "Ni mogoÄ?e doloÄ?iti preglednice za polje '%s'"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:927
+#: ../libgda/sql-parser/gda-statement-struct.c:983
 msgid "Expression can't have both a type cast and a parameter specification"
 msgstr "Izraz ne more imeti obeh doloÄ?il; vrste in doloÄ?ila parametra"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:937
-#: ../libgda/sql-parser/gda-statement-struct.c:950
-#: ../libgda/sql-parser/gda-statement-struct.c:963
+#: ../libgda/sql-parser/gda-statement-struct.c:993
+#: ../libgda/sql-parser/gda-statement-struct.c:1006
+#: ../libgda/sql-parser/gda-statement-struct.c:1019
 #, c-format
 msgid "'%s' is not a valid identifier"
 msgstr "'%s' ni veljavno doloÄ?ilo"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:940
-#: ../libgda/sql-parser/gda-statement-struct.c:953
-#: ../libgda/sql-parser/gda-statement-struct.c:966
+#: ../libgda/sql-parser/gda-statement-struct.c:996
+#: ../libgda/sql-parser/gda-statement-struct.c:1009
+#: ../libgda/sql-parser/gda-statement-struct.c:1022
 msgid "Empty identifier"
 msgstr "Prazno doloÄ?ilo"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:975
+#: ../libgda/sql-parser/gda-statement-struct.c:1031
 msgid "Operation has no operand"
 msgstr "Opravilo nima operanda"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:998
-#: ../libgda/sql-parser/gda-statement-struct.c:1005
-#: ../libgda/sql-parser/gda-statement-struct.c:1015
-#: ../libgda/sql-parser/gda-statement-struct.c:1027
-#: ../libgda/sql-parser/gda-statement-struct.c:1035
+#: ../libgda/sql-parser/gda-statement-struct.c:1054
+#: ../libgda/sql-parser/gda-statement-struct.c:1061
+#: ../libgda/sql-parser/gda-statement-struct.c:1071
+#: ../libgda/sql-parser/gda-statement-struct.c:1083
+#: ../libgda/sql-parser/gda-statement-struct.c:1091
 msgid "Wrong number of operands"
 msgstr "NapaÄ?no Å¡tevilo operandov"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:1041
+#: ../libgda/sql-parser/gda-statement-struct.c:1097
 #, c-format
 msgid "Unknown operator %d"
 msgstr "neznan operator %d"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:1064
+#: ../libgda/sql-parser/gda-statement-struct.c:1120
 msgid "Missing expression in select field"
 msgstr "Manjka izraz v polju izbire"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:1073
+#: ../libgda/sql-parser/gda-statement-struct.c:1129
 msgid "Missing expression in select target"
 msgstr "Manjka izraz v polju cilja"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:1082
+#: ../libgda/sql-parser/gda-statement-struct.c:1138
 msgid "Join can't at the same time specify a join condition and a list of fields to join on"
 msgstr "S predmetom JOIN ni mogoÄ?e soÄ?asno doloÄ?iti pogoj združevanja in seznam polj za združevanje"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:1087
+#: ../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 "S predmetom križnega JOIN ni mogoÄ?e soÄ?asno doloÄ?iti pogoj združevanja in seznam polj za združevanje"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:1096
+#: ../libgda/sql-parser/gda-statement-struct.c:1152
 msgid "Empty FROM clause"
 msgstr "Prazen FROM stavek"
 
-#: ../libgda/sql-parser/gda-statement-struct.c:1371
+#: ../libgda/sql-parser/gda-statement-struct.c:1427
 msgid "Select field is not in a SELECT statement"
 msgstr "V izjavi SELECT ni polja izbire"
 
@@ -3117,17 +3123,17 @@ msgstr "Izjava UPDATE nima doloÄ?enih ciljnih stolpcev za posodabljanje"
 msgid "A connection is required"
 msgstr "Zahtevana je povezava"
 
-#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1066
-#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1160
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1059
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1153
 msgid "Signal does not exist\n"
 msgstr "Signal ne obstaja\n"
 
-#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1075
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1068
 msgid "Signal to connect to must not have a return value\n"
 msgstr "Signal za povezavo mora imeti povratno vrednost.\n"
 
-#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1147
-#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1214
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1140
+#: ../libgda/thread-wrapper/gda-thread-wrapper.c:1207
 #, c-format
 msgid "Signal %lu does not exist"
 msgstr "Signal %lu ne obstaja"
@@ -3170,10 +3176,10 @@ msgstr "Neznana poizvedba '%s'"
 
 #: ../libgda-report/engine/gda-report-engine.c:581
 #: ../libgda-report/engine/gda-report-engine.c:608
-#: ../tools/gda-sql.c:2979
-#: ../tools/gda-sql.c:3061
-#: ../tools/gda-sql.c:3161
-#: ../tools/gda-sql.c:3237
+#: ../tools/gda-sql.c:2981
+#: ../tools/gda-sql.c:3063
+#: ../tools/gda-sql.c:3163
+#: ../tools/gda-sql.c:3239
 #, c-format
 msgid "No connection named '%s' found"
 msgstr "Ni mogoÄ?e najti povezave z imenom '%s'"
@@ -3302,12 +3308,12 @@ msgstr "Neznano"
 #: ../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:807
-#: ../libgda-ui/gdaui-basic-form.c:875
+#: ../libgda-ui/gdaui-basic-form.c:717
+#: ../libgda-ui/gdaui-basic-form.c:753
 #: ../libgda-ui/gdaui-raw-grid.c:739
-#: ../tools/gda-sql.c:2656
-#: ../tools/gda-sql.c:2831
-#: ../tools/gda-sql.c:4011
+#: ../tools/gda-sql.c:2658
+#: ../tools/gda-sql.c:2833
+#: ../tools/gda-sql.c:4013
 msgid "Value"
 msgstr "Vrednost"
 
@@ -3380,7 +3386,7 @@ msgid "Invalid UTF-8 format!"
 msgstr "neveljaven zapis UTF-8!"
 
 #. format tooltip
-#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1044
+#: ../libgda-ui/data-entries/gdaui-entry-common-time.c:1053
 msgid "Format is hh:mm:ss"
 msgstr "Zapis je hh:mm:ss"
 
@@ -3585,80 +3591,6 @@ msgstr "Niz"
 msgid "Variable"
 msgstr "Spremenljivka"
 
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:549
-msgid "Cgrid data handler"
-msgstr "Podatkovni upravljalnik Cgrid"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:550
-msgid "The cgrid data handler"
-msgstr "Podatkovni upravljalnik Cgrid"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:557
-msgid "Cgrid gtype"
-msgstr "Cgrid gtype"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:558
-msgid "The cgrid gtype"
-msgstr "Vrsta grid gtype"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:565
-msgid "Cgrid options"
-msgstr "Možnosti Cgrid"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:566
-msgid "The cgrid options"
-msgstr "možnosti cgrid"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:573
-msgid "Cgrid is editable"
-msgstr "Cgrid je mogoÄ?e urejati"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:574
-msgid "Cgrid editable"
-msgstr "Uredljiv Cgrid"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:581
-msgid "Cgrid is to be deleted"
-msgstr "Cgrid bo izbrisan"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:582
-msgid "Cgrid to be deleted"
-msgstr "Cgrid pripravljen za brisanje"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:589
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:590
-msgid "Cgrid value"
-msgstr "Vrednost Cgrid"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:596
-#: ../libgda-ui/data-entries/plugins/gdaui-data-cell-renderer-cgrid.c:597
-msgid "Cgrid value attributes"
-msgstr "Atributi vrednosti Cgrid"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:843
-msgid "Cgrid text column"
-msgstr "Cgrid stolpec besedila"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:844
-msgid "A column in the data source model to get the string from."
-msgstr "Stolpec podatkovnega vira, iz katerega naj bodo pridobljeni nizi"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:851
-msgid "Cgrid grid height"
-msgstr "Višina Cgrid mreže"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:852
-msgid "Cgrid height's."
-msgstr "Cgrid višina"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:859
-msgid "Cgrid has its headers visible"
-msgstr "Cgrid ima glave vidne"
-
-#: ../libgda-ui/data-entries/plugins/gdaui-entry-cgrid.c:860
-msgid "Cgrid headers visible"
-msgstr "Vidne glave Cgrid"
-
 #: ../libgda-ui/data-entries/plugins/gdaui-entry-cidr.c:257
 msgid "Mask settings"
 msgstr "Nastavitve maske"
@@ -3781,7 +3713,7 @@ msgid "break lines anywhere the cursor can appear"
 msgstr "prelomi vrstice kjerkoli je mogoÄ?e postaviti kazalko"
 
 #: ../libgda-ui/data/server_operation.glade.h:1
-#: ../tools/browser/schema-browser/table-info.c:384
+#: ../tools/browser/schema-browser/table-info.c:378
 msgid "Columns"
 msgstr "Stolpci"
 
@@ -3794,14 +3726,14 @@ msgid "Foreign keys"
 msgstr "Tuji kljuÄ?i"
 
 #: ../libgda-ui/data/server_operation.glade.h:4
-#: ../tools/gda-sql.c:1994
-#: ../tools/gda-sql.c:2093
-#: ../tools/gda-sql.c:2105
-#: ../tools/gda-sql.c:2117
-#: ../tools/gda-sql.c:2225
-#: ../tools/gda-sql.c:2237
-#: ../tools/gda-sql.c:2249
-#: ../tools/gda-sql.c:2443
+#: ../tools/gda-sql.c:1996
+#: ../tools/gda-sql.c:2095
+#: ../tools/gda-sql.c:2107
+#: ../tools/gda-sql.c:2119
+#: ../tools/gda-sql.c:2227
+#: ../tools/gda-sql.c:2239
+#: ../tools/gda-sql.c:2251
+#: ../tools/gda-sql.c:2445
 msgid "General"
 msgstr "Splošno"
 
@@ -3923,58 +3855,58 @@ msgstr "Zavrzi spremenjene podatke"
 msgid "Correct data first"
 msgstr "Najprej pravilni podatki"
 
-#: ../libgda-ui/gdaui-basic-form.c:259
+#: ../libgda-ui/gdaui-basic-form.c:260
 msgid "Pointer to an XML layout specification  (as an xmlNodePtr to a <gdaui_form> node)"
 msgstr "Kazalnik do doloÄ?il razporeditve XML (kot xmlNodePtr za <gdaui_form> vozliÅ¡Ä?e)"
 
-#: ../libgda-ui/gdaui-basic-form.c:263
+#: ../libgda-ui/gdaui-basic-form.c:264
 msgid "List of parameters to show in the form"
 msgstr "Seznam parametrov prikazanih v obrazcu"
 
-#: ../libgda-ui/gdaui-basic-form.c:267
+#: ../libgda-ui/gdaui-basic-form.c:268
 msgid "Entry headers are sensitive"
 msgstr "Glave vnosov so obÄ?utljive"
 
-#: ../libgda-ui/gdaui-basic-form.c:272
+#: ../libgda-ui/gdaui-basic-form.c:273
 msgid "Show Entry actions"
 msgstr "Pokaži dejanja vnosa"
 
-#: ../libgda-ui/gdaui-basic-form.c:277
+#: ../libgda-ui/gdaui-basic-form.c:278
 msgid "Entries Auto-default"
 msgstr "Samodejno privzeti vnosi"
 
-#: ../libgda-ui/gdaui-basic-form.c:282
+#: ../libgda-ui/gdaui-basic-form.c:283
 msgid "TRUE if expanding the form vertically makes sense"
 msgstr "Izbrana možnost je uporabna, kadar ima navpiÄ?no razÅ¡irjanje obrazca pomen."
 
-#: ../libgda-ui/gdaui-basic-form.c:761
+#: ../libgda-ui/gdaui-basic-form.c:839
 #: ../libgda-ui/gdaui-raw-grid.c:780
 #: ../libgda-ui/gdaui-raw-grid.c:2619
 #, c-format
 msgid "The '%s' attribute should be a G_TYPE_STRING value"
 msgstr "Atribut '%s' mora biti vrednost G_TYPE_STRING"
 
-#: ../libgda-ui/gdaui-basic-form.c:1686
+#: ../libgda-ui/gdaui-basic-form.c:1738
 msgid "Can't find data entry for GdaHolder"
 msgstr "Ni mogoÄ?e najti podatkovnega vnosa za GdaHolder"
 
-#: ../libgda-ui/gdaui-basic-form.c:1958
+#: ../libgda-ui/gdaui-basic-form.c:2010
 msgid "Values to be filled"
 msgstr "Zahtevane vrednosti"
 
-#: ../libgda-ui/gdaui-basic-form.c:2039
+#: ../libgda-ui/gdaui-basic-form.c:2091
 #: ../libgda-ui/gdaui-raw-grid.c:2446
 #, c-format
 msgid "'%s' document not parsed successfully"
 msgstr "'%s' dokument ni uspeÅ¡no razÄ?lenjen"
 
-#: ../libgda-ui/gdaui-basic-form.c:2049
+#: ../libgda-ui/gdaui-basic-form.c:2101
 #: ../libgda-ui/gdaui-raw-grid.c:2456
 #, c-format
 msgid "'%s' DTD not parsed successfully. XML data layout validation will not be performed (some errors may occur)"
 msgstr "'%s' DTD ni razÄ?lenjen uspeÅ¡no. Preverjanje veljavnosti razporeda podatkov XML ne bo izvedeno (lahko se pojavijo napake)"
 
-#: ../libgda-ui/gdaui-basic-form.c:2180
+#: ../libgda-ui/gdaui-basic-form.c:2233
 msgid "size group was not taken into account using gdaui_basic_form_add_to_size_group()"
 msgstr "velikost skupine ni vzeta v raÄ?un ob uporabi skupine gdaui_basic_form_add_to_size_group()"
 
@@ -3985,7 +3917,7 @@ msgid "Wrong column type for label: expecting a string and got a %s"
 msgstr "NapaÄ?na vrsta za oznako stolpca: priÄ?akovan je niz, dobljen pa %s"
 
 #: ../libgda-ui/gdaui-cloud.c:1074
-#: ../tools/browser/common/objects-cloud.c:445
+#: ../tools/browser/common/objects-cloud.c:457
 msgid "Find:"
 msgstr "PoiÅ¡Ä?i:"
 
@@ -4013,19 +3945,19 @@ msgstr "Poskus spreminjanja stolpca le za branje"
 msgid "Filter failed:"
 msgstr "Spodletel filter:"
 
-#: ../libgda-ui/gdaui-data-filter.c:213
+#: ../libgda-ui/gdaui-data-filter.c:216
 msgid "Filter"
 msgstr "Filter"
 
-#: ../libgda-ui/gdaui-data-filter.c:213
+#: ../libgda-ui/gdaui-data-filter.c:216
 msgid "any valid SQL expression"
 msgstr "katerakoli veljavni SQL izraz"
 
-#: ../libgda-ui/gdaui-data-filter.c:229
+#: ../libgda-ui/gdaui-data-filter.c:232
 msgid "Set filter"
 msgstr "Nastavitev filtra"
 
-#: ../libgda-ui/gdaui-data-filter.c:234
+#: ../libgda-ui/gdaui-data-filter.c:237
 msgid "Clear filter"
 msgstr "PoÄ?isti filter"
 
@@ -4038,8 +3970,12 @@ msgid "Could not open plugins directory, no plugin loaded."
 msgstr "Ni mogoÄ?e odpreti mape vstavkov, zato vstavki ne bodo naloženi."
 
 #: ../libgda-ui/gdaui-init.c:485
+#: ../tools/browser/data-manager/data-widget.c:608
+#: ../tools/browser/data-manager/data-widget.c:613
+#: ../tools/browser/data-manager/data-widget.c:615
+#: ../tools/browser/data-manager/xml-spec-editor.c:235
 #: ../tools/browser/query-exec/query-result.c:256
-#: ../tools/web-server.c:2018
+#: ../tools/web-server.c:2017
 #, c-format
 msgid "Error: %s"
 msgstr "Napaka: %s"
@@ -4238,6 +4174,7 @@ msgstr "Zahtevaj skrivanje glave odseka, kadar je na voljo le ena glava."
 
 #. last row is for new entries
 #: ../libgda-ui/gdaui-server-operation.c:596
+#: ../tools/browser/data-manager/data-console.c:391
 msgid "Add"
 msgstr "Dodaj"
 
@@ -4401,7 +4338,7 @@ msgstr "Opis stolpca"
 #: ../providers/sqlite/sqlite_specs_add_column.xml.in.h:5
 #: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:19
 #: ../tools/command-exec.c:718
-#: ../tools/web-server.c:929
+#: ../tools/web-server.c:928
 msgid "Default"
 msgstr "Privzeto"
 
@@ -4558,8 +4495,8 @@ msgstr "Vrsta razvrÅ¡Ä?anja"
 #: ../providers/sqlite/sqlite_specs_create_table.xml.in.h:2
 #: ../tools/command-exec.c:581
 #: ../tools/command-exec.c:584
-#: ../tools/web-server.c:899
-#: ../tools/web-server.c:902
+#: ../tools/web-server.c:898
+#: ../tools/web-server.c:901
 msgid "Auto increment"
 msgstr "Samodejno poveÄ?evanje"
 
@@ -4601,7 +4538,7 @@ msgstr "Splošne omejitve"
 #: ../providers/postgres/postgres_specs_create_table.xml.in.h:52
 #: ../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:196
+#: ../tools/browser/schema-browser/table-columns.c:190
 #: ../tools/command-exec.c:809
 msgid "Primary key"
 msgstr "Osnovni kljuÄ?"
@@ -5736,58 +5673,58 @@ msgstr "Ni dovolj pomnilnika za pretvarjanje dvojiškega medpomnilnika v niz"
 msgid "Insufficient memory to convert string to binary buffer"
 msgstr "Ni dovolj pomnilnika za pretvarjanje niza v dvojiški medpomnilnik"
 
-#: ../providers/postgres/gda-postgres-provider.c:456
+#: ../providers/postgres/gda-postgres-provider.c:423
 msgid "The connection string must contain a DB_NAME value"
 msgstr "Niz povezave mora vsebovati vrednosti DB_NAME"
 
-#: ../providers/postgres/gda-postgres-provider.c:460
+#: ../providers/postgres/gda-postgres-provider.c:427
 msgid "The connection string format has changed: replace DATABASE with DB_NAME and the same contents"
 msgstr "Zapis niza povezave je spremenjen: zamenjati je treba DATABASE s podatki DB_NAME in enako vsebino"
 
-#: ../providers/postgres/gda-postgres-provider.c:588
+#: ../providers/postgres/gda-postgres-provider.c:555
 #, c-format
 msgid "Could not set search_path to %s"
 msgstr "Ni mogoÄ?e nastaviti poti iskanja na %s"
 
-#: ../providers/postgres/gda-postgres-provider.c:597
+#: ../providers/postgres/gda-postgres-provider.c:564
 #, c-format
 msgid "Search path %s is invalid"
 msgstr "Pot iskanja %s ni veljavna"
 
-#: ../providers/postgres/gda-postgres-provider.c:1036
-#: ../providers/postgres/gda-postgres-provider.c:1038
+#: ../providers/postgres/gda-postgres-provider.c:1003
+#: ../providers/postgres/gda-postgres-provider.c:1005
 msgid "Transactions are not supported in read uncommitted isolation level"
 msgstr "Prenosi niso podprti na neobjavljeni loÄ?eni ravni"
 
-#: ../providers/postgres/gda-postgres-provider.c:1042
-#: ../providers/postgres/gda-postgres-provider.c:1044
+#: ../providers/postgres/gda-postgres-provider.c:1009
+#: ../providers/postgres/gda-postgres-provider.c:1011
 msgid "Transactions are not supported in repeatable read isolation level"
 msgstr "Prenosi niso podprti na ponavljajoÄ?i se loÄ?eni ravni"
 
-#: ../providers/postgres/gda-postgres-provider.c:1061
-#: ../providers/postgres/gda-postgres-provider.c:1159
-#: ../providers/postgres/gda-postgres-provider.c:1209
-#: ../providers/postgres/gda-postgres-provider.c:1259
+#: ../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
 msgid "Internal error"
 msgstr "Notranja napaka"
 
-#: ../providers/postgres/gda-postgres-provider.c:1165
-#: ../providers/postgres/gda-postgres-provider.c:1215
-#: ../providers/postgres/gda-postgres-provider.c:1265
+#: ../providers/postgres/gda-postgres-provider.c:1132
+#: ../providers/postgres/gda-postgres-provider.c:1182
+#: ../providers/postgres/gda-postgres-provider.c:1232
 #, c-format
 msgid "Wrong savepoint name '%s'"
 msgstr "NapaÄ?no ime toÄ?ke shranjevanja '%s'"
 
-#: ../providers/postgres/gda-postgres-provider.c:2043
-#: ../providers/postgres/gda-postgres-provider.c:2045
+#: ../providers/postgres/gda-postgres-provider.c:2010
+#: ../providers/postgres/gda-postgres-provider.c:2012
 msgid "Cannot start transaction"
 msgstr "Ni mogoÄ?e zaÄ?eti transakcije"
 
-#: ../providers/postgres/gda-postgres-provider.c:2254
-#: ../providers/postgres/gda-postgres-provider.c:2290
-#: ../providers/postgres/gda-postgres-provider.c:2325
+#: ../providers/postgres/gda-postgres-provider.c:2221
+#: ../providers/postgres/gda-postgres-provider.c:2257
+#: ../providers/postgres/gda-postgres-provider.c:2292
 msgid "Could not set the XA transaction ID parameter"
 msgstr "Ni mogoÄ?e doloÄ?iti parametra ID prenosa XA"
 
@@ -6614,15 +6551,15 @@ msgstr "Nastavi kot prvotno"
 msgid "Set as default"
 msgstr "Nastavi kot privzeto"
 
-#: ../tools/browser/auth-dialog.c:520
+#: ../tools/browser/auth-dialog.c:522
 msgid "For connection"
 msgstr "Za povezavo:"
 
-#: ../tools/browser/auth-dialog.c:521
+#: ../tools/browser/auth-dialog.c:523
 msgid "enter authentication information"
 msgstr "vnos podrobnosti overitve"
 
-#: ../tools/browser/auth-dialog.c:677
+#: ../tools/browser/auth-dialog.c:679
 #: ../tools/browser/login-dialog.c:238
 #, c-format
 msgid ""
@@ -6637,47 +6574,47 @@ msgstr ""
 msgid "c%u"
 msgstr "c%u"
 
-#: ../tools/browser/browser-connection.c:348
-#: ../tools/browser/browser-connection.c:428
+#: ../tools/browser/browser-connection.c:353
+#: ../tools/browser/browser-connection.c:439
 msgid "Analysing database schema"
 msgstr "Poteka analiza podatkovne sheme"
 
-#: ../tools/browser/browser-connection.c:350
-#: ../tools/browser/browser-connection.c:410
-#: ../tools/browser/browser-connection.c:430
-#: ../tools/browser/browser-connection.c:842
+#: ../tools/browser/browser-connection.c:355
+#: ../tools/browser/browser-connection.c:421
+#: ../tools/browser/browser-connection.c:441
+#: ../tools/browser/browser-connection.c:853
 #, c-format
 msgid "Error while fetching meta data from the connection: %s"
 msgstr "Napaka med pridobivanjem metapodatkov preko povezave: %s"
 
-#: ../tools/browser/browser-connection.c:408
-#: ../tools/browser/browser-connection.c:840
+#: ../tools/browser/browser-connection.c:419
+#: ../tools/browser/browser-connection.c:851
 msgid "Getting database schema information"
 msgstr "Pridobivanje podrobnosti sheme podatkovne zbirke"
 
-#: ../tools/browser/browser-connection.c:614
-#: ../tools/browser/browser-connection.c:634
+#: ../tools/browser/browser-connection.c:625
+#: ../tools/browser/browser-connection.c:645
 #, c-format
 msgid "Error while analysing database schema: %s"
 msgstr "Napaka ob prouÄ?evanju sheme podatkovne zbirke: %s"
 
-#: ../tools/browser/browser-connection.c:1096
-#: ../tools/browser/browser-connection.c:1146
+#: ../tools/browser/browser-connection.c:1107
+#: ../tools/browser/browser-connection.c:1157
 msgid "Executing a query"
 msgstr "Izvajanje poizvedbe"
 
-#: ../tools/browser/browser-connection.c:1408
+#: ../tools/browser/browser-connection.c:1437
 #, c-format
 msgid "Connection not yet opened"
 msgstr "Povezava Å¡e ni odprta"
 
-#: ../tools/browser/browser-connection.c:1414
+#: ../tools/browser/browser-connection.c:1443
 msgid "Can't initialize dictionary to store table preferences"
 msgstr "Ni mogoÄ?e zaÄ?eti slovarja za shranjevanje možnosti preglednice"
 
-#: ../tools/browser/browser-connection.c:1460
-#: ../tools/browser/browser-connection.c:1466
-#: ../tools/browser/browser-connection.c:1602
+#: ../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
@@ -6685,7 +6622,7 @@ msgstr "Ni mogoÄ?e zaÄ?eti slovarja za shranjevanje možnosti preglednice"
 msgid "Can't initialize transaction to access favorites"
 msgstr "Ni mogoÄ?e zaÄ?eti prenosa za dostop do priljubljenih"
 
-#: ../tools/browser/browser-connection.c:1547
+#: ../tools/browser/browser-connection.c:1576
 #: ../tools/browser/browser-favorites.c:702
 #: ../tools/browser/browser-favorites.c:1016
 msgid "Can't commit transaction to access favorites"
@@ -6726,12 +6663,12 @@ msgid "Opened connections"
 msgstr "Odprte povezave"
 
 #: ../tools/browser/browser-connections-list.c:354
-#: ../tools/gda-sql.c:3088
+#: ../tools/gda-sql.c:3090
 msgid "List of opened connections"
 msgstr "Seznam odprtih povezav"
 
 #: ../tools/browser/browser-connections-list.c:363
-#: ../tools/web-server.c:708
+#: ../tools/web-server.c:707
 msgid "Connections"
 msgstr "Povezave"
 
@@ -6769,17 +6706,17 @@ msgid "Bookmarks"
 msgstr "Zaznamki"
 
 #: ../tools/browser/browser-stock-icons.c:47
-#: ../tools/browser/browser-window.c:248
+#: ../tools/browser/browser-window.c:297
 msgid "Begin"
 msgstr "ZaÄ?etek"
 
 #: ../tools/browser/browser-stock-icons.c:48
-#: ../tools/browser/browser-window.c:250
+#: ../tools/browser/browser-window.c:299
 msgid "Commit"
 msgstr "Uveljavi"
 
 #: ../tools/browser/browser-stock-icons.c:49
-#: ../tools/browser/browser-window.c:252
+#: ../tools/browser/browser-window.c:301
 msgid "Rollback"
 msgstr "Povrni"
 
@@ -6795,19 +6732,19 @@ msgstr "Uporabljene so zvezane povezave"
 msgid "Virtual connection using this connection is busy"
 msgstr "Navidezna povezava, ki uporablja to povezavo je zaposlena"
 
-#: ../tools/browser/browser-window.c:223
+#: ../tools/browser/browser-window.c:271
 msgid "_Fullscreen"
 msgstr "_Celozaslonski naÄ?in"
 
-#: ../tools/browser/browser-window.c:223
+#: ../tools/browser/browser-window.c:271
 msgid "Use the whole screen"
 msgstr "Uporabi celoten zaslon"
 
-#: ../tools/browser/browser-window.c:229
+#: ../tools/browser/browser-window.c:277
 msgid "_Bind connection"
 msgstr "_Zveži povezave"
 
-#: ../tools/browser/browser-window.c:229
+#: ../tools/browser/browser-window.c:277
 msgid ""
 "Use connection to create\n"
 "a new binding connection to access data\n"
@@ -6817,77 +6754,89 @@ msgstr ""
 "novo vezno povezavo za dostop do\n"
 "veÄ? podatkovnih zbirk hkrati"
 
-#: ../tools/browser/browser-window.c:248
+#: ../tools/browser/browser-window.c:297
 msgid "Begin a new transaction"
 msgstr "ZaÄ?ni z novo transakcijo"
 
-#: ../tools/browser/browser-window.c:250
+#: ../tools/browser/browser-window.c:299
 msgid "Commit current transaction"
 msgstr "Uveljavi trenutno transakcijo"
 
-#: ../tools/browser/browser-window.c:252
+#: ../tools/browser/browser-window.c:301
 msgid "Rollback current transaction"
 msgstr "Povrni trenutno transakcijo"
 
-#: ../tools/browser/browser-window.c:340
+#: ../tools/browser/browser-window.c:391
 msgid "unnamed"
 msgstr "neimenovano"
 
-#: ../tools/browser/browser-window.c:341
+#: ../tools/browser/browser-window.c:392
 #, c-format
 msgid "Connection: %s"
 msgstr "Povezava: %s"
 
-#: ../tools/browser/browser-window.c:703
-#: ../tools/browser/support.c:75
+#: ../tools/browser/browser-window.c:785
+#: ../tools/browser/support.c:82
 #, c-format
 msgid "Do you want to close the '%s' connection?"
 msgstr "Ali želite zapreti '%s' povezavo?"
 
-#: ../tools/browser/browser-window.c:745
-#: ../tools/browser/browser-window.c:752
+#: ../tools/browser/browser-window.c:827
+#: ../tools/browser/browser-window.c:834
 msgid "Do you want to quit the application?"
 msgstr "Ali želite konÄ?ati program?"
 
-#: ../tools/browser/browser-window.c:746
+#: ../tools/browser/browser-window.c:828
 msgid "all the connections will be closed."
 msgstr "vse povezave bodo zaprte."
 
-#: ../tools/browser/browser-window.c:753
+#: ../tools/browser/browser-window.c:835
 msgid "the connection will be closed."
 msgstr "povezava bo zaprta."
 
-#: ../tools/browser/browser-window.c:804
+#: ../tools/browser/browser-window.c:886
 #, c-format
 msgid "Error starting transaction: %s"
 msgstr "Napaka med zaÄ?enjanjem transakcije: %s"
 
-#: ../tools/browser/browser-window.c:818
+#: ../tools/browser/browser-window.c:900
 #, c-format
 msgid "Error committing transaction: %s"
 msgstr "Napaka med uveljavljanjem transakcije: %s"
 
-#: ../tools/browser/browser-window.c:832
+#: ../tools/browser/browser-window.c:914
 #, c-format
 msgid "Error rolling back transaction: %s"
 msgstr "Napaka med povrnitvijo transakcije: %s"
 
-#: ../tools/browser/browser-window.c:944
+#: ../tools/browser/browser-window.c:998
+msgid "Hit the Escape key to leave the fullscreen mode"
+msgstr "Pritisnite tipko Esc za izhod iz celozaslonskega naÄ?ina"
+
+#: ../tools/browser/browser-window.c:1144
 #, c-format
 msgid "Error updating bound connection: %s"
 msgstr "Napaka med posodabljanjem povezave: %s"
 
-#: ../tools/browser/browser-window.c:985
+#: ../tools/browser/browser-window.c:1185
 #, c-format
 msgid "Could not open binding connection: %s"
 msgstr "Ni mogoÄ?e odpreti povezave: %s"
 
-#: ../tools/browser/browser-window.c:1025
+#: ../tools/browser/browser-window.c:1225
 #: ../tools/browser/gda-browser-4.0.desktop.in.h:2
 msgid "Database browser"
 msgstr "Brskalnik podatkovne zbirke"
 
-#: ../tools/browser/browser-window.c:1279
+#: ../tools/browser/browser-window.c:1543
+msgid "Don't show this message again"
+msgstr "SporoÄ?ila ne pokaži veÄ?"
+
+#: ../tools/browser/browser-window.c:1589
+msgid "Note:"
+msgstr "Opomba:"
+
+#: ../tools/browser/browser-window.c:1701
 #, c-format
 msgid "The current perspective has changed to the '%s' perspective, you can switch back to previous perspective through the 'Perspective/%s' menu, or using the '%s' shortcut"
 msgstr "Trenutna perspektiva je spremenjena v '%s' perspektivo, nazaj pa jo je mogoÄ?e preklopiti preko vnosa menija 'Perspektiva/%s' ali pa s tipkovno bližnjico '%s'."
@@ -7030,7 +6979,7 @@ msgstr "DELETE SAVEPOINT izjava"
 msgid "Unknown statement"
 msgstr "Neznana izjava"
 
-#: ../tools/browser/mgr-favorites.c:541
+#: ../tools/browser/mgr-favorites.c:547
 msgid ""
 "Getting\n"
 "favorites..."
@@ -7038,7 +6987,7 @@ msgstr ""
 "Dobivanje\n"
 "priljubljenih"
 
-#: ../tools/browser/mgr-favorites.c:553
+#: ../tools/browser/mgr-favorites.c:559
 msgid ""
 "No favorite:\n"
 "drag item to\n"
@@ -7048,27 +6997,23 @@ msgstr ""
 "potegni predmet na\n"
 "doloÄ?i predmet"
 
-#: ../tools/browser/support.c:208
-msgid "Note:"
-msgstr "Opomba:"
-
-#: ../tools/browser/support.c:211
-msgid "Don't show this message again"
-msgstr "SporoÄ?ila ne pokaži veÄ?"
-
-#: ../tools/browser/support.c:272
+#: ../tools/browser/support.c:205
 msgid "Unable to display help. Please make sure the documentation package is installed."
 msgstr "Ni mogoÄ?e pokazati pomoÄ?i. PrepriÄ?ajte se, da je paket dokumentacije nameÅ¡Ä?en."
 
-#: ../tools/browser/support.c:298
+#: ../tools/browser/support.c:231
 msgid "Unable to open help file"
 msgstr "Ni mogoÄ?e odpreti datoteke pomoÄ?i"
 
-#: ../tools/browser/support.c:352
+#: ../tools/browser/support.c:241
+msgid "Help is being loaded, please wait..."
+msgstr "Dokumenti pomoÄ?i se nalagajo, poÄ?akajte ..."
+
+#: ../tools/browser/support.c:288
 msgid "Close tab"
 msgstr "Zapri zavihek"
 
-#: ../tools/browser/support.h:95
+#: ../tools/browser/support.h:96
 msgid ""
 "<small>This area allows to give values to\n"
 "variables defined in the SQL code\n"
@@ -7103,18 +7048,26 @@ msgstr ""
 msgid "Type: %s"
 msgstr "Vrsta: %s"
 
-#: ../tools/browser/canvas/browser-canvas-db-relations.c:348
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:299
 msgid "Remove"
 msgstr "Odstrani"
 
-#: ../tools/browser/canvas/browser-canvas-db-relations.c:352
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:303
 msgid "Add referenced tables"
 msgstr "Dodaj sklicno preglednico"
 
-#: ../tools/browser/canvas/browser-canvas-db-relations.c:513
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:307
+msgid "Add tables referencing this table"
+msgstr "Dodaj preglednice s sklici na to preglednico"
+
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:505
 msgid "Add table"
 msgstr "Dodaj preglednico"
 
+#: ../tools/browser/canvas/browser-canvas-db-relations.c:525
+msgid "Select tables to add to diagram"
+msgstr "Izbor preglednic za dodajanje na diagram"
+
 #: ../tools/browser/canvas/browser-canvas-print.c:82
 msgid "Page size and zoom"
 msgstr "Velikost strani in približevanje"
@@ -7295,7 +7248,7 @@ msgstr "Podatkovni set %s in %s"
 msgid "No data set"
 msgstr "Ni doloÄ?enih podatkov"
 
-#: ../tools/browser/common/objects-cloud.c:237
+#: ../tools/browser/common/objects-cloud.c:249
 #, c-format
 msgid "%d table in current schema:"
 msgid_plural "%d tables in current schema:"
@@ -7304,11 +7257,11 @@ msgstr[1] "%d preglednica v trenutni shemi"
 msgstr[2] "%d preglednici v trenutni shemi"
 msgstr[3] "%d preglednice v trenutni shemi"
 
-#: ../tools/browser/common/objects-cloud.c:241
+#: ../tools/browser/common/objects-cloud.c:253
 msgid "Tables in current schema:"
 msgstr "Preglednice v trenutni shemi"
 
-#: ../tools/browser/common/objects-cloud.c:244
+#: ../tools/browser/common/objects-cloud.c:256
 #, c-format
 msgid "%d Table in schema '%s':"
 msgid_plural "%d Tables in schema '%s':"
@@ -7318,59 +7271,62 @@ msgstr[2] "%d preglednici v shemi '%s':"
 msgstr[3] "%d preglednice v shemi '%s':"
 
 #. no connection at all or not authenticated
-#: ../tools/browser/common/objects-cloud.c:254
-#: ../tools/web-server.c:713
+#: ../tools/browser/common/objects-cloud.c:266
+#: ../tools/web-server.c:712
 msgid "None"
 msgstr "Brez"
 
-#: ../tools/browser/common/ui-formgrid.c:162
+#: ../tools/browser/common/ui-formgrid.c:169
 msgid "Toggle between grid and form presentations"
 msgstr "Preklop med mrežnimi in oblikovnimi predstavitvami"
 
-#: ../tools/browser/data-manager/data-console.c:205
+#: ../tools/browser/data-manager/data-console.c:296
 msgid "Data Manager"
 msgstr "Upravljalnik podatkov"
 
-#: ../tools/browser/data-manager/data-console.c:223
-#: ../tools/browser/query-exec/query-console.c:336
+#: ../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
+msgid "Unsaved"
+msgstr "Neshranjeno"
+
+#: ../tools/browser/data-manager/data-console.c:327
+#: ../tools/browser/query-exec/query-console.c:330
 msgid "Variables' values:"
 msgstr "Vrednosti spremenljivke:"
 
-#: ../tools/browser/data-manager/data-console.c:257
-#: ../tools/browser/query-exec/query-console.c:315
-msgid "SQL code to execute:"
-msgstr "Koda SQL ia izvedbo:"
-
-#: ../tools/browser/data-manager/data-console.c:301
-#: ../tools/browser/query-exec/query-console.c:363
-#: ../tools/browser/query-exec/query-console.c:427
-msgid "Clear"
+#: ../tools/browser/data-manager/data-console.c:384
+msgid "Reset"
 msgstr "PoÄ?isti"
 
-#: ../tools/browser/data-manager/data-console.c:301
-#: ../tools/browser/query-exec/query-console.c:363
+#: ../tools/browser/data-manager/data-console.c:385
 msgid ""
-"Clear the editor's\n"
+"Reset the editor's\n"
 "contents"
 msgstr ""
 "PoÄ?isti vsebino\n"
 "urejevalnika"
 
-#: ../tools/browser/data-manager/data-console.c:306
-#: ../tools/browser/query-exec/query-console.c:368
+#: ../tools/browser/data-manager/data-console.c:392
+msgid "Add a new data source"
+msgstr "Dodaj nov podatkovni vir"
+
+#: ../tools/browser/data-manager/data-console.c:398
+#: ../tools/browser/query-exec/query-console.c:362
 msgid "Variables"
 msgstr "Spremenljivke"
 
-#: ../tools/browser/data-manager/data-console.c:306
+#: ../tools/browser/data-manager/data-console.c:398
 msgid "Show variables needed"
 msgstr "Pokaži zahtevane spremenljivke"
 
-#: ../tools/browser/data-manager/data-console.c:312
-#: ../tools/browser/query-exec/query-console.c:374
+#: ../tools/browser/data-manager/data-console.c:404
+#: ../tools/browser/query-exec/query-console.c:368
 msgid "Execute"
 msgstr "Izvedi"
 
-#: ../tools/browser/data-manager/data-console.c:312
+#: ../tools/browser/data-manager/data-console.c:404
 msgid ""
 "Execute specified\n"
 "data manager"
@@ -7378,11 +7334,11 @@ msgstr ""
 "Izvedi doloÄ?en\n"
 "upravljalnik podatkov"
 
-#: ../tools/browser/data-manager/data-console.c:318
+#: ../tools/browser/data-manager/data-console.c:410
 msgid "View XML"
 msgstr "Pogled XML"
 
-#: ../tools/browser/data-manager/data-console.c:318
+#: ../tools/browser/data-manager/data-console.c:410
 msgid ""
 "View specifications\n"
 "as XML (advanced)"
@@ -7390,38 +7346,71 @@ msgstr ""
 "Pogled doloÄ?il\n"
 "kot XML (napredno)"
 
-#: ../tools/browser/data-manager/data-console.c:328
+#: ../tools/browser/data-manager/data-console.c:418
 #: ../tools/html-doc.c:95
 msgid "Help"
 msgstr "PomoÄ?"
 
-#: ../tools/browser/data-manager/data-console.c:343
+#: ../tools/browser/data-manager/data-console.c:431
 msgid "BBB:"
 msgstr "BBB:"
 
-#: ../tools/browser/data-manager/data-console.c:434
+#: ../tools/browser/data-manager/data-console.c:503
 #, c-format
-msgid "No data source defined"
-msgstr "Ni doloÄ?enega podatkovnega vira"
+msgid "'%s' data manager"
+msgstr "Upravljalnik podatkov '%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
+msgid "Data manager"
+msgstr "Upravljalnik podatkov"
+
+#: ../tools/browser/data-manager/data-console.c:558
+msgid "Could not save data manager"
+msgstr "Ni mogoÄ?e shraniti upravljalnika podatkov"
+
+#: ../tools/browser/data-manager/data-console.c:584
+msgid "Data manager's name"
+msgstr "Ime upravljalnika podatkov"
 
-#: ../tools/browser/data-manager/data-console.c:493
-#: ../tools/browser/data-manager/spec-editor.c:155
+#: ../tools/browser/data-manager/data-console.c:604
+#: ../tools/browser/schema-browser/relations-diagram.c:280
+msgid "Save"
+msgstr "Shrani"
+
+#: ../tools/browser/data-manager/data-console.c:724
 #, c-format
-msgid "Error parsing XML specifications"
-msgstr "Napaka med razÄ?lenjevanjem XML doloÄ?il"
+msgid "source%d"
+msgstr "vir%d"
 
-#: ../tools/browser/data-manager/data-console.c:510
+#: ../tools/browser/data-manager/data-console.c:767
+msgid "Data source from query"
+msgstr "Podatkovni vir poizvedbe"
+
+#: ../tools/browser/data-manager/data-console.c:805
+#, c-format
+msgid "In schema %s"
+msgstr "V shemi %s"
+
+#: ../tools/browser/data-manager/data-console.c:815
+#, c-format
+msgid "For table: %s"
+msgstr "Za preglednico: %s"
+
+#: ../tools/browser/data-manager/data-console.c:892
+msgid "Switching to execution mode. Hit the Escape key to return to the compose mode"
+msgstr "Preklapljanje naÄ?ina izvajanja. Pritisnite tipko Esc za vrnitev v naÄ?in izgradnje"
+
+#: ../tools/browser/data-manager/data-console.c:898
 msgid "_Toggle mode"
 msgstr "_Preklopni naÄ?in"
 
-#: ../tools/browser/data-manager/data-console.c:510
+#: ../tools/browser/data-manager/data-console.c:898
 msgid "Switch between compose and execute modes"
 msgstr "Preklop med naÄ?inom sestavljanja in izvajanja"
 
-#: ../tools/browser/data-manager/data-console.c:554
-msgid "Data manager"
-msgstr "Upravljalnik podatkov"
-
 #: ../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
@@ -7430,12 +7419,12 @@ msgid "Could not remove favorite: %s"
 msgstr "Ni mogoÄ?e odstraniti priljubljenega: %s"
 
 #: ../tools/browser/data-manager/data-favorite-selector.c:258
-#: ../tools/browser/data-manager/data-favorite-selector.c:628
-#: ../tools/browser/query-exec/query-console.c:689
+#: ../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:600
-#: ../tools/browser/schema-browser/favorite-selector.c:358
-#: ../tools/browser/schema-browser/table-info.c:474
+#: ../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
 #, c-format
 msgid "Could not add favorite: %s"
 msgstr "Ni mogoÄ?e dodati med priljubljeno: %s"
@@ -7449,94 +7438,219 @@ msgstr "Lastnosti priljubljenega"
 msgid "Specifications"
 msgstr "DoloÄ?ila"
 
-#: ../tools/browser/data-manager/data-favorite-selector.c:484
-#: ../tools/browser/query-exec/query-favorite-selector.c:449
-#: ../tools/browser/schema-browser/favorite-selector.c:248
+#: ../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
 msgid "Favorites"
 msgstr "Priljubljeno"
 
-#: ../tools/browser/data-manager/data-favorite-selector.c:614
+#: ../tools/browser/data-manager/data-favorite-selector.c:612
 msgid "Unnamed data manager"
 msgstr "Neimenovan upravljalnik podatkov"
 
+#: ../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
+msgid "_Show favorites"
+msgstr "_Pokaži priljubljene"
+
+#: ../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
+msgid "Show or hide favorites"
+msgstr "Pokaži ali skrij priljubljene"
+
 #. Translators: Do not translate "table" nor "query"
-#: ../tools/browser/data-manager/data-source.c:250
+#: ../tools/browser/data-manager/data-source.c:401
 #, c-format
 msgid "Node must be \"table\" or \"query\", and is \"%s\""
 msgstr "VozliÅ¡Ä?e mora biti \"preglednica\" ali \"poizvedba\", je pa \"%s\""
 
-#: ../tools/browser/data-manager/data-source.c:279
-#, c-format
-msgid "Multiple statements detected, only the first will be used"
-msgstr "Zaznanih je veÄ? izjav, uporabljena pa bo le prva"
-
-#: ../tools/browser/data-manager/data-source.c:351
+#: ../tools/browser/data-manager/data-source.c:434
 #: ../tools/browser/schema-browser/mgr-columns.c:274
 #, c-format
 msgid "Not ready"
 msgstr "Ni pripravljeno"
 
-#: ../tools/browser/data-manager/data-source.c:358
+#: ../tools/browser/data-manager/data-source.c:441
 #, c-format
 msgid "Malformed table name \"%s\""
 msgstr "IzmaliÄ?eno ime preglednice \"%s\""
 
-#: ../tools/browser/data-manager/data-source.c:375
+#: ../tools/browser/data-manager/data-source.c:458
 #, c-format
 msgid "Could not find the \"%s\" table"
 msgstr "Ni mogoÄ?e najti preglednice \"%s\""
 
-#: ../tools/browser/data-manager/data-source.c:380
+#: ../tools/browser/data-manager/data-source.c:463
 #, c-format
 msgid "The \"%s\" object is not a table"
 msgstr "Predmet \"%s\" ni preglednica"
 
 #. Translators: Do not translate "name"
-#: ../tools/browser/data-manager/data-source.c:394
+#: ../tools/browser/data-manager/data-source.c:482
 #, c-format
 msgid "Missing attribute \"name\" for table"
 msgstr "Manjka atribut \"ime\" preglednice"
 
-#: ../tools/browser/data-manager/data-source.c:399
-#, c-format
-msgid "Contents of '%s'"
-msgstr "Vsebina '%s'"
-
-#: ../tools/browser/data-manager/data-source.c:417
-#, c-format
-msgid "Could not build SELECT statement"
-msgstr "Ni mogoÄ?e izgraditi izjave SELECT"
-
-#: ../tools/browser/data-manager/data-source.c:494
+#: ../tools/browser/data-manager/data-source.c:622
 #, c-format
 msgid "Could not find any foreign key to \"%s\""
 msgstr "Ni mogoÄ?e najti tujega kljuÄ?a za \"'%s\""
 
-#: ../tools/browser/data-manager/data-source.c:502
+#: ../tools/browser/data-manager/data-source.c:627
 #, c-format
 msgid "The fields involved in the foreign key to \"%s\" are not known"
 msgstr "Polja povezana s tujim kljuÄ?em za \"%s\" niso znana"
 
-#: ../tools/browser/data-manager/data-source.c:616
+#: ../tools/browser/data-manager/data-source.c:808
 #, c-format
 msgid "Statement to execute is not a selection statement"
 msgstr "Izjave za izvedbo ni izjava izbire"
 
-#: ../tools/browser/data-manager/data-source.c:756
+#: ../tools/browser/data-manager/data-source.c:948
 #, c-format
 msgid "No SELECT statement to execute"
 msgstr "Ni doloÄ?ene izjave SELECT za izvedbo"
 
-#: ../tools/browser/data-manager/data-widget.c:349
+#: ../tools/browser/data-manager/data-source.c:1231
+#, c-format
+msgid "Contents of '%s'"
+msgstr "Vsebina '%s'"
+
+#: ../tools/browser/data-manager/data-source.c:1242
+#, c-format
+msgid "Could not build SELECT statement"
+msgstr "Ni mogoÄ?e izgraditi izjave SELECT"
+
+#: ../tools/browser/data-manager/data-source.c:1309
+#, c-format
+msgid "Multiple statements detected, only the first will be used"
+msgstr "Zaznanih je veÄ? izjav, uporabljena pa bo le prva"
+
+#: ../tools/browser/data-manager/data-source-editor.c:125
+msgid ""
+"Data source's ID\n"
+"(as referenced by other data sources)"
+msgstr ""
+"ID podatkovnega vira\n"
+"(kot je sklicano z drugimi podatkovnimi viri)"
+
+#: ../tools/browser/data-manager/data-source-editor.c:131
+msgid "Data source's description"
+msgstr "Opis podatkovnega vira"
+
+#: ../tools/browser/data-manager/data-source-editor.c:135
+msgid ""
+"Table to display data from, leave empty\n"
+"to specify a SELECT statement instead"
+msgstr ""
+"Preglednica za prikaz podatkov pustite prazno\n"
+"za doloÄ?itev stavka SELECT"
+
+#: ../tools/browser/data-manager/data-source-editor.c:139
+msgid ""
+"SELECT\n"
+"SQL"
+msgstr ""
+"SELECT\n"
+"SQL"
+
+#: ../tools/browser/data-manager/data-source-editor.c:140
+msgid ""
+"Actual SQL executed\n"
+"to select data"
+msgstr ""
+"Izvedeni ukaz SQL\n"
+"za izbor podatkov"
+
+#: ../tools/browser/data-manager/data-source-editor.c:150
+msgid "Dependencies:"
+msgstr "Odvisnosti:"
+
+#: ../tools/browser/data-manager/data-source-editor.c:243
+msgid "Requires:"
+msgstr "Zahteva:"
+
+#: ../tools/browser/data-manager/data-source-editor.c:260
+msgid "Exports:"
+msgstr "Izvozi:"
+
+#: ../tools/browser/data-manager/data-widget.c:247
+msgid "Link to other data"
+msgstr "Poveži z drugimi podatki"
+
+#: ../tools/browser/data-manager/data-widget.c:343
+#, c-format
+msgid "Error adding new data source: %s"
+msgstr "Napaka med dodajanjem novega podatkovnega vira: %s"
+
+#: ../tools/browser/data-manager/data-widget.c:388
+msgid "Remove data source"
+msgstr "Odstrani podatkovni vir"
+
+#: ../tools/browser/data-manager/data-widget.c:394
+msgid "Show data source's properties"
+msgstr "Pokaži lastnosti podatkovnega vira"
+
+#: ../tools/browser/data-manager/data-widget.c:532
+msgid "Obtain referenced data in table "
+msgstr "Pridobi sklicne podatke v preglednici"
+
+#: ../tools/browser/data-manager/data-widget.c:549
+msgid "List referencing data in "
+msgstr "Sklicni seznam podatkov v"
+
+#: ../tools/browser/data-manager/data-widget.c:615
+msgid "No data source defined"
+msgstr "Ni doloÄ?enega podatkovnega vira"
+
+#: ../tools/browser/data-manager/data-widget.c:850
 msgid "Error: no detail"
 msgstr "Napaka: ni podrobnosti"
 
-#: ../tools/browser/query-exec/query-console.c:289
-#: ../tools/browser/query-exec/query-console.c:1083
+#: ../tools/browser/data-manager/ui-spec-editor.c:153
+msgid "Data sources:"
+msgstr "Podatkovni viri:"
+
+#: ../tools/browser/data-manager/ui-spec-editor.c:204
+msgid "Selected data source's properties:"
+msgstr "Lastnosti izbranega podatkovnega vira:"
+
+#: ../tools/browser/data-manager/xml-spec-editor.c:171
+#, c-format
+msgid "Error parsing XML specifications"
+msgstr "Napaka med razÄ?lenjevanjem XML doloÄ?il"
+
+#: ../tools/browser/data-manager/xml-spec-editor.c:185
+#, c-format
+msgid "Expecting <%s> root node"
+msgstr "PriÄ?akovano je <%s> korensko vozliÅ¡Ä?e"
+
+#: ../tools/browser/data-manager/xml-spec-editor.c:320
+#: ../tools/browser/query-exec/query-console.c:309
+msgid "SQL code to execute:"
+msgstr "Koda SQL ia izvedbo:"
+
+#: ../tools/browser/query-exec/query-console.c:283
+#: ../tools/browser/query-exec/query-console.c:1078
 msgid "Query editor"
 msgstr "Urejevalnik poizvedb"
 
-#: ../tools/browser/query-exec/query-console.c:368
+#: ../tools/browser/query-exec/query-console.c:357
+#: ../tools/browser/query-exec/query-console.c:421
+msgid "Clear"
+msgstr "PoÄ?isti"
+
+#: ../tools/browser/query-exec/query-console.c:357
+msgid ""
+"Clear the editor's\n"
+"contents"
+msgstr ""
+"PoÄ?isti vsebino\n"
+"urejevalnika"
+
+#: ../tools/browser/query-exec/query-console.c:362
 msgid ""
 "Show variables needed\n"
 "to execute SQL"
@@ -7544,15 +7658,15 @@ msgstr ""
 "Pokaži spremenljivke zahtevane\n"
 "za izvajanje SQL"
 
-#: ../tools/browser/query-exec/query-console.c:374
+#: ../tools/browser/query-exec/query-console.c:368
 msgid "Execute SQL in editor"
 msgstr "Izvedi SQL v urejevalniku"
 
-#: ../tools/browser/query-exec/query-console.c:380
+#: ../tools/browser/query-exec/query-console.c:374
 msgid "Indent"
 msgstr "Zamakni"
 
-#: ../tools/browser/query-exec/query-console.c:380
+#: ../tools/browser/query-exec/query-console.c:374
 msgid ""
 "Indent SQL in editor\n"
 "and make the code more readable\n"
@@ -7562,23 +7676,23 @@ msgstr ""
 "in tako naredi kodo bolj pregledno\n"
 "(odstranjene bodo opombe)"
 
-#: ../tools/browser/query-exec/query-console.c:388
+#: ../tools/browser/query-exec/query-console.c:382
 msgid "Favorite"
 msgstr "Priljubljeno"
 
-#: ../tools/browser/query-exec/query-console.c:388
+#: ../tools/browser/query-exec/query-console.c:382
 msgid "Add SQL to favorite"
 msgstr "Dodaj SQL med priljubljeno"
 
-#: ../tools/browser/query-exec/query-console.c:402
+#: ../tools/browser/query-exec/query-console.c:396
 msgid "Execution history:"
 msgstr "Zgodovina izvedbe:"
 
-#: ../tools/browser/query-exec/query-console.c:420
+#: ../tools/browser/query-exec/query-console.c:414
 msgid "Copy"
 msgstr "Kopiraj"
 
-#: ../tools/browser/query-exec/query-console.c:420
+#: ../tools/browser/query-exec/query-console.c:414
 msgid ""
 "Copy selected history\n"
 "to editor"
@@ -7586,46 +7700,46 @@ msgstr ""
 "Kopiraj izbrano zgodovino\n"
 "v urejevalnik"
 
-#: ../tools/browser/query-exec/query-console.c:427
+#: ../tools/browser/query-exec/query-console.c:421
 msgid "Clear history"
 msgstr "PoÄ?isti zgodovino"
 
-#: ../tools/browser/query-exec/query-console.c:439
+#: ../tools/browser/query-exec/query-console.c:433
 msgid "Execution Results:"
 msgstr "Rezultati izvedbe:"
 
-#: ../tools/browser/query-exec/query-console.c:683
-#: ../tools/browser/query-exec/query-favorite-selector.c:586
+#: ../tools/browser/query-exec/query-console.c:677
+#: ../tools/browser/query-exec/query-favorite-selector.c:583
 msgid "Unnamed query"
 msgstr "Neimenovana poizvedba"
 
-#: ../tools/browser/query-exec/query-console.c:773
+#: ../tools/browser/query-exec/query-console.c:767
 msgid "Invalid variable's contents"
 msgstr "Neveljavna vsebina spremenljivke"
 
-#: ../tools/browser/query-exec/query-console.c:774
-#: ../tools/browser/schema-browser/table-info.c:919
+#: ../tools/browser/query-exec/query-console.c:768
+#: ../tools/browser/schema-browser/table-info.c:914
 msgid "assign values to the following variables"
 msgstr "dodeli vrednosti naslednjim spremenljivkam"
 
-#: ../tools/browser/query-exec/query-console.c:828
+#: ../tools/browser/query-exec/query-console.c:822
 #, c-format
 msgid "Error while parsing code: %s"
 msgstr "Napaka med razÄ?lenjevanjem kode: %s"
 
-#: ../tools/browser/query-exec/query-console.c:840
+#: ../tools/browser/query-exec/query-console.c:834
 msgid "A query is already being executed, to execute another query, open a new connection."
 msgstr "Poizvedba je že izvedena. Za izvedbo druge poizvedbe, odprite novo povezavo."
 
-#: ../tools/browser/query-exec/query-console.c:873
-#: ../tools/browser/schema-browser/table-info.c:553
+#: ../tools/browser/query-exec/query-console.c:867
+#: ../tools/browser/schema-browser/table-info.c:548
 #, c-format
 msgid "Error executing query: %s"
 msgstr "Napaka izvajanja poizvedbe: %s"
 
-#: ../tools/browser/query-exec/query-console.c:926
-#: ../tools/browser/query-exec/query-console.c:976
-#: ../tools/browser/schema-browser/table-info.c:526
+#: ../tools/browser/query-exec/query-console.c:920
+#: ../tools/browser/query-exec/query-console.c:971
+#: ../tools/browser/schema-browser/table-info.c:520
 #, c-format
 msgid ""
 "Error executing query:\n"
@@ -7634,11 +7748,11 @@ msgstr ""
 "Napaka izvajanja poizvedbe:\n"
 "%s"
 
-#: ../tools/browser/query-exec/query-console.c:937
+#: ../tools/browser/query-exec/query-console.c:931
 msgid "Statement executed"
 msgstr "Izjava je izvedena"
 
-#: ../tools/browser/query-exec/query-console.c:945
+#: ../tools/browser/query-exec/query-console.c:940
 msgid ""
 "A transaction has automatically been started\n"
 "during this statement's execution, this usually\n"
@@ -7653,19 +7767,19 @@ msgstr ""
 "so blobi dostopni. PoÄ?istiti je treba zgodovino pred\n"
 "konÄ?anjem prenosa."
 
-#: ../tools/browser/query-exec/query-console.c:1033
+#: ../tools/browser/query-exec/query-console.c:1028
 msgid "_Execute"
 msgstr "_Izvedi"
 
-#: ../tools/browser/query-exec/query-console.c:1033
+#: ../tools/browser/query-exec/query-console.c:1028
 msgid "Execute query"
 msgstr "Izvedi poizvedbo"
 
-#: ../tools/browser/query-exec/query-console.c:1036
+#: ../tools/browser/query-exec/query-console.c:1031
 msgid "_Undo"
 msgstr "_Razveljavi"
 
-#: ../tools/browser/query-exec/query-console.c:1036
+#: ../tools/browser/query-exec/query-console.c:1031
 msgid "Undo last change"
 msgstr "Razveljavi zadnjo spremembo"
 
@@ -7704,15 +7818,15 @@ msgstr[1] "pred %lu dnevom\n"
 msgstr[2] "pred %lu dnevoma\n"
 msgstr[3] "pred %lu dnevi\n"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:314
+#: ../tools/browser/query-exec/query-exec-perspective.c:389
 msgid "_Query"
 msgstr "_Poizvedba"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:315
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
 msgid "_New editor"
 msgstr "_Nov urejevalnik"
 
-#: ../tools/browser/query-exec/query-exec-perspective.c:315
+#: ../tools/browser/query-exec/query-exec-perspective.c:390
 msgid "Open a new query editor"
 msgstr "Odpri nov urejevalnik poizvedbe"
 
@@ -7766,85 +7880,76 @@ msgstr "Kazalo preglednice"
 msgid "Schema browser"
 msgstr "Brskalnik shem"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:230
-#: ../tools/browser/schema-browser/relations-diagram.c:567
+#: ../tools/browser/schema-browser/relations-diagram.c:224
+#: ../tools/browser/schema-browser/relations-diagram.c:561
 msgid "Diagram"
 msgstr "Diagram"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:240
+#: ../tools/browser/schema-browser/relations-diagram.c:234
 msgid "Could not save diagram"
 msgstr "Ni mogoÄ?e shraniti diagrama"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:266
+#: ../tools/browser/schema-browser/relations-diagram.c:260
 msgid "Canvas's name"
 msgstr "Ime platna"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:286
-msgid "Save"
-msgstr "Shrani"
-
-#: ../tools/browser/schema-browser/relations-diagram.c:327
-#: ../tools/browser/schema-browser/relations-diagram.c:384
-#: ../tools/browser/schema-browser/relations-diagram.c:464
-#: ../tools/browser/schema-browser/relations-diagram.c:475
+#: ../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
 msgid "Relations diagram"
 msgstr "Diagram povezav"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:327
-#: ../tools/browser/schema-browser/relations-diagram.c:475
-msgid "Unsaved diagram"
-msgstr "Neshranjen diagram"
-
-#: ../tools/browser/schema-browser/relations-diagram.c:374
+#: ../tools/browser/schema-browser/relations-diagram.c:368
 #, c-format
 msgid "Error parsing favorite's contents"
 msgstr "Napaka med razÄ?lenjevanjem vsebine priljubljenih"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:383
-#: ../tools/browser/schema-browser/relations-diagram.c:463
+#: ../tools/browser/schema-browser/relations-diagram.c:377
+#: ../tools/browser/schema-browser/relations-diagram.c:457
 #, c-format
 msgid "'%s' diagram"
 msgstr "'%s' diagram"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:433
+#: ../tools/browser/schema-browser/relations-diagram.c:427
 #, c-format
 msgid "Missing table attribute in favorite's contents"
 msgstr "Manjka atribut preglednice v vsebini priljubljenih"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:519
-#: ../tools/browser/schema-browser/table-info.c:951
+#: ../tools/browser/schema-browser/relations-diagram.c:513
+#: ../tools/browser/schema-browser/table-info.c:946
 msgid "_Contents"
 msgstr "_Vsebina"
 
-#: ../tools/browser/schema-browser/relations-diagram.c:519
+#: ../tools/browser/schema-browser/relations-diagram.c:513
 msgid "View contents"
 msgstr "Pogled vsebine"
 
-#: ../tools/browser/schema-browser/schema-browser-perspective.c:380
+#: ../tools/browser/schema-browser/schema-browser-perspective.c:416
 msgid "Could not load diagram"
 msgstr "Ni mogoÄ?e naložiti diagrama"
 
-#: ../tools/browser/schema-browser/table-columns.c:234
+#: ../tools/browser/schema-browser/table-columns.c:228
 msgid "Foreign key on "
 msgstr "Tuje tipke omogoÄ?ene"
 
-#: ../tools/browser/schema-browser/table-columns.c:306
+#: ../tools/browser/schema-browser/table-columns.c:303
 msgid "Unique constraint"
 msgstr "EnoznaÄ?na omejitev"
 
-#: ../tools/browser/schema-browser/table-columns.c:337
+#: ../tools/browser/schema-browser/table-columns.c:334
 msgid "Tables referencing this one"
 msgstr "Sklicna preglednica za to preglednico"
 
-#: ../tools/browser/schema-browser/table-columns.c:451
+#: ../tools/browser/schema-browser/table-columns.c:448
 msgid "Column Name"
 msgstr "Ime stolpca"
 
-#: ../tools/browser/schema-browser/table-columns.c:506
+#: ../tools/browser/schema-browser/table-columns.c:503
 msgid "Constraints and integrity rules"
 msgstr "Omejitve in celostna pravila"
 
-#: ../tools/browser/schema-browser/table-info.c:363
+#: ../tools/browser/schema-browser/table-info.c:357
 msgid ""
 "Table not found. If you think this is an error,\n"
 "please refresh the meta data from the database\n"
@@ -7854,27 +7959,27 @@ msgstr ""
 "osvežite metapodatke podatkovne zbirke\n"
 "(meni Povezava/Pridobi metapodatke)."
 
-#: ../tools/browser/schema-browser/table-info.c:394
+#: ../tools/browser/schema-browser/table-info.c:388
 msgid "Relations"
 msgstr "Povezave"
 
-#: ../tools/browser/schema-browser/table-info.c:404
+#: ../tools/browser/schema-browser/table-info.c:398
 msgid "Preferences"
 msgstr "Možnosti"
 
-#: ../tools/browser/schema-browser/table-info.c:532
+#: ../tools/browser/schema-browser/table-info.c:527
 msgid "Data successfully inserted"
 msgstr "Podatki so uspešno vstavljeni"
 
-#: ../tools/browser/schema-browser/table-info.c:671
+#: ../tools/browser/schema-browser/table-info.c:666
 msgid "Meta data not yet available"
 msgstr "Metapodatki niso na voljo"
 
-#: ../tools/browser/schema-browser/table-info.c:688
+#: ../tools/browser/schema-browser/table-info.c:683
 msgid "Can't find information about table"
 msgstr "Ni mogoÄ?e najti podrobnosti preglednice"
 
-#: ../tools/browser/schema-browser/table-info.c:724
+#: ../tools/browser/schema-browser/table-info.c:719
 #, c-format
 msgid ""
 "Internal error while building INSERT statement:\n"
@@ -7883,57 +7988,57 @@ msgstr ""
 "Notranja napaka med izgradnjo stavka INSERT:\n"
 "%s"
 
-#: ../tools/browser/schema-browser/table-info.c:770
+#: ../tools/browser/schema-browser/table-info.c:765
 #, c-format
 msgid "Default value: '%s'"
 msgstr "Privzeta vrednost: '%s'"
 
-#: ../tools/browser/schema-browser/table-info.c:780
+#: ../tools/browser/schema-browser/table-info.c:775
 msgid "Default value: auto incremented value"
 msgstr "Privzeta vrednost: samodejno poveÄ?ana vrednost"
 
-#: ../tools/browser/schema-browser/table-info.c:894
-#: ../tools/browser/schema-browser/table-info.c:918
+#: ../tools/browser/schema-browser/table-info.c:889
+#: ../tools/browser/schema-browser/table-info.c:913
 msgid "Values to insert into table"
 msgstr "Vrednosti, ki naj se vstavijo v preglednico"
 
-#: ../tools/browser/schema-browser/table-info.c:949
+#: ../tools/browser/schema-browser/table-info.c:944
 msgid "Add to _Favorites"
 msgstr "Dodaj med _priljubljene"
 
-#: ../tools/browser/schema-browser/table-info.c:949
+#: ../tools/browser/schema-browser/table-info.c:944
 msgid "Add table to favorites"
 msgstr "Dodaj preglednico med priljubljene"
 
-#: ../tools/browser/schema-browser/table-info.c:951
+#: ../tools/browser/schema-browser/table-info.c:946
 msgid "View table's contents"
 msgstr "Pregled vsebine preglednice"
 
-#: ../tools/browser/schema-browser/table-info.c:953
+#: ../tools/browser/schema-browser/table-info.c:948
 msgid "_Insert data"
 msgstr "_Vstavi podatke"
 
-#: ../tools/browser/schema-browser/table-info.c:953
+#: ../tools/browser/schema-browser/table-info.c:948
 msgid "Insert data into table"
 msgstr "Vstavi podatke v preglednico"
 
-#: ../tools/browser/schema-browser/table-preferences.c:267
+#: ../tools/browser/schema-browser/table-preferences.c:261
 msgid "default"
 msgstr "privzeto"
 
-#: ../tools/browser/schema-browser/table-preferences.c:344
+#: ../tools/browser/schema-browser/table-preferences.c:338
 msgid "Table's fields"
 msgstr "Polja preglednice"
 
-#: ../tools/browser/schema-browser/table-preferences.c:388
+#: ../tools/browser/schema-browser/table-preferences.c:382
 msgid "Field's display preferences"
 msgstr "Možnosti prikaza polja"
 
-#: ../tools/browser/schema-browser/table-preferences.c:465
+#: ../tools/browser/schema-browser/table-preferences.c:459
 msgid "Data entry type:"
 msgstr "Vrsta vnosa podatkov:"
 
-#: ../tools/browser/schema-browser/table-preferences.c:466
+#: ../tools/browser/schema-browser/table-preferences.c:460
 msgid ""
 "Defines how data for the selected column\n"
 "will be displayed in forms. Leave 'Default' to have\n"
@@ -7943,20 +8048,20 @@ msgstr ""
 "prikazani v obrazcu. Izbira 'privzeto' omogoÄ?i\n"
 "obiÄ?ajni prikaz"
 
-#: ../tools/browser/schema-browser/table-preferences.c:475
-#: ../tools/browser/schema-browser/table-preferences.c:486
+#: ../tools/browser/schema-browser/table-preferences.c:469
+#: ../tools/browser/schema-browser/table-preferences.c:480
 msgid "none"
 msgstr "brez"
 
-#: ../tools/browser/schema-browser/table-preferences.c:479
+#: ../tools/browser/schema-browser/table-preferences.c:473
 msgid "Options:"
 msgstr "Možnosti:"
 
-#: ../tools/browser/schema-browser/table-preferences.c:490
+#: ../tools/browser/schema-browser/table-preferences.c:484
 msgid "Preview:"
 msgstr "Predogled:"
 
-#: ../tools/browser/schema-browser/table-preferences.c:491
+#: ../tools/browser/schema-browser/table-preferences.c:485
 msgid ""
 "Free form to test the configured\n"
 "data entry"
@@ -7973,11 +8078,11 @@ msgstr "Zgodovina ni podprta"
 #: ../tools/command-exec.c:421
 #: ../tools/command-exec.c:463
 #: ../tools/command-exec.c:596
-#: ../tools/gda-sql.c:2990
-#: ../tools/gda-sql.c:4123
-#: ../tools/gda-sql.c:4213
-#: ../tools/gda-sql.c:4438
-#: ../tools/gda-sql.c:4539
+#: ../tools/gda-sql.c:2992
+#: ../tools/gda-sql.c:4125
+#: ../tools/gda-sql.c:4215
+#: ../tools/gda-sql.c:4440
+#: ../tools/gda-sql.c:4541
 msgid "No current connection"
 msgstr "Ni trenutne povezave"
 
@@ -8003,17 +8108,17 @@ msgid "Schema"
 msgstr "Shema"
 
 #: ../tools/command-exec.c:715
-#: ../tools/web-server.c:926
+#: ../tools/web-server.c:925
 msgid "Column"
 msgstr "Stolpec"
 
 #: ../tools/command-exec.c:717
-#: ../tools/web-server.c:928
+#: ../tools/web-server.c:927
 msgid "Nullable"
 msgstr "PoniÄ?eno"
 
 #: ../tools/command-exec.c:719
-#: ../tools/web-server.c:930
+#: ../tools/web-server.c:929
 msgid "Extra"
 msgstr "Dodatno"
 
@@ -8028,12 +8133,12 @@ msgid "List of columns for table '%s'"
 msgstr "Seznam stolpcev za preglednico '%s'"
 
 #: ../tools/command-exec.c:738
-#: ../tools/web-server.c:941
+#: ../tools/web-server.c:940
 msgid "yes"
 msgstr "da"
 
 #: ../tools/command-exec.c:738
-#: ../tools/web-server.c:941
+#: ../tools/web-server.c:940
 msgid "no"
 msgstr "brez"
 
@@ -8184,7 +8289,7 @@ msgid "Can't open file '%s' for reading: %s\n"
 msgstr "Ni mogoÄ?e odpreti datoteke '%s' za branje: %s\n"
 
 #: ../tools/gda-sql.c:1266
-#: ../tools/gda-sql.c:3230
+#: ../tools/gda-sql.c:3232
 #, c-format
 msgid "Connection name '%s' is invalid"
 msgstr "Ime povezave '%s' ni veljavno"
@@ -8227,14 +8332,14 @@ msgstr "Pridobivanje podrobnosti sheme podatkovne zbirke za povezavo '%s'; oprav
 
 #: ../tools/gda-sql.c:1479
 #: ../tools/gda-sql.c:1616
-#: ../tools/gda-sql.c:3046
+#: ../tools/gda-sql.c:3048
 #, c-format
 msgid "error: %s\n"
 msgstr "napaka: %s\n"
 
 #: ../tools/gda-sql.c:1486
 #: ../tools/gda-sql.c:1623
-#: ../tools/gda-sql.c:3053
+#: ../tools/gda-sql.c:3055
 #, c-format
 msgid "Done.\n"
 msgstr "KonÄ?ano.\n"
@@ -8249,532 +8354,532 @@ msgstr[2] "(%d vrstici)"
 msgstr[3] "(%d vrstice)"
 
 #: ../tools/gda-sql.c:1852
-#: ../tools/gda-sql.c:2870
+#: ../tools/gda-sql.c:2872
 msgid "Installed providers list"
 msgstr "Seznam nameÅ¡Ä?enih ponudnikov"
 
-#: ../tools/gda-sql.c:1995
-#: ../tools/gda-sql.c:2190
-#: ../tools/gda-sql.c:2262
-#: ../tools/gda-sql.c:2274
+#: ../tools/gda-sql.c:1997
+#: ../tools/gda-sql.c:2192
+#: ../tools/gda-sql.c:2264
+#: ../tools/gda-sql.c:2276
 #, c-format
 msgid "%s [FILE]"
 msgstr "%s [DATOTEKA]"
 
-#: ../tools/gda-sql.c:1996
+#: ../tools/gda-sql.c:1998
 msgid "Show commands history, or save it to file"
 msgstr "Pokaži zgodovino ukazov, ali pa jo shrani v datoteko"
 
-#: ../tools/gda-sql.c:2006
-#: ../tools/gda-sql.c:2018
-#: ../tools/gda-sql.c:2030
-#: ../tools/gda-sql.c:2042
-#: ../tools/gda-sql.c:2054
-#: ../tools/gda-sql.c:2066
-#: ../tools/gda-sql.c:2079
+#: ../tools/gda-sql.c:2008
+#: ../tools/gda-sql.c:2020
+#: ../tools/gda-sql.c:2032
+#: ../tools/gda-sql.c:2044
+#: ../tools/gda-sql.c:2056
+#: ../tools/gda-sql.c:2068
+#: ../tools/gda-sql.c:2081
 msgid "Information"
 msgstr "Podatki"
 
-#: ../tools/gda-sql.c:2007
+#: ../tools/gda-sql.c:2009
 #, c-format
 msgid "%s [META DATA TYPE]"
 msgstr "%s [METAPODATKOVNA VRSTA]"
 
-#: ../tools/gda-sql.c:2008
+#: ../tools/gda-sql.c:2010
 msgid "Force reading the database meta data (or part of the meta data, ex:\"tables\")"
 msgstr "Vsili branje metapodatkov podatkovne zbirke (ali njihov del, npr:\"tables\")"
 
-#: ../tools/gda-sql.c:2019
+#: ../tools/gda-sql.c:2021
 #, c-format
 msgid "%s [TABLE]"
 msgstr "%s [preglednica]"
 
-#: ../tools/gda-sql.c:2020
+#: ../tools/gda-sql.c:2022
 msgid "List all tables (or named table)"
 msgstr "Izpiši vse preglednice (ali imena preglednic)"
 
-#: ../tools/gda-sql.c:2031
+#: ../tools/gda-sql.c:2033
 #, c-format
 msgid "%s [VIEW]"
 msgstr "%s [pogled]"
 
-#: ../tools/gda-sql.c:2032
+#: ../tools/gda-sql.c:2034
 msgid "List all views (or named view)"
 msgstr "Izpiši vse poglede (ali imena pogledov)"
 
-#: ../tools/gda-sql.c:2043
+#: ../tools/gda-sql.c:2045
 #, c-format
 msgid "%s [SCHEMA]"
 msgstr "%s [shema]"
 
-#: ../tools/gda-sql.c:2044
+#: ../tools/gda-sql.c:2046
 msgid "List all schemas (or named schema)"
 msgstr "Izpiši vse sheme (ali imena shem)"
 
-#: ../tools/gda-sql.c:2055
+#: ../tools/gda-sql.c:2057
 #, c-format
 msgid "%s [OBJ_NAME|SCHEMA.*]"
 msgstr "%s [IME_PREDMETA|SHEMA.*]"
 
-#: ../tools/gda-sql.c:2056
+#: ../tools/gda-sql.c:2058
 msgid "Describe object or full list of objects"
 msgstr "Opiši predmet ali seznam predmetov"
 
-#: ../tools/gda-sql.c:2067
+#: ../tools/gda-sql.c:2069
 #, c-format
 msgid "%s [TABLE1 [TABLE2...]]"
 msgstr "%s [preglednica1 [preglednica2...]]"
 
-#: ../tools/gda-sql.c:2068
+#: ../tools/gda-sql.c:2070
 msgid "Create a graph of all or the listed tables"
 msgstr "Ustvari graf vseh prikazanih preglednic"
 
-#: ../tools/gda-sql.c:2080
+#: ../tools/gda-sql.c:2082
 #, c-format
 msgid "%s [port [authentication token]]"
 msgstr "%s [vrata [žeton overitve]]"
 
-#: ../tools/gda-sql.c:2081
+#: ../tools/gda-sql.c:2083
 msgid "Start/stop embedded HTTP server (on given port or on 12345 by default)"
 msgstr "Zaženi/zaustavi vstavljen HTTP strežnik (na podanih vratih ali pa na 12345 privzeto)"
 
-#: ../tools/gda-sql.c:2094
+#: ../tools/gda-sql.c:2096
 #, c-format
 msgid "%s [CNC_NAME [DSN|CONNECTION STRING]]"
 msgstr "%s [CNC_IME [DSN|NIZ POVEZAVE]]]]"
 
-#: ../tools/gda-sql.c:2095
+#: ../tools/gda-sql.c:2097
 msgid "Opens a new connection or lists opened connections"
 msgstr "Odpre novo povezavo ali pa seznam odprtih povezav"
 
-#: ../tools/gda-sql.c:2106
+#: ../tools/gda-sql.c:2108
 #, c-format
 msgid "%s [CNC_NAME]"
 msgstr "%s [CNC_IME]"
 
-#: ../tools/gda-sql.c:2107
+#: ../tools/gda-sql.c:2109
 msgid "Close a connection"
 msgstr "Zapri povezavo"
 
-#: ../tools/gda-sql.c:2118
+#: ../tools/gda-sql.c:2120
 #, c-format
 msgid "%s CNC_NAME CNC_NAME1 CNC_NAME2 [CNC_NAME ...]"
 msgstr "%s CNC_IME CNC_IME1 CNC_IME2 [CNC_IME ...]"
 
-#: ../tools/gda-sql.c:2119
+#: ../tools/gda-sql.c:2121
 msgid "Bind several connections together into the CNC_NAME virtual connection"
 msgstr "Poveži veÄ? povezav skupaj v navidezno CNC_IME povezavo"
 
-#: ../tools/gda-sql.c:2129
-#: ../tools/gda-sql.c:2141
-#: ../tools/gda-sql.c:2153
-#: ../tools/gda-sql.c:2165
+#: ../tools/gda-sql.c:2131
+#: ../tools/gda-sql.c:2143
+#: ../tools/gda-sql.c:2155
+#: ../tools/gda-sql.c:2167
 msgid "DSN (data sources) management"
 msgstr "DSN (podatkovni viri) upravljanje"
 
-#: ../tools/gda-sql.c:2130
+#: ../tools/gda-sql.c:2132
 #, c-format
 msgid "%s [DSN]"
 msgstr "%s [DSN]"
 
-#: ../tools/gda-sql.c:2131
+#: ../tools/gda-sql.c:2133
 msgid "List all DSN (or named DSN's attributes)"
 msgstr "izpis vseh DSN (ali imenovanih atributov DSN)"
 
-#: ../tools/gda-sql.c:2142
+#: ../tools/gda-sql.c:2144
 #, c-format
 msgid "%s DSN_NAME DSN_DEFINITION [DESCRIPTION]"
 msgstr "%s DSN_IME DSN_DOLOÄ?ILO [OPIS]"
 
-#: ../tools/gda-sql.c:2143
+#: ../tools/gda-sql.c:2145
 msgid "Create (or modify) a DSN"
 msgstr "Ustvarjanje (spreminjanje) DSN"
 
-#: ../tools/gda-sql.c:2154
+#: ../tools/gda-sql.c:2156
 #, c-format
 msgid "%s DSN_NAME [DSN_NAME...]"
 msgstr "%s DSN_IME [DSN_IME...]"
 
-#: ../tools/gda-sql.c:2155
+#: ../tools/gda-sql.c:2157
 msgid "Remove a DSN"
 msgstr "Odstrani DSN"
 
-#: ../tools/gda-sql.c:2166
+#: ../tools/gda-sql.c:2168
 #, c-format
 msgid "%s [PROVIDER]"
 msgstr "%s [ponudnik]"
 
-#: ../tools/gda-sql.c:2167
+#: ../tools/gda-sql.c:2169
 msgid "List all installed database providers (or named one's attributes)"
 msgstr "IzpiÅ¡i vse nameÅ¡Ä?ene ponudnike podatkovnih zbirk (ali poimenovane atribute)"
 
-#: ../tools/gda-sql.c:2177
-#: ../tools/gda-sql.c:2189
-#: ../tools/gda-sql.c:2201
-#: ../tools/gda-sql.c:2213
+#: ../tools/gda-sql.c:2179
+#: ../tools/gda-sql.c:2191
+#: ../tools/gda-sql.c:2203
+#: ../tools/gda-sql.c:2215
 msgid "Input/Output"
 msgstr "Vhod/izhod"
 
-#: ../tools/gda-sql.c:2178
-#: ../tools/gda-sql.c:2310
+#: ../tools/gda-sql.c:2180
+#: ../tools/gda-sql.c:2312
 #, c-format
 msgid "%s FILE"
 msgstr "%s datoteka"
 
-#: ../tools/gda-sql.c:2179
+#: ../tools/gda-sql.c:2181
 msgid "Execute commands from file"
 msgstr "Izvedba ukazov iz datoteke"
 
-#: ../tools/gda-sql.c:2191
+#: ../tools/gda-sql.c:2193
 msgid "Send output to a file or |pipe"
 msgstr "Pošlji izpis v datoteko ali |cev"
 
-#: ../tools/gda-sql.c:2202
-#: ../tools/gda-sql.c:2214
+#: ../tools/gda-sql.c:2204
+#: ../tools/gda-sql.c:2216
 #, c-format
 msgid "%s [TEXT]"
 msgstr "%s [BESEDILO]"
 
-#: ../tools/gda-sql.c:2203
+#: ../tools/gda-sql.c:2205
 msgid "Send output to stdout"
 msgstr "Pošlji izpis na stdout"
 
-#: ../tools/gda-sql.c:2215
+#: ../tools/gda-sql.c:2217
 msgid "Send output to output stream"
 msgstr "Pošlji izpis na odvodni pretok"
 
-#: ../tools/gda-sql.c:2227
+#: ../tools/gda-sql.c:2229
 msgid "Quit"
 msgstr "KonÄ?aj"
 
-#: ../tools/gda-sql.c:2238
+#: ../tools/gda-sql.c:2240
 #, c-format
 msgid "%s [DIR]"
 msgstr "%s [MAPA]"
 
-#: ../tools/gda-sql.c:2239
+#: ../tools/gda-sql.c:2241
 msgid "Change the current working directory"
 msgstr "Spremeni trenutno delovno mapo"
 
-#: ../tools/gda-sql.c:2251
+#: ../tools/gda-sql.c:2253
 msgid "Show usage and distribution terms"
 msgstr "Pokaži pogoje uporabo in razširjanja"
 
-#: ../tools/gda-sql.c:2261
-#: ../tools/gda-sql.c:2273
-#: ../tools/gda-sql.c:2285
-#: ../tools/gda-sql.c:2297
-#: ../tools/gda-sql.c:2309
-#: ../tools/gda-sql.c:2321
-#: ../tools/gda-sql.c:2333
-#: ../tools/gda-sql.c:2345
-#: ../tools/gda-sql.c:2357
-#: ../tools/gda-sql.c:2369
-#: ../tools/gda-sql.c:2381
-#: ../tools/gda-sql.c:2418
-#: ../tools/gda-sql.c:2430
+#: ../tools/gda-sql.c:2263
+#: ../tools/gda-sql.c:2275
+#: ../tools/gda-sql.c:2287
+#: ../tools/gda-sql.c:2299
+#: ../tools/gda-sql.c:2311
+#: ../tools/gda-sql.c:2323
+#: ../tools/gda-sql.c:2335
+#: ../tools/gda-sql.c:2347
+#: ../tools/gda-sql.c:2359
+#: ../tools/gda-sql.c:2371
+#: ../tools/gda-sql.c:2383
+#: ../tools/gda-sql.c:2420
+#: ../tools/gda-sql.c:2432
 msgid "Query buffer"
 msgstr "Medpomnilnik poizvedbe"
 
-#: ../tools/gda-sql.c:2263
+#: ../tools/gda-sql.c:2265
 msgid "Edit the query buffer (or file) with external editor"
 msgstr "Uredi medpomnilnik poizvedbe (ali datoteko) z zunanjim urejevalnikom"
 
-#: ../tools/gda-sql.c:2275
+#: ../tools/gda-sql.c:2277
 msgid "Reset the query buffer (fill buffer with contents of file)"
 msgstr "PoÄ?isti medpomnilnik poizvedbe (zapolni medpomnilnik z vsebino datoteke)"
 
-#: ../tools/gda-sql.c:2287
+#: ../tools/gda-sql.c:2289
 msgid "Show the contents of the query buffer"
 msgstr "Pokaži vsebino medpomnilnika poizvedbe"
 
-#: ../tools/gda-sql.c:2298
+#: ../tools/gda-sql.c:2300
 #, c-format
 msgid "%s [QUERY_BUFFER_NAME]"
 msgstr "%s [IME_MEDPOMNILNIKA_POIZVEDBE]"
 
-#: ../tools/gda-sql.c:2299
+#: ../tools/gda-sql.c:2301
 msgid "Execute contents of query buffer, or named query buffer"
 msgstr "Izvedi vsebino medpomnilnika poizvedbe, oziroma imenovan medpomnilnik"
 
-#: ../tools/gda-sql.c:2311
+#: ../tools/gda-sql.c:2313
 msgid "Write query buffer to file"
 msgstr "Zapiši medpomnilnik poizvedbe v datoteko"
 
-#: ../tools/gda-sql.c:2322
-#: ../tools/gda-sql.c:2334
-#: ../tools/gda-sql.c:2346
+#: ../tools/gda-sql.c:2324
+#: ../tools/gda-sql.c:2336
+#: ../tools/gda-sql.c:2348
 #, c-format
 msgid "%s QUERY_BUFFER_NAME"
 msgstr "%s IME_MEDPOMNILNIKA_POIZVEDBE"
 
-#: ../tools/gda-sql.c:2323
+#: ../tools/gda-sql.c:2325
 msgid "Save query buffer to dictionary"
 msgstr "Shrani medpomnilnik poizvedbe v slovar"
 
-#: ../tools/gda-sql.c:2335
+#: ../tools/gda-sql.c:2337
 msgid "Load query buffer from dictionary"
 msgstr "Naloži medpomnilnik poizvedbe iz slovarja"
 
-#: ../tools/gda-sql.c:2347
+#: ../tools/gda-sql.c:2349
 msgid "Delete query buffer from dictionary"
 msgstr "Izbriši medpomnilnik poizvedbe iz slovarja"
 
-#: ../tools/gda-sql.c:2358
+#: ../tools/gda-sql.c:2360
 #, c-format
 msgid "%s"
 msgstr "%s"
 
-#: ../tools/gda-sql.c:2359
+#: ../tools/gda-sql.c:2361
 msgid "List all saved query buffers in dictionary"
 msgstr "Izpiši vse shranjene medpomnilnike v slovar"
 
-#: ../tools/gda-sql.c:2370
+#: ../tools/gda-sql.c:2372
 #, c-format
 msgid "%s [NAME [VALUE|_null_]]"
 msgstr "%s [IME [VREDNOST|_null_]]"
 
-#: ../tools/gda-sql.c:2371
+#: ../tools/gda-sql.c:2373
 msgid "Set or show internal parameter, or list all if no parameters"
 msgstr "DoloÄ?i ali prikaži notranje parametre, oziroma seznam vseh, Ä?e parameter ni doloÄ?en"
 
-#: ../tools/gda-sql.c:2382
+#: ../tools/gda-sql.c:2384
 #, c-format
 msgid "%s [NAME]"
 msgstr "%s [IME]"
 
-#: ../tools/gda-sql.c:2383
+#: ../tools/gda-sql.c:2385
 msgid "Unset (delete) internal named parameter (or all parameters)"
 msgstr "Odstrani nastavitev (izbriši) notranje imenovanega parametra (ali vseh parametrov)"
 
-#: ../tools/gda-sql.c:2393
+#: ../tools/gda-sql.c:2395
 msgid "Formatting"
 msgstr "Formatiranje ..."
 
-#: ../tools/gda-sql.c:2395
+#: ../tools/gda-sql.c:2397
 msgid "Set output format"
 msgstr "DoloÄ?itev zapisa odvoda"
 
-#: ../tools/gda-sql.c:2419
+#: ../tools/gda-sql.c:2421
 #, c-format
 msgid "%s [NAME|TABLE COLUMN ROW_CONDITION] FILE"
 msgstr "%s [IME|PREGLEDNICA STOLPEC POGOJI_VRSTICE] DATOTEKA"
 
-#: ../tools/gda-sql.c:2420
+#: ../tools/gda-sql.c:2422
 msgid "Export internal parameter or table's value to the FILE file"
 msgstr "Izvozi zunanji parameter ali vrednost preglednice v datoteko DATOTEKA"
 
-#: ../tools/gda-sql.c:2431
+#: ../tools/gda-sql.c:2433
 #, c-format
 msgid "%s NAME [FILE|TABLE COLUMN ROW_CONDITION]"
 msgstr "%s IME [DATOTEKA|PREGLEDNICA STOLPEC POGOJI_VRSTICE]"
 
-#: ../tools/gda-sql.c:2432
+#: ../tools/gda-sql.c:2434
 msgid "Set internal parameter as the contents of the FILE file or from an existing table's value"
 msgstr "DoloÄ?itev notranjega parametra kot vsebine datoteke DATOTEKA ali iz obstojeÄ?e vrednosti preglednice"
 
-#: ../tools/gda-sql.c:2445
+#: ../tools/gda-sql.c:2447
 msgid "List all available commands"
 msgstr "Izpis vseh ukazov na voljo"
 
-#: ../tools/gda-sql.c:2510
+#: ../tools/gda-sql.c:2512
 #, c-format
 msgid "Unknown output format: '%s', reset to default"
 msgstr "Neznan odvodni zapis: '%s', uporabljena bo privzeta vrednost"
 
-#: ../tools/gda-sql.c:2655
-#: ../tools/gda-sql.c:2830
+#: ../tools/gda-sql.c:2657
+#: ../tools/gda-sql.c:2832
 msgid "Attribute"
 msgstr "Atribut"
 
-#: ../tools/gda-sql.c:2658
+#: ../tools/gda-sql.c:2660
 #, c-format
 msgid "DSN '%s' description"
 msgstr "Opis DSN '%s'"
 
-#: ../tools/gda-sql.c:2686
+#: ../tools/gda-sql.c:2688
 #, c-format
 msgid "Could not find any DSN named '%s'"
 msgstr "Ni mogoÄ?e najti DSN z imenom '%s'"
 
-#: ../tools/gda-sql.c:2697
+#: ../tools/gda-sql.c:2699
 msgid "DSN list"
 msgstr "DSN seznam"
 
-#: ../tools/gda-sql.c:2749
-#: ../tools/gda-sql.c:4562
+#: ../tools/gda-sql.c:2751
+#: ../tools/gda-sql.c:4564
 msgid "Missing arguments"
 msgstr "Manjkajo argumenti"
 
-#: ../tools/gda-sql.c:2770
+#: ../tools/gda-sql.c:2772
 msgid "Missing provider name"
 msgstr "Manjka ime ponudnika"
 
-#: ../tools/gda-sql.c:2793
+#: ../tools/gda-sql.c:2795
 msgid "Missing DSN name"
 msgstr "Manjka ime DSN"
 
-#: ../tools/gda-sql.c:2833
+#: ../tools/gda-sql.c:2835
 #, c-format
 msgid "Provider '%s' description"
 msgstr "Opis ponudnika '%s'"
 
-#: ../tools/gda-sql.c:2861
+#: ../tools/gda-sql.c:2863
 #, c-format
 msgid "Could not find any provider named '%s'"
 msgstr "Ni mogoÄ?e najti ponudnika z imenom '%s'"
 
-#: ../tools/gda-sql.c:2936
-#: ../tools/gda-sql.c:3225
+#: ../tools/gda-sql.c:2938
+#: ../tools/gda-sql.c:3227
 #, c-format
 msgid "A connection named '%s' already exists"
 msgstr "Povezava z imenom '%s' že obstaja"
 
-#: ../tools/gda-sql.c:3040
+#: ../tools/gda-sql.c:3042
 #, c-format
 msgid "Getting database schema information, this may take some time... "
 msgstr "Pridobivanje podrobnosti sheme podatkovne zbirke, opravilo je lahko dolgotrajno ..."
 
-#: ../tools/gda-sql.c:3075
+#: ../tools/gda-sql.c:3077
 msgid "No opened connection"
 msgstr "Ni odprtih omrežnih povezav"
 
-#: ../tools/gda-sql.c:3086
+#: ../tools/gda-sql.c:3088
 msgid "DSN or connection string"
 msgstr "DSN ali niz povezave"
 
-#: ../tools/gda-sql.c:3177
+#: ../tools/gda-sql.c:3179
 msgid "No connection currently opened"
 msgstr "Trenutno ni odprtih povezav"
 
-#: ../tools/gda-sql.c:3217
+#: ../tools/gda-sql.c:3219
 msgid "Missing required connection names"
 msgstr "Manjka zahtevano ime povezave"
 
 #. add existing connections to virtual connection
-#: ../tools/gda-sql.c:3254
+#: ../tools/gda-sql.c:3256
 msgid "Bound connections are as:"
 msgstr "Poveži povezave kot:"
 
-#: ../tools/gda-sql.c:3357
+#: ../tools/gda-sql.c:3359
 #, c-format
 msgid "Could not get home directory: %s"
 msgstr "Ni mogoÄ?e pridobiti domaÄ?e mape: %s"
 
-#: ../tools/gda-sql.c:3383
+#: ../tools/gda-sql.c:3385
 #, c-format
 msgid "Working directory is now: %s"
 msgstr "Delovna mapa je sedaj: %s"
 
-#: ../tools/gda-sql.c:3387
+#: ../tools/gda-sql.c:3389
 #, c-format
 msgid "Could not change working directory to '%s': %s"
 msgstr "Ni mogoÄ?e spremeniti delovne mape v %s: %s"
 
-#: ../tools/gda-sql.c:3414
-#: ../tools/gda-sql.c:3517
-#: ../tools/gda-sql.c:3560
-#: ../tools/gda-sql.c:3589
-#: ../tools/gda-sql.c:3630
-#: ../tools/gda-sql.c:3681
-#: ../tools/gda-sql.c:3734
-#: ../tools/gda-sql.c:3825
-#: ../tools/gda-sql.c:3897
+#: ../tools/gda-sql.c:3416
+#: ../tools/gda-sql.c:3519
+#: ../tools/gda-sql.c:3562
+#: ../tools/gda-sql.c:3591
+#: ../tools/gda-sql.c:3632
+#: ../tools/gda-sql.c:3683
+#: ../tools/gda-sql.c:3736
+#: ../tools/gda-sql.c:3827
+#: ../tools/gda-sql.c:3899
 msgid "No connection opened"
 msgstr "Ni odprtih povezav"
 
-#: ../tools/gda-sql.c:3432
+#: ../tools/gda-sql.c:3434
 #, c-format
 msgid "Could not write to temporary file '%s': %s"
 msgstr "Ni mogoÄ?e pisati v zaÄ?asno datoteko '%s': %s"
 
-#: ../tools/gda-sql.c:3468
+#: ../tools/gda-sql.c:3470
 #, c-format
 msgid "could not start editor '%s'"
 msgstr "Ni mogoÄ?e zaÄ?eti urejevalnika '%s'"
 
-#: ../tools/gda-sql.c:3473
+#: ../tools/gda-sql.c:3475
 #, c-format
 msgid "Could not start /bin/sh"
 msgstr "Ni mogoÄ?e zaÄ?eti /bin/sh"
 
-#: ../tools/gda-sql.c:3638
+#: ../tools/gda-sql.c:3640
 msgid "Missing FILE to write to"
 msgstr "Manjka datoteka za pisanje"
 
-#: ../tools/gda-sql.c:3690
-#: ../tools/gda-sql.c:3756
-#: ../tools/gda-sql.c:3838
-#: ../tools/gda-sql.c:3910
+#: ../tools/gda-sql.c:3692
+#: ../tools/gda-sql.c:3758
+#: ../tools/gda-sql.c:3840
+#: ../tools/gda-sql.c:3912
 msgid "Can't initialize dictionary to store query buffers"
 msgstr "Ni mogoÄ?e zaÄ?eti slovarja za shranjevanje medpomnilnikov poizvedb"
 
-#: ../tools/gda-sql.c:3709
+#: ../tools/gda-sql.c:3711
 msgid "Query buffer name"
 msgstr "Ime medpomnilnika poizvedbe"
 
-#: ../tools/gda-sql.c:3710
+#: ../tools/gda-sql.c:3712
 msgid "SQL"
 msgstr "SQL"
 
-#: ../tools/gda-sql.c:3747
-#: ../tools/gda-sql.c:3876
-#: ../tools/gda-sql.c:3937
+#: ../tools/gda-sql.c:3749
+#: ../tools/gda-sql.c:3878
+#: ../tools/gda-sql.c:3939
 msgid "Missing query buffer name"
 msgstr "Manjka ime medpomnilnika poizvedbe"
 
-#: ../tools/gda-sql.c:3804
+#: ../tools/gda-sql.c:3806
 msgid "Query buffer is empty"
 msgstr "Medpomnilnik poizvedbe je prazen"
 
-#: ../tools/gda-sql.c:3871
+#: ../tools/gda-sql.c:3873
 #, c-format
 msgid "Could not find query buffer named '%s'"
 msgstr "Ni mogoÄ?e najti medpomnilnika '%s'"
 
-#: ../tools/gda-sql.c:4001
-#: ../tools/gda-sql.c:4251
-#: ../tools/gda-sql.c:4329
+#: ../tools/gda-sql.c:4003
+#: ../tools/gda-sql.c:4253
+#: ../tools/gda-sql.c:4331
 #, c-format
 msgid "No parameter named '%s' defined"
 msgstr "Ni doloÄ?enega parametra z imenom '%s'"
 
-#: ../tools/gda-sql.c:4012
+#: ../tools/gda-sql.c:4014
 msgid "List of defined parameters"
 msgstr "Seznam doloÄ?enih parametrov"
 
-#: ../tools/gda-sql.c:4068
-#: ../tools/gda-sql.c:4590
+#: ../tools/gda-sql.c:4070
+#: ../tools/gda-sql.c:4592
 msgid "Wrong row condition"
 msgstr "NapaÄ?en pogoj vrstice"
 
-#: ../tools/gda-sql.c:4096
+#: ../tools/gda-sql.c:4098
 msgid "No unique row identified"
 msgstr "Ni doloÄ?ene enoznaÄ?ne vrstice"
 
-#: ../tools/gda-sql.c:4137
-#: ../tools/gda-sql.c:4229
-#: ../tools/gda-sql.c:4553
+#: ../tools/gda-sql.c:4139
+#: ../tools/gda-sql.c:4231
+#: ../tools/gda-sql.c:4555
 #, c-format
 msgid "Too many arguments"
 msgstr "PreveÄ? argumentov"
 
-#: ../tools/gda-sql.c:4185
-#: ../tools/gda-sql.c:4257
+#: ../tools/gda-sql.c:4187
+#: ../tools/gda-sql.c:4259
 msgid "Wrong number of arguments"
 msgstr "NapaÄ?no Å¡tevilo argumentov"
 
-#: ../tools/gda-sql.c:4269
-#: ../tools/gda-sql.c:4283
+#: ../tools/gda-sql.c:4271
+#: ../tools/gda-sql.c:4285
 msgid "Could not write file"
 msgstr "Ni mogoÄ?e zapisati datoteke"
 
-#: ../tools/gda-sql.c:4408
+#: ../tools/gda-sql.c:4410
 #, c-format
 msgid "Graph written to '%s'\n"
 msgstr "Graf je zapisan v '%s'\n"
 
-#: ../tools/gda-sql.c:4411
+#: ../tools/gda-sql.c:4413
 #, c-format
 msgid ""
 "Graph written to '%s'\n"
@@ -8787,23 +8892,23 @@ msgstr ""
 "\tdot -Tpng -o graf.png %s\n"
 "Opomba: doloÄ?ite okoljski spremenljivki GDA_SQL_VIEWER_PNG ali GDA_SQL_VIEWER_PDF za predogled slike grafa\n"
 
-#: ../tools/gda-sql.c:4482
+#: ../tools/gda-sql.c:4484
 msgid "HTTPD server stopped"
 msgstr "Strežnik HTTPD je zaustavljen"
 
-#: ../tools/gda-sql.c:4501
+#: ../tools/gda-sql.c:4503
 msgid "Could not start HTTPD server"
 msgstr "Ni mogoÄ?e zaÄ?eti strežnika HTTPD"
 
-#: ../tools/gda-sql.c:4505
+#: ../tools/gda-sql.c:4507
 msgid "HTTPD server started"
 msgstr "Strežnik HTTPD je zagnan"
 
-#: ../tools/gda-sql.c:4510
+#: ../tools/gda-sql.c:4512
 msgid "Invalid port specification"
 msgstr "Neveljavna doloÄ?ilo vrat"
 
-#: ../tools/gda-sql.c:4724
+#: ../tools/gda-sql.c:4726
 #, c-format
 msgid "Command is incomplete"
 msgstr "Ukaz ni popoln"
@@ -8821,139 +8926,172 @@ msgstr "Konzola"
 msgid "Could not save history file to '%s': %s"
 msgstr "Ni mogoÄ?e shraniti datoteke zgodovine v '%s': %s"
 
+#: ../tools/web-server.c:566
 #: ../tools/web-server.c:567
-#: ../tools/web-server.c:568
 msgid "Authentication required"
 msgstr "Zahtevana je overitev"
 
-#: ../tools/web-server.c:632
+#: ../tools/web-server.c:631
 msgid "Token:"
 msgstr "Žeton:"
 
-#: ../tools/web-server.c:773
+#: ../tools/web-server.c:772
 msgid "SQL console:"
 msgstr "Konzola SQL:"
 
-#: ../tools/web-server.c:853
-#: ../tools/web-server.c:1873
+#: ../tools/web-server.c:852
+#: ../tools/web-server.c:1872
 msgid "Tables"
 msgstr "Preglednice"
 
-#: ../tools/web-server.c:853
+#: ../tools/web-server.c:852
 #, c-format
 msgid "Tables in the '%s' schema"
 msgstr "Preglednice v shemi '%s'"
 
-#: ../tools/web-server.c:859
-#: ../tools/web-server.c:1878
+#: ../tools/web-server.c:858
+#: ../tools/web-server.c:1877
 msgid "Views"
 msgstr "Pogledi"
 
-#: ../tools/web-server.c:859
+#: ../tools/web-server.c:858
 #, c-format
 msgid "Views in the '%s' schema"
 msgstr "Pogledi v shemi '%s':"
 
-#: ../tools/web-server.c:918
+#: ../tools/web-server.c:917
 #, c-format
 msgid "Columns for the '%s' table:"
 msgstr "Stolpci preglednice '%s':"
 
-#: ../tools/web-server.c:964
+#: ../tools/web-server.c:963
 msgid "Primary key:"
 msgstr "Osnovni kljuÄ?:"
 
-#: ../tools/web-server.c:1069
+#: ../tools/web-server.c:1068
 msgid "Relations:"
 msgstr "Povezave:"
 
-#: ../tools/web-server.c:1086
+#: ../tools/web-server.c:1085
 msgid "Foreign keys:"
 msgstr "Tuji kljuÄ?:"
 
-#: ../tools/web-server.c:1098
+#: ../tools/web-server.c:1097
 #, c-format
 msgid "To '%s':"
 msgstr "Za '%s':"
 
-#: ../tools/web-server.c:1272
+#: ../tools/web-server.c:1271
 msgid "View definition:"
 msgstr "Pogled doloÄ?ila:"
 
-#: ../tools/web-server.c:1347
+#: ../tools/web-server.c:1346
 #, c-format
 msgid "Trigger '%s' for the '%s.%s' table:"
 msgstr "Sprožilnik '%s' za '%s.%s' preglednico:"
 
-#: ../tools/web-server.c:1367
+#: ../tools/web-server.c:1366
 #, c-format
 msgid "Trigger fired for: %s"
 msgstr "Sprožilnik je sprožen za: %s"
 
-#: ../tools/web-server.c:1371
+#: ../tools/web-server.c:1370
 #, c-format
 msgid "Time at which the trigger is fired: %s"
 msgstr "Ä?as ob katerem se sprožilnik sproži: %s"
 
-#: ../tools/web-server.c:1375
+#: ../tools/web-server.c:1374
 msgid "Action:"
 msgstr "Dejanje:"
 
-#: ../tools/web-server.c:1605
+#: ../tools/web-server.c:1604
 msgid "Triggers:"
 msgstr "Sprožilniki:"
 
-#: ../tools/web-server.c:1637
-#: ../tools/web-server.c:1731
+#: ../tools/web-server.c:1636
+#: ../tools/web-server.c:1730
 #, c-format
 msgid "For the '%s.%s' table:"
 msgstr "Za '%s.%s' preglednico:"
 
-#: ../tools/web-server.c:1703
+#: ../tools/web-server.c:1702
 #, c-format
 msgid "Triggers in the '%s' schema:"
 msgstr "Sprožilci v shemi '%s':"
 
-#: ../tools/web-server.c:1857
+#: ../tools/web-server.c:1856
 #, c-format
 msgid "Database information for '%s'"
 msgstr "Podrobnosti podatkovne zbirke %s"
 
-#: ../tools/web-server.c:1862
+#: ../tools/web-server.c:1861
 msgid "Database information"
 msgstr "Podrobnosti podatkovne zbirke"
 
-#: ../tools/web-server.c:1871
+#: ../tools/web-server.c:1870
 msgid "Objects"
 msgstr "Predmeti"
 
-#: ../tools/web-server.c:1883
+#: ../tools/web-server.c:1882
 msgid "Triggers"
 msgstr "Sprožilniki"
 
+#~ msgid "Add data source"
+#~ msgstr "Dodaj podatkovni vir"
+#~ msgid "Cgrid data handler"
+#~ msgstr "Podatkovni upravljalnik Cgrid"
+#~ msgid "The cgrid data handler"
+#~ msgstr "Podatkovni upravljalnik Cgrid"
+#~ msgid "Cgrid gtype"
+#~ msgstr "Cgrid gtype"
+#~ msgid "The cgrid gtype"
+#~ msgstr "Vrsta grid gtype"
+#~ msgid "Cgrid options"
+#~ msgstr "Možnosti Cgrid"
+#~ msgid "The cgrid options"
+#~ msgstr "možnosti cgrid"
+#~ msgid "Cgrid is editable"
+#~ msgstr "Cgrid je mogoÄ?e urejati"
+#~ msgid "Cgrid editable"
+#~ msgstr "Uredljiv Cgrid"
+#~ msgid "Cgrid is to be deleted"
+#~ msgstr "Cgrid bo izbrisan"
+#~ msgid "Cgrid to be deleted"
+#~ msgstr "Cgrid pripravljen za brisanje"
+#~ msgid "Cgrid value"
+#~ msgstr "Vrednost Cgrid"
+#~ msgid "Cgrid value attributes"
+#~ msgstr "Atributi vrednosti Cgrid"
+#~ msgid "Cgrid text column"
+#~ msgstr "Cgrid stolpec besedila"
+#~ msgid "A column in the data source model to get the string from."
+#~ msgstr "Stolpec podatkovnega vira, iz katerega naj bodo pridobljeni nizi"
+#~ msgid "Cgrid grid height"
+#~ msgstr "Višina Cgrid mreže"
+#~ msgid "Cgrid height's."
+#~ msgstr "Cgrid višina"
+#~ msgid "Cgrid has its headers visible"
+#~ msgstr "Cgrid ima glave vidne"
+#~ msgid "Cgrid headers visible"
+#~ msgstr "Vidne glave Cgrid"
+#~ msgid "Unsaved diagram"
+#~ msgstr "Neshranjen diagram"
 #~ msgid "_Favorite"
 #~ msgstr "_Priljubljeno"
-
 #~ msgid "XML syntax help"
 #~ msgstr "PomoÄ? za XML skladnjo"
-
 #~ msgid "_Begin"
 #~ msgstr "_ZaÄ?ni"
-
 #~ msgid "_Commit"
 #~ msgstr "_Uveljavi"
-
 #~ msgid "_Rollback"
 #~ msgstr "_Povrni"
-
 #~ msgid "Group:"
 #~ msgstr "Skupina:"
-
 #~ msgid "'%s' Document not parsed successfully\n"
 #~ msgstr "'%s' dokumenta ni mogoÄ?e uspeÅ¡no razÄ?leniti\n"
-
 #~ msgid "Options (connection sharing)"
 #~ msgstr "Možnosti (souporaba povezave)"
-
 #~ msgid "Tables:"
 #~ msgstr "Preglednice:"
+
diff --git a/providers/mysql/gda-mysql-recordset.c b/providers/mysql/gda-mysql-recordset.c
index 48bd3fb..6fbc04d 100644
--- a/providers/mysql/gda-mysql-recordset.c
+++ b/providers/mysql/gda-mysql-recordset.c
@@ -907,27 +907,6 @@ gda_mysql_recordset_fetch_random (GdaDataSelect  *model,
 }
 
 /*
- * Create and "give" filled #GdaRow object for all the rows in the model
- */
-static gboolean
-gda_mysql_recordset_store_all (GdaDataSelect  *model,
-			       GError        **error)
-{
-	GdaMysqlRecordset *imodel;
-	gint i;
-
-	imodel = GDA_MYSQL_RECORDSET (model);
-
-	/* default implementation */
-	for (i = 0; i < model->advertized_nrows; i++) {
-		GdaRow *row;
-		if (! gda_mysql_recordset_fetch_random (model, &row, i, error))
-			return FALSE;
-	}
-	return TRUE;
-}
-
-/*
  * Create a new filled #GdaRow object for the next cursor row, and put it into *row.
  *
  * WARNING: @row will NOT be NULL, but *row may or may not be NULL:
diff --git a/providers/postgres/gda-postgres-provider.c b/providers/postgres/gda-postgres-provider.c
index 35c1c30..019342a 100644
--- a/providers/postgres/gda-postgres-provider.c
+++ b/providers/postgres/gda-postgres-provider.c
@@ -353,39 +353,6 @@ gda_postgres_provider_get_version (GdaServerProvider *provider)
 	return PACKAGE_VERSION;
 }
 
-/* get the float version of a Postgres version which looks like:
- * PostgreSQL 7.2.2 on i686-pc-linux-gnu, compiled by GCC 2.96 => returns 7.22
- * PostgreSQL 7.3 on i686-pc-linux-gnu, compiled by GCC 2.95.3 => returns 7.3
- * WARNING: no serious test is made on the validity of the string
- */
-static gfloat
-get_pg_version_float (const gchar *str)
-{
-        gfloat retval = 0.;
-        const gchar *ptr;
-        gfloat div = 1;
-
-        if (!str)
-                return retval;
-
-        /* go on  the first digit of version number */
-        ptr = str;
-        while (*ptr != ' ')
-                ptr++;
-        ptr++;
-
-        /* elaborate the real version number */
-        while (*ptr != ' ') {
-                if (*ptr != '.') {
-                        retval += (*ptr - '0')/div;
-                        div *= 10;
-                }
-                ptr++;
-        }
-
-        return retval;
-}
-
 static void
 pq_notice_processor (GdaConnection *cnc, const char *message)
 {
diff --git a/providers/skel-implementation/capi/gda-capi-meta.c b/providers/skel-implementation/capi/gda-capi-meta.c
index 5757754..b39c937 100644
--- a/providers/skel-implementation/capi/gda-capi-meta.c
+++ b/providers/skel-implementation/capi/gda-capi-meta.c
@@ -98,7 +98,7 @@ gboolean
 _gda_capi_meta__info (GdaServerProvider *prov, GdaConnection *cnc, 
 		      GdaMetaStore *store, GdaMetaContext *context, GError **error)
 {
-	GdaDataModel *model;
+	GdaDataModel *model = NULL;
 	gboolean retval;
 
 	TO_IMPLEMENT;
@@ -137,7 +137,7 @@ _gda_capi_meta_udt (GdaServerProvider *prov, GdaConnection *cnc,
 		    GdaMetaStore *store, GdaMetaContext *context, GError **error,
 		    const GValue *udt_catalog, const GValue *udt_schema)
 {
-	GdaDataModel *model;
+	GdaDataModel *model = NULL;
 	gboolean retval = TRUE;
 
 	/* set internal holder's values from the arguments */
diff --git a/testing/gda-test-blob.c b/testing/gda-test-blob.c
index 6c4f50e..ca6bda6 100644
--- a/testing/gda-test-blob.c
+++ b/testing/gda-test-blob.c
@@ -226,7 +226,7 @@ insert_blob (GdaConnection *cnc, gint id, const gchar *data, glong binary_length
 
 	/* blob data */
 	param = gda_set_get_holder (plist, "theblob");
-	value = gda_value_new_blob (data, binary_length);
+	value = gda_value_new_blob ((guchar*) data, binary_length);
 	if (! gda_holder_set_value (param, value, error))
 		return FALSE;
 	gda_value_free (value);
@@ -273,7 +273,7 @@ update_blob (GdaConnection *cnc, gint id, const gchar *data, glong binary_length
 
 	/* blob data */
 	param = gda_set_get_holder (plist, "theblob");
-	value = gda_value_new_blob (data, binary_length);
+	value = gda_value_new_blob ((guchar*) data, binary_length);
 	if (! gda_holder_set_value (param, value, error))
 		return FALSE;
 	gda_value_free (value);
@@ -310,7 +310,7 @@ update_multiple_blobs (GdaConnection *cnc, const gchar *data, glong binary_lengt
 
 	/* blob data */
 	param = gda_set_get_holder (plist, "theblob");
-	value = gda_value_new_blob (data, binary_length);
+	value = gda_value_new_blob ((guchar*) data, binary_length);
 	if (! gda_holder_set_value (param, value, error))
 		return FALSE;
 	gda_value_free (value);
diff --git a/testing/html.c b/testing/html.c
index 052ff54..61fa582 100644
--- a/testing/html.c
+++ b/testing/html.c
@@ -19,20 +19,20 @@ html_file_new (HtmlConfig *config, const gchar *name, const gchar *title)
 
 	file = g_new0 (HtmlFile, 1);
 	file->name = g_strdup (name);
-	file->doc = xmlNewDoc ("1.0");
-	topnode = xmlNewDocNode (file->doc, NULL, "html", NULL);
+	file->doc = xmlNewDoc (BAD_CAST "1.0");
+	topnode = xmlNewDocNode (file->doc, NULL, BAD_CAST "html", NULL);
 	xmlDocSetRootElement (file->doc, topnode);
 
 	/* head */
-	head = xmlNewChild (topnode, NULL, "head", NULL);
+	head = xmlNewChild (topnode, NULL, BAD_CAST "head", NULL);
 
-	node = xmlNewChild (head, NULL, "meta", NULL);
-	xmlSetProp(node, "content", (xmlChar*)"charset=UTF-8");
-	xmlSetProp(node, "http-equiv", (xmlChar*)"content-type");
+	node = xmlNewChild (head, NULL, BAD_CAST "meta", NULL);
+	xmlSetProp(node, BAD_CAST "content", BAD_CAST "charset=UTF-8");
+	xmlSetProp(node, BAD_CAST "http-equiv", BAD_CAST "content-type");
 
-	node = xmlNewChild (head, NULL, "title", title);
-	node = xmlNewChild (head, NULL, "style", 
-"body { "
+	node = xmlNewChild (head, NULL, BAD_CAST "title", BAD_CAST title);
+	node = xmlNewChild (head, NULL, BAD_CAST "style", 
+BAD_CAST "body { "
 "       margin: 0px; padding: 0px;  border:0px; "
 "	font: 8pt/16pt georgia; "
 "	color: #555753; "
@@ -106,12 +106,12 @@ html_file_new (HtmlConfig *config, const gchar *name, const gchar *title)
 );
 
 	/* body */
-	node = xmlNewChild (topnode, NULL, "body", NULL);
+	node = xmlNewChild (topnode, NULL, BAD_CAST "body", NULL);
 	file->body = node;
 
 	/* title */
-	node = xmlNewChild (file->body, NULL, "h1", title);
-	xmlSetProp(node, "class", (xmlChar*)"title");
+	node = xmlNewChild (file->body, NULL, BAD_CAST "h1", BAD_CAST title);
+	xmlSetProp(node, BAD_CAST "class", BAD_CAST "title");
 
 #ifdef NO
 	/* toc */
@@ -181,7 +181,7 @@ real_html_add_link_to_node (xmlNodePtr node, const gchar *text, const gchar *lin
 
 	href = xmlNewNode (NULL, (xmlChar*)"a");
 	tmp = g_strdup_printf (" [%s] ", text);
-	xmlNodeSetContent (href, tmp);
+	xmlNodeSetContent (href, BAD_CAST tmp);
 	g_free (tmp);
 	if (node->children) {
 		xmlNodePtr sibl;
@@ -198,11 +198,11 @@ real_html_add_link_to_node (xmlNodePtr node, const gchar *text, const gchar *lin
 		xmlAddChild (node, href);
 	if (*link_to == '/') {
 		tmp = g_strdup_printf ("#%s", link_to);
-		xmlSetProp(href, (xmlChar*)"href", tmp);
+		xmlSetProp(href, BAD_CAST "href", BAD_CAST tmp);
 		g_free (tmp);
 	}
 	else
-		xmlSetProp(href, (xmlChar*)"href", link_to);
+		xmlSetProp(href, BAD_CAST "href", BAD_CAST link_to);
 }
 
 void
@@ -224,7 +224,7 @@ html_add_to_toc (HtmlConfig *config, HtmlFile *file, const gchar *text, const gc
 {
 	xmlNodePtr li;
 
-	li = xmlNewChild (file->toc, NULL, "li", NULL);
+	li = xmlNewChild (file->toc, NULL, BAD_CAST "li", NULL);
 	real_html_add_link_to_node (li, text, link_to);
 }
 
@@ -234,11 +234,11 @@ html_add_header (HtmlConfig *config, HtmlFile *file, const gchar *text)
 	xmlNodePtr hnode, ntmp;
 	gchar *tmp;
 	
-	hnode = xmlNewChild (file->body, NULL, "h2", text);
+	hnode = xmlNewChild (file->body, NULL, BAD_CAST "h2", BAD_CAST text);
 	tmp = g_strdup_printf ("/a/%d", counter++);
 	html_add_to_toc (config, file, text, tmp);
-	ntmp = xmlNewChild (hnode, NULL, "a", "");
-	xmlSetProp(ntmp, (xmlChar*)"name", tmp);
+	ntmp = xmlNewChild (hnode, NULL, BAD_CAST "a", BAD_CAST "");
+	xmlSetProp(ntmp, BAD_CAST "name", BAD_CAST tmp);
 	g_free (tmp);
 	
 	return hnode;
@@ -260,19 +260,19 @@ html_mark_path_error (HtmlConfig *config, const gchar *nodepath)
 void
 html_mark_node_error (HtmlConfig *config, xmlNodePtr node)
 {
-	xmlSetProp(node, "class", (xmlChar*)"error");
+	xmlSetProp(node, BAD_CAST "class", BAD_CAST "error");
 }
 
 void
 html_mark_node_warning (HtmlConfig *config, xmlNodePtr node)
 {
-	xmlSetProp(node, "class", (xmlChar*)"warning");
+	xmlSetProp(node, BAD_CAST "class", BAD_CAST "warning");
 }
 
 void
 html_mark_node_notice (HtmlConfig *config, xmlNodePtr node)
 {
-	xmlSetProp(node, "class", (xmlChar*)"notice");
+	xmlSetProp(node, BAD_CAST "class", BAD_CAST "notice");
 }
 
 xmlNodePtr
@@ -283,7 +283,7 @@ html_render_attribute_str (xmlNodePtr parent, const gchar *node_type,
 	gchar *tmp;
 
 	tmp = g_strdup_printf ("%s = %s", att_name, att_val);
-	node = xmlNewChild (parent, NULL, node_type, tmp);
+	node = xmlNewChild (parent, NULL, BAD_CAST node_type, BAD_CAST tmp);
 	g_free (tmp);
 
 	return node;
@@ -297,7 +297,7 @@ html_render_attribute_bool (xmlNodePtr parent, const gchar *node_type,
 	gchar *tmp;
 
 	tmp = g_strdup_printf ("%s = %s", att_name, att_val ? _("Yes") : _("No"));
-	node = xmlNewChild (parent, NULL, node_type, tmp);
+	node = xmlNewChild (parent, NULL, BAD_CAST node_type, BAD_CAST tmp);
 	g_free (tmp);
 
 	return node;
@@ -311,13 +311,13 @@ html_render_data_model (xmlNodePtr parent, GdaDataModel *model)
 
         g_return_val_if_fail (GDA_IS_DATA_MODEL (model), NULL);
 
-        node = xmlNewChild (parent, NULL, "table", "");
+        node = xmlNewChild (parent, NULL, BAD_CAST "table", BAD_CAST "");
 
 	cols = gda_data_model_get_n_columns (model);
 	rows = gda_data_model_get_n_rows (model);
 
         /* set the table structure */
-	tr = xmlNewChild (node, NULL, "tr", NULL);
+	tr = xmlNewChild (node, NULL, BAD_CAST "tr", NULL);
         for (i = 0; i < cols; i++) {
                 GdaColumn *column;
 
@@ -327,7 +327,7 @@ html_render_data_model (xmlNodePtr parent, GdaDataModel *model)
                         return NULL;
                 }
 
-                td = xmlNewChild (tr, NULL, "th", gda_column_get_name (column));
+                td = xmlNewChild (tr, NULL, BAD_CAST "th", BAD_CAST gda_column_get_name (column));
         }
 	
 	/* add the model data to the XML output */
@@ -335,22 +335,22 @@ html_render_data_model (xmlNodePtr parent, GdaDataModel *model)
                 gint r, c;
 
                 for (r = 0; r < rows; r++) {
-			tr = xmlNewChild (node, NULL, "tr", "");
+			tr = xmlNewChild (node, NULL, BAD_CAST "tr", BAD_CAST "");
                         for (c = 0 ; c < cols; c++) {
                                 GValue *value;
 
                                 value = (GValue *) gda_data_model_get_value_at (model, c, r, NULL);
 				if (!value) {
 					xmlNodePtr p;
-					td = xmlNewChild (tr, NULL, "td", NULL);
-					p = xmlNewChild (td, NULL, "p", "ERROR");
-					xmlSetProp(p, "class", (xmlChar*)"null");
+					td = xmlNewChild (tr, NULL, BAD_CAST "td", NULL);
+					p = xmlNewChild (td, NULL, BAD_CAST "p", BAD_CAST "ERROR");
+					xmlSetProp(p, BAD_CAST "class", BAD_CAST "null");
 				}
 				else if (gda_value_is_null (value)) {
 					xmlNodePtr p;
-					td = xmlNewChild (tr, NULL, "td", NULL);
-					p = xmlNewChild (td, NULL, "p", "NULL");
-					xmlSetProp(p, "class", (xmlChar*)"null");
+					td = xmlNewChild (tr, NULL, BAD_CAST "td", NULL);
+					p = xmlNewChild (td, NULL, BAD_CAST "p", BAD_CAST "NULL");
+					xmlSetProp(p, BAD_CAST "class", BAD_CAST "null");
 				}
 				else {
 					gchar *str;
@@ -358,7 +358,7 @@ html_render_data_model (xmlNodePtr parent, GdaDataModel *model)
 						str = g_strdup (g_value_get_boolean (value) ? "TRUE" : "FALSE");
 					else
 						str = gda_value_stringify (value);
-					td = xmlNewChild (tr, NULL, "td", str);
+					td = xmlNewChild (tr, NULL, BAD_CAST "td", BAD_CAST str);
 					g_free (str);
 				}
                         }
diff --git a/tests/.gitignore b/tests/.gitignore
index bbc7462..746b555 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -3,3 +3,4 @@ test-ddl-creator
 test-sql-identifier
 test-identifiers-quotes
 test-sql-builder
+test-connection-string-split
diff --git a/tests/Makefile.am b/tests/Makefile.am
index a181f84..bc2f0f6 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
-check_PROGRAMS = test-ddl-creator test-bin-converter test-sql-identifier test-identifiers-quotes test-sql-builder
+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
 
 
 SUBDIRS = providers parser value-holders meta-store data-models multi-threading
@@ -68,4 +68,11 @@ test_sql_builder_LDADD = \
         $(top_builddir)/libgda/libgda-5.0.la \
         $(LIBGDA_LIBS)
 
+test_connection_string_split_SOURCES = \
+        test-connection-string-split.c
+
+test_connection_string_split_LDADD = \
+        $(top_builddir)/libgda/libgda-5.0.la \
+        $(LIBGDA_LIBS)
+
 EXTRA_DIST = dbstruct.xml
\ No newline at end of file
diff --git a/tests/test-connection-string-split.c b/tests/test-connection-string-split.c
new file mode 100644
index 0000000..0a3ff69
--- /dev/null
+++ b/tests/test-connection-string-split.c
@@ -0,0 +1,54 @@
+#include <libgda/libgda.h>
+#include <string.h>
+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;
+		gchar *cnc_params, *prov, *user, *pass;
+		gda_connection_string_split (str[i], &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")) {
+			g_print ("Wrong cnc_params result\n");
+			return 1;
+		}
+		if (strcmp (prov, "PostgreSQL")) {
+			g_print ("Wrong provider result\n");
+			return 1;
+		}
+		if (strcmp (user, "meme")) {
+			g_print ("Wrong username result\n");
+			return 1;
+		}
+		if (strcmp (pass, "pass")) {
+			g_print ("Wrong password result\n");
+			return 1;
+		}
+		g_free (cnc_params);
+		g_free (prov);
+		g_free (user);
+		g_free (pass);
+	}
+
+	return 0;
+}
+
diff --git a/tools/browser/Makefile.am b/tools/browser/Makefile.am
index 822d0ad..25efe65 100644
--- a/tools/browser/Makefile.am
+++ b/tools/browser/Makefile.am
@@ -100,6 +100,7 @@ gda_browser_5_0_LDADD=\
 	query-exec/libperspective.la \
 	data-manager/libperspective.la \
 	libbrowser.la \
+	$(top_builddir)/libgda-ui/internal/libgda-ui-internal.la \
 	$(CANVAS_LDADD) \
 	common/libcommon.la \
 	$(top_builddir)/libgda/libgda-5.0.la \
@@ -149,7 +150,8 @@ icons_DATA= \
 	gda-browser-diagram.png \
 	gda-browser-query.png \
 	gda-browser-form.png \
-	gda-browser-grid.png
+	gda-browser-grid.png \
+	gda-browser-menu-ind.png
 
 # app icon
 appiconsdir=$(datadir)/pixmaps
diff --git a/tools/browser/browser-connection.c b/tools/browser/browser-connection.c
index 4e77fdc..6ed0495 100644
--- a/tools/browser/browser-connection.c
+++ b/tools/browser/browser-connection.c
@@ -309,17 +309,20 @@ wrapper_meta_struct_sync (BrowserConnection *bcnc, GError **error)
 	mstruct = (GdaMetaStruct *) bcnc->priv->p_mstruct_list->data;
 	bcnc->priv->p_mstruct_list = g_slist_delete_link (bcnc->priv->p_mstruct_list,
 							  bcnc->priv->p_mstruct_list);
-	if (bcnc->priv->p_mstruct_list)
+	if (bcnc->priv->p_mstruct_list) {
 		/* don't care about this one */
 		g_object_unref (G_OBJECT (mstruct));
+		g_mutex_unlock (bcnc->priv->p_mstruct_mutex);
+	}
 	else {
 		if (bcnc->priv->c_mstruct)
 			g_object_unref (bcnc->priv->c_mstruct);
 		bcnc->priv->c_mstruct = mstruct;
+		g_mutex_unlock (bcnc->priv->p_mstruct_mutex);
+
 		/*g_print ("Meta struct sync for %p\n", mstruct);*/
 		retval = gda_meta_struct_complement_all (mstruct, error);
 	}
-	g_mutex_unlock (bcnc->priv->p_mstruct_mutex);
 
 	return GINT_TO_POINTER (retval ? 2 : 1);
 }
@@ -1373,6 +1376,24 @@ browser_connection_normalize_sql_statement (BrowserConnection *bcnc,
 	return gda_sql_statement_normalize (sqlst, bcnc->priv->cnc, error);
 }
 
+/**
+ * browser_connection_check_sql_statement_validify
+ */
+gboolean
+browser_connection_check_sql_statement_validify (BrowserConnection *bcnc,
+						 GdaSqlStatement *sqlst, GError **error)
+{
+	g_return_val_if_fail (sqlst, FALSE);
+	g_return_val_if_fail (BROWSER_IS_CONNECTION (bcnc), FALSE);
+
+	/* check the structure first */
+        if (!gda_sql_statement_check_structure (sqlst, error))
+                return FALSE;
+
+	return gda_sql_statement_check_validity_m (sqlst, bcnc->priv->mstruct, error);
+}
+
+
 
 /*
  * DOES NOT emit any signal
diff --git a/tools/browser/browser-connection.h b/tools/browser/browser-connection.h
index 763d80f..8908ffc 100644
--- a/tools/browser/browser-connection.h
+++ b/tools/browser/browser-connection.h
@@ -94,6 +94,8 @@ GObject            *browser_connection_execution_get_result   (BrowserConnection
 							       GdaSet **last_insert_row, GError **error);
 gboolean            browser_connection_normalize_sql_statement(BrowserConnection *bcnc,
 							       GdaSqlStatement *sqlst, GError **error);
+gboolean            browser_connection_check_sql_statement_validify (BrowserConnection *bcnc,
+								     GdaSqlStatement *sqlst, GError **error);
 /**
  * BrowserConnectionExecuteCallback
  *
diff --git a/tools/browser/browser-window.c b/tools/browser/browser-window.c
index d3d8f5e..7f15a7a 100644
--- a/tools/browser/browser-window.c
+++ b/tools/browser/browser-window.c
@@ -30,6 +30,7 @@
 #include "browser-spinner.h"
 #include "browser-stock-icons.h"
 #include "connection-binding-properties.h"
+#include <gdk/gdkkeysyms.h>
 
 /*
  * structure representing a 'tab' in a window
@@ -59,6 +60,7 @@ static void browser_window_init (BrowserWindow *bwin);
 static void browser_window_dispose (GObject *object);
 
 static gboolean window_state_event (GtkWidget *widget, GdkEventWindowState *event);
+static gboolean key_press_event (GtkWidget *widget, GdkEventKey *event);
 static void connection_busy_cb (BrowserConnection *bcnc, gboolean is_busy, gchar *reason, BrowserWindow *bwin);
 
 static void connection_added_cb (BrowserCore *bcore, BrowserConnection *bcnc, BrowserWindow *bwin);
@@ -85,6 +87,10 @@ struct _BrowserWindowPrivate {
 	PerspectiveData   *current_perspective;
 	guint              ui_manager_merge_id; /* for current perspective */
 
+	GtkWidget         *menubar;
+	GtkWidget         *toolbar;
+	gboolean           toolbar_shown;
+	gboolean           cursor_in_toolbar;
 	GtkWidget         *spinner;
 	GtkUIManager      *ui_manager;
 	GtkActionGroup    *agroup;
@@ -96,10 +102,17 @@ struct _BrowserWindowPrivate {
 	gulong             cnc_added_sigid;
 	gulong             cnc_removed_sigid;
 
+#if GTK_CHECK_VERSION (2,18,0)
+	GtkWidget         *notif_box;
+	GSList            *notif_widgets;
+#endif
+
 	GtkWidget         *statusbar;
 	guint              cnc_statusbar_context;
 
 	gboolean           fullscreen;
+	gulong             fullscreen_motion_sig_id;
+	guint              fullscreen_timer_id;
 };
 
 GType
@@ -137,6 +150,7 @@ browser_window_class_init (BrowserWindowClass *klass)
 	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
 	widget_class->window_state_event = window_state_event;
+	widget_class->key_press_event = key_press_event;
 	parent_class = g_type_class_peek_parent (klass);
 
 	browser_window_signals[FULLSCREEN_CHANGED] =
@@ -164,6 +178,8 @@ browser_window_init (BrowserWindow *bwin)
 	bwin->priv->cnc_removed_sigid = 0;
 	bwin->priv->updating_transaction_status = FALSE;
 	bwin->priv->fullscreen = FALSE;
+	bwin->priv->fullscreen_motion_sig_id = 0;
+	bwin->priv->fullscreen_timer_id = 0;
 }
 
 static void
@@ -182,6 +198,12 @@ browser_window_dispose (GObject *object)
 			connection_removed_cb (browser_core_get(), BROWSER_CONNECTION (list->data), bwin);
 		g_slist_free (connections);
 
+		if (bwin->priv->fullscreen_timer_id)
+			g_source_remove (bwin->priv->fullscreen_timer_id);
+
+		if (bwin->priv->fullscreen_motion_sig_id)
+			g_signal_handler_disconnect (bwin, bwin->priv->fullscreen_motion_sig_id);
+
 		if (bwin->priv->cnc_added_sigid > 0)
 			g_signal_handler_disconnect (browser_core_get (), bwin->priv->cnc_added_sigid);
 		if (bwin->priv->cnc_removed_sigid > 0)
@@ -203,6 +225,11 @@ browser_window_dispose (GObject *object)
 		}
 		if (bwin->priv->perspectives_nb)
 			g_object_unref (bwin->priv->perspectives_nb);
+
+#if GTK_CHECK_VERSION (2,18,0)
+		if (bwin->priv->notif_widgets)
+			g_slist_free (bwin->priv->notif_widgets);
+#endif
 		g_free (bwin->priv);
 		bwin->priv = NULL;
 	}
@@ -407,6 +434,7 @@ browser_window_new (BrowserConnection *bcnc, BrowserPerspectiveFactory *factory)
 	gtk_window_add_accel_group (GTK_WINDOW (bwin), accel_group);
 
         menubar = gtk_ui_manager_get_widget (ui, "/MenuBar");
+	bwin->priv->menubar = menubar;
 #ifdef HAVE_MAC_INTEGRATION
 	gtk_osxapplication_set_menu_bar (theApp, GTK_MENU_SHELL (menubar));
 #else
@@ -415,11 +443,20 @@ browser_window_new (BrowserConnection *bcnc, BrowserPerspectiveFactory *factory)
 #endif
 
         toolbar = gtk_ui_manager_get_widget (ui, "/ToolBar");
+	bwin->priv->toolbar = toolbar;
+	bwin->priv->toolbar_shown = TRUE;
         gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, TRUE, 0);
 	gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar), TRUE);
         gtk_widget_show (toolbar);
 	bwin->priv->toolbar_style = gtk_toolbar_get_style (GTK_TOOLBAR (toolbar));
 
+#if GTK_CHECK_VERSION (2,18,0)
+	bwin->priv->notif_box = gtk_vbox_new (FALSE, 0);
+	gtk_box_pack_start (GTK_BOX (vbox), bwin->priv->notif_box, FALSE, FALSE, 0);
+        gtk_widget_show (bwin->priv->notif_box);
+	bwin->priv->notif_widgets = NULL;
+#endif
+
 	GtkToolItem *ti;
 	GtkWidget *spinner, *svbox, *align;
 
@@ -446,7 +483,6 @@ browser_window_new (BrowserConnection *bcnc, BrowserPerspectiveFactory *factory)
 	/* statusbar */
 	bwin->priv->statusbar = gtk_statusbar_new ();
 
-
 	GSList *connections, *list;
 	bwin->priv->cnc_agroup = gtk_action_group_new ("CncActions");
 	connections = browser_core_get_connections ();
@@ -548,7 +584,16 @@ browser_window_new (BrowserConnection *bcnc, BrowserPerspectiveFactory *factory)
 
         gtk_widget_show (GTK_WIDGET (bwin));
 
+#if GTK_CHECK_VERSION(2,18,0)
 	gtk_widget_set_can_focus ((GtkWidget* )pers->perspective_widget, TRUE);
+#else
+	GtkWidget *fwid = (GtkWidget* )pers->perspective_widget;
+	if (! GTK_WIDGET_CAN_FOCUS (fwid)) {
+		GTK_WIDGET_SET_FLAGS (fwid, GTK_CAN_FOCUS);
+		gtk_widget_queue_resize (fwid);
+		g_object_notify (G_OBJECT (fwid), "can-focus");
+	}
+#endif
 	gtk_widget_grab_focus ((GtkWidget* )pers->perspective_widget);
 
 	return bwin;
@@ -880,13 +925,127 @@ window_close_cb (GtkAction *action, BrowserWindow *bwin)
 	delete_event (NULL, NULL, bwin);
 }
 
+static gboolean
+toolbar_hide_timeout_cb (BrowserWindow *bwin)
+{
+	if (!bwin->priv->cursor_in_toolbar) {
+		gtk_widget_hide (bwin->priv->toolbar);
+		gtk_widget_hide (bwin->priv->menubar);
+		bwin->priv->toolbar_shown = FALSE;
+		
+		/* remove timer */
+		bwin->priv->fullscreen_timer_id = 0;
+		return FALSE;
+	}
+	else
+		/* keep timer */
+		return TRUE;
+}
+
+#define BWIN_WINDOW_FULLSCREEN_POPUP_THRESHOLD 5
+#define BWIN_WINDOW_FULLSCREEN_POPUP_TIMER 1
+
+static gboolean
+fullscreen_motion_notify_cb (GtkWidget *widget, GdkEventMotion *event, gpointer user_data)
+{
+	BrowserWindow *bwin = BROWSER_WINDOW (widget);
+#if GTK_CHECK_VERSION(2,14,0)
+	if (gtk_widget_get_window (widget) != event->window)
+		return FALSE;
+#else
+	if (widget->window != event->window)
+		return FALSE;
+#endif
+
+	if (event->y < BWIN_WINDOW_FULLSCREEN_POPUP_THRESHOLD) {
+		gtk_widget_show (bwin->priv->toolbar);
+		gtk_widget_show (bwin->priv->menubar);
+		bwin->priv->toolbar_shown = TRUE;
+	}
+
+	if (bwin->priv->toolbar_shown) {
+		/* reset toolbar hiding timer */
+		if (bwin->priv->fullscreen_timer_id)
+			g_source_remove (bwin->priv->fullscreen_timer_id);
+		bwin->priv->fullscreen_timer_id = g_timeout_add_seconds (BWIN_WINDOW_FULLSCREEN_POPUP_TIMER,
+									 (GSourceFunc) toolbar_hide_timeout_cb,
+									 bwin);
+	}
+	return FALSE;
+}
+
+gboolean
+toolbar_enter_notify_cb (GtkWidget *widget, GdkEventCrossing *event, BrowserWindow *bwin)
+{
+	bwin->priv->cursor_in_toolbar = TRUE;
+	return FALSE;
+}
+
+gboolean
+toolbar_leave_notify_cb (GtkWidget *widget, GdkEventCrossing *event, BrowserWindow *bwin)
+{
+	bwin->priv->cursor_in_toolbar = FALSE;
+	return FALSE;
+}
+
 static void
 window_fullscreen_cb (GtkToggleAction *action, BrowserWindow *bwin)
 {
-	if (gtk_toggle_action_get_active (action))
+	if (gtk_toggle_action_get_active (action)) {
 		gtk_window_fullscreen (GTK_WINDOW (bwin));
-	else
+		browser_window_show_notice_printf (bwin, GTK_MESSAGE_INFO,
+						   "fullscreen-esc",
+						   _("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;
+		bwin->priv->fullscreen_motion_sig_id = g_signal_connect (bwin, "motion-notify-event",
+									 G_CALLBACK (fullscreen_motion_notify_cb),
+									 NULL);
+		g_signal_connect (bwin->priv->toolbar, "enter-notify-event",
+				  G_CALLBACK (toolbar_enter_notify_cb), bwin);
+		g_signal_connect (bwin->priv->toolbar, "leave-notify-event",
+				  G_CALLBACK (toolbar_leave_notify_cb), bwin);
+		g_signal_connect (bwin->priv->menubar, "enter-notify-event",
+				  G_CALLBACK (toolbar_enter_notify_cb), bwin);
+		g_signal_connect (bwin->priv->menubar, "leave-notify-event",
+				  G_CALLBACK (toolbar_leave_notify_cb), bwin);
+	}
+	else {
 		gtk_window_unfullscreen (GTK_WINDOW (bwin));
+		g_signal_handler_disconnect (bwin, bwin->priv->fullscreen_motion_sig_id);
+		bwin->priv->fullscreen_motion_sig_id = 0;
+		g_signal_handlers_disconnect_by_func (bwin->priv->toolbar,
+						      G_CALLBACK (toolbar_enter_notify_cb), bwin);
+		g_signal_handlers_disconnect_by_func (bwin->priv->toolbar,
+						      G_CALLBACK (toolbar_leave_notify_cb), bwin);
+		g_signal_handlers_disconnect_by_func (bwin->priv->menubar,
+						      G_CALLBACK (toolbar_enter_notify_cb), bwin);
+		g_signal_handlers_disconnect_by_func (bwin->priv->menubar,
+						      G_CALLBACK (toolbar_leave_notify_cb), bwin);
+
+		gtk_widget_show (bwin->priv->toolbar);
+		gtk_widget_show (bwin->priv->menubar);
+		bwin->priv->toolbar_shown = TRUE;
+
+		if (bwin->priv->fullscreen_timer_id) {
+			g_source_remove (bwin->priv->fullscreen_timer_id);
+			bwin->priv->fullscreen_timer_id = 0;
+		}
+	}
+}
+
+static gboolean
+key_press_event (GtkWidget *widget, GdkEventKey *event)
+{
+	if ((event->keyval == GDK_Escape) &&
+	    browser_window_is_fullscreen (BROWSER_WINDOW (widget))) {
+		browser_window_set_fullscreen (BROWSER_WINDOW (widget), FALSE);
+		return TRUE;
+	}
+
+	/* parent class */
+	return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
 }
 
 static gboolean
@@ -979,7 +1138,7 @@ connection_properties_cb (GtkAction *action, BrowserWindow *bwin)
 		if (res == GTK_RESPONSE_OK) {
 			GError *error = NULL;
 			if (!browser_virtual_connection_modify_specs (BROWSER_VIRTUAL_CONNECTION (bwin->priv->bcnc),
-					connection_binding_properties_get_specs (CONNECTION_BINDING_PROPERTIES (win)),
+								      connection_binding_properties_get_specs (CONNECTION_BINDING_PROPERTIES (win)),
 								      &error)) {
 				browser_show_error ((GtkWindow*) bwin,
 						    _("Error updating bound connection: %s"),
@@ -1218,6 +1377,228 @@ browser_window_pop_status (BrowserWindow *bwin, const gchar *context)
 }
 
 /**
+ * browser_window_show_notice_printf
+ * @bwin: a #BrowserWindow
+ * @context: textual description of what context the message is being used in
+ * @format: the text to display
+ *
+ * Make @bwin display a notice
+ */
+void
+browser_window_show_notice_printf (BrowserWindow *bwin, GtkMessageType type, const gchar *context,
+				   const gchar *format, ...)
+{
+	va_list args;
+        gchar sz[2048];
+
+	g_return_if_fail (BROWSER_IS_WINDOW (bwin));
+
+        /* build the message string */
+        va_start (args, format);
+        vsnprintf (sz, sizeof (sz), format, args);
+        va_end (args);
+	browser_window_show_notice (bwin, type, context, sz);
+}
+
+
+#if GTK_CHECK_VERSION (2,18,0)
+static void
+info_bar_response_cb (GtkInfoBar *ibar, gint response, BrowserWindow *bwin)
+{
+	bwin->priv->notif_widgets = g_slist_remove (bwin->priv->notif_widgets, ibar);	
+	gtk_widget_destroy ((GtkWidget*) ibar);
+}
+#endif
+
+/* hash table to remain which context notices have to be hidden: key=context, value=GINT_TO_POINTER (1) */
+static GHashTable *hidden_contexts = NULL;
+static void
+hidden_contexts_foreach_save (const gchar *context, gint value, xmlNodePtr root)
+{
+	xmlNodePtr node;
+	node = xmlNewChild (root, NULL, BAD_CAST "hide-notice", BAD_CAST context);
+}
+
+static void
+hide_notice_toggled_cb (GtkToggleButton *toggle, gchar *context)
+{
+	g_assert (hidden_contexts);
+	if (gtk_toggle_button_get_active (toggle))
+		g_hash_table_insert (hidden_contexts, g_strdup (context), GINT_TO_POINTER (TRUE));
+	else
+		g_hash_table_remove (hidden_contexts, context);
+
+	/* save config */
+	xmlDocPtr doc;
+	xmlNodePtr root;
+	xmlChar *xml_contents;
+	gint size;
+	doc = xmlNewDoc (BAD_CAST "1.0");
+	root = xmlNewNode (NULL, BAD_CAST "gda-browser-preferences");
+	xmlDocSetRootElement (doc, root);
+	g_hash_table_foreach (hidden_contexts, (GHFunc) hidden_contexts_foreach_save, root);
+	xmlDocDumpFormatMemory (doc, &xml_contents, &size, 1);
+	xmlFreeDoc (doc);
+
+	/* save to disk */
+	gchar *confdir, *conffile = NULL;
+	GError *lerror = NULL;
+	confdir = g_build_path (G_DIR_SEPARATOR_S, g_get_user_config_dir(), "gda-browser", NULL);
+	if (!g_file_test (confdir, G_FILE_TEST_EXISTS)) {
+		if (g_mkdir_with_parents (confdir, 0700)) {
+			g_warning ("Can't create configuration directory '%s' to save preferences.",
+				   confdir);
+			goto out;
+		}
+	}
+	conffile = g_build_filename (confdir, "preferences.xml", NULL);
+	if (! g_file_set_contents (conffile, (gchar *) xml_contents, size, &lerror)) {
+		g_warning ("Can't save preferences file '%s': %s", conffile,
+			   lerror && lerror->message ? lerror->message : _("No detail"));
+		g_clear_error (&lerror);
+	}
+
+ out:
+	xmlFree (xml_contents);
+	g_free (confdir);
+	g_free (conffile);
+}
+
+static void
+load_preferences (void)
+{
+	/* load preferences */
+	xmlDocPtr doc;
+	xmlNodePtr root, node;
+	gchar *conffile;
+	conffile = g_build_path (G_DIR_SEPARATOR_S, g_get_user_config_dir(),
+				 "gda-browser", "preferences.xml", NULL);
+	if (!g_file_test (conffile, G_FILE_TEST_EXISTS)) {
+		g_free (conffile);
+		return;
+	}
+
+	doc = xmlParseFile (conffile);
+	if (!doc) {
+		g_warning ("Error loading preferences from file '%s'", conffile);
+		g_free (conffile);
+		return;
+	}
+	g_free (conffile);
+
+	root = xmlDocGetRootElement (doc);
+	for (node = root->children; node; node = node->next) {
+		xmlChar *contents;
+		if (strcmp ((gchar *) node->name, "hide-notice"))
+			continue;
+		contents = xmlNodeGetContent (node);
+		if (contents) {
+			g_hash_table_insert (hidden_contexts, g_strdup ((gchar*) contents),
+					     GINT_TO_POINTER (TRUE));
+			xmlFree (contents);
+		}
+	}
+	xmlFreeDoc (doc);
+}
+
+
+/**
+ * browser_window_show_notice
+ * @bwin: a #BrowserWindow
+ * @context: textual description of what context the message is being used in
+ * @text: the information's text
+ *
+ * Makes @bwin display a notice
+ */
+void
+browser_window_show_notice (BrowserWindow *bwin, GtkMessageType type, const gchar *context, const gchar *text)
+{
+	g_return_if_fail (BROWSER_IS_WINDOW (bwin));
+	gboolean hide = FALSE;
+
+	if ((type != GTK_MESSAGE_ERROR) && context) {
+		if (!hidden_contexts) {
+			hidden_contexts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+			load_preferences ();
+		}
+		hide = GPOINTER_TO_INT (g_hash_table_lookup (hidden_contexts, context));
+	}
+
+	if (hide) {
+		gchar *ptr, *tmp;
+		tmp = g_strdup (text);
+		for (ptr = tmp; *ptr && (*ptr != '\n'); ptr++);
+		if (*ptr) {
+			*ptr = '.'; ptr++;
+			*ptr = '.'; ptr++;
+			*ptr = '.'; ptr++;
+			*ptr = 0;
+		}
+		browser_window_push_status (bwin, "SupportNotice", tmp, TRUE);
+		g_free (tmp);
+	}
+	else {
+		GtkWidget *cb = NULL;
+		if (context && (type == GTK_MESSAGE_INFO)) {
+			cb = gtk_check_button_new_with_label (_("Don't show this message again"));
+			g_signal_connect_data (cb, "toggled",
+					       G_CALLBACK (hide_notice_toggled_cb), g_strdup (context),
+					       (GClosureNotify) g_free, 0);
+		}
+
+#if GTK_CHECK_VERSION (2,18,0)
+		/* use a GtkInfoBar */
+		GtkWidget *ibar, *content_area, *label;
+		
+		ibar = gtk_info_bar_new_with_buttons (GTK_STOCK_CLOSE, 1, NULL);
+		gtk_info_bar_set_message_type (GTK_INFO_BAR (ibar), type);
+		label = gtk_label_new ("");
+		gtk_label_set_markup (GTK_LABEL (label), text);
+		gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+		gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
+		content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (ibar));
+		if (cb) {
+			GtkWidget *box;
+			box = gtk_hbox_new (FALSE, 0);
+			gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
+			gtk_box_pack_start (GTK_BOX (box), cb, FALSE, FALSE, 0);
+			gtk_container_add (GTK_CONTAINER (content_area), box);
+			gtk_widget_show_all (box);
+		}
+		else {
+			gtk_container_add (GTK_CONTAINER (content_area), label);
+			gtk_widget_show (label);
+		}
+		g_signal_connect (ibar, "response",
+				  G_CALLBACK (info_bar_response_cb), bwin);
+		gtk_box_pack_start (GTK_BOX (bwin->priv->notif_box), ibar, TRUE, TRUE, 0);
+		bwin->priv->notif_widgets = g_slist_append (bwin->priv->notif_widgets, ibar);
+		if (g_slist_length (bwin->priv->notif_widgets) > 2) {
+			gtk_widget_destroy (GTK_WIDGET (bwin->priv->notif_widgets->data));
+			bwin->priv->notif_widgets = g_slist_delete_link (bwin->priv->notif_widgets,
+									 bwin->priv->notif_widgets);
+		}
+		gtk_widget_show (ibar);
+#else
+		/* create the error message dialog */
+		GtkWidget *dialog;
+		dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (bwin),
+							     GTK_DIALOG_DESTROY_WITH_PARENT |
+							     GTK_DIALOG_MODAL, GTK_MESSAGE_INFO,
+							     GTK_BUTTONS_CLOSE,
+							     "<span weight=\"bold\">%s</span>\n%s", _("Note:"), text);
+		if (cb)
+			gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), cb, FALSE, FALSE, 10);
+	
+		gtk_widget_show_all (dialog);
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);
+#endif
+	}
+}
+
+
+/**
  * browser_window_customize_perspective_ui
  * @bwin: a #BrowserWindow
  * @bpers: the #BrowserPerspective concerned
@@ -1316,13 +1697,17 @@ browser_window_change_perspective (BrowserWindow *bwin, const gchar *perspective
 	}
 	g_list_free (actions);
 
-	browser_show_notice (GTK_WINDOW (bwin), "Perspective change",
-			     _("The current perspective has changed to the '%s' perspective, you "
-			       "can switch back to previous perspective through the "
-			       "'Perspective/%s' menu, or using the '%s' shortcut"),
-			     bwin->priv->current_perspective->factory->perspective_name,
-			     current_pdata->factory->perspective_name,
-			     current_pdata->factory->menu_shortcut);
+	gchar *tmp;
+	tmp = g_markup_printf_escaped (_("The current perspective has changed to the '%s' perspective, you "
+					 "can switch back to previous perspective through the "
+					 "'Perspective/%s' menu, or using the '%s' shortcut"),
+				       bwin->priv->current_perspective->factory->perspective_name,
+				       current_pdata->factory->perspective_name,
+				       current_pdata->factory->menu_shortcut);
+
+			
+	browser_window_show_notice (bwin, GTK_MESSAGE_INFO, "Perspective change", tmp);
+	g_free (tmp);
 
 	return bpers;
 }
@@ -1330,6 +1715,8 @@ browser_window_change_perspective (BrowserWindow *bwin, const gchar *perspective
 /**
  * browser_window_is_fullscreen
  * @bwin: a #BrowserWindow
+ *
+ * Returns: %TRUE if @bwin is fullscreen
  */
 gboolean
 browser_window_is_fullscreen (BrowserWindow *bwin)
@@ -1337,3 +1724,20 @@ browser_window_is_fullscreen (BrowserWindow *bwin)
 	g_return_val_if_fail (BROWSER_IS_WINDOW (bwin), FALSE);
 	return bwin->priv->fullscreen;
 }
+
+/**
+ * browser_window_set_fullscreen
+ * @bwin: a #BrowserWindow
+ * @fullscreen:
+ *
+ * Requires @bwin to be fullscreen if @fullscreen is %TRUE
+ */
+void
+browser_window_set_fullscreen (BrowserWindow *bwin, gboolean fullscreen)
+{
+	GtkAction *action;
+	g_return_if_fail (BROWSER_IS_WINDOW (bwin));
+	
+	action = gtk_action_group_get_action (bwin->priv->agroup, "WindowFullScreen");
+	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), fullscreen);
+}
diff --git a/tools/browser/browser-window.h b/tools/browser/browser-window.h
index 302214a..4797953 100644
--- a/tools/browser/browser-window.h
+++ b/tools/browser/browser-window.h
@@ -58,6 +58,10 @@ BrowserConnection  *browser_window_get_connection         (BrowserWindow *bwin);
 guint               browser_window_push_status            (BrowserWindow *bwin, const gchar *context,
 							   const gchar *text, gboolean auto_clear);
 void                browser_window_pop_status             (BrowserWindow *bwin, const gchar *context);
+void                browser_window_show_notice            (BrowserWindow *bwin, GtkMessageType type,
+							   const gchar *context, const gchar *text);
+void                browser_window_show_notice_printf     (BrowserWindow *bwin, GtkMessageType type,
+							   const gchar *context, const gchar *format, ...);
 
 void                browser_window_customize_perspective_ui (BrowserWindow *bwin, BrowserPerspective *bpers,
 							     GtkActionGroup *actions_group,
@@ -65,6 +69,7 @@ void                browser_window_customize_perspective_ui (BrowserWindow *bwin
 
 BrowserPerspective *browser_window_change_perspective     (BrowserWindow *bwin, const gchar *perspective);
 
+void                browser_window_set_fullscreen         (BrowserWindow *bwin, gboolean fullscreen);
 gboolean            browser_window_is_fullscreen          (BrowserWindow *bwin);
 
 G_END_DECLS
diff --git a/tools/browser/canvas/browser-canvas-db-relations.c b/tools/browser/canvas/browser-canvas-db-relations.c
index d409108..7a62669 100644
--- a/tools/browser/canvas/browser-canvas-db-relations.c
+++ b/tools/browser/canvas/browser-canvas-db-relations.c
@@ -65,7 +65,7 @@ struct _BrowserCanvasDbRelationsPrivate
 	GdaMetaStruct    *mstruct;
 	GooCanvasItem    *level_separator; /* all tables items will be above this item and FK lines below */
 
-	GtkWidget        *popup_container;
+	GtkWidget        *add_dialog;
 	ObjectsCloud     *cloud;
 };
 
@@ -140,7 +140,8 @@ browser_canvas_db_relations_dispose (GObject *object)
 		g_hash_table_destroy (canvas->priv->hash_tables);
 		g_hash_table_destroy (canvas->priv->hash_fkeys);
 
-		gtk_widget_destroy (canvas->priv->popup_container);
+		if (canvas->priv->add_dialog)
+			gtk_widget_destroy (canvas->priv->add_dialog);
 
 		g_free (canvas->priv);
 		canvas->priv = NULL;
@@ -199,37 +200,9 @@ browser_canvas_db_relations_get_property (GObject *object,
 }
 
 static void
-popup_position (PopupContainer *container, gint *out_x, gint *out_y)
-{
-	GtkWidget *canvas;
-        canvas = g_object_get_data (G_OBJECT (container), "__canvas");
-
-        gint x, y;
-        GtkRequisition req;
-
-        gtk_widget_size_request (canvas, &req);
-
-	GtkAllocation alloc;
-	gdk_window_get_origin (gtk_widget_get_window (canvas), &x, &y);
-	gtk_widget_get_allocation (canvas, &alloc);
-        x += alloc.x;
-        y += alloc.y;
-
-        if (x < 0)
-                x = 0;
-
-        if (y < 0)
-                y = 0;
-        *out_x = x;
-        *out_y = y;
-}
-
-static void
 cloud_object_selected_cb (ObjectsCloud *ocloud, ObjectsCloudObjType sel_type, 
 			  const gchar *sel_contents, BrowserCanvasDbRelations *dbrel)
 {
-	g_print ("-> %s\n", sel_contents);
-
 	GdaMetaTable *mtable;
 	GValue *table_schema;
 	GValue *table_name;
@@ -242,8 +215,10 @@ cloud_object_selected_cb (ObjectsCloud *ocloud, ObjectsCloudObjType sel_type,
 			    gda_quark_list_find (ql, "OBJ_NAME"));
 	gda_quark_list_free (ql);
 
+#ifdef GDA_DEBUG_NO
 	g_print ("Add %s.%s\n",
 		 g_value_get_string (table_schema), g_value_get_string (table_name));
+#endif
 	mtable = (GdaMetaTable*) gda_meta_struct_complement (dbrel->priv->mstruct, GDA_META_DB_TABLE,
 							     NULL, table_schema, table_name, NULL);
 	if (mtable) {
@@ -280,32 +255,14 @@ browser_canvas_db_relations_new (GdaMetaStruct *mstruct)
 	BrowserCanvas *canvas;
 	BrowserCanvasDbRelations *dbrels;
 	GooCanvasItem *item;
-	GtkWidget *vbox, *cloud, *find;
 	g_return_val_if_fail (!mstruct || GDA_IS_META_STRUCT (mstruct), NULL);
 
-	canvas = BROWSER_CANVAS (g_object_new (TYPE_BROWSER_CANVAS_DB_RELATIONS, "meta-struct", mstruct, NULL));
+	canvas = BROWSER_CANVAS (g_object_new (TYPE_BROWSER_CANVAS_DB_RELATIONS,
+					       "meta-struct", mstruct, NULL));
 	dbrels = BROWSER_CANVAS_DB_RELATIONS (canvas);
 	item = goo_canvas_group_new (goo_canvas_get_root_item (canvas->priv->goocanvas), NULL);
 	dbrels->priv->level_separator = item;
 
-	dbrels->priv->popup_container = popup_container_new_with_func (popup_position);
-	g_object_set_data (G_OBJECT (dbrels->priv->popup_container), "__canvas", canvas);
-
-	vbox = gtk_vbox_new (FALSE, 0);
-	gtk_container_add (GTK_CONTAINER (dbrels->priv->popup_container), vbox);
-
-	cloud = objects_cloud_new (mstruct, OBJECTS_CLOUD_TYPE_TABLE);
-	dbrels->priv->cloud = OBJECTS_CLOUD (cloud);
-	gtk_widget_set_size_request (GTK_WIDGET (cloud), 200, 300);
-	g_signal_connect (cloud, "selected",
-			  G_CALLBACK (cloud_object_selected_cb), dbrels);
-	gtk_box_pack_start (GTK_BOX (vbox), cloud, TRUE, TRUE, 0);
-
-	find = objects_cloud_create_filter (OBJECTS_CLOUD (cloud));
-	gtk_box_pack_start (GTK_BOX (vbox), find, FALSE, FALSE, 0);
-	
-	gtk_widget_show_all (vbox);
-
         return GTK_WIDGET (canvas);
 }
 
@@ -332,6 +289,7 @@ static GtkWidget *canvas_entity_popup_func (BrowserCanvasTable *ce);
 
 static void popup_func_delete_cb (GtkMenuItem *mitem, BrowserCanvasTable *ce);
 static void popup_func_add_depend_cb (GtkMenuItem *mitem, BrowserCanvasTable *ce);
+static void popup_func_add_ref_cb (GtkMenuItem *mitem, BrowserCanvasTable *ce);
 static GtkWidget *
 canvas_entity_popup_func (BrowserCanvasTable *ce)
 {
@@ -346,6 +304,10 @@ canvas_entity_popup_func (BrowserCanvasTable *ce)
 	g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (popup_func_add_depend_cb), ce);
 	gtk_menu_shell_append (GTK_MENU_SHELL (menu), entry);
 	gtk_widget_show (entry);
+	entry = gtk_menu_item_new_with_label (_("Add tables referencing this table"));
+	g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (popup_func_add_ref_cb), ce);
+	gtk_menu_shell_append (GTK_MENU_SHELL (menu), entry);
+	gtk_widget_show (entry);
 
 	return menu;
 }
@@ -404,10 +366,6 @@ popup_func_add_depend_cb (GtkMenuItem *mitem, BrowserCanvasTable *ce)
 	
 	GdaMetaTable *mtable = GDA_META_TABLE (dbo);
 	GSList *list;
-	GooCanvasBounds bounds;
-	goo_canvas_item_get_bounds (GOO_CANVAS_ITEM (ce), &bounds);
-	bounds.y1 = bounds.y2 + 35.;
-	bounds.x2 = bounds.x1 - 20.;
 
 	for (list = mtable->fk_list; list; list = list->next) {
 		GdaMetaTableForeignKey *fk = GDA_META_TABLE_FOREIGN_KEY (list->data);
@@ -425,11 +383,52 @@ popup_func_add_depend_cb (GtkMenuItem *mitem, BrowserCanvasTable *ce)
 		gda_value_free (v1);
 		gda_value_free (v2);
 		gda_value_free (v3);
-								       
-		goo_canvas_item_get_bounds (GOO_CANVAS_ITEM (new_item), &bounds);
 	}
 }
 
+static void
+popup_func_add_ref_cb (GtkMenuItem *mitem, BrowserCanvasTable *ce)
+{
+	BrowserCanvasDbRelations *dbrel;
+	GdaMetaDbObject *dbo;
+
+	dbrel = BROWSER_CANVAS_DB_RELATIONS (browser_canvas_item_get_canvas (BROWSER_CANVAS_ITEM (ce)));
+	dbo = g_hash_table_lookup (dbrel->priv->hash_tables, ce);
+	if (!dbo || (dbo->obj_type != GDA_META_DB_TABLE))
+		return;
+
+	if (!dbrel->priv->mstruct)
+		return;
+	
+	GSList *alldbo, *list;
+
+	alldbo = gda_meta_struct_get_all_db_objects (dbrel->priv->mstruct);
+	for (list = alldbo; list; list = list->next) {
+		GdaMetaDbObject *fkdbo = GDA_META_DB_OBJECT (list->data);
+		if (fkdbo->obj_type != GDA_META_DB_TABLE)
+			continue;
+
+		GSList *fklist;
+		for (fklist = GDA_META_TABLE (fkdbo)->fk_list; fklist; fklist = fklist->next) {
+			GdaMetaTableForeignKey *fk = GDA_META_TABLE_FOREIGN_KEY (fklist->data);
+			if (fk->depend_on != dbo)
+				continue;
+			if (g_hash_table_lookup (dbrel->priv->hash_tables, fkdbo))
+				continue;
+			BrowserCanvasTable *new_item;
+			GValue *v1, *v2, *v3;
+			g_value_set_string ((v1 = gda_value_new (G_TYPE_STRING)), fkdbo->obj_catalog);
+			g_value_set_string ((v2 = gda_value_new (G_TYPE_STRING)), fkdbo->obj_schema);
+			g_value_set_string ((v3 = gda_value_new (G_TYPE_STRING)), fkdbo->obj_name);
+			new_item = browser_canvas_db_relations_add_table (dbrel, v1, v2, v3);
+			gda_value_free (v1);
+			gda_value_free (v2);
+			gda_value_free (v3);
+		}
+	}
+	g_slist_free (alldbo);
+}
+
 static GSList *
 complement_layout_items (BrowserCanvasDbRelations *dbrel, BrowserCanvasItem *current, GSList *elist)
 {
@@ -511,10 +510,52 @@ build_context_menu (BrowserCanvas *canvas)
 	return menu;
 }
 
+static gboolean
+add_dialog_delete_event (GtkWidget *dialog, GdkEvent *event, gpointer data)
+{
+	gtk_widget_hide (dialog);
+	return TRUE;
+}
+
 static void
-popup_add_table_cb (GtkMenuItem *mitem, BrowserCanvasDbRelations *dbrel)
+popup_add_table_cb (GtkMenuItem *mitem, BrowserCanvasDbRelations *dbrels)
 {
-	gtk_widget_show (dbrel->priv->popup_container);
+	if (! dbrels->priv->add_dialog) {
+		GtkWidget *vbox, *cloud, *find, *dcontents;
+		dbrels->priv->add_dialog = gtk_dialog_new_with_buttons (_("Select tables to add to diagram"),
+									(GtkWindow*) gtk_widget_get_toplevel ((GtkWidget*) dbrels),
+									GTK_DIALOG_NO_SEPARATOR,
+									NULL);
+		g_signal_connect (dbrels->priv->add_dialog, "close",
+				  G_CALLBACK (gtk_widget_hide), NULL);
+		g_signal_connect (dbrels->priv->add_dialog, "delete-event",
+				  G_CALLBACK (add_dialog_delete_event), NULL);
+		gtk_window_set_default_size (GTK_WINDOW (dbrels->priv->add_dialog), 430, 400);
+		
+		g_object_set_data (G_OBJECT (dbrels->priv->add_dialog), "__canvas", dbrels);
+
+		vbox = gtk_vbox_new (FALSE, 0);
+#if GTK_CHECK_VERSION(2,18,0)
+		dcontents = gtk_dialog_get_content_area (GTK_DIALOG (dbrels->priv->add_dialog));
+#else
+		dcontents = GTK_DIALOG (dbrels->priv->add_dialog)->vbox;
+#endif
+		gtk_container_add (GTK_CONTAINER (dcontents), vbox);
+		
+		cloud = objects_cloud_new (dbrels->priv->mstruct, OBJECTS_CLOUD_TYPE_TABLE);
+		dbrels->priv->cloud = OBJECTS_CLOUD (cloud);
+		gtk_widget_set_size_request (GTK_WIDGET (cloud), 200, 300);
+		g_signal_connect (cloud, "selected",
+				  G_CALLBACK (cloud_object_selected_cb), dbrels);
+		gtk_box_pack_start (GTK_BOX (vbox), cloud, TRUE, TRUE, 0);
+		
+		find = objects_cloud_create_filter (OBJECTS_CLOUD (cloud));
+		gtk_box_pack_start (GTK_BOX (vbox), find, FALSE, FALSE, 0);
+		
+		gtk_widget_show_all (vbox);
+	}
+
+	gtk_widget_show (dbrels->priv->add_dialog);
 }
 
 /**
@@ -555,13 +596,14 @@ browser_canvas_db_relations_add_table  (BrowserCanvasDbRelations *canvas,
 
 	GdaMetaTable *mtable;
 	GooCanvas *goocanvas;
+	GError *lerror = NULL;
 
 	if (!canvas->priv->mstruct)
 		return NULL;
 
 	goocanvas = BROWSER_CANVAS (canvas)->priv->goocanvas;
 	mtable = (GdaMetaTable *) gda_meta_struct_complement (canvas->priv->mstruct, GDA_META_DB_TABLE,
-							      table_catalog, table_schema, table_name, NULL);
+							      table_catalog, table_schema, table_name, &lerror);
 	if (mtable) {
 		gdouble x = 0, y = 0;
 		GooCanvasItem *table_item;
@@ -623,8 +665,11 @@ browser_canvas_db_relations_add_table  (BrowserCanvasDbRelations *canvas,
 
 		return BROWSER_CANVAS_TABLE (table_item);
 	}
-	else
+	else {
+		g_print ("ERROR: %s\n", lerror && lerror->message ? lerror->message : "No detail");
+		g_clear_error (&lerror);
 		return NULL;
+	}
 }
 
 /**
diff --git a/tools/browser/canvas/browser-canvas-fkey.c b/tools/browser/canvas/browser-canvas-fkey.c
index 7642ef7..aaaf4ad 100644
--- a/tools/browser/canvas/browser-canvas-fkey.c
+++ b/tools/browser/canvas/browser-canvas-fkey.c
@@ -132,13 +132,6 @@ browser_canvas_fkey_init (BrowserCanvasFkey *cc)
 	cc->priv->shapes = NULL;
 }
 
-static gboolean
-idle_remove_item (BrowserCanvasFkey *cc)
-{
-	goo_canvas_item_remove (GOO_CANVAS_ITEM (cc));
-	return FALSE;
-}
-
 static void
 fk_table_item_weak_ref_lost (BrowserCanvasFkey *cc, BrowserCanvasTable *old_table_item)
 {
@@ -384,8 +377,6 @@ update_items (BrowserCanvasFkey *cc)
 	cc->priv->shapes = browser_canvas_canvas_shapes_remove_obsolete_shapes (cc->priv->shapes);
 }
 
-static void popup_delete_cb (GtkMenuItem *mitem, BrowserCanvasFkey *cc);
-
 /*
  * item is for a single FK constraint
  */
@@ -467,13 +458,6 @@ single_item_button_press_event_cb (GooCanvasItem *ci, GooCanvasItem *target_item
 	*/
 }
 
-
-static void
-popup_delete_cb (GtkMenuItem *mitem, BrowserCanvasFkey *cc)
-{
-	TO_IMPLEMENT;
-}
-
 static void
 table_item_moved_cb (GooCanvasItem *table, BrowserCanvasFkey *cc)
 {
diff --git a/tools/browser/canvas/browser-canvas-utility.c b/tools/browser/canvas/browser-canvas-utility.c
index 4435b3c..bead0fa 100644
--- a/tools/browser/canvas/browser-canvas-utility.c
+++ b/tools/browser/canvas/browser-canvas-utility.c
@@ -21,8 +21,6 @@
 #include <math.h>
 #include <string.h>
 
-static gchar *points_to_path (GooCanvasPoints *points);
-
 static gboolean compute_intersect_rect_line (gdouble rectx1, gdouble recty1, gdouble rectx2, gdouble recty2,
 					     gdouble P1x, gdouble P1y, gdouble P2x, gdouble P2y,
 					     gdouble *R1x, gdouble *R1y, gdouble *R2x, gdouble *R2y);
@@ -726,28 +724,6 @@ browser_canvas_util_compute_handle_shapes (GooCanvasItem *parent, GSList *shapes
 	return retval;
 }
 
-static gchar *
-points_to_path (GooCanvasPoints *points)
-{
-	GString *string;
-	gchar *path;
-	gint i;
-
-	g_return_val_if_fail (points, NULL);
-	g_return_val_if_fail (points->num_points >= 2, NULL);
-
-	string = g_string_new ("");
-	g_string_append_printf (string, "M%d %d", (int) points->coords[0], (int) points->coords[1]);
-
-	for (i = 1; i < points->num_points; i++)
-		g_string_append_printf (string, " L%d %d", 
-					(int) points->coords[2*i], (int) points->coords[2*i+1]);
-
-	path = string->str;
-	g_string_free (string, FALSE);
-	return path;
-}
-
 static GSList *
 browser_canvas_canvas_shape_add_to_list (GSList *list, gchar *swallow_id, GooCanvasItem *item)
 {
diff --git a/tools/browser/canvas/browser-canvas.c b/tools/browser/canvas/browser-canvas.c
index 60cd720..5c7019a 100644
--- a/tools/browser/canvas/browser-canvas.c
+++ b/tools/browser/canvas/browser-canvas.c
@@ -222,7 +222,7 @@ drag_data_received_cb (BrowserCanvas *canvas, GdkDragContext *context,
 	GooCanvasItem *item;
 	item = goo_canvas_get_item_at (gcanvas, x, y, TRUE);
 	if (item) {
-		g_print ("Dragged into %s\n", G_OBJECT_TYPE_NAME (item));
+		/*g_print ("Dragged into %s\n", G_OBJECT_TYPE_NAME (item));*/
 		gtk_drag_finish (context, TRUE, FALSE, time);
 	}
 	else {
@@ -988,11 +988,10 @@ browser_canvas_perform_auto_layout (BrowserCanvas *canvas, gboolean animate, Bro
 		gvLayout (gvc, graph, "circo");
 		break;
 	}
-        gvRender (gvc, graph, "dot", NULL);
+        /*gvRender (gvc, graph, "dot", NULL);*/
 	/*gvRenderFilename (gvc, graph, "png", "out.png");*/
         /*gvRender (gvc, graph, "dot", stdout);*/
 
-
 	for (list = nodes_list; list; list = list->next) {
 		NodeLayout *nl = (NodeLayout*) list->data;
 		nl->end_x = ND_coord_i (nl->node).x - (nl->width / 2.);
diff --git a/tools/browser/common/gdaui-data-import.c b/tools/browser/common/gdaui-data-import.c
index ac27544..f96d3fa 100644
--- a/tools/browser/common/gdaui-data-import.c
+++ b/tools/browser/common/gdaui-data-import.c
@@ -294,6 +294,7 @@ gdaui_data_import_init (GdauiDataImport * import)
 
 /**
  * gdaui_data_import_new
+ *
  * Creates a new #GdauiDataImport widget. After import, a #GdaDataModel will be created.
  *
  * Returns: the new widget
diff --git a/tools/browser/common/objects-cloud.c b/tools/browser/common/objects-cloud.c
index 66d99ad..a5b6e47 100644
--- a/tools/browser/common/objects-cloud.c
+++ b/tools/browser/common/objects-cloud.c
@@ -134,6 +134,16 @@ objects_cloud_get_type (void)
 	return type;
 }
 
+static gint
+dbo_sort (GdaMetaDbObject *dbo1, GdaMetaDbObject *dbo2)
+{
+	gint res;
+	res = g_strcmp0 (dbo1->obj_schema, dbo2->obj_schema);
+	if (res)
+		return - res;
+	return - g_strcmp0 (dbo1->obj_name, dbo2->obj_name);
+}
+
 typedef struct {
 	gchar *schema;
 	GtkTextMark *mark;
@@ -179,6 +189,8 @@ update_display (ObjectsCloud *cloud)
 		goto out;
 	}
 	dbo_list = g_slist_reverse (gda_meta_struct_get_all_db_objects (mstruct));
+	list = g_slist_sort (dbo_list, (GCompareFunc) dbo_sort);
+	dbo_list = list;
 	for (list = dbo_list; list; list = list->next) {
 		GdaMetaDbObject *dbo = GDA_META_DB_OBJECT (list->data);
 		GSList *list;
diff --git a/tools/browser/common/ui-formgrid.c b/tools/browser/common/ui-formgrid.c
index 8ed4e08..edc3adb 100644
--- a/tools/browser/common/ui-formgrid.c
+++ b/tools/browser/common/ui-formgrid.c
@@ -42,6 +42,7 @@ static void ui_formgrid_get_property (GObject *object,
 struct _UiFormGridPriv
 {
 	GtkWidget   *nb;
+	GtkWidget   *sw;
 	GtkWidget   *raw_form;
 	GtkWidget   *raw_grid;
 	GtkWidget   *info;
@@ -140,9 +141,15 @@ ui_formgrid_init (UiFormGrid *formgrid)
 	gtk_widget_show (formgrid->priv->raw_grid);
 
 	/* form on the 2nd page of the notebook */
+	formgrid->priv->sw = gtk_scrolled_window_new (NULL, NULL);
+	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (formgrid->priv->sw), GTK_SHADOW_NONE);
+	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (formgrid->priv->sw), GTK_POLICY_AUTOMATIC,
+					GTK_POLICY_AUTOMATIC);
 	formgrid->priv->raw_form = gdaui_raw_form_new (NULL);
+	gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (formgrid->priv->sw), formgrid->priv->raw_form);
 	gdaui_data_proxy_column_show_actions (GDAUI_DATA_PROXY (formgrid->priv->raw_form), -1, FALSE);
-	gtk_notebook_append_page (GTK_NOTEBOOK (formgrid->priv->nb), formgrid->priv->raw_form, NULL);
+	gtk_notebook_append_page (GTK_NOTEBOOK (formgrid->priv->nb), formgrid->priv->sw, NULL);
+        gtk_widget_show (formgrid->priv->sw);
         gtk_widget_show (formgrid->priv->raw_form);
 
 	/* info widget and toggle button at last */
diff --git a/tools/browser/data-manager/DataSourceEdition.dia b/tools/browser/data-manager/DataSourceEdition.dia
new file mode 100644
index 0000000..97ca7af
Binary files /dev/null and b/tools/browser/data-manager/DataSourceEdition.dia differ
diff --git a/tools/browser/data-manager/Makefile.am b/tools/browser/data-manager/Makefile.am
index 7548c98..f9e130a 100644
--- a/tools/browser/data-manager/Makefile.am
+++ b/tools/browser/data-manager/Makefile.am
@@ -34,6 +34,8 @@ libperspective_la_SOURCES = \
 	ui-spec-editor.h \
 	data-manager-perspective.h \
 	data-manager-perspective.c \
+	data-source-editor.h \
+	data-source-editor.c \
 	data-source-manager.h \
 	data-source-manager.c
 
diff --git a/tools/browser/data-manager/data-console.c b/tools/browser/data-manager/data-console.c
index 84244fa..b930b8c 100644
--- a/tools/browser/data-manager/data-console.c
+++ b/tools/browser/data-manager/data-console.c
@@ -37,12 +37,13 @@
 #include <libgda/sql-parser/gda-sql-parser.h>
 #include <libgda-ui/libgda-ui.h>
 #include "data-source-manager.h"
+#include <gdk/gdkkeysyms.h>
 
 #define MAIN_PAGE_EDITORS 0
 #define MAIN_PAGE_DATA 1
 
-#define EDITOR_PAGE_XML 0
-#define EDITOR_PAGE_UI 1
+#define EDITOR_PAGE_XML 1
+#define EDITOR_PAGE_UI 0
 
 typedef enum {
 	LAYOUT_HORIZ,
@@ -78,6 +79,11 @@ struct _DataConsolePrivate {
         GtkWidget *popup_container; /* to enter canvas's name */
         GtkWidget *name_entry;
         GtkWidget *real_save_button;
+
+	GtkWidget *clear_xml_button;
+	GtkWidget *add_source_button;
+	GtkWidget *add_source_menu;
+	gpointer   add_source_menu_index; /* used to know if @add_source_menu needs to be rebuilt */
 };
 
 static void data_console_class_init (DataConsoleClass *klass);
@@ -85,8 +91,11 @@ static void data_console_init       (DataConsole *dconsole, DataConsoleClass *kl
 static void data_console_dispose    (GObject *object);
 static void data_console_show_all   (GtkWidget *widget);
 static void data_console_grab_focus (GtkWidget *widget);
+static gboolean key_press_event     (GtkWidget *widget, GdkEventKey *event);
+
 
 static void data_source_mgr_changed_cb (DataSourceManager *mgr, DataConsole *dconsole);
+static void data_source_source_changed_cb (DataSourceManager *mgr, DataSource *source, DataConsole *dconsole);
 
 /* BrowserPage interface */
 static void                 data_console_page_init (BrowserPageIface *iface);
@@ -94,12 +103,6 @@ static GtkActionGroup      *data_console_page_get_actions_group (BrowserPage *pa
 static const gchar         *data_console_page_get_actions_ui (BrowserPage *page);
 static GtkWidget           *data_console_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button);
 
-enum {
-	DUMMY,
-	LAST_SIGNAL
-};
-
-static guint data_console_signals[LAST_SIGNAL] = { };
 static GObjectClass *parent_class = NULL;
 
 /*
@@ -115,6 +118,7 @@ data_console_class_init (DataConsoleClass *klass)
 
 	GTK_WIDGET_CLASS (klass)->show_all = data_console_show_all;
 	GTK_WIDGET_CLASS (klass)->grab_focus = data_console_grab_focus;
+	GTK_WIDGET_CLASS (klass)->key_press_event = key_press_event;
 	object_class->dispose = data_console_dispose;
 }
 
@@ -137,6 +141,25 @@ data_console_grab_focus (GtkWidget *widget)
 	gtk_widget_grab_focus (GTK_WIDGET (dconsole->priv->xml_sped));
 }
 
+static gboolean
+key_press_event (GtkWidget *widget, GdkEventKey *event)
+{
+	DataConsole *dconsole;
+	dconsole = DATA_CONSOLE (widget);
+	if ((event->keyval == GDK_Escape) &&
+	    (gtk_notebook_get_current_page (GTK_NOTEBOOK (dconsole->priv->main_notebook)) == MAIN_PAGE_DATA)) {
+		if (dconsole->priv->agroup) {
+			GtkAction *action;
+			action = gtk_action_group_get_action (dconsole->priv->agroup, "ComposeMode");
+			gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
+			return TRUE;
+		}
+	}
+
+	/* parent class */
+	return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
+}
+
 static void
 data_console_page_init (BrowserPageIface *iface)
 {
@@ -161,6 +184,8 @@ data_console_dispose (GObject *object)
 
 	/* free memory */
 	if (dconsole->priv) {
+		if (dconsole->priv->add_source_menu)
+			gtk_widget_destroy (dconsole->priv->add_source_menu);
 		if (dconsole->priv->params_form)
 			gtk_widget_destroy (dconsole->priv->params_form);
 		if (dconsole->priv->popup_container)
@@ -173,6 +198,9 @@ data_console_dispose (GObject *object)
 			g_signal_handlers_disconnect_by_func (dconsole->priv->mgr,
 							      G_CALLBACK (data_source_mgr_changed_cb),
 							      dconsole);
+			g_signal_handlers_disconnect_by_func (dconsole->priv->mgr,
+							      G_CALLBACK (data_source_source_changed_cb),
+							      dconsole);
 			g_object_unref (dconsole->priv->mgr);
 		}
 		g_free (dconsole->priv);
@@ -228,6 +256,7 @@ data_console_new_with_fav_id (BrowserConnection *bcnc, gint fav_id)
 }
 
 static void editor_clear_clicked_cb (GtkButton *button, DataConsole *dconsole);
+static void add_source_clicked_cb (GtkButton *button, DataConsole *dconsole);
 static void variables_clicked_cb (GtkToggleButton *button, DataConsole *dconsole);
 static void execute_clicked_cb (GtkButton *button, DataConsole *dconsole);
 #ifdef HAVE_GDU
@@ -252,8 +281,10 @@ data_console_new (BrowserConnection *bcnc)
 
 	dconsole->priv->bcnc = g_object_ref (bcnc);
 	dconsole->priv->mgr = data_source_manager_new (bcnc);
-	g_signal_connect (dconsole->priv->mgr, "changed",
+	g_signal_connect (dconsole->priv->mgr, "list-changed",
 			  G_CALLBACK (data_source_mgr_changed_cb), dconsole);
+	g_signal_connect (dconsole->priv->mgr, "source-changed",
+			  G_CALLBACK (data_source_source_changed_cb), dconsole);
 	
 	/* header */
         GtkWidget *hbox, *label, *wid;
@@ -334,25 +365,36 @@ data_console_new (BrowserConnection *bcnc)
 	gtk_notebook_set_show_border (GTK_NOTEBOOK (nb), FALSE);
 	dconsole->priv->editors_notebook = nb;
 
-	dconsole->priv->xml_sped = xml_spec_editor_new (dconsole->priv->mgr);
-	gtk_notebook_append_page (GTK_NOTEBOOK (dconsole->priv->editors_notebook),
-				  dconsole->priv->xml_sped, NULL);
-
 	dconsole->priv->ui_sped = ui_spec_editor_new (dconsole->priv->mgr);
+	gtk_widget_show (dconsole->priv->ui_sped);
 	gtk_notebook_append_page (GTK_NOTEBOOK (dconsole->priv->editors_notebook),
 				  dconsole->priv->ui_sped, NULL);
 
+	dconsole->priv->xml_sped = xml_spec_editor_new (dconsole->priv->mgr);
+	gtk_widget_show (dconsole->priv->xml_sped);
+	gtk_notebook_append_page (GTK_NOTEBOOK (dconsole->priv->editors_notebook),
+				  dconsole->priv->xml_sped, NULL);
+
 	/* buttons */
 	GtkWidget *bbox, *button;
 	bbox = gtk_vbutton_box_new ();
 	gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
 	gtk_box_pack_start (GTK_BOX (hbox), bbox, FALSE, FALSE, 5);
 
-	button = browser_make_small_button (FALSE, _("Clear"), GTK_STOCK_CLEAR, _("Clear the editor's\ncontents"));
+	button = browser_make_small_button (FALSE, _("Reset"), GTK_STOCK_CLEAR,
+					    _("Reset the editor's\ncontents"));
+	dconsole->priv->clear_xml_button = button;
 	gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
 	g_signal_connect (button, "clicked",
 			  G_CALLBACK (editor_clear_clicked_cb), dconsole);
 
+	button = browser_make_small_button (FALSE, _("Add"), GTK_STOCK_ADD,
+					    _("Add a new data source"));
+	dconsole->priv->add_source_button = button;
+	gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
+	g_signal_connect (button, "clicked",
+			  G_CALLBACK (add_source_clicked_cb), dconsole);
+
 	button = browser_make_small_button (TRUE, _("Variables"), NULL, _("Show variables needed"));
 	gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
 	dconsole->priv->params_toggle = GTK_TOGGLE_BUTTON (button);
@@ -368,7 +410,7 @@ data_console_new (BrowserConnection *bcnc)
 	button = browser_make_small_button (TRUE, _("View XML"), NULL, _("View specifications\n"
 									 "as XML (advanced)"));
 	gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
+	spec_editor_toggled_cb (GTK_TOGGLE_BUTTON (button), dconsole);
 	g_signal_connect (button, "toggled",
 			  G_CALLBACK (spec_editor_toggled_cb), dconsole);
 
@@ -422,8 +464,22 @@ data_console_new (BrowserConnection *bcnc)
 "        SELECT distinct c.name, o.creation_date, o.delivery_date FROM customers c INNER JOIN orders o ON (o.customer=c.id) INNER JOIN order_contents oc ON (oc.order_id=o.id) INNER JOIN products p ON (oc product_ref=##products ref::string)\n" \
 "    </query>\n" \
 "</data>"
+#undef DEFAULT_XML
 
-	//xml_spec_editor_set_xml_text (XML_SPEC_EDITOR (dconsole->priv->xml_sped), DEFAULT_XML);
+
+#define DEFAULT_XML \
+"<data>\n" \
+"    <!--\n\n" \
+"    <table name=\"\"/>\n" \
+"        <depend foreign_key_table=\"\"/>\n" \
+"    </table>\n" \
+"    <query title=\"\" id=\"\">\n" \
+"        SELECT ...\n" \
+"    </query>\n\n" \
+"    -->\n" \
+"</data>"
+
+	xml_spec_editor_set_xml_text (XML_SPEC_EDITOR (dconsole->priv->xml_sped), DEFAULT_XML);
 
 	gtk_widget_grab_focus (dconsole->priv->xml_sped);
 	return (GtkWidget*) dconsole;
@@ -584,8 +640,22 @@ variables_clicked_cb (GtkToggleButton *button, DataConsole *dconsole)
 static void
 spec_editor_toggled_cb (GtkToggleButton *button, DataConsole *dconsole)
 {
+	gint display;
+	display = gtk_toggle_button_get_active (button) ? EDITOR_PAGE_XML : EDITOR_PAGE_UI;
 	gtk_notebook_set_current_page (GTK_NOTEBOOK (dconsole->priv->editors_notebook),
-				       (gtk_toggle_button_get_active (button) ? EDITOR_PAGE_XML : EDITOR_PAGE_UI));
+				       display);
+	switch (display) {
+	case EDITOR_PAGE_XML:
+		gtk_widget_set_sensitive (dconsole->priv->clear_xml_button, TRUE);
+		gtk_widget_set_sensitive (dconsole->priv->add_source_button, FALSE);
+		break;
+	case EDITOR_PAGE_UI:
+		gtk_widget_set_sensitive (dconsole->priv->clear_xml_button, FALSE);
+		gtk_widget_set_sensitive (dconsole->priv->add_source_button, TRUE);
+		break;
+	default:
+		g_assert_not_reached ();
+	}
 }
 
 static void
@@ -599,6 +669,12 @@ param_activated_cb (GdauiBasicForm *form, DataConsole *dconsole)
 }
 
 static void
+data_source_source_changed_cb (DataSourceManager *mgr, DataSource *source, DataConsole *dconsole)
+{
+	data_source_mgr_changed_cb (mgr, dconsole);
+}
+
+static void
 data_source_mgr_changed_cb (DataSourceManager *mgr, DataConsole *dconsole)
 {
 	if (dconsole->priv->params_form) {
@@ -624,44 +700,135 @@ data_source_mgr_changed_cb (DataSourceManager *mgr, DataConsole *dconsole)
 	gtk_container_add (GTK_CONTAINER (dconsole->priv->params_form_box),
 			   dconsole->priv->params_form);
 	gtk_widget_show (dconsole->priv->params_form);
-
-	/* force showing variables */
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dconsole->priv->params_toggle), show_variables);
 }
 
 static void
 editor_clear_clicked_cb (GtkButton *button, DataConsole *dconsole)
 {
-	xml_spec_editor_set_xml_text (XML_SPEC_EDITOR (dconsole->priv->xml_sped), "");
+	xml_spec_editor_set_xml_text (XML_SPEC_EDITOR (dconsole->priv->xml_sped), DEFAULT_XML);
 	gtk_widget_grab_focus (dconsole->priv->xml_sped);
 }
 
-static GtkWidget *
-create_widget (DataConsole *dconsole, GArray *sources_array, GError **error)
+static void
+add_source_mitem_activated_cb (GtkMenuItem *mitem, DataConsole *dconsole)
 {
-	GtkWidget *sw, *vp, *dwid;
+	const gchar *table;
+	DataSource *source;
+	gchar *str;
+	GSList *list;
 
-	if (! sources_array) {
-		g_set_error (error, 0, 0,
-			     _("No data source defined"));
-		return NULL;
-	}
+	table = (gchar*) g_object_get_data ((GObject*) mitem, "_table");
 
-	sw = gtk_scrolled_window_new (NULL, NULL);
-	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
-					GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_NONE);
+	source = data_source_new (dconsole->priv->bcnc, DATA_SOURCE_UNKNOWN);
+	list = (GSList*) data_source_manager_get_sources (dconsole->priv->mgr);
+	str = g_strdup_printf (_("source%d"), g_slist_length (list) + 1);
+	data_source_set_id (source, str);
+	g_free (str);
+	if (table)
+		data_source_set_table (source, table, NULL);
+	else
+		data_source_set_query (source, "SELECT", NULL);
+	data_source_manager_add_source (dconsole->priv->mgr, source);
+	ui_spec_editor_select_source (UI_SPEC_EDITOR (dconsole->priv->ui_sped), source);
+	g_object_unref (source);
+}
+
+static gint
+dbo_sort (GdaMetaDbObject *dbo1, GdaMetaDbObject *dbo2)
+{
+	gint res;
+	res = g_strcmp0 (dbo1->obj_schema, dbo2->obj_schema);
+	if (res)
+		return - res;
+	return g_strcmp0 (dbo1->obj_name, dbo2->obj_name);
+}
+
+static void
+add_source_clicked_cb (GtkButton *button, DataConsole *dconsole)
+{
+	GdaMetaStruct *mstruct;
+	mstruct = browser_connection_get_meta_struct (dconsole->priv->bcnc);
+
+	if (dconsole->priv->add_source_menu &&
+	    (dconsole->priv->add_source_menu_index != (gpointer) mstruct)) {
+		gtk_widget_destroy (dconsole->priv->add_source_menu);
+		dconsole->priv->add_source_menu = NULL;
+		dconsole->priv->add_source_menu_index = NULL;
+	}
+	if (dconsole->priv->add_source_menu) {
+		gtk_menu_popup (GTK_MENU (dconsole->priv->add_source_menu), NULL, NULL,
+			NULL, NULL, 0,
+			gtk_get_current_event_time ());
+		return;
+	}
 
-	vp = gtk_viewport_new (NULL, NULL);
-	gtk_viewport_set_shadow_type (GTK_VIEWPORT (vp), GTK_SHADOW_NONE);
-	gtk_container_add (GTK_CONTAINER (sw), vp);
+	GtkWidget *menu, *mitem, *submenu = NULL;
+	menu = gtk_menu_new ();
+	mitem = gtk_menu_item_new_with_label (_("Data source from query"));
+	g_signal_connect (mitem, "activate",
+			  G_CALLBACK (add_source_mitem_activated_cb), dconsole);
+	gtk_widget_show (mitem);
+	gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
+
+	if (mstruct) {
+		gboolean sep_added = FALSE;
+		GSList *dbo_list, *list;
+		gchar *current_schema = NULL;
+
+		dbo_list = gda_meta_struct_get_all_db_objects (mstruct);
+		list = g_slist_sort (dbo_list, (GCompareFunc) dbo_sort);
+		dbo_list = list;
+		for (list = dbo_list; list; list = list->next) {
+			GdaMetaDbObject *dbo = GDA_META_DB_OBJECT (list->data);
+			gchar *str;
+			if (dbo->obj_type != GDA_META_DB_TABLE)
+				continue;
+			if (! sep_added) {
+				mitem = gtk_separator_menu_item_new ();
+				gtk_widget_show (mitem);
+				gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
+				sep_added = TRUE;
+			}
 
-	dwid = data_widget_new (sources_array);
-	gtk_container_add (GTK_CONTAINER (vp), dwid);
-	g_object_set_data ((GObject*) sw, "data-widget", dwid);
+			if (!strcmp (dbo->obj_short_name, dbo->obj_full_name)) {
+				gboolean schema_changed = TRUE;
+				if (!current_schema)
+					current_schema = g_strdup (dbo->obj_schema);
+				else if (strcmp (current_schema, dbo->obj_schema)) {
+					g_free (current_schema);
+					current_schema = g_strdup (dbo->obj_schema);
+				}
+				else
+					schema_changed = FALSE;
+
+				if (schema_changed) {
+					str = g_strdup_printf (_("In schema %s"), current_schema);
+					mitem = gtk_menu_item_new_with_label (str);
+					gtk_widget_show (mitem);
+					g_free (str);
+					gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
+					submenu = gtk_menu_new ();
+					gtk_menu_item_set_submenu (GTK_MENU_ITEM (mitem), submenu);
+				}
+			}
 
-	gtk_widget_show_all (vp);
-	return sw;
+			str = g_strdup_printf (_("For table: %s"), dbo->obj_name);
+			mitem = gtk_menu_item_new_with_label (str);
+			g_object_set_data_full ((GObject*) mitem, "_table",
+						g_strdup (dbo->obj_short_name), g_free);
+			g_signal_connect (mitem, "activate",
+					  G_CALLBACK (add_source_mitem_activated_cb), dconsole);
+			gtk_widget_show (mitem);
+			gtk_menu_shell_append (GTK_MENU_SHELL (submenu ? submenu : menu), mitem);
+		}
+		g_slist_free (dbo_list);
+		g_free (current_schema);
+	}
+	dconsole->priv->add_source_menu_index = (gpointer) mstruct;
+	dconsole->priv->add_source_menu = menu;
+	gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
+			NULL, NULL, 0,
+			gtk_get_current_event_time ());
 }
 
 /*
@@ -672,6 +839,11 @@ compose_mode_toggled_cb (GtkToggleAction *action, DataConsole *dconsole)
 {
 	gint pagenb;
 
+	/* show variables if necessary */
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dconsole->priv->params_toggle),
+				      dconsole->priv->params_form &&
+				      GDAUI_IS_BASIC_FORM (dconsole->priv->params_form) ? TRUE : FALSE);
+
 	if (dconsole->priv->toggling) {
 		dconsole->priv->toggling = FALSE;
 		return;
@@ -680,42 +852,45 @@ compose_mode_toggled_cb (GtkToggleAction *action, DataConsole *dconsole)
 	pagenb = gtk_notebook_get_current_page (GTK_NOTEBOOK (dconsole->priv->main_notebook));
 	if (pagenb == MAIN_PAGE_EDITORS) {
 		/* Get Data sources */
-		GArray *sources_array;
-		GError *lerror = NULL;
-		sources_array = data_source_manager_get_sources_array (dconsole->priv->mgr, &lerror);
-		if (sources_array) {
-			if (dconsole->priv->data) {
-				/* destroy existing data widgets */
-				gtk_widget_destroy (dconsole->priv->data);
-				dconsole->priv->data = NULL;
-			}
-
-			GtkWidget *wid;
-			wid = create_widget (dconsole, sources_array, &lerror);
-			data_source_manager_destroy_sources_array (sources_array);
-			if (wid) {
-				dconsole->priv->data = wid;
-				gtk_box_pack_start (GTK_BOX (dconsole->priv->data_box), wid, TRUE, TRUE, 0);
-				gtk_widget_show (wid);
-				pagenb = MAIN_PAGE_DATA;
-			}
-		}
-		if (lerror) {
-			browser_show_error ((GtkWindow*) gtk_widget_get_toplevel ((GtkWidget*) dconsole),
-					    lerror && lerror->message ? lerror->message :
-					    _("Error parsing XML specifications"));
-			g_clear_error (&lerror);
-		}
-		if (pagenb == MAIN_PAGE_EDITORS) {
-			dconsole->priv->toggling = TRUE;
-			gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
+		pagenb = MAIN_PAGE_DATA;
+		if (dconsole->priv->data) {
+			/* destroy existing data widgets */
+			gtk_widget_destroy (dconsole->priv->data);
+			dconsole->priv->data = NULL;
 		}
+
+		GtkWidget *sw, *vp, *dwid;
+		
+		sw = gtk_scrolled_window_new (NULL, NULL);
+		gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+						GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+		gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_NONE);
+		
+		vp = gtk_viewport_new (NULL, NULL);
+		gtk_viewport_set_shadow_type (GTK_VIEWPORT (vp), GTK_SHADOW_NONE);
+		gtk_container_add (GTK_CONTAINER (sw), vp);
+		
+		dwid = data_widget_new (dconsole->priv->mgr);
+		gtk_container_add (GTK_CONTAINER (vp), dwid);
+		g_object_set_data ((GObject*) sw, "data-widget", dwid);
+		
+		gtk_widget_show_all (vp);
+
+		dconsole->priv->data = sw;
+		gtk_box_pack_start (GTK_BOX (dconsole->priv->data_box), sw, TRUE, TRUE, 0);
+		gtk_widget_show (sw);
 	}
 	else {
 		/* simply change the current page */
 		pagenb = MAIN_PAGE_EDITORS;
 	}
 
+	if (pagenb == MAIN_PAGE_DATA)
+		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 "
+						     "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 2c18077..b533397 100644
--- a/tools/browser/data-manager/data-favorite-selector.c
+++ b/tools/browser/data-manager/data-favorite-selector.c
@@ -445,9 +445,7 @@ static gboolean tree_store_drag_can_drag_cb (GdauiTreeStore *store, const gchar
 					     DataFavoriteSelector *tsel);
 static gboolean tree_store_drag_get_cb (GdauiTreeStore *store, const gchar *path,
 					GtkSelectionData *selection_data, DataFavoriteSelector *tsel);
-static void trash_data_received_cb (GtkWidget *widget, GdkDragContext *context, gint x, gint y,
-				    GtkSelectionData *selection_data, guint target_type, guint time,
-				    DataFavoriteSelector *tsel);
+
 /**
  * data_favorite_selector_new
  *
diff --git a/tools/browser/data-manager/data-manager-perspective.c b/tools/browser/data-manager/data-manager-perspective.c
index 7ad4b7b..a6ef899 100644
--- a/tools/browser/data-manager/data-manager-perspective.c
+++ b/tools/browser/data-manager/data-manager-perspective.c
@@ -249,15 +249,34 @@ fav_selection_changed_cb (GtkWidget *widget, gint fav_id, BrowserFavoritesType f
 {
 	/* find or create page for this favorite */
         GtkWidget *page_contents;
-	gint current_page;
+	gint current_page, npages, i;
 	DataConsole *page_to_reuse = NULL;
 
 	if (fav_type != BROWSER_FAVORITES_DATA_MANAGERS)
 		return;
 
+	/* change current page if possible */
+	npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (perspective->priv->notebook));
+	for (i = 0; i < npages; i++) {
+		page_contents = gtk_notebook_get_nth_page (GTK_NOTEBOOK (perspective->priv->notebook),
+							   i);
+		
+		if (IS_DATA_CONSOLE (page_contents)) {
+			gchar *text;
+			text = data_console_get_text (DATA_CONSOLE (page_contents));
+			if (text && selection && !strcmp (text, selection)) {
+				gtk_notebook_set_current_page (GTK_NOTEBOOK (perspective->priv->notebook),
+							       i);
+				return;
+			}
+		}
+	}
+
+	/* create a new page, or reuse the current empty one */
 	current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (perspective->priv->notebook));
 	if (current_page >= 0) {
-		page_contents = gtk_notebook_get_nth_page (GTK_NOTEBOOK (perspective->priv->notebook), current_page);
+		page_contents = gtk_notebook_get_nth_page (GTK_NOTEBOOK (perspective->priv->notebook),
+							   current_page);
 		
 		if (IS_DATA_CONSOLE (page_contents)) {
 			gchar *text;
diff --git a/tools/browser/data-manager/data-source-editor.c b/tools/browser/data-manager/data-source-editor.c
new file mode 100644
index 0000000..cf51da4
--- /dev/null
+++ b/tools/browser/data-manager/data-source-editor.c
@@ -0,0 +1,429 @@
+/*
+ * Copyright (C) 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
+ * 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 <string.h>
+#include <glib/gi18n-lib.h>
+#include "data-source-editor.h"
+
+/* signals */
+enum {
+	CHANGED,
+	LAST_SIGNAL
+};
+
+gint data_source_editor_signals [LAST_SIGNAL] = { 0 };
+
+/* 
+ * Main static functions 
+ */
+static void data_source_editor_class_init (DataSourceEditorClass *klass);
+static void data_source_editor_init (DataSourceEditor *editor);
+static void data_source_editor_dispose (GObject *object);
+
+static void attribute_changed_cb (GdaSet *set, GdaHolder *holder, DataSourceEditor *editor);
+
+/* get a pointer to the parents to be able to call their destructor */
+static GObjectClass  *parent_class = NULL;
+
+struct _DataSourceEditorPrivate {
+	DataSource *source;
+        GdaSet *attributes;
+	GdauiBasicForm *form;
+	GtkTextBuffer *tbuffer;
+};
+
+GType
+data_source_editor_get_type (void)
+{
+	static GType type = 0;
+
+	if (G_UNLIKELY (type == 0)) {
+		static GStaticMutex registering = G_STATIC_MUTEX_INIT;
+		static const GTypeInfo info = {
+			sizeof (DataSourceEditorClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) data_source_editor_class_init,
+			NULL,
+			NULL,
+			sizeof (DataSourceEditor),
+			0,
+			(GInstanceInitFunc) data_source_editor_init
+		};
+
+		
+		g_static_mutex_lock (&registering);
+		if (type == 0)
+			type = g_type_register_static (GTK_TYPE_VBOX, "DataSourceEditor", &info, 0);
+		g_static_mutex_unlock (&registering);
+	}
+	return type;
+}
+
+static void
+data_source_editor_class_init (DataSourceEditorClass *klass)
+{
+	GObjectClass   *object_class = G_OBJECT_CLASS (klass);
+	parent_class = g_type_class_peek_parent (klass);
+
+	/* signals */
+	/*data_source_editor_signals [CHANGED] =
+                g_signal_new ("changed",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (DataSourceEditorClass, changed),
+                              NULL, NULL,
+                              _dm_marshal_VOID__VOID, G_TYPE_NONE, 0);*/
+
+	object_class->dispose = data_source_editor_dispose;
+}
+
+static void
+data_source_editor_init (DataSourceEditor *editor)
+{
+	GtkWidget *vpaned;
+	editor->priv = g_new0 (DataSourceEditorPrivate, 1);
+	editor->priv->attributes = gda_set_new_inline (4,
+						       "id", G_TYPE_STRING, "",
+						       "descr", G_TYPE_STRING, "",
+						       "table", G_TYPE_STRING, "",
+						       "sql", G_TYPE_STRING, "");
+	g_signal_connect (editor->priv->attributes, "holder-changed",
+			  G_CALLBACK (attribute_changed_cb), editor);
+
+	vpaned = gtk_vpaned_new ();
+	gtk_box_pack_start (GTK_BOX (editor), vpaned, TRUE, TRUE, 0);
+	gtk_widget_show (vpaned);
+
+	GtkWidget *form;
+	form = gdaui_basic_form_new (editor->priv->attributes);
+	editor->priv->form = GDAUI_BASIC_FORM (form);
+	gtk_paned_add1 (GTK_PANED (vpaned), form);
+	gtk_widget_show (form);
+
+	GdaHolder *holder;
+	GValue *value;
+	holder = gda_set_get_holder (editor->priv->attributes, "id");
+	g_object_set ((GObject*) holder, "name", _("Id"),
+		      "description",
+		      _("Data source's ID\n"
+			"(as referenced by other data sources)"), NULL);
+	gdaui_basic_form_entry_set_editable (GDAUI_BASIC_FORM (form), holder, FALSE);
+
+	holder = gda_set_get_holder (editor->priv->attributes, "descr");
+	g_object_set ((GObject*) holder, "name", _("Description"),
+		      "description", _("Data source's description"), NULL);
+
+	holder = gda_set_get_holder (editor->priv->attributes, "table");
+	g_object_set ((GObject*) holder, "name", _("Table"),
+		      "description", _("Table to display data from, leave empty\n"
+				       "to specify a SELECT statement instead"), NULL);
+
+	holder = gda_set_get_holder (editor->priv->attributes, "sql");
+	g_object_set ((GObject*) holder, "name", _("SELECT\nSQL"),
+		      "description", _("Actual SQL executed\nto select data"), NULL);
+	value = gda_value_new_from_string ("text:PROG_LANG=gda-sql", G_TYPE_STRING);
+        gda_holder_set_attribute_static (holder, GDAUI_ATTRIBUTE_PLUGIN, value);
+        gda_value_free (value);
+
+	GtkWidget *hbox, *label, *sw, *text;
+	GtkSizeGroup *sg;
+	hbox = gtk_hbox_new (FALSE, 0);
+	gtk_paned_add2 (GTK_PANED (vpaned), hbox);
+
+	label = gtk_label_new (_("Dependencies:"));
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+	sg = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+	gtk_size_group_add_widget (sg, label);
+	gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (form), sg, GDAUI_BASIC_FORM_LABELS);
+	g_object_unref ((GObject*) sg);
+
+	sw = gtk_scrolled_window_new (NULL, NULL);
+        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC,
+                                        GTK_POLICY_AUTOMATIC);
+	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_NONE);
+        gtk_box_pack_start (GTK_BOX (hbox), sw, TRUE, TRUE, 0);
+
+	editor->priv->tbuffer = gtk_text_buffer_new (NULL);
+	text = gtk_text_view_new_with_buffer (editor->priv->tbuffer);
+	sg = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+	gtk_size_group_add_widget (sg, sw);
+	gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (form), sg, GDAUI_BASIC_FORM_ENTRIES);
+	g_object_unref ((GObject*) sg);
+
+	gtk_container_add (GTK_CONTAINER (sw), text);
+	gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text), GTK_WRAP_WORD);
+        gtk_text_view_set_editable (GTK_TEXT_VIEW (text), FALSE);
+        gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (text), FALSE);
+	gtk_text_buffer_create_tag (editor->priv->tbuffer, "section",
+                                    "weight", PANGO_WEIGHT_BOLD, NULL);
+
+	gtk_widget_show_all (hbox);
+}
+
+static void
+data_source_editor_dispose (GObject *object)
+{
+	DataSourceEditor *editor;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (IS_DATA_SOURCE_EDITOR (object));
+
+	editor = DATA_SOURCE_EDITOR (object);
+	if (editor->priv) {
+		if (editor->priv->tbuffer)
+			g_object_unref ((GObject*) editor->priv->tbuffer);
+		if (editor->priv->source)
+			g_object_unref (editor->priv->source);
+		if (editor->priv->attributes) {
+			g_signal_handlers_disconnect_by_func (editor->priv->attributes,
+							      G_CALLBACK (attribute_changed_cb), editor);
+
+			g_object_unref (editor->priv->attributes);
+		}
+
+		g_free (editor->priv);
+		editor->priv = NULL;
+	}
+
+	/* parent class */
+	parent_class->dispose (object);
+}
+
+/**
+ * data_source_editor_new
+ *
+ * Creates a new #DataSourceEditor widget
+ *
+ * Returns: a new widget
+ */
+GtkWidget *
+data_source_editor_new (void)
+{
+	DataSourceEditor *editor;
+
+	editor = DATA_SOURCE_EDITOR (g_object_new (DATA_SOURCE_EDITOR_TYPE, NULL));
+
+	return (GtkWidget*) editor;
+}
+
+static void
+update_dependencies_display (DataSourceEditor *editor)
+{
+	GtkTextIter start, end;
+	GtkTextBuffer *tbuffer;
+
+	tbuffer = editor->priv->tbuffer;
+        gtk_text_buffer_get_start_iter (tbuffer, &start);
+        gtk_text_buffer_get_end_iter (tbuffer, &end);
+        gtk_text_buffer_delete (tbuffer, &start, &end);
+	gtk_text_buffer_get_start_iter (tbuffer, &start);
+
+	if (editor->priv->source) {
+		GdaSet *import;
+		import = data_source_get_import ( editor->priv->source);
+		gtk_text_buffer_insert_with_tags_by_name (tbuffer, &start,
+							  _("Requires:"), -1,
+							  "section", NULL);
+		gtk_text_buffer_insert (tbuffer, &start, "\n", -1);
+		if (import && import->holders) {
+			GSList *list;
+			for (list = import->holders; list; list = list->next) {
+				gtk_text_buffer_insert (tbuffer, &start,
+							gda_holder_get_id (GDA_HOLDER (list->data)), -1);
+				gtk_text_buffer_insert (tbuffer, &start, "\n", -1);
+			}
+		}
+		else 
+			gtk_text_buffer_insert (tbuffer, &start, "--\n", -1);
+
+		GArray *export;
+		export = data_source_get_export_names ( editor->priv->source);
+		gtk_text_buffer_insert_with_tags_by_name (tbuffer, &start,
+							  _("Exports:"), -1,
+							  "section", NULL);
+		gtk_text_buffer_insert (tbuffer, &start, "\n", -1);
+		if (export) {
+			gint i;
+			for (i = 0; i < export->len ; i++) {
+				gchar *tmp;
+				tmp = g_array_index (export, gchar *, i);
+				gtk_text_buffer_insert (tbuffer, &start, tmp, -1);
+				gtk_text_buffer_insert (tbuffer, &start, "\n", -1);
+			}
+		}
+		else
+			gtk_text_buffer_insert (tbuffer, &start, "--\n", -1);
+	}
+}
+
+/**
+ * data_source_editor_display_source
+ * @editor: a #DataSourceEditor widget
+ * @source: the #DataSource for which properties are displayed, or %NULL
+ *
+ * Update @editor's display with @source's properties
+ */
+void
+data_source_editor_display_source (DataSourceEditor *editor, DataSource *source)
+{
+	g_return_if_fail (IS_DATA_SOURCE_EDITOR (editor));
+	g_return_if_fail (! source || IS_DATA_SOURCE (source));
+	GdaStatement *stmt;
+	gchar *sql = NULL;
+
+	g_signal_handlers_block_by_func (editor->priv->attributes,
+					 G_CALLBACK (attribute_changed_cb), editor);
+
+	/* other variables */
+	if (editor->priv->source)
+		g_object_unref (editor->priv->source);
+	if (source) {
+		editor->priv->source = g_object_ref (source);
+		g_assert (gda_set_set_holder_value (editor->priv->attributes, NULL,
+						    "id", data_source_get_id (source)));
+		g_assert (gda_set_set_holder_value (editor->priv->attributes, NULL,
+						    "descr", data_source_get_title (source)));
+		g_assert (gda_set_set_holder_value (editor->priv->attributes, NULL,
+						    "table", data_source_get_table (source)));
+		stmt = data_source_get_statement (source);
+		if (stmt)
+			sql = gda_statement_to_sql_extended (stmt, NULL, NULL,
+							     GDA_STATEMENT_SQL_PRETTY | GDA_STATEMENT_SQL_PARAMS_SHORT,
+							     NULL, NULL);
+		g_assert (gda_set_set_holder_value (editor->priv->attributes, NULL, "sql", sql));
+		g_free (sql);
+		
+		switch (data_source_get_source_type (source)) {
+		case DATA_SOURCE_TABLE:
+			gdaui_basic_form_entry_set_editable (editor->priv->form,
+							     gda_set_get_holder (editor->priv->attributes, "sql"),
+							     FALSE);
+			break;
+		case DATA_SOURCE_SELECT:
+			gdaui_basic_form_entry_set_editable (editor->priv->form,
+							     gda_set_get_holder (editor->priv->attributes, "sql"),
+							     TRUE);
+			break;
+		default:
+			g_assert_not_reached ();
+			break;
+		}
+		
+	}
+	else {
+		editor->priv->source = NULL;
+		g_assert (gda_set_set_holder_value (editor->priv->attributes, NULL,
+						    "id", NULL));
+		g_assert (gda_set_set_holder_value (editor->priv->attributes, NULL,
+						    "descr", NULL));
+		g_assert (gda_set_set_holder_value (editor->priv->attributes, NULL,
+						    "table", NULL));
+		g_assert (gda_set_set_holder_value (editor->priv->attributes, NULL,
+						    "sql", NULL));
+	}
+	gtk_widget_set_sensitive (GTK_WIDGET (editor), source ? TRUE : FALSE);
+
+	g_signal_handlers_unblock_by_func (editor->priv->attributes,
+					   G_CALLBACK (attribute_changed_cb), editor);
+
+	/* dependencies */
+	update_dependencies_display (editor);
+}
+
+static void
+attribute_changed_cb (GdaSet *set, GdaHolder *holder, DataSourceEditor *editor)
+{
+	const gchar *id, *str = NULL;
+	const GValue *cvalue;
+
+	if (! editor->priv->source)
+		return;
+
+	g_signal_handlers_block_by_func (editor->priv->attributes,
+					 G_CALLBACK (attribute_changed_cb), editor);
+
+	id = gda_holder_get_id (holder);
+	cvalue = gda_holder_get_value (holder);
+	if (G_VALUE_TYPE (cvalue) == G_TYPE_STRING)
+		str = g_value_get_string (cvalue);
+
+	g_assert (id);
+	if (!strcmp (id, "id")) {
+		data_source_set_id (editor->priv->source, str);
+	}
+	else if (!strcmp (id, "descr")) {
+		data_source_set_title (editor->priv->source, str);
+	}
+	else if (!strcmp (id, "table")) {
+		GdaHolder *holder;
+		holder = gda_set_get_holder (editor->priv->attributes, "sql");
+
+		if (!str || !*str) {
+			GdaStatement *stmt;
+			gchar *sql = NULL;
+
+			stmt = data_source_get_statement (editor->priv->source);
+			if (stmt)
+				sql = gda_statement_to_sql_extended (stmt, NULL, NULL,
+								     GDA_STATEMENT_SQL_PRETTY |
+								     GDA_STATEMENT_SQL_PARAMS_SHORT,
+								     NULL, NULL);
+			data_source_set_query (editor->priv->source, sql, NULL);
+			g_free (sql);
+			gdaui_basic_form_entry_set_editable (editor->priv->form, holder, TRUE);
+		}
+		else {
+			data_source_set_table (editor->priv->source, str, NULL);
+			gdaui_basic_form_entry_set_editable (editor->priv->form, holder, FALSE);
+
+			GdaStatement *stmt;
+			gchar *sql = NULL;
+
+			stmt = data_source_get_statement (editor->priv->source);
+			if (stmt)
+				sql = gda_statement_to_sql_extended (stmt, NULL, NULL,
+								     GDA_STATEMENT_SQL_PRETTY |
+								     GDA_STATEMENT_SQL_PARAMS_SHORT,
+								     NULL, NULL);
+			g_assert (gda_holder_set_value_str (holder, NULL, sql, NULL));
+			g_free (sql);
+		}
+	}
+	else if (!strcmp (id, "sql")) {
+		data_source_set_query (editor->priv->source, str, NULL);
+		update_dependencies_display (editor);
+	}
+	else
+		g_assert_not_reached ();
+
+	g_signal_handlers_unblock_by_func (editor->priv->attributes,
+					   G_CALLBACK (attribute_changed_cb), editor);
+}
+
+/**
+ * data_source_editor_set_editable
+ */
+void
+data_source_editor_set_readonly (DataSourceEditor *editor)
+{
+	gdaui_basic_form_entry_set_editable (editor->priv->form, NULL,
+					     FALSE);
+}
diff --git a/tools/browser/data-manager/data-source-editor.h b/tools/browser/data-manager/data-source-editor.h
new file mode 100644
index 0000000..4cbdf2e
--- /dev/null
+++ b/tools/browser/data-manager/data-source-editor.h
@@ -0,0 +1,61 @@
+/* 
+ * Copyright (C) 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
+ * 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 __DATA_SOURCE_EDITOR_H_
+#define __DATA_SOURCE_EDITOR_H_
+
+#include "data-source.h"
+
+G_BEGIN_DECLS
+
+#define DATA_SOURCE_EDITOR_TYPE          (data_source_editor_get_type())
+#define DATA_SOURCE_EDITOR(obj)          G_TYPE_CHECK_INSTANCE_CAST (obj, data_source_editor_get_type(), DataSourceEditor)
+#define DATA_SOURCE_EDITOR_CLASS(klass)  G_TYPE_CHECK_CLASS_CAST (klass, data_source_editor_get_type (), DataSourceEditorClass)
+#define IS_DATA_SOURCE_EDITOR(obj)       G_TYPE_CHECK_INSTANCE_TYPE (obj, data_source_editor_get_type ())
+
+typedef struct _DataSourceEditor DataSourceEditor;
+typedef struct _DataSourceEditorClass DataSourceEditorClass;
+typedef struct _DataSourceEditorPrivate DataSourceEditorPrivate;
+
+/* struct for the object's data */
+struct _DataSourceEditor
+{
+	GtkVBox                  object;
+	DataSourceEditorPrivate *priv;
+};
+
+/* struct for the object's class */
+struct _DataSourceEditorClass
+{
+	GtkVBoxClass             parent_class;
+
+	/* signals */
+	/*void             (*changed) (DataSourceEditor *mgr);*/
+};
+
+GType         data_source_editor_get_type            (void) G_GNUC_CONST;
+
+GtkWidget    *data_source_editor_new                 (void);
+void          data_source_editor_display_source      (DataSourceEditor *editor, DataSource *source);
+void          data_source_editor_set_readonly        (DataSourceEditor *editor);
+
+G_END_DECLS
+
+#endif
diff --git a/tools/browser/data-manager/data-source-manager.c b/tools/browser/data-manager/data-source-manager.c
index ebabcc1..c5ba40e 100644
--- a/tools/browser/data-manager/data-source-manager.c
+++ b/tools/browser/data-manager/data-source-manager.c
@@ -33,11 +33,12 @@
 
 /* signals */
 enum {
-	CHANGED,
+	LIST_CHANGED,
+	SOURCE_CHANGED,
 	LAST_SIGNAL
 };
 
-gint data_source_manager_signals [LAST_SIGNAL] = { 0 };
+gint data_source_manager_signals [LAST_SIGNAL] = { 0, 0 };
 
 /* 
  * Main static functions 
@@ -46,6 +47,8 @@ static void data_source_manager_class_init (DataSourceManagerClass *klass);
 static void data_source_manager_init (DataSourceManager *mgr);
 static void data_source_manager_dispose (GObject *object);
 
+static void ensure_source_unique_id (DataSourceManager *mgr, DataSource *source);
+
 /* get a pointer to the parents to be able to call their destructor */
 static GObjectClass  *parent_class = NULL;
 
@@ -53,6 +56,7 @@ struct _DataSourceManagerPrivate {
 	BrowserConnection *bcnc;
 	GSList *sources_list;
         GdaSet *params; /* execution params */
+	gboolean emit_changes;
 };
 
 GType
@@ -90,13 +94,23 @@ data_source_manager_class_init (DataSourceManagerClass *klass)
 	parent_class = g_type_class_peek_parent (klass);
 
 	/* signals */
-	data_source_manager_signals [CHANGED] =
-                g_signal_new ("changed",
+	data_source_manager_signals [LIST_CHANGED] =
+                g_signal_new ("list-changed",
                               G_TYPE_FROM_CLASS (object_class),
                               G_SIGNAL_RUN_FIRST,
-                              G_STRUCT_OFFSET (DataSourceManagerClass, changed),
+                              G_STRUCT_OFFSET (DataSourceManagerClass, list_changed),
                               NULL, NULL,
                               _dm_marshal_VOID__VOID, G_TYPE_NONE, 0);
+	data_source_manager_signals [SOURCE_CHANGED] =
+                g_signal_new ("source-changed",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (DataSourceManagerClass, source_changed),
+                              NULL, NULL,
+                              _dm_marshal_VOID__OBJECT, G_TYPE_NONE, 1, DATA_SOURCE_TYPE);
+
+	klass->list_changed = NULL;
+	klass->source_changed = NULL;
 
 	object_class->dispose = data_source_manager_dispose;
 }
@@ -105,6 +119,64 @@ static void
 data_source_manager_init (DataSourceManager *mgr)
 {
 	mgr->priv = g_new0 (DataSourceManagerPrivate, 1);
+	mgr->priv->emit_changes = TRUE;
+}
+
+/*
+ * find_data_source
+ *
+ * Finds a data source which id is @id, exclusing @excl_source if not %NULL
+ */
+static DataSource *
+find_data_source (DataSourceManager *mgr, const gchar *id, DataSource *excl_source)
+{
+	GSList *list;
+	g_return_val_if_fail (id && *id, NULL);
+	for (list = mgr->priv->sources_list; list; list = list->next) {
+		DataSource *source = (DataSource *) list->data;
+		if (excl_source && (source == excl_source))
+			continue;
+		const gchar *sid = data_source_get_id (source);
+		if (!sid) {
+			g_warning ("Data source has no ID!");
+			continue;
+		}
+		if (!strcmp (id, sid))
+			return source;
+	}
+	return NULL;
+}
+
+static void
+source_changed_cb (DataSource *source, DataSourceManager *mgr)
+{
+	ensure_source_unique_id (mgr, source);
+	g_signal_emit (mgr, data_source_manager_signals[SOURCE_CHANGED], 0, source);
+}
+
+static void
+ensure_source_unique_id (DataSourceManager *mgr, DataSource *source)
+{
+	/* make sure the source's ID is unique among @mgr's data sources */
+	DataSource *es;
+	es = find_data_source (mgr, data_source_get_id (source), source);
+	if (es) {
+		gint i;
+		for (i = 1; ; i++) {
+			gchar *tmp;
+			tmp = g_strdup_printf ("%s_%d", data_source_get_id (source), i);
+			if (! find_data_source (mgr, tmp, NULL)) {
+				g_signal_handlers_block_by_func (source,
+								 G_CALLBACK (source_changed_cb), mgr);
+				data_source_set_id (source, tmp);
+				g_signal_handlers_unblock_by_func (source,
+								   G_CALLBACK (source_changed_cb), mgr);
+				g_free (tmp);
+				break;
+			}
+			g_free (tmp);
+		}
+	}
 }
 
 static void
@@ -121,7 +193,13 @@ data_source_manager_dispose (GObject *object)
 			g_object_unref (mgr->priv->params);
 
 		if (mgr->priv->sources_list) {
-			g_slist_foreach (mgr->priv->sources_list, (GFunc) g_object_unref, NULL);
+			GSList *list;
+			for (list = mgr->priv->sources_list; list; list = list->next) {
+				g_signal_handlers_disconnect_by_func (list->data,
+								      G_CALLBACK (source_changed_cb), mgr);
+				g_object_unref ((GObject*) list->data);
+
+			}
 			g_slist_free (mgr->priv->sources_list);
 			mgr->priv->sources_list = NULL;
 		}
@@ -177,6 +255,9 @@ source_depends_on (DataSource *source1, DataSource *source2)
 	GSList *holders;
 	GHashTable *export_columns;
 	export_columns = data_source_get_export_columns (source2);
+	if (!export_columns)
+		return FALSE;
+
 	for (holders = import->holders; holders; holders = holders->next) {
 		GdaHolder *holder = (GdaHolder*) holders->data;
 		if (GPOINTER_TO_INT (g_hash_table_lookup (export_columns, gda_holder_get_id (holder))) >= 1) {
@@ -200,6 +281,8 @@ source_depends_on (DataSource *source1, DataSource *source2)
  * data_source_manager_add_source
  * @mgr:
  * @source:
+ *
+ * @source is referenced by @mgr
  */
 void
 data_source_manager_add_source (DataSourceManager *mgr, DataSource *source)
@@ -212,6 +295,7 @@ data_source_manager_add_source (DataSourceManager *mgr, DataSource *source)
 #ifdef DEBUG_SOURCES_SORT
 	g_print ("Adding source [%s]\n", data_source_get_title (source));
 #endif
+	ensure_source_unique_id (mgr, source);
 	if (! mgr->priv->sources_list)
 		mgr->priv->sources_list = g_slist_append (NULL, g_object_ref (source));
 	else {
@@ -265,43 +349,50 @@ data_source_manager_add_source (DataSourceManager *mgr, DataSource *source)
 			}
 		}
 	}
-	g_signal_emit (mgr, data_source_manager_signals[CHANGED], 0);
+	if (mgr->priv->emit_changes)
+		g_signal_emit (mgr, data_source_manager_signals[LIST_CHANGED], 0);
+
+	g_signal_connect (source, "changed",
+			  G_CALLBACK (source_changed_cb), mgr);
 
 #ifdef DEBUG_SOURCES_SORT
 	g_print ("Sources in manager:\n");
-#endif
 	GSList *list;
 	gint i;
 	for (i = 0, list = mgr->priv->sources_list; list; list = list->next, i++) {
 		DataSource *source = DATA_SOURCE (list->data);
-#ifdef DEBUG_SOURCES_SORT
 		g_print ("\t %d ... %s\n", i, 
 			 data_source_get_title (source));
-#endif
 	}
-#ifdef DEBUG_SOURCES_SORT
 	g_print ("\n");
 #endif
 }
 
 /**
- * data_source_manager_remove_all
- * @mgr:
+ * data_source_manager_replace_all
+ * @mgr: a #DataSourceManager object
+ * @sources_list: a list of #DataSource objects, or %NULL
+ *
+ * Replaces all the data sources by the ones in @sources_list.
  */
 void
-data_source_manager_remove_all (DataSourceManager *mgr)
+data_source_manager_replace_all (DataSourceManager *mgr, const GSList *sources_list)
 {
+	const GSList *list;
 	g_return_if_fail (IS_DATA_SOURCE_MANAGER (mgr));
 
-	if (mgr->priv->sources_list) {
-		GSList *list;
-		list = mgr->priv->sources_list;
-		mgr->priv->sources_list = NULL;
-		g_signal_emit (mgr, data_source_manager_signals[CHANGED], 0);
+	mgr->priv->emit_changes = FALSE;
 
-		g_slist_foreach (list, (GFunc) g_object_unref, NULL);
-		g_slist_free (list);
-	}
+	/* remove any existing data source */
+	for (; mgr->priv->sources_list; )
+		data_source_manager_remove_source (mgr,
+						   DATA_SOURCE (mgr->priv->sources_list->data));
+
+	for (list = sources_list; list; list = list->next)
+		data_source_manager_add_source (mgr, DATA_SOURCE (list->data));
+
+	mgr->priv->emit_changes = TRUE;
+	g_signal_emit (mgr, data_source_manager_signals[LIST_CHANGED], 0);
 }
 
 /**
@@ -316,8 +407,11 @@ data_source_manager_remove_source (DataSourceManager *mgr, DataSource *source)
 	g_return_if_fail (IS_DATA_SOURCE (source));
 
 	g_return_if_fail (g_slist_find (mgr->priv->sources_list, source));
+	g_signal_handlers_disconnect_by_func (source,
+					      G_CALLBACK (source_changed_cb), mgr);
 	mgr->priv->sources_list = g_slist_remove (mgr->priv->sources_list, source);
-	g_signal_emit (mgr, data_source_manager_signals[CHANGED], 0);
+	if (mgr->priv->emit_changes)
+		g_signal_emit (mgr, data_source_manager_signals[LIST_CHANGED], 0);
 	g_object_unref (source);
 }
 
@@ -537,3 +631,14 @@ data_source_manager_get_browser_cnc (DataSourceManager *mgr)
 	g_return_val_if_fail (IS_DATA_SOURCE_MANAGER (mgr), NULL);
 	return mgr->priv->bcnc;
 }
+
+/**
+ * data_source_manager_get_sources
+ * @mgr:
+ */
+const GSList *
+data_source_manager_get_sources (DataSourceManager *mgr)
+{
+	g_return_val_if_fail (IS_DATA_SOURCE_MANAGER (mgr), NULL);
+	return mgr->priv->sources_list;
+}
diff --git a/tools/browser/data-manager/data-source-manager.h b/tools/browser/data-manager/data-source-manager.h
index c5d320c..02bd50d 100644
--- a/tools/browser/data-manager/data-source-manager.h
+++ b/tools/browser/data-manager/data-source-manager.h
@@ -48,7 +48,8 @@ struct _DataSourceManagerClass
 	GObjectClass       parent_class;
 
 	/* signals */
-	void             (*changed) (DataSourceManager *mgr);
+	void             (*list_changed) (DataSourceManager *mgr);
+	void             (*source_changed) (DataSourceManager *mgr, DataSource *source);
 };
 
 GType               data_source_manager_get_type            (void) G_GNUC_CONST;
@@ -56,7 +57,7 @@ GType               data_source_manager_get_type            (void) G_GNUC_CONST;
 DataSourceManager  *data_source_manager_new                 (BrowserConnection *bcnc);
 void                data_source_manager_add_source          (DataSourceManager *mgr, DataSource *source);
 void                data_source_manager_remove_source       (DataSourceManager *mgr, DataSource *source);
-void                data_source_manager_remove_all          (DataSourceManager *mgr);
+void                data_source_manager_replace_all         (DataSourceManager *mgr, const GSList *sources_list);
 
 GdaSet              *data_source_manager_get_params (DataSourceManager *mgr);
 BrowserConnection   *data_source_manager_get_browser_cnc (DataSourceManager *mgr);
@@ -64,6 +65,8 @@ BrowserConnection   *data_source_manager_get_browser_cnc (DataSourceManager *mgr
 GArray              *data_source_manager_get_sources_array (DataSourceManager *mgr, GError **error);
 void                 data_source_manager_destroy_sources_array (GArray *array);
 
+const GSList        *data_source_manager_get_sources       (DataSourceManager *mgr);
+
 
 G_END_DECLS
 
diff --git a/tools/browser/data-manager/data-source.c b/tools/browser/data-manager/data-source.c
index 74cfdfe..4f33de6 100644
--- a/tools/browser/data-manager/data-source.c
+++ b/tools/browser/data-manager/data-source.c
@@ -29,15 +29,18 @@
 #include "../common/ui-formgrid.h"
 
 #include "data-source.h"
+#define DEFAULT_DATA_SOURCE_NAME "DataSource"
+#define DEPENDENCY_SEPARATOR "<|>"
 
 /* signals */
 enum {
+	CHANGED,
 	EXEC_STARTED,
 	EXEC_FINISHED,
 	LAST_SIGNAL
 };
 
-gint data_source_signals [LAST_SIGNAL] = {0, 0};
+gint data_source_signals [LAST_SIGNAL] = {0, 0, 0};
 
 /* 
  * Main static functions 
@@ -46,22 +49,103 @@ static void data_source_class_init (DataSourceClass *klass);
 static void data_source_init (DataSource *source);
 static void data_source_dispose (GObject *object);
 
+
+static void update_export_information (DataSource *source);
+static void compute_stmt_and_params (DataSource *source);
+static void compute_import_params (DataSource *source);
+
+
 /* get a pointer to the parents to be able to call their destructor */
 static GObjectClass  *parent_class = NULL;
 
+typedef struct {
+	gchar *dep_id;
+	gchar *dep_table;
+	gchar *dep_columns; /* column names, separated by a |, sorted */
+} Dependency;
+
+static void
+dependency_free (Dependency *dep)
+{
+	g_free (dep->dep_id);
+	g_free (dep->dep_table);
+	g_free (dep->dep_columns);
+	g_free (dep);
+}
+
+/*
+ * converts an array of column names into a single string in the format:
+ * <colname>[SEP<colname>...] where SEP is DEPENDENCY_SEPARATOR
+ * 
+ * Returns: a new string, never %NULL
+ */
+static gchar *
+column_names_to_string (gint size, const gchar **colnames)
+{
+	if (!colnames)
+		return g_strdup ("");
+
+	GString *string = NULL;
+	GArray *colsarray;
+	gint i;
+	colsarray = g_array_new (FALSE, FALSE, sizeof (gchar*));
+	for (i = 0; i < size; i++)
+		g_array_append_val (colsarray, colnames[i]);
+	g_array_sort (colsarray, (GCompareFunc) g_strcmp0);
+	for (i = 0; i < size; i++) {
+		gchar *tmp;
+		tmp = g_array_index (colsarray, gchar *, i);
+		if (!string)
+			string = g_string_new (tmp);
+		else {
+			g_string_append (string, DEPENDENCY_SEPARATOR);
+			g_string_append (string, tmp);
+		}
+	}
+	g_array_free (colsarray, TRUE);
+	return g_string_free (string, FALSE);
+}
+
+static Dependency *
+dependency_find (GSList *dep_list, const gchar *id, const gchar *table, gint size, const gchar **colnames)
+{
+	GSList *list;
+	gchar *colsstring = NULL;
+	for (list = dep_list; list; list = list->next) {
+		Dependency *dep = (Dependency*) list->data;
+		if (strcmp (dep->dep_id, id) || strcmp (dep->dep_table, table))
+			continue;
+
+		if (!colsstring)
+			colsstring = column_names_to_string (size, colnames);
+		if (!strcmp (colsstring, dep->dep_columns)) {
+			g_free (colsstring);
+			return dep;
+		}
+	}
+	g_free (colsstring);
+	return NULL;
+}
+
 struct _DataSourcePrivate {
 	BrowserConnection *bcnc;
 	gchar             *title;
+	gchar             *impl_title;
 	gchar             *id;
+	DataSourceType     source_type;
+
 	GError            *init_error;
 	GArray            *export_names; /* array of strings, memory allocated in export_columns */
 	GHashTable        *export_columns; /* key = export name, value = column number */
 
-	gchar             *select_sql;
 	guint              exec_id;
 	gboolean           executing;
 	gboolean           exec_again;
 
+	gchar             *tablename;
+	GdaSqlBuilder     *builder;
+	GSList            *dependencies; /* list of Dependency pointers */
+
 	GdaStatement      *stmt;
 	GdaSet            *ext_params; /* "free" parameters */
 	GdaSet            *params; /* all the params used when executing @stmt */
@@ -107,6 +191,13 @@ data_source_class_init (DataSourceClass *klass)
 	parent_class = g_type_class_peek_parent (klass);
 
 	/* signals */
+	data_source_signals [CHANGED] =
+                g_signal_new ("changed",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (DataSourceClass, changed),
+                              NULL, NULL,
+                              _dm_marshal_VOID__VOID, G_TYPE_NONE, 0);
 	data_source_signals [EXEC_STARTED] =
                 g_signal_new ("execution-started",
                               G_TYPE_FROM_CLASS (object_class),
@@ -121,6 +212,7 @@ data_source_class_init (DataSourceClass *klass)
                               G_STRUCT_OFFSET (DataSourceClass, execution_finished),
                               NULL, NULL,
                               _dm_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER);
+        klass->changed = NULL;
         klass->execution_started = NULL;
         klass->execution_finished = NULL;
 
@@ -131,7 +223,9 @@ static void
 data_source_init (DataSource *source)
 {
 	source->priv = g_new0 (DataSourcePrivate, 1);
+	source->priv->id = g_strdup (DEFAULT_DATA_SOURCE_NAME);
 	source->priv->bcnc = NULL;
+	source->priv->source_type = DATA_SOURCE_UNKNOWN;
 	source->priv->need_rerun = FALSE;
 	source->priv->exec_id = 0;
 	source->priv->executing = FALSE;
@@ -155,6 +249,61 @@ ext_params_changed_cb (GdaSet *params, GdaHolder *holder, DataSource *source)
 }
 
 static void
+data_source_reset (DataSource *source)
+{
+	source->priv->source_type = DATA_SOURCE_UNKNOWN;
+	g_clear_error (& source->priv->init_error);
+
+	if (source->priv->builder) {
+		g_object_unref (source->priv->builder);
+		source->priv->builder = NULL;
+	}
+	if (source->priv->stmt) {
+		g_object_unref (source->priv->stmt);
+		source->priv->stmt = NULL;
+	}
+	if (source->priv->params) {
+		g_signal_handlers_disconnect_by_func (source->priv->params,
+						      G_CALLBACK (params_changed_cb), source);
+		g_object_unref (source->priv->params);
+		source->priv->params = NULL;
+	}
+	if (source->priv->ext_params) {
+		g_signal_handlers_disconnect_by_func (source->priv->ext_params,
+						      G_CALLBACK (ext_params_changed_cb),
+						      source);
+		g_object_unref (source->priv->ext_params);
+		source->priv->ext_params = NULL;
+	}
+	
+	if (source->priv->tablename) {
+		g_free (source->priv->tablename);
+		source->priv->tablename = NULL;
+	}
+	
+	if (source->priv->dependencies) {
+		g_slist_foreach (source->priv->dependencies, (GFunc) dependency_free, NULL);
+		g_slist_free (source->priv->dependencies);
+		source->priv->dependencies = NULL;
+	}
+	
+	if (source->priv->model) {
+		g_object_unref (source->priv->model);
+		source->priv->model = NULL;
+	}
+	
+	if (source->priv->export_names) {
+		g_array_free (source->priv->export_names, TRUE);
+		source->priv->export_names = NULL;
+	}
+	
+	if (source->priv->export_columns) {
+		g_hash_table_destroy (source->priv->export_columns);
+		source->priv->export_columns = NULL;
+	}
+}
+
+static void
 data_source_dispose (GObject *object)
 {
 	DataSource *source;
@@ -166,33 +315,10 @@ data_source_dispose (GObject *object)
 	if (source->priv) {
 		if (source->priv->bcnc)
 			g_object_unref (source->priv->bcnc);
-		g_clear_error (& source->priv->init_error);
-		if (source->priv->stmt)
-			g_object_unref (source->priv->stmt);
-		if (source->priv->params) {
-			g_signal_handlers_disconnect_by_func (source->priv->params,
-							      G_CALLBACK (params_changed_cb), source);
-			g_object_unref (source->priv->params);
-		}
-		if (source->priv->ext_params) {
-			g_signal_handlers_disconnect_by_func (source->priv->ext_params,
-							      G_CALLBACK (ext_params_changed_cb),
-							      source);
-			g_object_unref (source->priv->ext_params);
-		}
-
+		data_source_reset (source);
 		g_free (source->priv->id);
 		g_free (source->priv->title);
-		g_free (source->priv->select_sql);
-
-		g_clear_error (&source->priv->exec_error);
-		if (source->priv->model)
-			g_object_unref (source->priv->model);
-		
-		if (source->priv->export_names)
-			g_array_free (source->priv->export_names, TRUE);
-		if (source->priv->export_columns)
-			g_hash_table_destroy (source->priv->export_columns);
+		g_free (source->priv->impl_title);
 
 		g_free (source->priv);
 		source->priv = NULL;
@@ -208,6 +334,27 @@ static gboolean init_from_table_node (DataSource *source, xmlNodePtr node, GErro
 /**
  * data_source_new
  * @bcnc: a #BrowserConnection
+ * @type: the new data source's requested type
+ *
+ * Returns: a new #DataSource object
+ */
+DataSource *
+data_source_new (BrowserConnection *bcnc, DataSourceType type)
+{
+	DataSource *source;
+
+	g_return_val_if_fail (BROWSER_IS_CONNECTION (bcnc), NULL);
+
+	source = DATA_SOURCE (g_object_new (DATA_SOURCE_TYPE, NULL));
+	source->priv->bcnc = g_object_ref (bcnc);
+	source->priv->source_type = type;
+
+	return source;
+}
+
+/**
+ * data_source_new_from_xml_node
+ * @bcnc: a #BrowserConnection
  * @node:
  * @error:
  *
@@ -228,11 +375,13 @@ data_source_new_from_xml_node (BrowserConnection *bcnc, xmlNodePtr node, GError
 	xmlChar *prop;
 	prop = xmlGetProp (node, BAD_CAST "title");
 	if (prop) {
+		g_free (source->priv->title);
 		source->priv->title = g_strdup ((gchar*) prop);
 		xmlFree (prop);
 	}
 	prop = xmlGetProp (node, BAD_CAST "id");
 	if (prop) {
+		g_free (source->priv->id);
 		source->priv->id = g_strdup ((gchar*) prop);
 		xmlFree (prop);
 	}
@@ -260,97 +409,14 @@ data_source_new_from_xml_node (BrowserConnection *bcnc, xmlNodePtr node, GError
 static void
 init_from_query (DataSource *source, xmlNodePtr node)
 {
-	GdaSqlParser *parser;
-	const gchar *remain;
 	xmlChar *contents;
 
 #ifdef DEBUG_SOURCE
 	g_print ("%s(%s [%s])\n", __FUNCTION__, source->priv->id, source->priv->title);
 #endif
 	contents = xmlNodeGetContent (node);
-
 	g_clear_error (& source->priv->init_error);
-	parser = browser_connection_create_parser (source->priv->bcnc);
-	if (contents) {
-		source->priv->stmt = gda_sql_parser_parse_string (parser, (gchar*) contents,
-								  &remain, &source->priv->init_error);
-		xmlFree (contents);
-	}
-	g_object_unref (parser);
-
-	if (source->priv->stmt) {
-		if (remain)
-			g_set_error (& source->priv->init_error, 0, 0,
-				     _("Multiple statements detected, only the first will be used"));
-
-		/* try to normalize the statement */
-		GdaSqlStatement *sqlst;
-		g_object_get ((GObject*) source->priv->stmt, "structure", &sqlst, NULL);
-		if (browser_connection_normalize_sql_statement (source->priv->bcnc, sqlst, NULL))
-			g_object_set ((GObject*) source->priv->stmt, "structure", sqlst, NULL);
-
-		/* compute export data */
-		if (source->priv->id) {
-			if (sqlst->stmt_type == GDA_SQL_STATEMENT_SELECT) {
-				GdaSqlStatementSelect *selst;
-				selst = (GdaSqlStatementSelect*) sqlst->contents;
-				GSList *list;
-				gint i;
-				for (i = 0, list = selst->expr_list; list; i++, list = list->next) {
-					gchar *tmp;
-					if (! source->priv->export_names)
-						source->priv->export_names = g_array_new (FALSE, FALSE,
-											  sizeof (gchar*));
-					if (! source->priv->export_columns)
-						source->priv->export_columns =
-							g_hash_table_new_full (g_str_hash, g_str_equal,
-									       g_free, NULL);
-
-					tmp = g_strdup_printf ("%s %d", source->priv->id, i+1);
-					g_array_append_val (source->priv->export_names, tmp);
-					g_hash_table_insert (source->priv->export_columns, tmp,
-							     GINT_TO_POINTER (i + 1));
-#ifdef DEBUG_SOURCE
-					g_print ("\tEXPORT [%s]\n", tmp);
-#endif
-
-					GdaSqlSelectField *sf = (GdaSqlSelectField *) list->data;
-					if (sf->validity_meta_table_column) {
-						tmp = g_strdup_printf ("%s %s", source->priv->id,
-								       sf->validity_meta_table_column->column_name);
-						g_array_append_val (source->priv->export_names, tmp);
-						g_hash_table_insert (source->priv->export_columns, tmp,
-								     GINT_TO_POINTER (i + 1));
-#ifdef DEBUG_SOURCE
-						g_print ("\tEXPORT [%s]\n", tmp);
-#endif
-					}
-				}
-			}
-		}
-		gda_sql_statement_free (sqlst);
-
-		/* compute parameters */
-		source->priv->need_rerun = FALSE;
-		gda_statement_get_parameters (source->priv->stmt, &source->priv->params,
-					      &source->priv->init_error);
-		if (source->priv->params) {
-			GSList *list;
-			for (list = source->priv->params->holders; list; list = list->next) {
-				gda_holder_set_not_null (GDA_HOLDER (list->data), FALSE);
-#ifdef DEBUG_SOURCE
-				g_print ("\tIMPORT [%s]\n", gda_holder_get_id (GDA_HOLDER (list->data)));
-#endif
-			}
-
-			g_signal_connect (source->priv->params, "holder-changed",
-					  G_CALLBACK (params_changed_cb), source);
-		}
-	}
-
-#ifdef DEBUG_SOURCE
-	g_print ("\n");
-#endif
+	data_source_set_query (source, (gchar*) contents, &source->priv->init_error);
 }
 
 static GdaMetaTable *
@@ -404,6 +470,7 @@ static gboolean
 init_from_table_node (DataSource *source, xmlNodePtr node, GError **error)
 {
 	xmlChar *tname;
+	gboolean retval;
 
 #ifdef DEBUG_SOURCE
 	g_print ("%s(%s [%s])\n", __FUNCTION__, source->priv->id, source->priv->title);
@@ -415,79 +482,8 @@ init_from_table_node (DataSource *source, xmlNodePtr node, GError **error)
 			     _("Missing attribute \"name\" for table"));
 		return FALSE;
 	}
-	
-	if (! source->priv->title)
-		source->priv->title = g_strdup_printf (_("Contents of '%s'"), (gchar*) tname);
-
-	/* locate table */
-	GdaMetaTable *mtable;
-	mtable = get_meta_table (source, (gchar*) tname, error);
-	if (!mtable) {
-		xmlFree (tname);
-		return FALSE;
-	}
-
-	/* build statement */
-	GSList *list;
-	GdaSqlBuilder *b;
-	gint i;
-
-	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
-	if (! gda_sql_builder_select_add_target (b, (gchar*) tname, NULL)) {
-		g_set_error (error, 0, 0,
-			     _("Could not build SELECT statement"));
-		xmlFree (tname);
-		return FALSE;
-	}
-	gda_sql_builder_select_set_limit (b,
-					  gda_sql_builder_add_expr (b, NULL,
-								    G_TYPE_INT, DEFAULT_DATA_SELECT_LIMIT),
-					  0);
-
-	for (i = 0, list = mtable->columns; list; i++, list = list->next) {
-		GdaMetaTableColumn *mcol;
-		mcol = GDA_META_TABLE_COLUMN (list->data);
-		gda_sql_builder_select_add_field (b, mcol->column_name, NULL, NULL);
 
-		if (mcol->pkey) {
-			/* ORDER BY */
-			gda_sql_builder_select_order_by (b,
-							 gda_sql_builder_add_id (b,
-										 mcol->column_name),
-							 FALSE, NULL);
-		}
-
-		/* export value */
-		gchar *tmp;
-		if (source->priv->id)
-			tmp = g_strdup_printf ("%s %s", source->priv->id, mcol->column_name);
-		else
-			tmp = g_strdup_printf ("%s %s", (gchar*) tname, mcol->column_name);
-		if (! source->priv->export_names)
-			source->priv->export_names = g_array_new (FALSE, FALSE,
-								  sizeof (gchar*));
-		if (! source->priv->export_columns)
-			source->priv->export_columns =
-				g_hash_table_new_full (g_str_hash, g_str_equal,
-						       g_free, NULL);
-		g_array_append_val (source->priv->export_names, tmp);
-		g_hash_table_insert (source->priv->export_columns, tmp,
-				     GINT_TO_POINTER (i + 1));
-#ifdef DEBUG_SOURCE
-		g_print ("\tEXPORT [%s]\n", tmp);
-#endif
-
-		if (source->priv->id)
-			tmp = g_strdup_printf ("%s %d", source->priv->id, i + 1);
-		else
-			tmp = g_strdup_printf ("%s %d", (gchar*) tname, i + 1);
-		g_array_append_val (source->priv->export_names, tmp);
-		g_hash_table_insert (source->priv->export_columns, tmp,
-				     GINT_TO_POINTER (i + 1));
-#ifdef DEBUG_SOURCE
-		g_print ("\tEXPORT [%s]\n", tmp);
-#endif
-	}
+	retval = data_source_set_table (source, (gchar*) tname, error);
 	xmlFree (tname);
 
 	/* linking */
@@ -495,114 +491,223 @@ init_from_table_node (DataSource *source, xmlNodePtr node, GError **error)
 	for (subnode = node->children; subnode; subnode = subnode->next) {
 		if (!strcmp ((gchar*)subnode->name, "depend")) {
 			xmlChar *fk_table, *id;
-			GdaMetaTable *mlinked;
+			GArray *cols_array = NULL;
+			xmlNodePtr chnode;
 			
 			fk_table = xmlGetProp (subnode, BAD_CAST "foreign_key_table");
-			mlinked = get_meta_table (source, (gchar*) fk_table, error);
-			if (!mlinked) {
-				xmlFree (fk_table);
-				g_object_unref (b);	
-				return FALSE;
-			}
 			id = xmlGetProp (subnode, BAD_CAST "id");
-
-			/* find foreign key to linked table */
-			GdaMetaTableForeignKey *fk = NULL;
-			for (list = mtable->fk_list; list; list = list->next) {
-				if (GDA_META_TABLE_FOREIGN_KEY (list->data)->depend_on == GDA_META_DB_OBJECT (mlinked)) {
-					fk = GDA_META_TABLE_FOREIGN_KEY (list->data);
-					break;
+			for (chnode = subnode->children; chnode; chnode = chnode->next) {
+				xmlChar *colname;
+				if (strcmp ((gchar*)chnode->name, "column"))
+					continue;
+				colname = xmlNodeGetContent (chnode);
+				if (colname) {
+					if (! cols_array)
+						cols_array = g_array_new (FALSE, FALSE, sizeof (gchar*));
+					g_array_append_val (cols_array, colname);
 				}
 			}
-			if (!fk) {
-				g_set_error (error, 0, 0,
-					     _("Could not find any foreign key to \"%s\""), (gchar*) fk_table);
+
+			if (fk_table &&
+			    ! data_source_add_dependency (source, (gchar *) fk_table, (gchar*) id,
+							  cols_array ? cols_array->len : 0,
+							  (const gchar **) (cols_array ? cols_array->data : NULL),
+							  error))
+				retval = FALSE;
+			if (fk_table)
 				xmlFree (fk_table);
-				if (id) xmlFree (id);
-				g_object_unref (b);	
-				return FALSE;
+			if (id)
+				xmlFree (id);
+			if (cols_array) {
+				gint i;
+				for (i = 0; i < cols_array->len; i++) {
+					xmlChar *colname;
+					colname = g_array_index (cols_array, xmlChar*, i);
+					xmlFree (colname);
+				}
+				g_array_free (cols_array, TRUE);
 			}
-			else if (fk->cols_nb <= 0) {
-				g_set_error (error, 0, 0,
-					     _("The fields involved in the foreign key to \"%s\" are not known"),
-					     (gchar*) fk_table);
-				xmlFree (fk_table);
-				if (id) xmlFree (id);
-				g_object_unref (b);	
-				return FALSE;
+			break;
+		}
+	}
+
+	return retval;
+}
+
+/**
+ * data_source_add_dependency
+ * @source: a #DataSource
+ * @table: the name of the referenced table
+ * @id: the ID of the referenced data source, or %NULL if its ID is the same as the table name
+ * @col_name_size: the size of @col_names
+ * @col_names: names of the FK columns involved in the foreign key, or %NULL
+ * @error: a place to store errors, or %NULL
+ *
+ * Adds a dependency on the @table table, only for DATA_SOURCE_TABLE sources
+ */
+gboolean
+data_source_add_dependency (DataSource *source, const gchar *table,
+			    const char *id, gint col_name_size, const gchar **col_names,
+			    GError **error)
+{
+	g_return_val_if_fail (IS_DATA_SOURCE (source), FALSE);
+	g_return_val_if_fail (table && *table, FALSE);
+	g_return_val_if_fail (source->priv->source_type == DATA_SOURCE_TABLE, FALSE);
+	g_return_val_if_fail (source->priv->builder, FALSE);
+
+	if (dependency_find (source->priv->dependencies, id ? id : table, table, col_name_size, col_names))
+		return TRUE;
+
+	GdaMetaTable *mtable, *mlinked;
+	mtable = get_meta_table (source, source->priv->tablename, error);
+	if (!mtable)
+		return FALSE;
+
+	mlinked = get_meta_table (source, table, error);
+	if (!mlinked)
+		return FALSE;
+	
+	/* find foreign key to linked table */
+	GdaMetaTableForeignKey *fk = NULL;
+	GSList *list;
+	gboolean reverse = FALSE;
+	for (list = mtable->fk_list; list; list = list->next) {
+		if (GDA_META_TABLE_FOREIGN_KEY (list->data)->depend_on == GDA_META_DB_OBJECT (mlinked)) {
+			fk = GDA_META_TABLE_FOREIGN_KEY (list->data);
+			if (col_names && (col_name_size == fk->cols_nb)) {
+				gint i;
+				for (i = 0; i < col_name_size; i++) {
+					gint j;
+					for (j = 0; j < col_name_size; j++) {
+						if (!strcmp (col_names [i], fk->fk_names_array [j]))
+							break;
+					}
+					if (j == col_name_size) {
+						fk = NULL; /* not this FK */
+						break;
+					}
+				}
+			}
+			if (fk)
+				break;
+		}
+	}
+	if (!fk) {
+		for (list = mlinked->fk_list; list; list = list->next) {
+			if (GDA_META_TABLE_FOREIGN_KEY (list->data)->depend_on == GDA_META_DB_OBJECT (mtable)) {
+				fk = GDA_META_TABLE_FOREIGN_KEY (list->data);
+				reverse = TRUE;
+				if (col_names && (col_name_size == fk->cols_nb)) {
+					gint i;
+					for (i = 0; i < col_name_size; i++) {
+						gint j;
+						for (j = 0; j < col_name_size; j++) {
+							if (!strcmp (col_names [i],
+								     fk->fk_names_array [j]))
+								break;
+						}
+						if (j == col_name_size) {
+							fk = NULL; /* not this FK */
+							break;
+						}
+					}
+				}
+				if (fk)
+					break;
 			}
-			else if (fk->cols_nb == 1) {
-				gchar *tmp;
-				GdaMetaTableColumn *col;
-				const GdaSqlBuilderId id1 = gda_sql_builder_add_id (b, fk->fk_names_array [0]);
-				tmp = g_strdup_printf ("%s %s", id ? (gchar*) id : (gchar*) fk_table,
-						       fk->ref_pk_names_array [0]);
+		}
+	}
+	if (!fk) {
+		g_set_error (error, 0, 0,
+			     _("Could not find any foreign key to \"%s\""), table);
+		return FALSE;
+	}
+	else if (fk->cols_nb <= 0) {
+		g_set_error (error, 0, 0,
+			     _("The fields involved in the foreign key to \"%s\" are not known"),
+			     table);
+		return FALSE;
+	}
+	else if (fk->cols_nb == 1) {
+		gchar *tmp;
+		GdaMetaTableColumn *col;
+		GdaSqlBuilderId id1, id2, id_cond;
+		if (reverse) {
+			id1 = gda_sql_builder_add_id (source->priv->builder, fk->ref_pk_names_array [0]);
+			tmp = g_strdup_printf ("%s %s", id ? id : table, fk->fk_names_array [0]);
+
+			col = GDA_META_TABLE_COLUMN (g_slist_nth_data (mlinked->columns,
+								       fk->fk_cols_array [0] - 1));
+			g_assert (col);
+			id2 = gda_sql_builder_add_param (source->priv->builder, tmp, col->gtype, FALSE);
+			g_free (tmp);
+		}
+		else {
+			id1 = gda_sql_builder_add_id (source->priv->builder, fk->fk_names_array [0]);
+			tmp = g_strdup_printf ("%s %s", id ? id : table, fk->ref_pk_names_array [0]);
+			
+			col = GDA_META_TABLE_COLUMN (g_slist_nth_data (mlinked->columns,
+								       fk->ref_pk_cols_array [0] - 1));
+			g_assert (col);
+			id2 = gda_sql_builder_add_param (source->priv->builder, tmp, col->gtype, FALSE);
+			g_free (tmp);
+			id_cond = gda_sql_builder_add_cond (source->priv->builder,
+							    GDA_SQL_OPERATOR_TYPE_EQ,
+							    id1, id2, 0);
+		}
+		id_cond = gda_sql_builder_add_cond (source->priv->builder,
+						    GDA_SQL_OPERATOR_TYPE_EQ,
+						    id1, id2, 0);
+		gda_sql_builder_set_where (source->priv->builder, id_cond);
+	}
+	else {
+		gchar *tmp;
+		gint i;
+		GdaMetaTableColumn *col;
+		GdaSqlBuilderId andid;
+		GdaSqlBuilderId *op_ids;
+		GdaSqlBuilderId id1, id2;
+		op_ids = g_new (GdaSqlBuilderId, fk->cols_nb);
+		
+		for (i = 0; i < fk->cols_nb; i++) {
+			if (reverse) {
+				id1 = gda_sql_builder_add_id (source->priv->builder, fk->ref_pk_names_array [i]);
+				tmp = g_strdup_printf ("%s %s", id ? id : table, fk->fk_names_array [i]);
 
 				col = GDA_META_TABLE_COLUMN (g_slist_nth_data (mlinked->columns,
-									       fk->ref_pk_cols_array [0] - 1));
+									       fk->fk_cols_array [i] - 1));
 				g_assert (col);
-				const GdaSqlBuilderId id2 = gda_sql_builder_add_param (b, tmp, col->gtype, FALSE);
+				id2 = gda_sql_builder_add_param (source->priv->builder, tmp, col->gtype, FALSE);
 				g_free (tmp);
-				const GdaSqlBuilderId id_cond = gda_sql_builder_add_cond (b, GDA_SQL_OPERATOR_TYPE_EQ, id1, id2, 0);
-				gda_sql_builder_set_where (b, id_cond);
 			}
 			else {
-				gchar *tmp;
-				gint i;
-				GdaMetaTableColumn *col;
-				GdaSqlBuilderId andid;
-				GdaSqlBuilderId *op_ids;
-				op_ids = g_new (GdaSqlBuilderId, fk->cols_nb);
+				id1 = gda_sql_builder_add_id (source->priv->builder, fk->fk_names_array [i]);
+				tmp = g_strdup_printf ("%s %s", id ? id : table, fk->ref_pk_names_array [i]);
 				
-				for (i = 0; i < fk->cols_nb; i++) {
-					const GdaSqlBuilderId id1 = gda_sql_builder_add_id (b, fk->fk_names_array [i]);
-					tmp = g_strdup_printf ("%s %s", id ? (gchar*) id : (gchar*) fk_table,
-							       fk->ref_pk_names_array [i]);
-
-					col = GDA_META_TABLE_COLUMN (g_slist_nth_data (mlinked->columns,
-										       fk->ref_pk_cols_array [i] - 1));
-					g_assert (col);
-					const GdaSqlBuilderId id2 = gda_sql_builder_add_param (b, tmp, col->gtype, FALSE);
-					g_free (tmp);
-					op_ids [i] = gda_sql_builder_add_cond (b, GDA_SQL_OPERATOR_TYPE_EQ, id1, id2, 0);
-				}
-				andid = gda_sql_builder_add_cond_v (b, GDA_SQL_OPERATOR_TYPE_AND, op_ids, fk->cols_nb);
-				g_free (op_ids);
-				gda_sql_builder_set_where (b, andid);
+				col = GDA_META_TABLE_COLUMN (g_slist_nth_data (mlinked->columns,
+									       fk->ref_pk_cols_array [i] - 1));
+				g_assert (col);
+				id2 = gda_sql_builder_add_param (source->priv->builder, tmp, col->gtype, FALSE);
+				g_free (tmp);
 			}
-
-			xmlFree (fk_table);
-			if (id)
-				xmlFree (id);
-			break;
-		}
-	}
-
-	source->priv->stmt = gda_sql_builder_get_statement (b, error);
-
-	/* compute parameters */
-	gda_statement_get_parameters (source->priv->stmt, &source->priv->params,
-				      &source->priv->init_error);
-	if (source->priv->params) {
-		GSList *list;
-		for (list = source->priv->params->holders; list; list = list->next) {
-			gda_holder_set_not_null (GDA_HOLDER (list->data), FALSE);
-#ifdef DEBUG_SOURCE
-			g_print ("\tIMPORT [%s]\n", gda_holder_get_id (GDA_HOLDER (list->data)));
-#endif
+			op_ids [i] = gda_sql_builder_add_cond (source->priv->builder,
+							       GDA_SQL_OPERATOR_TYPE_EQ,
+							       id1, id2, 0);
 		}
-
-		g_signal_connect (source->priv->params, "holder-changed",
-				  G_CALLBACK (params_changed_cb), source);
+		andid = gda_sql_builder_add_cond_v (source->priv->builder, GDA_SQL_OPERATOR_TYPE_AND,
+						    op_ids, fk->cols_nb);
+		g_free (op_ids);
+		gda_sql_builder_set_where (source->priv->builder, andid);
 	}
 
-	/*g_print ("SQL [%s]\n", gda_statement_to_sql (source->priv->stmt, NULL, NULL));*/
-	g_object_unref (b);
+	Dependency *dep = g_new0 (Dependency, 1);
+	dep->dep_id = g_strdup (id ? id : table);
+	dep->dep_table = g_strdup (table);
+	dep->dep_columns = column_names_to_string (col_name_size, col_names);
+	source->priv->dependencies = g_slist_append (source->priv->dependencies, dep);
 
-#ifdef DEBUG_SOURCE
-	g_print ("\n");
-#endif
-	return source->priv->stmt ? TRUE : FALSE;
+	compute_stmt_and_params (source);
+	return TRUE;
 }
 
 
@@ -612,8 +717,63 @@ init_from_table_node (DataSource *source, xmlNodePtr node, GError **error)
 xmlNodePtr
 data_source_to_xml_node (DataSource *source)
 {
-	TO_IMPLEMENT;
-	return NULL;
+	xmlNodePtr node = NULL;
+	g_return_val_if_fail (IS_DATA_SOURCE (source), NULL);
+	switch (source->priv->source_type) {
+	case DATA_SOURCE_TABLE:
+		node = xmlNewNode (NULL, BAD_CAST "table");
+		if (g_strcmp0 (source->priv->id, source->priv->tablename))
+			xmlSetProp (node, BAD_CAST "id", BAD_CAST source->priv->id);
+		if (source->priv->title && g_strcmp0 (source->priv->title, source->priv->tablename))
+			xmlSetProp (node, BAD_CAST "title", BAD_CAST source->priv->title);
+		xmlSetProp (node, BAD_CAST "name",
+			    BAD_CAST (source->priv->tablename ? source->priv->tablename : ""));
+
+		if (source->priv->dependencies) {
+			GSList *list;
+			for (list = source->priv->dependencies; list; list = list->next) {
+				Dependency *dep = (Dependency*) list->data;
+				xmlNodePtr depnode;
+				depnode = xmlNewChild (node, NULL, BAD_CAST "depend", NULL);
+				xmlSetProp (depnode, BAD_CAST "foreign_key_table",
+					    BAD_CAST (dep->dep_table));
+				xmlSetProp (depnode, BAD_CAST "id",
+					    BAD_CAST (dep->dep_id));
+
+				gchar **array;
+				gint i;
+				array = g_strsplit (dep->dep_columns, DEPENDENCY_SEPARATOR, 0);
+				for (i = 0; array[i]; i++)
+					xmlNewChild (depnode, NULL, BAD_CAST "column", BAD_CAST (array[i]));
+				g_strfreev (array);
+			}
+		}
+		break;
+	case DATA_SOURCE_SELECT: {
+		node = xmlNewNode (NULL, BAD_CAST "query");
+		xmlSetProp (node, BAD_CAST "id", BAD_CAST source->priv->id);
+		if (source->priv->title)
+			xmlSetProp (node, BAD_CAST "title", BAD_CAST source->priv->title);
+
+		if (source->priv->stmt) {
+			gchar *sql;
+			sql = gda_statement_to_sql_extended (source->priv->stmt, NULL, NULL,
+							     GDA_STATEMENT_SQL_PRETTY |
+							     GDA_STATEMENT_SQL_PARAMS_SHORT, NULL, NULL);
+			if (sql) {
+				xmlNodeSetContent (node, BAD_CAST sql);
+				g_free (sql);
+			}
+		}
+		break;
+	}
+	default:
+		break;
+	}
+
+	if (node) {
+	}
+	return node;
 }
 
 static gboolean
@@ -725,7 +885,7 @@ data_source_set_params (DataSource *source, GdaSet *params)
 			GdaHolder *bind = NULL;
 			if (params)
 				bind = gda_set_get_holder (params, gda_holder_get_id (holder));
-			if (gda_holder_set_bind (holder, bind, NULL))
+			if ((holder != bind) && gda_holder_set_bind (holder, bind, NULL))
 				bound = TRUE;
 		}
 	}
@@ -740,7 +900,7 @@ data_source_set_params (DataSource *source, GdaSet *params)
 /**
  * data_source_get_export_names
  *
- * Returns: an array of strings, or %NULL
+ * Returns: an array of strings (don't modify) or %NULL
  */
 GArray *
 data_source_get_export_names (DataSource *source)
@@ -856,7 +1016,7 @@ data_source_create_grid (DataSource *source)
 
 	GtkWidget *fg;
 	GdauiRawGrid *grid;
-	fg = (GdauiRawGrid*) ui_formgrid_new (source->priv->model, 0);
+	fg = ui_formgrid_new (source->priv->model, 0);
 	grid = ui_formgrid_get_grid_widget (UI_FORMGRID (fg));
 
 	GList *columns, *list;
@@ -899,7 +1059,64 @@ data_source_create_grid (DataSource *source)
 }
 
 /**
+ * data_source_set_id
+ * @source: a #DataSource
+ * @id: the new source's ID, not %NULL
+ *
+ * @source MUST NOT be executed when calling this method.
+ */
+void
+data_source_set_id (DataSource *source, const gchar * id)
+{
+	g_return_if_fail (IS_DATA_SOURCE (source));
+	g_return_if_fail (! data_source_execution_going_on (source));
+	g_return_if_fail (id && *id);
+
+	g_free (source->priv->id);
+	source->priv->id = g_strdup (id);
+	update_export_information (source);
+	g_signal_emit (source, data_source_signals [CHANGED], 0);
+}
+
+
+/**
+ * data_source_get_id
+ * @source: a #DataSource
+ *
+ * Returns: the ID, or %NULL if no ID has been defined
+ */
+const gchar *
+data_source_get_id (DataSource *source)
+{
+	g_return_val_if_fail (IS_DATA_SOURCE (source), NULL);
+
+	return source->priv->id;
+}
+
+/**
+ * data_source_set_title
+ * @source: a #DataSource
+ * @title: the new source's TITLE
+ *
+ * @source MUST NOT be executed when calling this method.
+ */
+void
+data_source_set_title (DataSource *source, const gchar * title)
+{
+	g_return_if_fail (IS_DATA_SOURCE (source));
+	g_return_if_fail (! data_source_execution_going_on (source));
+
+	g_free (source->priv->title);
+	if (title)
+		source->priv->title = g_strdup (title);
+	else
+		source->priv->title = NULL;
+	g_signal_emit (source, data_source_signals [CHANGED], 0);
+}
+
+/**
  * data_source_get_title
+ * @source: a #DataSource
  */
 const gchar *
 data_source_get_title (DataSource *source)
@@ -908,10 +1125,274 @@ data_source_get_title (DataSource *source)
 
 	if (source->priv->title)
 		return source->priv->title;
-	else if (source->priv->id)
-		return source->priv->id;
+	else if (source->priv->impl_title)
+		return source->priv->impl_title;
 	else
-		return _("No name");
+		return source->priv->id;
+}
+
+static void
+update_export_information (DataSource *source)
+{
+	g_assert (source->priv->id);
+
+	/* clear previous information */
+	if (source->priv->export_names) {
+		g_array_free (source->priv->export_names, TRUE);
+		source->priv->export_names = NULL;
+	}
+	if (source->priv->export_columns) {
+		g_hash_table_destroy (source->priv->export_columns);
+		source->priv->export_columns = NULL;
+	}
+
+	if (! source->priv->stmt)
+		return;
+
+	/* Get GdaSqlStatement */
+	GdaSqlStatement *sqlst;
+	g_object_get ((GObject*) source->priv->stmt, "structure", &sqlst, NULL);
+	if (browser_connection_check_sql_statement_validify (source->priv->bcnc, sqlst, NULL))
+		g_object_set ((GObject*) source->priv->stmt, "structure", sqlst, NULL);
+	if (! sqlst)
+		return;
+
+	/* compute exported data */
+	if (sqlst->stmt_type == GDA_SQL_STATEMENT_SELECT) {
+		GdaSqlStatementSelect *selst;
+		selst = (GdaSqlStatementSelect*) sqlst->contents;
+		GSList *list;
+		gint i;
+		for (i = 0, list = selst->expr_list; list; i++, list = list->next) {
+			gchar *tmp;
+			if (! source->priv->export_names)
+				source->priv->export_names = g_array_new (FALSE, FALSE,
+									  sizeof (gchar*));
+			if (! source->priv->export_columns)
+				source->priv->export_columns =
+					g_hash_table_new_full (g_str_hash, g_str_equal,
+							       g_free, NULL);
+			
+			tmp = g_strdup_printf ("%s %d", source->priv->id, i+1);
+			g_array_append_val (source->priv->export_names, tmp);
+			g_hash_table_insert (source->priv->export_columns, tmp,
+					     GINT_TO_POINTER (i + 1));
+#ifdef DEBUG_SOURCE
+			g_print ("\tEXPORT [%s]\n", tmp);
+#endif
+			
+			GdaSqlSelectField *sf = (GdaSqlSelectField *) list->data;
+			if (sf->validity_meta_table_column) {
+				tmp = g_strdup_printf ("%s %s", source->priv->id,
+						       sf->validity_meta_table_column->column_name);
+				g_array_append_val (source->priv->export_names, tmp);
+				g_hash_table_insert (source->priv->export_columns, tmp,
+						     GINT_TO_POINTER (i + 1));
+#ifdef DEBUG_SOURCE
+				g_print ("\tEXPORT [%s]\n", tmp);
+#endif
+			}
+		}
+	}
+
+	gda_sql_statement_free (sqlst);
+}
+
+/**
+ * data_source_set_table
+ *
+ * @source MUST NOT be executed when calling this method.
+ */
+gboolean
+data_source_set_table (DataSource *source, const gchar *table, GError **error)
+{
+	g_return_val_if_fail (IS_DATA_SOURCE (source), FALSE);
+	g_return_val_if_fail (! data_source_execution_going_on (source), FALSE);
+
+	data_source_reset (source);
+	if (!table)
+		return FALSE;
+
+	/* locate table */
+	GdaMetaTable *mtable;
+	mtable = get_meta_table (source, table, error);
+	if (!mtable)
+		return FALSE;
+
+	source->priv->source_type = DATA_SOURCE_TABLE;
+	source->priv->tablename = g_strdup (table);
+
+	if (! strcmp (source->priv->id, DEFAULT_DATA_SOURCE_NAME)) {
+		g_free (source->priv->id);
+		source->priv->id = g_strdup (table);
+	}
+
+	g_free (source->priv->impl_title);
+	source->priv->impl_title = g_strdup_printf (_("Contents of '%s'"), table);
+
+	/* build statement */
+	GdaSqlBuilder *b;
+	gint i;
+	GSList *list;
+
+	b = gda_sql_builder_new (GDA_SQL_STATEMENT_SELECT);
+	source->priv->builder = b;
+	if (! gda_sql_builder_select_add_target (b, table, NULL)) {
+		g_set_error (error, 0, 0,
+			     _("Could not build SELECT statement"));
+		return FALSE;
+	}
+	gda_sql_builder_select_set_limit (b,
+					  gda_sql_builder_add_expr (b, NULL,
+								    G_TYPE_INT, DEFAULT_DATA_SELECT_LIMIT),
+					  0);
+	for (i = 0, list = mtable->columns; list; i++, list = list->next) {
+		GdaMetaTableColumn *mcol;
+		mcol = GDA_META_TABLE_COLUMN (list->data);
+		gda_sql_builder_select_add_field (b, mcol->column_name, NULL, NULL);
+
+		if (mcol->pkey) {
+			/* ORDER BY */
+			gda_sql_builder_select_order_by (b,
+							 gda_sql_builder_add_id (b,
+										 mcol->column_name),
+							 FALSE, NULL);
+		}
+	}
+
+	/* compute statement & parameters */
+	compute_stmt_and_params (source);
+	/*g_print ("SQL [%s]\n", gda_statement_to_sql (source->priv->stmt, NULL, NULL));*/
+
+	update_export_information (source);
+
+#ifdef DEBUG_SOURCE
+	g_print ("\n");
+#endif
+
+	g_signal_emit (source, data_source_signals [CHANGED], 0);
+	return source->priv->stmt ? TRUE : FALSE;
+}
+
+/**
+ * data_source_set_query
+ *
+ * @source MUST NOT be executed when calling this method.
+ */
+void
+data_source_set_query (DataSource *source, const gchar *sql, GError **warning)
+{
+	g_return_if_fail (IS_DATA_SOURCE (source));
+	g_return_if_fail (! data_source_execution_going_on (source));
+
+	data_source_reset (source);
+
+	source->priv->source_type = DATA_SOURCE_SELECT;
+	if (!sql) {
+		g_signal_emit (source, data_source_signals [CHANGED], 0);
+		return;
+	}
+
+	GdaSqlParser *parser;
+	const gchar *remain;
+	parser = browser_connection_create_parser (source->priv->bcnc);
+	source->priv->stmt = gda_sql_parser_parse_string (parser, sql,
+							  &remain, warning);
+	g_object_unref (parser);
+	if (!source->priv->stmt) {
+		g_signal_emit (source, data_source_signals [CHANGED], 0);
+		return;
+	}
+
+	if (remain)
+		g_set_error (warning, 0, 0,
+			     _("Multiple statements detected, only the first will be used"));
+
+	/* try to normalize the statement */
+	GdaSqlStatement *sqlst;
+	g_object_get ((GObject*) source->priv->stmt, "structure", &sqlst, NULL);
+	if (browser_connection_normalize_sql_statement (source->priv->bcnc, sqlst, NULL))
+		g_object_set ((GObject*) source->priv->stmt, "structure", sqlst, NULL);
+	gda_sql_statement_free (sqlst);
+	
+	update_export_information (source);
+	
+	/* compute parameters */
+	source->priv->need_rerun = FALSE;
+	compute_import_params (source);
+
+#ifdef DEBUG_SOURCE
+	g_print ("\n");
+#endif
+
+	g_signal_emit (source, data_source_signals [CHANGED], 0);
+}
+
+static void
+compute_stmt_and_params (DataSource *source)
+{
+	g_assert (source->priv->builder);
+	if (source->priv->stmt)
+		g_object_unref (source->priv->stmt);
+	source->priv->stmt = gda_sql_builder_get_statement (source->priv->builder, NULL);
+	compute_import_params (source);
+
+#ifdef DEBUG_SOURCE
+	gchar *sql;
+	sql = gda_statement_to_sql (source->priv->stmt, NULL, NULL);
+	g_print ("[%s]\n", sql);
+	g_free (sql);
+#endif
+}
+
+static void
+compute_import_params (DataSource *source)
+{
+	if (source->priv->params) {
+		g_signal_handlers_disconnect_by_func (source->priv->params,
+						      G_CALLBACK (params_changed_cb), source);
+		g_object_unref (source->priv->params);
+		source->priv->params = NULL;
+	}
+	g_clear_error (& source->priv->init_error);
+
+	gda_statement_get_parameters (source->priv->stmt, &source->priv->params,
+				      &source->priv->init_error);
+	if (source->priv->params) {
+		GSList *list;
+		for (list = source->priv->params->holders; list; list = list->next) {
+			gda_holder_set_not_null (GDA_HOLDER (list->data), FALSE);
+#ifdef DEBUG_SOURCE
+			g_print ("\tIMPORT [%s]\n", gda_holder_get_id (GDA_HOLDER (list->data)));
+#endif
+		}
+
+		g_signal_connect (source->priv->params, "holder-changed",
+				  G_CALLBACK (params_changed_cb), source);
+	}
+}
+
+/**
+ * data_source_get_table
+ * @source: a #DataSource
+ *
+ * Returns: the name of the table used by @source, if its type is %DATA_SOURCE_TABLE
+ */
+const gchar *
+data_source_get_table (DataSource *source)
+{
+	g_return_val_if_fail (IS_DATA_SOURCE (source), NULL);
+	return source->priv->tablename;	
+}
+
+/**
+ * data_source_get_source_type
+ */
+DataSourceType
+data_source_get_source_type (DataSource *source)
+{
+	g_return_val_if_fail (IS_DATA_SOURCE (source), DATA_SOURCE_UNKNOWN);
+	return source->priv->source_type;
 }
 
 /**
diff --git a/tools/browser/data-manager/data-source.h b/tools/browser/data-manager/data-source.h
index b7dd4c9..e596b99 100644
--- a/tools/browser/data-manager/data-source.h
+++ b/tools/browser/data-manager/data-source.h
@@ -36,6 +36,12 @@ typedef struct _DataSource DataSource;
 typedef struct _DataSourceClass DataSourceClass;
 typedef struct _DataSourcePrivate DataSourcePrivate;
 
+typedef enum {
+	DATA_SOURCE_UNKNOWN,
+	DATA_SOURCE_TABLE,
+	DATA_SOURCE_SELECT,
+} DataSourceType;
+
 /* struct for the object's data */
 struct _DataSource
 {
@@ -49,15 +55,36 @@ struct _DataSourceClass
 	GObjectClass       parent_class;
 
 	/* signals */
+	void             (*changed) (DataSource *source);
 	void             (*execution_started) (DataSource *source);
 	void             (*execution_finished) (DataSource *source, GError *error);
 };
 
 GType               data_source_get_type            (void) G_GNUC_CONST;
 
+DataSourceType      data_source_get_source_type     (DataSource *source);
+void                data_source_set_id              (DataSource *source, const gchar *id);
+const gchar        *data_source_get_id              (DataSource *source);
+void                data_source_set_title           (DataSource *source, const gchar *title);
+const gchar        *data_source_get_title           (DataSource *source);
+
+/* Data source as table API */
+gboolean            data_source_set_table           (DataSource *source, const gchar *table, GError **error);
+const gchar        *data_source_get_table           (DataSource *source);
+gboolean            data_source_add_dependency      (DataSource *source, const gchar *table,
+						     const char *id,
+						     gint col_name_size, const gchar **col_names,
+						     GError **error);
+
+/* Data source as SQL query API */
+void                data_source_set_query           (DataSource *source, const gchar *sql, GError **warning);
+
+/* other API */
+DataSource         *data_source_new                 (BrowserConnection *bcnc, DataSourceType type);
 DataSource         *data_source_new_from_xml_node   (BrowserConnection *bcnc, xmlNodePtr node, GError **error);
 void                data_source_set_params          (DataSource *source, GdaSet *params);
 xmlNodePtr          data_source_to_xml_node         (DataSource *source);
+
 GdaStatement       *data_source_get_statement       (DataSource *source);
 
 GdaSet             *data_source_get_import          (DataSource *source);
@@ -67,7 +94,6 @@ GHashTable         *data_source_get_export_columns  (DataSource *source);
 void                data_source_execute             (DataSource *source, GError **error);
 gboolean            data_source_execution_going_on  (DataSource *source);
 GtkWidget          *data_source_create_grid         (DataSource *source);
-const gchar        *data_source_get_title           (DataSource *source);
 
 /*
 DataSource         *data_source_new_from_table      (BrowserConnection *bcnc,
diff --git a/tools/browser/data-manager/data-widget.c b/tools/browser/data-manager/data-widget.c
index 18dabe2..a0ffffc 100644
--- a/tools/browser/data-manager/data-widget.c
+++ b/tools/browser/data-manager/data-widget.c
@@ -27,37 +27,54 @@
 #include "../browser-spinner.h"
 #include "../common/ui-formgrid.h"
 #include "../browser-window.h"
+#include "../support.h"
+#include "data-source-editor.h"
 
+/*
+ * The DataPart structure represents the execution of a single DataSource 
+ */
 typedef struct {
 	DataWidget *dwid;
 	DataSource *source;
 
 	GtkWidget *top;
 	GtkNotebook *nb; /* page 0: spinner
-			    page 1 or 2, depends on @data_widget_page */
+			    page 1 or 2, depends on @data_widget_page, @error_widget_page and @edit_widget_page*/
 	gint data_widget_page;
 	gint error_widget_page;
+	gint edit_widget_page;
+	gint edit_widget_previous_page;
+
 	BrowserSpinner *spinner;
+	guint spinner_show_timer_id;
 	GtkWidget *data_widget;
 	GtkWidget *error_widget;
+	GtkWidget *edit_widget;
 	GdaSet *export_data;
 
 	GSList *dep_parts; /* list of DataPart which need to be re-run when anything in @export_data
 			    * changes */
+	GtkWidget *menu;
 } DataPart;
 #define DATA_PART(x) ((DataPart*)(x))
 
 static DataPart *data_part_find (DataWidget *dwid, DataSource *source);
-static void data_part_free (DataPart *part);
+static void data_part_free (DataPart *part, GSList *all_parts);
 
 struct _DataWidgetPrivate {
-	GtkWidget *hpaned;
+	DataSourceManager *mgr;
+	GtkWidget *top_nb; /* page 0 => error, page 1 => contents */
+	GtkWidget *info_label;
+	GtkWidget *contents_page_vbox;
+	GtkWidget *contents_page;
 	GSList *parts;
 };
 
 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 void mgr_list_changed_cb (DataSourceManager *mgr, DataWidget *dwid);
 
 static GObjectClass *parent_class = NULL;
 
@@ -82,6 +99,35 @@ data_widget_init (DataWidget *dwid, DataWidgetClass *klass)
 
 	/* allocate private structure */
 	dwid->priv = g_new0 (DataWidgetPrivate, 1);
+
+	/* init Widgets's structure */
+	dwid->priv->top_nb = gtk_notebook_new ();
+	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (dwid->priv->top_nb), FALSE);
+	gtk_notebook_set_show_border (GTK_NOTEBOOK (dwid->priv->top_nb), FALSE);
+	gtk_box_pack_start (GTK_BOX (dwid), dwid->priv->top_nb, TRUE, TRUE, 0);
+
+	/* error page */
+#if GTK_CHECK_VERSION (2,18,0)
+	GtkWidget *info;
+	info = gtk_info_bar_new ();
+	gtk_notebook_append_page (GTK_NOTEBOOK (dwid->priv->top_nb), info, NULL);
+	dwid->priv->info_label = gtk_label_new ("");
+	gtk_misc_set_alignment (GTK_MISC (dwid->priv->info_label), 0., -1);
+	gtk_label_set_ellipsize (GTK_LABEL (dwid->priv->info_label), PANGO_ELLIPSIZE_END);
+	gtk_container_add (GTK_CONTAINER (gtk_info_bar_get_content_area (GTK_INFO_BAR (info))),
+			   dwid->priv->info_label);
+#else
+	dwid->priv->info_label = gtk_label_new ("");
+	gtk_notebook_append_page (GTK_NOTEBOOK (dwid->priv->top_nb), dwid->priv->info_label, NULL);
+#endif
+
+	/* contents page */
+	GtkWidget *vbox;
+	vbox = gtk_vbox_new (FALSE, 0);
+	gtk_notebook_append_page (GTK_NOTEBOOK (dwid->priv->top_nb), vbox, NULL);
+	dwid->priv->contents_page_vbox = vbox;
+
+	gtk_widget_show_all (dwid->priv->top_nb);
 }
 
 GType
@@ -107,12 +153,23 @@ data_widget_get_type (void)
 }
 
 static void
+data_part_free_func (DataPart *part)
+{
+	data_part_free (part, NULL);
+}
+
+static void
 data_widget_dispose (GObject *object)
 {
 	DataWidget *dwid = (DataWidget*) object;
 	if (dwid->priv) {
+		if (dwid->priv->mgr) {
+			g_signal_handlers_disconnect_by_func (dwid->priv->mgr,
+							      G_CALLBACK (mgr_list_changed_cb), dwid);
+			g_object_unref (dwid->priv->mgr);
+		}
 		if (dwid->priv->parts) {
-			g_slist_foreach (dwid->priv->parts, (GFunc) data_part_free, NULL);
+			g_slist_foreach (dwid->priv->parts, (GFunc) data_part_free_func, NULL);
 			g_slist_free (dwid->priv->parts);
 		}
 		g_free (dwid->priv);
@@ -123,14 +180,31 @@ data_widget_dispose (GObject *object)
 
 static void source_exec_started_cb (DataSource *source, DataPart *part);
 static void source_exec_finished_cb (DataSource *source, GError *error, DataPart *part);
+static void data_source_menu_clicked_cb (GtkButton *button, DataPart *part);
 
 static DataPart *
-create_part (DataWidget *dwid, DataSource *source)
+create_or_reuse_part (DataWidget *dwid, DataSource *source, gboolean *out_reused)
 {
+	
 	DataPart *part;
+	*out_reused = FALSE;
+
+	part = data_part_find (dwid, source);
+	if (part) {
+		GtkWidget *parent;
+		parent = gtk_widget_get_parent (part->top);
+		if (parent) {
+			g_object_ref ((GObject*) part->top);
+			gtk_container_remove (GTK_CONTAINER (parent), part->top);
+		}
+		*out_reused = TRUE;
+		return part;
+	}
+
 	part = g_new0 (DataPart, 1);
 	part->dwid = dwid;
 	part->source = g_object_ref (source);
+	part->edit_widget_previous_page = -1;
 	g_signal_connect (source, "execution-started",
 			  G_CALLBACK (source_exec_started_cb), part);
 	g_signal_connect (source, "execution-finished",
@@ -141,23 +215,41 @@ create_part (DataWidget *dwid, DataSource *source)
 	GtkWidget *vbox;
 	vbox = gtk_vbox_new (FALSE, 0);
 	part->top = vbox;
+	g_object_ref_sink ((GObject*) part->top);
 
-	GtkWidget *header;
+	GtkWidget *header, *label, *button, *image;
 	const gchar *cstr;
-	header = gtk_label_new ("");
+
+	header = gtk_hbox_new (FALSE, 0);
+	gtk_box_pack_start (GTK_BOX (vbox), header, FALSE, FALSE, 0);
+
+	label = gtk_label_new ("");
 	cstr = data_source_get_title (source);
 	if (cstr) {
 		gchar *tmp;
 		tmp = g_markup_printf_escaped ("<b><small>%s</small></b>", cstr);
-		gtk_label_set_markup (GTK_LABEL (header), tmp);
+		gtk_label_set_markup (GTK_LABEL (label), tmp);
 		g_free (tmp);
 	}
 	else
-		gtk_label_set_markup (GTK_LABEL (header), "<b><small> </small></b>");
-	gtk_misc_set_alignment (GTK_MISC (header), 0., -1);
-	gtk_widget_set_size_request (header, 150, -1);
-	gtk_label_set_ellipsize (GTK_LABEL (header), PANGO_ELLIPSIZE_END);
-	gtk_box_pack_start (GTK_BOX (vbox), header, FALSE, FALSE, 0);
+		gtk_label_set_markup (GTK_LABEL (label), "<b><small> </small></b>");
+	gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
+	gtk_widget_set_size_request (label, 150, -1);
+	gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
+	gtk_box_pack_start (GTK_BOX (header), label, TRUE, TRUE, 0);
+
+	image = gtk_image_new_from_pixbuf (browser_get_pixbuf_icon (BROWSER_ICON_MENU_INDICATOR));
+	button = gtk_button_new ();
+	gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+	gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE);
+	gtk_widget_set_name (button, "browser-tab-close-button");
+	gtk_widget_set_tooltip_text (button, _("Link to other data"));
+	g_signal_connect (button, "clicked",
+			  G_CALLBACK (data_source_menu_clicked_cb), part);
+		
+	gtk_container_add (GTK_CONTAINER (button), image);
+	gtk_container_set_border_width (GTK_CONTAINER (button), 0);
+	gtk_box_pack_start (GTK_BOX (header), button, FALSE, FALSE, 0);
 
 	GtkWidget *nb, *page;
 	nb = gtk_notebook_new ();
@@ -218,43 +310,347 @@ pack_in_paned_list (GSList *paned_list, gint length, gint pos, GtkWidget *wid)
 	}
 }
 
-/**
- * data_widget_new
- *
- * Returns: the newly created widget.
+static void
+remove_data_source_mitem_activated_cb (GtkMenuItem *mitem, DataPart *part)
+{
+	data_source_manager_remove_source (part->dwid->priv->mgr, part->source);
+}
+
+static void
+add_data_source_mitem_activated_cb (GtkMenuItem *mitem, DataPart *part)
+{
+	DataSource *source;
+	GError *lerror = NULL;
+	xmlNodePtr sourcespec;
+	BrowserConnection *bcnc;
+
+	bcnc = data_source_manager_get_browser_cnc (part->dwid->priv->mgr);
+	sourcespec = (xmlNodePtr) g_object_get_data ((GObject*) mitem, "xml");
+	source = data_source_new_from_xml_node (bcnc, sourcespec, &lerror);
+	if (source) {
+		data_source_manager_add_source (part->dwid->priv->mgr, source);
+		g_object_unref (source);
+	}
+	else {
+		BrowserWindow *bwin;
+		bwin = BROWSER_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (part->dwid)));
+		browser_window_show_notice_printf (bwin, GTK_MESSAGE_ERROR, "data-widget-add-new-source",
+						   _("Error adding new data source: %s"),
+						   lerror && lerror->message ? lerror->message :
+						   _("No detail"));
+		g_clear_error (&lerror);
+	}
+
+#ifdef GDA_DEBUG_NO
+	xmlBufferPtr buffer;
+	buffer = xmlBufferCreate ();
+	xmlNodeDump (buffer, NULL, sourcespec, 0, 1);
+	g_print ("Source to ADD: [%s]\n", (gchar *) xmlBufferContent (buffer));
+	xmlBufferFree (buffer);
+#endif
+}
+
+static void
+data_source_props_activated_cb (GtkCheckMenuItem *mitem, DataPart *part)
+{
+	if (gtk_check_menu_item_get_active (mitem)) {
+		part->edit_widget_previous_page = gtk_notebook_get_current_page (part->nb);
+		if (! part->edit_widget) {
+			part->edit_widget = data_source_editor_new ();
+			data_source_editor_set_readonly (DATA_SOURCE_EDITOR (part->edit_widget));
+			part->edit_widget_page = gtk_notebook_append_page (part->nb, part->edit_widget,
+									   NULL);
+			gtk_widget_show (part->edit_widget);
+		}
+		data_source_editor_display_source (DATA_SOURCE_EDITOR (part->edit_widget),
+						   part->source);
+		gtk_notebook_set_current_page (part->nb, part->edit_widget_page);
+	}
+	else
+		gtk_notebook_set_current_page (part->nb, part->edit_widget_previous_page);
+}
+
+static gchar *compute_fk_dependency (GdaMetaTableForeignKey *fkey, GSList *selfields, gboolean reverse,
+				     DataPart *part, xmlNodePtr *out_sourcespec);
+static void
+data_source_menu_clicked_cb (GtkButton *button, DataPart *part)
+{
+	if (! part->menu) {
+		GtkWidget *menu, *mitem;
+		menu = gtk_menu_new ();
+		part->menu = menu;
+
+		mitem = gtk_menu_item_new_with_label (_("Remove data source"));
+		g_signal_connect (mitem, "activate",
+				  G_CALLBACK (remove_data_source_mitem_activated_cb), part);
+		gtk_widget_show (mitem);
+		gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
+
+		mitem = gtk_check_menu_item_new_with_label (_("Show data source's properties"));
+		g_signal_connect (mitem, "activate",
+				  G_CALLBACK (data_source_props_activated_cb), part);
+		gtk_widget_show (mitem);
+		gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
+
+		GdaStatement *stmt;
+		stmt = data_source_get_statement (part->source);
+		if (gda_statement_get_statement_type (stmt) == GDA_SQL_STATEMENT_SELECT) {
+			GSList *fields = NULL, *flist;
+			GdaSqlStatement *sql_statement;
+			BrowserConnection *bcnc;
+			GHashTable *hash; /* key = a menu string, value= 0x1 */
+
+			g_object_get (G_OBJECT (stmt), "structure", &sql_statement, NULL);
+
+			bcnc = data_source_manager_get_browser_cnc (part->dwid->priv->mgr);
+			if (browser_connection_check_sql_statement_validify (bcnc, sql_statement, NULL))
+				fields = ((GdaSqlStatementSelect *) sql_statement->contents)->expr_list;
+
+			hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+			for (flist = fields; flist; flist = flist->next) {
+				GdaSqlSelectField *select_field = (GdaSqlSelectField*) flist->data;
+				if (!select_field->validity_meta_table_column)
+					continue;
+				GdaMetaDbObject *dbo;
+				GdaMetaTableColumn *field;
+				dbo = select_field->validity_meta_object;
+				field = select_field->validity_meta_table_column;
+				if (dbo->obj_type == GDA_META_DB_TABLE) {
+					GdaMetaTable *mtable;
+					mtable = GDA_META_TABLE (dbo);
+
+					GSList *fklist;
+					for (fklist = mtable->reverse_fk_list; fklist; fklist = fklist->next) {
+						GdaMetaTableForeignKey *fkey;
+						fkey = (GdaMetaTableForeignKey *) fklist->data;
+						gchar *tmp;
+						xmlNodePtr sourcespec = NULL;
+						if (fkey->meta_table->obj_type != GDA_META_DB_TABLE)
+							continue;
+						tmp = compute_fk_dependency (fkey, fields, FALSE,
+									     part, &sourcespec);
+						if (!tmp)
+							continue;
+						if (g_hash_table_lookup (hash, tmp)) {
+							g_free (tmp);
+							continue;
+						}
+
+						mitem = gtk_menu_item_new_with_label (tmp);
+						g_object_set_data_full ((GObject*) mitem, "xml", sourcespec,
+									(GDestroyNotify) xmlFreeNode);
+						g_signal_connect (mitem, "activate",
+								  G_CALLBACK (add_data_source_mitem_activated_cb),
+								  part);
+						gtk_widget_show (mitem);
+						gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
+						g_hash_table_insert (hash, tmp, (gpointer) 0x1);
+					}
+					for (fklist = mtable->fk_list; fklist; fklist = fklist->next) {
+						GdaMetaTableForeignKey *fkey;
+						fkey = (GdaMetaTableForeignKey *) fklist->data;
+						gchar *tmp;
+						xmlNodePtr sourcespec = NULL;
+						if (fkey->depend_on->obj_type != GDA_META_DB_TABLE)
+							continue;
+						tmp = compute_fk_dependency (fkey, fields, TRUE,
+									     part, &sourcespec);
+						if (!tmp)
+							continue;
+						if (g_hash_table_lookup (hash, tmp)) {
+							g_free (tmp);
+							continue;
+						}
+						mitem = gtk_menu_item_new_with_label (tmp);
+						g_object_set_data_full ((GObject*) mitem, "xml", sourcespec,
+									(GDestroyNotify) xmlFreeNode);
+						g_signal_connect (mitem, "activate",
+								  G_CALLBACK (add_data_source_mitem_activated_cb),
+								  part);
+						gtk_widget_show (mitem);
+						gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
+						g_hash_table_insert (hash, tmp, (gpointer) 0x1);
+					}
+				}
+			}
+			g_hash_table_destroy (hash);
+			gda_sql_statement_free (sql_statement);
+		}
+	}
+	gtk_menu_popup (GTK_MENU (part->menu), NULL, NULL,
+                        NULL, NULL, 0,
+                        gtk_get_current_event_time ());
+}
+
+/*
+ * Returns: a new list of #GdaSqlSelectField (which are already listed in @selfields), or %NULL
  */
-GtkWidget *
-data_widget_new (GArray *sources_array)
+static gchar *
+compute_fk_dependency (GdaMetaTableForeignKey *fkey, GSList *selfields, gboolean reverse,
+		       DataPart *part, xmlNodePtr *out_sourcespec)
 {
-	DataWidget *dwid;
+	GString *string = NULL;
+	gint i;
+	gint *index_array;
+	GdaMetaTable *table;
 
-	g_return_val_if_fail (sources_array, NULL); 
-	dwid = g_object_new (DATA_WIDGET_TYPE, NULL);
+	*out_sourcespec = NULL;
+
+	if (reverse) {
+		table = GDA_META_TABLE (fkey->meta_table);
+		index_array = fkey->fk_cols_array;
+	}
+	else {
+		table = GDA_META_TABLE (fkey->depend_on);
+		index_array = fkey->ref_pk_cols_array;
+	}
+	for (i = 0; i < fkey->cols_nb; i++) {
+		gint pos;
+		GdaMetaTableColumn *col;
+		pos = index_array[i] - 1;
+		col = g_slist_nth_data (table->columns, pos);
+
+		/* make sure @col is among @selfields */
+		GSList *flist;
+		gboolean found = FALSE;
+		for (flist = selfields; flist; flist = flist->next) {
+			GdaSqlSelectField *select_field = (GdaSqlSelectField*) flist->data;
+			if (!select_field->validity_meta_object ||
+			    !select_field->validity_meta_table_column)
+				continue;
+			GdaMetaTableColumn *field;
+			field = select_field->validity_meta_table_column;
+			if (field == col) {
+				found = TRUE;
+				if (reverse) {
+					if (!string) {
+						string = g_string_new (_("Obtain referenced data in table "));
+						g_string_append_printf (string, "%s from ",
+									fkey->depend_on->obj_short_name);
+					}
+					else
+						g_string_append (string, ", ");
+					g_string_append_printf (string, "column n.%d (",
+								g_slist_position (selfields, flist) + 1);
+					if (select_field->as)
+						g_string_append (string, select_field->as);
+					else
+						g_string_append (string,
+								 select_field->validity_meta_table_column->column_name);
+					g_string_append_c (string, ')');
+				}
+				else {
+					if (!string) {
+						string = g_string_new (_("List referencing data in "));
+						g_string_append_printf (string, "%s.",
+									fkey->meta_table->obj_short_name);
+					}
+					else
+						g_string_append (string, ", ");
+					g_string_append (string, fkey->fk_names_array [i]);
+				}
+				break;
+			}
+		}
+
+		if (! found) {
+			if (string) {
+				g_string_free (string, TRUE);
+				string = NULL;
+			}
+			break;
+		}
+	}
+
+	if (string) {
+		xmlNodePtr node, snode;
+		node = xmlNewNode (NULL, BAD_CAST "table");
+		xmlSetProp (node, BAD_CAST "name",
+ 			    BAD_CAST (reverse ? GDA_META_DB_OBJECT (fkey->depend_on)->obj_short_name : 
+				      GDA_META_DB_OBJECT (fkey->meta_table)->obj_short_name));
+
+		snode = xmlNewChild (node, NULL, BAD_CAST "depend", NULL);
+		xmlSetProp (snode, BAD_CAST "foreign_key_table",
+			    BAD_CAST GDA_META_DB_OBJECT (table)->obj_short_name);
+
+		xmlSetProp (snode, BAD_CAST "id", BAD_CAST data_source_get_id (part->source));
+
+		gint i;
+		for (i = 0; i < fkey->cols_nb; i++)
+			xmlNewChild (snode, NULL, BAD_CAST "column", BAD_CAST (fkey->fk_names_array[i]));
+
+		*out_sourcespec = node;
+		return g_string_free (string, FALSE);
+	}
+	else
+		return NULL;
+}
+
+static void
+update_layout (DataWidget *dwid)
+{
+	GSList *newparts_list = NULL;
+	GArray *sources_array;
+	GError *lerror = NULL;
+	GtkWidget *new_contents;
+
+	new_contents = gtk_vbox_new (FALSE, 0);
+
+	sources_array = data_source_manager_get_sources_array (dwid->priv->mgr, &lerror);
+	if (!sources_array) {
+		gchar *str;
+		if (lerror && lerror->message)
+			str = g_strdup_printf (_("Error: %s"), lerror->message);
+		else {
+			const GSList *list;
+			list = data_source_manager_get_sources (dwid->priv->mgr);
+			if (list)
+				str = g_strdup_printf (_("Error: %s"), _("No detail"));
+			else
+				str = g_strdup_printf (_("Error: %s"), _("No data source defined"));
+		}
+                g_clear_error (&lerror);
+                gtk_label_set_text (GTK_LABEL (dwid->priv->info_label), str);
+                g_free (str);
+		gtk_notebook_set_current_page (GTK_NOTEBOOK (dwid->priv->top_nb), 0);
+		goto cleanups;
+	}
 
 	if (sources_array->len == 1) {
 		GArray *subarray = g_array_index (sources_array, GArray*, 0);
 		if (subarray->len == 1) {
 			DataPart *part;
+			gboolean reused;
 			DataSource *source;
 			source = g_array_index (subarray, DataSource*, 0);
-			part = create_part (dwid, source);
-			gtk_box_pack_start (GTK_BOX (dwid), part->top, TRUE, TRUE, 0);
-
-			data_source_execute (source, NULL);
+			part = create_or_reuse_part (dwid, source, &reused);
+			gtk_box_pack_start (GTK_BOX (new_contents), part->top, TRUE, TRUE, 0);
+			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);
+			}
 		}
 		else {
 			GSList *paned_list;
 			gint i;
 			paned_list = make_paned_list (subarray->len, FALSE);
-			gtk_box_pack_start (GTK_BOX (dwid), GTK_WIDGET (paned_list->data), TRUE, TRUE, 0);
+			gtk_box_pack_start (GTK_BOX (new_contents),
+					    GTK_WIDGET (paned_list->data), TRUE, TRUE, 0);
 			for (i = 0; i < subarray->len; i++) {
 				DataPart *part;
+				gboolean reused;
 				DataSource *source;
 				source = g_array_index (subarray, DataSource*, i);
-				part = create_part (dwid, source);
+				part = create_or_reuse_part (dwid, source, &reused);
 				pack_in_paned_list (paned_list, subarray->len, i, part->top);
-
-				data_source_execute (source, NULL);
+				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);
+				}
 			}
 			g_slist_free (paned_list);
 		}
@@ -262,20 +658,26 @@ data_widget_new (GArray *sources_array)
 	else {
 		GSList *top_paned_list;
 		gint j;
-
+		
 		top_paned_list = make_paned_list (sources_array->len, TRUE);
-		gtk_box_pack_start (GTK_BOX (dwid), GTK_WIDGET (top_paned_list->data), TRUE, TRUE, 0);
+		gtk_box_pack_start (GTK_BOX (new_contents),
+				    GTK_WIDGET (top_paned_list->data), TRUE, TRUE, 0);
 		for (j = 0; j < sources_array->len; j++) {
 			GArray *subarray = g_array_index (sources_array, GArray*, j);
 			DataSource *source;
-
+			
 			if (subarray->len == 1) {
 				DataPart *part;
+				gboolean reused;
 				source = g_array_index (subarray, DataSource*, 0);
-				part = create_part (dwid, source);
+				part = create_or_reuse_part (dwid, source, &reused);
 				pack_in_paned_list (top_paned_list, sources_array->len, j, part->top);
-				
-				data_source_execute (source, NULL);
+				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);
+				}
 			}
 			else {
 				GSList *paned_list;
@@ -285,24 +687,97 @@ data_widget_new (GArray *sources_array)
 						    GTK_WIDGET (paned_list->data));
 				for (i = 0; i < subarray->len; i++) {
 					DataPart *part;
+					gboolean reused;
 					source = g_array_index (subarray, DataSource*, i);
-					part = create_part (dwid, source);
+					part = create_or_reuse_part (dwid, source, &reused);
 					pack_in_paned_list (paned_list, subarray->len, i, part->top);
-					
-					data_source_execute (source, NULL);
+					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);
+					}
 				}
 				g_slist_free (paned_list);
 			}
 		}
 		g_slist_free (top_paned_list);
 	}
+	data_source_manager_destroy_sources_array (sources_array);
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (dwid->priv->top_nb), 1);
+	
+ cleanups:
+	{
+		GSList *list, *nlist = NULL;
+		for (list = dwid->priv->parts; list; list = list->next) {
+			if (!g_slist_find (newparts_list, list->data)) {
+				/* useless part */
+				data_part_free ((DataPart *) list->data, dwid->priv->parts);
+			}
+			else
+				nlist = g_slist_prepend (nlist, list->data);
+		}
+		g_slist_free (newparts_list);
+		g_slist_free (dwid->priv->parts);
+		dwid->priv->parts = g_slist_reverse (nlist);
+	}
+
+	gtk_box_pack_start (GTK_BOX (dwid->priv->contents_page_vbox), new_contents, TRUE, TRUE, 0);
+	gtk_widget_show_all (new_contents);
+	if (dwid->priv->contents_page)
+		gtk_widget_destroy (dwid->priv->contents_page);
+	dwid->priv->contents_page = new_contents;
+}
 
+static void
+mgr_list_changed_cb (DataSourceManager *mgr, DataWidget *dwid)
+{
+	update_layout (dwid);
+}
+
+/**
+ * data_widget_new
+ *
+ * Returns: the newly created widget.
+ */
+GtkWidget *
+data_widget_new (DataSourceManager *mgr)
+{
+	DataWidget *dwid;
+
+	g_return_val_if_fail (IS_DATA_SOURCE_MANAGER (mgr), NULL); 
+
+	dwid = g_object_new (DATA_WIDGET_TYPE, NULL);
+	dwid->priv->mgr = DATA_SOURCE_MANAGER (mgr);
+	g_object_ref ((GObject*) dwid->priv->mgr);
+	g_signal_connect (mgr, "list_changed",
+			  G_CALLBACK (mgr_list_changed_cb), dwid);
+
+	update_layout (dwid);
 	return GTK_WIDGET (dwid);
 }
 
 static void
-data_part_free (DataPart *part)
+data_part_free (DataPart *part, GSList *all_parts)
 {
+	if (part->spinner_show_timer_id) {
+		g_source_remove (part->spinner_show_timer_id);
+		part->spinner_show_timer_id = 0;
+	}
+
+	if (all_parts) {
+		GSList *list;
+		for (list = all_parts; list; list = list->next) {
+			DataPart *apart = (DataPart *) list->data;
+			if (apart == part)
+				continue;
+			apart->dep_parts = g_slist_remove_all (apart->dep_parts, part);
+		}
+	}
+
+	if (part->top)
+		gtk_widget_destroy (part->top);
+
 	if (part->source) {
 		g_signal_handlers_disconnect_by_func (part->source,
 						      G_CALLBACK (source_exec_started_cb), part);
@@ -315,6 +790,8 @@ data_part_free (DataPart *part)
 		g_object_unref (part->export_data);
 	if (part->dep_parts)
 		g_slist_free (part->dep_parts);
+	if (part->menu)
+		gtk_widget_destroy (part->menu);
 	g_free (part);
 }
 
@@ -329,23 +806,38 @@ data_part_find (DataWidget *dwid, DataSource *source)
 	return NULL;
 }
 
-static void
-source_exec_started_cb (DataSource *source, DataPart *part)
+static gboolean
+source_exec_started_cb_timeout (DataPart *part)
 {
 	gtk_notebook_set_current_page (part->nb, 0);
 	browser_spinner_start (part->spinner);
+	part->spinner_show_timer_id = 0;
+	return FALSE; /* remove timer */
+}
+
+static void
+source_exec_started_cb (DataSource *source, DataPart *part)
+{
+	if (! part->spinner_show_timer_id)
+		part->spinner_show_timer_id = g_timeout_add (300,
+							     (GSourceFunc) source_exec_started_cb_timeout,
+							     part);
 }
 
 static void data_part_selection_changed_cb (GdauiDataSelector *gdauidataselector, DataPart *part);
-static void compute_sources_dependencies (DataPart *part);
 static void
 source_exec_finished_cb (DataSource *source, GError *error, DataPart *part)
 {
 	GtkWidget *wid;
-	browser_spinner_stop (part->spinner);
+	if (part->spinner_show_timer_id) {
+		g_source_remove (part->spinner_show_timer_id);
+		part->spinner_show_timer_id = 0;
+	}
+	else
+		browser_spinner_stop (part->spinner);
 	
 #ifdef GDA_DEBUG_NO
-	g_print ("==== Execution of source [%s] finished\n", data_source_get_title (part->source));*/
+	g_print ("==== Execution of source [%s] finished\n", data_source_get_title (part->source));
 #endif
 	if (error) {
 		gchar *tmp;
@@ -371,7 +863,7 @@ source_exec_finished_cb (DataSource *source, GError *error, DataPart *part)
 		cwid = (GtkWidget*) data_source_create_grid (part->source);
 		ui_formgrid_handle_user_prefs (UI_FORMGRID (cwid), bcnc,
 					       data_source_get_statement (part->source));
-
+		
 		wid = (GtkWidget*) ui_formgrid_get_grid_widget (UI_FORMGRID (cwid));
 		part->data_widget = wid;
 		part->data_widget_page = gtk_notebook_append_page (part->nb, cwid, NULL);
@@ -380,7 +872,7 @@ source_exec_finished_cb (DataSource *source, GError *error, DataPart *part)
 		g_print ("Creating data widget for source [%s]\n",
 			 data_source_get_title (part->source));
 #endif
-
+		
 		/* compute part->export_data */
 		GArray *export_names;
 		export_names = data_source_get_export_names (part->source);
@@ -390,10 +882,10 @@ source_exec_finished_cb (DataSource *source, GError *error, DataPart *part)
 			GHashTable *export_columns;
 			gint i;
 			GdaDataModelIter *iter;
-
+			
 			iter = gdaui_data_selector_get_data_set (GDAUI_DATA_SELECTOR (wid));
 			g_object_get (wid, "model", &model, NULL);
-
+			
 			export_columns = data_source_get_export_columns (part->source);
 			for (i = 0; i < export_names->len; i++) {
 				gint col;
@@ -422,7 +914,7 @@ source_exec_finished_cb (DataSource *source, GError *error, DataPart *part)
 				part->export_data = gda_set_new (holders);
 				g_slist_foreach (holders, (GFunc) g_object_unref, NULL);
 				g_slist_free (holders);
-
+				
 				g_signal_connect (wid, "selection-changed",
 						  G_CALLBACK (data_part_selection_changed_cb), part);
 			}
diff --git a/tools/browser/data-manager/data-widget.h b/tools/browser/data-manager/data-widget.h
index 82d79ff..8756cd0 100644
--- a/tools/browser/data-manager/data-widget.h
+++ b/tools/browser/data-manager/data-widget.h
@@ -26,6 +26,7 @@
 #include <gtk/gtk.h>
 #include <libgda/libgda.h>
 #include "data-source.h"
+#include "data-source-manager.h"
 
 G_BEGIN_DECLS
 
@@ -51,7 +52,7 @@ struct _DataWidgetClass {
 
 
 GType      data_widget_get_type   (void) G_GNUC_CONST;
-GtkWidget *data_widget_new        (GArray *sources_array);
+GtkWidget *data_widget_new        (DataSourceManager *mgr);
 GdaSet    *data_widget_get_export (DataWidget *dwid, DataSource *source);
 void       data_widget_rerun      (DataWidget *dwid);
 
diff --git a/tools/browser/data-manager/marshal.list b/tools/browser/data-manager/marshal.list
index 9ab3792..d2dbeee 100644
--- a/tools/browser/data-manager/marshal.list
+++ b/tools/browser/data-manager/marshal.list
@@ -25,3 +25,4 @@
 VOID:VOID
 VOID:POINTER
 VOID:INT,ENUM,STRING
+VOID:OBJECT
diff --git a/tools/browser/data-manager/ui-spec-editor.c b/tools/browser/data-manager/ui-spec-editor.c
index 2e43b09..308907f 100644
--- a/tools/browser/data-manager/ui-spec-editor.c
+++ b/tools/browser/data-manager/ui-spec-editor.c
@@ -26,22 +26,20 @@
 #include "data-source.h"
 #include <libgda/libgda.h>
 #include "../support.h"
+#include "data-source-editor.h"
 
-#ifdef HAVE_GTKSOURCEVIEW
-#ifdef GTK_DISABLE_SINGLE_INCLUDES
-#undef GTK_DISABLE_SINGLE_INCLUDES
-#endif
-
-#include <gtksourceview/gtksourceview.h>
-#include <gtksourceview/gtksourcelanguagemanager.h>
-#include <gtksourceview/gtksourcebuffer.h>
-#include <gtksourceview/gtksourcestyleschememanager.h>
-#include <gtksourceview/gtksourcestylescheme.h>
-#endif
+enum
+{
+	COLUMN_DATA_SOURCE,
+	NUM_COLUMNS
+};
 
 struct _UiSpecEditorPrivate {
 	DataSourceManager *mgr;
-	
+	GtkListStore *sources_model;
+	GtkWidget *sources_tree;
+	DataSourceEditor *propsedit;
+
 	/* warnings */
 	GtkWidget  *info;
 };
@@ -65,6 +63,73 @@ ui_spec_editor_class_init (UiSpecEditorClass *klass)
 	object_class->dispose = ui_spec_editor_dispose;
 }
 
+static void
+cell_text_data_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+		     GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+	DataSource *source;
+	gtk_tree_model_get (tree_model, iter, COLUMN_DATA_SOURCE, &source, -1);
+	g_assert (source);
+
+	GString *mark;
+	const gchar *id, *str;
+	mark = g_string_new ("");
+	/* FIXME: add source ID */
+	id = NULL;
+
+	str = data_source_get_id (source);
+	if (str)
+		g_string_append (mark, str);
+	else
+		g_string_append_c (mark, '-');
+	str = data_source_get_title (source);
+        if (str) {
+		if (!id || strcmp ((gchar*) id, (gchar*) str)) {
+			gchar *tmp;
+			tmp = g_markup_escape_text ((gchar*) str, -1);
+			g_string_append_printf (mark, "\n<small><i>%s</i></small>", tmp);
+			g_free (tmp);
+		}
+        }
+
+	g_object_set (cell, "markup", mark->str, NULL);
+	g_string_free (mark, TRUE);
+}
+
+static void
+cell_pixbuf_data_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+		       GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+	DataSource *source;
+	gtk_tree_model_get (tree_model, iter, COLUMN_DATA_SOURCE, &source, -1);
+	g_assert (source);
+
+	DataSourceType stype;
+	stype = data_source_get_source_type (source);
+	switch (stype) {
+	case DATA_SOURCE_TABLE:
+		g_object_set (cell, "pixbuf", browser_get_pixbuf_icon (BROWSER_ICON_TABLE), NULL);
+		break;
+	case DATA_SOURCE_SELECT:
+		g_object_set (cell, "pixbuf", browser_get_pixbuf_icon (BROWSER_ICON_QUERY), NULL);
+		break;
+	default:
+		g_object_set (cell, "pixbuf", NULL, NULL);
+		break;
+	}
+}
+
+static void
+data_source_selection_changed_cb (GtkTreeSelection *sel, UiSpecEditor *uied)
+{
+	GtkTreeIter iter;
+	if (gtk_tree_selection_get_selected (sel, NULL, &iter)) {
+		DataSource *source;
+		gtk_tree_model_get (GTK_TREE_MODEL (uied->priv->sources_model), &iter,
+				    COLUMN_DATA_SOURCE, &source, -1);
+		data_source_editor_display_source (uied->priv->propsedit, source);
+	}
+}
 
 static void
 ui_spec_editor_init (UiSpecEditor *sped, UiSpecEditorClass *klass)
@@ -73,6 +138,84 @@ ui_spec_editor_init (UiSpecEditor *sped, UiSpecEditorClass *klass)
 
 	/* allocate private structure */
 	sped->priv = g_new0 (UiSpecEditorPrivate, 1);
+	
+	GtkWidget *hpaned;
+	hpaned = gtk_hpaned_new ();
+	gtk_box_pack_start (GTK_BOX (sped), hpaned, TRUE, TRUE, 0);
+	
+	GtkWidget *vbox;
+	vbox = gtk_vbox_new (FALSE, 0);
+	gtk_paned_pack1 (GTK_PANED (hpaned), vbox, TRUE, FALSE);
+
+	GtkWidget *label;
+	gchar *str;
+	label = gtk_label_new ("");
+	str = g_strdup_printf ("<b>%s</b>", _("Data sources:"));
+	gtk_label_set_markup (GTK_LABEL (label), str);
+	g_free (str);
+	gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
+	gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+	/* data sources model & view */
+	GtkCellRenderer *renderer;
+	GtkTreeViewColumn *column;
+	sped->priv = g_new0 (UiSpecEditorPrivate, 1);
+	sped->priv->sources_model = gtk_list_store_new (NUM_COLUMNS,
+							G_TYPE_POINTER);
+
+	sped->priv->sources_tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (sped->priv->sources_model));
+	gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (sped->priv->sources_tree), FALSE);
+	gtk_widget_set_size_request (sped->priv->sources_tree, 170, -1);
+
+	renderer = gtk_cell_renderer_pixbuf_new ();
+	column = gtk_tree_view_column_new ();
+	gtk_tree_view_column_pack_start (column, renderer, FALSE);
+        gtk_tree_view_column_set_cell_data_func (column, renderer,
+						 (GtkTreeCellDataFunc) cell_pixbuf_data_func,
+                                                 NULL, NULL);
+	
+	renderer = gtk_cell_renderer_text_new ();	
+	gtk_tree_view_column_pack_start (column, renderer, TRUE);
+        gtk_tree_view_column_set_cell_data_func (column, renderer, (GtkTreeCellDataFunc) cell_text_data_func,
+                                                 NULL, NULL);
+
+        gtk_tree_view_append_column (GTK_TREE_VIEW (sped->priv->sources_tree), column);
+	
+	GtkTreeSelection *sel;
+	sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (sped->priv->sources_tree));
+	g_signal_connect (sel, "changed",
+			  G_CALLBACK (data_source_selection_changed_cb), sped);
+
+	/* data sources tree */
+	GtkWidget *sw;
+	sw = gtk_scrolled_window_new (NULL, NULL);
+	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
+					     GTK_SHADOW_NONE);
+	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+					GTK_POLICY_AUTOMATIC,
+					GTK_POLICY_AUTOMATIC);
+	gtk_container_add (GTK_CONTAINER (sw), sped->priv->sources_tree);
+	gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
+
+	vbox = gtk_vbox_new (FALSE, 0);
+	gtk_paned_pack2 (GTK_PANED (hpaned), vbox, TRUE, FALSE);
+
+	label = gtk_label_new ("");
+	str = g_strdup_printf ("<b>%s</b>", _("Selected data source's properties:"));
+	gtk_label_set_markup (GTK_LABEL (label), str);
+	g_free (str);
+	gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
+	gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+	GtkWidget *pe;
+	pe = data_source_editor_new ();
+	gtk_box_pack_start (GTK_BOX (vbox), pe, TRUE, TRUE, 0);
+	sped->priv->propsedit = DATA_SOURCE_EDITOR (pe);
+
+ 	/* warning, not shown */
+	sped->priv->info = NULL;
+
+	gtk_widget_show_all (hpaned);
 }
 
 GType
@@ -111,6 +254,77 @@ ui_spec_editor_dispose (GObject *object)
 	parent_class->dispose (object);
 }
 
+static void
+mgr_changed_cb (DataSourceManager *mgr, UiSpecEditor *sped)
+{
+	const GSList *list;
+
+	/* keep selected source, if any */
+	GtkTreeIter iter;
+	GtkTreeSelection *sel;
+	DataSource *current_source = NULL;
+	GtkTreePath *current_path = NULL;
+
+	sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (sped->priv->sources_tree));
+	if (gtk_tree_selection_get_selected (sel, NULL, &iter)) {
+		gtk_tree_model_get (GTK_TREE_MODEL (sped->priv->sources_model),
+				    &iter, COLUMN_DATA_SOURCE, &current_source, -1);
+		current_path = gtk_tree_model_get_path (GTK_TREE_MODEL (sped->priv->sources_model),
+							&iter);
+	}
+
+	/* reset sources list */
+	gtk_list_store_clear (sped->priv->sources_model);
+	for (list = data_source_manager_get_sources (mgr); list; list = list->next) {
+		DataSource *source = DATA_SOURCE (list->data);
+
+		gtk_list_store_append (sped->priv->sources_model, &iter);
+		gtk_list_store_set (sped->priv->sources_model, &iter,
+				    COLUMN_DATA_SOURCE, source,
+				    -1);
+	}
+
+	/* reset selected source */
+	data_source_editor_display_source (sped->priv->propsedit, current_source);
+	if (current_path) {
+		gtk_tree_selection_select_path (sel, current_path);
+		gtk_tree_path_free (current_path);
+	}
+}
+
+static void
+mgr_source_changed_cb (DataSourceManager *mgr, DataSource *source, UiSpecEditor *sped)
+{
+	GtkTreeIter iter;
+	GtkTreeModel *tree_model = GTK_TREE_MODEL (sped->priv->sources_model);
+	DataSource *msource;
+
+	if (gtk_tree_model_get_iter_first (tree_model, &iter)) {
+		gtk_tree_model_get (tree_model, &iter, COLUMN_DATA_SOURCE, &msource, -1);
+		if (source == msource) {
+			GtkTreePath *path;
+			path = gtk_tree_path_new_from_indices (0, -1);
+			gtk_tree_model_row_changed (tree_model, path, &iter);
+			gtk_tree_path_free (path);
+			return;
+		}
+
+		gint pos;
+		for (pos = 1; gtk_tree_model_iter_next (tree_model, &iter); pos++) {
+			gtk_tree_model_get (tree_model, &iter, COLUMN_DATA_SOURCE, &msource, -1);
+			if (source == msource) {
+				GtkTreePath *path;
+				path = gtk_tree_path_new_from_indices (pos, -1);
+				gtk_tree_model_row_changed (tree_model, path, &iter);
+				gtk_tree_path_free (path);
+				return;
+			}
+		}
+	}
+
+	g_assert_not_reached ();
+}
+
 
 /**
  * ui_spec_editor_new
@@ -121,19 +335,53 @@ GtkWidget *
 ui_spec_editor_new (DataSourceManager *mgr)
 {
 	UiSpecEditor *sped;
-	GtkWidget *label;
 
 	g_return_val_if_fail (IS_DATA_SOURCE_MANAGER (mgr), NULL);
 
 	sped = g_object_new (UI_SPEC_EDITOR_TYPE, NULL);
 	sped->priv->mgr = g_object_ref (mgr);
-
-	label = gtk_label_new ("TODO");
-	gtk_box_pack_start (GTK_BOX (sped), label, TRUE, TRUE, 0);
-	gtk_widget_show (label);
+	g_signal_connect (mgr, "list-changed",
+			  G_CALLBACK (mgr_changed_cb), sped);
+	g_signal_connect (mgr, "source-changed",
+			  G_CALLBACK (mgr_source_changed_cb), sped);
+	mgr_changed_cb (mgr, sped);
 
 	/* warning */
 	sped->priv->info = NULL;
 
 	return (GtkWidget*) sped;
 }
+
+/**
+ * ui_spec_editor_select_source
+ * @editor: a #UiSpecEditor widget
+ * @source: a #DataSource
+ *
+ * Selects and displays @source's propserties
+ */
+void
+ui_spec_editor_select_source (UiSpecEditor *editor, DataSource *source)
+{
+	GtkTreeSelection *sel;
+	GtkTreeIter iter;
+	GtkTreeModel *tree_model = GTK_TREE_MODEL (editor->priv->sources_model);
+	DataSource *msource;
+
+	sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (editor->priv->sources_tree));
+	if (gtk_tree_model_get_iter_first (tree_model, &iter)) {
+		gtk_tree_model_get (tree_model, &iter, COLUMN_DATA_SOURCE, &msource, -1);
+		if (source == msource) {
+			gtk_tree_selection_select_iter (sel, &iter);
+			return;
+		}
+
+		gint pos;
+		for (pos = 1; gtk_tree_model_iter_next (tree_model, &iter); pos++) {
+			gtk_tree_model_get (tree_model, &iter, COLUMN_DATA_SOURCE, &msource, -1);
+			if (source == msource) {
+				gtk_tree_selection_select_iter (sel, &iter);
+				return;
+			}
+		}
+	}
+}
diff --git a/tools/browser/data-manager/ui-spec-editor.h b/tools/browser/data-manager/ui-spec-editor.h
index 0c4bc37..4fd6bc1 100644
--- a/tools/browser/data-manager/ui-spec-editor.h
+++ b/tools/browser/data-manager/ui-spec-editor.h
@@ -49,8 +49,9 @@ struct _UiSpecEditorClass {
 	GtkVBoxClass parent_class;
 };
 
-GType          ui_spec_editor_get_type     (void) G_GNUC_CONST;
-GtkWidget     *ui_spec_editor_new          (DataSourceManager *mgr);
+GType          ui_spec_editor_get_type      (void) G_GNUC_CONST;
+GtkWidget     *ui_spec_editor_new           (DataSourceManager *mgr);
+void           ui_spec_editor_select_source (UiSpecEditor *editor, DataSource *source);
 
 G_END_DECLS
 
diff --git a/tools/browser/data-manager/xml-spec-editor.c b/tools/browser/data-manager/xml-spec-editor.c
index bac9863..df239dc 100644
--- a/tools/browser/data-manager/xml-spec-editor.c
+++ b/tools/browser/data-manager/xml-spec-editor.c
@@ -59,6 +59,9 @@ static void xml_spec_editor_init       (XmlSpecEditor *sped, XmlSpecEditorClass
 static void xml_spec_editor_dispose    (GObject *object);
 static void xml_spec_editor_grab_focus (GtkWidget *widget);
 
+static void source_list_changed_cb (DataSourceManager *mgr, XmlSpecEditor *sped);
+static void data_source_changed_cb (DataSourceManager *mgr, DataSource *source, XmlSpecEditor *sped);
+
 static GObjectClass *parent_class = NULL;
 
 /*
@@ -120,8 +123,14 @@ xml_spec_editor_dispose (GObject *object)
 	if (sped->priv) {
 		if (sped->priv->signal_editor_changed_id)
 			g_source_remove (sped->priv->signal_editor_changed_id);
-		if (sped->priv->mgr)
+		if (sped->priv->mgr) {
+			g_signal_handlers_disconnect_by_func (sped->priv->mgr,
+							      G_CALLBACK (source_list_changed_cb), sped);
+			g_signal_handlers_disconnect_by_func (sped->priv->mgr,
+							      G_CALLBACK (data_source_changed_cb), sped);
+
 			g_object_unref (sped->priv->mgr);
+		}
 
 		g_free (sped->priv);
 		sped->priv = NULL;
@@ -132,8 +141,9 @@ xml_spec_editor_dispose (GObject *object)
 static gboolean
 signal_editor_changed (XmlSpecEditor *sped)
 {
-	/* modify the DataSourceManager */
-	data_source_manager_remove_all (sped->priv->mgr);
+	GSList *newlist = NULL;
+	g_signal_handlers_block_by_func (sped->priv->mgr,
+					 G_CALLBACK (source_list_changed_cb), sped);
 
 	/* create new DataSource objects */
 	GError *lerror = NULL;
@@ -173,11 +183,11 @@ signal_editor_changed (XmlSpecEditor *sped)
 	if (strcmp ((gchar*) node->name, "data")) {
 		g_set_error (&lerror, 0, 0,
 			     _("Expecting <%s> root node"), "data");
+		xmlFreeDoc (doc);
 		goto out;
 	}
 
 	BrowserConnection *bcnc;
-
 	bcnc = data_source_manager_get_browser_cnc (sped->priv->mgr);
 	for (node = node->children; node; node = node->next) {
 		if (!strcmp ((gchar*) node->name, "table") ||
@@ -185,18 +195,26 @@ signal_editor_changed (XmlSpecEditor *sped)
 			DataSource *source;
 			source = data_source_new_from_xml_node (bcnc, node, &lerror);
 			if (!source) {
-				data_source_manager_remove_all (sped->priv->mgr);
-				TO_IMPLEMENT;
+				if (newlist) {
+					g_slist_foreach (newlist, (GFunc) g_object_unref, NULL);
+					g_slist_free (newlist);
+					newlist = NULL;
+				}
+				xmlFreeDoc (doc);
 				goto out;
 			}
-			
-			data_source_manager_add_source (sped->priv->mgr, source);
-			g_object_unref (source);
+			else
+				newlist = g_slist_prepend (newlist, source);
 		}
 	}
 	xmlFreeDoc (doc);
 
  out:
+	newlist = g_slist_reverse (newlist);
+	data_source_manager_replace_all (sped->priv->mgr, newlist);
+	if (newlist)
+		g_slist_free (newlist);
+
 	if (lerror) {
 		if (! sped->priv->info) {
 			sped->priv->info = gtk_info_bar_new ();
@@ -221,6 +239,10 @@ signal_editor_changed (XmlSpecEditor *sped)
 
 	/* remove timeout */
 	sped->priv->signal_editor_changed_id = 0;
+
+	g_signal_handlers_unblock_by_func (sped->priv->mgr,
+					   G_CALLBACK (source_list_changed_cb), sped);
+
 	return FALSE;
 }
 
@@ -232,6 +254,41 @@ editor_changed_cb (GtkTextBuffer *buffer, XmlSpecEditor *sped)
 	sped->priv->signal_editor_changed_id = g_timeout_add_seconds (1, (GSourceFunc) signal_editor_changed, sped);
 }
 
+static void
+source_list_changed_cb (DataSourceManager *mgr, XmlSpecEditor *sped)
+{
+	xmlDocPtr doc;
+	xmlNodePtr root;
+	doc = xmlNewDoc (BAD_CAST "1.0");
+	root = xmlNewNode (NULL, BAD_CAST "data");
+	xmlDocSetRootElement (doc, root);
+
+	const GSList *list;
+	for (list = data_source_manager_get_sources (sped->priv->mgr); list; list = list->next) {
+		xmlNodePtr node;
+		node = data_source_to_xml_node (DATA_SOURCE (list->data));
+		xmlAddChild (root, node);
+	}
+
+	xmlChar *mem;
+	int size;
+	xmlDocDumpFormatMemory (doc, &mem, &size, 1);
+	xmlFreeDoc (doc);
+
+	g_signal_handlers_block_by_func (sped->priv->buffer,
+					 G_CALLBACK (editor_changed_cb), sped);
+	gtk_text_buffer_set_text (sped->priv->buffer, (gchar*) mem, -1);
+	g_signal_handlers_unblock_by_func (sped->priv->buffer,
+					   G_CALLBACK (editor_changed_cb), sped);
+	xmlFree (mem);
+}
+
+static void
+data_source_changed_cb (DataSourceManager *mgr, DataSource *source, XmlSpecEditor *sped)
+{
+	source_list_changed_cb (mgr, sped);
+}
+
 /**
  * xml_spec_editor_new
  *
@@ -248,6 +305,10 @@ xml_spec_editor_new (DataSourceManager *mgr)
 
 	sped = g_object_new (XML_SPEC_EDITOR_TYPE, NULL);
 	sped->priv->mgr = g_object_ref (mgr);
+	g_signal_connect (mgr, "list-changed",
+			  G_CALLBACK (source_list_changed_cb), sped);
+	g_signal_connect (mgr, "source-changed",
+			  G_CALLBACK (data_source_changed_cb), sped);
 
 	/* XML editor */
 	label = gtk_label_new ("");
diff --git a/tools/browser/doc/Makefile.am b/tools/browser/doc/Makefile.am
index fa1e350..eb4feb8 100644
--- a/tools/browser/doc/Makefile.am
+++ b/tools/browser/doc/Makefile.am
@@ -40,6 +40,7 @@ GTKDOC_CFLAGS = -I$(top_srcdir) \
 
 GTKDOC_LIBS = $(top_builddir)/tools/browser/data-manager/libperspective.la \
 	$(top_builddir)/tools/browser/libbrowser.la \
+	$(top_builddir)/libgda-ui/internal/libgda-ui-internal.la \
 	$(top_builddir)/tools/browser/common/libcommon.la \
 	$(top_builddir)/libgda/libgda-5.0.la \
 	$(top_builddir)/libgda-ui/libgda-ui-5.0.la \
diff --git a/tools/browser/doc/gda-browser-sections.txt b/tools/browser/doc/gda-browser-sections.txt
index 08817ad..ca20544 100644
--- a/tools/browser/doc/gda-browser-sections.txt
+++ b/tools/browser/doc/gda-browser-sections.txt
@@ -7,9 +7,12 @@ browser_window_new
 browser_window_get_connection
 browser_window_push_status
 browser_window_pop_status
+browser_window_show_notice
+browser_window_show_notice_printf
 browser_window_customize_perspective_ui
 browser_window_change_perspective
 browser_window_is_fullscreen
+browser_window_set_fullscreen
 <SUBSECTION Standard>
 BROWSER_WINDOW
 BROWSER_IS_WINDOW
@@ -90,6 +93,7 @@ browser_connection_execution_get_result
 BrowserConnectionExecuteCallback
 browser_connection_execute_statement_cb
 browser_connection_normalize_sql_statement
+browser_connection_check_sql_statement_validify
 browser_connection_rerun_select
 browser_connection_rerun_select_cb
 <SUBSECTION>
diff --git a/tools/browser/doc/tmpl/browser-connection.sgml b/tools/browser/doc/tmpl/browser-connection.sgml
index 2c9a52f..a393308 100644
--- a/tools/browser/doc/tmpl/browser-connection.sgml
+++ b/tools/browser/doc/tmpl/browser-connection.sgml
@@ -282,6 +282,17 @@ An opened connection
 @Returns: 
 
 
+<!-- ##### FUNCTION browser_connection_check_sql_statement_validify ##### -->
+<para>
+
+</para>
+
+ bcnc: 
+ sqlst: 
+ error: 
+ Returns: 
+
+
 <!-- ##### FUNCTION browser_connection_rerun_select ##### -->
 <para>
 
diff --git a/tools/browser/doc/tmpl/browser-window.sgml b/tools/browser/doc/tmpl/browser-window.sgml
index 0881a1f..3746160 100644
--- a/tools/browser/doc/tmpl/browser-window.sgml
+++ b/tools/browser/doc/tmpl/browser-window.sgml
@@ -81,6 +81,29 @@ Top level browser window
 @context: 
 
 
+<!-- ##### FUNCTION browser_window_show_notice ##### -->
+<para>
+
+</para>
+
+ bwin: 
+ type: 
+ context: 
+ text: 
+
+
+<!-- ##### FUNCTION browser_window_show_notice_printf ##### -->
+<para>
+
+</para>
+
+ bwin: 
+ type: 
+ context: 
+ format: 
+ Varargs: 
+
+
 <!-- ##### FUNCTION browser_window_customize_perspective_ui ##### -->
 <para>
 
@@ -111,3 +134,12 @@ Top level browser window
 @Returns: 
 
 
+<!-- ##### FUNCTION browser_window_set_fullscreen ##### -->
+<para>
+
+</para>
+
+ bwin: 
+ fullscreen: 
+
+
diff --git a/tools/browser/gda-browser-menu-ind.png b/tools/browser/gda-browser-menu-ind.png
new file mode 100644
index 0000000..de0ac6e
Binary files /dev/null and b/tools/browser/gda-browser-menu-ind.png differ
diff --git a/tools/browser/help/C/data-manager-perspective.page b/tools/browser/help/C/data-manager-perspective.page
index c489f0b..a1610d8 100644
--- a/tools/browser/help/C/data-manager-perspective.page
+++ b/tools/browser/help/C/data-manager-perspective.page
@@ -64,10 +64,14 @@
     The commands available through the command buttons are:
   </p>
   <list>
-    <item><p><gui>Clear</gui>: clears the XML editor</p></item>
+    <item><p><gui>Reset</gui>: resets the XML editor to a default XML template, only available when the XML
+    view is currently displayed</p></item>
+    <item><p><gui>Add</gui>: displays a popup menu with an entry per table to quickly add
+    the whole contents of a table as a data source, only available when the UI
+    editor is currently displayed</p></item>
     <item><p><gui>Variables</gui>: shows/hide the <link xref="variables-syntax">variables</link> panel where you can give values to the variables
-	present in the SQL code of any data source's definition. The panel is automatically shown when a variable is detected in 
-	the SQL code.</p></item>
+    present in the SQL code of any data source's definition. The panel is automatically shown when a variable is detected in 
+    the SQL code.</p></item>
     <item><p><gui>Execute</gui>: executes the defined data sources</p></item>
     <item><p><gui>View XML</gui>: toggles between the XML editor and the UI editor</p></item>
     <item><p><gui>Help</gui>: shows some help</p></item>
diff --git a/tools/browser/help/C/data-manager-xml-syntax.page b/tools/browser/help/C/data-manager-xml-syntax.page
index ea160c7..931c815 100644
--- a/tools/browser/help/C/data-manager-xml-syntax.page
+++ b/tools/browser/help/C/data-manager-xml-syntax.page
@@ -92,18 +92,38 @@
   </p>
   <list>
     <item><p>requires the "name" attribute which represents the table name.</p></item>
-    <item><p>can contain a <code>&lt;depend&gt;</code> node which defines a dependency on another
+    <item><p>can have a "id" attribute corresponding to the data source's ID. If not present,
+    and ID will be assigned automatically.</p></item>
+    <item><p>can contain a <code>&lt;depend&gt;</code> tag which defines a dependency on another
 	data source with
 	the "foreign_key_table" attribute defining the name of the table to which there are foreign keys
 	used to determine the dependency, and the "id" attribute can specify a data source ID if different than
 	the aforementioned table</p></item>
   </list>
+  <p>
+    The <code>&lt;depend&gt;</code> tag, which, for a data source from a table, defines a dependency to
+    another data source from a table:
+  </p>
+    <list>
+    <item><p>requires the "foreign_key_table" attribute defining the name of the table to which there are
+    foreign keys used to determine the dependency</p></item>
+    <item><p>can have a "id" attribute corresponding to the ID of the referenced data source. If not
+    provided, then the dependency may fail if there is no data source which ID is the"foreign_key_table"
+    attribute.</p></item>
+    <item><p>can contain one or more <code>&lt;column&gt;</code> tag which contents define the columns
+    to identify the foreign key to use; this is necessary if there are multiple foreign keys,
+    and can be omitted if there is only one possible koreign key. The listed columns are the one
+    from the table where the foreign key exists.</p></item>
+  </list>
+
 
   <code><![CDATA[
 <data>
-  <table name="customers"/>
+  <table id="the_cust" name="customers"/>
   <table name="orders">
-    <depend foreign_key_table="customers"/>
+    <depend id="the_cust" foreign_key_table="customers">
+      <column>customer_id</column>
+    </depend>
   </table>
 </data>]]>
   </code>
@@ -114,8 +134,10 @@
     <item><p>the <code>customers</code> data source which selects all the contents of the
 	<em>customers</em> table.</p></item>
     <item><p>the <code>orders</code> data source which selects among contents of the <code>orders</code>
-	table, the rows which correspond to a row in the <code>customers</code> table (assuming here
-	that the <code>orders</code> references the <code>customers</code> table in some way).
+	table, the rows which correspond to a row in the <code>customers</code> table using the foreign key
+	on table orders which involves the "orders.customer_id" column and the primary key of the
+	customers table. The "id" attribute of the <code>&lt;depend&gt;</code> tag is necessary here to
+	identify referenced the data source.
     </p></item>
   </list>
   <p>
diff --git a/tools/browser/help/C/figures/data-man-persp.png b/tools/browser/help/C/figures/data-man-persp.png
index 4e0eccd..c2c6434 100644
Binary files a/tools/browser/help/C/figures/data-man-persp.png and b/tools/browser/help/C/figures/data-man-persp.png differ
diff --git a/tools/browser/help/C/figures/data-man-xmlcompose.png b/tools/browser/help/C/figures/data-man-xmlcompose.png
index 3ebdca2..ecb0e4c 100644
Binary files a/tools/browser/help/C/figures/data-man-xmlcompose.png and b/tools/browser/help/C/figures/data-man-xmlcompose.png differ
diff --git a/tools/browser/help/Makefile.am b/tools/browser/help/Makefile.am
index 6ba449d..ece0ccc 100644
--- a/tools/browser/help/Makefile.am
+++ b/tools/browser/help/Makefile.am
@@ -30,6 +30,6 @@ DOC_PAGES = \
 	table-insert-data.page \
 	variables.page
 
-DOC_LINGUAS = de es
+DOC_LINGUAS = de es sl
 
 dist-hook: doc-dist-hook
diff --git a/tools/browser/help/sl/.gitignore b/tools/browser/help/sl/.gitignore
new file mode 100644
index 0000000..b70a37e
--- /dev/null
+++ b/tools/browser/help/sl/.gitignore
@@ -0,0 +1,2 @@
+*.page
+legal.xml
\ No newline at end of file
diff --git a/tools/browser/help/sl/sl.po b/tools/browser/help/sl/sl.po
new file mode 100644
index 0000000..e21c21a
--- /dev/null
+++ b/tools/browser/help/sl/sl.po
@@ -0,0 +1,751 @@
+# Slovenian translations for libgda help.
+# Copyright (C) 2009 gcalctool COPYRIGHT HOLDER
+# This file is distributed under the same license as the libgda package.
+#
+# Matej UrbanÄ?iÄ? <mateju svn gnome org>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgda master\n"
+"POT-Creation-Date: 2010-08-24 21:07+0000\n"
+"PO-Revision-Date: 2010-08-26 14:53+0100\n"
+"Last-Translator: Matej UrbanÄ?iÄ? <mateju svn gnome org>\n"
+"Language-Team: Slovenian GNOME Translation Team <gnome-si googlegroups com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"
+"X-Poedit-Country: SLOVENIA\n"
+"X-Poedit-Language: Slovenian\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: C/legal.xml:3(p)
+msgid "This work is licensed under a <link href=\"http://creativecommons.org/licenses/by-sa/3.0/\";>Creative Commons Attribution-Share Alike 3.0 Unported License</link>."
+msgstr ""
+
+#: C/legal.xml:6(p)
+msgid "As a special exception, the copyright holders give you permission to copy, modify, and distribute the example code contained in this document under the terms of your choosing, without restriction."
+msgstr ""
+
+#: C/variables.page:5(title)
+#: C/table-insert-data.page:5(title)
+#: C/transactions.page:5(title)
+#: C/schema-browser-perspective.page:5(title)
+#: C/query-execution-perspective.page:5(title)
+#: C/general-ui.page:5(title)
+#: C/features.page:5(title)
+#: C/diagram.page:5(title)
+#: C/data-manager-xml-syntax.page:5(title)
+#: C/data-manager-perspective.page:5(title)
+msgid "1"
+msgstr "1"
+
+#: C/variables.page:9(title)
+msgid "Variables in SQL code"
+msgstr "Spremenljivke v kodi SQL"
+
+#: C/variables.page:10(p)
+msgid "Variables (sometimes refered to as <em>placeholders</em>) are places in SQL code which are replaced by actual values when the SQL code is executed. The benefits are faster execution times (as the SQL code is parsed only once) and a protection against SQL injection vulnerabilities."
+msgstr ""
+
+#: C/variables.page:16(p)
+msgid "Variables can be used in any SQL code, and are defined using the following syntax:"
+msgstr ""
+
+#: C/variables.page:21(p)
+msgid "Notes:"
+msgstr "Opombe:"
+
+#: C/variables.page:25(p)
+msgid "the <em>variable name</em> can contain any SQL identifier character or among the <code>+-.|@?</code>characters (no space allowed)"
+msgstr ""
+
+#: C/variables.page:27(p)
+msgid "the <em>variable type</em> can be among: <code>string</code>, <code>boolean</code>, <code>int</code>, <code>date</code>, <code>time</code>, <code>timestamp</code>, <code>guint</code>, <code>blob</code> and <code>binary</code>"
+msgstr ""
+
+#: C/variables.page:30(p)
+msgid "the <code>::NULL</code> can be appended to specify that the variable may take the special <code>NULL</code> value."
+msgstr ""
+
+#: C/variables.page:33(p)
+msgid "Examples:"
+msgstr "Primeri:"
+
+#: C/variables.page:36(code)
+#, no-wrap
+msgid ""
+"\n"
+"##name::string\n"
+"##id::int::NULL\n"
+"##sales 3::date::NULL\n"
+"##customers id::int"
+msgstr ""
+"\n"
+"##name::string\n"
+"##id::int::NULL\n"
+"##sales 3::date::NULL\n"
+"##customers id::int"
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/table-insert-data.page:20(None)
+msgid "@@image: 'figures/table-insert-data.png'; md5=308807b8443d5ab26c8704a6e01aa1ab"
+msgstr "@@image: 'figures/table-insert-data.png'; md5=308807b8443d5ab26c8704a6e01aa1ab"
+
+#: C/table-insert-data.page:8(title)
+msgid "Inserting data in a table"
+msgstr "Vstavljanje podatkov v preglednico"
+
+#: C/table-insert-data.page:9(p)
+msgid "From the <link xref=\"schema-browser-perspective\">schema browser perspective</link>, when a table's properties is displayed in a tab, use the <guiseq><gui>Table</gui><gui>Insert data</gui></guiseq> menu to have a popup appear containing a data entry for each column of the table to insert data into."
+msgstr ""
+
+#: C/table-insert-data.page:14(p)
+msgid "A popup similar to the following will appear:"
+msgstr "Prikazano bo pojavno okno podobno naslednjemu:"
+
+#: C/table-insert-data.page:18(title)
+msgid "Popup to insert data into table"
+msgstr "Pojavno okno za vstavljanje podatkov v preglednico"
+
+#: C/table-insert-data.page:19(desc)
+msgid "A popup to insert data in a table"
+msgstr "Pojavno okno za vstavljanje podatkov v preglednico"
+
+#: C/table-insert-data.page:22(p)
+msgid "The noticeable points here are:"
+msgstr "PomembnejÅ¡e toÄ?ke so:"
+
+#: C/table-insert-data.page:26(p)
+msgid "There is one data entry per column in the table, with the exception (not shown in this figure) of multiple foreign key fields for which a single drop down choice widget is shown;"
+msgstr ""
+
+#: C/table-insert-data.page:28(p)
+msgid "Each data entry has a small button on the right giving information about the corresponding data entry, and allowing you to reset the data entry's value to the value it had before any modification done, to set it to NULL or to set it to a default value. The button's color has the following signification:"
+msgstr ""
+
+#: C/table-insert-data.page:33(p)
+msgid "Red: means the current value in the data entry is invalid"
+msgstr "RdeÄ?e: trenutna vrednost podatka vnosa je neveljavna."
+
+#: C/table-insert-data.page:34(p)
+msgid "Blue: means the current value in the data entry is unused and the column's default value will be used instead (usefull for example for auto incremented columns)"
+msgstr "Modro: trenutna vrednost podatka vnosa je neuporabljena in bo uporabljena privzeta vrednost stolpca (koristno pri samodejno spremenljivih stolpcih)."
+
+#: C/table-insert-data.page:36(p)
+msgid "Green: means the current value in the data entry is NULL"
+msgstr "Zelena: trenutna vrednost podatka vnosa je NULL."
+
+#: C/table-insert-data.page:37(p)
+msgid "Same color as the rest of the UI: means none of the above situations apply"
+msgstr "Barva vmesnika: ni posebnih opomb o podatku vnosa."
+
+#: C/table-insert-data.page:40(p)
+msgid "Columns which are foreign keys to other tables are presented as a drop down combo box where you can only choose among the values in the referenced table (hint: to have that values list refresned you should close the popup dialog and reopen it);"
+msgstr ""
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/transactions.page:14(None)
+msgid "@@image: 'figures/trans-begin.png'; md5=0382a22aeb54be0d7fe0ffa29dddf423"
+msgstr "@@image: 'figures/trans-begin.png'; md5=0382a22aeb54be0d7fe0ffa29dddf423"
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/transactions.page:16(None)
+msgid "@@image: 'figures/trans-commit.png'; md5=27f45d32501cc05bd6f6b16263283e9a"
+msgstr "@@image: 'figures/trans-commit.png'; md5=27f45d32501cc05bd6f6b16263283e9a"
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/transactions.page:18(None)
+msgid "@@image: 'figures/trans-rollback.png'; md5=470522738b1d6bf91b9787baac1c0191"
+msgstr "@@image: 'figures/trans-rollback.png'; md5=470522738b1d6bf91b9787baac1c0191"
+
+#: C/transactions.page:9(title)
+msgid "Transactions"
+msgstr "Transakcije"
+
+#: C/transactions.page:10(p)
+msgid "Transactions can be started, committed or rolled back on a per connection basis:"
+msgstr "Prenos je lahko zaÄ?et, uveljavljen ali povrnjen na osnovi vsake povezave:"
+
+#: C/transactions.page:14(p)
+msgid "use the <media type=\"image\" mime=\"image/png\" src=\"figures/trans-begin.png\"/> toolbar button to start a transaction"
+msgstr "uporabite <media type=\"image\" mime=\"image/png\" src=\"figures/trans-begin.png\"/> gumb orodne vrstice za zaÄ?etek prenosa."
+
+#: C/transactions.page:16(p)
+msgid "use the <media type=\"image\" mime=\"image/png\" src=\"figures/trans-commit.png\"/> toolbar button to commit the current transaction (apply all the changes)"
+msgstr "uporabite <media type=\"image\" mime=\"image/png\" src=\"figures/trans-commit.png\"/> gumb orodne vrstice za uveljavitev prenosa (uveljavi vse spremembe)."
+
+#: C/transactions.page:18(p)
+msgid "use the <media type=\"image\" mime=\"image/png\" src=\"figures/trans-rollback.png\"/> toolbar button to abort the current transaction (forget all the changes)"
+msgstr "uporabite <media type=\"image\" mime=\"image/png\" src=\"figures/trans-rollback.png\"/> gumb orodne vrstice za prekinitev prenosa (prezri vse spremembe)."
+
+#: C/transactions.page:22(p)
+msgid "A transaction may be started automatically when executing a SELECT statement which involves binary objects (BLOBs), and the transaction may be locked while the resulting data set is kept in memory (to get rid of a data set in a <link xref=\"query-execution-perspective\">query execution perspective</link>, clear the history item relating to the data set)."
+msgstr ""
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/schema-browser-perspective.page:21(None)
+#: C/general-ui.page:18(None)
+msgid "@@image: 'figures/mainwin.png'; md5=532619e33d31404118bec46a23e6e6b7"
+msgstr "@@image: 'figures/mainwin.png'; md5=532619e33d31404118bec46a23e6e6b7"
+
+#: C/schema-browser-perspective.page:8(title)
+msgid "The schema browser perspective"
+msgstr "Pogled brskalnika sheme"
+
+#: C/schema-browser-perspective.page:9(p)
+msgid "Use the schema browser perspective to understand the database's organisation (schema). To switch to this perspective, use the <guiseq><gui>Perspective</gui><gui>Schema browser</gui></guiseq> menu, or the <keyseq><key>Ctrl</key><key>B</key></keyseq> shortcut."
+msgstr ""
+
+#: C/schema-browser-perspective.page:14(p)
+msgid "The perspective is divided in two horizontal panes: the left pane for the user defined favorites, and the right pane being the action area."
+msgstr "Pogled je razdeljen na dva vodoravna pladnja: levi pladenj je namenjen priljubljenim, desni pa je obmoÄ?je dejanj."
+
+#: C/schema-browser-perspective.page:19(title)
+msgid "Schema browser perspective's default view"
+msgstr "Privzeti pogled brskalnika sheme"
+
+#: C/schema-browser-perspective.page:20(desc)
+msgid "The default Schema browser perspective"
+msgstr "Pogled privzetega brskalnika shem"
+
+#: C/schema-browser-perspective.page:24(p)
+msgid "The left part of the perspective lists the favorite database objects or diagrams. Double clicking on a favorite opens its properties in the right pane."
+msgstr ""
+
+#: C/schema-browser-perspective.page:29(p)
+msgid "The right pane is composed of several types of tabs:"
+msgstr ""
+
+#: C/schema-browser-perspective.page:33(p)
+msgid "a tab listing all the database's tables and views, in a <em>cloud</em> view where the tables with the more relations to other tables being displayed in a larger font; this tab is always present"
+msgstr ""
+
+#: C/schema-browser-perspective.page:36(p)
+msgid "zero or more tabs representing a table or views' properties: the list of columns, the list of constraints (primary or foreign keys, and unique constraints), a <link xref=\"diagram\">diagram</link> showing the related tables, and an area to define display preferences for each column's data"
+msgstr ""
+
+#: C/schema-browser-perspective.page:39(p)
+msgid "zero or more <link xref=\"diagram\">diagrams</link> in which any number of tables can be represented, where they are linked using their relations (as foreign key constraints)"
+msgstr ""
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/query-execution-perspective.page:21(None)
+msgid "@@image: 'figures/query-exec-persp.png'; md5=14f701b0619a497da6c7902facad9f42"
+msgstr "@@image: 'figures/query-exec-persp.png'; md5=14f701b0619a497da6c7902facad9f42"
+
+#: C/query-execution-perspective.page:8(title)
+msgid "The query execution perspective"
+msgstr "Pogled izvajanje poizvedbe"
+
+#: C/query-execution-perspective.page:9(p)
+msgid "Use the query perspective to execute SQL statements. To switch to this perspective, use the <guiseq><gui>Perspective</gui><gui>Query execution (SQL)</gui></guiseq> menu, or the <keyseq><key>Ctrl</key><key>S</key></keyseq> shortcut."
+msgstr ""
+
+#: C/query-execution-perspective.page:14(p)
+msgid "The perspective is divided in two horizontal panes: the left pane for the user defined favorite statements, and the right pane being the action area."
+msgstr ""
+
+#: C/query-execution-perspective.page:19(title)
+msgid "Query exec perspective"
+msgstr "Pogled poizvedbe"
+
+#: C/query-execution-perspective.page:20(desc)
+msgid "The query exec perspective with one SELECT statement executed"
+msgstr ""
+
+#: C/query-execution-perspective.page:24(p)
+msgid "The left part of the perspective lists the favorite statements which have been user defined. Activating a favorite (double clicking) resets the SQL text area's contents to the selected statement's SQL."
+msgstr ""
+
+#: C/query-execution-perspective.page:29(p)
+msgid "The right pane is composed of zero or more tabs where the SQL is entered and executed. In each tab there is:"
+msgstr ""
+
+#: C/query-execution-perspective.page:34(p)
+msgid "an SQL area in the top left part"
+msgstr "obmoÄ?je SQL na zgornjem levem delu"
+
+#: C/query-execution-perspective.page:35(p)
+msgid "command buttons in the top right part"
+msgstr "ukazni gumbi na zgornjem desnem delu"
+
+#: C/query-execution-perspective.page:36(p)
+msgid "execution history in the lower left part"
+msgstr "zgodovina izvajanja na spodnjem levem delu"
+
+#: C/query-execution-perspective.page:37(p)
+msgid "execution results in the lower right part"
+msgstr "rezultati izvajanja v spodnjem desnem delu"
+
+#: C/query-execution-perspective.page:41(title)
+msgid "SQL area"
+msgstr "ObmoÄ?je SQL"
+
+#: C/query-execution-perspective.page:42(p)
+msgid "The SQL area is an SQL editor. The SQL can be any SQL understood by the database, with the exception of <link xref=\"variables-syntax\">variables</link> (which must have a specific syntax)."
+msgstr ""
+
+#: C/query-execution-perspective.page:46(p)
+msgid "The keyboard shortcuts in the SQL editor are:"
+msgstr "Tipkovne bližnjica v urejevalniku SQL so:"
+
+#: C/query-execution-perspective.page:50(p)
+msgid "<keyseq><key>Ctrl</key><key>SPACE</key></keyseq> to obtain a completion list"
+msgstr "<keyseq><key>Ctrl</key><key>PRESLEDEK</key></keyseq> za izpis seznama dopolnjevanja"
+
+#: C/query-execution-perspective.page:51(p)
+msgid "<keyseq><key>Ctrl</key><key>ENTER</key></keyseq> to execute the SQL code"
+msgstr "<keyseq><key>Ctrl</key><key>ENTER</key></keyseq> za  izvedbo kode SQL"
+
+#: C/query-execution-perspective.page:52(p)
+msgid "<keyseq><key>Ctrl</key><key>l</key></keyseq> to clear the editor"
+msgstr "<keyseq><key>Ctrl</key><key>l</key></keyseq> za poÄ?iÅ¡Ä?enje urejevalnika"
+
+#: C/query-execution-perspective.page:53(p)
+msgid "<keyseq><key>Ctrl</key><key>Up</key></keyseq> and <keyseq><key>Ctrl</key><key>Down</key></keyseq> to navigate through the editor's history"
+msgstr "<keyseq><key>Ctrl</key><key>Gor</key></keyseq> in <keyseq><key>Ctrl</key><key>Dol</key></keyseq> za krmarjenje po zgodovini urejevalnika"
+
+#: C/query-execution-perspective.page:59(title)
+msgid "Command buttons"
+msgstr "Ukazni gumbi"
+
+#: C/query-execution-perspective.page:60(p)
+#: C/data-manager-perspective.page:63(p)
+msgid "The commands available through the command buttons are:"
+msgstr ""
+
+#: C/query-execution-perspective.page:64(p)
+msgid "<gui>Clear</gui>: clears the editor (similar to the <keyseq><key>Ctrl</key><key>l</key></keyseq> shortcut)"
+msgstr ""
+
+#: C/query-execution-perspective.page:65(p)
+msgid "<gui>Variables</gui>: shows or hides the <link xref=\"variables-syntax\">variables</link> panel where you can give values to the variables present in the SQL code. The panel is automatically shown when a variable is detected in the SQL code"
+msgstr ""
+
+#: C/query-execution-perspective.page:68(p)
+msgid "<gui>Execute</gui>: executes the SQL code. If the SQL code contains some variables which have not been set, then a popup first appears requesting the variables to be given values. This is similar to the <keyseq><key>Ctrl</key><key>ENTER</key></keyseq> shortcut"
+msgstr ""
+
+#: C/query-execution-perspective.page:71(p)
+msgid "<gui>Indent</gui>: re-indents the SQL code (warning: this removes any comments)"
+msgstr ""
+
+#: C/query-execution-perspective.page:72(p)
+msgid "<gui>Favorites</gui>: adds the current SQL code to the favorites"
+msgstr ""
+
+#: C/query-execution-perspective.page:77(title)
+msgid "Execution history"
+msgstr "Zgodovina izvajanja"
+
+#: C/query-execution-perspective.page:78(p)
+msgid "The execution history part contains a list of the past executed statements, ordered by execution date along with an indication when the statement was executed (11 minutes in the figure above). Selecting an history item displays the corresponding result in the execution results part."
+msgstr ""
+
+#: C/query-execution-perspective.page:83(p)
+msgid "The <gui>Copy</gui> button copies the currently selected history item's SQL code to the SQL editor, and the <gui>Clear</gui> button removes all the history items."
+msgstr ""
+
+#: C/query-execution-perspective.page:87(p)
+msgid "Note that any given history item can also be removed individually using the <key>Suppr</key> key."
+msgstr ""
+
+#: C/query-execution-perspective.page:93(title)
+msgid "Execution results"
+msgstr "Rezultati izvajanja"
+
+#: C/query-execution-perspective.page:94(p)
+msgid "The Execution results part displays the execution result of the currently selected execution history item, as a table for SELECT statement, giving information for other types of statement, or giving the execution error notice if the execution failed."
+msgstr ""
+
+#: C/index.page:6(name)
+msgid "Vivien Malerba"
+msgstr "Vivien Malerba"
+
+#: C/index.page:7(email)
+msgid "malerba gnome-db org"
+msgstr "malerba gnome-db org"
+
+#: C/index.page:11(title)
+msgid "Gda Browser Help"
+msgstr "PomoÄ? brskalnika GDA"
+
+#: C/index.page:12(p)
+msgid "<app>gda-browser</app> is a tool for database administrators: they can analyse database's schemas to understand how data is organized, run SQL commands interactively, and in a broader way manage the data contained in the databases."
+msgstr ""
+
+#: C/index.page:16(p)
+msgid "Several connections to databases can be opened at once, allowing the user to work on multiple databases at once (it is also possible to execute commands on several connections at the same time)."
+msgstr ""
+
+#: C/index.page:19(p)
+msgid "As <app>gda-browser</app> uses the <app>libgda</app> library, it can open connections to databases for which a database driver (provider) exists in <app>libgda</app> (<link href=\"http://www.oracle.com\";>Oracle</link>, <link href=\"http://www.mysql.org\";>MySQL</link>, <link href=\"http://www.postgresql.org/\";>PostgreSQL</link>, <link href=\"http://www.sqlite.org\";>SQLite</link>, MS Access (through the <link href=\"http://sourceforge.net/projects/mdbtools/\";>MDBTools</link> library) and <link href=\"http://java.sun.com/docs/books/tutorial/jdbc/index.html\";>JDBC</link> are supported at the moment)."
+msgstr ""
+
+#: C/index.page:28(title)
+msgid "Presentation"
+msgstr "Predstavitev"
+
+#: C/index.page:31(title)
+msgid "Perspectives"
+msgstr "Pogledi"
+
+#: C/index.page:35(title)
+msgid "Connections management"
+msgstr "Upravljanje povezav"
+
+#: C/general-ui.page:8(title)
+msgid "General interface organization"
+msgstr "Splošna organizacija vmesnika"
+
+#: C/general-ui.page:9(p)
+msgid "The <app>gda-browser</app> is composed of one or more top level windows, each window relating to a single connection (which name is in its title). For any given connection, several windows can be opened (use the <guiseq><gui>Window</gui><gui>New window</gui></guiseq> menu or the <keyseq><key>Ctrl</key><key>N</key></keyseq> shortcut)."
+msgstr ""
+
+#: C/general-ui.page:16(title)
+msgid "A connection window"
+msgstr "Okno povezave"
+
+#: C/general-ui.page:17(desc)
+msgid "Window opened for the 'c1' connection (and the Schema browser perspective)"
+msgstr ""
+
+#: C/general-ui.page:21(p)
+msgid "Within each window, several <em>perspectives</em> are available which are adapted to different activities:"
+msgstr ""
+
+#: C/general-ui.page:26(p)
+msgid "the <link xref=\"schema-browser-perspective\">Schema browser perspective</link> to help understand the database's layout"
+msgstr ""
+
+#: C/general-ui.page:27(p)
+msgid "the <link xref=\"query-execution-perspective\">Query execution perspective</link> to execute any SQL command"
+msgstr ""
+
+#: C/general-ui.page:28(p)
+msgid "the <link xref=\"data-manager-perspective\">Data manager perspective</link> to navigate through the database's contents"
+msgstr ""
+
+#: C/general-ui.page:30(p)
+msgid "The currently displayed perspective can be changed individually for each window, and, as all perspectives have an action area composed of tabs, tabs can be moved from one window to the other if the source and destination window are for the same connection, and display the same perspective (simply drag and drop a tab from one window to the other using the tab's label as a handle)."
+msgstr ""
+
+#: C/features.page:8(title)
+msgid "Features"
+msgstr "Zmožnosti"
+
+#: C/features.page:9(p)
+msgid "<app>gda-browser</app>'s current features are:"
+msgstr "Trenutne zmožnosti programa <app>gda-browser</app> so:"
+
+#: C/features.page:13(p)
+msgid "multiple simultaneous connections can be opened at once"
+msgstr ""
+
+#: C/features.page:14(p)
+msgid "multi threaded: each connection is handled in it own thread, meaning that no single connection can lock the application"
+msgstr ""
+
+#: C/features.page:16(p)
+msgid "several windows can be opened for a single connection"
+msgstr ""
+
+#: C/features.page:17(p)
+msgid "full screen mode accessible to maximize the screen space usage"
+msgstr ""
+
+#: C/features.page:18(p)
+msgid "extensibility: the general framework is opened enough to add new integrated features"
+msgstr ""
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/diagram.page:15(None)
+msgid "@@image: 'figures/diagram.png'; md5=0ad77cfbbead0832d8ce7fa22d3ce01d"
+msgstr "@@image: 'figures/diagram.png'; md5=0ad77cfbbead0832d8ce7fa22d3ce01d"
+
+#: C/diagram.page:7(title)
+msgid "Diagrams"
+msgstr "Diagrami"
+
+#: C/diagram.page:8(p)
+msgid "Diagrams are present throughout the <app>gda-browser</app>, and are made of a canvas on which graphical items are displayed (like tables for example)."
+msgstr ""
+
+#: C/diagram.page:13(title)
+msgid "Diagram"
+msgstr "Diagram"
+
+#: C/diagram.page:14(desc)
+msgid "Diagram showing some tables and their relations"
+msgstr ""
+
+#: C/diagram.page:17(p)
+msgid "The items can be moved around on the canvas (note that as long as the whole diagram fits in the canvas, it remains centered on it). Other manipulations are possible:"
+msgstr ""
+
+#: C/diagram.page:22(p)
+msgid "zooming in and out using the mouse's wheel, or through the contextual menu (right click on the canvas); a zoom to fit the canvas is also available in the contextual menu"
+msgstr ""
+
+#: C/diagram.page:24(p)
+msgid "bring closer or moving away items from one another using the mouse's wheel while holding the <key>Shift</key> key"
+msgstr ""
+
+#: C/diagram.page:26(p)
+msgid "arranging items linearly or radially, through the contextual menu"
+msgstr ""
+
+#: C/diagram.page:27(p)
+msgid "printing, through the contextual menu"
+msgstr ""
+
+#: C/diagram.page:28(p)
+msgid "exporting as PNG or SVG images, through the contextual menu"
+msgstr ""
+
+#: C/diagram.page:29(p)
+msgid "adding items, through the contextual menu"
+msgstr ""
+
+#: C/diagram.page:30(p)
+msgid "removing items, through the items's contextual menu"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:7(title)
+msgid "The data manager's XML syntax"
+msgstr "Skladnja XML podatkovnega upravljalnika"
+
+#: C/data-manager-xml-syntax.page:8(p)
+msgid "The XML tree's root node must be a <code>&lt;data&gt;</code>, which is allowed to contain one or more data source definitions. Each data source is defined by <code>&lt;query&gt;</code> or <code>&lt;table&gt;</code> nodes, both accepting the following optional attributes:"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:15(p)
+msgid "\"id\" to specify a data source string ID, used when linking data sources one to another;"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:16(p)
+msgid "\"title\" to specify a title."
+msgstr "\"naziv\" za doloÄ?evanje naziva."
+
+#: C/data-manager-xml-syntax.page:18(p)
+msgid "It is of course possible to use both the <code>&lt;query&gt;</code> or <code>&lt;table&gt;</code> tags in the same data sources specifications."
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:24(title)
+#: C/data-manager-xml-syntax.page:73(title)
+#: C/data-manager-xml-syntax.page:132(title)
+msgid "Exported variables"
+msgstr "Izvožene spremenljivke"
+
+#: C/data-manager-xml-syntax.page:25(p)
+msgid "Each data source exports some variables which can be reused by other data sources to introduce a dependency. When the data sources are executed, the contents of these exported variables are reset depending on the row actually selected in the resulting tabular view. If no row is selected then the variable is unset."
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:31(p)
+msgid "Any data source depending on a variable is executed again when the variable changes, and in case the variable is unset, the data source's execution result is an empty data set."
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:37(title)
+msgid "The <code>&lt;query&gt;</code> tag"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:38(p)
+msgid "Use the <code>&lt;query&gt;</code> tag to specify an SQL SELECT statement, as the contents of the tag. Linkage to other data sources can be achieved using <link xref=\"variables-syntax\">variables</link> in the SELECT's SQL."
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:54(p)
+#: C/data-manager-xml-syntax.page:110(p)
+msgid "For example the previous XML specification defines two data sources:"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:58(p)
+msgid "the <code>customers</code> data source which selects some fields from the <em>customers</em> table, and which depends on a string variable named <code>name</code>. This variable has to be set when the data sources are executed because it won't be exported by any data source in this specification."
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:62(p)
+msgid "the <code>cust_details</code> data source which selects all the details of a customer specified using its ID. This second data source depends on the previous one because the <code>customers id</code> variable is exported from the <code>customers</code> data source."
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:67(p)
+msgid "Executing this data sources specification will create two tabular views: one where you can select a customer, and one which displays all the attributes for the selected customer."
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:74(p)
+msgid "Each data source defined by a <code>&lt;query&gt;</code> tag exports the following variable for each column of the resulting data set (the variable's type is the same as the column's type):"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:79(p)
+#: C/data-manager-xml-syntax.page:139(p)
+msgid "<code>&lt;data source ID&gt;@&lt;column position&gt;</code> where the column's position starts at 1"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:81(code)
+#, no-wrap
+msgid "&lt;data source ID&gt;@&lt;column name&gt; if the data set's column is a table column"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:88(title)
+msgid "The <code>&lt;table&gt;</code> tag"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:89(p)
+msgid "Use the <code>&lt;table&gt;</code> tag to define a data source which will display the contents of a table. This tag:"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:94(p)
+msgid "requires the \"name\" attribute which represents the table name."
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:95(p)
+msgid "can contain a <code>&lt;depend&gt;</code> node which defines a dependency on another data source with the \"foreign_key_table\" attribute defining the name of the table to which there are foreign keys used to determine the dependency, and the \"id\" attribute can specify a data source ID if different than the aforementioned table"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:114(p)
+msgid "the <code>customers</code> data source which selects all the contents of the <em>customers</em> table."
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:116(p)
+msgid "the <code>orders</code> data source which selects among contents of the <code>orders</code> table, the rows which correspond to a row in the <code>customers</code> table (assuming here that the <code>orders</code> references the <code>customers</code> table in some way)."
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:121(p)
+msgid "Note in this example that:"
+msgstr "Bodite pozorni, da v tem primeru:"
+
+#: C/data-manager-xml-syntax.page:125(p)
+msgid "you don't have to specify the fields involved in the foreign key linking the <code>orders</code> and <code>customers</code> tables"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:127(p)
+msgid "the data sources IDs have been assigned the names of the selected tables as no \"id\" attribute has been specified for the <code>&lt;table&gt;</code> tags."
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:133(p)
+msgid "Each data source defined by a <code>&lt;query&gt;</code> tag exports the following variable for each table's column (the variable's type is the same as the column's type):"
+msgstr ""
+
+#: C/data-manager-xml-syntax.page:138(code)
+#, no-wrap
+msgid "&lt;data source ID&gt;@&lt;column name&gt;"
+msgstr ""
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/data-manager-perspective.page:27(None)
+msgid "@@image: 'figures/data-man-persp.png'; md5=a0469e170ca29937cd898aae8af6620c"
+msgstr "@@image: 'figures/data-man-persp.png'; md5=a0469e170ca29937cd898aae8af6620c"
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/data-manager-perspective.page:53(None)
+#: C/data-manager-perspective.page:80(None)
+msgid "@@image: 'figures/data-man-mode.png'; md5=fa36a6e1e640c7a082fc7c3d16e095d6"
+msgstr "@@image: 'figures/data-man-mode.png'; md5=fa36a6e1e640c7a082fc7c3d16e095d6"
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/data-manager-perspective.page:60(None)
+msgid "@@image: 'figures/data-man-xmlcompose.png'; md5=47629c29ef2c7d336e4401e66ba849e0"
+msgstr "@@image: 'figures/data-man-xmlcompose.png'; md5=47629c29ef2c7d336e4401e66ba849e0"
+
+#: C/data-manager-perspective.page:8(title)
+msgid "The data manager perspective"
+msgstr "Pogled upravljalnika podatkov"
+
+#: C/data-manager-perspective.page:9(p)
+msgid "Use the data manager perspective to navigate through the database's data. To switch to this perspective, use the <guiseq><gui>Perspective</gui><gui>Data Manager</gui></guiseq> menu, or the <keyseq><key>Ctrl</key><key>D</key></keyseq> shortcut."
+msgstr ""
+
+#: C/data-manager-perspective.page:14(p)
+msgid "The workflow in this perspective is organized around the definition of one or more <em>data sources</em> (which selects data in the database) which, when executed, result in a data set displayed in a tabular view."
+msgstr ""
+
+#: C/data-manager-perspective.page:19(p)
+msgid "The perspective is divided in two horizontal panes: the left pane to keep favorite data sources set's definitions, and the right pane being the action area, where each data source is executed and the results presented in a tabular view."
+msgstr ""
+
+#: C/data-manager-perspective.page:25(title)
+msgid "Data manager perspective"
+msgstr "Pogled upravljalnika nalog"
+
+#: C/data-manager-perspective.page:26(desc)
+msgid "The data manager perspective, with two data sources"
+msgstr ""
+
+#: C/data-manager-perspective.page:29(p)
+msgid "In the figure above, there are two data sources: one for the 'customers' table and one for the 'orders' table (which here lists the orders from a customer), the later data source depending on the former one as there is a foreign key from the 'orders' table which references the 'customers' table. The two data sources have been executed and the result is composed of two tabular views side by side."
+msgstr ""
+
+#: C/data-manager-perspective.page:36(p)
+msgid "Because the 'orders' data source depends on the 'customers' data source, its corresponding view is on the right of the one corresponding to the 'customers' data source. Also when the row selection of the 'customers' view changes, the whole contents of the 'orders' view is refreshed."
+msgstr ""
+
+#: C/data-manager-perspective.page:44(title)
+msgid "Defining data sources"
+msgstr "DoloÄ?evanje podatkovnih virov"
+
+#: C/data-manager-perspective.page:45(p)
+msgid "The simplest data source is a data source which represents all the data from a table, displayed when executed as a single tabular view, as if one executed the <code>SELECT * FROM mytable</code> statement in the <link xref=\"query-execution-perspective\"/>."
+msgstr ""
+
+#: C/data-manager-perspective.page:51(p)
+msgid "The following figure shows the data sources editing mode (switch to editing mode using the <media type=\"image\" mime=\"image/png\" src=\"figures/data-man-mode.png\"/> toolbar button) at the moment data sources can only be defined using an <link xref=\"data-manager-xml-syntax\">XML syntax</link>."
+msgstr ""
+
+#: C/data-manager-perspective.page:58(title)
+msgid "Data sources edition"
+msgstr "Urejanje podatkovnih virov"
+
+#: C/data-manager-perspective.page:59(desc)
+msgid "Editing data sources in the data manager perspective"
+msgstr ""
+
+#: C/data-manager-perspective.page:67(p)
+msgid "<gui>Clear</gui>: clears the XML editor"
+msgstr ""
+
+#: C/data-manager-perspective.page:68(p)
+msgid "<gui>Variables</gui>: shows/hide the <link xref=\"variables-syntax\">variables</link> panel where you can give values to the variables present in the SQL code of any data source's definition. The panel is automatically shown when a variable is detected in the SQL code."
+msgstr ""
+
+#: C/data-manager-perspective.page:71(p)
+msgid "<gui>Execute</gui>: executes the defined data sources"
+msgstr ""
+
+#: C/data-manager-perspective.page:72(p)
+msgid "<gui>View XML</gui>: toggles between the XML editor and the UI editor"
+msgstr ""
+
+#: C/data-manager-perspective.page:73(p)
+msgid "<gui>Help</gui>: shows some help"
+msgstr "<gui>PomoÄ?</gui>: pokaže pomoÄ?"
+
+#: C/data-manager-perspective.page:77(title)
+msgid "Executing defined data sources"
+msgstr "Izvajanje doloÄ?enih podatkovnih virov"
+
+#: C/data-manager-perspective.page:78(p)
+msgid "To execute a defined set of data sources, simply switch to execute mode using the <media type=\"image\" mime=\"image/png\" src=\"figures/data-man-mode.png\"/> toolbar button or the <gui>Execute</gui> button."
+msgstr ""
+
+#: C/data-manager-perspective.page:83(p)
+msgid "The layout of tabular views for each data source is automatically generated in columns using the following rule: if a data source B depends on a data source A, then its tabular view is displayed on the right of the one for A."
+msgstr ""
+
+#: C/data-manager-perspective.page:88(p)
+msgid "Also if you change the selected row of tabular view of a data source A, then the tabular views of all the data sources depending on A will also have their tabular view refreshed."
+msgstr ""
+
+#. Put one translator per line, in the form of NAME <EMAIL>, YEAR1, YEAR2
+#: C/index.page:0(None)
+msgid "translator-credits"
+msgstr "Matej UrbanÄ?iÄ? <mateju svn gnome org>, 2010."
+
diff --git a/tools/browser/query-exec/query-console.c b/tools/browser/query-exec/query-console.c
index 3db9824..cf5d98b 100644
--- a/tools/browser/query-exec/query-console.c
+++ b/tools/browser/query-exec/query-console.c
@@ -136,12 +136,6 @@ static GtkActionGroup      *query_console_page_get_actions_group (BrowserPage *p
 static const gchar         *query_console_page_get_actions_ui (BrowserPage *page);
 static GtkWidget           *query_console_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button);
 
-enum {
-	DUMMY,
-	LAST_SIGNAL
-};
-
-static guint query_console_signals[LAST_SIGNAL] = { };
 static GObjectClass *parent_class = NULL;
 
 /*
@@ -933,14 +927,15 @@ query_exec_fetch_cb (QueryConsole *tconsole)
 				if (! history->within_transaction &&
 				    browser_connection_get_transaction_status (tconsole->priv->bcnc) &&
 				    gda_statement_get_statement_type (estmt->stmt) != GDA_SQL_STATEMENT_BEGIN) {
-					browser_show_notice (GTK_WINDOW (gtk_widget_get_toplevel ((GtkWidget*) tconsole)),
-							     "QueryExecTransactionStarted",
-							     "%s", _("A transaction has automatically been started\n"
-								     "during this statement's execution, this usually\n"
-								     "happens when blobs are selected (and the transaction\n"
-								     "will have to remain opened while the blobs are still\n"
-								     "accessible, clear the corresponding history item before\n"
-								     "closing the transaction)."));
+					browser_window_show_notice_printf (BROWSER_WINDOW (gtk_widget_get_toplevel ((GtkWidget*) tconsole)),
+									   GTK_MESSAGE_INFO,
+									   "QueryExecTransactionStarted",
+									   "%s", _("A transaction has automatically been started\n"
+										   "during this statement's execution, this usually\n"
+										   "happens when blobs are selected (and the transaction\n"
+										   "will have to remain opened while the blobs are still\n"
+										   "accessible, clear the corresponding history item before\n"
+										   "closing the transaction)."));
 				}
 				
 				query_editor_add_history_item (tconsole->priv->history, history);
@@ -993,8 +988,8 @@ query_exec_fetch_cb (QueryConsole *tconsole)
 
 /**
  * query_console_set_text
- * @console:
- * @text:
+ * @console: a #QueryConsole
+ * @text: the new text
  *
  * Replaces the edited SQL with @text in @console
  */
diff --git a/tools/browser/query-exec/query-favorite-selector.c b/tools/browser/query-exec/query-favorite-selector.c
index 69c3c3d..7c04e35 100644
--- a/tools/browser/query-exec/query-favorite-selector.c
+++ b/tools/browser/query-exec/query-favorite-selector.c
@@ -410,9 +410,6 @@ static gboolean tree_store_drag_can_drag_cb (GdauiTreeStore *store, const gchar
 					     QueryFavoriteSelector *tsel);
 static gboolean tree_store_drag_get_cb (GdauiTreeStore *store, const gchar *path,
 					GtkSelectionData *selection_data, QueryFavoriteSelector *tsel);
-static void trash_data_received_cb (GtkWidget *widget, GdkDragContext *context, gint x, gint y,
-				    GtkSelectionData *selection_data, guint target_type, guint time,
-				    QueryFavoriteSelector *tsel);
 /**
  * query_favorite_selector_new
  *
diff --git a/tools/browser/schema-browser/favorite-selector.c b/tools/browser/schema-browser/favorite-selector.c
index 8f881a3..d162814 100644
--- a/tools/browser/schema-browser/favorite-selector.c
+++ b/tools/browser/schema-browser/favorite-selector.c
@@ -208,9 +208,7 @@ static gboolean tree_store_drag_can_drag_cb (GdauiTreeStore *store, const gchar
 					     FavoriteSelector *tsel);
 static gboolean tree_store_drag_get_cb (GdauiTreeStore *store, const gchar *path,
 					GtkSelectionData *selection_data, FavoriteSelector *tsel);
-static void trash_data_received_cb (GtkWidget *widget, GdkDragContext *context, gint x, gint y,
-				    GtkSelectionData *selection_data, guint target_type, guint time,
-				    FavoriteSelector *tsel);
+
 /**
  * favorite_selector_new
  *
@@ -346,7 +344,7 @@ tree_store_drag_drop_cb (GdauiTreeStore *store, const gchar *path, GtkSelectionD
 	fav.contents = (gchar*) gtk_selection_data_get_data (selection_data);
 
 	pos = atoi (path);
-	g_print ("%s() path => %s, pos: %d\n", __FUNCTION__, path, pos);
+	/*g_print ("%s() path => %s, pos: %d\n", __FUNCTION__, path, pos);*/
 	
 	bfav = browser_connection_get_favorites (tsel->priv->bcnc);
 	if (! browser_favorites_add (bfav, 0, &fav, ORDER_KEY_SCHEMA, pos, &error)) {
diff --git a/tools/browser/schema-browser/relations-diagram.c b/tools/browser/schema-browser/relations-diagram.c
index 842b0d6..f67520e 100644
--- a/tools/browser/schema-browser/relations-diagram.c
+++ b/tools/browser/schema-browser/relations-diagram.c
@@ -73,12 +73,6 @@ enum {
         PROP_0,
 };
 
-enum {
-	SELECTION_CHANGED,
-	LAST_SIGNAL
-};
-
-static guint relations_diagram_signals[LAST_SIGNAL] = { 0 };
 static GObjectClass *parent_class = NULL;
 
 
diff --git a/tools/browser/schema-browser/schema-browser-perspective.c b/tools/browser/schema-browser/schema-browser-perspective.c
index 2e6bcf4..6f6eb34 100644
--- a/tools/browser/schema-browser/schema-browser-perspective.c
+++ b/tools/browser/schema-browser/schema-browser-perspective.c
@@ -269,7 +269,7 @@ fav_selection_changed_cb (GtkWidget *widget, gint fav_id, BrowserFavoritesType f
 		g_warning ("Can't display diagram because canvas not compiled.");
 #endif
 	}
-#ifdef GDA_DEBUG
+#ifdef GDA_DEBUG_NO
 	g_print ("Reacted to selection fav_id=>%d type=>%u, contents=>%s\n", fav_id, fav_type, selection);	
 #endif
 }
diff --git a/tools/browser/schema-browser/table-columns.c b/tools/browser/schema-browser/table-columns.c
index a08a635..f074ee5 100644
--- a/tools/browser/schema-browser/table-columns.c
+++ b/tools/browser/schema-browser/table-columns.c
@@ -49,12 +49,6 @@ static void table_columns_dispose   (GObject *object);
 
 static void meta_changed_cb (BrowserConnection *bcnc, GdaMetaStruct *mstruct, TableColumns *tcolumns);
 
-enum {
-	SELECTION_CHANGED,
-	LAST_SIGNAL
-};
-
-static guint table_columns_signals[LAST_SIGNAL] = { 0 };
 static GObjectClass *parent_class = NULL;
 
 
@@ -301,6 +295,9 @@ meta_changed_cb (BrowserConnection *bcnc, GdaMetaStruct *mstruct, TableColumns *
 						cvalue = gda_data_model_get_value_at (model, 0, i, NULL);
 						if (!current_value || 
 						    gda_value_compare (cvalue, current_value)) {
+							if (current_value)
+								gtk_text_buffer_insert (tbuffer, &current,
+											"\n\n", -1);
 							gtk_text_buffer_insert_with_tags_by_name (tbuffer,
 												  &current, 
 												  _("Unique constraint"), -1,
diff --git a/tools/browser/schema-browser/table-info.c b/tools/browser/schema-browser/table-info.c
index 2227d3f..eb0e438 100644
--- a/tools/browser/schema-browser/table-info.c
+++ b/tools/browser/schema-browser/table-info.c
@@ -82,12 +82,6 @@ enum {
         PROP_0,
 };
 
-enum {
-	SELECTION_CHANGED,
-	LAST_SIGNAL
-};
-
-static guint table_info_signals[LAST_SIGNAL] = { 0 };
 static GObjectClass *parent_class = NULL;
 
 
@@ -522,9 +516,10 @@ static void statement_executed_cb (BrowserConnection *bcnc,
 				    error->message ?
 				    error->message : _("No detail"));
 	else
-		browser_show_notice (GTK_WINDOW (gtk_widget_get_toplevel ((GtkWidget*) tinfo)),
-				     "DataInsertQuery",
-				     _("Data successfully inserted"));
+		browser_window_show_notice_printf (BROWSER_WINDOW (gtk_widget_get_toplevel ((GtkWidget*) tinfo)),
+						   GTK_MESSAGE_INFO,
+						   "DataInsertQuery",
+						   _("Data successfully inserted"));
 }
 
 static void
diff --git a/tools/browser/schema-browser/table-preferences.c b/tools/browser/schema-browser/table-preferences.c
index 1c4c469..6dcdca5 100644
--- a/tools/browser/schema-browser/table-preferences.c
+++ b/tools/browser/schema-browser/table-preferences.c
@@ -67,12 +67,6 @@ static void       update_column_properties (TablePreferences *tpref);
 static void meta_changed_cb (BrowserConnection *bcnc, GdaMetaStruct *mstruct, TablePreferences *tpreferences);
 static void plugins_combo_changed_cb (GtkComboBox *combo, TablePreferences *tpref);
 
-enum {
-	DUMMY,
-	LAST_SIGNAL
-};
-
-static guint table_preferences_signals[LAST_SIGNAL] = { };
 static GObjectClass *parent_class = NULL;
 
 #ifdef G_OS_WIN32
diff --git a/tools/browser/schema-browser/table-relations.c b/tools/browser/schema-browser/table-relations.c
index bef1eab..0a148ff 100644
--- a/tools/browser/schema-browser/table-relations.c
+++ b/tools/browser/schema-browser/table-relations.c
@@ -46,12 +46,6 @@ static void table_relations_dispose   (GObject *object);
 
 static void meta_changed_cb (BrowserConnection *bcnc, GdaMetaStruct *mstruct, TableRelations *trels);
 
-enum {
-	SELECTION_CHANGED,
-	LAST_SIGNAL
-};
-
-static guint table_relations_signals[LAST_SIGNAL] = { 0 };
 static GObjectClass *parent_class = NULL;
 
 
diff --git a/tools/browser/support.c b/tools/browser/support.c
index e408727..ddc7fea 100644
--- a/tools/browser/support.c
+++ b/tools/browser/support.c
@@ -26,6 +26,7 @@
 #include "browser-core.h"
 #include "browser-window.h"
 #include "login-dialog.h"
+#include <libgda-ui/internal/utility.h>
 
 #ifdef HAVE_MAC_INTEGRATION
 #include <gtkosxapplication.h>
@@ -33,6 +34,9 @@ GtkOSXApplication *theApp = NULL;
 #endif
 
 /**
+ * browser_connection_open
+ * @error: a place to store errors, or %NULL
+ * 
  * Display a login dialog and, if validated, create a new #BrowserConnection
  *
  * Returns: a new #BrowserConnection, or %NULL (the caller DOES NOT OWN a reference to the returned value)
@@ -59,6 +63,10 @@ browser_connection_open (GError **error)
 }
 
 /**
+ * browser_connection_close
+ * @parent: a #GtkWindow
+ * @bcnc: a #BrowserConnection object
+ *
  * Displays a warning dialog and close @bcnc
  *
  * Returns: %TRUE if the connection has been closed
@@ -115,7 +123,8 @@ browser_connection_close (GtkWindow *parent, BrowserConnection *bcnc)
  * @format: printf() style format string
  * @...: arguments for @format
  *
- * Displays a modal error until the user aknowledges it.
+ * Displays an error message until the user aknowledges it. I @parent is a #BrowserWindow, then
+ * the error message is displayed in the window if possible
  */
 void
 browser_show_error (GtkWindow *parent, const gchar *format, ...)
@@ -130,6 +139,12 @@ browser_show_error (GtkWindow *parent, const gchar *format, ...)
         vsnprintf (sz, sizeof (sz), format, args);
         va_end (args);
 
+	if (BROWSER_IS_WINDOW (parent)) {
+		browser_window_show_notice (BROWSER_WINDOW (parent), GTK_MESSAGE_ERROR,
+					    NULL, sz);
+		return;
+	}
+
         /* create the error message dialog */
 	dialog = gtk_message_dialog_new (parent,
 					 GTK_DIALOG_DESTROY_WITH_PARENT |
@@ -144,86 +159,6 @@ browser_show_error (GtkWindow *parent, const gchar *format, ...)
         gtk_widget_destroy (dialog);
 }
 
-/* hash table to remain which context notices have to be hidden: key=context, value=GINT_TO_POINTER (1) */
-static GHashTable *hidden_contexts = NULL;
-
-static void
-hide_notice_toggled_cb (GtkToggleButton *toggle, gchar *context)
-{
-	g_assert (hidden_contexts);
-	if (gtk_toggle_button_get_active (toggle))
-		g_hash_table_insert (hidden_contexts, g_strdup (context), GINT_TO_POINTER (TRUE));
-	else
-		g_hash_table_remove (hidden_contexts, context);
-}
-
-/**
- * browser_show_notice
- * @parent: a #GtkWindow
- * @context: a context string or %NULL
- * @format: printf() style format string
- * @...: arguments for @format
- *
- * Displays a modal notice until the user aknowledges it.
- *
- * If @context is not NULL, then the message box contains a check box to avoid displaying the
- * same massage again.
- */
-void
-browser_show_notice (GtkWindow *parent, const gchar *context, const gchar *format, ...)
-{
-        va_list args;
-        gchar sz[2048];
-        GtkWidget *dialog;
-	gboolean hide = FALSE;
-
-        /* build the message string */
-        va_start (args, format);
-        vsnprintf (sz, sizeof (sz), format, args);
-        va_end (args);
-
-	if (context) {
-		if (!hidden_contexts)
-			hidden_contexts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
-		hide = GPOINTER_TO_INT (g_hash_table_lookup (hidden_contexts, context));
-	}
-
-	if (hide) {
-		if (BROWSER_IS_WINDOW (parent)) {
-			gchar *ptr;
-			for (ptr = sz; *ptr && (*ptr != '\n'); ptr++);
-			if (*ptr) {
-				*ptr = '.'; ptr++;
-				*ptr = '.'; ptr++;
-				*ptr = '.'; ptr++;
-				*ptr = 0;
-			}
-			browser_window_push_status (BROWSER_WINDOW (parent),
-						    "SupportNotice", sz, TRUE);
-		}
-	}
-	else {
-		/* create the error message dialog */
-		dialog = gtk_message_dialog_new_with_markup (parent,
-							     GTK_DIALOG_DESTROY_WITH_PARENT |
-							     GTK_DIALOG_MODAL, GTK_MESSAGE_INFO,
-							     GTK_BUTTONS_CLOSE,
-							     "<span weight=\"bold\">%s</span>\n%s", _("Note:"), sz);
-		if (context) {
-			GtkWidget *cb;
-			cb = gtk_check_button_new_with_label (_("Don't show this message again"));
-			g_signal_connect_data (cb, "toggled",
-					       G_CALLBACK (hide_notice_toggled_cb), g_strdup (context),
-					       (GClosureNotify) g_free, 0);
-			gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), cb, FALSE, FALSE, 10);
-		}
-		
-		gtk_widget_show_all (dialog);
-		gtk_dialog_run (GTK_DIALOG (dialog));
-		gtk_widget_destroy (dialog);
-	}
-}
-
 #ifdef HAVE_GDU
 /**
  * browser_show_help
@@ -293,6 +228,9 @@ browser_show_help (GtkWindow *parent, const gchar *topic)
 		
 		g_error_free (error);
 	}
+	else
+		browser_window_show_notice (BROWSER_WINDOW (parent), GTK_MESSAGE_INFO,
+					    "show-help", _("Help is being loaded, please wait..."));
 
 	g_free (uri);
 }
@@ -403,6 +341,7 @@ browser_get_pixbuf_icon (BrowserIconType type)
 		"gda-browser-query.png",
 		"gda-browser-grid.png",
 		"gda-browser-form.png",
+		"gda-browser-menu-ind.png",
 	};
 
 	if (!array)
@@ -548,6 +487,7 @@ browser_make_small_button (gboolean is_toggle, const gchar *label, const gchar *
 	if (label) {
 		GtkWidget *wid;
 		wid = gtk_label_new (label);
+		gtk_misc_set_alignment (GTK_MISC (wid), 0., -1);
 		if (hbox)
 			gtk_box_pack_start (GTK_BOX (hbox), wid, FALSE, FALSE, 5);
 		else
@@ -560,30 +500,6 @@ browser_make_small_button (gboolean is_toggle, const gchar *label, const gchar *
 	return button;
 }
 
-static gboolean
-tree_view_button_pressed_cb (GtkWidget *widget, GdkEventButton *event, gpointer data)
-{
-	GtkTreeView *tree_view;
-	GtkTreeSelection *selection;
-
-	if (event->button != 3)
-		return FALSE;
-
-	tree_view = GTK_TREE_VIEW (widget);
-	selection = gtk_tree_view_get_selection (tree_view);
-
-	/* force selection of row on which clicked occurred */
-	GtkTreePath *path;
-	if ((event->window == gtk_tree_view_get_bin_window (tree_view)) &&
-	    gtk_tree_view_get_path_at_pos (tree_view, event->x, event->y, &path, NULL, NULL, NULL)) {
-		gtk_tree_selection_unselect_all (selection);
-		gtk_tree_selection_select_path (selection, path);
-		gtk_tree_path_free (path);
-	}
-
-	return FALSE;
-}
-
 /**
  * browser_make_tree_view
  * @model: a #GtkTreeModel
@@ -600,8 +516,6 @@ browser_make_tree_view (GtkTreeModel *model)
 	g_return_val_if_fail (GTK_IS_TREE_MODEL (model), NULL);
 	tv = gtk_tree_view_new_with_model (model);
 
-	g_signal_connect (G_OBJECT (tv), "button-press-event",
-                          G_CALLBACK (tree_view_button_pressed_cb), NULL);
-
+	_gdaui_setup_right_click_selection_on_treeview (GTK_TREE_VIEW (tv));
 	return tv;
 }
diff --git a/tools/browser/support.h b/tools/browser/support.h
index 4529338..f6c7100 100644
--- a/tools/browser/support.h
+++ b/tools/browser/support.h
@@ -36,7 +36,6 @@ G_BEGIN_DECLS
 BrowserConnection *browser_connection_open (GError **error);
 gboolean           browser_connection_close (GtkWindow *parent, BrowserConnection *bcnc);
 void               browser_show_error (GtkWindow *parent, const gchar *format, ...);
-void               browser_show_notice (GtkWindow *parent, const gchar *context, const gchar *format, ...);
 #ifdef HAVE_GDU
 void               browser_show_help (GtkWindow *parent, const gchar *topic);
 #endif
@@ -76,6 +75,8 @@ typedef enum {
 	BROWSER_ICON_GRID,
 	BROWSER_ICON_FORM,
 
+	BROWSER_ICON_MENU_INDICATOR,
+
 	BROWSER_ICON_LAST
 } BrowserIconType;
 
diff --git a/tools/command-exec.c b/tools/command-exec.c
index a7ab79f..5b0cfa4 100644
--- a/tools/command-exec.c
+++ b/tools/command-exec.c
@@ -350,7 +350,7 @@ gda_internal_command_dict_sync (SqlConsole *console, GdaConnection *cnc, const g
 		GdaMetaContext context;
 		memset (&context, 0, sizeof (context));
 		if (*args[0] == '_')
-			context.table_name = args[0];
+			context.table_name = (gchar*) args[0];
 		else
 			context.table_name = g_strdup_printf ("_%s", args[0]);
 		if (!gda_connection_update_meta_store (cnc, &context, error)) {
diff --git a/tools/gda-sql.c b/tools/gda-sql.c
index 34cfba8..9155293 100644
--- a/tools/gda-sql.c
+++ b/tools/gda-sql.c
@@ -1974,9 +1974,11 @@ static GdaInternalCommandResult *extra_command_httpd (SqlConsole *console, GdaCo
 						      GError **error, gpointer data);
 #endif
 
+#ifdef NONE
 static GdaInternalCommandResult *extra_command_lo_update (SqlConsole *console, GdaConnection *cnc,
 							  const gchar **args,
 							  GError **error, gpointer data);
+#endif
 static GdaInternalCommandResult *extra_command_export (SqlConsole *console, GdaConnection *cnc,
 						       const gchar **args,
 						       GError **error, gpointer data);
@@ -2412,7 +2414,7 @@ build_internal_commands_list (void)
 	c->arguments_delimiter_func = NULL;
 	c->unquote_args = TRUE;
 	commands->commands = g_slist_prepend (commands->commands, c);
-	*/
+	*/	
 
 	c = g_new0 (GdaInternalCommand, 1);
 	c->group = _("Query buffer");
diff --git a/tools/web-server.c b/tools/web-server.c
index a381494..bf45504 100644
--- a/tools/web-server.c
+++ b/tools/web-server.c
@@ -100,7 +100,6 @@ typedef struct {
 } TmpResource;
 
 static TmpResource  *tmp_resource_add (WebServer *server, const gchar *path, gchar *data, gsize data_length);
-static TmpResource  *tmp_static_data_add (WebServer *server, const gchar *path, gchar *data, gsize data_length);
 static gboolean       delete_tmp_resource (WebServer *server);
 static void           tmp_resource_free (TmpResource *data);
 
@@ -2079,24 +2078,6 @@ tmp_resource_add (WebServer *server, const gchar *path, gchar *data, gsize data_
 	return td;
 }
 
-/*
- * @data is static
- */
-static TmpResource *
-tmp_static_data_add (WebServer *server, const gchar *path, gchar *data, gsize data_length)
-{
-	TmpResource *td;
-
-	td = g_new0 (TmpResource, 1);
-	td->path = g_strdup (path);
-	td->data = data;
-	td->size = data_length;
-	td->expiration_date = 0;
-	g_hash_table_insert (server->priv->resources_hash, g_strdup (path), td);
-	server->priv->resources_list = g_slist_prepend (server->priv->resources_list, td);
-	return td;
-}
-
 static gboolean
 delete_tmp_resource (WebServer *server)
 {



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