Skip to content

Commit 0060049

Browse files
JaBistDuNarrischJaBistDuNarrisch
authored andcommitted
Added default DateTime value resolution
1 parent 1499598 commit 0060049

File tree

3 files changed

+85
-56
lines changed

3 files changed

+85
-56
lines changed

src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumnsDefaultValueTests.cs

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Migrator.Tests.Providers.PostgreSQL;
88

99
[TestFixture]
1010
[Category("Postgre")]
11-
public class PostgreSQLTransformationProvider_GetColumnsDefaultValueTests : PostgreSQLTransformationProviderTestBase
11+
public class PostgreSQLTransformationProvider_GetColumnsDefaultTypeTests : PostgreSQLTransformationProviderTestBase
1212
{
1313
[Test]
1414
public void GetColumns_DataTypeResolveSucceeds()
@@ -25,46 +25,30 @@ public void GetColumns_DataTypeResolveSucceeds()
2525
const string stringColumnName1 = "stringcolumn1";
2626
const string stringColumnName2 = "stringcolumn2";
2727

28+
// Should be extended by remaining types
2829
Provider.AddTable(testTableName,
29-
new Column(dateTimeColumnName1, DbType.DateTime),
30-
new Column(dateTimeColumnName2, DbType.DateTime2),
31-
new Column(decimalColumnName1, DbType.Decimal),
32-
new Column(guidColumnName1, DbType.Guid),
33-
new Column(booleanColumnName1, DbType.Boolean),
34-
new Column(int32ColumnName1, DbType.Int32),
35-
new Column(int64ColumnName1, DbType.Int64),
36-
new Column(stringColumnName1, DbType.String),
37-
new Column(stringColumnName2, DbType.String) { Size = 30 }
30+
new Column(dateTimeColumnName1, DbType.DateTime, new DateTime(2000, 1, 2, 3, 4, 5, 6, DateTimeKind.Utc)),
31+
new Column(dateTimeColumnName2, DbType.DateTime2, new DateTime(2000, 1, 2, 3, 4, 5, 6, DateTimeKind.Utc))
32+
// new Column(decimalColumnName1, DbType.Decimal),
33+
// new Column(guidColumnName1, DbType.Guid),
34+
// new Column(booleanColumnName1, DbType.Boolean),
35+
// new Column(int32ColumnName1, DbType.Int32),
36+
// new Column(int64ColumnName1, DbType.Int64),
37+
// new Column(stringColumnName1, DbType.String),
38+
// new Column(stringColumnName2, DbType.String) { Size = 30 }
3839
);
3940

4041
// Act
4142
var columns = Provider.GetColumns(testTableName);
4243

4344
var dateTimeColumn1 = columns.Single(x => x.Name == dateTimeColumnName1);
44-
var dateTimeColumn2 = columns.Single(x => x.Name == dateTimeColumnName2);
45-
var decimalColumn1 = columns.Single(x => x.Name == decimalColumnName1);
46-
var guidColumn1 = columns.Single(x => x.Name == guidColumnName1);
47-
var booleanColumn1 = columns.Single(x => x.Name == booleanColumnName1);
48-
var int32Column1 = columns.Single(x => x.Name == int32ColumnName1);
49-
var int64column1 = columns.Single(x => x.Name == int64ColumnName1);
50-
var stringColumn1 = columns.Single(x => x.Name == stringColumnName1);
51-
var stringColumn2 = columns.Single(x => x.Name == stringColumnName2);
52-
53-
54-
// Assert
55-
Assert.That(dateTimeColumn1.Type, Is.EqualTo(DbType.DateTime));
56-
Assert.That(dateTimeColumn1.Precision, Is.EqualTo(3));
57-
Assert.That(dateTimeColumn2.Type, Is.EqualTo(DbType.DateTime2));
58-
Assert.That(dateTimeColumn2.Precision, Is.EqualTo(6));
59-
Assert.That(decimalColumn1.Type, Is.EqualTo(DbType.Decimal));
60-
Assert.That(decimalColumn1.Precision, Is.EqualTo(19));
61-
Assert.That(decimalColumn1.Scale, Is.EqualTo(5));
62-
Assert.That(guidColumn1.Type, Is.EqualTo(DbType.Guid));
63-
Assert.That(booleanColumn1.Type, Is.EqualTo(DbType.Boolean));
64-
Assert.That(int32Column1.Type, Is.EqualTo(DbType.Int32));
65-
Assert.That(int64column1.Type, Is.EqualTo(DbType.Int64));
66-
Assert.That(stringColumn1.Type, Is.EqualTo(DbType.String));
67-
Assert.That(stringColumn2.Type, Is.EqualTo(DbType.String));
68-
Assert.That(stringColumn2.Size, Is.EqualTo(30));
45+
// var dateTimeColumn2 = columns.Single(x => x.Name == dateTimeColumnName2);
46+
// var decimalColumn1 = columns.Single(x => x.Name == decimalColumnName1);
47+
// var guidColumn1 = columns.Single(x => x.Name == guidColumnName1);
48+
// var booleanColumn1 = columns.Single(x => x.Name == booleanColumnName1);
49+
// var int32Column1 = columns.Single(x => x.Name == int32ColumnName1);
50+
// var int64column1 = columns.Single(x => x.Name == int64ColumnName1);
51+
// var stringColumn1 = columns.Single(x => x.Name == stringColumnName1);
52+
// var stringColumn2 = columns.Single(x => x.Name == stringColumnName2);
6953
}
7054
}
Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using System.Data;
32
using System.Linq;
43
using DotNetProjects.Migrator.Framework;
@@ -8,24 +7,64 @@ namespace Migrator.Tests.Providers.PostgreSQL;
87

