This commit is contained in:
2024-08-09 09:23:47 -05:00
parent 9ece56f15c
commit 5876ac0e8a
5 changed files with 289 additions and 30 deletions

76
Extensions.cs Normal file
View File

@@ -0,0 +1,76 @@
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace DbMigrate {
internal static class Extensions {
public static string[] GetCommonColumns(this SqlTable table, SqlTable table2) {
return table.GetColumnNames().Where(f => table2.HasColumn(f)).ToArray();
}
public static void ParseSql(this SqlTable table, string sql, string tableName = null) {
if (tableName != null) {
table.TableName = tableName;
}
bool inTable = false;
bool inColumns = false;
Match m = null;
foreach (string line in Regex.Split(sql, "\\r\\n")) {
if (string.IsNullOrEmpty(line) || line.StartsWith("--")) {
continue;
}
m = Regex.Match(line, "^CREATE TABLE( IF NOT EXISTS)? (\\S+) ");
if (m.Success) {
if (string.IsNullOrEmpty(tableName) && string.IsNullOrEmpty(table.TableName)) {
// Set table name from the above regex match
table.TableName = m.Groups[2].Value.Trim();
}
if (!inTable && (table.TableName == null || m.Groups[2].Value.Trim() == table.TableName)) {
table.CreateTableSql += line + Environment.NewLine;
inTable = true;
inColumns = true;
continue;
} else {
if (inTable) {
// We are done with this table
return;
}
continue;
}
}
m = Regex.Match(line, "^CREATE INDEX( IF NOT EXISTS)? (\\S+) ");
if (m.Success && inTable) {
table.Indexes.Add(m.Groups[2].Value.Trim(), line.Trim());
continue;
}
m = Regex.Match(line, "^CREATE TRIGGER( IF NOT EXISTS)? (\\S+) ");
if (m.Success && inTable) {
table.Triggers.Add(m.Groups[2].Value.Trim(), line.Trim());
continue;
}
if (inColumns) {
if (line.Trim().StartsWith(")")) {
inColumns = false;
} else {
m = Regex.Match(line.Trim(), "^(\\S+).*");
if (m.Success) {
string columnLine = line.Trim();
if (columnLine.EndsWith(",")) {
columnLine = columnLine.Substring(0, columnLine.Length - 1);
}
table.Columns.Add(m.Groups[1].Value.Trim(), columnLine);
}
}
}
table.CreateTableSql += line + Environment.NewLine;
}
}
}
}