Skip to content

Commit 94ad5ec

Browse files
JaBistDuNarrischJaBistDuNarrisch
authored andcommitted
Added interval default value set and parse
1 parent eb16975 commit 94ad5ec

File tree

3 files changed

+62
-15
lines changed

3 files changed

+62
-15
lines changed

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public void GetColumns_DefaultValues_Succeeds()
3232
const string stringColumnName1 = "stringcolumn1";
3333
const string binaryColumnName1 = "binarycolumn1";
3434
const string doubleColumnName1 = "doublecolumn1";
35+
const string intervalColumnName1 = "intervalcolumn1";
36+
const string intervalColumnName2 = "intervalcolumn2";
3537

3638
// Should be extended by remaining types
3739
Provider.AddTable(testTableName,
@@ -48,7 +50,9 @@ public void GetColumns_DefaultValues_Succeeds()
4850
new Column(int64ColumnName2, DbType.Int64, defaultValue: 0),
4951
new Column(stringColumnName1, DbType.String, defaultValue: "Hello"),
5052
new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }),
51-
new Column(doubleColumnName1, DbType.Double, defaultValue: 84.874596565)
53+
new Column(doubleColumnName1, DbType.Double, defaultValue: 84.874596565),
54+
new Column(intervalColumnName1, MigratorDbType.Interval, defaultValue: new TimeSpan(100000, 3, 4, 5, 666)),
55+
new Column(intervalColumnName2, MigratorDbType.Interval, defaultValue: new TimeSpan(0, 0, 0, 0, 666))
5256
);
5357

5458
// Act
@@ -66,6 +70,8 @@ public void GetColumns_DefaultValues_Succeeds()
6670
var stringColumn1 = columns.Single(x => x.Name == stringColumnName1);
6771
var binarycolumn1 = columns.Single(x => x.Name == binaryColumnName1);
6872
var doubleColumn1 = columns.Single(x => x.Name == doubleColumnName1);
73+
var intervalColumn1 = columns.Single(x => x.Name == intervalColumnName1);
74+
var intervalColumn2 = columns.Single(x => x.Name == intervalColumnName2);
6975

7076
Assert.That(dateTimeColumn1.DefaultValue, Is.EqualTo(dateTimeDefaultValue));
7177
Assert.That(dateTimeColumn2.DefaultValue, Is.EqualTo(dateTimeDefaultValue));
@@ -77,6 +83,8 @@ public void GetColumns_DefaultValues_Succeeds()
7783
Assert.That(stringColumn1.DefaultValue, Is.EqualTo("Hello"));
7884
Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 }));
7985
Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596565));
86+
Assert.That(intervalColumn1.DefaultValue, Is.EqualTo(new TimeSpan(100000, 3, 4, 5, 666)));
87+
Assert.That(intervalColumn2.DefaultValue, Is.EqualTo(new TimeSpan(0, 0, 0, 0, 666)));
8088
}
8189

