Skip to content

Commit 364bcb4

Browse files
JaBistDuNarrischJaBistDuNarrisch
authored andcommitted
Moved IndexItems to loader
1 parent 2adefe8 commit 364bcb4

File tree

5 files changed

+109
-99
lines changed

5 files changed

+109
-99
lines changed

src/Migrator/Providers/Impl/Oracle/Data/Interfaces/IOracleSystemDataLoader.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Collections.Generic;
22
using DotNetProjects.Migrator.Providers.Impl.Oracle.Models;
33
using DotNetProjects.Migrator.Providers.Models;
4+
using DotNetProjects.Migrator.Providers.Models.Indexes;
45

56
namespace DotNetProjects.Migrator.Providers.Impl.Oracle.Data.Interfaces;
67

@@ -26,4 +27,11 @@ public interface IOracleSystemDataLoader
2627
/// <param name="tableName"></param>
2728
/// <returns></returns>
2829
List<PrimaryKeyItem> GetPrimaryKeyItems(string tableName);
30+
31+
/// <summary>
32+
/// Gets index items from USER_INDEXES, USER_IND_COLUMNS and USER_CONSTRAINTS
33+
/// </summary>
34+
/// <param name="tableName"></param>
35+
/// <returns></returns>
36+
List<IndexItem> GetIndexItems(string tableName);
2937
}

src/Migrator/Providers/Impl/Oracle/Data/OracleSystemDataLoader.cs

Lines changed: 77 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using DotNetProjects.Migrator.Providers.Impl.Oracle.Interfaces;
55
using DotNetProjects.Migrator.Providers.Impl.Oracle.Models;
66
using DotNetProjects.Migrator.Providers.Models;
7+
using DotNetProjects.Migrator.Providers.Models.Indexes;
78

89
namespace DotNetProjects.Migrator.Providers.Impl.Oracle.Data;
910

@@ -95,22 +96,22 @@ public List<PrimaryKeyItem> GetPrimaryKeyItems(string tableName)
9596
var tableNameQuoted = _oracleTransformationProvider.QuoteTableNameIfRequired(tableName);
9697

9798
var sql = $@"
98-
SELECT
99-
ucc.TABLE_NAME,
100-
ucc.COLUMN_NAME,
101-
ucc.POSITION,
102-
uc.CONSTRAINT_NAME,
103-
uc.STATUS
104-
FROM
105-
USER_CONSTRAINTS uc
106-
JOIN
107-
USER_CONS_COLUMNS ucc
108-
ON uc.CONSTRAINT_NAME = ucc.CONSTRAINT_NAME
109-
WHERE
110-
uc.CONSTRAINT_TYPE = 'P'
111-
AND ucc.TABLE_NAME = '{tableNameQuoted.ToUpperInvariant()}'
112-
ORDER BY
113-
ucc.POSITION
99+
SELECT
100+
ucc.TABLE_NAME,
101+
ucc.COLUMN_NAME,
102+
ucc.POSITION,
103+
uc.CONSTRAINT_NAME,
104+
uc.STATUS
105+
FROM
106+
USER_CONSTRAINTS uc
107+
JOIN
108+
USER_CONS_COLUMNS ucc
109+
ON uc.CONSTRAINT_NAME = ucc.CONSTRAINT_NAME
110+
WHERE
111+
uc.CONSTRAINT_TYPE = 'P'
112+
AND ucc.TABLE_NAME = '{tableNameQuoted.ToUpperInvariant()}'
113+
ORDER BY
114+
ucc.POSITION
114115
";
115116

116117
List<PrimaryKeyItem> primaryKeyItems = [];
@@ -134,4 +135,64 @@ ORDER BY
134135

