[pgsqlclient-checkins] SF.net SVN: pgsqlclient: [111] trunk/PostgreSqlClient/source/PostgreSql/Data/
Status: Inactive
Brought to you by:
carlosga_fb
From: <car...@us...> - 2006-04-13 14:28:57
|
Revision: 111 Author: carlosga_fb Date: 2006-04-13 07:28:46 -0700 (Thu, 13 Apr 2006) ViewCVS: http://svn.sourceforge.net/pgsqlclient/?rev=111&view=rev Log Message: ----------- Modified Paths: -------------- trunk/PostgreSqlClient/source/PostgreSql/Data/Schema/PgColumns.cs Modified: trunk/PostgreSqlClient/source/PostgreSql/Data/Schema/PgColumns.cs =================================================================== --- trunk/PostgreSqlClient/source/PostgreSql/Data/Schema/PgColumns.cs 2006-04-12 18:12:39 UTC (rev 110) +++ trunk/PostgreSqlClient/source/PostgreSql/Data/Schema/PgColumns.cs 2006-04-13 14:28:46 UTC (rev 111) @@ -18,6 +18,7 @@ using System; using System.Data; using PostgreSql.Data.PostgreSqlClient; +using PostgreSql.Data.Protocol; namespace PostgreSql.Data.Schema { @@ -38,9 +39,8 @@ "WHEN pg_type.typname = '_bpchar' THEN '_char' " + "ELSE pg_type.typname " + "END AS DATA_TYPE, " + - "cast(pg_attribute.attlen AS Int4) AS COLUMN_SIZE, " + - "information_schema.columns.character_octet_length AS CHARACTER_OCTET_LENGTH, " + - "information_schema.columns.character_maximum_length AS CHARACTER_LENGTH, " + + "cast(0 AS Int4) AS COLUMN_SIZE, " + + "cast(0 AS Int4) AS CHARACTER_LENGTH, " + "cast (0 AS Int4) AS NUMERIC_PRECISION, " + "cast (0 AS Int4) AS NUMERIC_SCALE, " + "CASE " + @@ -56,6 +56,7 @@ "when false then true " + "END AS IS_NULLABLE, " + "(pg_depend.objid is not null) AS IS_AUTOINCREMENT, " + + "pg_attribute.atttypmod AS TYPE_MODIFIER, " + "pg_description.description AS DESCRIPTION " + "FROM " + "pg_attribute " + @@ -71,8 +72,6 @@ "pg_depend on (pg_attribute.attrelid = pg_depend.refobjid AND pg_attribute.attnum = pg_depend.refobjsubid AND pg_depend.deptype = 'i') " + "LEFT JOIN " + "pg_type on (pg_type.oid = pg_attribute.atttypid) " + - "LEFT JOIN " + - "information_schema.columns on (table_catalog=current_database() and table_schema=pg_namespace.nspname and table_name=pg_class.relname and ordinal_position=pg_attribute.attnum) " + "WHERE " + "pg_attribute.attisdropped = false AND pg_attribute.attnum > 0 "; @@ -109,29 +108,39 @@ protected override DataTable ProcessResult(PgConnection connection, DataTable schema) { - DataTable dataTypes = connection.GetSchema("DataTypes"); + int typeModifier = 0; schema.BeginLoadData(); foreach (DataRow column in schema.Rows) { + typeModifier = column.IsNull("TYPE_MODIFIER") ? -1 : Convert.ToInt32(column["TYPE_MODIFIER"]); + switch (column["DATA_TYPE"].ToString()) { - case "text": - column["COLUMN_SIZE"] = column["CHARACTER_OCTET_LENGTH"]; - break; - case "char": case "varchar": - column["COLUMN_SIZE"] = column["CHARACTER_LENGTH"]; + if (typeModifier != -1) + { + column["COLUMN_SIZE"] = typeModifier - 4; + column["CHARACTER_LENGTH"] = typeModifier - 4; + } break; + case "decimal": + case "numeric": + if (typeModifier != -1) + { + column["COLUMN_SIZE"] = ((typeModifier - 4) & 0xFFFF0000) >> 16; + column["NUMERIC_PRECISION"] = ((typeModifier - 4) & 0xFFFF0000) >> 16; + column["NUMERIC_SCALE"] = (typeModifier - 4) & 0xFFFF; + } + break; + default: - dataTypes.DefaultView.RowFilter = String.Format("TypeName='{0}'", column["COLUMN_NAME"]); - - if (dataTypes.DefaultView.Count == 1) + if (PgDatabase.DataTypes.IndexOf(column["DATA_TYPE"].ToString()) != -1) { - column["COLUMN_SIZE"] = dataTypes.DefaultView[0]["ColumnSize"]; + column["COLUMN_SIZE"] = PgDatabase.DataTypes[column["DATA_TYPE"].ToString()].Size; } break; } @@ -139,6 +148,7 @@ schema.EndLoadData(); schema.AcceptChanges(); + schema.Columns.Remove("TYPE_MODIFIER"); return schema; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |