diff --git a/src/Migrator.Tests/Providers/Generic/Generic_GetColumnsTestsBase.cs b/src/Migrator.Tests/Providers/Generic/Generic_GetColumnsTestsBase.cs new file mode 100644 index 00000000..e51a6a07 --- /dev/null +++ b/src/Migrator.Tests/Providers/Generic/Generic_GetColumnsTestsBase.cs @@ -0,0 +1,7 @@ +using Migrator.Tests.Providers.Base; + +namespace Migrator.Tests.Providers.Generic; + +public abstract class Generic_GetColumnsTestsBase : TransformationProviderBase +{ +} \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_GetColumns_Tests.cs b/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_GetColumns_Tests.cs index c3d90e60..fbc6fed7 100644 --- a/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_GetColumns_Tests.cs +++ b/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_GetColumns_Tests.cs @@ -3,14 +3,14 @@ using System.Linq; using System.Threading.Tasks; using DotNetProjects.Migrator.Framework; -using Migrator.Tests.Providers.Base; +using Migrator.Tests.Providers.Generic; using NUnit.Framework; namespace Migrator.Tests.Providers.OracleProvider; [TestFixture] [Category("Oracle")] -public class OracleTransformationProvider_GetColumns_Tests : TransformationProviderBase +public class OracleTransformationProvider_GetColumns_Tests : Generic_GetColumnsTestsBase { [SetUp] public async Task SetUpAsync() @@ -110,4 +110,33 @@ public void GetColumns_DefaultValues_Succeeds() Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596567)); } + + [Test] + public void GetColumns_GetIdentity_Succeeds() + { + // Arrange + var tableName1 = "Table1"; + var tableName2 = "Table2"; + var tableName3 = "Table3"; + var tableName4 = "Table4"; + var columnName1 = "ColumnName1"; + + Provider.ExecuteNonQuery($"CREATE TABLE {tableName1} ({columnName1} NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY)"); + Provider.ExecuteNonQuery($"CREATE TABLE {tableName2} ({columnName1} NUMBER PRIMARY KEY)"); + + Provider.AddTable(name: tableName3, new Column(columnName1, DbType.Int32, ColumnProperty.Identity | ColumnProperty.PrimaryKey)); + Provider.AddTable(name: tableName4, new Column(columnName1, DbType.Int32, ColumnProperty.PrimaryKey)); + + // Act + var columnTable1 = Provider.GetColumnByName(table: tableName1, column: columnName1); + var columnTable2 = Provider.GetColumnByName(table: tableName2, column: columnName1); + var columnTable3 = Provider.GetColumnByName(table: tableName3, column: columnName1); + var columnTable4 = Provider.GetColumnByName(table: tableName4, column: columnName1); + + // Assert + Assert.That(columnTable1.IsIdentity, Is.True); + Assert.That(columnTable2.IsIdentity, Is.False); + Assert.That(columnTable3.IsIdentity, Is.True); + Assert.That(columnTable4.IsIdentity, Is.False); + } } diff --git a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_ChangeColumnTests.cs b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_ChangeColumnTests.cs index 7aaa3227..7185210c 100644 --- a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_ChangeColumnTests.cs +++ b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_ChangeColumnTests.cs @@ -42,4 +42,66 @@ public void ChangeColumn_DateTimeOffsetToDateTime_Success() Assert.That(column2.MigratorDbType, Is.EqualTo(MigratorDbType.DateTime2)); Assert.That(column2.DefaultValue, Is.Null); } + + [Test] + public void ChangeColumn_DateTimeOffsetToDateTimeGetDefaultValueAndReuseIt_DefaultValueIsEqualAndValueIsEqual() + { + // Arrange + var tableName = "TableName"; + var column1Name = "Column1"; + var column2Name = "Column2"; + var dateTimeOffsetDefaultValue = new DateTimeOffset(2022, 2, 3, 4, 5, 6, TimeSpan.FromHours(2)); + var dateTimeOffsetInsert = new DateTimeOffset(2001, 2, 3, 4, 5, 6, TimeSpan.FromHours(2)); + + Provider.AddTable(tableName, + new Column(column1Name, DbType.Int32, ColumnProperty.Null), + new Column(column2Name, DbType.DateTimeOffset, ColumnProperty.Null, defaultValue: dateTimeOffsetDefaultValue) + ); + + Provider.Insert(table: tableName, columns: [column2Name], values: [dateTimeOffsetInsert]); + // Act + + var column2 = Provider.GetColumnByName(tableName, column2Name); + Assert.That(((DateTimeOffset)column2.DefaultValue).UtcDateTime, Is.EqualTo(dateTimeOffsetDefaultValue.UtcDateTime)); + Provider.ChangeColumn(tableName, new Column(column2Name, DbType.DateTime2, ColumnProperty.NotNull, defaultValue: column2.DefaultValue)); + + + // Assert + column2 = Provider.GetColumnByName(tableName, column2Name); + + // using var reader = Provider.Select(Provider.GetCommand(), what: column2Name, from: tableName); + // var valueFromDatabase = reader.GetDateTime(0); + + Assert.That(column2.MigratorDbType, Is.EqualTo(MigratorDbType.DateTime2)); + Assert.That(column2.DefaultValue, Is.EqualTo(dateTimeOffsetDefaultValue.UtcDateTime)); + } + + [Test] + public void GetColumns_GetIdentity_Succeeds() + { + // Arrange + var tableName1 = "Table1"; + var tableName2 = "Table2"; + var tableName3 = "Table3"; + var tableName4 = "Table4"; + var columnName1 = "ColumnName1"; + + Provider.ExecuteNonQuery($"CREATE TABLE {tableName1} ({columnName1} INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY)"); + Provider.ExecuteNonQuery($"CREATE TABLE {tableName2} ({columnName1} INT PRIMARY KEY)"); + + Provider.AddTable(name: tableName3, new Column(columnName1, DbType.Int32, ColumnProperty.Identity | ColumnProperty.PrimaryKey)); + Provider.AddTable(name: tableName4, new Column(columnName1, DbType.Int32, ColumnProperty.PrimaryKey)); + + // Act + var columnTable1 = Provider.GetColumnByName(table: tableName1, column: columnName1); + var columnTable2 = Provider.GetColumnByName(table: tableName2, column: columnName1); + var columnTable3 = Provider.GetColumnByName(table: tableName3, column: columnName1); + var columnTable4 = Provider.GetColumnByName(table: tableName4, column: columnName1); + + // Assert + Assert.That(columnTable1.IsIdentity, Is.True); + Assert.That(columnTable2.IsIdentity, Is.False); + Assert.That(columnTable3.IsIdentity, Is.True); + Assert.That(columnTable4.IsIdentity, Is.False); + } } diff --git a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumns_Tests.cs b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumns_Tests.cs index 92f8cb02..fe18719f 100644 --- a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumns_Tests.cs +++ b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumns_Tests.cs @@ -1,12 +1,12 @@ using System.Threading.Tasks; -using Migrator.Tests.Providers.Base; +using Migrator.Tests.Providers.Generic; using NUnit.Framework; namespace Migrator.Tests.Providers.PostgreSQL; [TestFixture] [Category("Postgre")] -public class PostgreSQLTransformationProvider_GetColumns_Tests : TransformationProviderBase +public class PostgreSQLTransformationProvider_GetColumns_Tests : Generic_GetColumnsTestsBase { [SetUp] public async Task SetUpAsync() diff --git a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_GetColumnsTests.cs b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_GetColumnsTests.cs index 191a7603..19204913 100644 --- a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_GetColumnsTests.cs +++ b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_GetColumnsTests.cs @@ -1,16 +1,47 @@ +using System.Data; using System.Threading.Tasks; -using Migrator.Tests.Providers.Base; +using DotNetProjects.Migrator.Framework; +using Migrator.Tests.Providers.Generic; using NUnit.Framework; namespace Migrator.Tests.Providers.SQLServer; [TestFixture] [Category("SqlServer")] -public class SQLServerTransformationProvider_GetColumnsTests : TransformationProviderBase +public class SQLServerTransformationProvider_GetColumnsTests : Generic_GetColumnsTestsBase { [SetUp] public async Task SetUpAsync() { await BeginSQLServerTransactionAsync(); } + + [Test] + public void GetColumns_GetIdentity_Succeeds() + { + // Arrange + var tableName1 = "Table1"; + var tableName2 = "Table2"; + var tableName3 = "Table3"; + var tableName4 = "Table4"; + var columnName1 = "ColumnName1"; + + Provider.ExecuteNonQuery($"CREATE TABLE {tableName1} ({columnName1} INT IDENTITY(1,1) PRIMARY KEY)"); + Provider.ExecuteNonQuery($"CREATE TABLE {tableName2} ({columnName1} INT PRIMARY KEY)"); + + Provider.AddTable(name: tableName3, new Column(columnName1, DbType.Int32, ColumnProperty.Identity | ColumnProperty.PrimaryKey)); + Provider.AddTable(name: tableName4, new Column(columnName1, DbType.Int32, ColumnProperty.PrimaryKey)); + + // Act + var columnTable1 = Provider.GetColumnByName(table: tableName1, column: columnName1); + var columnTable2 = Provider.GetColumnByName(table: tableName2, column: columnName1); + var columnTable3 = Provider.GetColumnByName(table: tableName3, column: columnName1); + var columnTable4 = Provider.GetColumnByName(table: tableName4, column: columnName1); + + // Assert + Assert.That(columnTable1.IsIdentity, Is.True); + Assert.That(columnTable2.IsIdentity, Is.False); + Assert.That(columnTable3.IsIdentity, Is.True); + Assert.That(columnTable4.IsIdentity, Is.False); + } } diff --git a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_GetColumnsTests.cs b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_GetColumnsTests.cs index f8e720ae..992e5a4c 100644 --- a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_GetColumnsTests.cs +++ b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_GetColumnsTests.cs @@ -3,14 +3,14 @@ using System.Threading.Tasks; using DotNetProjects.Migrator.Framework; using DotNetProjects.Migrator.Providers.Impl.SQLite; -using Migrator.Tests.Providers.Base; +using Migrator.Tests.Providers.Generic; using NUnit.Framework; namespace Migrator.Tests.Providers.SQLite; [TestFixture] [Category("SQLite")] -public class SQLiteTransformationProvider_GetColumnsTests : TransformationProviderBase +public class SQLiteTransformationProvider_GetColumnsTests : Generic_GetColumnsTestsBase { [SetUp] public async Task SetUpAsync() diff --git a/src/Migrator/Providers/Impl/PostgreSQL/PostgreSQLTransformationProvider.cs b/src/Migrator/Providers/Impl/PostgreSQL/PostgreSQLTransformationProvider.cs index 6af7bd9d..e0ff80b0 100644 --- a/src/Migrator/Providers/Impl/PostgreSQL/PostgreSQLTransformationProvider.cs +++ b/src/Migrator/Providers/Impl/PostgreSQL/PostgreSQLTransformationProvider.cs @@ -612,7 +612,10 @@ public override Column[] GetColumns(string table) { columnInfo.ColumnDefault = match.Value; } - column.DefaultValue = long.Parse(columnInfo.ColumnDefault.ToString()); + if (!columnInfo.ColumnDefault.Contains(table, StringComparison.OrdinalIgnoreCase)) + { + column.DefaultValue = long.Parse(columnInfo.ColumnDefault.ToString()); + } } else if (column.MigratorDbType == MigratorDbType.UInt16 || column.MigratorDbType == MigratorDbType.UInt32 || column.MigratorDbType == MigratorDbType.UInt64) { @@ -621,7 +624,10 @@ public override Column[] GetColumns(string table) { columnInfo.ColumnDefault = match.Value; } - column.DefaultValue = ulong.Parse(columnInfo.ColumnDefault.ToString()); + if (!columnInfo.ColumnDefault.Contains(table, StringComparison.OrdinalIgnoreCase)) + { + column.DefaultValue = ulong.Parse(columnInfo.ColumnDefault.ToString()); + } } else if (column.MigratorDbType == MigratorDbType.Double || column.MigratorDbType == MigratorDbType.Single) { @@ -630,7 +636,10 @@ public override Column[] GetColumns(string table) { columnInfo.ColumnDefault = match.Value; } - column.DefaultValue = double.Parse(columnInfo.ColumnDefault.ToString(), CultureInfo.InvariantCulture); + if (!columnInfo.ColumnDefault.Contains(table, StringComparison.OrdinalIgnoreCase)) + { + column.DefaultValue = double.Parse(columnInfo.ColumnDefault.ToString(), CultureInfo.InvariantCulture); + } } else if (column.MigratorDbType == MigratorDbType.Interval) { @@ -731,7 +740,10 @@ public override Column[] GetColumns(string table) { columnInfo.ColumnDefault = match.Value; } - column.DefaultValue = decimal.Parse(columnInfo.ColumnDefault, CultureInfo.InvariantCulture); + if (!columnInfo.ColumnDefault.Contains(table, StringComparison.OrdinalIgnoreCase)) + { + column.DefaultValue = decimal.Parse(columnInfo.ColumnDefault, CultureInfo.InvariantCulture); + } } else if (column.MigratorDbType == MigratorDbType.String) { diff --git a/src/Migrator/Providers/TransformationProvider.cs b/src/Migrator/Providers/TransformationProvider.cs index 8e836dba..e46ac8c9 100644 --- a/src/Migrator/Providers/TransformationProvider.cs +++ b/src/Migrator/Providers/TransformationProvider.cs @@ -2033,6 +2033,16 @@ protected virtual void ConfigureParameterWithValue(IDbDataParameter parameter, i parameter.DbType = DbType.DateTime; parameter.Value = value; } + else if (value is DateTimeOffset dateTimeOffset) + { + parameter.DbType = DbType.DateTimeOffset; + parameter.Value = dateTimeOffset.ToUniversalTime(); + } + else if (value is DateTimeOffset?) + { + parameter.DbType = DbType.DateTimeOffset; + parameter.Value = value == null ? null : ((DateTimeOffset?)value).Value.ToUniversalTime(); + } else if (value is bool || value is bool?) { parameter.DbType = DbType.Boolean;