135136
return primaryKeyItems;
136137
}
138+
139+
public List<IndexItem> GetIndexItems(string tableName)
140+
{
141+
var tableNameQuoted = _oracleTransformationProvider.QuoteTableNameIfRequired(tableName);
142+
143+
var sql = @$"
144+
SELECT
145+
i.table_name,
146+
i.index_name,
147+
i.uniqueness,
148+
ic.column_position,
149+
ic.column_name,
150+
CASE WHEN c.constraint_type = 'P' THEN 'YES' ELSE 'NO' END AS is_primary_key,
151+
CASE WHEN c.constraint_type = 'U' THEN 'YES' ELSE 'NO' END AS is_unique_key
152+
FROM
153+
user_indexes i
154+
JOIN
155+
user_ind_columns ic ON i.index_name = ic.index_name AND
156+
i.table_name = ic.table_name
157+
LEFT JOIN
158+
user_constraints c ON i.index_name = c.index_name AND
159+
i.table_name = c.table_name
160+
WHERE
161+
UPPER(i.table_name) = '{tableNameQuoted.ToUpperInvariant()}'
162+
-- AND
163+
-- i.index_type = 'NORMAL'
164+
ORDER BY
165+
i.table_name, i.index_name, ic.column_position";
166+
167+
List<IndexItem> indexItems = [];
168+
169+
using var cmd = _oracleTransformationProvider.CreateCommand();
170+
using var reader = _oracleTransformationProvider.ExecuteQuery(cmd, sql);
171+
172+
while (reader.Read())
173+
{
174+
var tableNameOrdinal = reader.GetOrdinal("table_name");
175+
var indexNameOrdinal = reader.GetOrdinal("index_name");
176+
var uniquenessOrdinal = reader.GetOrdinal("uniqueness");
177+
var columnPositionOrdinal = reader.GetOrdinal("column_position");
178+
var columnNameOrdinal = reader.GetOrdinal("column_name");
179+
var isPrimaryKeyOrdinal = reader.GetOrdinal("is_primary_key");
180+
var isUniqueConstraintOrdinal = reader.GetOrdinal("is_unique_key");
181+
182+
var indexItem = new IndexItem
183+
{
184+
ColumnName = reader.GetString(columnNameOrdinal),
185+
ColumnOrder = reader.GetInt32(columnPositionOrdinal),
186+
Name = reader.GetString(indexNameOrdinal),
187+
PrimaryKey = reader.GetString(isPrimaryKeyOrdinal) == "YES",
188+
TableName = reader.GetString(tableNameOrdinal),
189+
Unique = reader.GetString(uniquenessOrdinal) == "UNIQUE",
190+
UniqueConstraint = reader.GetString(isUniqueConstraintOrdinal) == "YES"
191+
};
192+
193+
indexItems.Add(indexItem);
194+
}
195+
196+
return indexItems;
197+
}
137198
}

src/Migrator/Providers/Impl/Oracle/OracleTransformationProvider.cs

Lines changed: 12 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,11 @@ private void GuardAgainstMaximumIdentifierLengthForOracle(string name)
190190

191191
if (utf8Bytes.Length > 128)
192192
{
193-
throw new MigrationException($"The name '{name}' is {utf8Bytes.Length} bytes in length, but maximum length for Oracle identifiers is 128 bytes for Oracle versions 12.1+.");
193+
throw new MigrationException($"The name '{name}' is {utf8Bytes.Length} bytes in length, but maximum length for Oracle identifiers is 128 bytes for Oracle versions 12.1+.");
194194
}
195195
}
196196

197-
protected override string getPrimaryKeyname(string tableName)
197+
protected override string GetPrimaryKeyname(string tableName)
198198
{
199199
return tableName.Length > 27 ? "PK_" + tableName.Substring(0, 27) : "PK_" + tableName;
200200
}
@@ -301,16 +301,17 @@ public override void ChangeColumn(string table, string sqlColumn)
301301
{
302302
if (string.IsNullOrEmpty(table))
303303
{
304-
throw new ArgumentNullException("table");
304+
throw new ArgumentNullException(nameof(table));
305305
}
306306

307307
if (string.IsNullOrEmpty(table))
308308
{
309-
throw new ArgumentNullException("sqlColumn");
309+
throw new ArgumentNullException(nameof(sqlColumn));
310310
}
311311

312312
table = QuoteTableNameIfRequired(table);
313313
sqlColumn = QuoteColumnNameIfRequired(sqlColumn);
314+
314315
ExecuteNonQuery(string.Format("ALTER TABLE {0} MODIFY {1}", table, sqlColumn));
315316
}
316317

@@ -319,6 +320,7 @@ public override void AddColumn(string table, string sqlColumn)
319320
GuardAgainstMaximumIdentifierLengthForOracle(table);
320321
table = QuoteTableNameIfRequired(table);
321322
sqlColumn = QuoteColumnNameIfRequired(sqlColumn);
323+
322324
ExecuteNonQuery(string.Format("ALTER TABLE {0} ADD {1}", table, sqlColumn));
323325
}
324326

@@ -365,8 +367,10 @@ public override bool ConstraintExists(string table, string name)
365367
string.Format(
366368
"SELECT COUNT(constraint_name) FROM user_constraints WHERE lower(constraint_name) = '{0}' AND lower(table_name) = '{1}'",
367369
name.ToLower(), table.ToLower());
370+
368371
Logger.Log(sql);
369372
var scalar = ExecuteScalar(sql);
373+
370374
return Convert.ToInt32(scalar) == 1;
371375
}
372376

