using System.Text; namespace Connected.Data.Schema.Sql { internal class ColumnAlter : ColumnTransaction { public ColumnAlter(ISchemaColumn column, ExistingSchema existing, ISchemaColumn existingColumn) : base(column) { Existing = existing; ExistingColumn = existingColumn; } private ExistingSchema Existing { get; } private ISchemaColumn ExistingColumn { get; } protected override async Task OnExecute() { if (ExistingColumn.Equals(Column)) return; if (!string.IsNullOrWhiteSpace(ExistingColumn.DefaultValue)) { var existingDefault = SchemaExtensions.ParseDefaultValue(ExistingColumn.DefaultValue); var def = SchemaExtensions.ParseDefaultValue(Column.DefaultValue); if (!string.Equals(existingDefault, def, StringComparison.Ordinal)) await new DefaultDrop(Column).Execute(Context); } if (Column.DataType != ExistingColumn.DataType || Column.IsNullable != ExistingColumn.IsNullable || Column.MaxLength != ExistingColumn.MaxLength || Column.IsVersion != ExistingColumn.IsVersion) await Context.Execute(CommandText); var ed = SchemaExtensions.ParseDefaultValue(ExistingColumn.DefaultValue); var nd = SchemaExtensions.ParseDefaultValue(Column.DefaultValue); if (!string.Equals(ed, nd, StringComparison.Ordinal) && nd is not null) await new DefaultAdd(Column, Context.Schema.Name).Execute(Context); if (!ExistingColumn.IsPrimaryKey && Column.IsPrimaryKey) await new PrimaryKeyAdd(Column).Execute(Context); else if (ExistingColumn.IsPrimaryKey && !Column.IsPrimaryKey) await new PrimaryKeyRemove(Existing, ExistingColumn).Execute(Context); } private string CommandText { get { var text = new StringBuilder(); text.AppendLine($"ALTER TABLE {Escape(Context.Schema.SchemaName(), Context.Schema.Name)}"); text.AppendLine($"ALTER COLUMN {CreateColumnCommandText(Column)}"); return text.ToString(); } } } }