Files
DevToolsAvalonia/常用工具集/Utility/SqlFormat/DdlFormatter.cs
2025-08-26 08:37:44 +08:00

140 lines
4.4 KiB
C#

namespace NHibernate.AdoNet.Util
{
using NHibernate.Util;
using System;
using System.Collections.Generic;
using System.Text;
public class DdlFormatter : IFormatter
{
private const string Indent1 = "\n ";
private const string Indent2 = "\n ";
private const string Indent3 = "\n ";
public virtual string Format(string sql)
{
if (sql.ToLowerInvariant().StartsWith("create table"))
{
return this.FormatCreateTable(sql);
}
if (sql.ToLowerInvariant().StartsWith("alter table"))
{
return this.FormatAlterTable(sql);
}
if (sql.ToLowerInvariant().StartsWith("comment on"))
{
return this.FormatCommentOn(sql);
}
return ("\n " + sql);
}
protected virtual string FormatAlterTable(string sql)
{
StringBuilder builder = new StringBuilder(60).Append("\n ");
IEnumerator<string> enumerator = new StringTokenizer(sql, " (,)'[]\"", true).GetEnumerator();
bool flag = false;
while (enumerator.MoveNext())
{
string current = enumerator.Current;
if (IsQuote(current))
{
flag = !flag;
}
else if (!flag && IsBreak(current))
{
builder.Append("\n ");
}
builder.Append(current);
}
return builder.ToString();
}
protected virtual string FormatCommentOn(string sql)
{
StringBuilder builder = new StringBuilder(60).Append("\n ");
IEnumerator<string> enumerator = new StringTokenizer(sql, " '[]\"", true).GetEnumerator();
bool flag = false;
while (enumerator.MoveNext())
{
string current = enumerator.Current;
builder.Append(current);
if (IsQuote(current))
{
flag = !flag;
}
else if (!flag && "is".Equals(current))
{
builder.Append("\n ");
}
}
return builder.ToString();
}
protected virtual string FormatCreateTable(string sql)
{
StringBuilder builder = new StringBuilder(60).Append("\n ");
IEnumerator<string> enumerator = new StringTokenizer(sql, "(,)'[]\"", true).GetEnumerator();
int num = 0;
bool flag = false;
while (enumerator.MoveNext())
{
string current = enumerator.Current;
if (IsQuote(current))
{
flag = !flag;
builder.Append(current);
}
else
{
if (flag)
{
builder.Append(current);
continue;
}
if (")".Equals(current))
{
num--;
if (num == 0)
{
builder.Append("\n ");
}
}
builder.Append(current);
if (",".Equals(current) && (num == 1))
{
builder.Append("\n ");
}
if ("(".Equals(current))
{
num++;
if (num == 1)
{
builder.Append("\n ");
}
}
}
}
return builder.ToString();
}
private static bool IsBreak(string token)
{
if ((!"drop".Equals(token) && !"add".Equals(token)) && (!"references".Equals(token) && !"foreign".Equals(token)))
{
return "on".Equals(token);
}
return true;
}
private static bool IsQuote(string token)
{
if ((!"\"".Equals(token) && !"`".Equals(token)) && (!"]".Equals(token) && !"[".Equals(token)))
{
return "'".Equals(token);
}
return true;
}
}
}