2018-01-15 17:32:45 +01:00
using System.Collections.Generic ;
using System.Linq ;
using Umbraco.Core.Persistence.DatabaseModelDefinitions ;
2018-03-28 12:50:15 +11:00
using Umbraco.Core.Persistence.SqlSyntax ;
2018-01-15 17:32:45 +01:00
namespace Umbraco.Core.Migrations
{
/// <summary>
/// Provides a base class to all migrations.
/// </summary>
public abstract partial class MigrationBase
{
// provides extra methods for migrations
2018-03-28 12:40:52 +02:00
protected void AddColumn < T > ( string columnName )
{
var table = DefinitionFactory . GetTableDefinition ( typeof ( T ) , SqlSyntax ) ;
AddColumn ( table , table . Name , columnName ) ;
}
2018-10-23 15:04:41 +02:00
protected void AddColumnIfNotExists < T > ( IEnumerable < ColumnInfo > columns , string columnName )
{
var table = DefinitionFactory . GetTableDefinition ( typeof ( T ) , SqlSyntax ) ;
if ( columns . Any ( x = > x . TableName . InvariantEquals ( table . Name ) & & ! x . ColumnName . InvariantEquals ( columnName ) ) )
AddColumn ( table , table . Name , columnName ) ;
}
2018-01-15 17:32:45 +01:00
protected void AddColumn < T > ( string tableName , string columnName )
2018-03-28 12:40:52 +02:00
{
var table = DefinitionFactory . GetTableDefinition ( typeof ( T ) , SqlSyntax ) ;
AddColumn ( table , tableName , columnName ) ;
}
2018-10-23 15:04:41 +02:00
protected void AddColumnIfNotExists < T > ( IEnumerable < ColumnInfo > columns , string tableName , string columnName )
{
var table = DefinitionFactory . GetTableDefinition ( typeof ( T ) , SqlSyntax ) ;
if ( columns . Any ( x = > x . TableName . InvariantEquals ( tableName ) & & ! x . ColumnName . InvariantEquals ( columnName ) ) )
AddColumn ( table , tableName , columnName ) ;
}
2018-03-28 12:40:52 +02:00
private void AddColumn ( TableDefinition table , string tableName , string columnName )
2018-01-15 17:32:45 +01:00
{
2018-03-28 12:50:15 +11:00
if ( ColumnExists ( tableName , columnName ) ) return ;
2018-01-26 17:55:20 +01:00
var column = table . Columns . First ( x = > x . Name = = columnName ) ;
var createSql = SqlSyntax . Format ( column ) ;
2018-03-28 12:50:15 +11:00
2018-03-28 12:40:52 +02:00
Execute . Sql ( string . Format ( SqlSyntax . AddColumn , SqlSyntax . GetQuotedTableName ( tableName ) , createSql ) ) . Do ( ) ;
}
protected void AddColumn < T > ( string columnName , out IEnumerable < string > sqls )
{
var table = DefinitionFactory . GetTableDefinition ( typeof ( T ) , SqlSyntax ) ;
AddColumn ( table , table . Name , columnName , out sqls ) ;
2018-01-15 17:32:45 +01:00
}
protected void AddColumn < T > ( string tableName , string columnName , out IEnumerable < string > sqls )
2018-03-28 12:40:52 +02:00
{
var table = DefinitionFactory . GetTableDefinition ( typeof ( T ) , SqlSyntax ) ;
AddColumn ( table , tableName , columnName , out sqls ) ;
}
private void AddColumn ( TableDefinition table , string tableName , string columnName , out IEnumerable < string > sqls )
2018-01-15 17:32:45 +01:00
{
2018-03-28 12:50:15 +11:00
if ( ColumnExists ( tableName , columnName ) )
{
sqls = Enumerable . Empty < string > ( ) ;
return ;
}
2018-01-15 17:32:45 +01:00
var column = table . Columns . First ( x = > x . Name = = columnName ) ;
var createSql = SqlSyntax . Format ( column , SqlSyntax . GetQuotedTableName ( tableName ) , out sqls ) ;
2018-03-28 12:50:15 +11:00
Execute . Sql ( string . Format ( SqlSyntax . AddColumn , SqlSyntax . GetQuotedTableName ( tableName ) , createSql ) ) . Do ( ) ;
2018-01-15 17:32:45 +01:00
}
2018-02-01 14:14:45 +01:00
protected void AlterColumn < T > ( string tableName , string columnName )
{
var table = DefinitionFactory . GetTableDefinition ( typeof ( T ) , SqlSyntax ) ;
var column = table . Columns . First ( x = > x . Name = = columnName ) ;
SqlSyntax . Format ( column , SqlSyntax . GetQuotedTableName ( tableName ) , out var sqls ) ;
foreach ( var sql in sqls )
2018-03-28 12:50:15 +11:00
Execute . Sql ( sql ) . Do ( ) ;
2018-02-01 14:14:45 +01:00
}
2018-01-15 17:32:45 +01:00
protected void ReplaceColumn < T > ( string tableName , string currentName , string newName )
{
AddColumn < T > ( tableName , newName , out var sqls ) ;
2018-03-28 12:50:15 +11:00
Execute . Sql ( $"UPDATE {SqlSyntax.GetQuotedTableName(tableName)} SET {SqlSyntax.GetQuotedColumnName(newName)}={SqlSyntax.GetQuotedColumnName(currentName)}" ) . Do ( ) ;
foreach ( var sql in sqls ) Execute . Sql ( sql ) . Do ( ) ;
2018-01-15 17:32:45 +01:00
Delete . Column ( currentName ) . FromTable ( tableName ) . Do ( ) ;
}
protected bool TableExists ( string tableName )
{
var tables = SqlSyntax . GetTablesInSchema ( Context . Database ) ;
return tables . Any ( x = > x . InvariantEquals ( tableName ) ) ;
}
2019-02-11 11:35:21 +01:00
protected bool IndexExists ( string indexName )
{
var indexes = SqlSyntax . GetDefinedIndexes ( Context . Database ) ;
return indexes . Any ( x = > x . Item2 . InvariantEquals ( indexName ) ) ;
}
2018-01-15 17:32:45 +01:00
protected bool ColumnExists ( string tableName , string columnName )
{
var columns = SqlSyntax . GetColumnsInSchema ( Context . Database ) . Distinct ( ) . ToArray ( ) ;
return columns . Any ( x = > x . TableName . InvariantEquals ( tableName ) & & x . ColumnName . InvariantEquals ( columnName ) ) ;
}
protected string ColumnType ( string tableName , string columnName )
{
var columns = SqlSyntax . GetColumnsInSchema ( Context . Database ) . Distinct ( ) . ToArray ( ) ;
var column = columns . FirstOrDefault ( x = > x . TableName . InvariantEquals ( tableName ) & & x . ColumnName . InvariantEquals ( columnName ) ) ;
return column ? . DataType ;
}
}
}