@@ -909,16 +913,18 @@ public override void AddTable(string name, params IDbField[] fields)
909913
public override void RemoveTable(string name)
910914
{
911915
base.RemoveTable(name);
916+
912917
try
913918
{
914919
using var cmd = CreateCommand();
915920
ExecuteQuery(cmd, string.Format(@"DROP SEQUENCE {0}_SEQUENCE", name));
916921
}
917922
catch (Exception)
918923
{
919-
// swallow this because sequence may not have originally existed.
924+
// swallow this because sequence may not have existed.
920925
}
921926
}
927+
922928
private void GuardAgainstMaximumColumnNameLengthForOracle(string name, Column[] columns)
923929
{
924930
foreach (var column in columns)
@@ -1016,58 +1022,7 @@ private string SchemaInfoTableName
10161022

10171023
public override Index[] GetIndexes(string table)
10181024
{
1019-
var sql = @$"SELECT
1020-
i.table_name,
1021-
i.index_name,
1022-
i.uniqueness,
1023-
ic.column_position,
1024-
ic.column_name,
1025-
CASE WHEN c.constraint_type = 'P' THEN 'YES' ELSE 'NO' END AS is_primary_key,
1026-
CASE WHEN c.constraint_type = 'U' THEN 'YES' ELSE 'NO' END AS is_unique_key
1027-
FROM
1028-
user_indexes i
1029-
JOIN
1030-
user_ind_columns ic ON i.index_name = ic.index_name AND
1031-
i.table_name = ic.table_name
1032-
LEFT JOIN
1033-
user_constraints c ON i.index_name = c.index_name AND
1034-
i.table_name = c.table_name
1035-
WHERE
1036-
UPPER(i.table_name) = '{table.ToUpperInvariant()}'
1037-
-- AND
1038-
-- i.index_type = 'NORMAL'
1039-
ORDER BY
1040-
i.table_name, i.index_name, ic.column_position";
1041-
1042-
List<IndexItem> indexItems = [];
1043-
1044-
using (var cmd = CreateCommand())
1045-
using (var reader = ExecuteQuery(cmd, sql))
1046-
{
1047-
while (reader.Read())
1048-
{
1049-
var tableNameOrdinal = reader.GetOrdinal("table_name");
1050-
var indexNameOrdinal = reader.GetOrdinal("index_name");
1051-
var uniquenessOrdinal = reader.GetOrdinal("uniqueness");
1052-
var columnPositionOrdinal = reader.GetOrdinal("column_position");
1053-
var columnNameOrdinal = reader.GetOrdinal("column_name");
1054-
var isPrimaryKeyOrdinal = reader.GetOrdinal("is_primary_key");
1055-
var isUniqueConstraintOrdinal = reader.GetOrdinal("is_unique_key");
1056-
1057-
var indexItem = new IndexItem
1058-
{
1059-
ColumnName = reader.GetString(columnNameOrdinal),
1060-
ColumnOrder = reader.GetInt32(columnPositionOrdinal),
1061-
Name = reader.GetString(indexNameOrdinal),
1062-
PrimaryKey = reader.GetString(isPrimaryKeyOrdinal) == "YES",
1063-
TableName = reader.GetString(tableNameOrdinal),
1064-
Unique = reader.GetString(uniquenessOrdinal) == "UNIQUE",
1065-
UniqueConstraint = reader.GetString(isUniqueConstraintOrdinal) == "YES"
1066-
};
1067-
1068-
indexItems.Add(indexItem);
1069-
}
1070-
}
1025+
var indexItems = _oracleSystemDataLoader.GetIndexItems(table);
10711026

10721027
var indexGroups = indexItems.GroupBy(x => new { x.SchemaName, x.TableName, x.Name });
10731028
List<Index> indexes = [];

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,12 @@ public override void ChangeColumn(string table, Column column)
361361

362362
var change1 = string.Format("{0} TYPE {1}", QuoteColumnNameIfRequired(mapper.Name), mapper.Type);
363363

364-
if ((oldColumn.MigratorDbType == MigratorDbType.Int16 || oldColumn.MigratorDbType == MigratorDbType.Int32 || oldColumn.MigratorDbType == MigratorDbType.Int64 || oldColumn.MigratorDbType == MigratorDbType.Decimal) && column.MigratorDbType == MigratorDbType.Boolean)
364+
if (
365+
(oldColumn.MigratorDbType == MigratorDbType.Int16 ||
366+
oldColumn.MigratorDbType == MigratorDbType.Int32 ||
367+
oldColumn.MigratorDbType == MigratorDbType.Int64 ||
368+
oldColumn.MigratorDbType == MigratorDbType.Decimal) &&
369+
column.MigratorDbType == MigratorDbType.Boolean)
365370
{
366371
change1 += string.Format(" USING CASE {0} WHEN 1 THEN true ELSE false END", QuoteColumnNameIfRequired(mapper.Name));
367372
}
@@ -370,7 +375,6 @@ public override void ChangeColumn(string table, Column column)
370375
change1 += string.Format(" USING CASE {0} WHEN '1' THEN true ELSE false END", QuoteColumnNameIfRequired(mapper.Name));
371376
}
372377

373-
374378
ChangeColumn(table, change1);
375379

376380
if (mapper.Default != null)
@@ -427,7 +431,7 @@ public override string[] GetTables()
427431
tables.Add((string)reader[0]);
428432
}
429433
}
430-
return tables.ToArray();
434+
return [.. tables];
431435
}
432436