8290
// 1 will coerce to true on inserts but not for default values in Postgre SQL - same for 0 to false
@@ -104,9 +112,6 @@ public void GetColumns_DefaultValues_Succeeds()
104112
public void GetColumns_DefaultValueBooleanValues_Succeeds(object inboundBooleanDefaultValue, bool outboundBooleanDefaultValue)
105113
{
106114
// Arrange
107-
var dateTimeDefaultValue = new DateTime(2000, 1, 2, 3, 4, 5, DateTimeKind.Utc);
108-
var guidDefaultValue = Guid.NewGuid();
109-
110115
const string testTableName = "MyDefaultTestTable";
111116
const string booleanColumnName1 = "booleancolumn1";
112117

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using DotNetProjects.Migrator.Framework;
2+
using System;
23
using System.Data;
34

45
namespace DotNetProjects.Migrator.Providers.Impl.PostgreSQL;
@@ -112,6 +113,18 @@ public override ITransformationProvider GetTransformationProvider(Dialect dialec
112113
return new PostgreSQLTransformationProvider(dialect, connection, defaultSchema, scope, providerName);
113114
}
114115

116+
public override string Default(object defaultValue)
117+
{
118+
if (defaultValue is TimeSpan timeSpan)
119+
{
120+
var intervalPostgreNotation = $"{(int)timeSpan.TotalHours:D2}:{timeSpan.Minutes:D2}:{timeSpan.Seconds:D2}.{timeSpan.Milliseconds:D3}";
121+
122+
return $"DEFAULT '{intervalPostgreNotation}'";
123+
}
124+
125+
return base.Default(defaultValue);
126+
}
127+
115128
//public override string SqlForProperty(ColumnProperty property, Column column)
116129
//{
117130
// if (property == ColumnProperty.Identity && (column.Type == DbType.Int64 || column.Type == DbType.UInt32 || column.Type == DbType.UInt64))

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

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -365,10 +365,6 @@ public override Column[] GetColumns(string table)
365365
{
366366
dbType = MigratorDbType.Time;
367367
}
368-
else if (dataTypeString == "interval")
369-
{
370-
throw new NotImplementedException();
371-
}
372368
else if (dataTypeString == "boolean")
373369
{
374370
dbType = MigratorDbType.Boolean;
@@ -415,6 +411,39 @@ public override Column[] GetColumns(string table)
415411
{
416412
column.DefaultValue = double.Parse(defaultValueString.ToString(), CultureInfo.InvariantCulture);
417413
}
414+
else if (column.MigratorDbType == MigratorDbType.Interval)
415+
{
416+
if (defaultValueString.StartsWith("'"))
417+
{
418+
var match = stripSingleQuoteRegEx.Match(defaultValueString);
419+
420+
if (!match.Success)
421+
{
422+
throw new Exception("Postgre default value for interval: Single quotes around the interval string are expected.");
423+
}
424+
425+
column.DefaultValue = match.Value;
426+
var splitted = match.Value.Split(':');
427+
if (splitted.Length != 3)
428+
{
429+
throw new NotImplementedException($"Cannot interpret {defaultValueString} in column '{column.Name}' unexpected pattern.");
430+
}
431+
432+
var hours = int.Parse(splitted[0], CultureInfo.InvariantCulture);
433+
var minutes = int.Parse(splitted[1], CultureInfo.InvariantCulture);
434+
var splitted2 = splitted[2].Split('.');
435+
var seconds = int.Parse(splitted2[0], CultureInfo.InvariantCulture);
436+
var milliseconds = int.Parse(splitted2[1], CultureInfo.InvariantCulture);
437+
438+
column.DefaultValue = new TimeSpan(0, hours, minutes, seconds, milliseconds);
439+
}
440+
else
441+
{
442+
// We assume that the value was added using this migrator so we do not interpret things like '2 days 01:02:03' if you
443+
// added such format you will run into this exception.
444+
throw new NotImplementedException($"Cannot interpret {defaultValueString} in column '{column.Name}' unexpected pattern.");
445+
}
446+
}
418447
else if (column.MigratorDbType == MigratorDbType.Boolean)
419448
{
420449
var truthy = new[] { "TRUE", "YES", "'true'", "on", "'on'", "t", "'t'" };
@@ -430,7 +459,7 @@ public override Column[] GetColumns(string table)
430459
}
431460
else
432461
{
433-
throw new NotImplementedException($"Cannot interpret the given default value in column '{column.Name}'");
462+
throw new NotImplementedException($"Cannot interpret {defaultValueString} in column '{column.Name}'");
434463
}
435464
}
436465
else if (column.MigratorDbType == MigratorDbType.DateTime || column.MigratorDbType == MigratorDbType.DateTime2)
@@ -441,7 +470,7 @@ public override Column[] GetColumns(string table)
441470

442471
if (!match.Success)
443472
{
444-
throw new Exception("Postgre default value for date time: Single quotes around the date time string are expected.");
473+
throw new NotImplementedException($"Cannot interpret {defaultValueString} in column '{column.Name}'");
445474
}
446475

447476
var timeString = match.Value;
@@ -453,7 +482,7 @@ public override Column[] GetColumns(string table)
453482
}
454483
else
455484
{
456-
throw new NotImplementedException();
485+
throw new NotImplementedException($"Cannot interpret {defaultValueString} in column '{column.Name}'");
457486
}
458487
}
459488
else if (column.MigratorDbType == MigratorDbType.Guid)
@@ -464,14 +493,14 @@ public override Column[] GetColumns(string table)
464493

465494
if (!match.Success)
466495
{
467-
throw new Exception("Postgre default value for uniqueidentifier: Single quotes around the Guid string are expected.");
496+
throw new NotImplementedException($"Cannot interpret {defaultValueString} in column '{column.Name}'");
468497
}
469498

470499
column.DefaultValue = Guid.Parse(match.Value);
471500
}
472501
else
473502
{
474-
throw new NotImplementedException();
503+
throw new NotImplementedException($"Cannot interpret {defaultValueString} in column '{column.Name}'");
475504
}
476505
}
477506
else if (column.MigratorDbType == MigratorDbType.Decimal)
@@ -504,7 +533,7 @@ public override Column[] GetColumns(string table)
504533

505534
if (!match.Success)
506535
{
507-
throw new Exception("Postgre default value for bytea: Single quotes around the bytea string are expected.");
536+
throw new NotImplementedException($"Cannot interpret {defaultValueString} in column '{column.Name}'");
508537
}
509538

510539
var singleQuoteString = match.Value;
@@ -524,7 +553,7 @@ public override Column[] GetColumns(string table)
524553
}
525554
else
526555
{
527-
throw new NotImplementedException();
556+
throw new NotImplementedException($"Cannot interpret {defaultValueString} in column '{column.Name}'");
528557
}
529558
}
530559
else

0 commit comments

Comments
 (0)