98
[TestFixture]
109
[Category("Postgre")]
11-
public class PostgreSQLTransformationProvider_GetColumnsTypeTests : PostgreSQLTransformationProviderTestBase
10+
public class PostgreSQLTransformationProvider_GetColumnTypeTests : PostgreSQLTransformationProviderTestBase
1211
{
1312
[Test]
14-
public void AddTableWithPrimaryKeyIdentity_Succeeds()
13+
public void GetColumns_DataTypeResolveSucceeds()
1514
{
1615
// Arrange
1716
const string testTableName = "MyDefaultTestTable";
18-
const string propertyName1 = "Color1";
19-
const string propertyName2 = "Color2";
17+
const string dateTimeColumnName1 = "datetimecolumn1";
18+
const string dateTimeColumnName2 = "datetimecolumn2";
19+
const string decimalColumnName1 = "decimalcolumn";
20+
const string guidColumnName1 = "guidcolumn1";
21+
const string booleanColumnName1 = "booleancolumn1";
22+
const string int32ColumnName1 = "int32column1";
23+
const string int64ColumnName1 = "int64column1";
24+
const string stringColumnName1 = "stringcolumn1";
25+
const string stringColumnName2 = "stringcolumn2";
2026

27+
// Should be extended by remaining types
2128
Provider.AddTable(testTableName,
22-
new Column(propertyName2, DbType.Decimal)
29+
new Column(dateTimeColumnName1, DbType.DateTime),
30+
new Column(dateTimeColumnName2, DbType.DateTime2),
31+
new Column(decimalColumnName1, DbType.Decimal),
32+
new Column(guidColumnName1, DbType.Guid),
33+
new Column(booleanColumnName1, DbType.Boolean),
34+
new Column(int32ColumnName1, DbType.Int32),
35+
new Column(int64ColumnName1, DbType.Int64),
36+
new Column(stringColumnName1, DbType.String),
37+
new Column(stringColumnName2, DbType.String) { Size = 30 }
2338
);
2439

2540
// Act
26-
var column = Provider.GetColumns(testTableName).Single(x => x.Name.Equals(propertyName1, StringComparison.OrdinalIgnoreCase));
27-
Provider.Insert(testTableName, [propertyName2], [3.448484]);
41+
var columns = Provider.GetColumns(testTableName);
2842

29-
throw new NotImplementedException();
43+
var dateTimeColumn1 = columns.Single(x => x.Name == dateTimeColumnName1);
44+
var dateTimeColumn2 = columns.Single(x => x.Name == dateTimeColumnName2);
45+
var decimalColumn1 = columns.Single(x => x.Name == decimalColumnName1);
46+
var guidColumn1 = columns.Single(x => x.Name == guidColumnName1);
47+
var booleanColumn1 = columns.Single(x => x.Name == booleanColumnName1);
48+
var int32Column1 = columns.Single(x => x.Name == int32ColumnName1);
49+
var int64column1 = columns.Single(x => x.Name == int64ColumnName1);
50+
var stringColumn1 = columns.Single(x => x.Name == stringColumnName1);
51+
var stringColumn2 = columns.Single(x => x.Name == stringColumnName2);
52+
53+
54+
// Assert
55+
Assert.That(dateTimeColumn1.Type, Is.EqualTo(DbType.DateTime));
56+
Assert.That(dateTimeColumn1.Precision, Is.EqualTo(3));
57+
Assert.That(dateTimeColumn2.Type, Is.EqualTo(DbType.DateTime2));
58+
Assert.That(dateTimeColumn2.Precision, Is.EqualTo(6));
59+
Assert.That(decimalColumn1.Type, Is.EqualTo(DbType.Decimal));
60+
Assert.That(decimalColumn1.Precision, Is.EqualTo(19));
61+
Assert.That(decimalColumn1.Scale, Is.EqualTo(5));
62+
Assert.That(guidColumn1.Type, Is.EqualTo(DbType.Guid));
63+
Assert.That(booleanColumn1.Type, Is.EqualTo(DbType.Boolean));
64+
Assert.That(int32Column1.Type, Is.EqualTo(DbType.Int32));
65+
Assert.That(int64column1.Type, Is.EqualTo(DbType.Int64));
66+
Assert.That(stringColumn1.Type, Is.EqualTo(DbType.String));
67+
Assert.That(stringColumn2.Type, Is.EqualTo(DbType.String));
68+
Assert.That(stringColumn2.Size, Is.EqualTo(30));
3069
}
3170
}

