Made SqlBuilder methods async

This commit is contained in:
2025-09-05 20:22:19 -05:00
parent 9146e698c9
commit 645d41bdb3
2 changed files with 69 additions and 61 deletions

View File

@@ -55,7 +55,7 @@ namespace DbToolsTester.Forms {
return null;
}
private void ToolbarItemClicked(object sender, DevExpress.XtraBars.ItemClickEventArgs e) {
private async void ToolbarItemClicked(object sender, DevExpress.XtraBars.ItemClickEventArgs e) {
if (e.Item.Equals(bbiDelta)) {
SQLiteConnection db1 = new SQLiteConnection("Data Source=" + Database1File + ";Version=3;");
SQLiteConnection db2 = new SQLiteConnection("Data Source=" + Database2File + ";Version=3;");
@@ -85,7 +85,7 @@ namespace DbToolsTester.Forms {
if (frm.ShowDialog(this) == DialogResult.OK) {
using (var cn = new SQLiteConnection("Data Source=" + (frm.SelectedDatabase == Path.GetFileName(Database1File) ? Database1File : Database2File) + ";Version=3;")) {
SqlBuilder builder = new SqlBuilder();
string sql = builder.GetTableCreateSql(cn, frm.SelectedTable);
string sql = await builder.GetTableCreateSqlAsync(cn, frm.SelectedTable);
if (!string.IsNullOrEmpty(sql)) {
deltaSql.Text = sql;
} else {

View File

@@ -4,6 +4,7 @@ using System.Data;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace DbTools {
public class SqlBuilder {
@@ -52,7 +53,7 @@ namespace DbTools {
/// optionally its data. Returns an empty string if the table's schema cannot be determined.</returns>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="cn"/> is <see langword="null"/> or if <paramref name="tableName"/> is <see
/// langword="null"/> or empty.</exception>
public string GetTableCreateSql(IDbConnection cn, string tableName, string selectStatement = null) {
public async Task<string> GetTableCreateSqlAsync(IDbConnection cn, string tableName, string selectStatement = null) {
if (cn == null) {
throw new ArgumentNullException("cn");
}
@@ -86,14 +87,14 @@ namespace DbTools {
sb.AppendLine("\t" + columns.Trim());
sb.AppendLine(sql.Substring(startIndex + length) + ";");
string indexes = GetIndexCreateSql(cn, tableName);
string indexes = await GetIndexCreateSqlAsync(cn, tableName);
if (!string.IsNullOrEmpty(indexes)) {
sb.AppendLine();
sb.AppendLine("-- INDEXES --");
sb.AppendLine(indexes);
}
string triggers = GetTriggerCreateSql(cn, tableName);
string triggers = await GetTriggerCreateSqlAsync(cn, tableName);
if (!string.IsNullOrEmpty(triggers)) {
sb.AppendLine();
sb.AppendLine("-- TRIGGERS --");
@@ -101,7 +102,7 @@ namespace DbTools {
}
if (!string.IsNullOrEmpty(selectStatement)) {
string data = GetTableDataSql(cn, tableName, selectStatement);
string data = await GetTableDataSqlAsync(cn, tableName, selectStatement);
if (!string.IsNullOrEmpty(data)) {
sb.AppendLine();
sb.AppendLine("-- DATA --");
@@ -125,7 +126,7 @@ namespace DbTools {
/// <returns>A string containing the SQL statements for creating all indexes on the specified table, separated by
/// newlines. Returns an empty string if no indexes are found.</returns>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="cn"/> is null or if <paramref name="tableName"/> is null or empty.</exception>
public string GetIndexCreateSql(IDbConnection cn, string tableName) {
public async Task<string> GetIndexCreateSqlAsync(IDbConnection cn, string tableName) {
if (cn == null) {
throw new ArgumentNullException("cn");
}
@@ -135,16 +136,19 @@ namespace DbTools {
if (cn.State != ConnectionState.Open) {
cn.Open();
}
using (IDbCommand cmd = cn.CreateCommand()) {
cmd.CommandText = $"SELECT sql FROM sqlite_master WHERE type='index' AND tbl_name='{tableName}' AND sql NOT NULL;";
StringBuilder sb = new StringBuilder();
using (IDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
sb.AppendLine(reader.GetString(0) + ";");
StringBuilder sb = new StringBuilder();
await Task.Run(() => {
using (IDbCommand cmd = cn.CreateCommand()) {
cmd.CommandText = $"SELECT sql FROM sqlite_master WHERE type='index' AND tbl_name='{tableName}' AND sql NOT NULL;";
using (IDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
sb.AppendLine(reader.GetString(0) + ";");
}
}
}
return sb.ToString();
}
});
return sb.ToString();
}
/// <summary>
@@ -159,7 +163,7 @@ namespace DbTools {
/// <returns>A string containing the SQL definitions of all triggers for the specified table, separated by semicolons.
/// Returns an empty string if no triggers are found.</returns>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="cn"/> is null or if <paramref name="tableName"/> is null or empty.</exception>
public string GetTriggerCreateSql(IDbConnection cn, string tableName) {
public async Task<string> GetTriggerCreateSqlAsync(IDbConnection cn, string tableName) {
if (cn == null) {
throw new ArgumentNullException("cn");
}
@@ -169,16 +173,18 @@ namespace DbTools {
if (cn.State != ConnectionState.Open) {
cn.Open();
}
using (IDbCommand cmd = cn.CreateCommand()) {
cmd.CommandText = $"SELECT sql FROM sqlite_master WHERE type='trigger' AND tbl_name='{tableName}' AND sql NOT NULL;";
StringBuilder sb = new StringBuilder();
using (IDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
sb.AppendLine(reader.GetString(0) + ";");
StringBuilder sb = new StringBuilder();
await Task.Run(() => {
using (IDbCommand cmd = cn.CreateCommand()) {
cmd.CommandText = $"SELECT sql FROM sqlite_master WHERE type='trigger' AND tbl_name='{tableName}' AND sql NOT NULL;";
using (IDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
sb.AppendLine(reader.GetString(0) + ";");
}
}
}
return sb.ToString();
}
});
return sb.ToString();
}
/// <summary>
@@ -196,7 +202,7 @@ namespace DbTools {
/// <returns>A string containing the generated SQL script. The script includes INSERT statements for the data retrieved
/// by the <paramref name="selectStatement"/>.</returns>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="cn"/> is null or <paramref name="tableName"/> is null or empty.</exception>
public string GetTableDataSql(IDbConnection cn, string tableName, string selectStatement) {
public async Task<string> GetTableDataSqlAsync(IDbConnection cn, string tableName, string selectStatement) {
if (cn == null) {
throw new ArgumentNullException("cn");
}
@@ -208,48 +214,50 @@ namespace DbTools {
cn.Open();
}
StringBuilder sb = new StringBuilder();
selectStatement = selectStatement.Replace("$table", tableName);
using (IDbCommand cmd = cn.CreateCommand()) {
cmd.CommandText = selectStatement;
using (IDataReader reader = cmd.ExecuteReader()) {
StringBuilder sb = new StringBuilder();
int rowCount = 0;
while (reader.Read()) {
List<string> values = new List<string>();
for (int i = 0; i < reader.FieldCount; i++) {
object value = DBNull.Value;
try {
value = reader.GetValue(i);
} catch { }
if (value == DBNull.Value) {
values.Add("NULL");
} else if (value is string || value is DateTime) {
values.Add("'" + value.ToString().Replace("'", "''") + "'");
} else if (value is bool) {
values.Add((bool)value ? "1" : "0");
} else {
values.Add(value.ToString());
await Task.Run(() => {
using (IDbCommand cmd = cn.CreateCommand()) {
cmd.CommandText = selectStatement;
using (IDataReader reader = cmd.ExecuteReader()) {
int rowCount = 0;
while (reader.Read()) {
List<string> values = new List<string>();
for (int i = 0; i < reader.FieldCount; i++) {
object value = DBNull.Value;
try {
value = reader.GetValue(i);
} catch { }
if (value == DBNull.Value) {
values.Add("NULL");
} else if (value is string || value is DateTime) {
values.Add("'" + value.ToString().Replace("'", "''") + "'");
} else if (value is bool) {
values.Add((bool)value ? "1" : "0");
} else {
values.Add(value.ToString());
}
}
}
if (rowCount % 100 == 0) {
if (rowCount != 0)
sb.AppendLine(";");
sb.Append($"INSERT INTO {tableName} ({string.Join(", ", GetColumnNames(reader))}) VALUES");
sb.AppendLine();
sb.Append($" ({string.Join(", ", values)})");
} else {
sb.AppendLine(",");
sb.Append($" ({string.Join(", ", values)})");
if (rowCount % 100 == 0) {
if (rowCount != 0)
sb.AppendLine(";");
sb.Append($"INSERT INTO {tableName} ({string.Join(", ", GetColumnNames(reader))}) VALUES");
sb.AppendLine();
sb.Append($" ({string.Join(", ", values)})");
} else {
sb.AppendLine(",");
sb.Append($" ({string.Join(", ", values)})");
}
rowCount++;
}
rowCount++;
if (rowCount > 0)
sb.AppendLine(";");
}
if (rowCount > 0)
sb.AppendLine(";");
return sb.ToString();
}
}
});
return sb.ToString();
}
/// <summary>