Skip to content

Commit 80884d0

Browse files
Ja bist du narrischJa bist du narrisch
authored andcommitted
Added more pragma requests
1 parent 2eac71b commit 80884d0

File tree

9 files changed

+245
-44
lines changed

9 files changed

+245
-44
lines changed

src/Migrator.Tests/ProviderFactoryTest.cs

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Configuration;
33
using System.Linq;
4-
using Migrator.Framework;
54
using Migrator.Providers;
65

76
using NUnit.Framework;
@@ -14,80 +13,74 @@ public class ProviderFactoryTest
1413
[Test]
1514
public void CanGetDialectsForProvider()
1615
{
17-
foreach (ProviderTypes provider in Enum.GetValues(typeof(ProviderTypes)).Cast<ProviderTypes>().Where(x => x != ProviderTypes.none))
16+
foreach (var provider in Enum.GetValues(typeof(ProviderTypes)).Cast<ProviderTypes>().Where(x => x != ProviderTypes.none))
1817
{
1918
Assert.That(ProviderFactory.DialectForProvider(provider), Is.Not.Null);
2019
}
20+
2121
Assert.That(ProviderFactory.DialectForProvider(ProviderTypes.none), Is.Null);
2222
}
2323

2424
[Test]
2525
[Category("MySql")]
2626
public void CanLoad_MySqlProvider()
2727
{
28-
ITransformationProvider provider = ProviderFactory.Create(ProviderTypes.Mysql,
29-
ConfigurationManager.AppSettings[
30-
"MySqlConnectionString"], null);
28+
using var provider = ProviderFactory.Create(ProviderTypes.Mysql, ConfigurationManager.AppSettings["MySqlConnectionString"], null);
29+
3130
Assert.That(provider, Is.Not.Null);
3231
}
3332

3433
[Test]
3534
[Category("Oracle")]
3635
public void CanLoad_OracleProvider()
3736
{
38-
ITransformationProvider provider = ProviderFactory.Create(ProviderTypes.Oracle,
39-
ConfigurationManager.AppSettings[
40-
"OracleConnectionString"], null);
37+
using var provider = ProviderFactory.Create(ProviderTypes.Oracle, ConfigurationManager.AppSettings["OracleConnectionString"], null);
38+
4139
Assert.That(provider, Is.Not.Null);
4240
}
4341

4442
[Test]
4543
[Category("Postgre")]
4644
public void CanLoad_PostgreSQLProvider()
4745
{
48-
ITransformationProvider provider = ProviderFactory.Create(ProviderTypes.PostgreSQL,
49-
ConfigurationManager.AppSettings[
50-
"NpgsqlConnectionString"], null);
46+
using var provider = ProviderFactory.Create(ProviderTypes.PostgreSQL, ConfigurationManager.AppSettings["NpgsqlConnectionString"], null);
47+
5148
Assert.That(provider, Is.Not.Null);
5249
}
5350

5451
[Test]
5552
[Category("SQLite")]
5653
public void CanLoad_SQLiteProvider()
5754
{
58-
ITransformationProvider provider = ProviderFactory.Create(ProviderTypes.SQLite,
59-
ConfigurationManager.AppSettings[
60-
"SQLiteConnectionString"], null);
55+
using var provider = ProviderFactory.Create(ProviderTypes.SQLite, ConfigurationManager.AppSettings["SQLiteConnectionString"], null);
56+
6157
Assert.That(provider, Is.Not.Null);
6258
}
6359

6460
[Test]
6561
[Category("SqlServer2005")]
6662
public void CanLoad_SqlServer2005Provider()
6763
{
68-
ITransformationProvider provider = ProviderFactory.Create(ProviderTypes.SqlServer2005,
69-
ConfigurationManager.AppSettings[
70-
"SqlServer2005ConnectionString"], null);
64+
using var provider = ProviderFactory.Create(ProviderTypes.SqlServer2005, ConfigurationManager.AppSettings["SqlServer2005ConnectionString"], null);
65+
7166
Assert.That(provider, Is.Not.Null);
7267
}
7368