src/Migrator/Providers/Impl/PostgreSQL/PostgreSQLTransformationProvider.cs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using System.Globalization;
1919
using System.Linq;
2020
using System.Text;
21+
using System.Text.RegularExpressions;
2122
using Index = DotNetProjects.Migrator.Framework.Index;
2223

2324
namespace DotNetProjects.Migrator.Providers.Impl.PostgreSQL;
@@ -384,12 +385,7 @@ public override Column[] GetColumns(string table)
384385

385386
column.ColumnProperty |= isNullable ? ColumnProperty.Null : ColumnProperty.NotNull;
386387

387-
// if (defaultValueString != null && defaultValueString != DBNull.Value)
388-
// {
389-
// column.DefaultValue = defaultValueString;
390-
// }
391-
392-
if (column.DefaultValue != null)
388+
if (defaultValueString != null)
393389
{
394390
if (column.Type == DbType.Int16 || column.Type == DbType.Int32 || column.Type == DbType.Int64)
395391
{
@@ -409,16 +405,26 @@ public override Column[] GetColumns(string table)
409405
}
410406
else if (column.Type == DbType.DateTime || column.Type == DbType.DateTime2)
411407
{
412-
if (column.DefaultValue is string defVal)
408+
if (defaultValueString.StartsWith("'"))
413409
{
414-
var dt = defVal;
415-
if (defVal.StartsWith("'"))
410+
var regEx = new Regex("(?<=')[^']*(?=')");
411+
412+
var match = regEx.Match(defaultValueString);
413+
if (!match.Success)
416414
{
417-
dt = defVal.Substring(1, defVal.Length - 2);
415+
throw new Exception("Postgre default value for date time: We expected single quotes around the date time string.");
418416
}
419417

420-
var d = DateTime.ParseExact(dt, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
421-
column.DefaultValue = d;
418+
var timeString = match.Value;
419+
420+
// We convert to UTC since we restrict to UTC on default value definition.
421+
var dateTimeExtracted = DateTime.ParseExact(timeString, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
422+
423+
column.DefaultValue = dateTimeExtracted;
424+
}
425+
else
426+
{
427+
throw new NotImplementedException();
422428
}
423429
}
424430
else if (column.Type == DbType.Guid)

0 commit comments

Comments
 (0)