[libgda] Fixes on interfaces and implementation for Gee Collection implementations



commit ab0c2e3bf5523f440261bebda0bea9103b4dc2b6
Author: Daniel Espinosa <despinosa src gnome org>
Date:   Sat Jan 7 19:47:25 2012 -0600

    Fixes on interfaces and implementation for Gee Collection implementations

 libgda/data/DataBase.vala          |   19 +-
 libgda/data/DataModelIterator.vala |    5 +-
 libgda/data/DbCollection.vala      |    4 +-
 libgda/data/DbField.vala           |    2 +-
 libgda/data/DbObject.vala          |    6 +-
 libgda/data/DbRecord.vala          |   14 +-
 libgda/data/DbSchema.vala          |    4 +-
 libgda/data/DbTable.vala           |   12 +-
 libgda/data/Field.vala             |    8 +-
 libgda/data/FieldInfo.vala         |    8 +-
 libgda/data/GdaData-5.0.gir        |  708 +++++++++++++++++++++---------------
 libgda/data/Makefile.am            |   10 +-
 libgda/data/Record.vala            |  103 +++---
 libgda/data/Schema.vala            |   19 +-
 libgda/data/Table.vala             |   41 ++-
 tests/vala/CheckDataObject.vala    |   12 +-
 16 files changed, 568 insertions(+), 407 deletions(-)
---
diff --git a/libgda/data/DataBase.vala b/libgda/data/DataBase.vala
index b173de4..27087ab 100644
--- a/libgda/data/DataBase.vala
+++ b/libgda/data/DataBase.vala
@@ -22,28 +22,29 @@ using Gda;
 
 namespace GdaData
 {
-	public class DataBase : Object 
+	public class DataBase<G> : Object, DbObject, DbNamedObject, DbCollection<G>
 	{
-		public HashMap<string,DbSchema> schemas_container;
+		public HashMap<string,DbSchema<G>> _schemas = new HashMap<string,DbSchema<G>> ();
 		// DbObject Interface
 		public Connection connection { get; set; }
 		public void update () throws Error
 		{
 			connection.update_meta_store (null);
 			var store = connection.get_meta_store ();
-			var mstruct = Gda.MetaStruct.new (store, Gda.MetaStructFeature.ALL);
-			var msch =  store.extract ("SELECT * FROM _schemata");
-			int c, r;
+			var msch =  store.extract_v ("SELECT * FROM _schemata", null);
+			int r;
 			for ( r = 0; r < msch.get_n_rows (); r++) {
-				var schema = new Schema ();
+				var schema = new Schema<G> ();
 				schema.connection = this.connection;
 				schema.name = (string) msch.get_value_at (msch.get_column_index ("schema_name"),r);
 				_schemas.set (schema.name, (DbSchema) schema);
 			}
 		}
-		public void save () {}
-		public void append () {}
+		public void save () throws Error {}
+		public bool append () throws Error { return false; }
+		// DbNamedObject
+		public string name { get; set; }
 		// DbCollection Interface
-		public abstract Collection<DbSchema> schemas { get { _schemas.values; }}
+		public Collection<DbSchema> schemas { owned get { return _schemas.values; }}
 	}
 }
diff --git a/libgda/data/DataModelIterator.vala b/libgda/data/DataModelIterator.vala
index ce0f6e3..78f37f2 100644
--- a/libgda/data/DataModelIterator.vala
+++ b/libgda/data/DataModelIterator.vala
@@ -24,7 +24,8 @@
  	/**
  	 * Iterator that implements [ link [Gee.Iterator] and [ link [Gee.Traversable]]
  	 */
