[libgda] Change Valac to 0.14. GdaData implementations for DbTable and Table metadata



commit 58fb1321d039fb45841de08c6b97898c7788726c
Author: Daniel Espinosa <despinosa src gnome org>
Date:   Tue Jan 31 19:51:18 2012 -0600

    Change Valac to 0.14. GdaData implementations for DbTable and Table metadata

 configure.ac                           |    2 +-
 gnome-doc-utils.make                   |  656 --------------------------------
 libgda/Gda-5.0.gir                     |   12 +-
 libgda/Makefile.am                     |    2 +-
 libgda/data/Catalog.vala               |   37 ++
 libgda/data/DataBase.vala              |    4 +-
 libgda/data/DbCatalog.vala             |   28 ++
 libgda/data/DbCollection.vala          |    4 +-
 libgda/data/DbField.vala               |   12 +-
 libgda/data/DbFieldInfo.vala           |   96 +++++-
 libgda/data/DbRecord.vala              |   22 +-
 libgda/data/DbRecordCollection.vala    |    6 +-
 libgda/data/DbSchema.vala              |    5 +-
 libgda/data/DbTable.vala               |   46 ++-
 libgda/data/Field.vala                 |    4 +-
 libgda/data/FieldInfo.vala             |   32 +-
 libgda/data/GdaData-5.0.gir            |  331 +++++++++++------
 libgda/data/Makefile.am                |    2 +
 libgda/data/Record.vala                |   34 +-
 libgda/data/RecordCollection.vala      |   50 ++--
 libgda/data/Schema.vala                |   11 +-
 libgda/data/Table.vala                 |  137 ++++++-
 libgda/libgda-5.0.vapi                 |   61 ++--
 tests/vala/CheckDataModelIterator.vala |    6 +-
 tests/vala/CheckDataObject.vala        |    4 +-
 25 files changed, 681 insertions(+), 923 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 187b229..0591538 100644
--- a/configure.ac
+++ b/configure.ac
@@ -481,7 +481,7 @@ AC_ARG_ENABLE([vala-extensions],
 have_vala=no
 if test "x$found_introspection" = "xyes"
 then
-    VALA_MODULES="libvala-0.16 >= 0.15.0"
+    VALA_MODULES="libvala-0.14 >= 0.14.0"
     PKG_CHECK_MODULES(VALA, $VALA_MODULES,
     if test "$enable_vala" = "yes" -o "$enable_vala" = "auto"
 	then
diff --git a/libgda/Gda-5.0.gir b/libgda/Gda-5.0.gir
index 63ef530..47f6fdc 100644
--- a/libgda/Gda-5.0.gir
+++ b/libgda/Gda-5.0.gir
@@ -7648,7 +7648,12 @@ still forming a valid SQL syntax).</doc>
            glib:get-type="gda_data_proxy_get_type"
            glib:type-struct="DataProxyClass">
       <implements name="DataModel"/>
-      <constructor name="new" c:identifier="gda_data_proxy_new">
+      <function name="error_quark" c:identifier="gda_data_proxy_error_quark">
+        <return-value transfer-ownership="none">
+          <type name="GLib.Quark" c:type="GQuark"/>
+        </return-value>
+      </function>
+      <function name="new" c:identifier="gda_data_proxy_new">
         <doc xml:whitespace="preserve">Creates a new proxy for @model</doc>
         <return-value transfer-ownership="full">
           <doc xml:whitespace="preserve">a new #GdaDataProxy object</doc>
@@ -7660,11 +7665,6 @@ still forming a valid SQL syntax).</doc>
             <type name="DataModel" c:type="GdaDataModel*"/>
           </parameter>
         </parameters>
-      </constructor>
-      <function name="error_quark" c:identifier="gda_data_proxy_error_quark">
-        <return-value transfer-ownership="none">
-          <type name="GLib.Quark" c:type="GQuark"/>
-        </return-value>
       </function>
       <virtual-method name="filter_changed">
         <return-value transfer-ownership="none">
diff --git a/libgda/Makefile.am b/libgda/Makefile.am
index 126bcc7..21c7218 100644
--- a/libgda/Makefile.am
+++ b/libgda/Makefile.am
@@ -371,7 +371,7 @@ if ENABLE_VALA
 vapi: libgda-5.0.vapi
 
 libgda-5.0.vapi: Gda-5.0.gir
-	$(VAPIGEN) --metadatadir=$(top_srcdir)/libgda --library libgda-5.0 --pkg libxml-2.0 Gda-5.0.gir libgda-5.0-custom.vala
+	$(VAPIGEN) --metadatadir=$(top_srcdir)/libgda --library libgda-5.0 --pkg libxml-2.0 Gda-5.0.gir
 
 vapidir = $(VAPIDIR)
 vapi_DATA=libgda-5.0.vapi
diff --git a/libgda/data/Catalog.vala b/libgda/data/Catalog.vala
new file mode 100644
index 0000000..5ae10ed
--- /dev/null
+++ b/libgda/data/Catalog.vala
@@ -0,0 +1,37 @@
+/* -*- Mode: Vala; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+/*
+ * libgdavala
+ * Copyright (C) Daniel Espinosa Ortiz 2012 <esodan gmail com>
+ * 
+ * libgda is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * libgda 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 Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+using Gda;
+using Gee;
+
+namespace GdaData {
+	public class Catalog : Object, DbObject, DbNamedObject, DbCatalog
+	{
+		// DbObject interface
+		// DbObject Interface
+		public Connection connection { get; set; }
+		public void update () throws Error {}
+		public void save () throws Error {}
+		public void append () throws Error {}
+		// DbNamedObject Interface
+		public string name { get; set; }
+		// DbCatalog interface
+		public Collection<DbSchema> shemas { get; set; }
+	}
+}
diff --git a/libgda/data/DataBase.vala b/libgda/data/DataBase.vala
index 85c89fc..8a3dbca 100644
--- a/libgda/data/DataBase.vala
+++ b/libgda/data/DataBase.vala
@@ -22,9 +22,9 @@ using Gda;
 
 namespace GdaData
 {
-	public class DataBase : Object, DbObject, DbNamedObject, DbCollection<Value?>
+	public class DataBase : Object, DbObject, DbNamedObject, DbCollection
 	{
-		public HashMap<string,DbSchema<Value?>> _schemas = new HashMap<string,DbSchema<Value?>> ();
+		public HashMap<string,DbSchema> _schemas = new HashMap<string,DbSchema> ();
 		// DbObject Interface
 		public Connection connection { get; set; }
 		public void update () throws Error
diff --git a/libgda/data/DbCatalog.vala b/libgda/data/DbCatalog.vala
new file mode 100644
index 0000000..9053e1c
--- /dev/null
+++ b/libgda/data/DbCatalog.vala
@@ -0,0 +1,28 @@
+/* -*- Mode: Vala; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+/*
+ * libgdavala
+ * Copyright (C) Daniel Espinosa Ortiz 2012 <esodan gmail com>
+ * 
+ * libgda is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * libgda 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 Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+using Gda;
+using Gee;
+
+namespace GdaData {
+	public interface DbCatalog : Object, DbObject, DbNamedObject
+	{
+		public abstract Collection<DbSchema> shemas { get; set; }
+	}
+}
diff --git a/libgda/data/DbCollection.vala b/libgda/data/DbCollection.vala
index 90f3d01..0593ba6 100644
--- a/libgda/data/DbCollection.vala
+++ b/libgda/data/DbCollection.vala
@@ -22,8 +22,8 @@ using Gda;
 
 namespace GdaData
 {
-	public interface DbCollection<G> : DbNamedObject 
+	public interface DbCollection : DbNamedObject 
 	{
-		public abstract Collection<DbSchema<G>> schemas { owned get; }
+		public abstract Collection<DbSchema> schemas { owned get; }
 	}
 }
diff --git a/libgda/data/DbField.vala b/libgda/data/DbField.vala
index b5a2171..7d0f390 100644
--- a/libgda/data/DbField.vala
+++ b/libgda/data/DbField.vala
@@ -22,15 +22,15 @@ using Gda;
 
 namespace GdaData
 {
-	public interface DbField<G> : Object
+	public interface DbField : Object
 	{
-		public abstract G @value { get; set; }
-		public abstract string name { get; set; }
-		public abstract string column_name { get; }
-		public abstract DbField.Attribute attributes { get; }
+		public abstract Value?             @value      { get; set; }
+		public abstract string             name        { get; set; }
+		public abstract string             column_name { get; }
+		public abstract DbField.Attribute  attributes  { get; }
 		
 		public abstract string to_string ();
-		
+	
 		[Flags]
 		public enum Attribute {
 			NONE,
diff --git a/libgda/data/DbFieldInfo.vala b/libgda/data/DbFieldInfo.vala
index ca9da87..b573264 100644
--- a/libgda/data/DbFieldInfo.vala
+++ b/libgda/data/DbFieldInfo.vala
@@ -20,10 +20,98 @@
 using Gda;
 
 namespace GdaData {
-	public interface DbFieldInfo<G> : Object
+	public interface DbFieldInfo : Object
 	{
-		public abstract DbField.Attribute  attributes { get; }
-		public abstract G                  default_value { get; }
-		public abstract string             name { get; }
+		public abstract DbFieldInfo.Attribute  attributes { get; set; }
+		public abstract Value?                 default_value { get; set; }
+		public abstract string                 name { get; set; }
+		public abstract string                 desc { get; set; }
+		
+		// Numeric and Datetime attributes
+		public abstract int                    precision   { get; set; }
+		public abstract int                    scale       { get; set; }
+		
+		public static Attribute attribute_from_string (string str)
+		{
+			if (str == "NONE")
+				return Attribute.NONE;
+			if (str == "PRIMARY_KEY")
+				return Attribute.PRIMARY_KEY;
+			if (str == "UNIQUE")
+				return Attribute.UNIQUE;
+			if (str == "FOREIGN_KEY")
+				return Attribute.FOREIGN_KEY;
+			if (str == "CHECK")
+				return Attribute.CHECK;
+			if (str == "HAVE_DEFAULT")
+				return Attribute.HAVE_DEFAULT;
+			if (str == "IS_AUTO_INCREMENT")
+				return Attribute.IS_AUTO_INCREMENT;
+			
+			return Attribute.NONE;
+		}
+		public enum Attribute {
+			NONE,
+			PRIMARY_KEY,
+			UNIQUE,
+			FOREIGN_KEY,
+			CHECK,
+			HAVE_DEFAULT,
+			IS_AUTO_INCREMENT
+		}
+		
+		// Constrains
+		public abstract ForeignKey  fkey   { get; set; }
+		
+		[Compact]
+		public class ForeignKey {
+			public string    name;
+			public string    refname;
+			public DbTable   reftable;
+			public Match     match;
+			public Rule      update_rule;
+			public Rule      delete_rule;
+			
+			public ForeignKey copy () { return new ForeignKey (); }
+			
+			public static Match match_from_string (string str)
+			{
+				if (str == "FULL")
+					return Match.FULL;
+				if (str == "PARTIAL")
+					return Match.PARTIAL;
+				
+				return Match.NONE;
+			}
+			
+			public static Rule rule_from_string (string str)
+			{
+				if (str == "CASCADE")
+					return Rule.CASCADE;
+				if (str == "SET NULL")
+					return Rule.SET_NULL;
+				if (str == "SET DEFAULT")
+					return Rule.SET_DEFAULT;
+				if (str == "RESTRICT")
+					return Rule.RESTRICT;
+				if (str == "NO ACTION")
+					return Rule.NO_ACTION;
+	
+				return Rule.NONE;
+			}
+			public enum Match {
+				FULL,
+				PARTIAL,
+				NONE
+			}
+			public enum Rule {
+				CASCADE,
+				SET_NULL,
+				SET_DEFAULT,
+				RESTRICT,
+				NO_ACTION,
+				NONE
+			} 
+		}
 	}
 }
diff --git a/libgda/data/DbRecord.vala b/libgda/data/DbRecord.vala
index d847f70..7bab84c 100644
--- a/libgda/data/DbRecord.vala
+++ b/libgda/data/DbRecord.vala
@@ -22,21 +22,21 @@ using Gda;
 
 namespace GdaData
 {
-	public interface DbRecord<G> : DbObject, Comparable<DbRecord<G>>
+	public interface DbRecord : DbObject, Comparable<DbRecord>
 	{
-		public abstract DbTable<G>                table  { get; set construct; }
-		public abstract Collection<DbField<G>>    fields { owned get; }
-        public abstract Collection<DbField<G>>    keys   { owned get; }
+		public abstract DbTable                   table  { get; set construct; }
+		public abstract Collection<DbField>       fields { owned get; }
+        public abstract Collection<DbField>       keys   { owned get; }
         /**
          * Returns a GLib.Value containing the value stored in the given field.
          */
