Merge branch 'master' of https://git.kollman.net/rlkollman/DbTools
This commit is contained in:
@@ -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 {
|
||||
|
||||
126
SqlBuilder.cs
126
SqlBuilder.cs
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user