[libgda] Vala extensions API ports and implementations to GdaData.Table
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] Vala extensions API ports and implementations to GdaData.Table
- Date: Thu, 16 Feb 2012 00:17:37 +0000 (UTC)
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]