- 	public class DataModelIterator : GLib.Object, Gee.Traversable <Value?>, Gee.Iterator <Value?>
+ 	public class DataModelIterator : GLib.Object, Gee.Traversable <Value?>, Gee.Iterator <Value?>,  
+ 		Gee.Traversable <DbRecord>, Gee.Iterator<DbRecord>
  	{
  		private Gda.DataModelIter iter;
  		private int _current_pos;
@@ -144,7 +145,7 @@
  		
  		public void remove () {}
  		
- 		/* Traversable  Interface */
+ 		// Traversable  Interface
  		public Gee.Iterator<Value?> chop (int offset, int length = -1) 
  			requires ( offset >= 0)
  		{
diff --git a/libgda/data/DbCollection.vala b/libgda/data/DbCollection.vala
index 5850351..90f3d01 100644
--- a/libgda/data/DbCollection.vala
+++ b/libgda/data/DbCollection.vala
@@ -22,8 +22,8 @@ using Gda;
 
 namespace GdaData
 {
-	public interface DbCollection : DbNamedObject 
+	public interface DbCollection<G> : DbNamedObject 
 	{
-		public abstract Collection<DbSchema> schemas { get; }
+		public abstract Collection<DbSchema<G>> schemas { owned get; }
 	}
 }
diff --git a/libgda/data/DbField.vala b/libgda/data/DbField.vala
index b5a2171..be9dbc7 100644
--- a/libgda/data/DbField.vala
+++ b/libgda/data/DbField.vala
@@ -22,7 +22,7 @@ using Gda;
 
 namespace GdaData
 {
-	public interface DbField<G> : Object
+	public interface DbField<G> : Object, DbObject
 	{
 		public abstract G @value { get; set; }
 		public abstract string name { get; set; }
diff --git a/libgda/data/DbObject.vala b/libgda/data/DbObject.vala
index c1309e2..a9633f2 100644
--- a/libgda/data/DbObject.vala
+++ b/libgda/data/DbObject.vala
@@ -23,9 +23,9 @@ using Gda;
 namespace GdaData {
 	public interface DbObject : Object {
 		public abstract Connection   connection { get; set; }
-		public abstract DbObject     append ();
-		public abstract void         update ();
-		public abstract void         save ();
+		public abstract bool         append () throws Error;
+		public abstract void         update () throws Error;
+		public abstract void         save () throws Error;
 	}
 	
 	public interface DbNamedObject : DbObject {
diff --git a/libgda/data/DbRecord.vala b/libgda/data/DbRecord.vala
index 1ac672f..7d272ec 100644
--- a/libgda/data/DbRecord.vala
+++ b/libgda/data/DbRecord.vala
@@ -22,9 +22,17 @@ using Gda;
 
 namespace GdaData
 {
-	public interface DbRecord : DbObject
+	public interface DbRecord<G> : DbObject, Comparable<DbRecord<G>>
 	{
-		public abstract DbTable              table { get; set construct; }
-		public abstract Collection<DbField>  fields { get; }
+		public abstract DbTable<G>                    table  { get; set construct; }
+		public abstract Collection<DbField<G>>        fields { owned get; }
+        public abstract Collection<DbField<G>>        keys   { owned get; }
+        /**
+         * Returns a GLib.Value containing the value stored in the given field.
+         */
+        public abstract G                             get_value (string field) throws Error;
+        public abstract void                          set_field (string field, Value? v) throws Error;
+        public abstract void                          set_key (string field, G v) throws Error;
+        public abstract DbField<G>                    get_field (string field) throws Error;
 	}
 }
diff --git a/libgda/data/DbSchema.vala b/libgda/data/DbSchema.vala
index 3fbd50a..329ecb0 100644
--- a/libgda/data/DbSchema.vala
+++ b/libgda/data/DbSchema.vala
@@ -22,8 +22,8 @@ using Gda;
 
 namespace GdaData
 {
-	public interface DbSchema : DbNamedObject
+	public interface DbSchema<G> : DbNamedObject
 	{
-		public abstract Collection<DbTable> tables { get; }
+		public abstract Collection<DbTable<G>> tables { owned get; }
 	}
 }
diff --git a/libgda/data/DbTable.vala b/libgda/data/DbTable.vala
index 048be2d..2478960 100644
--- a/libgda/data/DbTable.vala
+++ b/libgda/data/DbTable.vala
@@ -22,12 +22,12 @@ using Gda;
 
 namespace GdaData
 {
-	public interface DbTable : DbNamedObject
+	public interface DbTable<G> : DbNamedObject
 	{
-		public abstract DbSchema schema { get; set construct; }
-		public abstract Collection<DbRecord> records { get; }
-		public abstract Collection<DbTable> fk_depends { get; }
-		public abstract Collection<DbTable> fk { get; }
-		public abstract Iterator<DbRecord> iterator ();
+		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; set construct; }
 	}
 }
diff --git a/libgda/data/Field.vala b/libgda/data/Field.vala
index b31e864..6f8115c 100644
--- a/libgda/data/Field.vala
+++ b/libgda/data/Field.vala
@@ -22,13 +22,19 @@ using Gda;
 
 namespace GdaData
 {
-	public class Field<G> : Object, DbField<G>
+	public class Field<G> : Object, DbField<G>, DbObject
 	{
 		private G                 val;
 		private string            _name;
 		private string            _column_name;
 		private DbField.Attribute _attributes;
 		
+		// DbObject Interface
+		public Connection connection { get; set; }
+		public bool     append () throws Error { return false; }
+		public void     update () throws Error {}
+		public void     save () throws Error {}
+		// DbField Interface
 		public G @value { 
 			get { return val; } 
 			set { val = value; }
diff --git a/libgda/data/FieldInfo.vala b/libgda/data/FieldInfo.vala
index 4381b24..2f56e79 100644
--- a/libgda/data/FieldInfo.vala
+++ b/libgda/data/FieldInfo.vala
@@ -20,20 +20,20 @@
 using Gda;
 
 namespace GdaData {
-	public class FieldInfo<G> : Object, DbFieldInfo
+	public class FieldInfo<G> : Object, DbFieldInfo<G>
 	{
 		private DbField.Attribute _attr;
 		private G _default_value;
 		private string _name;
 		
-		public override DbField.Attribute  attributes {
+		public DbField.Attribute  attributes {
 			get { return _attr; }
 		}
 		
-		public override G default_value { 
+		public G default_value { 
 			get { return _default_value; }
 		}
-		public override string name { 
+		public string name { 
 			get { return _name; }
 		}
 		FieldInfo (string name, DbField.Attribute attr, G default_val)
diff --git a/libgda/data/GdaData-5.0.gir b/libgda/data/GdaData-5.0.gir
index 53ae5d3..3699e15 100644
--- a/libgda/data/GdaData-5.0.gir
+++ b/libgda/data/GdaData-5.0.gir
@@ -16,326 +16,290 @@
 		<member name="update" c:identifier="GDA_DATA_DB_OBJECT_ERROR_UPDATE" value="1"/>
 		<member name="save" c:identifier="GDA_DATA_DB_OBJECT_ERROR_SAVE" value="2"/>
 	</enumeration>
-	<class name="Record" c:type="GdaDataRecord" glib:type-name="GdaDataRecord" glib:get-type="gda_data_record_get_type" glib:type-struct="RecordClass" parent="GObject.Object" abstract="1">
+	<class name="DataBase" c:type="GdaDataDataBase" glib:type-name="GdaDataDataBase" glib:get-type="gda_data_data_base_get_type" glib:type-struct="DataBaseClass" parent="GObject.Object">
+		<implements name="GdaData.DbObject"/>
+		<implements name="GdaData.DbNamedObject"/>
+		<implements name="GdaData.DbCollection"/>
 		<field name="parent_instance">
 			<type name="GObject.Object" c:type="GObject"/>
 		</field>
 		<field name="priv">
-			<type name="RecordPrivate" c:type="GdaDataRecordPrivate*"/>
+			<type name="DataBasePrivate" c:type="GdaDataDataBasePrivate*"/>
 		</field>
-		<field name="_model">
+		<field name="_schemas">
 			<type name="Gee.HashMap" c:type="GeeHashMap*">
 				<type name="utf8" c:type="gchar*"/>
-				<type name="GdaData.Field" c:type="GdaDataField*">
+				<type name="GdaData.DbSchema" c:type="GdaDataDbSchema*">
 					<type name="gpointer" c:type="gpointer"/>
 				</type>
 			</type>
 		</field>
-		<method name="get_value" c:identifier="gda_data_record_get_value" throws="1">
-			<parameters>
-				<parameter name="field" transfer-ownership="none">
-					<type name="utf8" c:type="const gchar*"/>
-				</parameter>
-			</parameters>
-			<return-value transfer-ownership="full" allow-none="1">
-				<type name="gpointer" c:type="gpointer"/>
-			</return-value>
-		</method>
-		<method name="set_value" c:identifier="gda_data_record_set_value" throws="1">
-			<parameters>
-				<parameter name="field" transfer-ownership="none">
-					<type name="utf8" c:type="const gchar*"/>
-				</parameter>
-				<parameter name="v" transfer-ownership="none" allow-none="1">
-					<type name="gpointer" c:type="gpointer"/>
-				</parameter>
-			</parameters>
-			<return-value transfer-ownership="full">
-				<type name="none"/>
-			</return-value>
-		</method>
-		<method name="save" c:identifier="gda_data_record_save" throws="1">
-			<return-value transfer-ownership="full">
-				<type name="none"/>
-			</return-value>
-		</method>
-		<virtual-method name="save" invoker="save" throws="1">
-			<return-value transfer-ownership="full">
-				<type name="none"/>
-			</return-value>
-		</virtual-method>
-		<method name="update" c:identifier="gda_data_record_update" throws="1">
-			<return-value transfer-ownership="full">
-				<type name="none"/>
-			</return-value>
-		</method>
-		<virtual-method name="update" invoker="update" throws="1">
+		<constructor name="new" c:identifier="gda_data_data_base_new">
 			<return-value transfer-ownership="full">
-				<type name="none"/>
+				<type name="GdaData.DataBase" c:type="GdaDataDataBase*"/>
 			</return-value>
-		</virtual-method>
-		<method name="append" c:identifier="gda_data_record_append" throws="1">
+		</constructor>
+	</class>
+	<record name="DataBaseClass" c:type="GdaDataDataBaseClass" glib:is-gtype-struct-for="DataBase">
+		<field name="parent_class">
+			<type name="GObject.ObjectClass" c:type="GObjectClass"/>
+		</field>
+	</record>
+	<record name="DataBasePrivate" c:type="GdaDataDataBasePrivate" 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"/>
+		<implements name="GdaData.DbSchema"/>
+		<field name="parent_instance">
+			<type name="GObject.Object" c:type="GObject"/>
+		</field>
+		<field name="priv">
+			<type name="SchemaPrivate" c:type="GdaDataSchemaPrivate*"/>
+		</field>
+		<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>
+		</field>
+		<constructor name="new" c:identifier="gda_data_schema_new">
 			<return-value transfer-ownership="full">
-				<type name="gboolean" c:type="gboolean"/>
+				<type name="GdaData.Schema" c:type="GdaDataSchema*"/>
 			</return-value>
-		</method>
-		<virtual-method name="append" invoker="append" throws="1">
+		</constructor>
+	</class>
+	<record name="SchemaClass" c:type="GdaDataSchemaClass" glib:is-gtype-struct-for="Schema">
+		<field name="parent_class">
+			<type name="GObject.ObjectClass" c:type="GObjectClass"/>
+		</field>
+	</record>
+	<record name="SchemaPrivate" c:type="GdaDataSchemaPrivate" disguised="1"/>
+	<class name="Table" c:type="GdaDataTable" glib:type-name="GdaDataTable" glib:get-type="gda_data_table_get_type" glib:type-struct="TableClass" parent="GObject.Object">
+		<implements name="GdaData.DbObject"/>
+		<implements name="GdaData.DbNamedObject"/>
+		<implements name="GdaData.DbTable"/>
+		<field name="parent_instance">
+			<type name="GObject.Object" c:type="GObject"/>
+		</field>
+		<field name="priv">
+			<type name="TablePrivate" c:type="GdaDataTablePrivate*"/>
+		</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>
+		</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>
+		</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>
+		</field>
+		<constructor name="new" c:identifier="gda_data_table_new">
 			<return-value transfer-ownership="full">
-				<type name="gboolean" c:type="gboolean"/>
+				<type name="GdaData.Table" c:type="GdaDataTable*"/>
 			</return-value>
-		</virtual-method>
+		</constructor>
+	</class>
+	<record name="TableClass" c:type="GdaDataTableClass" glib:is-gtype-struct-for="Table">
+		<field name="parent_class">
+			<type name="GObject.ObjectClass" c:type="GObjectClass"/>
+		</field>
+	</record>
+	<record name="TablePrivate" c:type="GdaDataTablePrivate" disguised="1"/>
+	<class name="Record" c:type="GdaDataRecord" glib:type-name="GdaDataRecord" glib:get-type="gda_data_record_get_type" glib:type-struct="RecordClass" parent="GObject.Object">
+		<implements name="GdaData.DbObject"/>
+		<implements name="GdaData.DbRecord"/>
+		<implements name="Gee.Comparable"/>
+		<field name="parent_instance">
+			<type name="GObject.Object" c:type="GObject"/>
+		</field>
+		<field name="priv">
+			<type name="RecordPrivate" c:type="GdaDataRecordPrivate*"/>
+		</field>
+		<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>
+		</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>
+		</field>
 		<method name="to_string" c:identifier="gda_data_record_to_string">
 			<return-value transfer-ownership="full">
 				<type name="utf8" c:type="gchar*"/>
 			</return-value>
 		</method>
-		<virtual-method name="to_string" invoker="to_string">
+		<constructor name="new" c:identifier="gda_data_record_new">
 			<return-value transfer-ownership="full">
-				<type name="utf8" c:type="gchar*"/>
+				<type name="GdaData.Record" c:type="GdaDataRecord*"/>
 			</return-value>
-		</virtual-method>
-		<property name="table">
-			<type name="utf8" c:type="gchar*"/>
-		</property>
-		<property name="fields">
-			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.Field" c:type="GdaDataField*">
-					<type name="gpointer" c:type="gpointer"/>
-				</type>
-			</type>
-		</property>
-		<property name="connection" writable="1">
-			<type name="Gda.Connection" c:type="GdaConnection*"/>
-		</property>
+		</constructor>
 	</class>
 	<record name="RecordClass" c:type="GdaDataRecordClass" glib:is-gtype-struct-for="Record">
 		<field name="parent_class">
 			<type name="GObject.ObjectClass" c:type="GObjectClass"/>
 		</field>
-				<field name="save">
-			<callback name="save" c:type="save" throws="1">
-				<parameters>
-					<parameter name="self" transfer-ownership="none">
-						<type name="GdaData.Record" c:type="GdaDataRecord*"/>
-					</parameter>
-				</parameters>
-				<return-value transfer-ownership="full">
-					<type name="none"/>
-				</return-value>
-			</callback>
-		</field>
-				<field name="update">
-			<callback name="update" c:type="update" throws="1">
-				<parameters>
-					<parameter name="self" transfer-ownership="none">
-						<type name="GdaData.Record" c:type="GdaDataRecord*"/>
-					</parameter>
-				</parameters>
-				<return-value transfer-ownership="full">
-					<type name="none"/>
-				</return-value>
-			</callback>
-		</field>
-				<field name="append">
-			<callback name="append" c:type="append" throws="1">
-				<parameters>
-					<parameter name="self" transfer-ownership="none">
-						<type name="GdaData.Record" c:type="GdaDataRecord*"/>
-					</parameter>
-				</parameters>
-				<return-value transfer-ownership="full">
-					<type name="gboolean" c:type="gboolean"/>
-				</return-value>
-			</callback>
-		</field>
-				<field name="to_string">
-			<callback name="to_string" c:type="to_string">
-				<parameters>
-					<parameter name="self" transfer-ownership="none">
-						<type name="GdaData.Record" c:type="GdaDataRecord*"/>
-					</parameter>
-				</parameters>
-				<return-value transfer-ownership="full">
-					<type name="utf8" c:type="gchar*"/>
-				</return-value>
-			</callback>
-		</field>
 	</record>
 	<record name="RecordPrivate" c:type="GdaDataRecordPrivate" disguised="1"/>
-	<class name="RecordSingleId" c:type="GdaDataRecordSingleId" glib:type-name="GdaDataRecordSingleId" glib:get-type="gda_data_record_single_id_get_type" glib:type-struct="RecordSingleIdClass" parent="GdaData.Record" abstract="1">
+	<class name="RecordCollection" c:type="GdaDataRecordCollection" glib:type-name="GdaDataRecordCollection" glib:get-type="gda_data_record_collection_get_type" glib:type-struct="RecordCollectionClass" parent="Gee.AbstractCollection">
+		<implements name="GdaData.DbRecordCollection"/>
 		<field name="parent_instance">
-			<type name="GdaData.Record" c:type="GdaDataRecord"/>
+			<type name="Gee.AbstractCollection" c:type="GeeAbstractCollection"/>
 		</field>
 		<field name="priv">
-			<type name="RecordSingleIdPrivate" c:type="GdaDataRecordSingleIdPrivate*"/>
+			<type name="RecordCollectionPrivate" c:type="GdaDataRecordCollectionPrivate*"/>
 		</field>
-		<method name="get_id" c:identifier="gda_data_record_single_id_get_id">
+		<constructor name="new" c:identifier="gda_data_record_collection_new">
 			<parameters>
-				<parameter name="result" direction="out" transfer-ownership="full" caller-allocates="1">
-					<type name="GObject.Value" c:type="GValue"/>
+				<parameter name="m" transfer-ownership="none">
+					<type name="Gda.DataModel" c:type="GdaDataModel*"/>
 				</parameter>
-			</parameters>
-			<return-value transfer-ownership="none">
-				<type name="none"/>
-			</return-value>
-		</method>
-		<method name="set_id" c:identifier="gda_data_record_single_id_set_id" throws="1">
-			<parameters>
-				<parameter name="v" transfer-ownership="none">
-					<type name="GObject.Value" c:type="GValue"/>
+				<parameter name="table" transfer-ownership="none">
+					<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
-				<type name="none"/>
-			</return-value>
-		</method>
-		<method name="sql" c:identifier="gda_data_record_single_id_sql">
-			<return-value transfer-ownership="full">
-				<type name="Gda.SqlBuilder" c:type="GdaSqlBuilder*"/>
+				<type name="GdaData.RecordCollection" c:type="GdaDataRecordCollection*"/>
 			</return-value>
-		</method>
-		<property name="field-id">
-			<type name="utf8" c:type="gchar*"/>
-		</property>
-		<property name="field-id-index">
-			<type name="gint" c:type="gint"/>
+		</constructor>
+		<property name="model">
+			<type name="Gda.DataModel" c:type="GdaDataModel*"/>
 		</property>
 	</class>
-	<record name="RecordSingleIdClass" c:type="GdaDataRecordSingleIdClass" glib:is-gtype-struct-for="RecordSingleId">
+	<record name="RecordCollectionClass" c:type="GdaDataRecordCollectionClass" glib:is-gtype-struct-for="RecordCollection">
 		<field name="parent_class">
-			<type name="GdaData.RecordClass" c:type="GdaDataRecordClass"/>
+			<type name="Gee.AbstractCollectionClass" c:type="GeeAbstractCollectionClass"/>
 		</field>
 	</record>
-	<record name="RecordSingleIdPrivate" c:type="GdaDataRecordSingleIdPrivate" disguised="1"/>
-	<class name="Field" c:type="GdaDataField" glib:type-name="GdaDataField" glib:get-type="gda_data_field_get_type" glib:type-struct="FieldClass" parent="GObject.Object">
-		<implements name="GdaData.DbField"/>
+	<record name="RecordCollectionPrivate" c:type="GdaDataRecordCollectionPrivate" disguised="1"/>
+	<class name="RecordCollectionIterator" c:type="GdaDataRecordCollectionIterator" glib:type-name="GdaDataRecordCollectionIterator" glib:get-type="gda_data_record_collection_iterator_get_type" glib:type-struct="RecordCollectionIteratorClass" parent="GObject.Object">
+		<implements name="Gee.Traversable"/>
+		<implements name="Gee.Iterator"/>
 		<field name="parent_instance">
 			<type name="GObject.Object" c:type="GObject"/>
 		</field>
 		<field name="priv">
-			<type name="FieldPrivate" c:type="GdaDataFieldPrivate*"/>
+			<type name="RecordCollectionIteratorPrivate" c:type="GdaDataRecordCollectionIteratorPrivate*"/>
 		</field>
-		<constructor name="new" c:identifier="gda_data_field_new">
+		<constructor name="new" c:identifier="gda_data_record_collection_iterator_new">
 			<parameters>
-				<parameter name="col_name" transfer-ownership="none">
-					<type name="utf8" c:type="const gchar*"/>
+				<parameter name="iter" transfer-ownership="none">
+					<type name="Gda.DataModelIter" c:type="GdaDataModelIter*"/>
 				</parameter>
-				<parameter name="attr" transfer-ownership="none">
-					<type name="GdaData.DbFieldAttribute" c:type="GdaDataDbFieldAttribute"/>
+				<parameter name="table" transfer-ownership="none">
+					<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
-				<type name="GdaData.Field" c:type="GdaDataField*"/>
+				<type name="GdaData.RecordCollectionIterator" c:type="GdaDataRecordCollectionIterator*"/>
 			</return-value>
 		</constructor>
 	</class>
-	<record name="FieldClass" c:type="GdaDataFieldClass" glib:is-gtype-struct-for="Field">
+	<record name="RecordCollectionIteratorClass" c:type="GdaDataRecordCollectionIteratorClass" glib:is-gtype-struct-for="RecordCollectionIterator">
 		<field name="parent_class">
 			<type name="GObject.ObjectClass" c:type="GObjectClass"/>
 		</field>
 	</record>
-	<record name="FieldPrivate" c:type="GdaDataFieldPrivate" disguised="1"/>
-	<class name="DataModelIterator" c:type="GdaDataDataModelIterator" glib:type-name="GdaDataDataModelIterator" glib:get-type="gda_data_data_model_iterator_get_type" glib:type-struct="DataModelIteratorClass" parent="GObject.Object">
-		<implements name="Gee.Traversable"/>
-		<implements name="Gee.Iterator"/>
+	<record name="RecordCollectionIteratorPrivate" c:type="GdaDataRecordCollectionIteratorPrivate" disguised="1"/>
+	<class name="Field" c:type="GdaDataField" glib:type-name="GdaDataField" glib:get-type="gda_data_field_get_type" glib:type-struct="FieldClass" parent="GObject.Object">
+		<implements name="GdaData.DbField"/>
+		<implements name="GdaData.DbObject"/>
 		<field name="parent_instance">
 			<type name="GObject.Object" c:type="GObject"/>
 		</field>
 		<field name="priv">
-			<type name="DataModelIteratorPrivate" c:type="GdaDataDataModelIteratorPrivate*"/>
+			<type name="FieldPrivate" c:type="GdaDataFieldPrivate*"/>
 		</field>
-		<constructor name="new" c:identifier="gda_data_data_model_iterator_new">
+		<constructor name="new" c:identifier="gda_data_field_new">
 			<parameters>
-				<parameter name="model" transfer-ownership="none">
-					<type name="Gda.DataModel" c:type="GdaDataModel*"/>
+				<parameter name="col_name" transfer-ownership="none">
+					<type name="utf8" c:type="const gchar*"/>
+				</parameter>
+				<parameter name="attr" transfer-ownership="none">
+					<type name="GdaData.DbFieldAttribute" c:type="GdaDataDbFieldAttribute"/>
 				</parameter>
 			</parameters>
 			<return-value transfer-ownership="full">
-				<type name="GdaData.DataModelIterator" c:type="GdaDataDataModelIterator*"/>
+				<type name="GdaData.Field" c:type="GdaDataField*"/>
 			</return-value>
 		</constructor>
-		<property name="current-column">
-			<type name="gint" c:type="gint"/>
-		</property>
-		<property name="current-row">
-			<type name="gint" c:type="gint"/>
-		</property>
 	</class>
-	<record name="DataModelIteratorClass" c:type="GdaDataDataModelIteratorClass" glib:is-gtype-struct-for="DataModelIterator">
+	<record name="FieldClass" c:type="GdaDataFieldClass" glib:is-gtype-struct-for="Field">
 		<field name="parent_class">
 			<type name="GObject.ObjectClass" c:type="GObjectClass"/>
 		</field>
 	</record>
-	<record name="DataModelIteratorPrivate" c:type="GdaDataDataModelIteratorPrivate" disguised="1"/>
-	<class name="DataModelIterable" c:type="GdaDataDataModelIterable" glib:type-name="GdaDataDataModelIterable" glib:get-type="gda_data_data_model_iterable_get_type" glib:type-struct="DataModelIterableClass" parent="Gee.AbstractCollection">
-		<implements name="Gda.DataModel"/>
+	<record name="FieldPrivate" c:type="GdaDataFieldPrivate" disguised="1"/>
+	<class name="FieldInfo" c:type="GdaDataFieldInfo" glib:type-name="GdaDataFieldInfo" glib:get-type="gda_data_field_info_get_type" glib:type-struct="FieldInfoClass" parent="GObject.Object">
+		<implements name="GdaData.DbFieldInfo"/>
 		<field name="parent_instance">
-			<type name="Gee.AbstractCollection" c:type="GeeAbstractCollection"/>
+			<type name="GObject.Object" c:type="GObject"/>
 		</field>
 		<field name="priv">
-			<type name="DataModelIterablePrivate" c:type="GdaDataDataModelIterablePrivate*"/>
+			<type name="FieldInfoPrivate" c:type="GdaDataFieldInfoPrivate*"/>
 		</field>
-		<constructor name="new" c:identifier="gda_data_data_model_iterable_new">
-			<parameters>
-				<parameter name="model" transfer-ownership="none">
-					<type name="Gda.DataModel" c:type="GdaDataModel*"/>
-				</parameter>
-			</parameters>
-			<return-value transfer-ownership="full">
-				<type name="GdaData.DataModelIterable" c:type="GdaDataDataModelIterable*"/>
-			</return-value>
-		</constructor>
-		<method name="foreach" c:identifier="gda_data_data_model_iterable_foreach">
-			<parameters>
-				<parameter name="f" transfer-ownership="none" closure="1">
-					<type name="Gee.ForallFunc" c:type="GeeForallFunc"/>
-				</parameter>
-				<parameter name="f_target" transfer-ownership="none" allow-none="1">
-					<type name="gpointer" c:type="void*"/>
-				</parameter>
-			</parameters>
-			<return-value transfer-ownership="full">
-				<type name="none"/>
-			</return-value>
-		</method>
-		<property name="element-type">
-			<type name="GObject.Type" c:type="GType"/>
-		</property>
 	</class>
-	<record name="DataModelIterableClass" c:type="GdaDataDataModelIterableClass" glib:is-gtype-struct-for="DataModelIterable">
+	<record name="FieldInfoClass" c:type="GdaDataFieldInfoClass" glib:is-gtype-struct-for="FieldInfo">
 		<field name="parent_class">
-			<type name="Gee.AbstractCollectionClass" c:type="GeeAbstractCollectionClass"/>
+			<type name="GObject.ObjectClass" c:type="GObjectClass"/>
 		</field>
 	</record>
-	<record name="DataModelIterablePrivate" c:type="GdaDataDataModelIterablePrivate" disguised="1"/>
+	<record name="FieldInfoPrivate" c:type="GdaDataFieldInfoPrivate" disguised="1"/>
 	<interface name="DbObject" c:type="GdaDataDbObject" glib:type-name="GdaDataDbObject" glib:get-type="gda_data_db_object_get_type" glib:type-struct="DbObjectIface">
 		<prerequisite name="GObject.Object"/>
-		<method name="append" c:identifier="gda_data_db_object_append">
+		<method name="append" c:identifier="gda_data_db_object_append" throws="1">
 			<return-value transfer-ownership="full">
-				<type name="GdaData.DbObject" c:type="GdaDataDbObject*"/>
+				<type name="gboolean" c:type="gboolean"/>
 			</return-value>
 		</method>
-		<virtual-method name="append" invoker="append">
+		<virtual-method name="append" invoker="append" throws="1">
 			<return-value transfer-ownership="full">
-				<type name="GdaData.DbObject" c:type="GdaDataDbObject*"/>
+				<type name="gboolean" c:type="gboolean"/>
 			</return-value>
 		</virtual-method>
-		<method name="update" c:identifier="gda_data_db_object_update">
+		<method name="update" c:identifier="gda_data_db_object_update" throws="1">
 			<return-value transfer-ownership="full">
 				<type name="none"/>
 			</return-value>
 		</method>
-		<virtual-method name="update" invoker="update">
+		<virtual-method name="update" invoker="update" throws="1">
 			<return-value transfer-ownership="full">
 				<type name="none"/>
 			</return-value>
 		</virtual-method>
-		<method name="save" c:identifier="gda_data_db_object_save">
+		<method name="save" c:identifier="gda_data_db_object_save" throws="1">
 			<return-value transfer-ownership="full">
 				<type name="none"/>
 			</return-value>
 		</method>
-		<virtual-method name="save" invoker="save">
+		<virtual-method name="save" invoker="save" throws="1">
 			<return-value transfer-ownership="full">
 				<type name="none"/>
 			</return-value>
@@ -349,19 +313,19 @@
 			<type name="GObject.TypeInterface" c:type="GTypeInterface"/>
 		</field>
 		<field name="append">
-			<callback name="append" c:type="append">
+			<callback name="append" c:type="append" throws="1">
 				<parameters>
 					<parameter name="self" transfer-ownership="none">
 						<type name="GdaData.DbObject" c:type="GdaDataDbObject*"/>
 					</parameter>
 				</parameters>
 				<return-value transfer-ownership="full">
-					<type name="GdaData.DbObject" c:type="GdaDataDbObject*"/>
+					<type name="gboolean" c:type="gboolean"/>
 				</return-value>
 			</callback>
 		</field>
 		<field name="update">
-			<callback name="update" c:type="update">
+			<callback name="update" c:type="update" throws="1">
 				<parameters>
 					<parameter name="self" transfer-ownership="none">
 						<type name="GdaData.DbObject" c:type="GdaDataDbObject*"/>
@@ -373,7 +337,7 @@
 			</callback>
 		</field>
 		<field name="save">
-			<callback name="save" c:type="save">
+			<callback name="save" c:type="save" throws="1">
 				<parameters>
 					<parameter name="self" transfer-ownership="none">
 						<type name="GdaData.DbObject" c:type="GdaDataDbObject*"/>
@@ -398,33 +362,11 @@
 	</record>
 	<interface name="DbCollection" c:type="GdaDataDbCollection" glib:type-name="GdaDataDbCollection" glib:get-type="gda_data_db_collection_get_type" glib:type-struct="DbCollectionIface">
 		<prerequisite name="GdaData.DbNamedObject"/>
-		<method name="get_tables" c:identifier="gda_data_db_collection_get_tables">
-			<parameters>
-				<parameter name="schema" transfer-ownership="none">
-					<type name="utf8" c:type="const gchar*"/>
-				</parameter>
-			</parameters>
-			<return-value transfer-ownership="full">
-				<type name="Gee.Collection" c:type="GeeCollection*">
-					<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
-				</type>
-			</return-value>
-		</method>
-		<virtual-method name="get_tables" invoker="get_tables">
-			<parameters>
-				<parameter name="schema" transfer-ownership="none">
-					<type name="utf8" c:type="const gchar*"/>
-				</parameter>
-			</parameters>
-			<return-value transfer-ownership="full">
-				<type name="Gee.Collection" c:type="GeeCollection*">
-					<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
-				</type>
-			</return-value>
-		</virtual-method>
 		<property name="schemas">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbSchema" c:type="GdaDataDbSchema*"/>
+				<type name="GdaData.DbSchema" c:type="GdaDataDbSchema*">
+					<type name="gpointer" c:type="gpointer"/>
+				</type>
 			</type>
 		</property>
 	</interface>
@@ -432,56 +374,38 @@
 		<field name="parent_iface">
 			<type name="GObject.TypeInterface" c:type="GTypeInterface"/>
 		</field>
-		<field name="get_tables">
-			<callback name="get_tables" c:type="get_tables">
-				<parameters>
-					<parameter name="self" transfer-ownership="none">
-						<type name="GdaData.DbCollection" c:type="GdaDataDbCollection*"/>
-					</parameter>
-					<parameter name="schema" transfer-ownership="none">
-						<type name="utf8" c:type="const gchar*"/>
-					</parameter>
-				</parameters>
-				<return-value transfer-ownership="full">
-					<type name="Gee.Collection" c:type="GeeCollection*">
-						<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
-					</type>
-				</return-value>
-			</callback>
-		</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.DbNamedObject"/>
-		<method name="iterator" c:identifier="gda_data_db_table_iterator">
-			<return-value transfer-ownership="full">
-				<type name="Gee.Iterator" c:type="GeeIterator*">
-					<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
-				</type>
-			</return-value>
-		</method>
-		<virtual-method name="iterator" invoker="iterator">
-			<return-value transfer-ownership="full">
-				<type name="Gee.Iterator" c:type="GeeIterator*">
-					<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
-				</type>
-			</return-value>
-		</virtual-method>
 		<property name="schema" writable="1" construct="1">
 			<type name="GdaData.DbSchema" c:type="GdaDataDbSchema*"/>
 		</property>
 		<property name="records">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
+				<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*">
+					<type name="gpointer" c:type="gpointer"/>
+				</type>
 			</type>
 		</property>
 		<property name="fk-depends">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
+				<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
+					<type name="gpointer" c:type="gpointer"/>
+				</type>
 			</type>
 		</property>
 		<property name="fk">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
+				<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
+					<type name="gpointer" c:type="gpointer"/>
+				</type>
+			</type>
+		</property>
+		<property name="fields" writable="1" construct="1">
+			<type name="Gee.Collection" c:type="GeeCollection*">
+				<type name="GdaData.DbFieldInfo" c:type="GdaDataDbFieldInfo*">
+					<type name="gpointer" c:type="gpointer"/>
+				</type>
 			</type>
 		</property>
 	</interface>
@@ -489,29 +413,123 @@
 		<field name="parent_iface">
 			<type name="GObject.TypeInterface" c:type="GTypeInterface"/>
 		</field>
-		<field name="iterator">
-			<callback name="iterator" c:type="iterator">
-				<parameters>
-					<parameter name="self" transfer-ownership="none">
-						<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
-					</parameter>
-				</parameters>
-				<return-value transfer-ownership="full">
-					<type name="Gee.Iterator" c:type="GeeIterator*">
-						<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
-					</type>
-				</return-value>
-			</callback>
-		</field>
 	</record>
 	<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"/>
+		<method name="get_value" c:identifier="gda_data_db_record_get_value" throws="1">
+			<parameters>
+				<parameter name="field" transfer-ownership="none">
+					<type name="utf8" c:type="const gchar*"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full" allow-none="1">
+				<type name="gpointer" c:type="gpointer"/>
+			</return-value>
+		</method>
+		<virtual-method name="get_value" invoker="get_value" throws="1">
+			<parameters>
+				<parameter name="field" transfer-ownership="none">
+					<type name="utf8" c:type="const gchar*"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full" allow-none="1">
+				<type name="gpointer" c:type="gpointer"/>
+			</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="utf8" c:type="const gchar*"/>
+				</parameter>
+				<parameter name="v" transfer-ownership="none" allow-none="1">
+					<type name="GObject.Value" c:type="GValue*"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full">
+				<type name="none"/>
+			</return-value>
+		</method>
+		<virtual-method name="set_field" invoker="set_field" throws="1">
+			<parameters>
+				<parameter name="field" transfer-ownership="none">
+					<type name="utf8" c:type="const gchar*"/>
+				</parameter>
+				<parameter name="v" transfer-ownership="none" allow-none="1">
+					<type name="GObject.Value" c:type="GValue*"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full">
+				<type name="none"/>
+			</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="utf8" c:type="const gchar*"/>
+				</parameter>
+				<parameter name="v" transfer-ownership="none" allow-none="1">
+					<type name="gpointer" c:type="gpointer"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full">
+				<type name="none"/>
+			</return-value>
+		</method>
+		<virtual-method name="set_key" invoker="set_key" throws="1">
+			<parameters>
+				<parameter name="field" transfer-ownership="none">
+					<type name="utf8" c:type="const gchar*"/>
+				</parameter>
+				<parameter name="v" transfer-ownership="none" allow-none="1">
+					<type name="gpointer" c:type="gpointer"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full">
+				<type name="none"/>
+			</return-value>
+		</virtual-method>
+		<method name="get_field" c:identifier="gda_data_db_record_get_field" throws="1">
+			<parameters>
+				<parameter name="field" transfer-ownership="none">
+					<type name="utf8" c:type="const gchar*"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full">
+				<type name="GdaData.DbField" c:type="GdaDataDbField*">
+					<type name="gpointer" c:type="gpointer"/>
+				</type>
+			</return-value>
+		</method>
+		<virtual-method name="get_field" invoker="get_field" throws="1">
+			<parameters>
+				<parameter name="field" transfer-ownership="none">
+					<type name="utf8" c:type="const gchar*"/>
+				</parameter>
+			</parameters>
+			<return-value transfer-ownership="full">
+				<type name="GdaData.DbField" c:type="GdaDataDbField*">
+					<type name="gpointer" c:type="gpointer"/>
+				</type>
+			</return-value>
+		</virtual-method>
 		<property name="table" writable="1" construct="1">
-			<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
+			<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
+				<type name="gpointer" c:type="gpointer"/>
+			</type>
 		</property>
 		<property name="fields">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbField" c:type="GdaDataDbField*"/>
+				<type name="GdaData.DbField" c:type="GdaDataDbField*">
+					<type name="gpointer" c:type="gpointer"/>
+				</type>
+			</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>
 		</property>
 	</interface>
@@ -519,9 +537,78 @@
 		<field name="parent_iface">
 			<type name="GObject.TypeInterface" c:type="GTypeInterface"/>
 		</field>
+		<field name="get_value">
+			<callback name="get_value" c:type="get_value" throws="1">
+				<parameters>
+					<parameter name="self" transfer-ownership="none">
+						<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
+					</parameter>
+					<parameter name="field" transfer-ownership="none">
+						<type name="utf8" c:type="const gchar*"/>
+					</parameter>
+				</parameters>
+				<return-value transfer-ownership="full" allow-none="1">
+					<type name="gpointer" c:type="gpointer"/>
+				</return-value>
+			</callback>
+		</field>
+		<field name="set_field">
+			<callback name="set_field" c:type="set_field" throws="1">
+				<parameters>
+					<parameter name="self" transfer-ownership="none">
+						<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
+					</parameter>
+					<parameter name="field" transfer-ownership="none">
+						<type name="utf8" c:type="const gchar*"/>
+					</parameter>
+					<parameter name="v" transfer-ownership="none" allow-none="1">
+						<type name="GObject.Value" c:type="GValue*"/>
+					</parameter>
+				</parameters>
+				<return-value transfer-ownership="full">
+					<type name="none"/>
+				</return-value>
+			</callback>
+		</field>
+		<field name="set_key">
+			<callback name="set_key" c:type="set_key" throws="1">
+				<parameters>
+					<parameter name="self" transfer-ownership="none">
+						<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
+					</parameter>
+					<parameter name="field" transfer-ownership="none">
+						<type name="utf8" c:type="const gchar*"/>
+					</parameter>
+					<parameter name="v" transfer-ownership="none" allow-none="1">
+						<type name="gpointer" c:type="gpointer"/>
+					</parameter>
+				</parameters>
+				<return-value transfer-ownership="full">
+					<type name="none"/>
+				</return-value>
+			</callback>
+		</field>
+		<field name="get_field">
+			<callback name="get_field" c:type="get_field" throws="1">
+				<parameters>
+					<parameter name="self" transfer-ownership="none">
+						<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
+					</parameter>
+					<parameter name="field" transfer-ownership="none">
+						<type name="utf8" c:type="const gchar*"/>
+					</parameter>
+				</parameters>
+				<return-value transfer-ownership="full">
+					<type name="GdaData.DbField" c:type="GdaDataDbField*">
+						<type name="gpointer" c:type="gpointer"/>
+					</type>
+				</return-value>
+			</callback>
+		</field>
 	</record>
 	<interface name="DbField" c:type="GdaDataDbField" glib:type-name="GdaDataDbField" glib:get-type="gda_data_db_field_get_type" glib:type-struct="DbFieldIface">
 		<prerequisite name="GObject.Object"/>
+		<prerequisite name="GdaData.DbObject"/>
 		<method name="to_string" c:identifier="gda_data_db_field_to_string">
 			<return-value transfer-ownership="full">
 				<type name="utf8" c:type="gchar*"/>
@@ -575,11 +662,30 @@
 		<member name="no_modif" c:identifier="GDA_DATA_DB_FIELD_ATTRIBUTE_NO_MODIF" value="512"/>
 		<member name="unused" c:identifier="GDA_DATA_DB_FIELD_ATTRIBUTE_UNUSED" value="1024"/>
 	</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"/>
+		</property>
+		<property name="default-value">
+			<type name="gpointer" c:type="gpointer"/>
+		</property>
+		<property name="name">
+			<type name="utf8" c:type="gchar*"/>
+		</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>
 	<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.DbNamedObject"/>
 		<property name="tables">
 			<type name="Gee.Collection" c:type="GeeCollection*">
-				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
+				<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
+					<type name="gpointer" c:type="gpointer"/>
+				</type>
 			</type>
 		</property>
 	</interface>
@@ -588,5 +694,21 @@
 			<type name="GObject.TypeInterface" c:type="GTypeInterface"/>
 		</field>
 	</record>
+	<interface name="DbRecordCollection" c:type="GdaDataDbRecordCollection" glib:type-name="GdaDataDbRecordCollection" glib:get-type="gda_data_db_record_collection_get_type" glib:type-struct="DbRecordCollectionIface">
+		<prerequisite name="GObject.Object"/>
+		<prerequisite name="Gee.Traversable"/>
+		<prerequisite name="Gee.Iterable"/>
+		<prerequisite name="Gee.Collection"/>
+		<property name="table">
+			<type name="GdaData.DbTable" c:type="GdaDataDbTable*">
+				<type name="gpointer" c:type="gpointer"/>
+			</type>
+		</property>
+	</interface>
+	<record name="DbRecordCollectionIface" c:type="GdaDataDbRecordCollectionIface" glib:is-gtype-struct-for="DbRecordCollection">
+		<field name="parent_iface">
+			<type name="GObject.TypeInterface" c:type="GTypeInterface"/>
+		</field>
+	</record>
 </namespace>
 </repository>
diff --git a/libgda/data/Makefile.am b/libgda/data/Makefile.am
index 587509c..6e77567 100644
--- a/libgda/data/Makefile.am
+++ b/libgda/data/Makefile.am
@@ -36,7 +36,6 @@ object_persistance_sources = \
 	Schema.vala \
 	Table.vala \
 	Record.vala \
-	RecordSingleId.vala \
 	SelectQuery.vala \
 	$(NULL)
 
@@ -48,9 +47,10 @@ db_collection_sources = \
 	DbField.vala \
 	DbFieldInfo.vala \
 	DbSchema.vala \
+	DbRecordCollection.vala \
+	RecordCollection.vala \
 	Field.vala \
 	FieldInfo.vala \
-	IdField.vala \
 	$(NULL)
 
 selectable_sources = \
@@ -58,16 +58,10 @@ selectable_sources = \
 	SqlExpression.vala \
 	$(NULL)
 
-data_model_collection_sources = \
-	DataModelIterator.vala \
-	DataModelIterable.vala \
-	$(NULL)
-
 libgdadata_5_0_la_VALASOURCES = \
 	NamespaceInfo.vala \
 	$(object_persistance_sources) \
 	$(db_collection_sources) \
-	$(data_model_collection_sources) \
 	$(NULL)
 
 libgdadata_5_0_la_SOURCES = \
diff --git a/libgda/data/Record.vala b/libgda/data/Record.vala
index ee79c2e..43bd7f4 100644
--- a/libgda/data/Record.vala
+++ b/libgda/data/Record.vala
@@ -22,10 +22,10 @@ using Gee;
 
 namespace GdaData {
 
-    public abstract class Record<G> : Object {
-        
-        protected HashMap<string,DbField<G>> _model = new HashMap<string,DbField<G>> ();
-        protected HashMap<string,DbField<G>> _keys = new HashMap<string,DbField<G>> ();
+    public class Record : Object, DbObject, DbRecord<Value?>, Comparable<DbRecord>
+    {
+        protected HashMap<string,DbField<Value?>> _fields = new HashMap<string,DbField<Value?>> ();
+        protected HashMap<string,DbField<Value?>> _keys = new HashMap<string,DbField<Value?>> ();
         /**
          * 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<G>> fields { owned get { return _model.values; } }
-        public Collection<DbField<G>> keys { owned get { return _keys.values; } }
+        public Collection<DbField<Value?>> fields { owned get { return _fields.values; } }
+        public Collection<DbField<Value?>> keys { owned get { return _keys.values; } }
         /**
          * Set the connection to be used to get/set data.
          */
@@ -42,46 +42,51 @@ namespace GdaData {
         /**
          * Returns a GLib.Value containing the value stored in the given field.
          */
-        public G get_value (string field)
+        public Value? get_value (string field)
         	throws Error
         {
-        	var f = this._model.get (field);
+        	var f = this._fields.get (field);
         	return f.value;
         }
 		/**
          * Set the value to a field with the given @name.
          */
-        public void set_value (string field, G v)
+        public void set_field (string field, Value? v)
         	throws Error
         {
-        	if (_model.has_key (field)) {
-		    	var f = this._model.get (field);
+        	if (_fields.has_key (field)) {
+		    	var f = this._fields.get (field);
 		    	f.value = v;
-		    	this._model.set (field, f);
+		    	this._fields.set (field, f);
         	}
         	else {
         		// FIXME: Get default attributes from table
-        		var n = new Field<G> (field, DbField.Attribute.NONE); 
+        		var n = new Field<Value?> (field, DbField.Attribute.NONE); 
+        		n.connection = connection;
         		n.value = v;
-        		this._model.set (field, n);
+        		this._fields.set (field, n);
         	}
         	
         }
         
-        public void set_key (string field, G v)
+        public void set_key (string field, Value? v)
         {
-        	if (keys.has_key (field)) {
-		    	var f = keys.get (field);
+        	if (_keys.has_key (field)) {
+		    	var f = _keys.get (field);
 		    	f.value = v;
-		    	keys.set (field, f);
+		    	_keys.set (field, f);
         	}
         	else {
         		// FIXME: Get default attributes from table
-        		var n = new Field<G> (field, DbField.Attribute.NONE); 
+        		var n = new Field<Value?> (field, DbField.Attribute.NONE); 
         		n.value = v;
-        		keys.set (field, n);
+        		_keys.set (field, n);
         	}
         }
+        public DbField<Value?> get_field (string field) throws Error
+        {
+        	return _fields.get (field);
+        }
         /**
          * Saves any modficiation made to in memory representation of the data directly to
          * the database.
@@ -90,20 +95,18 @@ namespace GdaData {
         {
         	var q = new SqlBuilder (SqlStatementType.UPDATE);
 			q.set_table (table.name);
-			foreach (DbField<G> f in fields) {
-				Value v = f.value;
-				q.add_field_value_as_gvalue (f.column_name, v);
+			foreach (DbField<Value?> f in fields) {
+				q.add_field_value_as_gvalue (f.column_name, f.value);
 			}
 			SqlBuilderId cond = -1;
-			foreach (DbField<G> f in fields) {
+			foreach (DbField<Value?> f in fields) {
 				var f_id = q.add_id (f.name);
-				Value v = f.value;
-				var e_id = q.add_expr_value (null, v);
+				var e_id = q.add_expr_value (null, f.value);
 				var c_id = q.add_cond (SqlOperatorType.EQ, f_id, e_id, 0);
 				if (cond < 0) 
 					cond = c_id;
 				else
-					cond = sql.add_cond (SqlOperatorType.AND, cond, c_id, 0);
+					cond = q.add_cond (SqlOperatorType.AND, cond, c_id, 0);
 			}
 			q.set_where (cond);
 //			stdout.printf ("DEBUG: UPDATE statement to execute: \n"+ 
@@ -123,15 +126,14 @@ namespace GdaData {
         	var q = new SqlBuilder (SqlStatementType.SELECT);
         	q.select_add_target (table.name, null);
         	SqlBuilderId cond = -1;
-			foreach (DbField<G> f in fields) {
-				var f_id = sql.add_id (f.name);
-				Value v = f.value;
-				var e_id = sql.add_expr_value (null, v);
-				var c_id = sql.add_cond (SqlOperatorType.EQ, f_id, e_id, 0);
+			foreach (DbField<Value?> f in fields) {
+				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);
 				if (cond < 0) 
 					cond = c_id;
 				else
-					cond = sql.add_cond (SqlOperatorType.AND, cond, c_id, 0);
+					cond = q.add_cond (SqlOperatorType.AND, cond, c_id, 0);
 			}
 			q.set_where (cond);
 			q.select_add_field ("*", null, null);
@@ -139,7 +141,7 @@ namespace GdaData {
 //							(q.get_statement()).to_sql_extended (this.connection, null, 
 //																	StatementSqlFlag.PRETTY, null)
 //							+ "\n");
-			var i = this.connection.statement_execute_non_select (sql.get_statement (), null, null);
+			var i = this.connection.statement_execute_non_select (q.get_statement (), null, null);
 			if (i != 1) {
 				throw new DbObjectError.UPDATE ("Have been updated more or less rows than expected");
 			}
@@ -151,37 +153,50 @@ namespace GdaData {
         public bool append () throws Error
         {
         	var sql = new SqlBuilder (SqlStatementType.INSERT);
-			sql.set_table (this.table);
+			sql.set_table (table.name);
 			// FIXME: MetaData is required
-			foreach (Field<G> f in _model.values) {
-				Value v = f.value;
-				sql.add_field_value_as_gvalue (f.column_name, v);
+			foreach (DbField<Value?> f in _fields.values) {
+				sql.add_field_value_as_gvalue (f.column_name, f.value);
 			}
 //			stdout.printf ("DEBUG: INSERT statement to execute: \n"+ 
 //				(sql.get_statement()).to_sql_extended (this.connection, null, 
 //														StatementSqlFlag.PRETTY, null)
 //				+ "\n");
-			Set last_inserted;
 			var i = this.connection.statement_execute_non_select (sql.get_statement (), null, null);
 			if (i != 1) {
 				throw new DbObjectError.UPDATE ("Have been added more or less rows than expected");
 			}
 			return true;
 		}
-        
+        // 
         public string to_string ()
         {
         	string r = "";
-			foreach (Field<G> f in this.fields) {
+			foreach (DbField<Value?> f in this.fields) {
 				r += "|" + f.name;
 			}
 			r+="\n";
-			foreach (Field<Value?> f in this.fields) {
-				Value v = f.value;
-				r += "|" + Gda.value_stringify (v);
+			foreach (DbField<Value?> f in this.fields) {
+				r += "|" + Gda.value_stringify (f.value);
 			}
 			r+="\n";
 			return r;
         }
+        // Comparable Interface
+        /**
+         * Compare two DbRecord keys. If record have more than one key allways return -1.
+         *
+         * @Returns: 0 if keys are equal or -1 if they are different.
+         */
+        public int compare_to (DbRecord<Value?> object)
+        {
+        	int r = 0;
+        	foreach (DbField<Value?> f in fields) {
+        		var fl = object.get_field (f.name);
+        		if (Gda.value_compare (f.value, fl.value) != 0)
+        			return -1;
+        	}
+        	return r;
+        }
     }
 }
diff --git a/libgda/data/Schema.vala b/libgda/data/Schema.vala
index affa8c6..b0f5c45 100644
--- a/libgda/data/Schema.vala
+++ b/libgda/data/Schema.vala
@@ -22,30 +22,33 @@ using Gda;
 
 namespace GdaData
 {
-	public class Schema : Object
+	public class Schema<G> : Object, DbObject, DbNamedObject, DbSchema<G>
 	{
-		public HashMap<string,DbTable> tables = new HashMap<string,DbTable> ();
+		public HashMap<string,DbTable<G>> _tables = new HashMap<string,DbTable<G>> ();
 		// DbObject Interface
 		public Connection connection { get; set; }
-		public update () 
+		public void update () throws Error
 		{
 			connection.update_meta_store (null); // FIXME: just update schemas
 			var store = connection.get_meta_store ();
 			tables.clear ();
-			var mt = store.extract (@"SELECT * FROM _tables WHERE schema_name = $name");
+			var vals = new HashTable<string,Value?> (str_hash,str_equal);
+			Value v = name;
+			vals.set ("name", v);
+			var mt = store.extract_v ("SELECT * FROM _tables WHERE schema_name = ##name::string", vals);
 			for (int r = 0; r < mt.get_n_rows (); r++) {
-				var t = new Table ();
+				var t = new Table<G> ();
 				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);
 			}
 		}
-		public void save () {}
-		public void append () {}
+		public void save () throws Error {}
+		public bool append () throws Error { return false; }
 		// DbNamedObject Interface
 		public string name { get; set; }
 		// DbSchema Interface
-		public Collection<DbTable> tables { get { return tables.values; } }
+		public Collection<DbTable> tables { owned get { return _tables.values; } }
 	}
 }
diff --git a/libgda/data/Table.vala b/libgda/data/Table.vala
index bb76069..cfcf530 100644
--- a/libgda/data/Table.vala
+++ b/libgda/data/Table.vala
@@ -22,23 +22,42 @@ using Gda;
 
 namespace GdaData
 {
-	public interface Table : Object
+	public class Table<G> : Object, DbObject, DbNamedObject, DbTable<G>
 	{
+		protected DbRecordCollection _records;
+		protected HashMap<string,DbFieldInfo<G>> _fields = new HashMap<string,DbFieldInfo<G>> ();
+		protected HashMap<string,DbTable<G>> _fk_depends = new HashMap<string,DbTable<G>> ();
+		protected HashMap<string,DbTable<G>> _fk = new HashMap<string,DbTable<G>> ();
 		// DbObject Interface
 		public Connection connection { get; set; }
-		public void update ()
-		{
-			
-		}
+		public void update () throws Error {}
+		public void save () throws Error {}
+		public bool append () throws Error { return false; }
 		// DbNamedObject Interface
 		public string name { get; set; }
 		
 		// DbTable Interface
-		public Collection<FieldInfo<G>> info_fields {}
-		public DbSchema schema { get; set; }
-//		public Collection<DbRecord> records { get; }
-//		public Collection<DbTable> fk_depends { get; }
-//		public Collection<DbTable> fk { get; }
-//		public Iterator<DbRecord> iterator ();
+		public Collection<DbFieldInfo<G>> fields { 
+			owned get { return _fields.values; } 
+			set construct { 
+				foreach (DbFieldInfo<G> f in value) {
+					_fields.set (f.name, f);
+				}
+			}
+		}
+		public DbSchema schema { get; set construct; }
+		public Collection<DbRecord> records { 
+			owned get  {
+				var q = new Gda.SqlBuilder (SqlStatementType.SELECT);
+				q.set_table (name);
+				q.select_add_field ("*", null, null);
+				var s = q.get_statement ();
+	    		var m = this.connection.statement_execute_select (s, null);
+				_records = new RecordCollection (m, this);
+				return _records;
+			}
+		}
+		public Collection<DbTable> fk_depends { owned get { return _fk_depends.values; } }
+		public Collection<DbTable> fk { owned get { return _fk.values; } }
 	}
 }
diff --git a/tests/vala/CheckDataObject.vala b/tests/vala/CheckDataObject.vala
index 78275a6..288082c 100644
--- a/tests/vala/CheckDataObject.vala
+++ b/tests/vala/CheckDataObject.vala
@@ -21,18 +21,10 @@ using Gda;
 using GdaData;
 
 namespace Check {
-	class Record : RecordSingleId
+	class Record : GdaData.Record
 	{
 		public static string t = "user";
-		public override string table { 
-			get { return this.t; }
-		}
-		public override string field_id {
-			get { return "id";}
-		}
-		public override int field_id_index {
-			get { return 0;}
-		}
+		
 	}
 	class Tests :  GLib.Object {
 		public Gda.Connection connection { get; set; }



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