433437
public override int GetColumnContentSize(string table, string columnName)
@@ -768,7 +772,7 @@ public override Column[] GetColumns(string table)
768772
}
769773
else
770774
{
771-
throw new NotImplementedException();
775+
throw new NotImplementedException($"{nameof(DbType)} {column.MigratorDbType} not implemented.");
772776
}
773777
}
774778

src/Migrator/Providers/TransformationProvider.cs

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,6 @@ public virtual void AddView(string name, string tableName, params IViewField[] f
328328
ExecuteNonQuery(sql);
329329
}
330330

331-
332331
public virtual void AddView(string name, string tableName, params IViewElement[] viewElements)
333332
{
334333
var selectedColumns = viewElements.Where(x => x is ViewColumn)
@@ -383,15 +382,6 @@ public virtual void AddView(string name, string tableName, params IViewElement[]
383382
/// </summary>
384383
/// <param name="name">Table name</param>
385384
/// <param name="columns">Columns</param>
386-
/// <example>
387-
/// Adds the Test table with two columns:
388-
/// <code>
389-
/// Database.AddTable("Test",
390-
/// new Column("Id", typeof(int), ColumnProperty.PrimaryKey),
391-
/// new Column("Title", typeof(string), 100)
392-
/// );
393-
/// </code>
394-
/// </example>
395385
public virtual void AddTable(string name, params IDbField[] columns)
396386
{
397387
if (this is not SQLiteTransformationProvider && columns.Any(x => x is CheckConstraint))
@@ -404,20 +394,11 @@ public virtual void AddTable(string name, params IDbField[] columns)
404394
}
405395

406396
/// <summary>
407-
/// Add a new table
397+
/// Adds a new table
408398
/// </summary>
409399
/// <param name="name">Table name</param>
410400
/// <param name="columns">Columns</param>
411401
/// <param name="engine">the database storage engine to use</param>
412-
/// <example>
413-
/// Adds the Test table with two columns:
414-
/// <code>
415-
/// Database.AddTable("Test", "INNODB",
416-
/// new Column("Id", typeof(int), ColumnProperty.PrimaryKey),
417-
/// new Column("Title", typeof(string), 100)
418-
/// );
419-
/// </code>
420-
/// </example>
421402
public virtual void AddTable(string name, string engine, params IDbField[] fields)
422403
{
423404
var columns = fields.Where(x => x is Column).Cast<Column>().ToArray();
@@ -441,11 +422,12 @@ public virtual void AddTable(string name, string engine, params IDbField[] field
441422
}
442423

443424
var columnsAndIndexes = JoinColumnsAndIndexes(columnProviders);
425+
444426
AddTable(name, engine, columnsAndIndexes);
445427

446428
if (compoundPrimaryKey)
447429
{
448-
AddPrimaryKey(getPrimaryKeyname(name), name, pks.ToArray());
430+
AddPrimaryKey(GetPrimaryKeyname(name), name, pks.ToArray());
449431
}
450432

451433
var indexes = fields.Where(x => x is Index).Cast<Index>().ToArray();
@@ -463,7 +445,7 @@ public virtual void AddTable(string name, string engine, params IDbField[] field
463445
}
464446
}
465447

466-
protected virtual string getPrimaryKeyname(string tableName)
448+
protected virtual string GetPrimaryKeyname(string tableName)
467449
{
468450
return "PK_" + tableName;
469451
}

0 commit comments

Comments
 (0)