Skip to content

Commit 53cd93b

Browse files
Ja bist du narrischJa bist du narrisch
authored andcommitted
Removed ChangeColumnInternal - replaced by RecreateTable - last remaining usage was removed
1 parent 0aee02f commit 53cd93b

File tree

6 files changed

+154
-53
lines changed

6 files changed

+154
-53
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Migrator.Framework;
2+
using NUnit.Framework;
3+
4+
namespace Migrator.Tests.Framework.ColumnProperties;
5+
6+
public class ColumnPropertyExtensionsTests
7+
{
8+
[Test]
9+
public void Clear()
10+
{
11+
// Arrange
12+
var columnProperty = ColumnProperty.PrimaryKey | ColumnProperty.Unique;
13+
14+
// Act
15+
columnProperty = columnProperty.Clear(ColumnProperty.PrimaryKey);
16+
17+
// Assert
18+
Assert.That(columnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.False);
19+
}
20+
}

src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProviderTests.cs

Lines changed: 95 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void CanParseColumnDefForNotNull()
3131
}
3232

3333
[Test]
34-
public void RemoveDefaultValue_Success()
34+
public void RemoveDefaultValue_Succeeds()
3535
{
3636
// Arrange
3737
var testTableName = "MyDefaultTestTable";
@@ -59,7 +59,7 @@ public void RemoveDefaultValue_Success()
5959
}
6060

6161
[Test]
62-
public void AddPrimaryKey_CompositePrimaryKey_Success()
62+
public void AddPrimaryKey_CompositePrimaryKey_Succeeds()
6363
{
6464
// Arrange
6565
var testTableName = "MyDefaultTestTable";
@@ -92,7 +92,7 @@ public void AddPrimaryKey_CompositePrimaryKey_Success()
9292
}
9393

9494
[Test]
95-
public void AddTable_AddingColumnPropertyUnique_AddsUniqe()
95+
public void AddPrimaryKey_HavingColumnPropertyUniqueAndIndex_RebuildSucceeds()
9696
{
9797
// Arrange
9898
var testTableName = "MyDefaultTestTable";
@@ -114,15 +114,107 @@ public void AddTable_AddingColumnPropertyUnique_AddsUniqe()
114114
((SQLiteTransformationProvider)_provider).AddPrimaryKey("MyPrimaryKeyName", testTableName, [propertyName1]);
115115

116116
// Assert
117+
using var command = _provider.GetCommand();
118+
using var reader = _provider.ExecuteQuery(command, $"SELECT COUNT(*) as Count from {testTableName}");
119+
reader.Read();
120+
var count = reader.GetInt32(reader.GetOrdinal("Count"));
121+
Assert.That(count, Is.EqualTo(1));
122+
117123
var tableInfoAfter = ((SQLiteTransformationProvider)_provider).GetSQLiteTableInfo(testTableName);
118124

119125
Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.False);
120126
Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.False);
127+
121128
Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True);
122129
Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.False);
123130

