2 * Firebird ADO.NET Data provider for .NET and Mono
\r
4 * The contents of this file are subject to the Initial
\r
5 * Developer's Public License Version 1.0 (the "License");
\r
6 * you may not use this file except in compliance with the
\r
7 * License. You may obtain a copy of the License at
\r
8 * http://www.firebirdsql.org/index.php?op=doc&id=idpl
\r
10 * Software distributed under the License is distributed on
\r
11 * an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
\r
12 * express or implied. See the License for the specific
\r
13 * language governing rights and limitations under the License.
\r
15 * Copyright (c) 2002, 2005 Carlos Guzman Alvarez
\r
16 * All Rights Reserved.
\r
21 using System.Globalization;
\r
24 using FirebirdSql.Data.Common;
\r
26 namespace FirebirdSql.Data.Firebird.DbSchema
\r
28 internal class FbColumns : FbDbSchema
\r
30 #region Constructors
\r
32 public FbColumns() : base("Columns")
\r
38 #region Protected Methods
\r
40 protected override StringBuilder GetCommandText(object[] restrictions)
\r
42 StringBuilder sql = new StringBuilder();
\r
43 StringBuilder where = new StringBuilder();
\r
47 "null AS TABLE_CATALOG, " +
\r
48 "null AS TABLE_SCHEMA, " +
\r
49 "rfr.rdb$relation_name AS TABLE_NAME, " +
\r
50 "rfr.rdb$field_name AS COLUMN_NAME, " +
\r
51 "null AS COLUMN_DATA_TYPE, " +
\r
52 "fld.rdb$field_sub_type AS COLUMN_SUB_TYPE, " +
\r
53 "cast(fld.rdb$field_length AS integer) AS COLUMN_SIZE, " +
\r
54 "cast(fld.rdb$field_precision AS integer) AS NUMERIC_PRECISION, " +
\r
55 "cast(fld.rdb$field_scale AS integer) AS NUMERIC_SCALE, " +
\r
56 "cast(fld.rdb$character_length AS integer) AS CHARACTER_LENGTH, " +
\r
57 "cast(fld.rdb$field_length AS integer) AS CHARACTER_OCTET_LENGTH, " +
\r
58 "rfr.rdb$field_position AS ORDINAL_POSITION, " +
\r
59 "null AS DOMAIN_CATALOG, " +
\r
60 "null AS DOMAIN_SCHEMA, " +
\r
61 "rfr.rdb$field_source AS DOMAIN_NAME, " +
\r
62 "fld.rdb$default_source AS COLUMN_DEFAULT, " +
\r
63 "fld.rdb$computed_source AS COMPUTED_SOURCE, " +
\r
64 "fld.rdb$dimensions AS IS_ARRAY, " +
\r
65 "rfr.rdb$null_flag AS IS_NULLABLE, " +
\r
66 "0 AS IS_READONLY, " +
\r
67 "fld.rdb$field_type AS FIELD_TYPE, " +
\r
68 "null AS CHARACTER_SET_CATALOG, " +
\r
69 "null AS CHARACTER_SET_SCHEMA, " +
\r
70 "cs.rdb$character_set_name AS CHARACTER_SET_NAME, " +
\r
71 "null AS COLLATION_CATALOG, " +
\r
72 "null AS COLLATION_SCHEMA, " +
\r
73 "coll.rdb$collation_name AS COLLATION_NAME, " +
\r
74 "rfr.rdb$description AS DESCRIPTION " +
\r
76 "rdb$relation_fields rfr " +
\r
77 "left join rdb$fields fld ON rfr.rdb$field_source = fld.rdb$field_name " +
\r
78 "left join rdb$character_sets cs ON cs.rdb$character_set_id = fld.rdb$character_set_id " +
\r
79 "left join rdb$collations coll ON (coll.rdb$collation_id = fld.rdb$collation_id AND coll.rdb$character_set_id = fld.rdb$character_set_id)");
\r
81 if (restrictions != null)
\r
86 if (restrictions.Length >= 1 && restrictions[0] != null)
\r
91 if (restrictions.Length >= 2 && restrictions[1] != null)
\r
96 if (restrictions.Length >= 3 && restrictions[2] != null)
\r
98 where.AppendFormat(CultureInfo.CurrentCulture, "rfr.rdb$relation_name = @p{0}", index++);
\r
102 if (restrictions.Length >= 4 && restrictions[3] != null)
\r
104 if (where.Length > 0)
\r
106 where.Append(" AND ");
\r
109 where.AppendFormat(CultureInfo.CurrentCulture, "rfr.rdb$field_name = @p{0}", index++);
\r
113 if (where.Length > 0)
\r
115 sql.AppendFormat(CultureInfo.CurrentCulture, " WHERE {0} ", where.ToString());
\r
118 sql.Append(" ORDER BY rfr.rdb$relation_name, rfr.rdb$field_position");
\r
123 protected override DataTable ProcessResult(DataTable schema)
\r
125 schema.BeginLoadData();
\r
127 foreach (DataRow row in schema.Rows)
\r
129 int blrType = Convert.ToInt32(row["FIELD_TYPE"], CultureInfo.InvariantCulture);
\r
132 if (row["COLUMN_SUB_TYPE"] != System.DBNull.Value)
\r
134 subType = Convert.ToInt32(row["COLUMN_SUB_TYPE"], CultureInfo.InvariantCulture);
\r
138 if (row["NUMERIC_SCALE"] != System.DBNull.Value)
\r
140 scale = Convert.ToInt32(row["NUMERIC_SCALE"], CultureInfo.InvariantCulture);
\r
143 if (row["IS_NULLABLE"] == DBNull.Value)
\r
145 row["IS_NULLABLE"] = true;
\r
149 row["IS_NULLABLE"] = false;
\r
152 if (row["IS_ARRAY"] == DBNull.Value)
\r
154 row["IS_ARRAY"] = false;
\r
158 row["IS_ARRAY"] = true;
\r
161 FbDbType dbType = (FbDbType)TypeHelper.GetDbDataType(blrType, subType, scale);
\r
162 row["COLUMN_DATA_TYPE"] = TypeHelper.GetDataTypeName((DbDataType)dbType).ToLower(CultureInfo.CurrentCulture);
\r
164 if (dbType == FbDbType.Binary || dbType == FbDbType.Text)
\r
166 row["COLUMN_SIZE"] = Int32.MaxValue;
\r
169 if (dbType == FbDbType.Char || dbType == FbDbType.VarChar)
\r
171 row["COLUMN_SIZE"] = row["CHARACTER_LENGTH"];
\r
175 row["CHARACTER_OCTET_LENGTH"] = 0;
\r
178 if (row["NUMERIC_PRECISION"] == System.DBNull.Value &&
\r
179 (dbType == FbDbType.Decimal || dbType == FbDbType.Numeric))
\r
181 row["NUMERIC_PRECISION"] = row["COLUMN_SIZE"];
\r
184 row["NUMERIC_SCALE"] = (-1) * scale;
\r
186 string domainName = row["DOMAIN_NAME"].ToString();
\r
187 if (domainName != null && domainName.StartsWith("RDB$"))
\r
189 row["DOMAIN_NAME"] = null;
\r
193 schema.EndLoadData();
\r
194 schema.AcceptChanges();
\r
196 // Remove not more needed columns
\r
197 schema.Columns.Remove("FIELD_TYPE");
\r
198 schema.Columns.Remove("CHARACTER_LENGTH");
\r