Skip to content

Commit f676552

Browse files
JaBistDuNarrischJaBistDuNarrisch
authored andcommitted
Extended parser for SQL Server default values. Test is now green for SQL Server
1 parent a584a2c commit f676552

File tree

3 files changed

+56
-24
lines changed

3 files changed

+56
-24
lines changed

src/Migrator.Tests/Providers/Generic/TransformationProvider_GetColumns_GenericTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void GetColumns_DefaultValues_Succeeds()
4949
new Column(int64ColumnName2, DbType.Int64, defaultValue: 0),
5050
new Column(stringColumnName1, DbType.String, defaultValue: "Hello"),
5151
new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }),
52-
new Column(doubleColumnName1, DbType.Double, defaultValue: 84.874596565)
52+
new Column(doubleColumnName1, DbType.Double, defaultValue: 84.874596567)
5353
);
5454

5555
// Act
@@ -77,6 +77,6 @@ public void GetColumns_DefaultValues_Succeeds()
7777
Assert.That(int64Column1.DefaultValue, Is.EqualTo(88));
7878
Assert.That(stringColumn1.DefaultValue, Is.EqualTo("Hello"));
7979
Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 }));
80-
Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596565));
80+
Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596567));
8181
}
8282
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ public override Column[] GetColumns(string table)
562562

563563
if (!match.Success)
564564
{
565-
throw new NotImplementedException($"Cannot pars {defaultValueString} in column '{column.Name}'");
565+
throw new NotImplementedException($"Cannot parse {defaultValueString} in column '{column.Name}'");
566566
}
567567

568568
var singleQuoteString = match.Value;

src/Migrator/Providers/Impl/SqlServer/SqlServerTransformationProvider.cs

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,10 @@ public override Column[] GetColumns(string table)
377377
{
378378
column.MigratorDbType = MigratorDbType.Int32;
379379
}
380+
else if (dataTypeString == "bigint")
381+
{
382+
column.MigratorDbType = MigratorDbType.Int64;
383+
}
380384
else if (dataTypeString == "smallint")
381385
{
382386
column.MigratorDbType = MigratorDbType.Int16;
@@ -439,21 +443,42 @@ public override Column[] GetColumns(string table)
439443

440444
if (defaultValueString != null)
441445
{
446+
var bracesStrippedString = defaultValueString.Replace("(", "").Replace(")", "").Trim();
447+
var bracesAndSingleQuoteStrippedString = bracesStrippedString.Replace("'", "");
448+
442449
if (column.Type == DbType.Int16 || column.Type == DbType.Int32 || column.Type == DbType.Int64)
443450
{
444-
column.DefaultValue = long.Parse(column.DefaultValue.ToString());
451+
column.DefaultValue = long.Parse(bracesStrippedString, CultureInfo.InvariantCulture);
445452
}
446453
else if (column.Type == DbType.UInt16 || column.Type == DbType.UInt32 || column.Type == DbType.UInt64)
447454
{
448-
column.DefaultValue = ulong.Parse(column.DefaultValue.ToString());
455+
column.DefaultValue = ulong.Parse(bracesStrippedString, CultureInfo.InvariantCulture);
449456
}
450457
else if (column.Type == DbType.Double || column.Type == DbType.Single)
451458
{
452-
column.DefaultValue = double.Parse(column.DefaultValue.ToString());
459+
column.DefaultValue = double.Parse(bracesAndSingleQuoteStrippedString, CultureInfo.InvariantCulture);
453460
}
454461
else if (column.Type == DbType.Boolean)
455462
{
456-
column.DefaultValue = column.DefaultValue.ToString().Trim() == "1" || column.DefaultValue.ToString().Trim().ToUpper() == "TRUE" || column.DefaultValue.ToString().Trim() == "YES";
463+
var truthy = new string[] { "'TRUE'", "1" };
464+
var falsy = new string[] { "'FALSE'", "0" };
465+
466+
if (truthy.Contains(bracesStrippedString))
467+
{
468+
column.DefaultValue = true;
469+
}
470+
else if (falsy.Contains(bracesStrippedString))
471+
{
472+
column.DefaultValue = false;
473+
}
474+
else if (bracesStrippedString == "NULL")
475+
{
476+
column.DefaultValue = null;
477+
}
478+
else
479+
{
480+
throw new NotImplementedException($"Cannot parse the boolean default value '{defaultValueString}' of column '{column.Name}'");
481+
}
457482
}
458483
else if (column.Type == DbType.DateTime || column.Type == DbType.DateTime2)
459484
{
@@ -478,8 +503,7 @@ public override Column[] GetColumns(string table)
478503
}
479504

480505
// We convert to UTC since we restrict date time default values to UTC on default value definition.
481-
var d = DateTime.ParseExact(dt, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
482-
column.DefaultValue = d;
506+
column.DefaultValue = DateTime.ParseExact(dt, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
483507
}
484508
else
485509
{
@@ -488,29 +512,37 @@ public override Column[] GetColumns(string table)
488512
}
489513
else if (column.Type == DbType.Guid)
490514
{
491-
if (column.DefaultValue is string defVal)
492-
{
493-
var dt = defVal;
494-
495-
if (defVal.StartsWith("'"))
496-
{
497-
dt = defVal.Substring(1, defVal.Length - 2);
498-
}
499-
500-
var d = Guid.Parse(dt);
501-
column.DefaultValue = d;
502-
}
515+
column.DefaultValue = Guid.Parse(bracesAndSingleQuoteStrippedString);
503516
}
504517
else if (column.MigratorDbType == MigratorDbType.Decimal)
505518
{
506519
// We assume ((1.234))
507-
var decimalString = defaultValueString.Replace("(", "").Replace(")", "");
520+
column.DefaultValue = decimal.Parse(bracesStrippedString, CultureInfo.InvariantCulture);
521+
}
522+
else if (column.MigratorDbType == MigratorDbType.String)
523+
{
524+
column.DefaultValue = bracesAndSingleQuoteStrippedString;
525+
}
526+
else if (column.MigratorDbType == MigratorDbType.Binary)
527+
{
528+
if (bracesStrippedString.StartsWith("0x"))
529+
{
530+
var hexString = bracesStrippedString.Substring(2);
531+
532+
// Not available in old .NET version: Convert.FromHexString(hexString);
508533

509-
column.DefaultValue = decimal.Parse(decimalString, CultureInfo.InvariantCulture);
534+
column.DefaultValue = Enumerable.Range(0, hexString.Length / 2)
535+
.Select(x => Convert.ToByte(hexString.Substring(x * 2, 2), 16))
536+
.ToArray();
537+
}
538+
else
539+
{
540+
throw new NotImplementedException($"Cannot parse the binary default value of '{column.Name}'. The value is '{defaultValueString}'");
541+
}
510542
}
511543
else
512544
{
513-
throw new NotImplementedException($"Cannot parse the default value of {column.Name}. Type '' is not implemented yet.");
545+
throw new NotImplementedException($"Cannot parse the default value of {column.Name} type '{column.MigratorDbType}'. It is not yet implemented - file an issue.");
514546
}
515547
}
516548
if (!reader.IsDBNull(5))

0 commit comments

Comments
 (0)