using Tiobon.Core.OPS.Tool.OPS.Tool.Helper;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows.Forms;
namespace Tiobon.Core.OPS.Tool.OPS.Tool.View
{
public partial class Frm_DBCompare_Step1 : Form
{
#region 初始化
string m_HdisConnStr = string.Empty;
string m_ConnStr = "";
string m_FileName = "";
string m_Version = "";
SSHHelper sSH;
public Frm_DBCompare_Step1(string connStr, SSHHelper sSH)
{
InitializeComponent();
m_ConnStr = connStr;
m_HdisConnStr = connStr;
this.sSH = sSH;
//this.txt_fname.Text = $"{Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)}\\v1.0_sql.zip";
//m_FileName = $"{Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)}\\v1.0_sql.zip";//this.txt_fname.Text.Trim();
Const.write_task_log($"正在执行数据库比对 {m_ConnStr}");
timer_Main.Start();
}
bool m_Stop = false;
private void Frm_DBCompare_Step1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
m_Stop = true;
}
catch { }
}
#endregion
#region 选择文件
private void btn_select_Click(object sender, EventArgs e)
{
using (OpenFileDialog ofd = new OpenFileDialog())
{
ofd.Multiselect = false;//该值确定是否可以选择多个文件
ofd.Title = "请选择文件";
ofd.Filter = "包含最新数据库与比对脚本的zip文件|*.zip";
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
this.txt_fname.Text = ofd.FileName;
m_FileName = this.txt_fname.Text;
if (!Const.Is_BadZip(m_FileName, out string comment))
{
MessageBox.Show("压缩包已损坏,请检查!");
return;
}
if (string.IsNullOrEmpty(comment))
{
MessageBox.Show("此文件非研发部打包的正式版本,不允许使用!");
return;
}
if (MessageBox.Show(comment, "请核对文件信息", MessageBoxButtons.YesNo, MessageBoxIcon.Information) != DialogResult.Yes)
{
return;
}
m_Version = m_FileName.Substring(m_FileName.LastIndexOf('\\') + 1).Replace("v", "").Replace("_sql.zip", "").Trim();
}
}
}
#endregion
#region 导入
bool b_In = false;
object m_LockIn = new object();
private void btn_Import_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(m_FileName) || !File.Exists(m_FileName))
{
MessageBox.Show("文件不存在!", "提示");
return;
}
lock (m_LockIn)
{
if (b_In)
{
return;
}
else
{
b_In = true;
}
}
progressBar_Main.Minimum = 0;
progressBar_Main.Value = 0;
new System.Threading.Thread(Import).Start();
}
string sql_file = "";
private void Zip_conf()
{
string path = string.Concat(Directory.GetCurrentDirectory(), "\\sql_conf");
Const.ExtractZipFile(m_FileName, "sql_conf/", "", null);
string parePath = SearchFile("CompareConfig.json", path);
File.Copy(parePath, "Config/CompareConfig.json", true);
sql_file = SearchFile("hdis.sql", path);
}
///
/// 搜索文件名称
///
///
///
///
public string SearchFile(string filename, string path)
{
string[] temp = Directory.GetFiles(path, filename, SearchOption.AllDirectories);
if (temp != null && temp.Length > 0) return temp[0];
return string.Empty;
}
int m_PBMax = 0;
int m_PBValue = 0;
object m_LockProgressBar = new object();
private void Import()
{
int sum = 0;
try
{
SendLog("", "开始解压数据库与比对配置脚本");
Zip_conf();
SendLog("", "导入数据开始");
FileInfo fileInfo = new FileInfo(sql_file);
sum = (int)fileInfo.Length;
lock (m_LockProgressBar)
{
m_PBMax = sum;
}
//Regex pattern = new Regex(@"[uU][sS][eE].*[`]?ihdis.*[`]?");
//导入之前,先清空原有数据库
string sql = "DROP DATABASE IF EXISTS `hdis_compare`;";
MySqlHelper.ExecuteNonQuery(m_ConnStr, sql);
sql = "CREATE DATABASE `hdis_compare`;";
MySqlHelper.ExecuteNonQuery(m_ConnStr, sql);
SendLog("", "清理hdis_compare数据库成功");
m_ConnStr = m_ConnStr.Replace("database=hdis", "database=hdis_compare");
using (MySqlConnection conn = new MySqlConnection(m_ConnStr))
{
conn.Open();
using (StreamReader sr = new StreamReader(new FileStream(sql_file, FileMode.Open, FileAccess.Read)))
{
int index = 0;
int count = 0;
StringBuilder sb = new StringBuilder();
while (sr.Peek() != -1)
{
if (m_Stop)
break;
sql = sr.ReadLine();
if (string.IsNullOrEmpty(sql))
{
if (sb.Length > 0 && index >= 1000)
{
using (MySqlTransaction trans = conn.BeginTransaction())
{
sb.AppendLine("USE `hdis_compare`;");
try
{
using (MySqlCommand command = new MySqlCommand(sb.ToString(), conn, trans))
{
command.ExecuteNonQuery();
}
trans.Commit();
}
catch (Exception ex)
{
}
}
sb.Clear();
index = 0;
}
continue;
}
if (sql.StartsWith("-- "))
{
System.Threading.Thread.Sleep(50);
lock (m_LockProgressBar)
{
m_PBValue = count;
}
SendLog("", (sql.Contains("-- 正在导出表") ? sql.Replace("-- 正在导出表", "正在导入表") : (sql.Contains("-- 导出") ? sql.Replace("-- 导出", "正在创建") : sql.Replace("-", "").Trim())).Replace("hdis", "hdis_compare").Replace("导出", "导入"));
Application.DoEvents();
continue;
}
if (count < 10000)
{
//防止 误操作
if (sql.Trim().ToLower().StartsWith("delete from")
|| sql.Trim().ToLower().StartsWith("truncate table")
|| sql.Trim().ToLower().StartsWith("drop table"))
continue;
if (sql.Contains("`hdis`"))
sql = sql.Replace("`hdis`", "`hdis_compare`");
}
index++;
count += sql.Length;
sb.AppendLine(sql);
}
if (index > 0)
{
using (MySqlTransaction trans = conn.BeginTransaction())
{
sb.AppendLine("USE `hdis_compare`;");
using (MySqlCommand command = new MySqlCommand(sb.ToString(), conn, trans))
{
command.ExecuteNonQuery();
}
trans.Commit();
}
sb.Clear();
index = 0;
}
}
}
SendLog("", "导入数据完毕");
}
catch (Exception ex)
{
SendLog("", $"失败:{ex.ToString()}");
}
finally
{
lock (m_LockIn)
{
b_In = false;
}
lock (m_LockProgressBar)
{
m_PBMax = sum;
m_PBValue = sum;
}
}
}
#endregion
#region 日志操作
private static List m_LogsTemp = new List();
private void timer_Main_Tick(object sender, EventArgs e)
{
try
{
lock (m_Logs)
{
m_LogsTemp.Clear();
m_Logs.ForEach(log => m_LogsTemp.Add(log));
m_Logs.Clear();
}
if (m_LogsTemp.Count > 0)
{
if (this.lb_Logger.Items.Count > 2000)
this.lb_Logger.Items.Clear();
m_LogsTemp.ForEach(log => this.lb_Logger.Items.Add(log));
this.lb_Logger.TopIndex = this.lb_Logger.Items.Count - 1;
}
lock (m_LockProgressBar)
{
progressBar_Main.Maximum = m_PBMax;
progressBar_Main.Value = m_PBValue;
}
}
catch { }
}
private static List m_Logs = new List();
private void SendLog(string oprator, string msg)
{
lock (m_Logs)
{
Const.write_log($"[{oprator}] {msg}");
if (string.IsNullOrEmpty(oprator))
m_Logs.Add($"{DateTime.Now.ToString("HH:mm:ss")} {msg}");
else
m_Logs.Add($"{DateTime.Now.ToString("HH:mm:ss")} [{oprator}] {msg}");
}
}
private void 复制ToolStripMenuItem_Click(object sender, EventArgs e)
{
Clipboard.SetDataObject(this.lb_Logger.SelectedItem);
}
#endregion
#region 下一步
private void btn_Next_Click(object sender, EventArgs e)
{
this.Hide();
using (Frm_DBCompare_Step2 f = new Frm_DBCompare_Step2(m_HdisConnStr, m_ConnStr, m_Version, sSH, WindowState))
{
f.ShowDialog();
}
}
#endregion
}
}