-        public abstract G                         get_value        (string name) throws Error;
-        public abstract void                      set_field        (DbField<G> field) throws Error;
-        public abstract void                      set_field_value  (string field, G val) throws Error;
-        public abstract DbField<G>                get_field        (string name) throws Error;
-        public abstract void                      set_key          (DbField<G> field) throws Error;
-        public abstract void                      set_key_value    (string field, G val) throws Error;
-        public abstract DbField<G>                get_key          (string name) throws Error;
+        public abstract Value?                    get_value        (string name) throws Error;
+        public abstract void                      set_field        (DbField field) throws Error;
+        public abstract void                      set_field_value  (string field, Value? val) throws Error;
+        public abstract DbField                   get_field        (string name) throws Error;
+        public abstract void                      set_key          (DbField field) throws Error;
+        public abstract void                      set_key_value    (string field, Value? val) throws Error;
+        public abstract DbField                   get_key          (string name) throws Error;
         public abstract string                    to_string        ();
 	}
 }
diff --git a/libgda/data/DbRecordCollection.vala b/libgda/data/DbRecordCollection.vala
index a8f8e11..8199512 100644
--- a/libgda/data/DbRecordCollection.vala
+++ b/libgda/data/DbRecordCollection.vala
@@ -21,10 +21,10 @@ using Gee;
 using Gda;
 
 namespace GdaData {
-	public interface DbRecordCollection<G> : Object, Traversable<DbRecord<Value?>>, 
-				Iterable<DbRecord<Value?>>, Collection<DbRecord<Value?>>
+	public interface DbRecordCollection : Object, Traversable<DbRecord>, 
+				Iterable<DbRecord>, Collection<DbRecord>
 	{
 		public abstract Connection   connection { get; set; }
-		public abstract DbTable<G>   table      { get; }
+		public abstract DbTable      table      { get; }
 	}
 }
diff --git a/libgda/data/DbSchema.vala b/libgda/data/DbSchema.vala
index 49d10b6..bb56163 100644
--- a/libgda/data/DbSchema.vala
+++ b/libgda/data/DbSchema.vala
@@ -22,8 +22,9 @@ using Gda;
 
 namespace GdaData
 {
-	public interface DbSchema<G> : DbObject, DbNamedObject
+	public interface DbSchema : DbObject, DbNamedObject
 	{
-		public abstract Collection<DbTable<G>> tables { owned get; }
+		public abstract DbCatalog            catalog { get; set; }
+		public abstract Collection<DbTable>  tables  { owned get; }
 	}
 }
diff --git a/libgda/data/DbTable.vala b/libgda/data/DbTable.vala
index 5db47e8..378c7bd 100644
--- a/libgda/data/DbTable.vala
+++ b/libgda/data/DbTable.vala
@@ -22,12 +22,46 @@ using Gda;
 
 namespace GdaData
 {
-	public interface DbTable<G> : DbObject, DbNamedObject
+	public interface DbTable : DbObject, DbNamedObject
 	{
-		public abstract DbSchema                     schema     { get; set construct; }
-		public abstract Collection<DbRecord<G>>      records    { owned get; }
-		public abstract Collection<DbTable<G>>       fk_depends { owned get; }
-		public abstract Collection<DbTable<G>>       fk         { owned get; }
-		public abstract Collection<DbFieldInfo<G>>   fields     { owned get; }
+		public abstract DbCatalog                        catalog    { get; set; }
+		public abstract DbSchema                         schema     { get; set; }
+		public abstract TableType                        table_type { get; set; }
+		public abstract Collection<DbRecord>             records    { owned get; }
+		public abstract Collection<DbTable>              fk_depends { owned get; }
+		public abstract Collection<DbTable>              fk         { owned get; }
+		public abstract HashMap<string,DbFieldInfo>      fields     { get; }
+//		public abstract Iterator<DbFieldInfo>            pk_fields  { get; } // FIXME: Implement
+		
+		public enum TableType {
+			NONE,
+			BASE_TABLE,
+			VIEW, 
+			LOCAL_TEMPORARY,
+			SYSTEM_TABLE,
+			GLOBAL_TEMPORARY,
+			ALIAS,
+			SYNONYM
+		}
+		
+		public static TableType type_from_string (string str)
+		{
+			if (str == "BASE TABLE")
+				return TableType.BASE_TABLE;
+			if (str == "VIEW")
+				return TableType.VIEW;
+			if (str == "LOCAL TEMPORARY")
+				return TableType.LOCAL_TEMPORARY;
+			if (str == "SYSTEM TABLE")
+				return TableType.SYSTEM_TABLE;
+			if (str == "GLOBAL TEMPORARY")
+				return TableType.GLOBAL_TEMPORARY;
+			if (str == "ALIAS")
+				return TableType.ALIAS;
+			if (str == "SYNONYM")
+				return TableType.SYNONYM;
+			
+			return TableType.NONE;
+		}
 	}
 }
