[libgda] Vala extensions API ports and implementations to GdaData.Table



commit bd2505d535e46dca5a04a77ed474b7dfba8643c7
Author: Daniel Espinosa <despinosa src gnome org>
Date:   Wed Feb 15 18:16:12 2012 -0600

    Vala extensions API ports and implementations to GdaData.Table

 libgda/data/DataBase.vala      |    2 +-
 libgda/data/DbField.vala       |    4 +-
 libgda/data/DbFieldInfo.vala   |   16 ++++--
 libgda/data/DbTable.vala       |   16 +++---
 libgda/data/GdaData-5.0.gir    |   34 +++++++------
 libgda/data/Schema.vala        |    2 +-
 libgda/data/SqlExpression.vala |    4 +-
 libgda/data/Table.vala         |  108 +++++++++++++++++++++++++--------------
 8 files changed, 112 insertions(+), 74 deletions(-)
---
diff --git a/libgda/data/DataBase.vala b/libgda/data/DataBase.vala
index 8a3dbca..606aa49 100644
--- a/libgda/data/DataBase.vala
+++ b/libgda/data/DataBase.vala
@@ -31,7 +31,7 @@ namespace GdaData
 		{
 			connection.update_meta_store (null);
 			var store = connection.get_meta_store ();
-			var msch =  store.extract_v ("SELECT * FROM _schemata", null);
+			var msch =  store.extract ("SELECT * FROM _schemata", null);
 			int r;
 			for ( r = 0; r < msch.get_n_rows (); r++) {
 				var schema = new Schema ();
diff --git a/libgda/data/DbField.vala b/libgda/data/DbField.vala
index 2d018e8..41cc73f 100644
--- a/libgda/data/DbField.vala
+++ b/libgda/data/DbField.vala
@@ -72,8 +72,8 @@ namespace GdaData
 				return long.parse (as_string);
 //			if (type == typeof (float))
 //				return float.parse (as_string);
-//			if (type == typeof (double))
-//				return double.parse (as_string);
+			if (type == typeof (double))
+				return double.parse (as_string);
 			if (type == typeof (Gda.Numeric))
 			{
 				var n = new Gda.Numeric ();
diff --git a/libgda/data/DbFieldInfo.vala b/libgda/data/DbFieldInfo.vala
index b573264..14883ef 100644
--- a/libgda/data/DbFieldInfo.vala
+++ b/libgda/data/DbFieldInfo.vala
@@ -22,14 +22,17 @@ using Gda;
 namespace GdaData {
 	public interface DbFieldInfo : Object
 	{
-		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; }
+		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 abstract int                    precision         { get; set; }
+		public abstract int                    scale             { get; set; }
+		
+		// Check clause expression
+//		public abstract DbSqlExpression        check_expression  { get; set; }
 		
 		public static Attribute attribute_from_string (string str)
 		{
@@ -50,6 +53,7 @@ namespace GdaData {
 			
 			return Attribute.NONE;
 		}
+		[Flags]
 		public enum Attribute {
 			NONE,
 			PRIMARY_KEY,
diff --git a/libgda/data/DbTable.vala b/libgda/data/DbTable.vala
index 378c7bd..05dffe8 100644
--- a/libgda/data/DbTable.vala
+++ b/libgda/data/DbTable.vala
@@ -24,14 +24,14 @@ namespace GdaData
 {
 	public interface DbTable : DbObject, DbNamedObject
 	{
-		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 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>              depends       { owned get; }
+		public abstract Collection<DbTable>              references    { owned get; }
+		public abstract Collection<DbFieldInfo>          fields        { owned get; }
+		public abstract Collection<DbFieldInfo>          primary_keys  { owned get; }
 		
 		public enum TableType {
 			NONE,
diff --git a/libgda/data/GdaData-5.0.gir b/libgda/data/GdaData-5.0.gir
index 60f8795..ab1331f 100644
--- a/libgda/data/GdaData-5.0.gir
+++ b/libgda/data/GdaData-5.0.gir
@@ -116,13 +116,13 @@
 				<type name="GdaData.DbFieldInfo" c:type="GdaDataDbFieldInfo*"/>
 			</type>
 		</field>
-		<field name="_fk_depends">
+		<field name="_depends">
 			<type name="Gee.HashMap" c:type="GeeHashMap*">
 				<type name="utf8" c:type="gchar*"/>
 				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 			</type>
 		</field>
-		<field name="_fk">
+		<field name="_references">
 			<type name="Gee.HashMap" c:type="GeeHashMap*">
 				<type name="utf8" c:type="gchar*"/>
 				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
@@ -443,19 +443,23 @@
 				<type name="GdaData.DbRecord" c:type="GdaDataDbRecord*"/>
 			</type>
 		</property>
-		<property name="fk-depends">
+		<property name="depends">
 			<type name="Gee.Collection" c:type="GeeCollection*">
 				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 			</type>
 		</property>
-		<property name="fk">
+		<property name="references">
 			<type name="Gee.Collection" c:type="GeeCollection*">
 				<type name="GdaData.DbTable" c:type="GdaDataDbTable*"/>
 			</type>
 		</property>
 		<property name="fields">
-			<type name="Gee.HashMap" c:type="GeeHashMap*">
-				<type name="utf8" c:type="gchar*"/>
+			<type name="Gee.Collection" c:type="GeeCollection*">
+				<type name="GdaData.DbFieldInfo" c:type="GdaDataDbFieldInfo*"/>
+			</type>
+		</property>
+		<property name="primary-keys">
+			<type name="Gee.Collection" c:type="GeeCollection*">
 				<type name="GdaData.DbFieldInfo" c:type="GdaDataDbFieldInfo*"/>
 			</type>
 		</property>
@@ -889,15 +893,15 @@
 			<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>
+	<bitfield 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="1"/>
+		<member name="primary_key" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_PRIMARY_KEY" value="2"/>
+		<member name="unique" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_UNIQUE" value="4"/>
+		<member name="foreign_key" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_FOREIGN_KEY" value="8"/>
+		<member name="check" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_CHECK" value="16"/>
+		<member name="have_default" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_HAVE_DEFAULT" value="32"/>
+		<member name="is_auto_increment" c:identifier="GDA_DATA_DB_FIELD_INFO_ATTRIBUTE_IS_AUTO_INCREMENT" value="64"/>
+	</bitfield>
 	<record name="DbFieldInfoForeignKey">
 		<field name="name">
 			<type name="utf8" c:type="gchar*"/>
diff --git a/libgda/data/Schema.vala b/libgda/data/Schema.vala
index fca1b8b..5729f18 100644
--- a/libgda/data/Schema.vala
+++ b/libgda/data/Schema.vala
@@ -35,7 +35,7 @@ namespace GdaData
 			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);
+			var mt = store.extract ("SELECT * FROM _tables WHERE schema_name = ##name::string", vals);
 			for (int r = 0; r < mt.get_n_rows (); r++) {
 				var t = new Table ();
 				t.connection = connection;
diff --git a/libgda/data/SqlExpression.vala b/libgda/data/SqlExpression.vala
index be0dae5..5f64258 100644
--- a/libgda/data/SqlExpression.vala
+++ b/libgda/data/SqlExpression.vala
@@ -22,7 +22,7 @@ using Gda;
 
 namespace GdaData
 {
-	public interface SqlExpression<A,G> : GLib.Object
+	public interface DbSqlExpression<A,G> : GLib.Object
 	{
 		public abstract Gee.HashMap<A,G> fields { get; }
 		public abstract Gee.HashMap<A,G> values { get; }
@@ -40,7 +40,7 @@ namespace GdaData
 		
 		struct DbExpressionRelation {
 			A id;
-			DbExpressionOperator value;
+			DbExpressionOperator oper;
 		}
 		
 	}
diff --git a/libgda/data/Table.vala b/libgda/data/Table.vala
index 7d02f1c..dfb7d6f 100644
--- a/libgda/data/Table.vala
+++ b/libgda/data/Table.vala
@@ -27,8 +27,8 @@ namespace GdaData
 		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> ();
+		protected HashMap<string,DbTable>     _depends = new HashMap<string,DbTable> ();
+		protected HashMap<string,DbTable>     _references = new HashMap<string,DbTable> ();
 		
 		public Table.with_fields_info (HashMap<string,DbFieldInfo> fields)
 		{
@@ -42,46 +42,60 @@ namespace GdaData
 		{
 			var store = connection.get_meta_store ();
 			_fields.clear ();
+			
+			var ctx = new Gda.MetaContext ();
+			ctx.set_table ("_columns");
+			ctx.set_column ("table_name", name, connection);
+			// May be is necesary to set schema and catalog
+			connection.update_meta_store (ctx);
+			
 			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);
+			var mt = store.extract ("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;
+				fi.name = (string) mt.get_value_at (mt.get_column_index ("column_name"), r);
+				
+				// Set attributes
+				fi.attributes = 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;
+					fi.attributes = fi.attributes & DbField.Attribute.CAN_BE_NULL;
+				string fai = (string) mt.get_value_at (mt.get_column_index ("extras"), r);
+				if (fai == "AUTO_INCREMENT")
+					fi.attributes = fi.attributes & DbFieldInfo.Attribute.IS_AUTO_INCREMENT;
+				
+				// Default Value
 				string fdv = (string) mt.get_value_at (mt.get_column_index ("column_default"), r);
+				Type ft = (Type) mt.get_value_at (mt.get_column_index ("gtype"), r);
 				if (fdv != null) {
-					attr = attr & DbField.Attribute.CAN_BE_DEFAULT;
-					var dv = DbField.value_from_string (fdv, ft);
+					fi.attributes = fi.attributes & DbField.Attribute.CAN_BE_DEFAULT;
+					fi.default_value = DbField.value_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;
+					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
+					fi.precision = fp;
 				}
 				_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);
+			ctx.set_table ("_table_constraints");
+			connection.update_meta_store (ctx);
+			ctx.set_table ("_key_column_usage");
+			connection.update_meta_store (ctx);
+			ctx.set_table ("_referential_constraints");
+			connection.update_meta_store (ctx);
+			var mc = store.extract ("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);
@@ -91,7 +105,7 @@ namespace GdaData
 				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 mpk = store.extract ("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);
@@ -100,7 +114,7 @@ namespace GdaData
 				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);
+					var mfk = store.extract ("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);
@@ -116,6 +130,7 @@ namespace GdaData
 					f.fkey.reftable.schema.connection = connection;
 					f.fkey.reftable.schema.name = (string) mfk.get_value_at (
 														mfk.get_column_index ("ref_table_schema"), 0);
+					_depends.set (f.fkey.reftable.name, f.fkey.reftable);
 					var match = (string) mfk.get_value_at (
 														mfk.get_column_index ("match_option"), 0);
 					f.fkey.match = DbFieldInfo.ForeignKey.match_from_string (match);
@@ -129,7 +144,7 @@ namespace GdaData
 				}
 				if (DbFieldInfo.Attribute.CHECK in  f.attributes) 
 				{
-					
+					// FIXME: Implement
 				}
 			}
 		}
@@ -140,21 +155,22 @@ namespace GdaData
 		
 		// DbTable Interface
 		public DbTable.TableType table_type { get { return _type; } set { _type = value; } }
-		public HashMap<string,DbFieldInfo> fields { 
-			get { return _fields; } 
+		public Collection<DbFieldInfo> fields { 
+			owned get { return _fields.values; } 
+		}
+		public Collection<DbFieldInfo> primary_keys { 
+			owned get { 
+				var pk = new Gee.HashMap<string,DbFieldInfo> ();
+				foreach (DbFieldInfo f in fields)
+				{
+					if (DbFieldInfo.Attribute.PRIMARY_KEY in f.attributes)
+					{
+						pk.set (f.name, f);
+					}
+				}
+				return  pk.values;
+			} 
 		}
-		// 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 { 
@@ -168,7 +184,21 @@ namespace GdaData
 				return _records;
 			}
 		}
-		public Collection<DbTable> fk_depends { owned get { return _fk_depends.values; } }
-		public Collection<DbTable> fk { owned get { return _fk.values; } }
+		public Collection<DbTable> depends    { owned get { return _depends.values; } }
+		public Collection<DbTable> references { 
+			owned get {
+				foreach (DbTable t in schema.tables) {
+					t.update ();
+					foreach (DbTable td in t.depends) {
+						if (name == td.name && schema.name == td.schema.name && catalog.name == td.catalog.name)
+						{
+							_references.set (t.name, t);
+							break;
+						}
+					}
+				}
+				return _references.values; 
+			} 
+		}
 	}
 }



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