124131
var indexAfter = tableInfoAfter.Indexes.Single();
125132
Assert.That(indexAfter.Name, Is.EqualTo(indexName));
126133
CollectionAssert.AreEquivalent(indexAfter.KeyColumns, new string[] { propertyName1, propertyName2 });
127134
}
135+
136+
[Test]
137+
public void RemovePrimaryKey_HavingColumnPropertyUniqueAndIndex_RebuildSucceeds()
138+
{
139+
// Arrange
140+
var testTableName = "MyDefaultTestTable";
141+
var propertyName1 = "Color1";
142+
var propertyName2 = "Color2";
143+
var indexName = "MyIndexName";
144+
145+
_provider.AddTable(testTableName,
146+
new Column(propertyName1, DbType.Int32, ColumnProperty.PrimaryKey),
147+
new Column(propertyName2, DbType.Int32, ColumnProperty.Unique)
148+
);
149+
150+
_provider.AddIndex(indexName, testTableName, [propertyName1, propertyName2]);
151+
var tableInfoBefore = ((SQLiteTransformationProvider)_provider).GetSQLiteTableInfo(testTableName);
152+
153+
_provider.ExecuteNonQuery($"INSERT INTO {testTableName} ({propertyName1}, {propertyName2}) VALUES (1, 2)");
154+
155+
// Act
156+
((SQLiteTransformationProvider)_provider).RemovePrimaryKey(tableName: testTableName);
157+
158+
// Assert
159+
using var command = _provider.GetCommand();
160+
using var reader = _provider.ExecuteQuery(command, $"SELECT COUNT(*) as Count from {testTableName}");
161+
reader.Read();
162+
var count = reader.GetInt32(reader.GetOrdinal("Count"));
163+
Assert.That(count, Is.EqualTo(1));
164+
165+
var tableInfoAfter = ((SQLiteTransformationProvider)_provider).GetSQLiteTableInfo(testTableName);
166+
167+
Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True);
168+
Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Unique), Is.True);
169+
170+
Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.False);
171+
Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Unique), Is.True);
172+
173+
var indexAfter = tableInfoAfter.Indexes.Single();
174+
Assert.That(indexAfter.Name, Is.EqualTo(indexName));
175+
CollectionAssert.AreEquivalent(indexAfter.KeyColumns, new string[] { propertyName1, propertyName2 });
176+
}
177+
178+
[Test]
179+
public void RemoveAllIndexes_HavingIndexAndUnique_RebuildSucceeds()
180+
{
181+
// Arrange
182+
var testTableName = "MyDefaultTestTable";
183+
var propertyName1 = "Color1";
184+
var propertyName2 = "Color2";
185+
var indexName = "MyIndexName";
186+
187+
_provider.AddTable(testTableName,
188+
new Column(propertyName1, DbType.Int32, ColumnProperty.PrimaryKey),
189+
new Column(propertyName2, DbType.Int32)
190+
);
191+
192+
_provider.AddIndex(indexName, testTableName, [propertyName1, propertyName2]);
193+
_provider.AddUniqueConstraint("MyConstraint", testTableName, [propertyName1, propertyName2]);
194+
var tableInfoBefore = ((SQLiteTransformationProvider)_provider).GetSQLiteTableInfo(testTableName);
195+
196+
_provider.AddUniqueConstraint("MyUniqueConstraintName", testTableName, [propertyName1, propertyName2]);
197+
198+
_provider.ExecuteNonQuery($"INSERT INTO {testTableName} ({propertyName1}, {propertyName2}) VALUES (1, 2)");
199+
200+
// Act
201+
((SQLiteTransformationProvider)_provider).RemoveAllIndexes(tableName: testTableName);
202+
203+
// Assert
204+
using var command = _provider.GetCommand();
205+
using var reader = _provider.ExecuteQuery(command, $"SELECT COUNT(*) as Count from {testTableName}");
206+
reader.Read();
207+
var count = reader.GetInt32(reader.GetOrdinal("Count"));
208+
Assert.That(count, Is.EqualTo(1));
209+
210+
var tableInfoAfter = ((SQLiteTransformationProvider)_provider).GetSQLiteTableInfo(testTableName);
211+
212+
Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True);
213+
Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True);
214+
215+
Assert.That(tableInfoBefore.Uniques, Is.Not.Empty);
216+
Assert.That(tableInfoBefore.Indexes, Is.Not.Empty);
217+
Assert.That(tableInfoAfter.Uniques, Is.Empty);
218+
Assert.That(tableInfoAfter.Indexes, Is.Empty);
219+
}
128220
}

src/Migrator/Framework/ColumnProperty.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public enum ColumnProperty
4141
Unsigned = 32,
4242

4343
CaseSensitive = 64,
44+
4445
/// <summary>
4546
/// Foreign Key
4647
/// </summary>

src/Migrator/Providers/Impl/SQLite/SQLiteTransformationProvider.cs

Lines changed: 16 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -513,33 +513,6 @@ private void RecreateTable(SQLiteTableInfo sqliteTableInfo)
513513
}
514514
}
515515

516-
private void ChangeColumnInternal(string table, string[] old, IDbField[] columns)
517-
{
518-
var newColumns = GetColumns(table).Where(x => !old.Any(y => x.Name.Equals(y, StringComparison.InvariantCultureIgnoreCase))).ToList();
519-
var oldColumnNames = newColumns.Select(x => x.Name).ToList();
520-
newColumns.AddRange(columns.Where(x => x is Column).Cast<Column>());
521-
oldColumnNames.AddRange(old);
522-
523-
var newFieldsPlusUnique = newColumns.Cast<IDbField>().ToList();
524-
newFieldsPlusUnique.AddRange(columns.Where(x => x is Unique));
525-
526-
AddTable(table + "_temp", null, [.. newFieldsPlusUnique]);
527-
var colNamesNewSql = string.Join(", ", newColumns.Select(x => x.Name).Select(QuoteColumnNameIfRequired));
528-
var colNamesSql = string.Join(", ", oldColumnNames.Select(QuoteColumnNameIfRequired));
529-
530-
using (var cmd = CreateCommand())
531-
{
532-
ExecuteQuery(cmd, string.Format("INSERT INTO {1}_temp ({0}) SELECT {2} FROM {1}", colNamesNewSql, table, colNamesSql));
533-
}
534-
535-
RemoveTable(table);
536-
537-
using (var cmd = CreateCommand())
538-
{
539-
ExecuteQuery(cmd, string.Format("ALTER TABLE {0}_temp RENAME TO {0}", table));
540-
}
541-
}
542-
543516
public override void AddColumn(string table, Column column)
544517
{
545518
var backUp = column.ColumnProperty;
@@ -920,42 +893,40 @@ protected override string GetPrimaryKeyConstraintName(string table)
920893
throw new NotImplementedException();
921894
}
922895

