Skip to content

Commit 746432e

Browse files
JaBistDuNarrischJaBistDuNarrisch
authored andcommitted
Adjustments for Postgre Guid and decimal default values
1 parent 0060049 commit 746432e

File tree

3 files changed

+44
-16
lines changed

3 files changed

+44
-16
lines changed

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

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,17 @@ namespace Migrator.Tests.Providers.PostgreSQL;
1010
[Category("Postgre")]
1111
public class PostgreSQLTransformationProvider_GetColumnsDefaultTypeTests : PostgreSQLTransformationProviderTestBase
1212
{
13+
private const decimal DecimalDefaultValue = 14.56565m;
14+
1315
[Test]
1416
public void GetColumns_DataTypeResolveSucceeds()
1517
{
1618
// Arrange
19+
var dateTimeDefaultValue = new DateTime(2000, 1, 2, 3, 4, 5, DateTimeKind.Utc);
20+
var guidDefaultValue = Guid.NewGuid();
21+
1722
const string testTableName = "MyDefaultTestTable";
23+
1824
const string dateTimeColumnName1 = "datetimecolumn1";
1925
const string dateTimeColumnName2 = "datetimecolumn2";
2026
const string decimalColumnName1 = "decimalcolumn";
@@ -27,10 +33,10 @@ public void GetColumns_DataTypeResolveSucceeds()
2733

2834
// Should be extended by remaining types
2935
Provider.AddTable(testTableName,
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),
36+
new Column(dateTimeColumnName1, DbType.DateTime, dateTimeDefaultValue),
37+
new Column(dateTimeColumnName2, DbType.DateTime2, dateTimeDefaultValue),
38+
new Column(decimalColumnName1, DbType.Decimal, DecimalDefaultValue),
39+
new Column(guidColumnName1, DbType.Guid, guidDefaultValue)
3440
// new Column(booleanColumnName1, DbType.Boolean),
3541
// new Column(int32ColumnName1, DbType.Int32),
3642
// new Column(int64ColumnName1, DbType.Int64),
@@ -41,14 +47,20 @@ public void GetColumns_DataTypeResolveSucceeds()
4147
// Act
4248
var columns = Provider.GetColumns(testTableName);
4349

50+
// Assert
4451
var dateTimeColumn1 = columns.Single(x => x.Name == dateTimeColumnName1);
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);
52+
var dateTimeColumn2 = columns.Single(x => x.Name == dateTimeColumnName2);
53+
var decimalColumn1 = columns.Single(x => x.Name == decimalColumnName1);
54+
var guidColumn1 = columns.Single(x => x.Name == guidColumnName1);
4855
// var booleanColumn1 = columns.Single(x => x.Name == booleanColumnName1);
4956
// var int32Column1 = columns.Single(x => x.Name == int32ColumnName1);
5057
// var int64column1 = columns.Single(x => x.Name == int64ColumnName1);
5158
// var stringColumn1 = columns.Single(x => x.Name == stringColumnName1);
5259
// var stringColumn2 = columns.Single(x => x.Name == stringColumnName2);
60+
61+
Assert.That(dateTimeColumn1.DefaultValue, Is.EqualTo(dateTimeDefaultValue));
62+
Assert.That(dateTimeColumn2.DefaultValue, Is.EqualTo(dateTimeDefaultValue));
63+
Assert.That(decimalColumn1.DefaultValue, Is.EqualTo(DecimalDefaultValue));
64+
Assert.That(guidColumn1.DefaultValue, Is.EqualTo(guidDefaultValue));
5365
}
5466
}

src/Migrator/Providers/Dialect.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Data;
4+
using System.Globalization;
45
using DotNetProjects.Migrator.Framework;
56

67
namespace DotNetProjects.Migrator.Providers;
@@ -344,7 +345,9 @@ public virtual string Default(object defaultValue)
344345
}
345346
else if (defaultValue is Guid)
346347
{
347-
return string.Format("DEFAULT '{0}'", defaultValue.ToString());
348+
var guidValue = string.Format("DEFAULT '{0}'", defaultValue.ToString());
349+
350+
return guidValue;
348351
}
349352
else if (defaultValue is DateTime)
350353
{
@@ -355,6 +358,11 @@ public virtual string Default(object defaultValue)
355358
defaultValue = ((string)defaultValue).Replace("'", "''");
356359
defaultValue = "'" + defaultValue + "'";
357360
}
361+
else if (defaultValue is decimal)
362+
{
363+
// .ToString("N") does not exist in old .NET version
364+
defaultValue = Convert.ToString(defaultValue, CultureInfo.InvariantCulture);
365+
}
358366

359367
return string.Format("DEFAULT {0}", defaultValue);
360368
}

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ namespace DotNetProjects.Migrator.Providers.Impl.PostgreSQL;
2828
/// </summary>
2929
public class PostgreSQLTransformationProvider : TransformationProvider
3030
{
31+
private Regex stripSingleQuoteRegEx = new("(?<=')[^']*(?=')");
32+
3133
public PostgreSQLTransformationProvider(Dialect dialect, string connectionString, string defaultSchema, string scope, string providerName)
3234
: base(dialect, connectionString, defaultSchema, scope)
3335
{
@@ -407,9 +409,8 @@ public override Column[] GetColumns(string table)
407409
{
408410
if (defaultValueString.StartsWith("'"))
409411
{
410-
var regEx = new Regex("(?<=')[^']*(?=')");
412+
var match = stripSingleQuoteRegEx.Match(defaultValueString);
411413

412-
var match = regEx.Match(defaultValueString);
413414
if (!match.Success)
414415
{
415416
throw new Exception("Postgre default value for date time: We expected single quotes around the date time string.");
@@ -429,18 +430,25 @@ public override Column[] GetColumns(string table)
429430
}
430431
else if (column.Type == DbType.Guid)
431432
{
432-
if (column.DefaultValue is string defVal)
433+
if (defaultValueString.StartsWith("'"))
433434
{
434-
var dt = defVal;
435+
var match = stripSingleQuoteRegEx.Match(defaultValueString);
435436

436-
if (defVal.StartsWith("'"))
437+
if (!match.Success)
437438
{
438-
dt = defVal.Substring(1, defVal.Length - 2);
439+
throw new Exception("Postgre default value for uniqueidentifier: We expected single quotes around the Guid string.");
439440
}
440441

441-
var d = Guid.Parse(dt);
442-
column.DefaultValue = d;
442+
column.DefaultValue = Guid.Parse(match.Value);
443443
}
444+
else
445+
{
446+
throw new NotImplementedException();
447+
}
448+
}
449+
else if (column.Type == DbType.Decimal)
450+
{
451+
column.DefaultValue = decimal.Parse(defaultValueString, CultureInfo.InvariantCulture);
444452
}
445453
}
446454

0 commit comments

Comments
 (0)