From c3e2f8ee09f86c0f9de9a18d4d3a63710f751255 Mon Sep 17 00:00:00 2001 From: Frans Bouma Date: Mon, 30 Nov 2020 16:36:28 +0100 Subject: [PATCH 1/4] Changes for DNET-784: schema update for identity Added a refactoring to FbSchema so the major version number is stored in the object. This then is used to conditionally configure the schema query for the Columns schema so it obtains rdb$relation_fields.rdb$identity_type. In the returned datatable a new column IS_IDENTITY is added, type bool, which is set to true if the identity_type field in the resultset is 1. --- .../Schema/FbColumns.cs | 23 +++++++++++++-- .../Schema/FbSchema.cs | 29 +++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs index d09d30455..6c9ea6834 100644 --- a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs +++ b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs @@ -35,7 +35,7 @@ protected override StringBuilder GetCommandText(string[] restrictions) var where = new StringBuilder(); sql.Append( - @"SELECT + @"SELECT null AS TABLE_CATALOG, null AS TABLE_SCHEMA, rfr.rdb$relation_name AS TABLE_NAME, @@ -64,7 +64,13 @@ protected override StringBuilder GetCommandText(string[] restrictions) null AS COLLATION_CATALOG, null AS COLLATION_SCHEMA, coll.rdb$collation_name AS COLLATION_NAME, - rfr.rdb$description AS DESCRIPTION + rfr.rdb$description AS DESCRIPTION"); + if(this.MajorVersionNumber >= 3) + { + sql.Append(@", + rfr.rdb$identity_type as IDENTITY_TYPE"); + } + sql.Append(@" FROM rdb$relation_fields rfr LEFT JOIN rdb$fields fld ON rfr.rdb$field_source = fld.rdb$field_name LEFT JOIN rdb$character_sets cs ON cs.rdb$character_set_id = fld.rdb$character_set_id @@ -117,6 +123,10 @@ protected override DataTable ProcessResult(DataTable schema) schema.BeginLoadData(); schema.Columns.Add("IS_NULLABLE", typeof(bool)); schema.Columns.Add("IS_ARRAY", typeof(bool)); + if(this.MajorVersionNumber >= 3) + { + schema.Columns.Add("IS_IDENTITY", typeof(bool)); + } foreach (DataRow row in schema.Rows) { @@ -175,6 +185,11 @@ protected override DataTable ProcessResult(DataTable schema) { row["DOMAIN_NAME"] = null; } + + if(this.MajorVersionNumber >= 3) + { + row["IS_IDENTITY"] = Convert.ToInt32(row["IDENTITY_TYPE"]) == 1; + } } schema.EndLoadData(); @@ -185,6 +200,10 @@ protected override DataTable ProcessResult(DataTable schema) schema.Columns.Remove("COLUMN_ARRAY"); schema.Columns.Remove("FIELD_TYPE"); schema.Columns.Remove("CHARACTER_MAX_LENGTH"); + if(this.MajorVersionNumber >= 3) + { + schema.Columns.Remove("IDENTITY_TYPE"); + } return schema; } diff --git a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs index 0c0034ac0..fb6ea5244 100644 --- a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs +++ b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs @@ -35,6 +35,7 @@ internal abstract class FbSchema public FbSchema() { + this.MajorVersionNumber = 0; } #endregion @@ -74,6 +75,7 @@ public DataTable GetSchema(FbConnection connection, string collectionName, strin protected FbCommand BuildCommand(FbConnection connection, string collectionName, string[] restrictions) { + SetMajorVersionNumber(connection); var filter = string.Format("CollectionName='{0}'", collectionName); var builder = GetCommandText(restrictions); var restriction = connection.GetSchema(DbMetaDataCollectionNames.Restrictions).Select(filter); @@ -103,6 +105,7 @@ protected FbCommand BuildCommand(FbConnection connection, string collectionName, return command; } + protected virtual DataTable ProcessResult(DataTable schema) { return schema; @@ -115,6 +118,25 @@ protected virtual string[] ParseRestrictions(string[] restrictions) #endregion + #region Private Methods + /// + /// Determines the major version number from the Serverversion on the inner connection. + /// + /// an open connection, which is used to determine the version number of the connected database server + private void SetMajorVersionNumber(FbConnection connection) + { + var versionAsString = connection?.InnerConnection?.Database?.ServerVersion ?? string.Empty; + if(string.IsNullOrEmpty(versionAsString)) + { + return; + } + + var fragments = versionAsString.Split('.'); + this.MajorVersionNumber = Convert.ToInt32(fragments[0]); + } + #endregion + + #region Private Static Methods private static void TrimStringFields(DataTable schema) @@ -138,5 +160,12 @@ private static void TrimStringFields(DataTable schema) } #endregion + + #region Properties + /// + /// The major version of the connected Firebird server + /// + protected int MajorVersionNumber { get; set; } + #endregion } } From bfc22f6a9fd7e596b0c71cdc124bcf5941e76a65 Mon Sep 17 00:00:00 2001 From: Frans Bouma Date: Tue, 1 Dec 2020 20:44:39 +0100 Subject: [PATCH 2/4] Requested changes for #7 --- .../Schema/FbColumns.cs | 12 ++++++------ .../Schema/FbSchema.cs | 15 +++++---------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs index 6c9ea6834..5b1801d8c 100644 --- a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs +++ b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs @@ -35,7 +35,7 @@ protected override StringBuilder GetCommandText(string[] restrictions) var where = new StringBuilder(); sql.Append( - @"SELECT + @"SELECT null AS TABLE_CATALOG, null AS TABLE_SCHEMA, rfr.rdb$relation_name AS TABLE_NAME, @@ -65,7 +65,7 @@ protected override StringBuilder GetCommandText(string[] restrictions) null AS COLLATION_SCHEMA, coll.rdb$collation_name AS COLLATION_NAME, rfr.rdb$description AS DESCRIPTION"); - if(this.MajorVersionNumber >= 3) + if (MajorVersionNumber >= 3) { sql.Append(@", rfr.rdb$identity_type as IDENTITY_TYPE"); @@ -123,7 +123,7 @@ protected override DataTable ProcessResult(DataTable schema) schema.BeginLoadData(); schema.Columns.Add("IS_NULLABLE", typeof(bool)); schema.Columns.Add("IS_ARRAY", typeof(bool)); - if(this.MajorVersionNumber >= 3) + if(MajorVersionNumber >= 3) { schema.Columns.Add("IS_IDENTITY", typeof(bool)); } @@ -186,9 +186,9 @@ protected override DataTable ProcessResult(DataTable schema) row["DOMAIN_NAME"] = null; } - if(this.MajorVersionNumber >= 3) + if (MajorVersionNumber >= 3) { - row["IS_IDENTITY"] = Convert.ToInt32(row["IDENTITY_TYPE"]) == 1; + row["IS_IDENTITY"] = (row["IDENTITY_TYPE"] != DBNull.Value); } } @@ -200,7 +200,7 @@ protected override DataTable ProcessResult(DataTable schema) schema.Columns.Remove("COLUMN_ARRAY"); schema.Columns.Remove("FIELD_TYPE"); schema.Columns.Remove("CHARACTER_MAX_LENGTH"); - if(this.MajorVersionNumber >= 3) + if (MajorVersionNumber >= 3) { schema.Columns.Remove("IDENTITY_TYPE"); } diff --git a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs index fb6ea5244..03a319fc2 100644 --- a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs +++ b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs @@ -24,6 +24,7 @@ using FirebirdSql.Data.FirebirdClient; using FirebirdSql.Data.Common; +using FirebirdSql.Data.Services; namespace FirebirdSql.Data.Schema { @@ -35,7 +36,7 @@ internal abstract class FbSchema public FbSchema() { - this.MajorVersionNumber = 0; + MajorVersionNumber = 0; } #endregion @@ -125,14 +126,8 @@ protected virtual string[] ParseRestrictions(string[] restrictions) /// an open connection, which is used to determine the version number of the connected database server private void SetMajorVersionNumber(FbConnection connection) { - var versionAsString = connection?.InnerConnection?.Database?.ServerVersion ?? string.Empty; - if(string.IsNullOrEmpty(versionAsString)) - { - return; - } - - var fragments = versionAsString.Split('.'); - this.MajorVersionNumber = Convert.ToInt32(fragments[0]); + var serverVersion = FbServerProperties.ParseServerVersion(connection.ServerVersion); + MajorVersionNumber = serverVersion.Major; } #endregion @@ -165,7 +160,7 @@ private static void TrimStringFields(DataTable schema) /// /// The major version of the connected Firebird server /// - protected int MajorVersionNumber { get; set; } + protected int MajorVersionNumber { get; private set; } #endregion } } From 66e1fd8bd617ee62aaa864c2b830ac0306d642b7 Mon Sep 17 00:00:00 2001 From: Frans Bouma Date: Tue, 1 Dec 2020 20:59:32 +0100 Subject: [PATCH 3/4] Requested changes for #7 --- .../src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs | 4 ++-- .../src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs index 5b1801d8c..3e253b6b6 100644 --- a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs +++ b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbColumns.cs @@ -35,7 +35,7 @@ protected override StringBuilder GetCommandText(string[] restrictions) var where = new StringBuilder(); sql.Append( - @"SELECT + @"SELECT null AS TABLE_CATALOG, null AS TABLE_SCHEMA, rfr.rdb$relation_name AS TABLE_NAME, @@ -123,7 +123,7 @@ protected override DataTable ProcessResult(DataTable schema) schema.BeginLoadData(); schema.Columns.Add("IS_NULLABLE", typeof(bool)); schema.Columns.Add("IS_ARRAY", typeof(bool)); - if(MajorVersionNumber >= 3) + if (MajorVersionNumber >= 3) { schema.Columns.Add("IS_IDENTITY", typeof(bool)); } diff --git a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs index 03a319fc2..14042de68 100644 --- a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs +++ b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs @@ -36,7 +36,6 @@ internal abstract class FbSchema public FbSchema() { - MajorVersionNumber = 0; } #endregion From 29e944f8bc6b07729849732971c01007b44b353d Mon Sep 17 00:00:00 2001 From: Frans Bouma Date: Tue, 1 Dec 2020 21:06:12 +0100 Subject: [PATCH 4/4] Removed ctor from fbschema #7 --- .../FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs index 14042de68..baeafad26 100644 --- a/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs +++ b/Provider/src/FirebirdSql.Data.FirebirdClient/Schema/FbSchema.cs @@ -32,14 +32,6 @@ namespace FirebirdSql.Data.Schema internal abstract class FbSchema { - #region Constructors - - public FbSchema() - { - } - - #endregion - #region Abstract Methods protected abstract StringBuilder GetCommandText(string[] restrictions);