Skip to content

Commit 12561fc

Browse files
JaBistDuNarrischJaBistDuNarrisch
authored andcommitted
Added default value binary. Conversion from and to Postgre notation
1 parent adb0023 commit 12561fc

File tree

4 files changed

+46
-3
lines changed

4 files changed

+46
-3
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public void GetColumns_DataTypeResolveSucceeds()
2929
const string int32ColumnName1 = "int32column1";
3030
const string int64ColumnName1 = "int64column1";
3131
const string stringColumnName1 = "stringcolumn1";
32+
const string binaryColumnName1 = "binarycolumn1";
3233

3334
// Should be extended by remaining types
3435
Provider.AddTable(testTableName,
@@ -42,7 +43,8 @@ public void GetColumns_DataTypeResolveSucceeds()
4243

4344
new Column(int32ColumnName1, DbType.Int32, defaultValue: 43),
4445
new Column(int64ColumnName1, DbType.Int64, defaultValue: 88),
45-
new Column(stringColumnName1, DbType.String, defaultValue: "Hello")
46+
new Column(stringColumnName1, DbType.String, defaultValue: "Hello"),
47+
new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 })
4648
);
4749

4850
// Act
@@ -57,6 +59,7 @@ public void GetColumns_DataTypeResolveSucceeds()
5759
var int32Column1 = columns.Single(x => x.Name == int32ColumnName1);
5860
var int64Column1 = columns.Single(x => x.Name == int64ColumnName1);
5961
var stringColumn1 = columns.Single(x => x.Name == stringColumnName1);
62+
var binarycolumn1 = columns.Single(x => x.Name == binaryColumnName1);
6063

6164
Assert.That(dateTimeColumn1.DefaultValue, Is.EqualTo(dateTimeDefaultValue));
6265
Assert.That(dateTimeColumn2.DefaultValue, Is.EqualTo(dateTimeDefaultValue));
@@ -66,5 +69,6 @@ public void GetColumns_DataTypeResolveSucceeds()
6669
Assert.That(int32Column1.DefaultValue, Is.EqualTo(43));
6770
Assert.That(int64Column1.DefaultValue, Is.EqualTo(88));
6871
Assert.That(stringColumn1.DefaultValue, Is.EqualTo("Hello"));
72+
Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 }));
6973
}
7074
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public void GetColumns_DataTypeResolveSucceeds()
2323
const string int64ColumnName1 = "int64column1";
2424
const string stringColumnName1 = "stringcolumn1";
2525
const string stringColumnName2 = "stringcolumn2";
26-
const string byteColumnName = "bytecolumn";
26+
const string binaryColumnName1 = "binarycolumn";
2727

2828
// Should be extended by remaining types
2929
Provider.AddTable(testTableName,
@@ -35,7 +35,8 @@ public void GetColumns_DataTypeResolveSucceeds()
3535
new Column(int32ColumnName1, DbType.Int32),
3636
new Column(int64ColumnName1, DbType.Int64),
3737
new Column(stringColumnName1, DbType.String),
38-
new Column(stringColumnName2, DbType.String) { Size = 30 }
38+
new Column(stringColumnName2, DbType.String) { Size = 30 },
39+
new Column(binaryColumnName1, DbType.Binary)
3940
);
4041

4142
// Act
@@ -50,6 +51,7 @@ public void GetColumns_DataTypeResolveSucceeds()
5051
var int64column1 = columns.Single(x => x.Name == int64ColumnName1);
5152
var stringColumn1 = columns.Single(x => x.Name == stringColumnName1);
5253
var stringColumn2 = columns.Single(x => x.Name == stringColumnName2);
54+
var binaryColumn1 = columns.Single(x => x.Name == binaryColumnName1);
5355

5456

5557
// Assert
@@ -67,5 +69,6 @@ public void GetColumns_DataTypeResolveSucceeds()
6769
Assert.That(stringColumn1.Type, Is.EqualTo(DbType.String));
6870
Assert.That(stringColumn2.Type, Is.EqualTo(DbType.String));
6971
Assert.That(stringColumn2.Size, Is.EqualTo(30));
72+
Assert.That(binaryColumn1.Type, Is.EqualTo(DbType.Binary));
7073
}
7174
}

src/Migrator/Providers/Dialect.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,11 @@ public virtual string Default(object defaultValue)
363363
// .ToString("N") does not exist in old .NET version
364364
defaultValue = Convert.ToString(defaultValue, CultureInfo.InvariantCulture);
365365
}
366+
else if (defaultValue is byte[] byteArray)
367+
{
368+
var convertedString = BitConverter.ToString(byteArray).Replace("-", "").ToLower();
369+
defaultValue = $"'\\x{convertedString}'";
370+
}
366371

367372
return string.Format("DEFAULT {0}", defaultValue);
368373
}

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,37 @@ public override Column[] GetColumns(string table)
486486
throw new NotImplementedException();
487487
}
488488
}
489+
else if (column.Type == DbType.Binary)
490+
{
491+
if (defaultValueString.StartsWith("'"))
492+
{
493+
var match = stripSingleQuoteRegEx.Match(defaultValueString);
494+
495+
if (!match.Success)
496+
{
497+
throw new Exception("Postgre default value for bytea: Single quotes around the bytea string are expected.");
498+
}
499+
500+
var singleQuoteString = match.Value;
501+
502+
if (!singleQuoteString.StartsWith("\\x"))
503+
{
504+
throw new Exception(@"Postgre \x notation expected.");
505+
}
506+
507+
var hexString = singleQuoteString.Substring(2);
508+
509+
// Not available in old .NET version: Convert.FromHexString(hexString);
510+
511+
column.DefaultValue = Enumerable.Range(0, hexString.Length / 2)
512+
.Select(x => Convert.ToByte(hexString.Substring(x * 2, 2), 16))
513+
.ToArray();
514+
}
515+
else
516+
{
517+
throw new NotImplementedException();
518+
}
519+
}
489520
else
490521
{
491522
throw new NotImplementedException();

0 commit comments

Comments
 (0)