7469
[Test]
7570
[Category("SqlServerCe")]
7671
public void CanLoad_SqlServerCeProvider()
7772
{
78-
ITransformationProvider provider = ProviderFactory.Create(ProviderTypes.SqlServerCe,
79-
ConfigurationManager.AppSettings[
80-
"SqlServerCeConnectionString"], null);
73+
using var provider = ProviderFactory.Create(ProviderTypes.SqlServerCe, ConfigurationManager.AppSettings["SqlServerCeConnectionString"], null);
74+
8175
Assert.That(provider, Is.Not.Null);
8276
}
8377

8478
[Test]
8579
[Category("SqlServer")]
8680
public void CanLoad_SqlServerProvider()
8781
{
88-
ITransformationProvider provider = ProviderFactory.Create(ProviderTypes.SqlServer,
89-
ConfigurationManager.AppSettings[
90-
"SqlServerConnectionString"], null);
82+
using var provider = ProviderFactory.Create(ProviderTypes.SqlServer, ConfigurationManager.AppSettings["SqlServerConnectionString"], null);
83+
9184
Assert.That(provider, Is.Not.Null);
9285
}
9386
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,8 @@ public void AddPrimaryKey_CompositePrimaryKey_Success()
9191
}
9292

9393
[Test]
94-
public void AddUnique_Success()
94+
public void AddTable_AddingColumnPropertyUnique_AddsUniqe()
9595
{
96-
// TODO
97-
9896
// Arrange
9997
var testTableName = "MyDefaultTestTable";
10098

@@ -104,7 +102,10 @@ public void AddUnique_Success()
104102

105103
var tableInfoBefore = ((SQLiteTransformationProvider)_provider).GetSQLiteTableInfo(testTableName);
106104

107-
// // Act
105+
// Act
106+
107+
// TODO In progress
108+
108109
// _provider.AddPrimaryKey("MyPrimaryKeyName", testTableName, "Id", "Color");
109110

110111
// // Assert
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using DotNetProjects.Migrator.Framework;
2+
using DotNetProjects.Migrator.Providers.Impl.SQLite;
3+
using Migrator.Framework;
4+
using Migrator.Tests.Providers.SQLite.Base;
5+
using NUnit.Framework;
6+
7+
namespace Migrator.Tests.Providers.SQLite;
8+
9+
[TestFixture]
10+
[Category("SQLite")]
11+
public class SQLiteTransformationProvider_GetColumnsTests : SQLiteTransformationProviderTestBase
12+
{
13+
[Test]
14+
public void CheckForeignKeyIntegrity_IntegrityViolated_ReturnsFalse()
15+
{
16+
const string tableName = "GetColumnsTest";
17+
18+
// Arrange
19+
_provider.AddTable(tableName, new Column("Id", System.Data.DbType.Int32, ColumnProperty.Unique));
20+
21+
// Act
22+
var columns = _provider.GetColumns(tableName);
23+
24+
// Assert
25+
26+
}
27+
}

src/Migrator/Framework/Unique.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
6-
namespace Migrator.Framework
1+
namespace Migrator.Framework
72
{
83
public class Unique : IDbField
94
{
105
public string Name { get; set; }
6+
117
public string[] KeyColumns { get; set; }
128
}
139
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
namespace DotNetProjects.Migrator.Providers.Impl.SQLite.Models;
2+
3+
public class PragmaIndexInfoItem
4+
{
5+
/// <summary>
6+
/// Gets or sets the sequence number of the column in the index (zero-based)
7+
/// </summary>
8+
public int SeqNo { get; set; }
9+
10+
/// <summary>
11+
/// Gets or sets the column ID. -1 if expression
12+
/// </summary>
13+
public int Cid { get; set; }
14+
15+
/// <summary>
16+
/// Gets or sets the name of the column (expression if no not column related)
17+
/// </summary>
18+
public string Name { get; set; }
19+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace DotNetProjects.Migrator.Providers.Impl.SQLite.Models;
2+
3+
public class PragmaIndexListItem
4+
{
5+
public int Seq { get; set; }
6+
7+
public string Name { get; set; }
8+
9+
public bool Unique { get; set; }
10+
11+
public string Origin { get; set; }
12+
13+
public bool Partial { get; set; }
14+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
namespace DotNetProjects.Migrator.Providers.Impl.SQLite.Models;
2+
3+
public class PragmaTableInfoItem
4+
{
5+
/// <summary>
6+
/// Gets or sets the column index (zero-based)
7+
/// </summary>
8+
public int Cid { get; set; }
9+
10+
/// <summary>
11+
/// Gets or sets the name of the column
12+
/// </summary>
13+
public string Name { get; set; }
14+
15+
/// <summary>
16+
/// Gets or sets the declared data type (INTEGER, TEXT, REAL etc.)
17+
/// </summary>
18+
public string Type { get; set; }
19+
20+
/// <summary>
21+
/// Gets or sets if is not null.
22+
/// </summary>
23+
public bool NotNull { get; set; }
24+
25+
/// <summary>
26+
/// Gets or sets the default value as SQL or NULL
27+
/// </summary>
28+
public string DfltValue { get; set; }
29+
30+
/// <summary>
31+
/// Gets or set the position in the primary key (1-based) 0 if not part of the primary key.
32+
/// </summary>
33+
public int Pk { get; set; }
34+
}

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

Lines changed: 112 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,8 @@ public SQLiteTableInfo GetSQLiteTableInfo(string tableName)
423423
TableNameMapping = new MappingInfo { OldName = tableName, NewName = tableName },
424424
Columns = GetColumns(tableName).ToList(),
425425
ForeignKeys = GetForeignKeyConstraints(tableName).ToList(),
426-
Indexes = GetIndexes(tableName).ToList()
426+
Indexes = GetIndexes(tableName).ToList(),
427+
Uniques = GetUniques(tableName).ToList()
427428
};
428429

429430
sqliteTable.ColumnMappings = sqliteTable.Columns
@@ -635,12 +636,15 @@ public override string[] GetTables()
635636
return [.. tables];
636637
}
637638

638-
public override Column[] GetColumns(string table)
639+
public override Column[] GetColumns(string tableName)
639640
{
641+
var pragmaTableInfoItems = GetPragmaTableInfoItems(tableName);
642+
643+
640644
var columns = new List<Column>();
641645

642646
using (var cmd = CreateCommand())
643-
using (var reader = ExecuteQuery(cmd, string.Format("PRAGMA table_info('{0}')", table)))
647+
using (var reader = ExecuteQuery(cmd, string.Format("PRAGMA table_info('{0}')", tableName)))
644648
{
645649
while (reader.Read())
646650
{
@@ -922,6 +926,111 @@ public override void RemoveAllIndexes(string table)
922926
ChangeColumnInternal(table, [.. columnDefs.Select(x => x.Name)], columnDefs);
923927
}
924928

929+
public List<Unique> GetUniques(string tableName)
930+
{
931+
List<Unique> uniques = [];
932+
933+
var pragmaIndexListItems = GetPragmaIndexListItems(tableName);
934+
935+
var uniqueConstraints = pragmaIndexListItems.Where(x => x.Unique && x.Origin == "u")
936+
.ToList();
937+
938+
foreach (var uniqueConstraint in uniqueConstraints)
939+
{
940+
var indexInfos = GetPragmaIndexInfo(uniqueConstraint.Name);
941+
942+
var columns = indexInfos.OrderBy(x => x.SeqNo)
943+
.Select(x => x.Name)
944+
.ToArray();
945+
946+
var unique = new Unique
947+
{
948+
Name = uniqueConstraint.Name,
949+
KeyColumns = columns
950+
};
951+
952+
uniques.Add(unique);
953+
}
954+
955+
return uniques;
956+
}
957+
958+
public List<PragmaIndexInfoItem> GetPragmaIndexInfo(string indexNameNotQuoted)
959+
{
960+
List<PragmaIndexInfoItem> pragmaIndexInfoItems = [];
961+
962+
var quotedIndexName = QuoteTableNameIfRequired(indexNameNotQuoted);
963+
964+
using (var cmd = CreateCommand())
965+
using (var reader = ExecuteQuery(cmd, $"PRAGMA index_info({quotedIndexName})"))
966+
{
967+
while (reader.Read())
968+
{
969+
var pragmaIndexInfoItem = new PragmaIndexInfoItem
970+
{
971+
SeqNo = reader.GetInt32(reader.GetOrdinal("seqno")),
972+
Cid = reader.GetInt32(reader.GetOrdinal("cid")),
973+
Name = reader.GetString(reader.GetOrdinal("name")),
974+
};
975+
976+
pragmaIndexInfoItems.Add(pragmaIndexInfoItem);
977+
}
978+
}
979+
980+
return pragmaIndexInfoItems;
981+
}
982+
983+
public List<PragmaIndexListItem> GetPragmaIndexListItems(string tableNameNotQuoted)
984+
{
985+
List<PragmaIndexListItem> pragmaIndexListItems = [];
986+
987+
using (var cmd = CreateCommand())
988+
using (var reader = ExecuteQuery(cmd, $"PRAGMA index_list({QuoteTableNameIfRequired(tableNameNotQuoted)})"))
989+
{
990+
while (reader.Read())
991+
{
992+
var pragmaIndexListItem = new PragmaIndexListItem
993+
{
994+
Seq = reader.GetInt32(reader.GetOrdinal("seq")),
995+
Name = reader.GetString(reader.GetOrdinal("name")),
996+
Unique = reader.GetInt32(reader.GetOrdinal("unique")) == 1,
997+
Origin = reader.GetString(reader.GetOrdinal("origin")),
998+
Partial = reader.GetInt32(reader.GetOrdinal("partial")) == 1
999+
};
1000+
1001+
pragmaIndexListItems.Add(pragmaIndexListItem);
1002+
}
1003+
}
1004+
1005+
return pragmaIndexListItems;
1006+
}
1007+
1008+
public List<PragmaTableInfoItem> GetPragmaTableInfoItems(string tableNameNotQuoted)
1009+
{
1010+
List<PragmaTableInfoItem> pragmaTableInfoItems = [];
1011+
1012+
using (var cmd = CreateCommand())
1013+
using (var reader = ExecuteQuery(cmd, $"PRAGMA table_info({QuoteTableNameIfRequired(tableNameNotQuoted)})"))
1014+
{
1015+
while (reader.Read())
1016+
{
1017+
var pragmaTableInfoItem = new PragmaTableInfoItem
1018+
{
1019+
Cid = reader.GetInt32(reader.GetOrdinal("cid")),
1020+
Name = reader.GetString(reader.GetOrdinal("name")),
1021+
Type = reader.GetString(reader.GetOrdinal("type")),
1022+
NotNull = reader.GetInt32(reader.GetOrdinal("notnull")) == 1,
1023+
DfltValue = reader.GetString(reader.GetOrdinal("dflt_value")),
1024+
Pk = reader.GetInt32(reader.GetOrdinal("pk")),
1025+
};
1026+
1027+
pragmaTableInfoItems.Add(pragmaTableInfoItem);
1028+
}
1029+
}
1030+
1031+
return pragmaTableInfoItems;
1032+
}
1033+
9251034
protected override void ConfigureParameterWithValue(IDbDataParameter parameter, int index, object value)
9261035
{
9271036
if (value is ushort)

0 commit comments

Comments
 (0)