You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Connected.Framework/Connected.Data/Schema/Sql/TableCreate.cs

84 lines
1.7 KiB

2 years ago
using System.Text;
namespace Connected.Data.Schema.Sql
{
internal class TableCreate : TableTransaction
{
public TableCreate(bool temporary)
{
Temporary = temporary;
if (Temporary)
TemporaryName = $"T{Guid.NewGuid().ToString().Replace("-", string.Empty)}";
}
private bool Temporary { get; }
public string TemporaryName { get; }
protected override async Task OnExecute()
{
await Context.Execute(CommandText);
if (!Temporary)
{
await ExecutePrimaryKey();
await ExecuteDefaults();
await ExecuteIndexes();
}
}
private async Task ExecutePrimaryKey()
{
var primaryKey = Context.Schema.Columns.FirstOrDefault(f => f.IsPrimaryKey);
if (primaryKey is not null)
await new PrimaryKeyAdd(primaryKey).Execute(Context);
}
private async Task ExecuteDefaults()
{
var name = Temporary ? TemporaryName : Context.Schema.Name;
foreach (var column in Context.Schema.Columns)
{
if (!string.IsNullOrWhiteSpace(column.DefaultValue))
await new DefaultAdd(column, name).Execute(Context);
}
}
private async Task ExecuteIndexes()
{
var indexes = ParseIndexes(Context.Schema);
foreach (var index in indexes)
await new IndexCreate(index).Execute(Context);
}
private string CommandText
{
get
{
var text = new StringBuilder();
var name = Temporary ? TemporaryName : Context.Schema.Name;
text.AppendLine($"CREATE TABLE {Escape(Context.Schema.SchemaName(), name)}");
text.AppendLine("(");
var comma = string.Empty;
for (var i = 0; i < Context.Schema.Columns.Count; i++)
{
text.AppendLine($"{comma} {CreateColumnCommandText(Context.Schema.Columns[i])}");
comma = ",";
}
text.AppendLine(");");
return text.ToString();
}
}
}
}