diff --git a/libgda/data/Field.vala b/libgda/data/Field.vala
index 7ad3555..8b3f0ed 100644
--- a/libgda/data/Field.vala
+++ b/libgda/data/Field.vala
@@ -22,14 +22,14 @@ using Gda;
 
 namespace GdaData
 {
-	public class Field : Object, DbField<Value?>
+	public class Field : Object, DbField
 	{
 		private Value?            val;
 		private string            _name;
 		private string            _column_name;
 		private DbField.Attribute _attributes;
 		// DbField Interface
-		public G @value { 
+		public Value? @value { 
 			get { return val; } 
 			set { val = value; }
 		}
diff --git a/libgda/data/FieldInfo.vala b/libgda/data/FieldInfo.vala
index 7a86476..f0cab47 100644
--- a/libgda/data/FieldInfo.vala
+++ b/libgda/data/FieldInfo.vala
@@ -20,27 +20,35 @@
 using Gda;
 
 namespace GdaData {
-	public class FieldInfo : Object, DbFieldInfo<Value?>
+	public class FieldInfo : Object, DbFieldInfo
 	{
-		private DbField.Attribute _attr;
-		private Value? _default_value;
-		private string _name;
+		private DbFieldInfo.Attribute      _attr;
+		private Value?                 _default_value;
+		private string                 _name;
+		private string                 _desc;
+		private int                    _precision = -1;
+		private int                    _scale = -1;
+		private DbFieldInfo.ForeignKey _fk;
 		
-		public DbField.Attribute  attributes {
-			get { return _attr; }
+		public DbFieldInfo.Attribute  attributes {
+			get { return _attr; } set { _attr = value; }
 		}
 		
 		public Value? default_value { 
 			get { return _default_value; }
+			set { _default_value = value; }
 		}
+		
 		public string name { 
 			get { return _name; }
+			set { _name = value; }
 		}
-		FieldInfo (string name, DbField.Attribute attr, Value? default_val)
-		{
-			_name = name;
-			_attr = attr;
-			_default_value = default_val;
-		}
+		
+		public string desc { get { return _desc; } set { _desc = value; } }
+		
+		public int precision   { get { return _precision; } set { _precision = value; } }
+		public int scale       { get { return _scale; } set { _scale = value; } }
+		
+		public DbFieldInfo.ForeignKey  fkey   { get  { return _fk; } set { _fk = value.copy (); } }
 	}
 }
diff --git a/libgda/data/GdaData-5.0.gir b/libgda/data/GdaData-5.0.gir
index 77ce059..a26a01f 100644
--- a/libgda/data/GdaData-5.0.gir
+++ b/libgda/data/GdaData-5.0.gir
@@ -29,9 +29,7 @@
 		<field name="_schemas">
 			<type name="Gee.HashMap" c:type="GeeHashMap*">
 				<type name="utf8" c:type="gchar*"/>
-				<type name="GdaData.DbSchema" c:type="GdaDataDbSchema*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbSchema" c:type="GdaDataDbSchema*"/>
 			</type>
 		</field>
 		<constructor name="new" c:identifier="gda_data_data_base_new">
@@ -46,6 +44,28 @@
 		</field>
 	</record>
 	<record name="DataBasePrivate" c:type="GdaDataDataBasePrivate" disguised="1"/>
+	<class name="Catalog" c:type="GdaDataCatalog" glib:type-name="GdaDataCatalog" glib:get-type="gda_data_catalog_get_type" glib:type-struct="CatalogClass" parent="GObject.Object">
+		<implements name="GdaData.DbObject"/>
+		<implements name="GdaData.DbNamedObject"/>
+		<implements name="GdaData.DbCatalog"/>
+		<field name="parent_instance">
+			<type name="GObject.Object" c:type="GObject"/>
+		</field>
+		<field name="priv">
+			<type name="CatalogPrivate" c:type="GdaDataCatalogPrivate*"/>
+		</field>
+		<constructor name="new" c:identifier="gda_data_catalog_new">
+			<return-value transfer-ownership="full">
+				<type name="GdaData.Catalog" c:type="GdaDataCatalog*"/>
+			</return-value>
+		</constructor>
+	</class>
+	<record name="CatalogClass" c:type="GdaDataCatalogClass" glib:is-gtype-struct-for="Catalog">
+		<field name="parent_class">
+			<type name="GObject.ObjectClass" c:type="GObjectClass"/>
+		</field>
+	</record>
+	<record name="CatalogPrivate" c:type="GdaDataCatalogPrivate" disguised="1"/>
 	<class name="Schema" c:type="GdaDataSchema" glib:type-name="GdaDataSchema" glib:get-type="gda_data_schema_get_type" glib:type-struct="SchemaClass" parent="GObject.Object">
 		<implements name="GdaData.DbObject"/>
 		<implements name="GdaData.DbNamedObject"/>
@@ -59,9 +79,7 @@
 		<field name="_tables">
 			<type name="Gee.HashMap" c:type="GeeHashMap*">
 				<type name="utf8" c:type="gchar*"/>
-				<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 			</type>
 		</field>
 		<constructor name="new" c:identifier="gda_data_schema_new">
@@ -86,31 +104,28 @@
 		<field name="priv">
 			<type name="TablePrivate" c:type="GdaDataTablePrivate*"/>
 		</field>
+		<field name="_type">
+			<type name="GdaData.DbTableTableType" c:type="GdaDataDbTableTableType"/>
+		</field>
 		<field name="_records">
 			<type name="GdaData.DbRecordCollection" c:type="GdaDataDbRecordCollection*"/>
 		</field>
 		<field name="_fields">
 			<type name="Gee.HashMap" c:type="GeeHashMap*">
 				<type name="utf8" c:type="gchar*"/>
-				<type name="GdaData.DbFieldInfo" c:type="GdaDataDbFieldInfo*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbFieldInfo" c:type="GdaDataDbFieldInfo*"/>
 			</type>
 		</field>
 		<field name="_fk_depends">
 			<type name="Gee.HashMap" c:type="GeeHashMap*">
 				<type name="utf8" c:type="gchar*"/>
-				<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 			</type>
 		</field>
 		<field name="_fk">
 			<type name="Gee.HashMap" c:type="GeeHashMap*">
 				<type name="utf8" c:type="gchar*"/>
-				<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 			</type>
 		</field>
 		<constructor name="with_fields_info" c:identifier="gda_data_table_new_with_fields_info">
@@ -118,9 +133,7 @@
 				<parameter name="fields" transfer-ownership="none">
 					<type name="Gee.HashMap" c:type="GeeHashMap*">
 						<type name="utf8" c:type="gchar*"/>
-						<type name="GdaData.DbFieldInfo" c:type="GdaDataDbFieldInfo*">
-							<type name="gpointer" c:type="gpointer"/>
-						</type>
+						<type name="GdaData.DbFieldInfo" c:type="GdaDataDbFieldInfo*"/>
 					</type>
 				</parameter>
 			</parameters>
@@ -153,17 +166,13 @@
 		<field name="_fields">
 			<type name="Gee.HashMap" c:type="GeeHashMap*">
 				<type name="utf8" c:type="gchar*"/>
-				<type name="GdaData.DbField" c:type="GdaDataDbField*">
-					<type name="GObject.Value" c:type="GValue*"/>
-				</type>
+				<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 			</type>
 		</field>
 		<field name="_keys">
 			<type name="Gee.HashMap" c:type="GeeHashMap*">
 				<type name="utf8" c:type="gchar*"/>
-				<type name="GdaData.DbField" c:type="GdaDataDbField*">
-					<type name="GObject.Value" c:type="GValue*"/>
-				</type>
+				<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 			</type>
 		</field>
 		<constructor name="new" c:identifier="gda_data_record_new">
@@ -192,9 +201,7 @@
 					<type name="Gda.DataModel" c:type="GdaDataModel*"/>
 				</parameter>
 				<parameter name="table" transfer-ownership="none">
-					<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
-						<type name="GObject.Value" c:type="GValue*"/>
-					</type>
+					<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
@@ -231,9 +238,7 @@
 					<type name="Gda.DataModelIter" c:type="GdaDataModelIter*"/>
 				</parameter>
 				<parameter name="table" transfer-ownership="none">
-					<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
-						<type name="GObject.Value" c:type="GValue*"/>
-					</type>
+					<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
@@ -283,6 +288,11 @@
 		<field name="priv">
 			<type name="FieldInfoPrivate" c:type="GdaDataFieldInfoPrivate*"/>
 		</field>
+		<constructor name="new" c:identifier="gda_data_field_info_new">
+			<return-value transfer-ownership="full">
+				<type name="GdaData.FieldInfo" c:type="GdaDataFieldInfo*"/>
+			</return-value>
+		</constructor>
 	</class>
 	<record name="FieldInfoClass" c:type="GdaDataFieldInfoClass" glib:is-gtype-struct-for="FieldInfo">
 		<field name="parent_class">
@@ -382,9 +392,7 @@
 		<prerequisite name="GdaData.DbNamedObject"/>
 		<property name="schemas">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbSchema" c:type="GdaDataDbSchema*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbSchema" c:type="GdaDataDbSchema*"/>
 			</type>
 		</property>
 	</interface>
@@ -393,38 +401,62 @@
 			<type name="GObject.TypeInterface" c:type="GTypeInterface"/>
 		</field>
 	</record>
+	<interface name="DbCatalog" c:type="GdaDataDbCatalog" glib:type-name="GdaDataDbCatalog" glib:get-type="gda_data_db_catalog_get_type" glib:type-struct="DbCatalogIface">
+		<prerequisite name="GObject.Object"/>
+		<prerequisite name="GdaData.DbObject"/>
+		<prerequisite name="GdaData.DbNamedObject"/>
+		<property name="shemas" writable="1">
+			<type name="Gee.Collection" c:type="GeeCollection*">
+				<type name="GdaData.DbSchema" c:type="GdaDataDbSchema*"/>
+			</type>
+		</property>
+	</interface>
+	<record name="DbCatalogIface" c:type="GdaDataDbCatalogIface" glib:is-gtype-struct-for="DbCatalog">
+		<field name="parent_iface">
+			<type name="GObject.TypeInterface" c:type="GTypeInterface"/>
+		</field>
+	</record>
 	<interface name="DbTable" c:type="GdaDataDbTable" glib:type-name="GdaDataDbTable" glib:get-type="gda_data_db_table_get_type" glib:type-struct="DbTableIface">
 		<prerequisite name="GdaData.DbObject"/>
 		<prerequisite name="GdaData.DbNamedObject"/>
-		<property name="schema" writable="1" construct="1">
+		<function name="type_from_string" c:identifier="gda_data_db_table_type_from_string">
+			<parameters>
+				<parameter name="str" transfer-ownership="none">
+					<type name="utf8" c:type="const gchar*"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full">
+				<type name="GdaData.DbTableTableType" c:type="GdaDataDbTableTableType"/>
+			</return-value>
+		</function>
+		<property name="catalog" writable="1">
+			<type name="GdaData.DbCatalog" c:type="GdaDataDbCatalog*"/>
+		</property>
+		<property name="schema" writable="1">
 			<type name="GdaData.DbSchema" c:type="GdaDataDbSchema*"/>
 		</property>
+		<property name="table-type" writable="1">
+			<type name="GdaData.DbTableTableType" c:type="GdaDataDbTableTableType"/>
+		</property>
 		<property name="records">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
 			</type>
 		</property>
 		<property name="fk-depends">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 			</type>
 		</property>
 		<property name="fk">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 			</type>
 		</property>
 		<property name="fields">
-			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbFieldInfo" c:type="GdaDataDbFieldInfo*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+			<type name="Gee.HashMap" c:type="GeeHashMap*">
+				<type name="utf8" c:type="gchar*"/>
+				<type name="GdaData.DbFieldInfo" c:type="GdaDataDbFieldInfo*"/>
 			</type>
 		</property>
 	</interface>
@@ -433,6 +465,16 @@
 			<type name="GObject.TypeInterface" c:type="GTypeInterface"/>
 		</field>
 	</record>
+	<enumeration name="DbTableTableType" c:type="GdaDataDbTableTableType" glib:type-name="GdaDataDbTableTableType" glib:get-type="gda_data_db_table_table_type_get_type">
+		<member name="none" c:identifier="GDA_DATA_DB_TABLE_TABLE_TYPE_NONE" value="0"/>
+		<member name="base_table" c:identifier="GDA_DATA_DB_TABLE_TABLE_TYPE_BASE_TABLE" value="1"/>
+		<member name="view" c:identifier="GDA_DATA_DB_TABLE_TABLE_TYPE_VIEW" value="2"/>
+		<member name="local_temporary" c:identifier="GDA_DATA_DB_TABLE_TABLE_TYPE_LOCAL_TEMPORARY" value="3"/>
+		<member name="system_table" c:identifier="GDA_DATA_DB_TABLE_TABLE_TYPE_SYSTEM_TABLE" value="4"/>
+		<member name="global_temporary" c:identifier="GDA_DATA_DB_TABLE_TABLE_TYPE_GLOBAL_TEMPORARY" value="5"/>
+		<member name="alias" c:identifier="GDA_DATA_DB_TABLE_TABLE_TYPE_ALIAS" value="6"/>
+		<member name="synonym" c:identifier="GDA_DATA_DB_TABLE_TABLE_TYPE_SYNONYM" value="7"/>
+	</enumeration>
 	<interface name="DbRecord" c:type="GdaDataDbRecord" glib:type-name="GdaDataDbRecord" glib:get-type="gda_data_db_record_get_type" glib:type-struct="DbRecordIface">
 		<prerequisite name="GdaData.DbObject"/>
 		<prerequisite name="Gee.Comparable"/>
@@ -443,7 +485,7 @@
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full" allow-none="1">
-				<type name="gpointer" c:type="gpointer"/>
+				<type name="GObject.Value" c:type="GValue*"/>
 			</return-value>
 		</method>
 		<virtual-method name="get_value" invoker="get_value" throws="1">
@@ -453,15 +495,13 @@
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full" allow-none="1">
-				<type name="gpointer" c:type="gpointer"/>
+				<type name="GObject.Value" c:type="GValue*"/>
 			</return-value>
 		</virtual-method>
 		<method name="set_field" c:identifier="gda_data_db_record_set_field" throws="1">
 			<parameters>
 				<parameter name="field" transfer-ownership="none">
-					<type name="GdaData.DbField" c:type="GdaDataDbField*">
-						<type name="gpointer" c:type="gpointer"/>
-					</type>
+					<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
@@ -471,9 +511,7 @@
 		<virtual-method name="set_field" invoker="set_field" throws="1">
 			<parameters>
 				<parameter name="field" transfer-ownership="none">
-					<type name="GdaData.DbField" c:type="GdaDataDbField*">
-						<type name="gpointer" c:type="gpointer"/>
-					</type>
+					<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
@@ -486,7 +524,7 @@
 					<type name="utf8" c:type="const gchar*"/>
 				</parameter>
 				<parameter name="val" transfer-ownership="none" allow-none="1">
-					<type name="gpointer" c:type="gpointer"/>
+					<type name="GObject.Value" c:type="GValue*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
@@ -499,7 +537,7 @@
 					<type name="utf8" c:type="const gchar*"/>
 				</parameter>
 				<parameter name="val" transfer-ownership="none" allow-none="1">
-					<type name="gpointer" c:type="gpointer"/>
+					<type name="GObject.Value" c:type="GValue*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
@@ -513,9 +551,7 @@
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
-				<type name="GdaData.DbField" c:type="GdaDataDbField*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 			</return-value>
 		</method>
 		<virtual-method name="get_field" invoker="get_field" throws="1">
@@ -525,17 +561,13 @@
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
-				<type name="GdaData.DbField" c:type="GdaDataDbField*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 			</return-value>
 		</virtual-method>
 		<method name="set_key" c:identifier="gda_data_db_record_set_key" throws="1">
 			<parameters>
 				<parameter name="field" transfer-ownership="none">
-					<type name="GdaData.DbField" c:type="GdaDataDbField*">
-						<type name="gpointer" c:type="gpointer"/>
-					</type>
+					<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
@@ -545,9 +577,7 @@
 		<virtual-method name="set_key" invoker="set_key" throws="1">
 			<parameters>
 				<parameter name="field" transfer-ownership="none">
-					<type name="GdaData.DbField" c:type="GdaDataDbField*">
-						<type name="gpointer" c:type="gpointer"/>
-					</type>
+					<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
@@ -560,7 +590,7 @@
 					<type name="utf8" c:type="const gchar*"/>
 				</parameter>
 				<parameter name="val" transfer-ownership="none" allow-none="1">
-					<type name="gpointer" c:type="gpointer"/>
+					<type name="GObject.Value" c:type="GValue*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
@@ -573,7 +603,7 @@
 					<type name="utf8" c:type="const gchar*"/>
 				</parameter>
 				<parameter name="val" transfer-ownership="none" allow-none="1">
-					<type name="gpointer" c:type="gpointer"/>
+					<type name="GObject.Value" c:type="GValue*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
@@ -587,9 +617,7 @@
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
-				<type name="GdaData.DbField" c:type="GdaDataDbField*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 			</return-value>
 		</method>
 		<virtual-method name="get_key" invoker="get_key" throws="1">
@@ -599,9 +627,7 @@
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
-				<type name="GdaData.DbField" c:type="GdaDataDbField*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 			</return-value>
 		</virtual-method>
 		<method name="to_string" c:identifier="gda_data_db_record_to_string">
@@ -615,22 +641,16 @@
 			</return-value>
 		</virtual-method>
 		<property name="table" writable="1" construct="1">
-			<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
-				<type name="gpointer" c:type="gpointer"/>
-			</type>
+			<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 		</property>
 		<property name="fields">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbField" c:type="GdaDataDbField*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 			</type>
 		</property>
 		<property name="keys">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbField" c:type="GdaDataDbField*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 			</type>
 		</property>
 	</interface>
@@ -649,7 +669,7 @@
 					</parameter>
 				</parameters>
 				<return-value transfer-ownership="full" allow-none="1">
-					<type name="gpointer" c:type="gpointer"/>
+					<type name="GObject.Value" c:type="GValue*"/>
 				</return-value>
 			</callback>
 		</field>
@@ -660,9 +680,7 @@
 						<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
 					</parameter>
 					<parameter name="field" transfer-ownership="none">
-						<type name="GdaData.DbField" c:type="GdaDataDbField*">
-							<type name="gpointer" c:type="gpointer"/>
-						</type>
+						<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 					</parameter>
 				</parameters>
 				<return-value transfer-ownership="full">
@@ -680,7 +698,7 @@
 						<type name="utf8" c:type="const gchar*"/>
 					</parameter>
 					<parameter name="val" transfer-ownership="none" allow-none="1">
-						<type name="gpointer" c:type="gpointer"/>
+						<type name="GObject.Value" c:type="GValue*"/>
 					</parameter>
 				</parameters>
 				<return-value transfer-ownership="full">
@@ -699,9 +717,7 @@
 					</parameter>
 				</parameters>
 				<return-value transfer-ownership="full">
-					<type name="GdaData.DbField" c:type="GdaDataDbField*">
-						<type name="gpointer" c:type="gpointer"/>
-					</type>
+					<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 				</return-value>
 			</callback>
 		</field>
@@ -712,9 +728,7 @@
 						<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
 					</parameter>
 					<parameter name="field" transfer-ownership="none">
-						<type name="GdaData.DbField" c:type="GdaDataDbField*">
-							<type name="gpointer" c:type="gpointer"/>
-						</type>
+						<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 					</parameter>
 				</parameters>
 				<return-value transfer-ownership="full">
@@ -732,7 +746,7 @@
 						<type name="utf8" c:type="const gchar*"/>
 					</parameter>
 					<parameter name="val" transfer-ownership="none" allow-none="1">
-						<type name="gpointer" c:type="gpointer"/>
+						<type name="GObject.Value" c:type="GValue*"/>
 					</parameter>
 				</parameters>
 				<return-value transfer-ownership="full">
@@ -751,9 +765,7 @@
 					</parameter>
 				</parameters>
 				<return-value transfer-ownership="full">
-					<type name="GdaData.DbField" c:type="GdaDataDbField*">
-						<type name="gpointer" c:type="gpointer"/>
-					</type>
+					<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
 				</return-value>
 			</callback>
 		</field>
@@ -783,7 +795,7 @@
 			</return-value>
 		</virtual-method>
 		<property name="value" writable="1">
-			<type name="gpointer" c:type="gpointer"/>
+			<type name="GObject.Value" c:type="GValue*"/>
 		</property>
 		<property name="name" writable="1">
 			<type name="utf8" c:type="gchar*"/>
@@ -827,29 +839,124 @@
 	</bitfield>
 	<interface name="DbFieldInfo" c:type="GdaDataDbFieldInfo" glib:type-name="GdaDataDbFieldInfo" glib:get-type="gda_data_db_field_info_get_type" glib:type-struct="DbFieldInfoIface">
 		<prerequisite name="GObject.Object"/>
-		<property name="attributes">
-			<type name="GdaData.DbFieldAttribute" c:type="GdaDataDbFieldAttribute"/>
+		<function name="attribute_from_string" c:identifier="gda_data_db_field_info_attribute_from_string">
+			<parameters>
+				<parameter name="str" transfer-ownership="none">
+					<type name="utf8" c:type="const gchar*"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full">
+				<type name="GdaData.DbFieldInfoAttribute" c:type="GdaDataDbFieldInfoAttribute"/>
+			</return-value>
+		</function>
+		<property name="attributes" writable="1">
+			<type name="GdaData.DbFieldInfoAttribute" c:type="GdaDataDbFieldInfoAttribute"/>
 		</property>
-		<property name="default-value">
-			<type name="gpointer" c:type="gpointer"/>
+		<property name="default-value" writable="1">
+			<type name="GObject.Value" c:type="GValue*"/>
 		</property>
-		<property name="name">
+		<property name="name" writable="1">
 			<type name="utf8" c:type="gchar*"/>
 		</property>
+		<property name="desc" writable="1">
+			<type name="utf8" c:type="gchar*"/>
+		</property>
+		<property name="precision" writable="1">
+			<type name="gint" c:type="gint"/>
+		</property>
+		<property name="scale" writable="1">
+			<type name="gint" c:type="gint"/>
+		</property>
+		<property name="fkey" writable="1">
+			<type name="GdaData.DbFieldInfoForeignKey" c:type="GdaDataDbFieldInfoForeignKey*"/>
+		</property>
 	</interface>
 	<record name="DbFieldInfoIface" c:type="GdaDataDbFieldInfoIface" glib:is-gtype-struct-for="DbFieldInfo">
 		<field name="parent_iface">
 			<type name="GObject.TypeInterface" c:type="GTypeInterface"/>
 		</field>
 	</record>
+	<enumeration name="DbFieldInfoAttribute" c:type="GdaDataDbFieldInfoAttribute" glib:type-name="GdaDataDbFieldInfoAttribute" glib:get-type="gda_data_db_field_info_attribute_get_type">
+		<member name="none" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_NONE" value="0"/>
+		<member name="primary_key" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_PRIMARY_KEY" value="1"/>
+		<member name="unique" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_UNIQUE" value="2"/>
+		<member name="foreign_key" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_FOREIGN_KEY" value="3"/>
+		<member name="check" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_CHECK" value="4"/>
+		<member name="have_default" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_HAVE_DEFAULT" value="5"/>
+		<member name="is_auto_increment" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_IS_AUTO_INCREMENT" value="6"/>
+	</enumeration>
+	<record name="DbFieldInfoForeignKey">
+		<field name="name">
+			<type name="utf8" c:type="gchar*"/>
+		</field>
+		<field name="refname">
+			<type name="utf8" c:type="gchar*"/>
+		</field>
+		<field name="reftable">
+			<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
+		</field>
+		<field name="match">
+			<type name="GdaData.DbFieldInfoForeignKeyMatch" c:type="GdaDataDbFieldInfoForeignKeyMatch"/>
+		</field>
+		<field name="update_rule">
+			<type name="GdaData.DbFieldInfoForeignKeyRule" c:type="GdaDataDbFieldInfoForeignKeyRule"/>
+		</field>
+		<field name="delete_rule">
+			<type name="GdaData.DbFieldInfoForeignKeyRule" c:type="GdaDataDbFieldInfoForeignKeyRule"/>
+		</field>
+		<method name="copy" c:identifier="gda_data_db_field_info_foreign_key_copy">
+			<return-value transfer-ownership="full">
+				<type name="GdaData.DbFieldInfoForeignKey" c:type="GdaDataDbFieldInfoForeignKey*"/>
+			</return-value>
+		</method>
+		<function name="match_from_string" c:identifier="gda_data_db_field_info_foreign_key_match_from_string">
+			<parameters>
+				<parameter name="str" transfer-ownership="none">
+					<type name="utf8" c:type="const gchar*"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full">
+				<type name="GdaData.DbFieldInfoForeignKeyMatch" c:type="GdaDataDbFieldInfoForeignKeyMatch"/>
+			</return-value>
+		</function>
+		<function name="rule_from_string" c:identifier="gda_data_db_field_info_foreign_key_rule_from_string">
+			<parameters>
+				<parameter name="str" transfer-ownership="none">
+					<type name="utf8" c:type="const gchar*"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full">
+				<type name="GdaData.DbFieldInfoForeignKeyRule" c:type="GdaDataDbFieldInfoForeignKeyRule"/>
+			</return-value>
+		</function>
+		<constructor name="new" c:identifier="gda_data_db_field_info_foreign_key_new">
+			<return-value transfer-ownership="full">
+				<type name="GdaData.DbFieldInfoForeignKey" c:type="GdaDataDbFieldInfoForeignKey*"/>
+			</return-value>
+		</constructor>
+	</record>
+	<enumeration name="DbFieldInfoForeignKeyMatch" c:type="GdaDataDbFieldInfoForeignKeyMatch" glib:type-name="GdaDataDbFieldInfoForeignKeyMatch" glib:get-type="gda_data_db_field_info_foreign_key_match_get_type">
+		<member name="full" c:identifier="GDA_DATA_DB_FIELD_INFO_FOREIGN_KEY_MATCH_FULL" value="0"/>
+		<member name="partial" c:identifier="GDA_DATA_DB_FIELD_INFO_FOREIGN_KEY_MATCH_PARTIAL" value="1"/>
+		<member name="none" c:identifier="GDA_DATA_DB_FIELD_INFO_FOREIGN_KEY_MATCH_NONE" value="2"/>
+	</enumeration>
+	<enumeration name="DbFieldInfoForeignKeyRule" c:type="GdaDataDbFieldInfoForeignKeyRule" glib:type-name="GdaDataDbFieldInfoForeignKeyRule" glib:get-type="gda_data_db_field_info_foreign_key_rule_get_type">
+		<member name="cascade" c:identifier="GDA_DATA_DB_FIELD_INFO_FOREIGN_KEY_RULE_CASCADE" value="0"/>
+		<member name="set_null" c:identifier="GDA_DATA_DB_FIELD_INFO_FOREIGN_KEY_RULE_SET_NULL" value="1"/>
+		<member name="set_default" c:identifier="GDA_DATA_DB_FIELD_INFO_FOREIGN_KEY_RULE_SET_DEFAULT" value="2"/>
+		<member name="restrict" c:identifier="GDA_DATA_DB_FIELD_INFO_FOREIGN_KEY_RULE_RESTRICT" value="3"/>
+		<member name="no_action" c:identifier="GDA_DATA_DB_FIELD_INFO_FOREIGN_KEY_RULE_NO_ACTION" value="4"/>
+		<member name="none" c:identifier="GDA_DATA_DB_FIELD_INFO_FOREIGN_KEY_RULE_NONE" value="5"/>
+	</enumeration>
 	<interface name="DbSchema" c:type="GdaDataDbSchema" glib:type-name="GdaDataDbSchema" glib:get-type="gda_data_db_schema_get_type" glib:type-struct="DbSchemaIface">
 		<prerequisite name="GdaData.DbObject"/>
 		<prerequisite name="GdaData.DbNamedObject"/>
+		<property name="catalog" writable="1">
+			<type name="GdaData.DbCatalog" c:type="GdaDataDbCatalog*"/>
+		</property>
 		<property name="tables">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
+				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 			</type>
 		</property>
 	</interface>
@@ -867,9 +974,7 @@
 			<type name="Gda.Connection" c:type="GdaConnection*"/>
 		</property>
 		<property name="table">
-			<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
-				<type name="gpointer" c:type="gpointer"/>
-			</type>
+			<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 		</property>
 	</interface>
 	<record name="DbRecordCollectionIface" c:type="GdaDataDbRecordCollectionIface" glib:is-gtype-struct-for="DbRecordCollection">
diff --git a/libgda/data/Makefile.am b/libgda/data/Makefile.am
index 6e77567..eed4001 100644
--- a/libgda/data/Makefile.am
+++ b/libgda/data/Makefile.am
@@ -33,6 +33,7 @@ VALAFLAGS = \
 
 object_persistance_sources = \
 	DataBase.vala \
+	Catalog.vala \
 	Schema.vala \
 	Table.vala \
 	Record.vala \
@@ -42,6 +43,7 @@ object_persistance_sources = \
 db_collection_sources = \
 	DbObject.vala \
 	DbCollection.vala \
+	DbCatalog.vala \
 	DbTable.vala \
 	DbRecord.vala \
 	DbField.vala \
diff --git a/libgda/data/Record.vala b/libgda/data/Record.vala
index 66454d9..281e1b9 100644
--- a/libgda/data/Record.vala
+++ b/libgda/data/Record.vala
@@ -22,10 +22,10 @@ using Gee;
 
 namespace GdaData {
 
-    public class Record : Object, DbObject, Comparable<DbRecord<Value?>>, DbRecord<Value?>
+    public class Record : Object, DbObject, Comparable<DbRecord>, DbRecord
     {
-        protected HashMap<string,DbField<Value?>> _fields = new HashMap<string,DbField<Value?>> ();
-        protected HashMap<string,DbField<Value?>> _keys = new HashMap<string,DbField<Value?>> ();
+        protected HashMap<string,DbField> _fields = new HashMap<string,DbField> ();
+        protected HashMap<string,DbField> _keys = new HashMap<string,DbField> ();
         /**
          * Derived classes must implement this property to set the table used to get data from.
          */
@@ -33,8 +33,8 @@ namespace GdaData {
         /**
          * Returns a Gee.Collection with the data stored by this object.
          */
-        public Collection<DbField<Value?>> fields { owned get { return _fields.values; } }
-        public Collection<DbField<Value?>> keys { owned get { return _keys.values; } }
+        public Collection<DbField> fields { owned get { return _fields.values; } }
+        public Collection<DbField> keys { owned get { return _keys.values; } }
         /**
          * Set the connection to be used to get/set data.
          */
@@ -51,7 +51,7 @@ namespace GdaData {
 		/**
          * Set the value to a field with the given @name.
          */
-        public void set_field (DbField<Value?> field) throws Error
+        public void set_field (DbField field) throws Error
         {
         	if (_fields.has_key (field.name)) {
 		    	var f = this._fields.get (field.name);
@@ -72,11 +72,11 @@ namespace GdaData {
     		n.value = val;
     		this.set_field (n);
         }
-        public DbField<Value?> get_field (string name) throws Error
+        public DbField get_field (string name) throws Error
         {
         	return _fields.get (name);
         }
-        public void set_key (DbField<Value?> field)
+        public void set_key (DbField field)
         {
         	if (_keys.has_key (field.name)) {
 		    	var f = _keys.get (field.name);
@@ -96,7 +96,7 @@ namespace GdaData {
     		n.value = val;
     		this.set_key (n);
         }
-        public DbField<Value?> get_key (string name) throws Error
+        public DbField get_key (string name) throws Error
         {
         	return _keys.get (name);
         }
@@ -112,11 +112,11 @@ namespace GdaData {
         		throw new DbObjectError.SAVE ("No Keys has been set");
 			var q = new SqlBuilder (SqlStatementType.UPDATE);
 			q.set_table (table.name);
-			foreach (DbField<Value?> f in fields) {
+			foreach (DbField f in fields) {
 				q.add_field_value_as_gvalue (f.column_name, f.value);
 			}
 			SqlBuilderId cond = -1;
-			foreach (DbField<Value?> f in keys) {
+			foreach (DbField f in keys) {
 				var f_id = q.add_id (f.name);
 				var e_id = q.add_expr_value (null, f.value);
 				var c_id = q.add_cond (SqlOperatorType.EQ, f_id, e_id, 0);
@@ -146,7 +146,7 @@ namespace GdaData {
         	q.select_add_target (table.name, null);
         	q.select_add_field ("*", null, null);
 			SqlBuilderId cond = -1;
-        	foreach (DbField<Value?> f in keys) {
+        	foreach (DbField f in keys) {
 				var f_id = q.add_id (f.name);
 				var e_id = q.add_expr_value (null, f.value);
 				var c_id = q.add_cond (SqlOperatorType.EQ, f_id, e_id, 0);
@@ -185,7 +185,7 @@ namespace GdaData {
 			var sql = new SqlBuilder (SqlStatementType.INSERT);
 			sql.set_table (table.name);
 			// FIXME: MetaData is required
-			foreach (DbField<Value?> f in _fields.values) {
+			foreach (DbField f in _fields.values) {
 				sql.add_field_value_as_gvalue (f.column_name, f.value);
 			}
 //			stdout.printf ("DEBUG: INSERT statement to execute: \n"+ 
@@ -201,11 +201,11 @@ namespace GdaData {
         public string to_string ()
         {
         	string r = "";
-			foreach (DbField<Value?> f in this.fields) {
+			foreach (DbField f in this.fields) {
 				r += "|" + f.name;
 			}
 			r+="\n";
-			foreach (DbField<Value?> f in this.fields) {
+			foreach (DbField f in this.fields) {
 				r += "|" + Gda.value_stringify (f.value);
 			}
 			return r;
@@ -216,10 +216,10 @@ namespace GdaData {
          *
          * @Returns: 0 if keys are equal or -1 if they are different.
          */
-        public int compare_to (DbRecord<Value?> object)
+        public int compare_to (DbRecord object)
         {
         	int r = 0;
-        	foreach (DbField<Value?> f in fields) {
+        	foreach (DbField f in fields) {
         		var fl = object.get_field (f.name);
         		if (Gda.value_compare (f.value, fl.value) != 0)
         			return -1;
diff --git a/libgda/data/RecordCollection.vala b/libgda/data/RecordCollection.vala
index 7df04c4..749bd98 100644
--- a/libgda/data/RecordCollection.vala
+++ b/libgda/data/RecordCollection.vala
@@ -21,28 +21,28 @@ using Gee;
 using Gda;
 
 namespace GdaData {
-	public class RecordCollection : AbstractCollection<DbRecord<Value?>>, DbRecordCollection<Value?>
+	public class RecordCollection : AbstractCollection<DbRecord>, DbRecordCollection
 	{
 		private DataModel _model;
-		private DbTable<Value?> _table;
+		private DbTable   _table;
 		
-		public DbTable<Value?> table { get { return table; } }
+		public DbTable    table { get { return table; } }
 		
-		public DataModel model { get { return _model; } }
+		public DataModel  model { get { return _model; } }
 		
 		public Connection connection { get; set; }
 		
-		public RecordCollection (DataModel m, DbTable<Value?> table)
+		public RecordCollection (DataModel m, DbTable table)
 		{
 			_model = m;
 			_table = table;
 		}
 		// AbstractCollection Implementation
-		public override bool add (DbRecord<Value?> item) 
+		public override bool add (DbRecord item) 
 		{ 
 			try {
 				int r = _model.append_row ();
-				foreach (DbField<Value?> f in item.fields) {
+				foreach (DbField f in item.fields) {
 					_model.set_value_at (_model.get_column_index (f.name), r, f.value);
 				}
 				return true;
@@ -57,12 +57,12 @@ namespace GdaData {
 			}
 			((DataProxy) _model).apply_all_changes ();
 		}
-		public override bool contains (DbRecord<Value?> item)
+		public override bool contains (DbRecord item)
 		{
 			var iter = _model.create_iter ();
 			while (iter.move_next ()) {
 				bool found = true;
-				foreach (DbField<Value?> k in item.keys) {
+				foreach (DbField k in item.keys) {
 					Value id = iter.get_value_at (iter.data_model.get_column_index (k.name));
 					Value v = k.value;
 					if (Gda.value_compare (id,v) != 0)
@@ -72,17 +72,17 @@ namespace GdaData {
 			}
 			return false;
 		}
-		public override Gee.Iterator<DbRecord<Value?>> iterator () 
+		public override Gee.Iterator<DbRecord> iterator () 
 		{ 
 			var iter = _model.create_iter ();
 			return new RecordCollectionIterator (iter, _table); 
 		}
-		public override bool remove (DbRecord<Value?> item)
+		public override bool remove (DbRecord item)
 		{
 			var iter = _model.create_iter ();
 			while (iter.move_next ()) {
 				bool found = true;
-				foreach (DbField<Value?> k in item.keys) {
+				foreach (DbField k in item.keys) {
 					Value id = iter.get_value_at (iter.data_model.get_column_index (k.name));
 					Value v = k.value;
 					if (Gda.value_compare (id,v) != 0)
@@ -115,15 +115,15 @@ namespace GdaData {
 			} 
 		}
 		// Traversable Interface
-		public override Iterator<DbRecord<Value?>> chop (int offset, int length = -1)
+		public override Iterator<DbRecord> chop (int offset, int length = -1)
 		{
 			return this.iterator().chop (offset, length);
 		}
-		public override Gee.Iterator<DbRecord<Value?>> filter (owned Gee.Predicate<DbRecord<Value?>> f)
+		public override Gee.Iterator<DbRecord> filter (owned Gee.Predicate<DbRecord<Value?>> f)
 		{
 			return this.iterator().filter (f);			
 		}
-		public override Iterator<A> stream<A> (owned StreamFunc<DbRecord<Value?>, A> f)
+		public override Iterator<A> stream<A> (owned StreamFunc<DbRecord, A> f)
 		{
 			return this.iterator().stream<A> (f);
 		}
@@ -134,23 +134,23 @@ namespace GdaData {
 		}
 	}
 	
-	public class RecordCollectionIterator : Object, Traversable<DbRecord<Value?>>, Iterator<DbRecord<Value?>>
+	public class RecordCollectionIterator : Object, Traversable<DbRecord>, Iterator<DbRecord>
 	{
 		private DataModelIter _iter;
-		private DbTable<Value?> _table;
+		private DbTable _table;
 		private int _length = -1;
 		private int init_row = -1;
 		private HashMap<int,int> _elements;
 		private int filter_pos = -1;
 		
-		public RecordCollectionIterator (DataModelIter iter, DbTable<Value?> table)
+		public RecordCollectionIterator (DataModelIter iter, DbTable table)
 		{
 			_iter = iter;
 			_table = table;
 			_elements = new HashMap<int,int>();
 		}
 		
-		private RecordCollectionIterator.filtered (DataModelIter iter, DbTable<Value?> table, 
+		private RecordCollectionIterator.filtered (DataModelIter iter, DbTable table, 
 											int init, int offset, int length, 
 											HashMap<int,int> elements, int filter_pos)
 		{
@@ -177,13 +177,13 @@ namespace GdaData {
 		}
 		
 		// Traversable Interface
-		public Gee.Iterator<DbRecord<Value?>> chop (int offset, int length = -1) 
+		public Gee.Iterator<DbRecord> chop (int offset, int length = -1) 
 		{
 			var iter = _iter.data_model.create_iter ();
 			return new RecordCollectionIterator.filtered (iter, _table, _iter.current_row, 
 									offset, length, _elements, filter_pos);
 		}
-		public Gee.Iterator<DbRecord<Value?>> filter (owned Gee.Predicate<DbRecord<Value?>> f) 
+		public Gee.Iterator<DbRecord> filter (owned Gee.Predicate<DbRecord> f) 
 		{
 			var elements = new Gee.HashMap <int,int> ();
 			int pos = -1;
@@ -196,20 +196,20 @@ namespace GdaData {
 			var iter = _iter.data_model.create_iter ();
 			return new RecordCollectionIterator.filtered (iter, _table, -1, 0, -1, elements, -1);
 		}
-		public new void @foreach (Gee.ForallFunc<DbRecord<Value?>> f) 
+		public new void @foreach (Gee.ForallFunc<DbRecord> f) 
 		{
 			while (this.next ()) {
 				var r = this.get ();
 				f(r);
 			}
 		}
-		public Gee.Iterator<A> stream<A> (owned Gee.StreamFunc<DbRecord<Value?>,A> f) 
+		public Gee.Iterator<A> stream<A> (owned Gee.StreamFunc<DbRecord,A> f) 
 		{
-			return stream_impl<DbRecord<Value?>, A> (this, f);
+			return stream_impl<DbRecord, A> (this, f);
 		}
 		
 		// Iterator Interface
-		public new DbRecord<Value?> @get ()
+		public new DbRecord @get ()
 		{
 			var r = new Record ();
 			r.connection = _table.connection;
diff --git a/libgda/data/Schema.vala b/libgda/data/Schema.vala
index 4fd3b56..fca1b8b 100644
--- a/libgda/data/Schema.vala
+++ b/libgda/data/Schema.vala
@@ -22,9 +22,9 @@ using Gda;
 
 namespace GdaData
 {
-	public class Schema : Object, DbObject, DbNamedObject, DbSchema<Value?>
+	public class Schema : Object, DbObject, DbNamedObject, DbSchema
 	{
-		public HashMap<string,DbTable<Value?>> _tables = new HashMap<string,DbTable<Value?>> ();
+		public HashMap<string,DbTable> _tables = new HashMap<string,DbTable> ();
 		// DbObject Interface
 		public Connection connection { get; set; }
 		public void update () throws Error
@@ -40,8 +40,10 @@ namespace GdaData
 				var t = new Table ();
 				t.connection = connection;
 				t.name = (string) mt.get_value_at (mt.get_column_index ("table_name"), r);
-				t.schema = (DbSchema) this;
-				tables.set (t.name, (DbTable) t);
+				t.table_type = 
+						DbTable.type_from_string((string) mt.get_value_at (mt.get_column_index ("table_type"), r));
+				t.schema = this;
+				tables.set (t.name, t);
 			}
 		}
 		public void save () throws Error {}
@@ -49,6 +51,7 @@ namespace GdaData
 		// DbNamedObject Interface
 		public string name { get; set; }
 		// DbSchema Interface
+		public DbCatalog           catalog { get; set; }
 		public Collection<DbTable> tables { owned get { return _tables.values; } }
 	}
 }
diff --git a/libgda/data/Table.vala b/libgda/data/Table.vala
index 66053b2..b92da4a 100644
--- a/libgda/data/Table.vala
+++ b/libgda/data/Table.vala
@@ -22,33 +22,142 @@ using Gda;
 
 namespace GdaData
 {
-	public class Table : Object, DbObject, DbNamedObject, DbTable<Value?>
+	public class Table : Object, DbObject, DbNamedObject, DbTable
 	{
-		protected DbRecordCollection _records;
-		protected HashMap<string,DbFieldInfo<Value?>> _fields = new HashMap<string,DbFieldInfo<Value?>> ();
-		protected HashMap<string,DbTable<Value?>> _fk_depends = new HashMap<string,DbTable<Value?>> ();
-		protected HashMap<string,DbTable<Value?>> _fk = new HashMap<string,DbTable<Value?>> ();
+		protected DbTable.TableType           _type;
+		protected DbRecordCollection          _records;
+		protected HashMap<string,DbFieldInfo> _fields = new HashMap<string,DbFieldInfo> ();
+		protected HashMap<string,DbTable>     _fk_depends = new HashMap<string,DbTable> ();
+		protected HashMap<string,DbTable>     _fk = new HashMap<string,DbTable> ();
 		
-		public Table.with_fields_info (HashMap<string,DbFieldInfo<Value?>> fields)
+		public Table.with_fields_info (HashMap<string,DbFieldInfo> fields)
 		{
-			foreach (DbFieldInfo<Value?> f in fields.values) {
+			foreach (DbFieldInfo f in fields.values) {
 				_fields.set (f.name, f);
 			}
 		}
 		// DbObject Interface
 		public Connection connection { get; set; }
-		public void update () throws Error {}
+		public void update () throws Error 
+		{
+			var store = connection.get_meta_store ();
+			_fields.clear ();
+			var vals = new HashTable<string,Value?> (str_hash,str_equal);
+			vals.set ("name", name);
+			vals.set ("schema", schema.name);
+			vals.set ("catalog", schema.catalog.name);
+			var mt = store.extract_v ("SELECT * FROM _columns WHERE table_schema = ##schema::string AND table_catalog = ##catalog::string AND table_name  = ##name::string", vals);
+			for (int r = 0; r < mt.get_n_columns (); r++) 
+			{
+				var fi = new FieldInfo ();
+				string fname = (string) mt.get_value_at (mt.get_column_index ("column_name"), r);
+				Type ft = (Type) mt.get_value_at (mt.get_column_index ("gtype"), r);
+				DbFieldInfo.Attribute attr = DbFieldInfo.Attribute.NONE;
+				bool fcbn = (bool) mt.get_value_at (mt.get_column_index ("is_nullable"), r);
+				if (fcbn)
+					attr = attr & DbField.Attribute.CAN_BE_NULL;
+				string fdv = (string) mt.get_value_at (mt.get_column_index ("column_default"), r);
+				if (fdv != null) {
+					attr = attr & DbField.Attribute.CAN_BE_DEFAULT;
+					//Value? dv = Gda.value_new_from_string (fdv, ft);
+				}
+				string fai = (string) mt.get_value_at (mt.get_column_index ("extras"), r);
+				bool fai_b = false;
+				if (fai == "AUTO_INCREMENT")
+					fai_b = true;
+				attr = attr & DbFieldInfo.Attribute.IS_AUTO_INCREMENT;
+				if (ft == typeof (Gda.Numeric)) {
+					int fp = (int) mt.get_value_at (mt.get_column_index ("numeric_precision"), r);
+					int fs = (int) mt.get_value_at (mt.get_column_index ("numeric_scale"), r);
+//					fi.name = fname;
+//					fi.attribute = attr;
+//					fi.precision = fp;
+//					fi.scale = fs;
+				}
+				if (ft == typeof (Date)) {
+					int fp = (int) mt.get_value_at (mt.get_column_index ("numeric_precision"), r);
+//					fi
+				}
+				_fields.set (fi.name, fi);
+			}
+			// Constraints
+			var mc = store.extract_v ("SELECT * FROM _table_constraints WHERE table_schema = ##schema::string AND table_catalog = ##catalog::string AND table_name  = ##name::string", vals);
+			for (int r = 0; r < mc.get_n_columns (); r++) 
+			{
+				string ct = (string) mc.get_value_at (mc.get_column_index ("constraint_type"), r);
+				string cn = (string) mc.get_value_at (mc.get_column_index ("constraint_name"), r);
+				var vals2 = new HashTable<string,Value?> (str_hash,str_equal);
+				vals2.set ("name", name);
+				vals2.set ("schema", schema);
+				vals2.set ("catalog", schema.catalog.name);
+				vals2.set ("constraint_name", cn);
+				var mpk = store.extract_v ("SELECT * FROM _key_column_usage WHERE table_schema = ##schema::string AND table_catalog = ##catalog::string AND table_name  = ##name::string AND constraint_name = ##constraint", vals2);
+				var colname = (string) mpk.get_value_at (mpk.get_column_index ("column_name"), r);
+				
+				var f = _fields.get (colname);
+				f.attributes = f.attributes & DbFieldInfo.attribute_from_string (ct);
+				
+				if (DbFieldInfo.Attribute.FOREIGN_KEY in f.attributes) 
+				{
+					f.attributes = f.attributes & DbFieldInfo.Attribute.FOREIGN_KEY;
+					var mfk = store.extract_v ("SELECT * FROM _referential_constraints WHERE table_schema = ##schema::string AND table_catalog = ##catalog::string AND table_name  = ##name::string AND constraint_name = ##constraint", vals2);
+					f.fkey = new DbFieldInfo.ForeignKey ();
+					f.fkey.name = cn;
+					f.fkey.refname = (string) mfk.get_value_at (mfk.get_column_index ("ref_constraint_name"), 0);
+					f.fkey.reftable = new Table ();
+					f.fkey.reftable.connection = connection;
+					f.fkey.reftable.name = (string) mfk.get_value_at (
+														mfk.get_column_index ("ref_table_name"), 0);
+					f.fkey.reftable.catalog = new Catalog ();
+					f.fkey.reftable.catalog.connection = connection;
+					f.fkey.reftable.catalog.name = (string) mfk.get_value_at (
+														mfk.get_column_index ("ref_table_catalog"), 0);
+					f.fkey.reftable.schema = new Schema ();
+					f.fkey.reftable.schema.connection = connection;
+					f.fkey.reftable.schema.name = (string) mfk.get_value_at (
+														mfk.get_column_index ("ref_table_schema"), 0);
+					var match = (string) mfk.get_value_at (
+														mfk.get_column_index ("match_option"), 0);
+					f.fkey.match = DbFieldInfo.ForeignKey.match_from_string (match);
+					
+					var update_rule = (string) mfk.get_value_at (
+														mfk.get_column_index ("update_rule"), 0);
+					f.fkey.update_rule = DbFieldInfo.ForeignKey.rule_from_string (update_rule);
+					var delete_rule = (string) mfk.get_value_at (
+														mfk.get_column_index ("delete_rule"), 0);
+					f.fkey.delete_rule = DbFieldInfo.ForeignKey.rule_from_string (delete_rule);
+				}
+				if (DbFieldInfo.Attribute.CHECK in  f.attributes) 
+				{
+					
+				}
+			}
+		}
 		public void save () throws Error {}
 		public void append () throws Error {}
 		// DbNamedObject Interface
 		public string name { get; set; }
 		
 		// DbTable Interface
-		public Collection<DbFieldInfo<Value?>> fields { 
-			owned get { return _fields.values; } 
+		public DbTable.TableType table_type { get { return _type; } set { _type = value; } }
+		public HashMap<string,DbFieldInfo> fields { 
+			get { return _fields; } 
 		}
-		public DbSchema schema { get; set construct; }
-		public Collection<DbRecord<Value?>> records { 
+		// FIXME: Implement
+//		public Iterator<DbFieldInfo> pk_fields { 
+//			get { 
+//				return _fields.filter (
+//					(g) => {
+//						if (DbFieldInfo.Attribute.PRIMARY_KEY in g.value.attributes)
+//							return true;
+//						return false;
+//					}
+//				); 
+//			} 
+//		}
+		public DbCatalog catalog { get; set; }
+		public DbSchema  schema { get; set; }
+		public Collection<DbRecord> records { 
 			owned get  {
 				var q = new Gda.SqlBuilder (SqlStatementType.SELECT);
 				q.set_table (name);
@@ -59,7 +168,7 @@ namespace GdaData
 				return _records;
 			}
 		}
-		public Collection<DbTable<Value?>> fk_depends { owned get { return _fk_depends.values; } }
-		public Collection<DbTable<Value?>> fk { owned get { return _fk.values; } }
+		public Collection<DbTable> fk_depends { owned get { return _fk_depends.values; } }
+		public Collection<DbTable> fk { owned get { return _fk.values; } }
 	}
 }
diff --git a/libgda/libgda-5.0.vapi b/libgda/libgda-5.0.vapi
index 37234ce..fc60ff8 100644
--- a/libgda/libgda-5.0.vapi
+++ b/libgda/libgda-5.0.vapi
@@ -149,7 +149,7 @@ namespace Gda {
 		public unowned Gda.ServerProvider get_provider ();
 		public unowned string get_provider_name ();
 		public unowned Gda.TransactionStatus get_transaction_status ();
-		public bool insert_row_into_table_v (string table, GLib.SList<string> col_names, GLib.SList<GLib.Value?> values) throws GLib.Error;
+		public bool insert_row_into_table_v (string table, GLib.SList<string> col_names, GLib.SList<GLib.Value> values) throws GLib.Error;
 		public bool is_opened ();
 		public bool open () throws GLib.Error;
 		public static Gda.Connection open_from_dsn (string dsn, string? auth_string, Gda.ConnectionOptions options) throws GLib.Error;
@@ -171,7 +171,7 @@ namespace Gda {
 		public static void string_split (string string, string out_cnc_params, string out_provider, string out_username, string out_password);
 		public bool supports_feature (Gda.ConnectionFeature feature);
 		public bool update_meta_store (Gda.MetaContext? context) throws GLib.Error;
-		public bool update_row_in_table_v (string table, string condition_column_name, GLib.Value condition_value, GLib.SList<string> col_names, GLib.SList<GLib.Value?> values) throws GLib.Error;
+		public bool update_row_in_table_v (string table, string condition_column_name, GLib.Value condition_value, GLib.SList<string> col_names, GLib.SList<GLib.Value> values) throws GLib.Error;
 		public string value_to_sql_string (GLib.Value from);
 		[NoAccessorMethod]
 		public string auth_string { owned get; set; }
@@ -330,10 +330,10 @@ namespace Gda {
 		[NoAccessorMethod]
 		public Gda.DataModel model { owned get; set; }
 	}
-	[CCode (cheader_filename = "libgda/libgda.h")]
-	public class DataProxy : GLib.Object, Gda.DataModel, Gda.DataModel {
-		[CCode (has_construct_function = false, type = "GObject*")]
-		public DataProxy (Gda.DataModel model);
+	[CCode (cheader_filename = "libgda/libgda.h", type_id = "gda_data_proxy_get_type ()")]
+	public class DataProxy : GLib.Object, Gda.DataModel {
+		[CCode (has_construct_function = false)]
+		protected DataProxy ();
 		public void alter_value_attributes (int proxy_row, int col, Gda.ValueAttribute alter_flags);
 		public bool apply_all_changes () throws GLib.Error;
 		public bool apply_row_changes (int proxy_row) throws GLib.Error;
@@ -353,10 +353,9 @@ namespace Gda {
 		public int get_sample_size ();
 		public int get_sample_start ();
 		public Gda.ValueAttribute get_value_attributes (int proxy_row, int col);
-		public GLib.SList<weak GLib.Value?> get_values (int proxy_row, [CCode (array_length = false)] int[] cols_index, int n_cols);
+		public GLib.SList<weak GLib.Value> get_values (int proxy_row, [CCode (array_length = false)] int[] cols_index, int n_cols);
 		public bool has_changed ();
 		public bool is_read_only ();
-		[CCode (cname = "gda_data_proxy_new")]
 		public static GLib.Object @new (Gda.DataModel model);
 		public bool row_has_changed (int proxy_row);
 		public bool row_is_deleted (int proxy_row);
@@ -572,7 +571,7 @@ namespace Gda {
 		public Gda.DataModel create_modify_data_model (string table_name);
 		public bool declare_foreign_key (Gda.MetaStruct? mstruct, string fk_name, string? catalog, string? schema, string table, string? ref_catalog, string? ref_schema, string ref_table, [CCode (array_length_cname = "nb_cols", array_length_pos = 8.5, array_length_type = "guint")] string[] colnames, [CCode (array_length_cname = "nb_cols", array_length_pos = 8.5, array_length_type = "guint")] string[] ref_colnames) throws GLib.Error;
 		public static GLib.Quark error_quark ();
-		public Gda.DataModel extract_v (string select_sql, GLib.HashTable<string,GLib.Value?>? vars) throws GLib.Error;
+		public Gda.DataModel extract_v (string select_sql, GLib.HashTable<string,GLib.Value>? vars) throws GLib.Error;
 		public bool get_attribute_value (string att_name, out string att_value) throws GLib.Error;
 		public unowned Gda.Connection get_internal_connection ();
 		public int get_version ();
@@ -1244,22 +1243,22 @@ namespace Gda {
 		public bool trylock ();
 		public void unlock ();
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct DataMetaWrapper {
 		public weak GLib.Object object;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct DataMetaWrapperClass {
 		public weak GLib.ObjectClass parent_class;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct Diff {
 		public Gda.DiffType type;
 		public int old_row;
 		public int new_row;
 		public weak GLib.HashTable<void*,void*> values;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct DsnInfo {
 		public weak string name;
 		public weak string provider;
@@ -1268,7 +1267,7 @@ namespace Gda {
 		public weak string auth_string;
 		public bool is_system;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct MetaContext {
 		public weak string table_name;
 		public int size;
@@ -1277,7 +1276,7 @@ namespace Gda {
 		[CCode (array_length_cname = "size")]
 		public weak GLib.Value[] column_values;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct MetaDbObject {
 		public Gda.MetaDbObjectType obj_type;
 		public bool outdated;
@@ -1293,13 +1292,13 @@ namespace Gda {
 		[CCode (cname = "extra.meta_view")]
 		public Gda.MetaView extra_meta_view;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct MetaStoreChange {
 		public Gda.MetaStoreChangeType c_type;
 		public weak string table_name;
 		public weak GLib.HashTable<void*,void*> keys;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct MetaTable {
 		public GLib.List<Gda.MetaTableColumn> columns;
 		public int pk_cols_array;
@@ -1307,7 +1306,7 @@ namespace Gda {
 		public GLib.List<Gda.MetaTableForeignKey> reverse_fk_list;
 		public GLib.List<Gda.MetaTableForeignKey> fk_list;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct MetaTableColumn {
 		public weak string column_name;
 		public weak string column_type;
@@ -1319,7 +1318,7 @@ namespace Gda {
 		public GLib.Value get_attribute (string attribute);
 		public void set_attribute (string attribute, GLib.Value? value, GLib.DestroyNotify? destroy);
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct MetaTableForeignKey {
 		public Gda.MetaDbObject meta_table;
 		public Gda.MetaDbObject depend_on;
@@ -1330,13 +1329,13 @@ namespace Gda {
 		public weak string ref_pk_names_array;
 		public weak string fk_name;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct MetaView {
 		public Gda.MetaTable table;
 		public weak string view_def;
 		public bool is_updatable;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct ProviderInfo {
 		public weak string id;
 		public weak string location;
@@ -1344,24 +1343,24 @@ namespace Gda {
 		public weak Gda.Set dsn_params;
 		public weak Gda.Set auth_params;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct ServerProviderHandlerInfo {
 		public weak Gda.Connection cnc;
 		public GLib.Type g_type;
 		public weak string dbms_type;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct SetGroup {
 		public GLib.List<Gda.SetNode> nodes;
 		public Gda.SetSource nodes_source;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct SetNode {
 		public weak Gda.Holder holder;
 		public weak Gda.DataModel source_model;
 		public int source_column;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct SetSource {
 		public weak Gda.DataModel data_model;
 		public GLib.List<Gda.SetNode> nodes;
@@ -1370,7 +1369,7 @@ namespace Gda {
 	[SimpleType]
 	public struct SqlBuilderId : uint {
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct SqlRenderingContext {
 		public Gda.StatementSqlFlag flags;
 		public weak Gda.Set @params;
@@ -1379,12 +1378,12 @@ namespace Gda {
 		public weak Gda.Connection cnc;
 		public weak Gda.SqlRenderingValue render_value;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct ThreadNotification {
 		public Gda.ThreadNotificationType type;
 		public uint job_id;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct TransactionStatusEvent {
 		public weak Gda.TransactionStatus trans;
 		public Gda.TransactionStatusEventType type;
@@ -1396,7 +1395,7 @@ namespace Gda {
 		[CCode (cname = "pl.sub_trans")]
 		public weak Gda.TransactionStatus pl_sub_trans;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h")]
 	public struct XaTransactionId {
 		public uint32 format;
 		public ushort gtrid_length;
@@ -1405,7 +1404,7 @@ namespace Gda {
 		public weak char[] data;
 		public string to_string ();
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", cname = "_GdaServerOperationNode", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h", cname = "_GdaServerOperationNode")]
 	public struct _ServerOperationNode {
 		public Gda.ServerOperationNodeType type;
 		public Gda.ServerOperationNodeStatus status;
@@ -1414,7 +1413,7 @@ namespace Gda {
 		public weak Gda.Column column;
 		public weak Gda.Holder param;
 	}
-	[CCode (cheader_filename = "libgda/libgda.h", cname = "_GdaSqlParserIface", has_type_id = false)]
+	[CCode (cheader_filename = "libgda/libgda.h", cname = "_GdaSqlParserIface")]
 	public struct _SqlParserIface {
 		public weak Gda.SqlParser parser;
 		public weak Gda.SqlStatement parsed_statement;
diff --git a/tests/vala/CheckDataModelIterator.vala b/tests/vala/CheckDataModelIterator.vala
index 143b45d..44f575e 100644
--- a/tests/vala/CheckDataModelIterator.vala
+++ b/tests/vala/CheckDataModelIterator.vala
@@ -76,7 +76,7 @@ namespace Check {
 				stdout.printf ("+++++ PASS\n");
 			stdout.printf ("Iterating using foreach instruction...\n");
 			i = 0;
-			foreach (DbRecord<Value?> r in itermodel) {
+			foreach (DbRecord r in itermodel) {
 				string t = r.to_string ();
 				if (t == null) {
 					fails++;
@@ -188,7 +188,7 @@ namespace Check {
 			var iter = itermodel.filter (
 			(g) => {
 				bool ret = false;
-				foreach (DbField<Value?> fl in g.fields) {
+				foreach (DbField fl in g.fields) {
 					string t = Gda.value_stringify (fl.value);
 					stdout.printf ("Value to check: " + t);
 					if (t.contains ("J")) { 
@@ -227,7 +227,7 @@ namespace Check {
 				(state, g, out lazy) =>	{
 					if (state == Gee.Traversable.Stream.CONTINUE) {
 						var r = g.value;
-						foreach (DbField<Value?> f in r.fields) {
+						foreach (DbField f in r.fields) {
 							if (f.value.type () == typeof (string)) {
 								stdout.printf ("Value to YIELD: %s\n", Gda.value_stringify (f.value));
 								string ts = "YIELDED Value = " + Gda.value_stringify (f.value) + "\n";
diff --git a/tests/vala/CheckDataObject.vala b/tests/vala/CheckDataObject.vala
index 9b251f0..aa81858 100644
--- a/tests/vala/CheckDataObject.vala
+++ b/tests/vala/CheckDataObject.vala
@@ -75,11 +75,11 @@ namespace Check {
 			try {
 				k.value = 1;
 				r.set_key (k);
-				foreach (DbField<Value?> kv in r.keys) {
+				foreach (DbField kv in r.keys) {
 					stdout.printf ("KEY: " + kv.name + " VALUE: " + Gda.value_stringify(kv.value) + "\n");
 				}
 				r.update ();
-				foreach (DbField<Value?> kv in r.fields) {
+				foreach (DbField kv in r.fields) {
 					stdout.printf ("FIELD: " + kv.name + " VALUE: " + Gda.value_stringify(kv.value) + "\n");
 				}
 				stdout.printf("PASS\n");



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