923-
public override void RemovePrimaryKey(string table)
896+
public override void RemovePrimaryKey(string tableName)
924897
{
925-
if (!TableExists(table))
898+
if (!TableExists(tableName))
926899
{
927900
return;
928901
}
929902

930-
var columnDefs = GetColumns(table);
903+
var sqliteInfoTable = GetSQLiteTableInfo(tableName);
931904

932-
foreach (var columnDef in columnDefs.Where(columnDef => columnDef.IsPrimaryKey))
905+
foreach (var column in sqliteInfoTable.Columns)
933906
{
934-
columnDef.ColumnProperty = columnDef.ColumnProperty.Clear(ColumnProperty.PrimaryKey);
935-
columnDef.ColumnProperty = columnDef.ColumnProperty.Clear(ColumnProperty.PrimaryKeyWithIdentity);
907+
if (column.IsPrimaryKey)
908+
{
909+
column.ColumnProperty = column.ColumnProperty.Clear(ColumnProperty.PrimaryKey);
910+
column.ColumnProperty = column.ColumnProperty.Clear(ColumnProperty.PrimaryKeyWithIdentity);
911+
}
936912
}
937913

938-
ChangeColumnInternal(table, [.. columnDefs.Select(x => x.Name)], columnDefs);
914+
RecreateTable(sqliteInfoTable);
939915
}
940916

941-
public override void RemoveAllIndexes(string table)
917+
public override void RemoveAllIndexes(string tableName)
942918
{
943-
if (!TableExists(table))
919+
if (!TableExists(tableName))
944920
{
945921
return;
946922
}
947923

948-
var columnDefs = GetColumns(table);
924+
var sqliteInfoTable = GetSQLiteTableInfo(tableName);
949925

950-
foreach (var columnDef in columnDefs.Where(columnDef => columnDef.IsPrimaryKey))
951-
{
952-
columnDef.ColumnProperty = columnDef.ColumnProperty.Clear(ColumnProperty.PrimaryKey);
953-
columnDef.ColumnProperty = columnDef.ColumnProperty.Clear(ColumnProperty.PrimaryKeyWithIdentity);
954-
columnDef.ColumnProperty = columnDef.ColumnProperty.Clear(ColumnProperty.Unique);
955-
columnDef.ColumnProperty = columnDef.ColumnProperty.Clear(ColumnProperty.Indexed);
956-
}
926+
sqliteInfoTable.Uniques = [];
927+
sqliteInfoTable.Indexes = [];
957928

958-
ChangeColumnInternal(table, [.. columnDefs.Select(x => x.Name)], columnDefs);
929+
RecreateTable(sqliteInfoTable);
959930
}
960931

961932
public List<Unique> GetUniques(string tableName)

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,16 @@ FROM sys.[indexes] Ind
265265
Unique = reader.GetBoolean(4),
266266
UniqueConstraint = reader.GetBoolean(5),
267267
};
268-
if (!reader.IsDBNull(6)) idx.KeyColumns = (reader.GetString(6).Split(','));
269-
if (!reader.IsDBNull(7)) idx.IncludeColumns = (reader.GetString(7).Split(','));
268+
269+
if (!reader.IsDBNull(6))
270+
{
271+
idx.KeyColumns = (reader.GetString(6).Split(','));
272+
}
273+
if (!reader.IsDBNull(7))
274+
{
275+
idx.IncludeColumns = (reader.GetString(7).Split(','));
276+
}
277+
270278
retVal.Add(idx);
271279
}
272280
}

src/Migrator/Providers/TransformationProvider.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ public virtual ITransformationProvider this[string provider]
103103
get
104104
{
105105
if (null != provider && IsThisProvider(provider))
106+
{
106107
return this;
108+
}
107109

108110
return NoOpTransformationProvider.Instance;
109111
}
@@ -117,9 +119,9 @@ public virtual Index[] GetIndexes(string table)
117119
public virtual Column[] GetColumns(string table)
118120
{
119121
var columns = new List<Column>();
120-
using (IDbCommand cmd = CreateCommand())
122+
using (var cmd = CreateCommand())
121123
using (
122-
IDataReader reader =
124+
var reader =
123125
ExecuteQuery(
124126
cmd, String.Format("select COLUMN_NAME, IS_NULLABLE from INFORMATION_SCHEMA.COLUMNS where table_name = '{0}'", table)))
125127
{
@@ -1970,12 +1972,19 @@ public virtual void RemoveAllIndexes(string table)
19701972

19711973
foreach (var index in indexes)
19721974
{
1973-
if (index.Name == null || !IndexExists(table, index.Name)) continue;
1975+
if (index.Name == null || !IndexExists(table, index.Name))
1976+
{
1977+
continue;
1978+
}
19741979

19751980
if (index.PrimaryKey || index.UniqueConstraint)
1981+
{
19761982
RemoveConstraint(table, index.Name);
1983+
}
19771984
else
1985+
{
19781986
RemoveIndex(table, index.Name);
1987+
}
19791988
}
19801989
}
19811990

0 commit comments

Comments
 (0)