diff --git a/.gitignore b/.gitignore index f32b7ed..a4c5101 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,6 @@ ## ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore -#======================Custom -.svn - # User-specific files *.rsuser *.suo @@ -401,3 +398,6 @@ FodyWeavers.xsd # JetBrains Rider *.sln.iml +#======================Custom +.svn +!SystemX.Net.CP.Middleware.Log \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.CP.Middleware.Log.sln b/SystemX.Net.CP.Middleware.Log/SystemX.Net.CP.Middleware.Log.sln new file mode 100644 index 0000000..0ae386a --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.CP.Middleware.Log.sln @@ -0,0 +1,32 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30225.117 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SystemX.Net.CP.Middleware.Log", "SystemX.Net.Middleware.UI\SystemX.Net.CP.Middleware.Log.csproj", "{3658FBE5-9A84-4F76-8E19-867DB9F4484D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|x64.ActiveCfg = Debug|x64 + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|x64.Build.0 = Debug|x64 + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|Any CPU.Build.0 = Release|Any CPU + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|x64.ActiveCfg = Release|x64 + {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {68CD108D-837F-47FF-A153-70C328D18A84} + VisualSVNWorkingCopyRoot = . + EndGlobalSection +EndGlobal diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/ALIS ICON.ico b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/ALIS ICON.ico new file mode 100644 index 0000000..14a4223 Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/ALIS ICON.ico differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/App.config b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/App.config new file mode 100644 index 0000000..369c5d6 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/App.config @@ -0,0 +1,70 @@ + + + + +
+ + + + + + System + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/AppIcon.ico b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/AppIcon.ico new file mode 100644 index 0000000..cbb016c Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/AppIcon.ico differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Commons.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Commons.cs new file mode 100644 index 0000000..7c6a820 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Commons.cs @@ -0,0 +1,547 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.InteropServices; +using System.IO; +using System.Security.Cryptography; +using System.Data; +using System.Text.RegularExpressions; +using System.Net.Sockets; +using System.Globalization; +using System.Threading; +using System.Diagnostics; +using System.Net; + +using SystemX.Net.BaseProtocol; +using System.Xml.Linq; +using static SystemX.Net.Platform.Common.Util.LogMessage; +using System.Data.SqlClient; + +namespace SystemX.Net.Middleware.Log.Commons +{ + using ParamElement = Tuple; + + public class HISTTesterSummary + { + public string StationName { set; get; } + public string TestType { set; get; } + public string Version { set; get; } + public string ProdCode { set; get; } + public int TestListFileNo { set; get; } + public int TestListVariantNo { set; get; } + public string TestListCntID { set; get; } + + public int StepVersion { set; get; } + public string Host { set; get; } + public string Section { set; get; } + public string ProdNoC { set; get; } + public string ProdNoP { set; get; } + public string TestCode { set; get; } + public string TestListFileName { set; get; } + public string ProductID { set; get; } + public string Result { set; get; } + public string Duration { set; get; } + public DateTime TestDT { set; get; } + } + + public class HISTLogSummary + { + public string StationName { set; get; } + public string TestType { set; get; } + public string Version { set; get; } + public string ProdCode { set; get; } + public int TestListFileNo { set; get; } + public int TestListVariantNo { set; get; } + public string TestListCntID { set; get; } + + public int StepVersion { set; get; } + public string Host { set; get; } + public string Section { set; get; } + public string ProdNoC { set; get; } + public string ProdNoP { set; get; } + public string TestCode { set; get; } + public string TestListFileName { set; get; } + public string ProductID { set; get; } + public string Result { set; get; } + public string Duration { set; get; } + public DateTime TestDT { set; get; } + } + + public static class ShortLogParamInfo + { + public static readonly int MessageLength = 4096; + public static readonly int MessageValLength = 2024; + + public static string STEP = ""; + public static string POSITION = ""; + public static string MO = ""; + public static string FNC_NAME = ""; + public static string MIN = ""; + public static string MEASURE = ""; + public static string MAX = ""; + public static string DIM = ""; + public static string CHECK = ""; + public static string SPENT_TIME = ""; + public static string INFO = ""; + + public static bool GLOBAL_SPEC = false; + public static string VRFY_MIN = ""; + public static string VRFY_MAX = ""; + } + + public static class LongLogParamInfo + { + public static readonly int MessageLength = 4096; + public static readonly int MessageValLength = 2024; + + public static string STEP = ""; + public static string POSITION = ""; + public static string MO = ""; + public static string FNC_NAME = ""; + public static string MIN = ""; + public static string MEASURE = ""; + public static string MAX = ""; + public static string DIM = ""; + public static string CHECK = ""; + public static string SPENT_TIME = ""; + public static string INFO = ""; + + public static bool GLOBAL_SPEC = false; + public static string VRFY_MIN = ""; + public static string VRFY_MAX = ""; + } + + public static class ParamSet + { + public static Dictionary fParam = new Dictionary(); + + public static void TestResultField() + { + fParam.Clear(); + fParam = new Dictionary(); + fParam.Add("No", new ParamElement(SqlDbType.BigInt, 0, 0, 0)); + fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0)); + fParam.Add("LogData", new ParamElement(SqlDbType.NVarChar, -1, 0, 0)); + } + + public static void TesterSummaryField() + { + fParam.Clear(); + fParam = new Dictionary(); + fParam.Add("StationName", new ParamElement(SqlDbType.NVarChar, 128, 0, 0)); + fParam.Add("TestType", new ParamElement(SqlDbType.NVarChar, 8, 0, 0)); + fParam.Add("Version", new ParamElement(SqlDbType.NVarChar, 4, 0, 0)); + fParam.Add("ProdCode", new ParamElement(SqlDbType.NVarChar, 4, 0, 0)); + fParam.Add("TestListFileNo", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("TestListVariantNo", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("TestListCntID", new ParamElement(SqlDbType.NVarChar, 256, 0, 0)); + fParam.Add("StepVersion", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("HostID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("Section", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("ProdNo_C", new ParamElement(SqlDbType.NVarChar, 32, 0, 0)); + fParam.Add("ProdNo_P", new ParamElement(SqlDbType.NVarChar, 32, 0, 0)); + fParam.Add("Testcode", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("TestListFileName", new ParamElement(SqlDbType.NVarChar, 256, 0, 0)); + fParam.Add("ProductID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("Result", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("Duration", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0)); + } + + public static void LogSummaryField() + { + fParam.Clear(); + fParam = new Dictionary(); + fParam.Add("StationName", new ParamElement(SqlDbType.NVarChar, 128, 0, 0)); + fParam.Add("TestType", new ParamElement(SqlDbType.NVarChar, 8, 0, 0)); + fParam.Add("Version", new ParamElement(SqlDbType.NVarChar, 4, 0, 0)); + fParam.Add("ProdCode", new ParamElement(SqlDbType.NVarChar, 4, 0, 0)); + fParam.Add("TestListFileNo", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("TestListVariantNo", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("TestListCntID", new ParamElement(SqlDbType.NVarChar, 256, 0, 0)); + fParam.Add("StepVersion", new ParamElement(SqlDbType.Int, 0, 0, 0)); + fParam.Add("HostID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("Section", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("ProdNo_C", new ParamElement(SqlDbType.NVarChar, 32, 0, 0)); + fParam.Add("ProdNo_P", new ParamElement(SqlDbType.NVarChar, 32, 0, 0)); + fParam.Add("Testcode", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("TestListFileName", new ParamElement(SqlDbType.NVarChar, 256, 0, 0)); + fParam.Add("ProductID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0)); + fParam.Add("Result", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("Duration", new ParamElement(SqlDbType.NVarChar, 16, 0, 0)); + fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0)); + } + + public static SqlParameter GetMakeSqlParameterInfo(Dictionary refField, string strSetName, object objValue) + { + if (refField.ContainsKey(strSetName)) + { + SqlParameter param = null; + + if (refField[strSetName].Item2 != 0) + param = new SqlParameter("@" + strSetName, refField[strSetName].Item1, refField[strSetName].Item2); + else + param = new SqlParameter("@" + strSetName, refField[strSetName].Item1); + + if (refField[strSetName].Item1 == SqlDbType.Decimal) + { + param.Precision = refField[strSetName].Item3; + param.Scale = refField[strSetName].Item4; + } + + param.Value = objValue; + return param; + } + else + return null; + } + } + + public class CommonProtocol + { + public SqlCommand LogDataResultInsert(string strTableName, DataRow itemData) + { + string columns = string.Empty; + columns = "No,TestDT,LogData"; + + string values = string.Join(",", columns.Split(',').Select(c => string.Format("@{0}", c))); + string sqlCommand = string.Format("INSERT INTO [" + strTableName + "] ({0}) VALUES ({1})", columns, values); + + ParamSet.TestResultField(); + + SqlCommand cmd = new SqlCommand(sqlCommand); + + SqlParameter[] setParams = new SqlParameter[columns.Split(',').Count()]; + + setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "No", Convert.ToInt64(itemData["No"])); + setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", Convert.ToDateTime(itemData["TestDT"])); + setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "LogData", Convert.ToString(itemData["LogData"])); + + cmd.Parameters.AddRange(setParams); + + return cmd; + } + + public SqlCommand LogDataSummaryInsert(string strTableName, HISTLogSummary itemSummary) + { + string columns = string.Empty; + if (itemSummary.TestListCntID == string.Empty) + columns = "StationName,TestType,Version,ProdCode,TestListFileNo,TestListVariantNo,StepVersion,HostID,Section,ProdNo_C,ProdNo_P,Testcode,TestListFileName,ProductID,Result,Duration,TestDT"; + else + columns = "StationName,TestType,Version,ProdCode,TestListFileNo,TestListVariantNo,TestListCntID,StepVersion,HostID,Section,ProdNo_C,ProdNo_P,Testcode,TestListFileName,ProductID,Result,Duration,TestDT"; + + string values = string.Join(",", columns.Split(',').Select(c => string.Format("@{0}", c))); + string sqlCommand = string.Format("INSERT INTO [" + strTableName + "] ({0}) VALUES ({1})", columns, values); + + ParamSet.LogSummaryField(); + + SqlCommand cmd = new SqlCommand(sqlCommand); + + SqlParameter[] setParams = new SqlParameter[columns.Split(',').Count()]; + + if (itemSummary.TestListCntID == string.Empty) + { + setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StationName", itemSummary.StationName); + setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestType", itemSummary.TestType); + setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Version", itemSummary.Version); + setParams[3] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdCode", itemSummary.ProdCode); + setParams[4] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileNo", itemSummary.TestListFileNo); + setParams[5] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListVariantNo", itemSummary.TestListVariantNo); + setParams[6] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StepVersion", itemSummary.StepVersion); + setParams[7] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "HostID", itemSummary.Host); + setParams[8] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Section", itemSummary.Section); + setParams[9] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_C", itemSummary.ProdNoC); + setParams[10] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_P", itemSummary.ProdNoP); + setParams[11] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Testcode", itemSummary.TestCode); + setParams[12] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileName", itemSummary.TestListFileName); + setParams[13] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProductID", itemSummary.ProductID); + setParams[14] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Result", itemSummary.Result); + setParams[15] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Duration", itemSummary.Duration); + setParams[16] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", itemSummary.TestDT); + } + else + { + setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StationName", itemSummary.StationName); + setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestType", itemSummary.TestType); + setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Version", itemSummary.Version); + setParams[3] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdCode", itemSummary.ProdCode); + setParams[4] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileNo", itemSummary.TestListFileNo); + setParams[5] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListVariantNo", itemSummary.TestListVariantNo); + setParams[6] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListCntID", itemSummary.TestListCntID); + setParams[7] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StepVersion", itemSummary.StepVersion); + setParams[8] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "HostID", itemSummary.Host); + setParams[9] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Section", itemSummary.Section); + setParams[10] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_C", itemSummary.ProdNoC); + setParams[11] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_P", itemSummary.ProdNoP); + setParams[12] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Testcode", itemSummary.TestCode); + setParams[13] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileName", itemSummary.TestListFileName); + setParams[14] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProductID", itemSummary.ProductID); + setParams[15] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Result", itemSummary.Result); + setParams[16] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Duration", itemSummary.Duration); + setParams[17] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", itemSummary.TestDT); + } + + cmd.Parameters.AddRange(setParams); + + return cmd; + } + } + + public static class COMMON + { + [DllImport("winmm.dll")] + public static extern uint timeGetTime(); + + public const string Png = "PNG Portable Network Graphics (*.png)|" + "*.png"; + public const string Jpg = "JPEG File Interchange Format (*.jpg *.jpeg *jfif)|" + "*.jpg;*.jpeg;*.jfif"; + public const string Bmp = "BMP Windows Bitmap (*.bmp)|" + "*.bmp"; + public const string Tif = "TIF Tagged Imaged File Format (*.tif *.tiff)|" + "*.tif;*.tiff"; + public const string Gif = "GIF Graphics Interchange Format (*.gif)|" + "*.gif"; + public const string AllImages = "Image file|" + "*.png; *.jpg; *.jpeg; *.jfif; *.bmp;*.tif; *.tiff; *.gif"; + public const string AllFiles = "All files (*.*)" + "|*.*"; + + public static string[] mediaExtensions = { + ".PNG", ".JPG", ".JPEG", ".BMP", ".GIF", //etc + ".WAV", ".MID", ".MIDI", ".WMA", ".MP3", ".OGG", ".RMA", //etc + ".AVI", ".MP4", ".DIVX", ".WMV", //etc + }; + + public static DataTable ConvertCSVtoDataTable(string strFilePath, string strSetHeader) + { + DataTable dt = null; + try + { + using (StreamReader sr = new StreamReader(strFilePath)) + { + string[] headers = null; + + if (strSetHeader.Length > 0) + headers = strSetHeader.Split(','); + else + headers = sr.ReadLine().Split(','); + + dt = new DataTable(); + foreach (string header in headers) + { + dt.Columns.Add(header); + } + while (!sr.EndOfStream) + { + string strReadData = sr.ReadLine().Trim(); + if (strReadData.Length <= 0) + break; + + string[] rows = Regex.Split(strReadData, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); + DataRow dr = dt.NewRow(); + for (int i = 0; i < headers.Length; i++) + { + dr[i] = rows[i]; + } + dt.Rows.Add(dr); + } + } + } + catch (Exception e) + { + dt = null; + } + + return dt; + } + + public static T ConvertTextToTryValue(string strText, object objFailValue) + { + object obj; + obj = typeof(T); + + int iGetValue = 0; + uint uiGetValue = 0; + double dGetValue = 0; + + if (obj.ToString().IndexOf("Int") >= 0) + { + if (!int.TryParse(strText, out iGetValue)) + obj = objFailValue; + else + obj = iGetValue; + } + if (obj.ToString().IndexOf("UInt") >= 0) + { + if (!uint.TryParse(strText, out uiGetValue)) + obj = objFailValue; + else + obj = uiGetValue; + } + else if (obj.ToString().IndexOf("Double") >= 0) + { + if (!double.TryParse(strText, out dGetValue)) + obj = objFailValue; + else + obj = dGetValue; + } + + return (T)Convert.ChangeType(obj, typeof(T)); + } + + public static T FindByName(this object targetClass, string name) where T : class + { + System.Reflection.FieldInfo fi = targetClass.GetType().GetField(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); + + return fi.GetValue(targetClass) as T; + } + + public static T FindByName(this string name, object targetClass) where T : class + { + System.Reflection.FieldInfo fi = targetClass.GetType().GetField(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); + + return fi.GetValue(targetClass) as T; + } + + public class LogProcessInfo + { + public bool READ_INFO_STATE { set; get; } + + private string strInfoFilePos; + + public string TITLE; + + public string SERVER_SAVE_POS; + public string MES_SAVE_POS; + + //TODO : Server ALIS FTP + public bool FTP_Use; + + public string FTP_IPAddress; + public string FTP_Port; + public string FTP_Account; + public string FTP_Password; + + public long FTP_ScanTime_ms; + + public long BULK_ProcessTime_ms; + + public LogProcessInfo(string strGetInfoPath) + { + strInfoFilePos = strGetInfoPath; + } + public bool Load() + { + READ_INFO_STATE = true; + + try + { + XDocument xDoc = XDocument.Load(strInfoFilePos); + var xElement = xDoc.Element("ROOT"); + + if (xElement != null) + { + var xGetElement = xElement.Element("Configure"); + + TITLE = xGetElement.Element("Title").Value; + + SERVER_SAVE_POS = @xGetElement.Element("LogFileSavePos").Value; + MES_SAVE_POS = @xGetElement.Element("MESFileSavePos").Value; + + //TODO : Server ALIS FTP + XElement xEle = xGetElement.Element("UseFTP"); + + bool bValue; + long lValue; + //string strValue; + + if (xEle?.IsEmpty == false) + { + if (bool.TryParse(xEle.Value, out bValue)) + FTP_Use = bValue; + } + else + FTP_Use = false; + + xEle = xGetElement.Element("IPAddressFTP"); + + if (xEle?.IsEmpty == false) + FTP_IPAddress = xEle.Value; + else + FTP_IPAddress = "0.0.0.0"; + + xEle = xGetElement.Element("PortFTP"); + + if (xEle?.IsEmpty == false) + FTP_Port = xEle.Value; + else + FTP_Port = "21"; + + xEle = xGetElement.Element("AccountFTP"); + + if (xEle?.IsEmpty == false) + FTP_Account = xEle.Value; + else + FTP_Account = ""; + + xEle = xGetElement.Element("PasswordFTP"); + + if (xEle?.IsEmpty == false) + FTP_Password = xEle.Value; + else + FTP_Password = ""; + + xEle = xGetElement.Element("ScanTimeFTPms"); + + if (xEle?.IsEmpty == false) + { + if (long.TryParse(xEle.Value, out lValue)) + FTP_ScanTime_ms = lValue; + } + else + FTP_ScanTime_ms = 30000; + + xEle = xGetElement.Element("ScanTimeBULKms"); + + if (xEle?.IsEmpty == false) + { + if (long.TryParse(xEle.Value, out lValue)) + BULK_ProcessTime_ms = lValue; + } + else + BULK_ProcessTime_ms = 30000; + + if (Base.CheckPath(SERVER_SAVE_POS)) + { + if (Directory.Exists(SERVER_SAVE_POS) == false) + Directory.CreateDirectory(SERVER_SAVE_POS); + } + else + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"ServerInfo read failed.(SERVER SAVE POS - Folder name error)[SystemX.Common : SystemX.Net.ServerInfo]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + throw new Exception(); + } + + if (Base.CheckPath(MES_SAVE_POS)) + { + if (Directory.Exists(MES_SAVE_POS) == false) + Directory.CreateDirectory(MES_SAVE_POS); + } + else + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"ServerInfo read failed.(MES SAVE POS - Folder name error)[SystemX.Common : SystemX.Net.ServerInfo]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + throw new Exception(); + } + + } + } + catch (Exception e) + { + READ_INFO_STATE = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"LogProcessInfo read failed. [LogProcessInfo : SystemX.Net.Middleware.Commons]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + + return READ_INFO_STATE; + } + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/DeleteProc.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/DeleteProc.cs new file mode 100644 index 0000000..0cd3610 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/DeleteProc.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.InteropServices; +using System.IO; +using System.Security.Cryptography; +using System.Data; +using System.Text.RegularExpressions; +using System.Net.Sockets; +using System.Globalization; +using System.Threading; +using System.Diagnostics; +using System.Net; + +using SystemX.Net.BaseProtocol; +using System.Xml.Linq; +using static SystemX.Net.Platform.Common.Util.LogMessage; +using System.Data.SqlClient; + +namespace SystemX.Net.Middleware.Log.DeleteProc +{ + public class DeleteProcSystem + { + public Stopwatch stDeleteLogScanTimer; + + public DeleteProcSystem() + { + stDeleteLogScanTimer = new Stopwatch(); + } + + protected void ScanTimerStart() + { + stDeleteLogScanTimer.Start(); + } + + protected void ScanTimerRestart() + { + stDeleteLogScanTimer.Restart(); + } + + protected long GetTimerTime() + { + return stDeleteLogScanTimer.ElapsedMilliseconds; + } + + protected bool GetTimeOverState(long lLimitTime) + { + return (stDeleteLogScanTimer.ElapsedMilliseconds >= lLimitTime) ? true : false; + } + } + + public class DeleteProcOption + { + public enum eLogCheckItem + { + Summary = 0, + ShortTerm = 1, + LongTerm = 2 + } + + //Option + public eLogCheckItem ProcChkItem; + + public long lLogScanTimeVal; + + public int nSummaryScanItemCnt; + public int nShortLogScanItemCnt; + public int nLongLogScanItemCnt; + + public int nSummaryDeleteNum; + + public DeleteProcOption() + { + ProcChkItem = eLogCheckItem.Summary; + + //3 Minute + //Test 10000 + lLogScanTimeVal = 10000; //180000; + + nSummaryScanItemCnt = 100; + nShortLogScanItemCnt = 100; + nLongLogScanItemCnt = 100; + + nSummaryDeleteNum = 5; + } + } + + public class DeleteProcInfo : DeleteProcSystem + { + public int[] nHistSummaryDeleteList; + public int nHistSummaryDeleteSize; + public int nHistSummaryDeletePos; + // + public int[] nShortLogSummaryDeleteListNo; + public int[] nShortLogSummaryDeleteListAccessSt; + public int[] nShortLogSummaryDeleteListAccessEn; + + public int nShortLogSummaryDeleteSize; + public int nShortLogSummaryDeletePos; + + public bool bShortLogDataCheckResult; + public int nShortLogDeleteProcPos; + public bool bShortLogDataDeleteResult; + // + public int[] nLongLogSummaryDeleteListNo; + public int[] nLongLogSummaryDeleteListAccessSt; + public int[] nLongLogSummaryDeleteListAccessEn; + + public int nLongLogSummaryDeleteSize; + public int nLongLogSummaryDeletePos; + + public bool bLongLogDataCheckResult; + public int nLongLogDeleteProcPos; + public bool bLongLogDataDeleteResult; + // + //Option + public DeleteProcOption DeleteProcOp; + + public DeleteProcInfo() + { + ScanTimerStart(); + + InitMember(); + } + + private void InitMember() + { + nHistSummaryDeleteList = new int[1]; + nHistSummaryDeleteSize = 0; + nHistSummaryDeletePos = 0; + + nShortLogSummaryDeleteListNo = new int[1]; + nShortLogSummaryDeleteListAccessSt = new int[1]; + nShortLogSummaryDeleteListAccessEn = new int[1]; + + nShortLogSummaryDeleteSize = 0; + nShortLogSummaryDeletePos = 0; + + bShortLogDataCheckResult = false; + nShortLogDeleteProcPos = 0; + bShortLogDataDeleteResult = false; + + nLongLogSummaryDeleteListNo = new int[1]; + nLongLogSummaryDeleteListAccessSt = new int[1]; + nLongLogSummaryDeleteListAccessEn = new int[1]; + + nLongLogSummaryDeleteSize = 0; + nLongLogSummaryDeletePos = 0; + + bLongLogDataCheckResult = false; + nLongLogDeleteProcPos = 0; + bLongLogDataDeleteResult = false; + + DeleteProcOp = new DeleteProcOption(); + } + + public bool GetScanTimeState() + { + return GetTimeOverState(DeleteProcOp.lLogScanTimeVal); + } + + public void ResetScanTimeState() + { + ScanTimerRestart(); + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.Designer.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.Designer.cs new file mode 100644 index 0000000..60b1fa2 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.Designer.cs @@ -0,0 +1,849 @@ +using DevExpress.XtraBars; +using DevExpress.XtraBars.Ribbon; + +namespace SystemX.Net.MiddlewareUI +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.fluentDesignFormContainer1 = new DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormContainer(); + this.panel2 = new System.Windows.Forms.Panel(); + this.panelMain = new System.Windows.Forms.Panel(); + this.panelProcess = new System.Windows.Forms.Panel(); + this.richTextBoxProcess = new System.Windows.Forms.RichTextBox(); + this.panelRecv = new System.Windows.Forms.Panel(); + this.richTextBoxRecv = new System.Windows.Forms.RichTextBox(); + this.paneldDBConn = new System.Windows.Forms.Panel(); + this.panelDBPath = new System.Windows.Forms.Panel(); + this.labelDBPath = new System.Windows.Forms.Label(); + this.panelFTP = new System.Windows.Forms.Panel(); + this.panel4 = new System.Windows.Forms.Panel(); + this.labelFTP = new System.Windows.Forms.Label(); + this.panelDBLongTerm2 = new System.Windows.Forms.Panel(); + this.panelDBLongTerm1 = new System.Windows.Forms.Panel(); + this.labelDBLongTerm = new System.Windows.Forms.Label(); + this.panel7 = new System.Windows.Forms.Panel(); + this.panel8 = new System.Windows.Forms.Panel(); + this.labelShortTermLogTableName = new System.Windows.Forms.Label(); + this.panel5 = new System.Windows.Forms.Panel(); + this.panel6 = new System.Windows.Forms.Panel(); + this.labelShortTermSummaryTableName = new System.Windows.Forms.Label(); + this.panelDBShortTerm2 = new System.Windows.Forms.Panel(); + this.panelDBShortTerm1 = new System.Windows.Forms.Panel(); + this.labelDBShortTerm = new System.Windows.Forms.Label(); + this.panelDBMain2 = new System.Windows.Forms.Panel(); + this.panelDBMain1 = new System.Windows.Forms.Panel(); + this.labelDBMain = new System.Windows.Forms.Label(); + this.progressBarProgram = new System.Windows.Forms.ProgressBar(); + this.panelSubFunc = new System.Windows.Forms.Panel(); + this.buttonDbConnect = new System.Windows.Forms.Button(); + this.panel3 = new System.Windows.Forms.Panel(); + this.labelFTPTime = new System.Windows.Forms.Label(); + this.labelBulkTime = new System.Windows.Forms.Label(); + this.labelBulkCntInfo1 = new System.Windows.Forms.Label(); + this.labelBulkCntInfo2 = new System.Windows.Forms.Label(); + this.labelBulkCntInfo3 = new System.Windows.Forms.Label(); + this.buttonBulkInsertStart = new System.Windows.Forms.Button(); + this.panelSub1 = new System.Windows.Forms.Panel(); + this.panelSub2 = new System.Windows.Forms.Panel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.Title_label = new System.Windows.Forms.Label(); + this.AlisPictureBox = new System.Windows.Forms.PictureBox(); + this.fluentDesignFormControl1 = new DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl(); + this.barCheckItemShowCpLogTime = new DevExpress.XtraBars.BarCheckItem(); + this.Chktimer = new System.Windows.Forms.Timer(this.components); + this.UItimer = new System.Windows.Forms.Timer(this.components); + this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components); + this.contextMenuSubStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItemExit = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripComboBox1 = new System.Windows.Forms.ToolStripComboBox(); + this.fluentDesignFormContainer1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.panelMain.SuspendLayout(); + this.panelProcess.SuspendLayout(); + this.panelRecv.SuspendLayout(); + this.paneldDBConn.SuspendLayout(); + this.panelDBPath.SuspendLayout(); + this.panelFTP.SuspendLayout(); + this.panel4.SuspendLayout(); + this.panelDBLongTerm2.SuspendLayout(); + this.panelDBLongTerm1.SuspendLayout(); + this.panel7.SuspendLayout(); + this.panel8.SuspendLayout(); + this.panel5.SuspendLayout(); + this.panel6.SuspendLayout(); + this.panelDBShortTerm2.SuspendLayout(); + this.panelDBShortTerm1.SuspendLayout(); + this.panelDBMain2.SuspendLayout(); + this.panelDBMain1.SuspendLayout(); + this.panelSubFunc.SuspendLayout(); + this.panel3.SuspendLayout(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.AlisPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.fluentDesignFormControl1)).BeginInit(); + this.contextMenuSubStrip.SuspendLayout(); + this.SuspendLayout(); + // + // fluentDesignFormContainer1 + // + this.fluentDesignFormContainer1.Controls.Add(this.panel2); + this.fluentDesignFormContainer1.Controls.Add(this.panel1); + this.fluentDesignFormContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.fluentDesignFormContainer1.Location = new System.Drawing.Point(0, 46); + this.fluentDesignFormContainer1.Name = "fluentDesignFormContainer1"; + this.fluentDesignFormContainer1.Size = new System.Drawing.Size(1979, 958); + this.fluentDesignFormContainer1.TabIndex = 0; + // + // panel2 + // + this.panel2.Controls.Add(this.panelMain); + this.panel2.Controls.Add(this.panelSubFunc); + this.panel2.Controls.Add(this.panelSub1); + this.panel2.Controls.Add(this.panelSub2); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 74); + this.panel2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1979, 884); + this.panel2.TabIndex = 3; + // + // panelMain + // + this.panelMain.Controls.Add(this.panelProcess); + this.panelMain.Controls.Add(this.panelRecv); + this.panelMain.Controls.Add(this.paneldDBConn); + this.panelMain.Controls.Add(this.progressBarProgram); + this.panelMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelMain.Location = new System.Drawing.Point(0, 0); + this.panelMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelMain.Name = "panelMain"; + this.panelMain.Size = new System.Drawing.Size(1979, 592); + this.panelMain.TabIndex = 18; + // + // panelProcess + // + this.panelProcess.Controls.Add(this.richTextBoxProcess); + this.panelProcess.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelProcess.Location = new System.Drawing.Point(433, 306); + this.panelProcess.Margin = new System.Windows.Forms.Padding(20); + this.panelProcess.Name = "panelProcess"; + this.panelProcess.Padding = new System.Windows.Forms.Padding(20); + this.panelProcess.Size = new System.Drawing.Size(1546, 286); + this.panelProcess.TabIndex = 23; + // + // richTextBoxProcess + // + this.richTextBoxProcess.BackColor = System.Drawing.Color.White; + this.richTextBoxProcess.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBoxProcess.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBoxProcess.Font = new System.Drawing.Font("Times New Roman", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.richTextBoxProcess.Location = new System.Drawing.Point(20, 20); + this.richTextBoxProcess.Margin = new System.Windows.Forms.Padding(10); + this.richTextBoxProcess.Name = "richTextBoxProcess"; + this.richTextBoxProcess.ReadOnly = true; + this.richTextBoxProcess.Size = new System.Drawing.Size(1506, 246); + this.richTextBoxProcess.TabIndex = 1; + this.richTextBoxProcess.Text = ""; + // + // panelRecv + // + this.panelRecv.Controls.Add(this.richTextBoxRecv); + this.panelRecv.Dock = System.Windows.Forms.DockStyle.Top; + this.panelRecv.Location = new System.Drawing.Point(433, 60); + this.panelRecv.Margin = new System.Windows.Forms.Padding(20); + this.panelRecv.Name = "panelRecv"; + this.panelRecv.Padding = new System.Windows.Forms.Padding(20); + this.panelRecv.Size = new System.Drawing.Size(1546, 233); + this.panelRecv.TabIndex = 22; + // + // richTextBoxRecv + // + this.richTextBoxRecv.BackColor = System.Drawing.Color.White; + this.richTextBoxRecv.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBoxRecv.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBoxRecv.Font = new System.Drawing.Font("Times New Roman", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.richTextBoxRecv.Location = new System.Drawing.Point(20, 20); + this.richTextBoxRecv.Margin = new System.Windows.Forms.Padding(10); + this.richTextBoxRecv.Name = "richTextBoxRecv"; + this.richTextBoxRecv.ReadOnly = true; + this.richTextBoxRecv.Size = new System.Drawing.Size(1506, 193); + this.richTextBoxRecv.TabIndex = 0; + this.richTextBoxRecv.Text = ""; + // + // paneldDBConn + // + this.paneldDBConn.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.paneldDBConn.Controls.Add(this.panelDBPath); + this.paneldDBConn.Controls.Add(this.panelFTP); + this.paneldDBConn.Controls.Add(this.panelDBLongTerm2); + this.paneldDBConn.Controls.Add(this.panel7); + this.paneldDBConn.Controls.Add(this.panel5); + this.paneldDBConn.Controls.Add(this.panelDBShortTerm2); + this.paneldDBConn.Controls.Add(this.panelDBMain2); + this.paneldDBConn.Dock = System.Windows.Forms.DockStyle.Left; + this.paneldDBConn.Location = new System.Drawing.Point(0, 60); + this.paneldDBConn.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.paneldDBConn.Name = "paneldDBConn"; + this.paneldDBConn.Size = new System.Drawing.Size(433, 532); + this.paneldDBConn.TabIndex = 21; + // + // panelDBPath + // + this.panelDBPath.Controls.Add(this.labelDBPath); + this.panelDBPath.Dock = System.Windows.Forms.DockStyle.Top; + this.panelDBPath.Location = new System.Drawing.Point(0, 228); + this.panelDBPath.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBPath.Name = "panelDBPath"; + this.panelDBPath.Size = new System.Drawing.Size(433, 39); + this.panelDBPath.TabIndex = 33; + // + // labelDBPath + // + this.labelDBPath.BackColor = System.Drawing.Color.White; + this.labelDBPath.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelDBPath.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelDBPath.Location = new System.Drawing.Point(0, 0); + this.labelDBPath.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelDBPath.Name = "labelDBPath"; + this.labelDBPath.Size = new System.Drawing.Size(433, 39); + this.labelDBPath.TabIndex = 23; + this.labelDBPath.Text = "Path"; + this.labelDBPath.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // panelFTP + // + this.panelFTP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelFTP.Controls.Add(this.panel4); + this.panelFTP.Dock = System.Windows.Forms.DockStyle.Top; + this.panelFTP.Location = new System.Drawing.Point(0, 190); + this.panelFTP.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelFTP.Name = "panelFTP"; + this.panelFTP.Size = new System.Drawing.Size(433, 38); + this.panelFTP.TabIndex = 32; + this.panelFTP.Visible = false; + // + // panel4 + // + this.panel4.Controls.Add(this.labelFTP); + this.panel4.Dock = System.Windows.Forms.DockStyle.Left; + this.panel4.Location = new System.Drawing.Point(0, 0); + this.panel4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(408, 36); + this.panel4.TabIndex = 26; + // + // labelFTP + // + this.labelFTP.BackColor = System.Drawing.Color.White; + this.labelFTP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelFTP.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelFTP.Location = new System.Drawing.Point(0, 0); + this.labelFTP.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelFTP.Name = "labelFTP"; + this.labelFTP.Size = new System.Drawing.Size(408, 36); + this.labelFTP.TabIndex = 23; + this.labelFTP.Text = "FTP"; + this.labelFTP.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panelDBLongTerm2 + // + this.panelDBLongTerm2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelDBLongTerm2.Controls.Add(this.panelDBLongTerm1); + this.panelDBLongTerm2.Dock = System.Windows.Forms.DockStyle.Top; + this.panelDBLongTerm2.Location = new System.Drawing.Point(0, 152); + this.panelDBLongTerm2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBLongTerm2.Name = "panelDBLongTerm2"; + this.panelDBLongTerm2.Size = new System.Drawing.Size(433, 38); + this.panelDBLongTerm2.TabIndex = 31; + // + // panelDBLongTerm1 + // + this.panelDBLongTerm1.Controls.Add(this.labelDBLongTerm); + this.panelDBLongTerm1.Dock = System.Windows.Forms.DockStyle.Left; + this.panelDBLongTerm1.Location = new System.Drawing.Point(0, 0); + this.panelDBLongTerm1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBLongTerm1.Name = "panelDBLongTerm1"; + this.panelDBLongTerm1.Size = new System.Drawing.Size(408, 36); + this.panelDBLongTerm1.TabIndex = 26; + // + // labelDBLongTerm + // + this.labelDBLongTerm.BackColor = System.Drawing.Color.White; + this.labelDBLongTerm.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelDBLongTerm.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelDBLongTerm.Location = new System.Drawing.Point(0, 0); + this.labelDBLongTerm.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelDBLongTerm.Name = "labelDBLongTerm"; + this.labelDBLongTerm.Size = new System.Drawing.Size(408, 36); + this.labelDBLongTerm.TabIndex = 23; + this.labelDBLongTerm.Text = "LongTerm"; + this.labelDBLongTerm.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panel7 + // + this.panel7.BackColor = System.Drawing.Color.WhiteSmoke; + this.panel7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel7.Controls.Add(this.panel8); + this.panel7.Dock = System.Windows.Forms.DockStyle.Top; + this.panel7.Location = new System.Drawing.Point(0, 114); + this.panel7.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel7.Name = "panel7"; + this.panel7.Size = new System.Drawing.Size(433, 38); + this.panel7.TabIndex = 29; + // + // panel8 + // + this.panel8.Controls.Add(this.labelShortTermLogTableName); + this.panel8.Dock = System.Windows.Forms.DockStyle.Left; + this.panel8.Location = new System.Drawing.Point(0, 0); + this.panel8.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel8.Name = "panel8"; + this.panel8.Size = new System.Drawing.Size(408, 36); + this.panel8.TabIndex = 26; + // + // labelShortTermLogTableName + // + this.labelShortTermLogTableName.BackColor = System.Drawing.Color.White; + this.labelShortTermLogTableName.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelShortTermLogTableName.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelShortTermLogTableName.Location = new System.Drawing.Point(0, 0); + this.labelShortTermLogTableName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelShortTermLogTableName.Name = "labelShortTermLogTableName"; + this.labelShortTermLogTableName.Size = new System.Drawing.Size(408, 36); + this.labelShortTermLogTableName.TabIndex = 23; + this.labelShortTermLogTableName.Text = "ShortTermLogTableName"; + this.labelShortTermLogTableName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panel5 + // + this.panel5.BackColor = System.Drawing.Color.WhiteSmoke; + this.panel5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel5.Controls.Add(this.panel6); + this.panel5.Dock = System.Windows.Forms.DockStyle.Top; + this.panel5.Location = new System.Drawing.Point(0, 76); + this.panel5.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(433, 38); + this.panel5.TabIndex = 28; + // + // panel6 + // + this.panel6.Controls.Add(this.labelShortTermSummaryTableName); + this.panel6.Dock = System.Windows.Forms.DockStyle.Left; + this.panel6.Location = new System.Drawing.Point(0, 0); + this.panel6.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel6.Name = "panel6"; + this.panel6.Size = new System.Drawing.Size(408, 36); + this.panel6.TabIndex = 26; + // + // labelShortTermSummaryTableName + // + this.labelShortTermSummaryTableName.BackColor = System.Drawing.Color.White; + this.labelShortTermSummaryTableName.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelShortTermSummaryTableName.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelShortTermSummaryTableName.Location = new System.Drawing.Point(0, 0); + this.labelShortTermSummaryTableName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelShortTermSummaryTableName.Name = "labelShortTermSummaryTableName"; + this.labelShortTermSummaryTableName.Size = new System.Drawing.Size(408, 36); + this.labelShortTermSummaryTableName.TabIndex = 23; + this.labelShortTermSummaryTableName.Text = "ShortTermSummaryTableName"; + this.labelShortTermSummaryTableName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panelDBShortTerm2 + // + this.panelDBShortTerm2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelDBShortTerm2.Controls.Add(this.panelDBShortTerm1); + this.panelDBShortTerm2.Dock = System.Windows.Forms.DockStyle.Top; + this.panelDBShortTerm2.Location = new System.Drawing.Point(0, 38); + this.panelDBShortTerm2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBShortTerm2.Name = "panelDBShortTerm2"; + this.panelDBShortTerm2.Size = new System.Drawing.Size(433, 38); + this.panelDBShortTerm2.TabIndex = 23; + // + // panelDBShortTerm1 + // + this.panelDBShortTerm1.Controls.Add(this.labelDBShortTerm); + this.panelDBShortTerm1.Dock = System.Windows.Forms.DockStyle.Left; + this.panelDBShortTerm1.Location = new System.Drawing.Point(0, 0); + this.panelDBShortTerm1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBShortTerm1.Name = "panelDBShortTerm1"; + this.panelDBShortTerm1.Size = new System.Drawing.Size(408, 36); + this.panelDBShortTerm1.TabIndex = 26; + // + // labelDBShortTerm + // + this.labelDBShortTerm.BackColor = System.Drawing.Color.White; + this.labelDBShortTerm.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelDBShortTerm.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelDBShortTerm.Location = new System.Drawing.Point(0, 0); + this.labelDBShortTerm.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelDBShortTerm.Name = "labelDBShortTerm"; + this.labelDBShortTerm.Size = new System.Drawing.Size(408, 36); + this.labelDBShortTerm.TabIndex = 23; + this.labelDBShortTerm.Text = "ShortTerm"; + this.labelDBShortTerm.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panelDBMain2 + // + this.panelDBMain2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelDBMain2.Controls.Add(this.panelDBMain1); + this.panelDBMain2.Dock = System.Windows.Forms.DockStyle.Top; + this.panelDBMain2.Location = new System.Drawing.Point(0, 0); + this.panelDBMain2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBMain2.Name = "panelDBMain2"; + this.panelDBMain2.Size = new System.Drawing.Size(433, 38); + this.panelDBMain2.TabIndex = 22; + // + // panelDBMain1 + // + this.panelDBMain1.Controls.Add(this.labelDBMain); + this.panelDBMain1.Dock = System.Windows.Forms.DockStyle.Left; + this.panelDBMain1.Location = new System.Drawing.Point(0, 0); + this.panelDBMain1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelDBMain1.Name = "panelDBMain1"; + this.panelDBMain1.Size = new System.Drawing.Size(408, 36); + this.panelDBMain1.TabIndex = 25; + // + // labelDBMain + // + this.labelDBMain.BackColor = System.Drawing.Color.White; + this.labelDBMain.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.labelDBMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelDBMain.Location = new System.Drawing.Point(0, 0); + this.labelDBMain.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelDBMain.Name = "labelDBMain"; + this.labelDBMain.Size = new System.Drawing.Size(408, 36); + this.labelDBMain.TabIndex = 22; + this.labelDBMain.Text = "Information"; + this.labelDBMain.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // progressBarProgram + // + this.progressBarProgram.Dock = System.Windows.Forms.DockStyle.Top; + this.progressBarProgram.ForeColor = System.Drawing.SystemColors.HotTrack; + this.progressBarProgram.Location = new System.Drawing.Point(0, 0); + this.progressBarProgram.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.progressBarProgram.Name = "progressBarProgram"; + this.progressBarProgram.Size = new System.Drawing.Size(1979, 60); + this.progressBarProgram.Style = System.Windows.Forms.ProgressBarStyle.Marquee; + this.progressBarProgram.TabIndex = 20; + // + // panelSubFunc + // + this.panelSubFunc.BackColor = System.Drawing.Color.MidnightBlue; + this.panelSubFunc.Controls.Add(this.buttonDbConnect); + this.panelSubFunc.Controls.Add(this.panel3); + this.panelSubFunc.Controls.Add(this.buttonBulkInsertStart); + this.panelSubFunc.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelSubFunc.Location = new System.Drawing.Point(0, 592); + this.panelSubFunc.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelSubFunc.Name = "panelSubFunc"; + this.panelSubFunc.Size = new System.Drawing.Size(1979, 58); + this.panelSubFunc.TabIndex = 17; + // + // buttonDbConnect + // + this.buttonDbConnect.BackColor = System.Drawing.SystemColors.Control; + this.buttonDbConnect.Dock = System.Windows.Forms.DockStyle.Right; + this.buttonDbConnect.Location = new System.Drawing.Point(683, 0); + this.buttonDbConnect.Name = "buttonDbConnect"; + this.buttonDbConnect.Size = new System.Drawing.Size(229, 58); + this.buttonDbConnect.TabIndex = 2; + this.buttonDbConnect.Text = "Database Connect Try"; + this.buttonDbConnect.UseVisualStyleBackColor = false; + this.buttonDbConnect.Visible = false; + this.buttonDbConnect.Click += new System.EventHandler(this.buttonDbConnect_Click); + // + // panel3 + // + this.panel3.Controls.Add(this.labelFTPTime); + this.panel3.Controls.Add(this.labelBulkTime); + this.panel3.Controls.Add(this.labelBulkCntInfo1); + this.panel3.Controls.Add(this.labelBulkCntInfo2); + this.panel3.Controls.Add(this.labelBulkCntInfo3); + this.panel3.Dock = System.Windows.Forms.DockStyle.Right; + this.panel3.Location = new System.Drawing.Point(912, 0); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(851, 58); + this.panel3.TabIndex = 1; + // + // labelFTPTime + // + this.labelFTPTime.BackColor = System.Drawing.Color.WhiteSmoke; + this.labelFTPTime.Dock = System.Windows.Forms.DockStyle.Right; + this.labelFTPTime.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelFTPTime.Location = new System.Drawing.Point(121, 0); + this.labelFTPTime.Name = "labelFTPTime"; + this.labelFTPTime.Size = new System.Drawing.Size(146, 58); + this.labelFTPTime.TabIndex = 4; + this.labelFTPTime.Text = "-"; + this.labelFTPTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.labelFTPTime.Visible = false; + // + // labelBulkTime + // + this.labelBulkTime.BackColor = System.Drawing.Color.Snow; + this.labelBulkTime.Dock = System.Windows.Forms.DockStyle.Right; + this.labelBulkTime.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelBulkTime.Location = new System.Drawing.Point(267, 0); + this.labelBulkTime.Name = "labelBulkTime"; + this.labelBulkTime.Size = new System.Drawing.Size(146, 58); + this.labelBulkTime.TabIndex = 3; + this.labelBulkTime.Text = "-"; + this.labelBulkTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // labelBulkCntInfo1 + // + this.labelBulkCntInfo1.BackColor = System.Drawing.Color.Silver; + this.labelBulkCntInfo1.Dock = System.Windows.Forms.DockStyle.Right; + this.labelBulkCntInfo1.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelBulkCntInfo1.Location = new System.Drawing.Point(413, 0); + this.labelBulkCntInfo1.Name = "labelBulkCntInfo1"; + this.labelBulkCntInfo1.Size = new System.Drawing.Size(146, 58); + this.labelBulkCntInfo1.TabIndex = 2; + this.labelBulkCntInfo1.Text = "-"; + this.labelBulkCntInfo1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // labelBulkCntInfo2 + // + this.labelBulkCntInfo2.BackColor = System.Drawing.Color.Silver; + this.labelBulkCntInfo2.Dock = System.Windows.Forms.DockStyle.Right; + this.labelBulkCntInfo2.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelBulkCntInfo2.Location = new System.Drawing.Point(559, 0); + this.labelBulkCntInfo2.Name = "labelBulkCntInfo2"; + this.labelBulkCntInfo2.Size = new System.Drawing.Size(146, 58); + this.labelBulkCntInfo2.TabIndex = 1; + this.labelBulkCntInfo2.Text = "-"; + this.labelBulkCntInfo2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // labelBulkCntInfo3 + // + this.labelBulkCntInfo3.BackColor = System.Drawing.Color.Silver; + this.labelBulkCntInfo3.Dock = System.Windows.Forms.DockStyle.Right; + this.labelBulkCntInfo3.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelBulkCntInfo3.Location = new System.Drawing.Point(705, 0); + this.labelBulkCntInfo3.Name = "labelBulkCntInfo3"; + this.labelBulkCntInfo3.Size = new System.Drawing.Size(146, 58); + this.labelBulkCntInfo3.TabIndex = 0; + this.labelBulkCntInfo3.Text = "-"; + this.labelBulkCntInfo3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // buttonBulkInsertStart + // + this.buttonBulkInsertStart.BackColor = System.Drawing.SystemColors.Control; + this.buttonBulkInsertStart.Dock = System.Windows.Forms.DockStyle.Right; + this.buttonBulkInsertStart.Location = new System.Drawing.Point(1763, 0); + this.buttonBulkInsertStart.Name = "buttonBulkInsertStart"; + this.buttonBulkInsertStart.Size = new System.Drawing.Size(216, 58); + this.buttonBulkInsertStart.TabIndex = 0; + this.buttonBulkInsertStart.Text = "Direct Bulk Insert Try"; + this.buttonBulkInsertStart.UseVisualStyleBackColor = false; + this.buttonBulkInsertStart.Click += new System.EventHandler(this.buttonBulkInsertStart_Click); + // + // panelSub1 + // + this.panelSub1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelSub1.Location = new System.Drawing.Point(0, 650); + this.panelSub1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelSub1.Name = "panelSub1"; + this.panelSub1.Size = new System.Drawing.Size(1979, 94); + this.panelSub1.TabIndex = 14; + // + // panelSub2 + // + this.panelSub2.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelSub2.Location = new System.Drawing.Point(0, 744); + this.panelSub2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panelSub2.Name = "panelSub2"; + this.panelSub2.Size = new System.Drawing.Size(1979, 140); + this.panelSub2.TabIndex = 2; + // + // panel1 + // + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Controls.Add(this.pictureBox3); + this.panel1.Controls.Add(this.pictureBox2); + this.panel1.Controls.Add(this.Title_label); + this.panel1.Controls.Add(this.AlisPictureBox); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1979, 74); + this.panel1.TabIndex = 2; + // + // pictureBox1 + // + this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Left; + this.pictureBox1.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.AppIcon; + this.pictureBox1.Location = new System.Drawing.Point(353, 0); + this.pictureBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(60, 72); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox1.TabIndex = 5; + this.pictureBox1.TabStop = false; + // + // pictureBox3 + // + this.pictureBox3.Dock = System.Windows.Forms.DockStyle.Left; + this.pictureBox3.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.ALIS; + this.pictureBox3.Location = new System.Drawing.Point(220, 0); + this.pictureBox3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.Size = new System.Drawing.Size(133, 72); + this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox3.TabIndex = 4; + this.pictureBox3.TabStop = false; + // + // pictureBox2 + // + this.pictureBox2.Dock = System.Windows.Forms.DockStyle.Right; + this.pictureBox2.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.CI; + this.pictureBox2.Location = new System.Drawing.Point(1770, 0); + this.pictureBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(207, 72); + this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox2.TabIndex = 3; + this.pictureBox2.TabStop = false; + // + // Title_label + // + this.Title_label.BackColor = System.Drawing.Color.White; + this.Title_label.Dock = System.Windows.Forms.DockStyle.Fill; + this.Title_label.Font = new System.Drawing.Font("Times New Roman", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Title_label.Location = new System.Drawing.Point(220, 0); + this.Title_label.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.Title_label.Name = "Title_label"; + this.Title_label.Size = new System.Drawing.Size(1757, 72); + this.Title_label.TabIndex = 2; + this.Title_label.Text = "CP ALIS"; + this.Title_label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.Title_label.DoubleClick += new System.EventHandler(this.label1_DoubleClick); + // + // AlisPictureBox + // + this.AlisPictureBox.Dock = System.Windows.Forms.DockStyle.Left; + this.AlisPictureBox.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.Kefico_CI; + this.AlisPictureBox.Location = new System.Drawing.Point(0, 0); + this.AlisPictureBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.AlisPictureBox.Name = "AlisPictureBox"; + this.AlisPictureBox.Size = new System.Drawing.Size(220, 72); + this.AlisPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.AlisPictureBox.TabIndex = 1; + this.AlisPictureBox.TabStop = false; + // + // fluentDesignFormControl1 + // + this.fluentDesignFormControl1.FluentDesignForm = this; + this.fluentDesignFormControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { + this.barCheckItemShowCpLogTime}); + this.fluentDesignFormControl1.Location = new System.Drawing.Point(0, 0); + this.fluentDesignFormControl1.Name = "fluentDesignFormControl1"; + this.fluentDesignFormControl1.Size = new System.Drawing.Size(1979, 46); + this.fluentDesignFormControl1.TabIndex = 2; + this.fluentDesignFormControl1.TabStop = false; + this.fluentDesignFormControl1.TitleItemLinks.Add(this.barCheckItemShowCpLogTime); + // + // barCheckItemShowCpLogTime + // + this.barCheckItemShowCpLogTime.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.BeforeText; + this.barCheckItemShowCpLogTime.Id = 0; + this.barCheckItemShowCpLogTime.Name = "barCheckItemShowCpLogTime"; + this.barCheckItemShowCpLogTime.CheckedChanged += new DevExpress.XtraBars.ItemClickEventHandler(this.barCheckItemShowCpLogTime_CheckedChanged); + // + // Chktimer + // + this.Chktimer.Interval = 1000; + this.Chktimer.Tick += new System.EventHandler(this.Chktimer_Tick); + // + // UItimer + // + this.UItimer.Interval = 500; + this.UItimer.Tick += new System.EventHandler(this.UItimer_Tick); + // + // notifyIcon + // + this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; + this.notifyIcon.BalloonTipText = "v20230510 Middleware Log Process"; + this.notifyIcon.BalloonTipTitle = "For [ALIS] Middleware Program."; + this.notifyIcon.ContextMenuStrip = this.contextMenuSubStrip; + this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); + this.notifyIcon.Text = "Middleware Log"; + this.notifyIcon.Visible = true; + this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon_MouseDoubleClick); + // + // contextMenuSubStrip + // + this.contextMenuSubStrip.Font = new System.Drawing.Font("Times New Roman", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.contextMenuSubStrip.ImageScalingSize = new System.Drawing.Size(24, 24); + this.contextMenuSubStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripSeparator1, + this.toolStripMenuItemExit}); + this.contextMenuSubStrip.Name = "contextMenuSubStrip"; + this.contextMenuSubStrip.Size = new System.Drawing.Size(207, 42); + this.contextMenuSubStrip.Text = "Menu"; + this.contextMenuSubStrip.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuSubStrip_ItemClicked); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(203, 6); + // + // toolStripMenuItemExit + // + this.toolStripMenuItemExit.BackColor = System.Drawing.Color.Khaki; + this.toolStripMenuItemExit.Name = "toolStripMenuItemExit"; + this.toolStripMenuItemExit.Size = new System.Drawing.Size(206, 32); + this.toolStripMenuItemExit.Text = "Program Exit"; + // + // toolStripComboBox1 + // + this.toolStripComboBox1.Margin = new System.Windows.Forms.Padding(1, 0, 1, 0); + this.toolStripComboBox1.Name = "toolStripComboBox1"; + this.toolStripComboBox1.Size = new System.Drawing.Size(121, 23); + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 22F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1979, 1004); + this.ControlContainer = this.fluentDesignFormContainer1; + this.Controls.Add(this.fluentDesignFormContainer1); + this.Controls.Add(this.fluentDesignFormControl1); + this.FluentDesignFormControl = this.fluentDesignFormControl1; + this.IconOptions.Icon = ((System.Drawing.Icon)(resources.GetObject("MainForm.IconOptions.Icon"))); + this.IconOptions.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.AppIcon1; + this.Name = "MainForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "SystemX.Net.Middleware.UI - Log CPX v240529"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainForm_FormClosed); + this.fluentDesignFormContainer1.ResumeLayout(false); + this.panel2.ResumeLayout(false); + this.panelMain.ResumeLayout(false); + this.panelProcess.ResumeLayout(false); + this.panelRecv.ResumeLayout(false); + this.paneldDBConn.ResumeLayout(false); + this.panelDBPath.ResumeLayout(false); + this.panelFTP.ResumeLayout(false); + this.panel4.ResumeLayout(false); + this.panelDBLongTerm2.ResumeLayout(false); + this.panelDBLongTerm1.ResumeLayout(false); + this.panel7.ResumeLayout(false); + this.panel8.ResumeLayout(false); + this.panel5.ResumeLayout(false); + this.panel6.ResumeLayout(false); + this.panelDBShortTerm2.ResumeLayout(false); + this.panelDBShortTerm1.ResumeLayout(false); + this.panelDBMain2.ResumeLayout(false); + this.panelDBMain1.ResumeLayout(false); + this.panelSubFunc.ResumeLayout(false); + this.panel3.ResumeLayout(false); + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.AlisPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.fluentDesignFormControl1)).EndInit(); + this.contextMenuSubStrip.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormContainer fluentDesignFormContainer1; + private DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl fluentDesignFormControl1; + private System.Windows.Forms.PictureBox AlisPictureBox; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Label Title_label; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Timer Chktimer; + private System.Windows.Forms.Timer UItimer; + private System.Windows.Forms.Panel panelSub2; + private System.Windows.Forms.NotifyIcon notifyIcon; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.PictureBox pictureBox3; + private System.Windows.Forms.ContextMenuStrip contextMenuSubStrip; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExit; + private System.Windows.Forms.ToolStripComboBox toolStripComboBox1; + private System.Windows.Forms.Panel panelSub1; + private System.Windows.Forms.Panel panelSubFunc; + private BarCheckItem barCheckItemShowCpLogTime; + private System.Windows.Forms.Panel panelMain; + private System.Windows.Forms.ProgressBar progressBarProgram; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Panel paneldDBConn; + private System.Windows.Forms.Panel panelDBShortTerm2; + private System.Windows.Forms.Panel panelDBShortTerm1; + private System.Windows.Forms.Label labelDBShortTerm; + private System.Windows.Forms.Panel panelDBMain2; + private System.Windows.Forms.Panel panelDBMain1; + private System.Windows.Forms.Label labelDBMain; + private System.Windows.Forms.Panel panelProcess; + private System.Windows.Forms.RichTextBox richTextBoxProcess; + private System.Windows.Forms.Panel panelRecv; + private System.Windows.Forms.RichTextBox richTextBoxRecv; + private System.Windows.Forms.Button buttonBulkInsertStart; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label labelBulkCntInfo1; + private System.Windows.Forms.Label labelBulkCntInfo2; + private System.Windows.Forms.Label labelBulkCntInfo3; + private System.Windows.Forms.Label labelBulkTime; + private System.Windows.Forms.Panel panelDBPath; + private System.Windows.Forms.Label labelDBPath; + private System.Windows.Forms.Panel panelFTP; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Label labelFTP; + private System.Windows.Forms.Panel panelDBLongTerm2; + private System.Windows.Forms.Panel panelDBLongTerm1; + private System.Windows.Forms.Label labelDBLongTerm; + private System.Windows.Forms.Panel panel7; + private System.Windows.Forms.Panel panel8; + private System.Windows.Forms.Label labelShortTermLogTableName; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.Panel panel6; + private System.Windows.Forms.Label labelShortTermSummaryTableName; + private System.Windows.Forms.Button buttonDbConnect; + private System.Windows.Forms.Label labelFTPTime; + } +} + diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.cs new file mode 100644 index 0000000..9195322 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.cs @@ -0,0 +1,604 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; +using System.Data.SqlTypes; + +using DevExpress.Utils.DPI; +using DevExpress.Utils.Helpers; +using DevExpress.Data; +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using SystemX.Net.Platform.Common.Util; +using SystemX.Net.Platform.Common.ExtensionMethods; + +//using SystemX.Common.Protocol.SIA; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; + +using SystemX.Net.Middleware.Log.Commons; +using SystemX.Net.Platform.SystemX.Common; +using System.Collections.Concurrent; +using SystemX.Net.Comm.IIS_FTP; +using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson; +using SystemX.Net.Platform.SystemX.Net.XEFCore; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + internal class ConnectInfoStore : ICloneable + { + /// + /// Last Query Info + /// + public int nLastQueryTLStepVersion; + public int nLastQueryTLFileNumber; + public int nLastQueryTLVariantNumber; + + public bool bQueryVRFYLoaded; + + public DataSet getLatestStepVer; + public DataSet geyLatestTestListInfo; + + public DataSet dsLatestVRFYRel; + public DataSet dsLongTermLatestVRFYRel; + + public object Clone() + { + return this; + } + + public void Initialize() + { + nLastQueryTLStepVersion = int.MinValue; + nLastQueryTLFileNumber = int.MinValue; + nLastQueryTLVariantNumber = int.MinValue; + + bQueryVRFYLoaded = false; + + getLatestStepVer = null; + geyLatestTestListInfo = null; + + dsLatestVRFYRel = null; + dsLongTermLatestVRFYRel = null; + } + + public void InitVRFYStatus() + { + nLastQueryTLStepVersion = int.MinValue; + nLastQueryTLFileNumber = int.MinValue; + nLastQueryTLVariantNumber = int.MinValue; + + bQueryVRFYLoaded = false; + + getLatestStepVer = null; + geyLatestTestListInfo = null; + + dsLatestVRFYRel = null; + dsLongTermLatestVRFYRel = null; + } + + public ConnectInfoStore() + { + nLastQueryTLStepVersion = int.MinValue; + nLastQueryTLFileNumber = int.MinValue; + nLastQueryTLVariantNumber = int.MinValue; + + bQueryVRFYLoaded = false; + + getLatestStepVer = null; + geyLatestTestListInfo = null; + + dsLatestVRFYRel = null; + dsLongTermLatestVRFYRel = null; + } + } + + private const int SC_CLOSE = 0xF060; + private const int MF_ENABLED = 0x0; + private const int MF_GRAYED = 0x1; + private const int MF_DISABLED = 0x2; + + [DllImport("user32.dll")] + private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); + + [DllImport("user32.dll")] + private static extern int EnableMenuItem(IntPtr hMenu, int wIDEnableItem, int wEnable); + + private const int MF_BYCOMMAND = 0x00000000; + + [DllImport("user32.dll")] + public static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags); + + [DllImport("kernel32.dll", ExactSpelling = true)] + private static extern IntPtr GetConsoleWindow(); + + /// + /// Base Variable + /// + private const int ALL_MANAGE_NUM = 110; + + private const int PORT_DISTRIBUTION_NUM = 10; + + private COMMON.LogProcessInfo LoadInfo; + + private bool MiddlewareLogStartState { set; get; } + + private bool bShowCpLogProcessTime { set; get; } = false; + + //RecvCommandQueue Task + private Stopwatch stCheckReleaseTime; + + private Task taskRecvCommandProcess; + private bool m_bTaskCommandBlock; + + //RecvStreamQueue Task + private Task taskRecvStreamProcess; + private bool m_bTaskStreamBlock; + // + CancellationTokenSource CTS; + CancellationToken CT; + // + private static bool bTaskCommandWaitLock = false; + private static bool bTaskStreamWaitLock = false; + // + //DataBase + private XLogDBConnManager MngDBLogConn; + + private ConnectInfoStore[] thisConnInfo; + + public ConcurrentQueue[] LogDataQueue; + + public ConcurrentQueue LogDataRecvText; + public ConcurrentQueue LogDataProcessText; + + private MapLogOption OptionMapLog; + + private CMapParameter ParamterMapLog; + private CMapParameter ParamterMapInfoLog; + + Int64 nEnqueueCount; + Int64 nDequeueCount; + + private static object objMappedLogDataInOutLock = new object(); + + private static object objMappedLogTextInOutLock = new object(); + private static object objMappedProcessTextInOutLock = new object(); + + private bool[] bBeforeLogReadyState; + private bool[] bCompareLogReadyState; + + // TODO : for Bulk Insert Log + private Stopwatch stCheckTermBulkWaitTime; + + private List lstBulkTermLogInfo; + private List lstBulkShortTermLog; + private List lstBulkLongTermLog; + + private bool bTryBulkInsertBuffer { set; get; } = false; + private int nBulkLogCount { set; get; } = 0; + private int nBulkShortTermCount { set; get; } = 0; + private int nBulkLongTermCount { set; get; } = 0; + private long nBulkTimeValue { set; get; } = 0; + private long nFTPTimeValue { set; get; } = 0; + private bool bDatabaseConnResult { set; get; } = false; + + public object GetConnectInfo(int iPos) + { + return thisConnInfo[iPos]; + } + + public XLogDBConnManager GetDBConn() + { + return MngDBLogConn; + } + + /// + /// TimerLock + /// + private enum TIMER_LOCK + { + CHK_TIMER = 0, + UI_TIMER = 1, + } + + private bool[] m_bTimerLock; + // + private static object objMainCommandWait = new object(); + private static object objShortTermCommandWait = new object(); + private static object objLongTermCommandWait = new object(); + + private static object objMainStreamWait = new object(); + private static object objShortTermStreamWait = new object(); + private static object objLongTermStreamWait = new object(); + + private static object objExcuteMainCommandWait = new object(); + private static object objExcuteShortTermCommandWait = new object(); + private static object objExcuteLongTermCommandWait = new object(); + + private static object objExcuteMainStreamWait = new object(); + private static object objExcuteShortTermStreamWait = new object(); + private static object objExcuteLongTermStreamWait = new object(); + // + //private static object objSingleTransactionDataAccessWait = new object(); + + private static object objClearServerInstanceWait = new object(); + + // TODO : FTP ALIS + public eFTPServiceStatus StateFTP { set; get; } = eFTPServiceStatus.None; + + private CtrlFTP ControlFTP; + + private Stopwatch stProcessCheckFTPTime; + + // TODO : SHM JSON + //private XEFCore CpxShorTermLogJson; + public MainForm()//(XEFCore cpxShorTermLogJson) + { + //CpxShorTermLogJson = cpxShorTermLogJson; + + InitializeComponent(); + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + + @"Use CP-Server[X] Middleware [LOG] Version for [CPXV2][v240529] " + + "[SystemX.Net.Middleware.Log : MainForm]", ConsoleColor.Green, LogMessageLevel.FATAL); + // + EnableMenuItem(GetSystemMenu(this.Handle, false), SC_CLOSE, MF_GRAYED); + + IntPtr hMenu = GetSystemMenu(GetConsoleWindow(), false); + //EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); + DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND); + + ConsoleUtil.ConsoleHide(); + + MessageOutput.PrintLogLevel = LogMessageLevel.INFO; + + nEnqueueCount = 0; + nDequeueCount = 0; + + bBeforeLogReadyState = new bool[SharedMemory.nMaxInfoFullAccessSize]; + bCompareLogReadyState = new bool[SharedMemory.nMaxInfoFullAccessSize]; + + CTS = new CancellationTokenSource(); + CT = CTS.Token; + // + string strExcutePos = Environment.CurrentDirectory; + string strServerInfoPos = strExcutePos + @"\Configure\LogInformation.xml"; + string strDBInfoPos = strExcutePos + @"\Configure\DBConnInfo.xml"; + string strMapLogOptionPos = strExcutePos + @"\Configure\MapLogOption.xml"; + + LoadInfo = new COMMON.LogProcessInfo(strServerInfoPos); + + MiddlewareLogStartState = true; + + OptionMapLog = new MapLogOption(strMapLogOptionPos); + + if (OptionMapLog.Load() == false) + { + MiddlewareLogStartState = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to load map-log option information. [SystemX.Net.Middleware.UI.Log : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + return; + } + else + { + ParamterMapLog = new CMapParameter(); + ParamterMapInfoLog = new CMapParameter(); + + ParamterMapLog.strSetEnterMutexName = OptionMapLog.strMapLogEnterMutexName; + ParamterMapLog.strSetAccessMutexName = OptionMapLog.strMapLogAccessMutexName; + ParamterMapLog.strSetPath = OptionMapLog.strMapLogPath; + ParamterMapLog.strSetFileName = OptionMapLog.strMapLogFileName; + ParamterMapLog.strSetMapName = OptionMapLog.strMapLogName; + + ParamterMapInfoLog.strSetEnterMutexName = OptionMapLog.strMapInfoLogEnterMutexName; + ParamterMapInfoLog.strSetAccessMutexName = OptionMapLog.strMapInfoLogAccessMutexName; + ParamterMapInfoLog.strSetPath = OptionMapLog.strMapInfoLogPath; + ParamterMapInfoLog.strSetFileName = OptionMapLog.strMapInfoLogFileName; + ParamterMapInfoLog.strSetMapName = OptionMapLog.strMapInfoLogName; + } + + if (LoadInfo.Load() == false) + { + MiddlewareLogStartState = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to load server information. [SystemX.Net.Middleware.UI.Log : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + return; + } + else + { + string strGetTitle = this.Text; + + //this.Text = strGetTitle + " " + (LoadInfo.LOOP_BACK ? " [LocalHost]" : " [" + LoadInfo.SERVER_IP + "]"); + + Title_label.Text = "CP ALIS" + ((LoadInfo.TITLE.Length > 0) ? " [" + LoadInfo.TITLE + "]" : ""); + } + + thisConnInfo = new ConnectInfoStore[ALL_MANAGE_NUM]; + LogDataQueue = new ConcurrentQueue[ALL_MANAGE_NUM]; + + LogDataRecvText = new ConcurrentQueue(); + LogDataProcessText = new ConcurrentQueue(); + + for (int i = 0; i < ALL_MANAGE_NUM; i++) + { + thisConnInfo[i] = new ConnectInfoStore(); + LogDataQueue[i] = new ConcurrentQueue(); + } + + MngDBLogConn = new XLogDBConnManager(); + MngDBLogConn.SetConfigFilePath(strDBInfoPos, true); + + string strGetFileName = Path.GetFileName(MngDBLogConn.GetConfigFilePath()); + string strGetFilePath = Path.GetDirectoryName(MngDBLogConn.GetConfigFilePath()).Split('\\').Last(); + + labelDBPath.Text = @"\" + strGetFilePath + @"\" + strGetFileName; + + bDatabaseConnResult = MngDBLogConn.OpenConnection(); + + if (bDatabaseConnResult) + { + labelDBMain.Text = "Information [" + MngDBLogConn.GetDBConnectInfo().ConnMain.SCHEMA + "]"; + labelDBShortTerm.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SCHEMA + "]"; + labelShortTermSummaryTableName.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE + "]"; + labelShortTermLogTableName.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE + "]"; + labelDBLongTerm.Text = "LongTerm [" + MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SCHEMA + "]"; + + panelDBMain2.BackColor = Color.LimeGreen; + panelDBShortTerm2.BackColor = Color.LimeGreen; + panelDBLongTerm2.BackColor = Color.LimeGreen; + + //옵션 확인 및 ON + //DECLARE @ARITHABORT VARCHAR(3) = 'OFF'; IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON'; SELECT @ARITHABORT AS ARITHABORT; + string strGetQuery1 = "DECLARE @ARITHABORT VARCHAR(3) = 'OFF'; IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON'; SELECT @ARITHABORT AS ARITHABORT;"; + string strGetQuery2 = "DECLARE @ARITHIGNORE VARCHAR(3) = 'OFF'; IF ( (128 & @@OPTIONS) = 128 ) SET @ARITHIGNORE = 'ON'; SELECT @ARITHIGNORE AS ARITHIGNORE;"; + /* + SET ARITHIGNORE ON + + - 쿼리 실행 중 오버플로 또는 0으로 나누기 오류에서 오류 메시지를 반환할지 여부를 제어 + +  오류 메시지가 반환될지 여부만 제어하며 이 설정에 상관 없이 오버플로 또는 0으로 나누기 오류를 +  발생시킨 계산에 NULL을 반환한다. 없는 값 처리를 해야하므고 오류를 발생시킨 것에서 null 반환을 받아야 한다! + + SET ARITHABORT ON이면 오버플로 또는 0으로 나누기 오류 발생 시 쿼리나 일괄 처리가 종료 +  트랜잭션에서 해당 오류가 발생하면 트랜잭션이 롤백시킨다. 그러나 이 설정이 INSERT, UPDATE, DELETE 문 실행 중에 +  발생한 오류에는 영향을 주지 않는다. + */ + DataSet ds1 = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet(strGetQuery1); + DataSet ds2 = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet(strGetQuery2); + + if (XCommons.isHasRow(ds1)) + { + bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet("SET ARITHABORT ON"); + } + if (XCommons.isHasRow(ds2)) + { + bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet("SET ARITHIGNORE ON"); + } + // + ds1 = MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet(strGetQuery1); + ds2 = MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet(strGetQuery2); + + if (XCommons.isHasRow(ds1)) + { + bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet("SET ARITHABORT ON"); + } + if (XCommons.isHasRow(ds2)) + { + bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet("SET ARITHIGNORE ON"); + } + // + ds1 = MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet(strGetQuery1); + ds2 = MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet(strGetQuery2); + + if (XCommons.isHasRow(ds1)) + { + bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet("SET ARITHABORT ON"); + } + if (XCommons.isHasRow(ds2)) + { + bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false; + + if (bOptionState == false) + MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet("SET ARITHIGNORE ON"); + } + + if (MiddlewareLogStartState == false) + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"The table registered in the configuration file does not exist in the actual database. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + else + { + panelDBMain2.BackColor = Color.Red; + panelDBShortTerm2.BackColor = Color.Red; + panelDBLongTerm2.BackColor = Color.Red; + + MiddlewareLogStartState = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to connect to DB and to get table information. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + return; + } + + m_bTimerLock = new bool[10]; + Array.Clear(m_bTimerLock, 0, 10); + + if (LoadInfo.FTP_Use) + { + panelFTP.Visible = true; + labelFTP.Text = "FTP " + IPAddress.Parse(LoadInfo.FTP_IPAddress).ToString() + "@" + LoadInfo.FTP_Port + "@" + LoadInfo.FTP_Account; + labelFTPTime.Visible = true; + + StateFTP = StartFTPService(); + + if (StateFTP == eFTPServiceStatus.Connected) + { + stProcessCheckFTPTime = new Stopwatch(); + stProcessCheckFTPTime.Start(); + + panelFTP.BackColor = Color.LimeGreen; + } + else + { + if (MessageBox.Show("FTP server connection is not confirmed. Do you still want to proceed with running the middleware log handler?", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + MiddlewareLogStartState = false; + + panelFTP.BackColor = Color.Red; + } + } + else + StateFTP = eFTPServiceStatus.Unused; + + if (MiddlewareLogStartState) + { + stCheckTermBulkWaitTime = new Stopwatch(); + + lstBulkTermLogInfo = new List(); + lstBulkShortTermLog = new List(); + lstBulkLongTermLog = new List(); + + stCheckReleaseTime = new Stopwatch(); + stCheckReleaseTime.Start(); + + taskRecvCommandProcess = null; + m_bTaskCommandBlock = false; + + taskRecvCommandProcess = new Task(new Action(WatchRecvCommandQueue), CT); + taskRecvCommandProcess.Start(); + // + taskRecvStreamProcess = null; + m_bTaskStreamBlock = false; + + taskRecvStreamProcess = new Task(new Action(WatchRecvStreamQueue), CT); + taskRecvStreamProcess.Start(); + // + UItimer.Enabled = true; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"MiddlewareUI start success. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.White, LogMessageLevel.INFO); + } + + Chktimer.Enabled = true; + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (MiddlewareLogStartState == true) + { + if (MessageBox.Show("You want to program exit?", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + e.Cancel = true; + else + e.Cancel = false; + } + else + e.Cancel = false; + } + + private void MainForm_FormClosed(object sender, FormClosedEventArgs e) + { + CTS.Cancel(); + + if (taskRecvCommandProcess != null) + { + m_bTaskCommandBlock = true; + + taskRecvCommandProcess.Wait(); + taskRecvCommandProcess.ContinueWith(t => { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + + @"taskRecvCommandProcess END. [SystemX.Net.MiddlewareUI : MainForm.MainForm_FormClosed]", + ConsoleColor.White, + LogMessageLevel.DEBUG); + }); + } + + if (taskRecvStreamProcess != null) + { + m_bTaskStreamBlock = true; + + taskRecvStreamProcess.Wait(); + taskRecvStreamProcess.ContinueWith(t => { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + + @"taskRecvStreamProcess END. [SystemX.Net.MiddlewareUI : MainForm.MainForm_FormClosed]", + ConsoleColor.White, + LogMessageLevel.DEBUG); + }); + } + } + + private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (this.Visible) + this.Visible = false; + else + this.Visible = true; + } + + private void label1_DoubleClick(object sender, EventArgs e) + { + ConsoleUtil.ConsoleVisibleControl(); + } + + private void contextMenuSubStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + ToolStripItem tsi = e.ClickedItem; + + this.Close(); + } + + private void barCheckItemShowCpLogTime_CheckedChanged(object sender, ItemClickEventArgs e) + { + bShowCpLogProcessTime = barCheckItemShowCpLogTime.Checked; + } + + private void buttonBulkInsertStart_Click(object sender, EventArgs e) + { + if (bTryBulkInsertBuffer == false) + bTryBulkInsertBuffer = true; + } + + private void buttonDbConnect_Click(object sender, EventArgs e) + { + bDatabaseConnResult = MngDBLogConn.CheckDatabaseConnection(); + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.resx b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.resx new file mode 100644 index 0000000..61edbda --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.resx @@ -0,0 +1,973 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA + IACoJQAA7h4AAAAAAAABACAAQUMAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAADDDgAAww4AAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAA + AAQAAAAEAAAABAAAAAQAAAACAAAAAQAAABIAAAAmAAAALQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAA + AC0AAAAtAAAALQAAAC0AAAAqAAAAGwAAAAfQz8+MsK+uo6urq6urq6urrKysq6ysrKusrKyrrKysq6ys + rKusrKyrrKysq6usrKusrKysoKCgoC4uLk0AAAAS+vj4/76onf/p4t7//Pr6//Pv7v/28/H/9fLw//Pu + 7P/z7+3/8+7s//Lu7P/39PP//////+/v7+9NTU1mAAAAF//////BrKL/tp6S/9bIwv+RbVv/rpOG/5t6 + av+ggXL/nXxs/6GBcv+lhnj/o4V2/9fJw//w8PDvTExMZwAAABf/////7+rn/5x7bP/bz8n/m3lp/8i2 + rf+beWn/6eLf/6qOgP/Vx8H/4dfT/6qOgP+vlIb/7/Dw701NTWcAAAAX//////////+8pZv/jmhW/6uP + gf/o4d3/nXxs//Tx7/+1nZH/x7Wr/5t5af+0m4//6ODc//Dw8O9MTExnAAAAF///////////6+Th/4lh + Tv/Zzcb/7ujl/6KCc//18vH/uLTg/8m/yv+cemn/uKGW/7ylmv/Uy8buUlNUYwAAABX///////////38 + /P/e087/+fj3//v5+P/o4Nz//Pz8/+Hg9v/z8vr/5dzX/9HCuv/Sw7z/493Z6WxtbkoAAAAN////Y/// + /2P///9j////Y////2P///9j////Y////2P///9j////Y////2P///9j////ZPr6+lmbm5sUAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP//AAD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD//wAA//8AAP//AAAoAAAAGAAAADAAAAABACAAAAAAAAAJAADDDgAAww4AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA + AAQAAAAFAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA + AAYAAAAGAAAABgAAAAYAAAAFAAAABAAAAAIAAAAAAAAACwAAABYAAAAeAAAAIQAAACEAAAAhAAAAIQAA + ACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAeAAAAFgAA + AAoAAAADDg4OHwcHBzsFBgZQBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUF + BVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVQAQEBOgAAABsAAAAH6+vrstnZ2cDPz8/KzMzMzcvL + y83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzczM + zM6/v7+/NDQ0ZAAAACkAAAAL/////+Tb1v+4n5P/8u3r//////////////////////////////////// + ///////////////////////////////////////////////////v7+/vRkZGdQAAAC8AAAAN/////+zm + 4/+EW0f/wKug///////g1dD/xrOq/8i1rP/azcj/0MC4/8azqv/Gs6r/xrOq/8ezq//Gs6r/xrOq/8az + qv/Zzcb/+ff2///////u7u7vREREdwAAADAAAAAO//////////+5oZb/imNQ/+/q5/+2npL/gVdD/3BB + Kv+8ppv/gFZB/4NZRv+Qa1r/i2VS/4piUP+Qaln/kGpa/5BrWf+DWkb/spiL//38/P/v7+/vREREdwAA + ADAAAAAO///////////r5OH/glhF/8Swp//6+fj/poh6/5FsW//j2tX/gVVB/8y6sv/8+vr/u6Sa/6WI + ef/28/H/+fj3//by8f+3n5P/g1lF//Pv7P/v8PDvREREdwAAADAAAAAO////////////////r5WI/49p + V//c0Mr/gVdD/8u6sv/u6Ob/gFVB/9DAuf//////rZOG/5FuXP/08O//vqid/5ZzY/9/Uz//pYd4//z7 + +v/v7+/vREREdwAAADAAAAAO////////////////5NvX/39UP/+EW0b/jWZU//Xx8P/t5+T/gFVB/9DA + uf//////wayg/62Rgf/SxLz/e1A6/7Sajv/Sw7v/9fHw///////u7u7vREREdwAAADAAAAAO//////// + /////////v39/6uOgf9nNRz/wq2k///////s5uP/f1M//9C/uP//////y8jm/7+64v/UxsD/f1VA/8e0 + q//XysP/1Ma//9rNx//o5uXuRkZGdQAAAC4AAAAN/////////////////////93SzP+Vc2H/8Ovo//// + ///y7ev/o4R1/93SzP//////s7Hm/5mX3v/18vL/tZyQ/41nVP+LZFL/imRR/5p4Z//f2dbsT1BRaQAA + ACgAAAAL//////////////////////r5+P/q5OD//v7+///////+/v7/+/n4//39/P//////+/v+//r6 + /f///////v39//bz8f/08O7/9PDu//bz8f/19PToampqTQAAABgAAAAH////jv///47///+O////jv// + /47///+O////jv///47///+O////jv///47///+O////jv///47///+O////jv///47///+O////jv// + /4/7+/t+lpaWHgAAAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8AKAAAACAA + AABAAAAAAQAgAAAAAAAAEAAAww4AAMMOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAFAAAABwAAAAcAAAAHAAAABwAA + AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA + AAcAAAAHAAAABwAAAAcAAAAHAAAABgAAAAUAAAADAAAAAQAAAAAAAAAIAAAADwAAABUAAAAZAAAAGwAA + ABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAA + ABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABoAAAAYAAAAEwAAAAwAAAAFAAAAAgAAABIAAAAiAAAAMwAA + ADwAAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAA + AD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPgAAADoAAAAvAAAAHQAAAA0AAAAEZmZmLkND + Q0cxMTFgKysrbikpKXIpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykp + KXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMqKipxJycnaQgICE8AAAAwAAAAFQAA + AAf39/fU8PDw2urr6+Dn6Ojk5eXl5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk + 5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5ebm5ubX19fVOzs7cAAA + AD0AAAAbAAAACf/////8+vr/zr61/8e0qv/39PP///////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+/v + 7+5DQ0N8AAAAQwAAAB4AAAAK//////7+/v+0m4//bz8n/86+tv////////////v6+f/49fT/+PX0//j1 + 9P/6+Pf/+ff2//j29P/49vT/+Pb0//j19P/49fT/+Pb0//j29P/49fT/+PX0//j29f/+/f3///////// + ////////7u7u7kFBQX4AAABEAAAAHgAAAAr//////////+ff3P99UT3/lHFf//f08//59/b/rpOF/45o + Vv+Ra1r/lHBf/8e0q/+ihHT/j2tY/49pWP+PaVf/j2lY/5BqWP+Qaln/kGlY/49pWP+PaVj/kWxa/7KX + iv/o4N3////////////u7u7vQUFBfgAAAEQAAAAeAAAACv///////////v7+/7KYjf9wQCn/08S9//Ht + 6/+jhXb/jGZU/2k3H/+AV0L/18rD/3xQO/90RjD/k29f/5RwYP+SbVz/jWhV/5JtXP+UcWD/lHBg/5Vw + YP+SbVz/dUcw/49pV//v6uf//////+7u7u9BQUF+AAAARAAAAB4AAAAK////////////////5dzY/3lN + OP+YdmX/+PX0//38+//EsKf/bTwl/7efk//s5uP/e086/5p3Z//49vT//Pv7/9HCu/+Palj/1Ma///z7 + +//7+vr//fz8//z7+v+zmY3/bTwk/9TGvv//////7u7u70FBQX4AAABEAAAAHgAAAAr///////////// + ///9/Pz/qIt9/3FBKv/ZzMb/9vPx/49qWP9/VED/6uPg/+3o5f97Tjr/nHlq//z7+///////xbOq/2o5 + If/KubD///////Hs6v/Yy8X/vqmf/41mVP91Ri//4NXQ///////u7u7vQUFBfgAAAEQAAAAeAAAACv// + ///////////////////e087/dEUv/55+bv/Jt67/bz8o/7WckP//////7Obj/3tPOv+beWr//Pv7//// + ///Fs6n/ajkg/8q6sf/s5uP/kW1b/3FBKv9xQSr/fFA7/7efk//6+fj//////+7u7u9BQUF+AAAARAAA + AB4AAAAK//////////////////////r5+P+ff3D/bz8n/3tPN/95TDb/49rV///////s5uP/e086/5t5 + av/8+/v//////9TGvv+Ra1X/2c3F/8e2rf9tPCT/sJWI/9zQyv/r5OH//fz8////////////7u7u70FB + QX4AAABEAAAAHgAAAAr//////////////////////////9nMxv9zRC7/ZDEY/6mMfv/9/Pv//////+zm + 4/97Tzr/m3lq//z7+///////6ujz/8C63v/y8fn/yLWs/29AKP/Esaf/8Ovp/+/q5//u6OX/7ejk//Tx + 7//u7u7uQkJCfAAAAEMAAAAeAAAACv//////////////////////////+vj3/5p5aP91SDL/4NbR//// + ////////7ebk/31RPP+ce2v//Pv7//////+6uOj/QTzA/8bE7f/s5N//jGZT/3JELf98UT3/fVI9/31S + Pf98UDr/qY19/+zr6u1GRkZ2AAAAPwAAABwAAAAJ////////////////////////////////zb20/6+V + h//8+/r////////////49fT/zLuz/9jMxf/+/v3//////+bm9/+tq+T/6ur4///////r5eL/wq6k/7GY + iv+xl4v/sZiL/7CWif/NvbT/8PDv61FRUWYAAAAzAAAAFwAAAAf///////////////////////////// + ///6+Pf/9vPx//////////////////////////////////////////////////////////////////// + ///////////////////////////////////39/fnbGxsTQAAAB8AAAAOAAAABf///7b///+2////tv// + /7b///+2////tv///7b///+2////tv///7b///+2////tv///7b///+2////tv///7b///+2////tv// + /7b///+2////tv///7b///+2////tv///7b///+2////t/v7+6KUlJQoAAAACwAAAAYAAAAC////Bv// + /wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G////Bv// + /wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G/v7+BdPT0wEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + ////////////////////////AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////////////////////////////ygA + AAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAA + AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA + AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA + AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAABAAA + AAUAAAAHAAAACAAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA + AAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAgAAAAHAAAABQAAAAQAAAACAAAAAQAA + AAAAAAAFAAAACQAAAA0AAAARAAAAEwAAABUAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAA + ABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAA + ABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFQAAABMAAAARAAAADQAA + AAkAAAAFAAAAAwAAAAEAAAAKAAAAEQAAABoAAAAhAAAAJgAAACkAAAAqAAAAKwAAACsAAAArAAAAKwAA + ACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAA + ACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAAqAAAAKQAA + ACYAAAAhAAAAGgAAABEAAAAKAAAABQAAAAIAAAARAAAAHAAAACsAAAA3AAAAPwAAAEQAAABGAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAA + AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAA + AEcAAABGAAAARAAAAD8AAAA3AAAAKwAAAB0AAAAQAAAACAAAAAMAAAAVAAAAJQAAADkAAABLAAAAVwAA + AF4AAABhAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAA + AGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAA + AGIAAABiAAAAYgAAAGIAAABhAAAAXgAAAFgAAABNAAAAPAAAACkAAAAXAAAACwAAAATW1tZswMDAeaur + q4ibm5uVkpKSn42OjqSMjIymi4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uL + i6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uL + i6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eMjIymjo6OpIWFhZgfHx9mAAAASgAAADIAAAAdAAAADQAA + AAb+/v78/v7+/P7+/vz+///9/////f7+//39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/v7+/u3t7etFRUV9AAAAUwAA + ADkAAAAgAAAADwAAAAb///////////z7+//j2tX/2MvE/+Xc2P/9/Pz///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+7u + 7u1DQ0OCAAAAWAAAADwAAAAiAAAAEAAAAAf///////////v6+v+1nJD/dUcw/4ZeSf/f1M////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+3t7e1CQkKEAAAAWQAAAD0AAAAjAAAAEQAAAAf////////////////bz8n/eEo1/2Y0 + G/+zmYz//fz8//////////////7+//v5+f/6+Pf/+vj3//r49//6+Pf/+vj3//z7+//7+fn/+vj3//r4 + 9//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf//Pv7//// + /////////////////////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf///////////// + ///59/b/pod5/2czG/+BVkL/5NvW////////////7ejl/6uPgf+efW7/n35w/59+cP+efW//p4p9/9jL + xf+wl4n/nn9u/5+AcP+ff2//nn5v/59+b/+ffm//n35v/59+b/+ff3D/oH9w/6B/cP+ffnD/n35w/59+ + cP+efm7/r5SH/9fJw//28/H//////////////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAA + AAf/////////////////////2s7I/3hLNv9oNh3/s5mM//38+///////wa6j/2s6Iv9lMRn/ZTMa/2Yz + G/9lMhn/lHFf/9zRy/+AVkH/ZTEY/2YyGv9lMhr/ZTEZ/2UxGf9lMhr/ZjIa/2YyGv9mMhr/ZjIa/2Uy + Gv9lMhr/ZjEa/2YxGv9lMhn/aDUc/3RFL/+ninz/8Ozp/////////////////+3t7e5BQUGFAAAAWgAA + AD4AAAAjAAAAEQAAAAf/////////////////////+ff2/6WHef9mMxv/hFtI/+nh3v/+/v7/zLyz/6aJ + ev+ninz/hl5L/2c0G/9uPyf/yLat/+vl4v+BVkL/ZjIa/4ZeSv+niXz/p4l8/6eKe/+miXv/o4R1/6KD + dP+khnn/p4p8/6eKfP+ninz/p4l8/6eKfP+ninz/lXFg/207JP9qOSD/tp6R//38+////////////+3t + 7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf//////////////////////////9fJxP90RjD/aTcf/7ig + lf/+/f3//v79//7+/f/r5eL/jmZV/2UxGP+Qa1n/8Ozq/+zl4v+BVkL/ZjIZ/7CVif/8/Pv//f38//79 + /f/u6OX/qY1//5t7av/Ov7f//f39//39/P/9/fz//fz8//39/P/+/v3/8ezq/5l2Zv9kMRf/jmhV//Lu + 7P///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf///////////////////////////bz + 8v+ce2z/ZTAY/4ZcSf/r5eH////////////Fsaj/bTwk/209Jv/Fsqn//////+vk4f+AVUL/ZjEZ/7GW + iv/+/v7////////////m39v/e1A7/2UzGv+2n5P////////////////////////////8+/v/9PDu/59+ + bv9kMBf/imRQ//Ht6v///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf///////////// + ///////////////////Mu7P/cUAo/2w6Iv/DrqX//////+/q5/+Palj/ZTIZ/49qWP/v6uj//////+vk + 4f+AVkL/ZjIa/7GWiv/+/v7////////////m39v/fFE7/2Y1G/+2n5T////////////28/H/28/J/8e1 + rP+qjoH/lXJh/3NDLf9mMxr/qo1///v6+v///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAA + AAf////////////////////////////////z7+3/lHFf/2UwF/+MZVL/7Obk/86+t/9vPyj/bz4m/8Wy + qP///////////+vk4f+AVkL/ZjIa/7GWi//+/v7////////////m39v/fFE7/2Y1G/+2oJT///////Lu + 7P+qjX7/dkkx/2o5Iv9lMRj/ZTEY/2k2Hv+JYU3/3tTO/////////////////+3t7e5BQUGFAAAAWgAA + AD4AAAAjAAAAEQAAAAf/////////////////////////////////////xbGo/207JP9sOiL/sZaJ/5d1 + Y/9lMRj/iWFP/+3n5f///////////+vk4f+AVkL/ZjIZ/7GWiv/+/v7////////////m3tr/ek85/2Qy + GP+2npL//////8Kvpf9tPCT/ZzUc/35TP/+Tblz/oYBw/7qjmP/n4Nz//v79/////////////////+3t + 7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf/////////////////////////////////////7ujl/4xl + U/9lMxn/c0Mq/2s6If9pNx7/tJuP//38+////////////+vk4f+BVkL/ZjIZ/7GWiv/+/v7///////// + ///u6eb/pYZ1/5ZyXv/NvLP//f39/6yShf9lMhj/imJP/9/V0P/18vD/+vj4///+/v////////////// + /////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf///////////////////////////// + /////////////8OupP9uOyT/ZjIa/2UyGv+BV0P/5dzY/////////////////+vk4f+BVkL/ZjIa/7GW + iv/+/v7////////////9/f3/6+jv/+Xh6//6+Pj//v39/62Thv9kMRj/lnNj//Pv7f////////////// + /////////////////////////////+3t7e1CQkKEAAAAWQAAAD0AAAAjAAAAEQAAAAf///////////// + /////////////////////////////+7n5f+MZFP/ZTIa/2g3H/+zmY3//Pz7/////////////////+vk + 4f+BVkP/ZjIZ/7GWiv/+/v7////////////t7fn/f3vU/2ZhzP/Qz/D//////8Owpv9rOyL/bj4m/55+ + bv+6o5j/uqSZ/7qkmf+6pJj/u6SZ/7qkmP/Dr6X/9PDu/+7u7+1DQ0OBAAAAVwAAADsAAAAiAAAAEAAA + AAf////////////////////////////////////////////+/v+6o5f/aDYe/39WQf/k3Nf///////// + /////////////+vk4f+BVkL/ZjIZ/7GXiv/+/v7////////////g3/T/SUTC/ygit/+in+D///////Dq + 6P+ignT/bT0l/2YzGv9lMxr/ZTIa/2YyGv9mMxr/ZjMa/2UxGP94SzP/49rU//Dx8exHR0d7AAAAUQAA + ADgAAAAgAAAADwAAAAb////////////////////////////////////////////////i2dP/f1ZA/66U + h//8+/v///////////////////////Tx7/+7pJn/rJGD/9THv////v7////////////39/z/pKLh/4aC + 1//f3vT////////////y7uz/yLas/6SGdf+Vc2D/lXNh/5ZzYv+Vc2H/lXNh/5RyYP+kh3b/7ujl//Hy + 8upOTk5wAAAARwAAADEAAAAcAAAADQAAAAX///////////////////////////////////////////// + ///7+fj/ybiu/+be2f/////////////////////////////////+/v7//v7+///+/v////////////// + /////////Pv+//r6/f////////////////////////////r5+P/29PL/9vTy//b08v/29PL/9vTy//b0 + 8v/49vX////+//T09OdbW1tfAAAANwAAACYAAAAWAAAACgAAAAT///////////////////////////// + /////////////////////////f39//7+/v////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////f39+Rzc3NMAAAAJQAAABoAAAAPAAAABwAAAAP////v////7/// + /+/////v////7////+/////v////7////+/////v////7////+/////v////7////+/////v////7/// + /+/////v////7////+/////v////7////+/////v////7////+/////v////7////+/////v////7/// + /+/////v////7////+/////v////7////+/////v////8fr6+tOVlZU3AAAAFAAAAA8AAAAJAAAABAAA + AAL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv// + /zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv// + /zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mvv7+yyrq6sKAAAAAwAA + AAIAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// + AAD///////8AAP///////wAA////////AAD///////8AAIAAAAAABwAAAAAAAAABAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAQAA////////AAD///////8AAP///////wAA////////AAD///////8AAP// + /////wAA////////AAD///////8AAP///////wAA////////AACJUE5HDQoaCgAAAA1JSERSAAABAAAA + AQAIBgAAAFxyqGYAAEMISURBVHja7b3ZdhtJmuf5N9+xryS4SJQUERmZVVk1PefMe9SD1HNNv0df1Nz1 + nJrpqsrMyAiFJO7Yd9/NrC/MHXA4HRtJkRRlPx0IgNPhMHe4ffbZtxkgkUgkEolEIpFIJBKJRCKRSCQS + iUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKR + SCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJ + RCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFI + JBLJU0I45/y5GyGRfG9wzn3Hcf7Hx48f//u//uu//o9/+7d/GwHQAZB4l9SDZWyLH1jzOvl+5evjF9pz + XwiJ5DuGMMbAGCMQHT9+pOFrtif/jmifvQZ0KQAkkmeCc44wDJUgCBQAavSIO3Fy5FdS79ceMvGaZGy7 + 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 + + + + 17, 17 + + + 123, 21 + + + 220, 24 + + + 329, 28 + + + + AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA + AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyexsbsnsbq7J7G+eyexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb57J7G6uyexsbAAAAALJ7Gyqyexvtsnsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexvtsnsbKrJ7 + G66yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsbrrJ7G/C3fxz/z5Yi/9mgJf/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k + Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k + Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k + Jv/dpCb/2aAl/8+WIv+3fxz/snsb87mCHf/boSX/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k + Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k + Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k + Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/boSX/uYId/9CYI//epSb/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/0Jgj/9ujJv/epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3KMm/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/3aUn//Xl + wv////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////15cL/3aUn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+Cm + J//gpif/26Im//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////26Im/+Cm + J//gpif/4KYn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+CnKP/gpyj/4Kco/+Cn + KP/gpyj/4Kco/+CnKP/gpyj/2KEn//////////////////////////////////////////////////// + ////////////////////////////////////////////////////////xpQj/8mWJP/JliT/yZYk/8iV + JP/my5H/2aIn/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+Cn + KP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/2KEn//////////////////////////////////// + ////////////////////////////////////////////////////////////////////////0pwl/9ih + J//YoSf/2KEn/9agJv/WoCb/3KQn/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+Cn + KP/gpyj/4Kco/+GnKP/hpyj/4aco/+GnKP/hpyj/4aco/+GnKP/hpyj/2aEn//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////2aEn/+CmKP/u0pT////////////t0pT/36Yo/+GnKP/hpyj/4aco/+GnKP/hpyj/4aco/+Gn + KP/hpyj/4aco/+GnKP/hpyj/4aco/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/2aIn//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////2KEm/+3SlP//////////////////////7dKU/+CnKP/hqCj/4ago/+Go + KP/hqCj/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+Ko + Kf/iqCn/2qIn//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////6s+U/////////////////8ucM//w4sH//////+7S + lf/hpyn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+KpKf/iqSn/4qkp/+Kp + Kf/iqSn/4qkp/+KpKf/iqSn/2qMn//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////Pn + zP/RoTT/8eLB///////u05X/4agp/+KpKf/iqSn/4qkp/+KpKf/iqSn/4qkp/+KpKf/iqSn/4qkp/+Op + Kf/jqSn/46kp/+OpKf/jqSn/46kp/+OpKf/jqSn/2qMn//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///LnDP/8OHB///////06Mz/0qI0//Hiwf//////7tOV/+KoKf/jqSn/46kp/+OpKf/jqSn/46kp/+Op + Kf/jqSn/46kp/+OqKv/jqir/46oq/+OqKv/jqir/46oq/+OqKv/jqir/2qQo//////////////////// + ///////////////////9+/f/7d26/97AfP/Uq1H/06tO/8qYJf/KmCX/06tO/9SrUf/ewHz/7d26//37 + 9//////////////////58+X/0aE1//Diwf//////9OjM/9KiNf/x4sL//////+7Tlf/iqSr/46oq/+Oq + Kv/jqir/46oq/+OqKv/jqir/46oq/+SqKv/kqir/5Koq/+SqKv/kqir/5Koq/+SqKv/kqir/26Qo//// + ////////////////////////+/fw/96/ev/OnTD/0Jsm/9WfJ//YoSj/2qIo/9ukKP/bpCj/2qIo/9ih + KP/Vnyf/0Jsm/86dMP/ev3r/+/fw////////////+vPm/9KiNf/w4sH///////XozP/TojX/8eLC//// + ///v05X/46kq/+SqKv/kqir/5Koq/+SqKv/kqir/5Koq/+WqKv/lqir/5aoq/+WqKv/lqir/5aoq/+Wq + Kv/lqir/3KQo///////////////////////38OD/06RA/9afJ//coyj/36Yp/+KnKf/jqSr/5Kkq/+Wq + Kv/lqir/5Kkq/+OpKv/ipyn/36Yp/9yjKP/Wnyf/06RA//fw4P////////////rz5v/TojX/8eLB//// + ///16Mz/1KI1//Hiwv//////79OV/+SpKv/lqir/5aoq/+WqKv/lqir/5aoq/+WrKv/lqyr/5asq/+Wr + Kv/lqyr/5asq/+WrKv/lqyr/3KUo///////////////////////btWH/2aIo/+GoKf/kqir/5asq/+Wr + Kv/lqyr/5asq/+WrKv/lqyr/5asq/+WrKv/lqyr/5asq/+SqKv/hqCn/2aIo/9u0Xv////////////// + ///69Ob/06M1//Hiwf//////9ejM/9SjNf/x4sL//////+/Ulf/kqir/5asq/+WrKv/lqyr/5asq/+ar + K//mqyv/5qsr/+arK//mqyv/5qsr/+arK//mqyv/3aUp///////////////////////YoSj/46gq/+ar + K//mrjX/7MRu//Ter//57dT/+vDc////////////+vDc//nt1P/03q//7MRu/+auNf/mqyv/46gq/9ih + KP//////////////////////9ejM/9SjNv/x4sL///////XozP/Uozb////////////w1Jb/5aor/+ar + K//mqyv/5qsr/+asK//mrCv/5qwr/+asK//mrCv/5qwr/+asK//mrCv/3aYp//////////////////// + ///dpSn/5Ksr/+/Oh//9+/X///////////////////////////////////////////////////////37 + 9f/vzof/5Ksr/92lKf////////////////////////////XozP/UpDb/8eLC//////////////////// + ////////8NSW/+WrK//mrCv/5qwr/+esK//nrCv/56wr/+esK//nrCv/56wr/+esK//nrCv/3qYp//// + ///////////////////dpSn/892s//////////////////////////////////////////////////// + ////////////////////////892s/92lKf//////////////////////5cuR///////16Mz/1KM2//// + /////////////////////////////+OpKv/nrCv/56wr/+etLP/nrSz/560s/+etLP/nrSz/560s/+et + LP/nrSz/3qcq///////////////////////cpzT//Pjw////////////////////////////5cyU/82a + J//Pmyf/z5sn/8+bJ//Pmyf/z5sn/9CcKP/Vnyn/3aUq/92nL///////////////////////0Jwo/+fN + kv//////////////////////////////////////6M6S/+GoK//nrSz/560s/+itLP/orSz/6K0s/+it + LP/orSz/6K0s/+itLP/orSz/36cq///////////////////////iumP/7tms//////////////////// + /////////////+zRlf/epir/36cq/9+nKv/fpyr/36cq/9+nKv/gpyv/46kr/+a9ZP////////////// + ////////2aIp/9ihKf/nzJL////////////////////////////my5L/2KEp/+SqK//orSz/6K0s/+iu + LP/oriz/6K4s/+iuLP/oriz/6K4s/+iuLP/oriz/36gq///////////////////////68+P/3LFQ/+LF + gv/8+vX////////////////////////////x1Zb/560s/+iuLP/oriz/6K4s/+iuLP/oriz/6rtT//rz + 4///////////////////////3qcq/+KpK//Xoin/5syS/////////////////+bMkv/Xoin/4qkr/+et + LP/oriz/6K4s/+muLf/pri3/6a4t/+muLf/pri3/6a4t/+muLf/pri3/4Kgr//////////////////// + /////////vz3/+jKif/Wpj7/3blq/+rWqf/06tT/9evW////////////78yD/+itLf/pri3/6a4t/+my + Of/w0Ir//vz3////////////////////////////4Kgr/+itLf/jqSz/2KIq/+bMkv//////5syS/9ii + Kv/jqSz/6K0t/+muLf/pri3/6a4t/+mvLf/pry3/6a8t/+mvLf/pry3/6a8t/+mvLf/pry3/4Kgr//// + ///////////////////////////////////+/fr/8uK+/+XHgf/cs1b/2rFT/9KeK//Woiz/5blV/+u+ + Wf/wzoP/9uW+//79+v//////////////////////////////////////4Kgr/+mvLf/ori3/46os/9mj + Kv/Unyn/2aMq/+OqLP/ori3/6a8t/+mvLf/pry3/6a8t/+qvLf/qry3/6q8t/+qvLf/qry3/6q8t/+qv + Lf/qry3/4agr//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////4agr/+qv + Lf/qry3/6a4t/+asLP/kqiz/5qws/+muLf/qry3/6q8t/+qvLf/qry3/6q8t/+uwLv/rsC7/67Au/+uw + Lv/rsC7/67Au/+uwLv/rsC7/4qks//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////4qks/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uw + Lv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/4qks//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////4qks/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uw + Lv/rsC7/67Au/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////46os/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yx + Lv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os//// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////btFz/0p4p/9OfKf/Tnyn/058p/9OfKf/Zoyr/5qwt/+yxLv/ssS7/7LEu/+yx + Lv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2x + L//tsS//5Kot//////////////////////////////////////////////////////////////////// + ///////////////////////////////////aoyv////////////////////////////w05X/6a4u/+2x + L//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2yL//tsi//7bIv/+2y + L//tsi//7bIv/+2yL//tsi//5Kst//////////////////////////////////////////////////// + ///////////////////////////////////////////////////dpiz//////////////////////+zR + lP/jqy3/67Ev/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+6y + L//usi//7rIv/+6yL//usi//7rIv/+6yL//usi//5ast//////////////////////////////////// + ///////////////////////////////////////////////////////////////////dpSz///////// + ////////6M2T/92lLP/orS7/7bEv/+6yL//usi//7rIv/+6yL//usi//7rIv/+6yL//usi//7rIv/+6y + L//usi//7rIv/+6zL//usy//7rMv/+6zL//usy//7rMv/+6zL//usy//5awt//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///dpiz////////////ozpP/3aYs/+iuLv/tsi//7rMv/+6zL//usy//7rMv/+6zL//usy//7rMv/+6z + L//usy//7rMv/+6zL//usy//7rMv/+6zMP/uszD/7rMw/+6zMP/uszD/7rMw/+6zMP/uszD/5awu//// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////dpi3//////+jOlP/dpi3/6K4v/+2yMP/uszD/7rMw/+6zMP/uszD/7rMw/+6z + MP/uszD/7rMw/+6zMP/uszD/7rMw/+6zMP/uszD/7rMw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++z + MP/vszD/560u//XnyP////////////////////////////////////////////////////////////// + ///////////////////////////////////fpy3/7dGU/96mLf/pri//7rIw/++zMP/vszD/77Mw/++z + MP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++0MP/vtDD/77Qw/++0 + MP/vtDD/77Qw/++0MP/vtDD/6rAv/96nLf/Xoiv/1qEr/9ahK//WoSv/1qEr/9ahK//WoSv/1qEr/9ah + K//WoSv/1qEr/9ahK//WoSv/1qEr/9ahK//WoSv/1qEr/9ymLP/krC7/5a0u/+mvL//uszD/77Qw/++0 + MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw//C0 + MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/7rMw/+uwL//ori7/560u/+etLv/nrS7/560u/+et + Lv/nrS7/560u/+etLv/nrS7/560u/+etLv/nrS7/560u/+etLv/nrS7/560u/+qvL//ssS//7rMw/++z + MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0 + MP/wtDD/8LQw//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0 + Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0 + Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0 + Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C1MfDwtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx8/C1MavwtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUxrvG1MSfxtTHt8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTHt8bUxKgAA + AADxtTEb8bUxqPG1MeTxtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx5PG1 + MajxtTEbAAAAAIAAAAAAAaiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA + AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA + qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA + AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA + qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA + AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA + qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIyAAAAAAAGojCgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACyexsGsnsbjbJ7G+eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G+eyexuNsnsbBrJ7G4eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexuKs3wb6sqSIf/ZoCX/3aQm/92kJv/dpCb/3aQm/92k + Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k + Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/ZoCX/ypIh/7N8G+rJkSH/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/ypIh/9qiJv/epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l + J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//aoib/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/9+mJ//fpif/36Yn/92lJ//15cL///////////////////////////////////////// + //////////////////////////////////////////////Xlwv/dpSf/36Yn/9+mJ//fpif/36Yn/9+m + J//fpif/36Yn/+CnKP/gpyj/4Kco/+CnKP/gpyj/26Mn//////////////////////////////////// + /////////////////////////////////////////////////////////////9ujJ//gpyj/4Kco/+Cn + KP/gpyj/4Kco/+CnKP/gpyj/4aco/+GnKP/hpyj/4aco/+GnKP/ZoSf///////////////////////// + /////////////////////////////////////////////8eUI//JliT/yZYk/8mVJP/my5H/2qIn/+Gn + KP/hpyj/4aco/+GnKP/hpyj/4aco/+GnKP/hqCj/4ago/+GoKP/hqCj/4ago/9miJ/////////////// + ////////////////////////////////////////////////////////050l/9ihJv/q0JT//////+nP + k//cpCf/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+KoKf/iqCn/4qgp/+KoKf/iqCn/2qIn//// + ///////////////////////////////////////////////////////////////////ZoSf/7tKV//// + /////////Pjw/+3Slf/hpyn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/46kp/+OpKf/jqSn/46kp/+Op + Kf/aoyf//////////////////////////////////////////////////////////////////////+rP + lP////////////jy5P/RoDT/+fHh/+7Tlf/iqCn/46kp/+OpKf/jqSn/46kp/+OpKf/kqir/5Koq/+Sq + Kv/kqir/5Koq/9ukKP////////////////////////////////////////////////////////////// + ///////////////////8+fL/0aA1//Xpz//WpDb/+fLh/+/Tlf/jqSr/5Koq/+SqKv/kqir/5Koq/+Wq + Kv/lqir/5aoq/+WqKv/lqir/3KQo////////////////////////////8OLE/9u5bf/VrFH/zZoq/82a + Kv/VrFH/27lt//DixP/////////////////68+b/2aY2//bqz//XpDb/+fLh/+/Tlf/kqSr/5aoq/+Wq + Kv/lqir/5asr/+WrK//lqyv/5asr/+WrK//cpSn/////////////////+vbt/9auVP/RnCf/1qAo/9qj + Kf/cpCn/3KQp/9qjKf/WoCj/0Zwn/9exXP/8+fL////////////69Ob/2ac3//bqz//XpTf/+fLh/+/U + lv/kqiv/5asr/+WrK//mrCv/5qwr/+asK//mrCv/5qwr/92mKf/////////////////duWj/2KIo/9+n + Kv/jqSr/5Ksr/+WrK//lqyv/5Ksr/+OpKv/fpyr/2KIo/9y4Zv/////////////////69Ob/2qg3//bq + z//Ypjf//Pjw//DUlv/lqyv/5qwr/+etLP/nrSz/560s/+etLP/nrSz/3qcq/////////////////9ii + Kf/jqiv/6r9e//Terf/579f////////////579f/9N6t/+q/Xv/jqiv/2KIp/////////////////+jN + kv/69Ob/26k4//rz5f///////////+OqK//nrSz/6K0s/+itLP/orSz/6K0s/+itLP/fpyr///////// + ////////3qUq//DSkf////////////////////////////////////////////DSkf/epSr///////// + ////////054o/+vPk//9+fL////////////pzpL/4qgr/+itLP/priz/6a4s/+muLP/priz/6a4s/+Co + Kv////////////7+/P/dpSr//fv1/////////////////+fPmf/Qmyf/0Z0o/9SeKP/Yoin/4Kgq/9+m + Kv/////////////////bpCn/26Qp/+nOkv//////5syS/9miKf/lqyv/6a4s/+mvLf/pry3/6a8t/+mv + Lf/pry3/4Kgr/////////////////+O6X//pzZD//////////////////////+7Um//fqCv/4Kgr/+Kq + LP/lrCz/6MFp/////////////////9+oK//jqiz/2qQq/9SfKf/Zoyr/46os/+iuLf/pry3/6q8t/+qv + Lf/qry3/6q8t/+qvLf/hqCv//////////////////Pjw/+K4Xv/cs1v/69er//Xq1P/+/fr//v36/+/O + hf/pri3/6a4t/+zBYP/8+fD/////////////////4agr/+muLf/mrCz/5Kos/+asLP/pri3/6q8t/+qv + Lf/rsC7/67Au/+uwLv/rsC7/67Au/+KpLP////////////////////////////TkwP/jvm7/3LFS/9Oe + Kf/Yoir/5rhU/+7GcP/35sH////////////////////////////iqSz/67Au/+uwLv/rsC7/67Au/+uw + Lv/rsC7/67Au/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os//////////////////////////////////// + /////////////////////////////////////////////////////////////+OqLP/ssS7/7LEu/+yx + Lv/ssS7/7LEu/+yxLv/ssS7/7bEv/+2xL//tsS//7bEv/+2xL//kqi3///////////////////////// + ////////////////////////////////////////////////////////////////////////5Kot/+2x + L//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsi//7bIv/+2yL//tsi//7bIv/+SrLf////////////// + /////////////////////////////////////////////////////////////9y0XP/Tnyr/1J8q/9qk + K//nrS7/7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+6zL//usy//7rMv/+6zL//usy//5awt//// + ////////////////////////////////////////////////////////////////////////3aYs/+Ss + Lf/lrC3/6K4u/+yyL//usy//7rMv/+6zL//usy//7rMv/+6zL//usy//77Mw/++zMP/vszD/77Mw/++z + MP/mrC7///////////////////////////////////////////////////////////////////////// + ///lrC7/7rIw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vtDD/77Qw/++0 + MP/vtDD/77Qw/+euLv/158j///////////////////////////////////////////////////////// + /////////////+atLv/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw//C0 + MP/wtDD/8LQw//C0MP/wtDD/67Av/9+nLf/Yoiv/16Er/9ehK//XoSv/16Er/9ehK//XoSv/16Er/9eh + K//XoSv/16Er/9ehK//dpiz/6q8v//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0 + MP/wtDD/8LUx6vC1Mf/wtTH/8LUx//C1Mf/utDH/67Ew/+ivL//nri//564v/+euL//nri//564v/+eu + L//nri//564v/+euL//nri//564v/+qwMP/utDH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1 + Mf/wtTH/8LUx//C1MerxtTGH8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUxh/G1MQbxtTGE8bUx5PG1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTH/8bUx5PG1MYTxtTEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAEAAAACAAAAABACAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAsnsbSLJ7G+eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7 + G/+yexv/snsb/7J7G/+yexvnsnsbSL+IHuzaoSX/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l + Jv/epSb/3qUm/96lJv/epSb/2qEl/7+IHuzaoSb/36Yn//79+/////////////////////////////// + ///////////////////fpif/36Yn/9+mJ//aoSb/4Kco/+CnKP/+/fv///////////////////////// + ///KlyT/ypck/8qXJP/kypD/4Kco/+CnKP/gpyj/4Kco/+GoKP/hqCj//v37//////////////////// + ////////4ago/+GoKP/pvl//1qAm/+GoKP/hqCj/4ago/+GoKP/jqSn/46kp//79+/////////////// + /////////////+OpKf/x1ZX///////HVlf/jqSn/46kp/+OpKf/jqSn/5aoq/+WqKv/+/fv///////// + ////////////////////////////////////////8tWW/+WqKv/lqir/5aoq/+asK//mrCv//v37//// + ///r06H/2K1N/9CbJ//YrU3/69Oh///////////////////////z1pb/5qwr/+asK//orSz/6K0s//79 + +//p0Jr/4rVV//ns0P//////+ezQ/+K1Vf/ozZL///////////////////////TWl//orSz/6a8t/+mv + Lf/+/fv/4K08//z05P/////////////////89OT/4a48////////////////////////////6a8t/+uw + Lv/rsC7//v37/+u2P//68+P//////9SfKv/Unyr/16Eq/+u2P////////////+nOk///////6c6T/+uw + Lv/tsS//7bEv//79+//23KL/4LJQ//Hguf/tsS//7bEv/+2xL//12Jj////////////hqC3/1qAr/+Go + Lf/tsS//7rMv/+6zL//+/fv///////bepv/luFT/7rMv//HBVv/436f/////////////////7rMv/+6z + L//usy//7rMv/++0MP/vtDD//v37/////////////////////////////////////////////////++0 + MP/vtDD/77Qw/++0MP/vtDDt8LUx/9mkLP/Zoyz/2aMs/9mjLP/Zoyz/2aMs/9mjLP/Zoyz/2aMs/9mj + LP/wtTH/8LUx//C1Mf/vtDDt8bUxP/G1McnxtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1 + Mf/xtTH/8bUx//G1Mf/xtTHJ8bUxPwAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA + rEEAAKxBAACsQQAArEEAAKxBAACsQQAArEE= + + + \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Program.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Program.cs new file mode 100644 index 0000000..f39e6f9 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Program.cs @@ -0,0 +1,57 @@ +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using System.Windows.Forms; +using SystemX.Net.Platform.SystemX.Net.XEFCore; +using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2Log; +using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson; + +namespace SystemX.Net.MiddlewareUI +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + bool bCreateProgram = false; + + Mutex SetMutex = new Mutex(true, "SystemX.Net.Middleware.UI.Log CPXV2", out bCreateProgram); + + if (bCreateProgram) + { + //종속성 주입 + /* + ServiceCollection collection = new ServiceCollection(); + collection.AddSingleton>(); + collection.AddSingleton(); + + ServiceProvider provider = collection.BuildServiceProvider(); + var shortTermJson = provider.GetService>(); + shortTermJson.SetConnectionString("Server=127.0.0.1;Database=CPXV2ShortTermLogJson;User Id=Alis;Password=Kefico!@34;"); + + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(provider.GetService()); + */ + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + + SetMutex.ReleaseMutex(); + } + else + { + MessageBox.Show("[SystemX.Net.Middleware.UI.Log CPXV2] Already this program excute now. Check the process.", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.OK, MessageBoxIcon.Information); + + return; + } + } + } +} \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/AssemblyInfo.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5f9d5c0 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SystemX.Net.MiddlewareUI")] +[assembly: AssemblyDescription("SystemX")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("SystemX")] +[assembly: AssemblyProduct("SystemX.Net.MiddlewareUI")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("CP-ServerX")] +[assembly: AssemblyCulture("")] +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("83f9d8f8-1fc1-4c57-bef0-9b0f33d4ff9e")] +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("20.22.11.29")] +[assembly: AssemblyFileVersion("20.22.11.29")] diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.Designer.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d5fe1d7 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.Designer.cs @@ -0,0 +1,193 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace SystemX.Net.MiddlewareUI.Log.Properties { + using System; + + + /// + /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다. + /// + // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder + // 클래스에서 자동으로 생성되었습니다. + // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을 + // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SystemX.Net.MiddlewareUI.Log.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을 + /// 재정의합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap ALIS { + get { + object obj = ResourceManager.GetObject("ALIS", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap AppIcon { + get { + object obj = ResourceManager.GetObject("AppIcon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap AppIcon1 { + get { + object obj = ResourceManager.GetObject("AppIcon1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Bubble_16x16 { + get { + object obj = ResourceManager.GetObject("Bubble_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Bubble_32x32 { + get { + object obj = ResourceManager.GetObject("Bubble_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Cancel_16x16 { + get { + object obj = ResourceManager.GetObject("Cancel_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Cancel_32x32 { + get { + object obj = ResourceManager.GetObject("Cancel_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap CI { + get { + object obj = ResourceManager.GetObject("CI", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Database_16x16 { + get { + object obj = ResourceManager.GetObject("Database_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Database_32x32 { + get { + object obj = ResourceManager.GetObject("Database_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Kefico_CI { + get { + object obj = ResourceManager.GetObject("Kefico_CI", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Publish_16x16 { + get { + object obj = ResourceManager.GetObject("Publish_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Publish_32x32 { + get { + object obj = ResourceManager.GetObject("Publish_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.resx b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.resx new file mode 100644 index 0000000..f60e153 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.resx @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\Bubble_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Database_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ALIS.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Cancel_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AppIcon.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Cancel_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Publish_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Kefico CI.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Publish_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\CI.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Bubble_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Database_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AppIcon1.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.Designer.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.Designer.cs new file mode 100644 index 0000000..ea38265 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace SystemX.Net.MiddlewareUI.Log.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.settings b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.settings new file mode 100644 index 0000000..8e615f2 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.settings @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/licenses.licx b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/licenses.licx new file mode 100644 index 0000000..2ee4d98 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/licenses.licx @@ -0,0 +1 @@ +DevExpress.XtraEditors.ProgressBarControl, DevExpress.XtraEditors.v20.2, Version=20.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/ALIS.PNG b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/ALIS.PNG new file mode 100644 index 0000000..cd68b96 Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/ALIS.PNG differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon.ico b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon.ico new file mode 100644 index 0000000..cbb016c Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon.ico differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon1.ico b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon1.ico new file mode 100644 index 0000000..cbb016c Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon1.ico differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_16x16.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_16x16.png new file mode 100644 index 0000000..53772d2 Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_16x16.png differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_32x32.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_32x32.png new file mode 100644 index 0000000..720bc52 Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_32x32.png differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/CI.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/CI.png new file mode 100644 index 0000000..c993fbf Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/CI.png differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_16x16.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_16x16.png new file mode 100644 index 0000000..bb13117 Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_16x16.png differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_32x32.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_32x32.png new file mode 100644 index 0000000..95e1e95 Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_32x32.png differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_16x16.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_16x16.png new file mode 100644 index 0000000..25372a5 Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_16x16.png differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_32x32.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_32x32.png new file mode 100644 index 0000000..fee0e48 Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_32x32.png differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Kefico CI.PNG b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Kefico CI.PNG new file mode 100644 index 0000000..ed53c82 Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Kefico CI.PNG differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_16x16.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_16x16.png new file mode 100644 index 0000000..b209fdd Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_16x16.png differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_32x32.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_32x32.png new file mode 100644 index 0000000..e2c5c03 Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_32x32.png differ diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/CPXV2_CpLogProcess.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/CPXV2_CpLogProcess.cs new file mode 100644 index 0000000..b26ee76 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/CPXV2_CpLogProcess.cs @@ -0,0 +1,1371 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; +using System.Threading; +using System.Reflection; +using System.Threading.Tasks; + +using SystemX.Net.Platform.Common.ExtensionMethods; +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; +using SystemX.Net.Platform.SystemX.Common; +using SystemX.Net.Middleware.Log.Commons; +using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson; + +using CPXV2Log = SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2Log; +using CPXV2LogJson = SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson; +using Newtonsoft.Json; +using SystemX.Common.Util; +using CpTesterPlatform.CpLogUtil; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + static internal class CPXV2_CpLogProcessInfo + { + static public string strProcessDebugInfo = string.Empty; + static public string strGetFileName = string.Empty; + + //Summary 삽입 정보 생성 + static public string strHostID = string.Empty; + static public string strSection = string.Empty; + static public string strStationID = string.Empty; + static public Int64 nShortTermIdent = int.MaxValue; + static public Int64 nLongTermIdent = int.MaxValue; + static public string strStationName = string.Empty; + static public string strProdNo_P = string.Empty; + static public string strProdNo_C = string.Empty; + static public string strTestType = string.Empty; + static public string strTestCode = string.Empty; + static public string strVersion = string.Empty; + static public string strProdCode = string.Empty; + static public string strTestListCntID = string.Empty; + + static public int nTestListFileNo = int.MaxValue; + static public int nTestListVariantNo = int.MaxValue; + static public int nTestListReleaseNo = int.MaxValue; + + static public string strCpLogFileComment = string.Empty; + + static public Dictionary dicCpLogHeader = new Dictionary(); + + static public int nGetReadStepVersion = int.MaxValue; + + /* + * CpLog Header 상 검사 시작 시간 획득 및 맨앞 공백 제거 + */ + static public string strStTime = string.Empty; + + static public long lMainMeasTime = 0; + static public long lLongTermMeasTime = 0; + } + + private DataTable CPXV2_MakeCpLogTable() + { + // Create a new DataTable titled 'Names.' + DataTable logTable = new DataTable("CpLogProcTestResult"); + + // Add three column objects to the table. + DataColumn Column0 = new DataColumn(); + Column0.DataType = System.Type.GetType("System.Int64"); + Column0.ColumnName = "No"; + Column0.AutoIncrement = true; + Column0.AllowDBNull = false; + logTable.Columns.Add(Column0); + + DataColumn Column3 = new DataColumn(); + Column3.DataType = System.Type.GetType("System.Int64"); + Column3.ColumnName = "StepID"; + Column3.AllowDBNull = false; + logTable.Columns.Add(Column3); + + DataColumn Column4 = new DataColumn(); + Column4.DataType = System.Type.GetType("System.Decimal"); + Column4.ColumnName = "MeasVal"; + Column4.AllowDBNull = true; + logTable.Columns.Add(Column4); + + DataColumn Column5 = new DataColumn(); + Column5.DataType = System.Type.GetType("System.String"); + Column5.ColumnName = "MeasValStr"; + Column5.AllowDBNull = true; + logTable.Columns.Add(Column5); + + DataColumn Column6 = new DataColumn(); + Column6.DataType = System.Type.GetType("System.String"); + Column6.ColumnName = "Message"; + Column6.AllowDBNull = true; + logTable.Columns.Add(Column6); + + DataColumn Column7 = new DataColumn(); + Column7.DataType = System.Type.GetType("System.String"); + Column7.ColumnName = "GlobalMin"; + Column7.AllowDBNull = true; + logTable.Columns.Add(Column7); + + DataColumn Column8 = new DataColumn(); + Column8.DataType = System.Type.GetType("System.String"); + Column8.ColumnName = "GlobalMax"; + Column8.AllowDBNull = true; + logTable.Columns.Add(Column8); + + DataColumn Column9 = new DataColumn(); + Column9.DataType = System.Type.GetType("System.String"); + Column9.ColumnName = "Result"; + Column9.AllowDBNull = false; + logTable.Columns.Add(Column9); + + DataColumn Column10 = new DataColumn(); + Column10.DataType = System.Type.GetType("System.String"); + Column10.ColumnName = "SpentTime"; + Column10.AllowDBNull = true; + logTable.Columns.Add(Column10); + + // Create an array for DataColumn objects. + DataColumn[] keys = new DataColumn[1]; + keys[0] = Column0; + logTable.PrimaryKey = keys; + + // Return the new DataTable. + return logTable; + } + + private DataTable CPXV2_MakeProcLogTable() + { + // Create a new DataTable titled 'Names.' + DataTable logTable = new DataTable("TestResult"); + + // Add three column objects to the table. + DataColumn Column0 = new DataColumn(); + Column0.DataType = System.Type.GetType("System.Int64"); + Column0.ColumnName = "No"; + Column0.AllowDBNull = false; + logTable.Columns.Add(Column0); + + DataColumn Column1 = new DataColumn(); + Column1.DataType = System.Type.GetType("System.DateTime"); + Column1.ColumnName = "TestDT"; + Column1.AllowDBNull = true; + logTable.Columns.Add(Column1); + + DataColumn Column2 = new DataColumn(); + Column2.DataType = System.Type.GetType("System.String"); + Column2.ColumnName = "LogData"; + Column2.AllowDBNull = false; + logTable.Columns.Add(Column2); + + // Create an array for DataColumn objects. + DataColumn[] keys = new DataColumn[1]; + keys[0] = Column0; + logTable.PrimaryKey = keys; + + // Return the new DataTable. + return logTable; + } + + private enum eCPXV2_CreateFileInfo + { + SuccessSavePos = 0, + FailedSavePos, + MesSavePos, + CheckLogSavePos + } + + private string CPXV2_GetFileName(LogMappedPacket GetMappedInfo, string strCreateName) + { + Random randNumber = new Random(); + + string strFileName = strCreateName; + + if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0) + strFileName += @"LogFileTemp" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + else + strFileName += @GetMappedInfo.objOptionFileName[0].Data + @GetMappedInfo.objOptionFileExtension[0].Data; + + if (File.Exists(strFileName) == true) + { + while (true) + { + strFileName = strCreateName; + + if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0) + strFileName += @"LogFileTemp" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + else + strFileName += @GetMappedInfo.objOptionFileName[0].Data + "_" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + + if (File.Exists(strFileName) == false) + break; + } + } + + return strFileName; + } + + private string CPXV2_GetFileSaveInformation(eCPXV2_CreateFileInfo fileInfo, + LogMappedPacket GetMappedInfo, + int iPos, + string strMakeDate, + bool bGetOnlyFilePath = false) + { + string strMakeInfo = string.Empty; + string strMakeName = string.Empty; + + switch (fileInfo) + { + case eCPXV2_CreateFileInfo.SuccessSavePos: + strMakeInfo = LoadInfo.SERVER_SAVE_POS + @"\" + strMakeDate; + strMakeInfo += @"LogFileSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\"; + break; + case eCPXV2_CreateFileInfo.FailedSavePos: + strMakeInfo = LoadInfo.SERVER_SAVE_POS + @"\" + strMakeDate; + strMakeInfo += @"LogFileSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\ProcessingFailed\"; + break; + case eCPXV2_CreateFileInfo.MesSavePos: + strMakeInfo = LoadInfo.MES_SAVE_POS + @"\MESLogSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\"; + strMakeInfo += strMakeDate; + break; + case eCPXV2_CreateFileInfo.CheckLogSavePos: + strMakeInfo = LoadInfo.SERVER_SAVE_POS + @"\" + strMakeDate; + strMakeInfo += @"LogFileSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\LogCheck\"; + break; + } + + if (Directory.Exists(strMakeInfo) == false) + Directory.CreateDirectory(strMakeInfo); + + if (bGetOnlyFilePath == false) + strMakeName = CPXV2_GetFileName(GetMappedInfo, strMakeInfo); + else + strMakeName = strMakeInfo; + + return strMakeName; + } + + private bool CPXV2_SummaryLastNoCheck(eConnCategory eConnType, ref Int64 nLastNo, ref Int64 nRowCnt) + { + nLastNo = 0; + nRowCnt = 0; + + bool bResult = true; + + string strGetTableName = string.Empty; + + if (eConnType == eConnCategory.ShortTerm) + strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE; + else if (eConnType == eConnCategory.LongTerm) + strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SUMMARY_TABLE; + else + { + bResult = false; + + return bResult; + } + + try + { + //Summary 테이블 현재 마지막 인덱스 번호 획득 + DataSet ds = QueryStreamProcess(eConnType, "SELECT IDENT_CURRENT('" + strGetTableName + "') AS LastNo"); + bool hasRows = XCommons.isHasRow(ds); + + //인덱스 번호 획득 실패시 예외 + if (hasRows == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess Summary Table LogProcess/LastNo Query failed. [SystemX.Net.MiddlewareUI : MainForm.SummaryLastNoCheck]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + throw new Exception("[" + CPXV2_CpLogProcessInfo.strGetFileName + "] When the file is in progress."); + } + + //인덱스 번호 변환 실패 예외 + if (Int64.TryParse(ds.Tables[0].Rows[0].ItemArray[0].ToString(), out nLastNo) == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 CpLogProcess [" + strGetTableName + "] index number conversion failed failed. [SystemX.Net.MiddlewareUI : MainForm.SummaryLastNoCheck]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + if (nLastNo == 0) + { + ds = QueryStreamProcess(eConnType, "SELECT ROWS FROM SYS.SYSINDEXES WHERE ID = OBJECT_ID ('" + strGetTableName + "') AND INDID < 2"); + + hasRows = XCommons.isHasRow(ds); + + //인덱스 번호 획득 실패시 예외 + if (hasRows == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess Summary Table LogProcess/LastNo Query failed(SYS.SYSINDEXES). [SystemX.Net.MiddlewareUI : MainForm.SummaryLastNoCheck]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + throw new Exception("[" + CPXV2_CpLogProcessInfo.strGetFileName + "] When the file is in progress(SYS.SYSINDEXES)."); + } + + nRowCnt = Convert.ToInt64(ds.Tables[0].Rows[0]["ROWS"]); + } + } + catch + { + bResult = false; + } + + return bResult; + } + + private void RegisterCpLogComment(ref int nProcPos, DataRow[] SetMakeLogRows) + { + //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트 + SetMakeLogRows[nProcPos]["StepID"] = "1"; + + SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0); + SetMakeLogRows[nProcPos]["MeasValStr"] = ""; + SetMakeLogRows[nProcPos]["Message"] = CPXV2_CpLogProcessInfo.strCpLogFileComment; + + SetMakeLogRows[nProcPos]["GlobalMin"] = ""; + SetMakeLogRows[nProcPos]["GlobalMax"] = ""; + + SetMakeLogRows[nProcPos]["Result"] = "NONE"; + SetMakeLogRows[nProcPos]["SpentTime"] = "0"; + + nProcPos += 1; + } + + private void RegisterCpLogData(ref int nProcPos, DataTable SetCpLogTable, DataSet dsVRFYInfo, DataRow dr, DataRow[] SetMakeLogRows) + { + string strGetMeasure = string.Empty; + + //CpLog 한행의 정보 획득 + LongLogParamInfo.STEP = dr["STEP"].ToString().Trim(); + LongLogParamInfo.POSITION = dr["POSITION"].ToString().Trim(); + LongLogParamInfo.MO = dr["MO"].ToString().Trim(); + LongLogParamInfo.FNC_NAME = dr["FNC_NAME"].ToString().Trim(); + LongLogParamInfo.MIN = dr["MIN"].ToString().Trim(); + LongLogParamInfo.MEASURE = dr["MEASURE"].ToString().Trim(); + LongLogParamInfo.MAX = dr["MAX"].ToString().Trim(); + LongLogParamInfo.DIM = dr["DIM"].ToString().Trim(); + LongLogParamInfo.CHECK = dr["CHECK"].ToString().Trim(); + LongLogParamInfo.SPENT_TIME = dr["SPENT_TIME"].ToString().Trim(); + LongLogParamInfo.INFO = dr["INFO"].ToString().Trim(); + + LongLogParamInfo.GLOBAL_SPEC = false; + LongLogParamInfo.VRFY_MIN = ""; + LongLogParamInfo.VRFY_MAX = ""; + + //VRFY 키 지정 검색 > 현재의 STEP 이 VRFY 에 존재하면 해당 STEP 의 정보 VRFY 에서 가져옴 + DataRow getDr = dsVRFYInfo.Tables[0].Rows.Find(LongLogParamInfo.STEP); + if (getDr != null) + { + LongLogParamInfo.GLOBAL_SPEC = Convert.ToBoolean(getDr["IsGlobal"]); + + LongLogParamInfo.VRFY_MIN = getDr["SpecMin"].ToString().Trim(); + LongLogParamInfo.VRFY_MAX = getDr["SpecMax"].ToString().Trim(); + } + + //DataRow 를 설정된 DataTable Format으로 한행 생성 + SetMakeLogRows[nProcPos] = SetCpLogTable.NewRow(); + + //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트 + SetMakeLogRows[nProcPos]["StepID"] = LongLogParamInfo.STEP; + + SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0); + SetMakeLogRows[nProcPos]["MeasValStr"] = ""; + SetMakeLogRows[nProcPos]["Message"] = ""; + + if (LongLogParamInfo.FNC_NAME.IndexOf("PRINTOUT") >= 0) + { + if (LongLogParamInfo.MEASURE.Length > LongLogParamInfo.MessageLength) + { + strGetMeasure = LongLogParamInfo.MEASURE; + strGetMeasure = strGetMeasure.Substring(0, LongLogParamInfo.MessageLength); + + SetMakeLogRows[nProcPos]["Message"] = strGetMeasure; + } + else SetMakeLogRows[nProcPos]["Message"] = LongLogParamInfo.MEASURE; + } + else if (LongLogParamInfo.DIM.IndexOf("STR") >= 0 || + LongLogParamInfo.DIM.IndexOf("STRING") >= 0 || + LongLogParamInfo.DIM.IndexOf("HEX") >= 0 || + LongLogParamInfo.DIM.IndexOf("NONE") >= 0 || + LongLogParamInfo.DIM.IndexOf("BIN") >= 0 || + LongLogParamInfo.DIM == string.Empty) + { + if (LongLogParamInfo.MEASURE.Length > LongLogParamInfo.MessageValLength) + { + strGetMeasure = LongLogParamInfo.MEASURE; + strGetMeasure = strGetMeasure.Substring(0, LongLogParamInfo.MessageValLength); + + SetMakeLogRows[nProcPos]["MeasValStr"] = strGetMeasure; + } + else SetMakeLogRows[nProcPos]["MeasValStr"] = LongLogParamInfo.MEASURE; + } + else + { + //상기 케이스에 다 해당 안될때 Decimal 삽입 아무값이 없을 때 0 삽입 + if (LongLogParamInfo.MEASURE.Length <= 0) + SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0); + else + { + //Measure 존재에 대한 값변환 시도 및 실패시 String 항목으로 삽입 + decimal getMeasValue = decimal.Zero; + if (Decimal.TryParse(LongLogParamInfo.MEASURE, out getMeasValue)) + SetMakeLogRows[nProcPos]["MeasVal"] = getMeasValue; + else + { + //0 삽입 및 Str 에 >> 표시 및 Message 에 데이터 표시 + SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0); + SetMakeLogRows[nProcPos]["MeasValStr"] = ">>"; + SetMakeLogRows[nProcPos]["Message"] = LongLogParamInfo.MEASURE; + } + } + } + + //IS GLOBAL 이면 CpLog 에서 읽은 정보 삽입 아니면 VRFY 에서 읽은 정보 삽입 + if (LongLogParamInfo.GLOBAL_SPEC) + { + SetMakeLogRows[nProcPos]["GlobalMin"] = LongLogParamInfo.MIN; + SetMakeLogRows[nProcPos]["GlobalMax"] = LongLogParamInfo.MAX; + } + else + { + SetMakeLogRows[nProcPos]["GlobalMin"] = LongLogParamInfo.VRFY_MIN; + SetMakeLogRows[nProcPos]["GlobalMax"] = LongLogParamInfo.VRFY_MAX; + + if (LongLogParamInfo.VRFY_MIN.Length <= 0 && + LongLogParamInfo.VRFY_MAX.Length <= 0) + { + if (LongLogParamInfo.MIN.Length > 0 || + LongLogParamInfo.MAX.Length > 0) + { + SetMakeLogRows[nProcPos]["GlobalMin"] = LongLogParamInfo.MIN; + SetMakeLogRows[nProcPos]["GlobalMax"] = LongLogParamInfo.MAX; + } + } + } + + SetMakeLogRows[nProcPos]["Result"] = LongLogParamInfo.CHECK; + SetMakeLogRows[nProcPos]["SpentTime"] = LongLogParamInfo.SPENT_TIME; + + nProcPos += 1; + } + + private DataRow[] CPXV2_ShortProcessMakeLogRows(int nLogCnt, DataSet dsVRFYInfo, DataTable dtLogData) + { + bool bMakeProcResult = true; + + DataRow[] SetMakeLogRows = new DataRow[nLogCnt]; + + int nProcPos = 0; + + //CpLog 삽입할 DataTable 생성 + DataTable SetCpLogTable; + SetCpLogTable = CPXV2_MakeCpLogTable(); + + //읽은 Cplog DataTable DataRow 정보로 DataRow 업데이트 및 Datatable에 삽입 + //현재 VRFY 최근 Step 별 정보로 IsGlobal 일때 Spec 을 가져오거나 측정되어 생성된 Spec 구분하여 처리 + string strGetMeasure = string.Empty; + + string strGetMin = string.Empty; + string strGetMax = string.Empty; + + string strGetVRFYMin = string.Empty; + string strGetVRFYMax = string.Empty; + + //Make Comment Step + try + { + //DataRow 를 설정된 DataTable Format으로 한행 생성 + SetMakeLogRows[nProcPos] = SetCpLogTable.NewRow(); + + //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트 + RegisterCpLogComment(ref nProcPos, SetMakeLogRows); + } + catch (Exception ex) + { + bMakeProcResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + "1 Insert log data(CpLog Comment) make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL); + + goto MAKE_ROW_RPCOESS_FAILED; + } + // + foreach (DataRow dr in dtLogData.Rows) + { + try + { + RegisterCpLogData(ref nProcPos, SetCpLogTable, dsVRFYInfo, dr, SetMakeLogRows); + } + catch (Exception ex) + { + bMakeProcResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + ShortLogParamInfo.STEP + @" Insert log data make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL); + + break; + } + } + + MAKE_ROW_RPCOESS_FAILED: + + if (bMakeProcResult == false) + SetMakeLogRows = null; + + return SetMakeLogRows; + } + + private DataRow[] CPXV2_LongProcessMakeLogRows(int nLogCnt, DataSet dsVRFYInfo, DataTable dtLogData) + { + bool bMakeProcResult = true; + + DataRow[] SetMakeLogRows = new DataRow[nLogCnt]; + + int nProcPos = 0; + + //CpLog 삽입할 DataTable 생성 + DataTable SetCpLogTable; + SetCpLogTable = CPXV2_MakeCpLogTable(); + + //읽은 Cplog DataTable DataRow 정보로 DataRow 업데이트 및 Datatable에 삽입 + //현재 VRFY 최근 Step 별 정보로 IsGlobal 일때 Spec 을 가져오거나 측정되어 생성된 Spec 구분하여 처리 + string strGetMeasure = string.Empty; + + string strGetMin = string.Empty; + string strGetMax = string.Empty; + + string strGetVRFYMin = string.Empty; + string strGetVRFYMax = string.Empty; + + //Make Comment Step + try + { + //DataRow 를 설정된 DataTable Format으로 한행 생성 + SetMakeLogRows[nProcPos] = SetCpLogTable.NewRow(); + + //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트 + RegisterCpLogComment(ref nProcPos, SetMakeLogRows); + } + catch (Exception ex) + { + bMakeProcResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + "1 Insert log data(CpLog Comment) make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL); + + goto MAKE_ROW_RPCOESS_FAILED; + } + // + foreach (DataRow dr in dtLogData.Rows) + { + try + { + RegisterCpLogData(ref nProcPos, SetCpLogTable, dsVRFYInfo, dr, SetMakeLogRows); + } + catch (Exception ex) + { + bMakeProcResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + LongLogParamInfo.STEP + @" Insert log data make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL); + + break; + } + } + + MAKE_ROW_RPCOESS_FAILED: + + if (bMakeProcResult == false) + SetMakeLogRows = null; + + return SetMakeLogRows; + } + + private void CPXV2_MakeSummaryData(int iPos, string strStationName, string strTestListID, string strHostID, string strSection, + ref HISTLogSummary[] summaryItem) + { + summaryItem[0].StationName = strStationName; + summaryItem[0].TestType = CPXV2_CpLogProcessInfo.strTestType; + summaryItem[0].Version = CPXV2_CpLogProcessInfo.strVersion; + summaryItem[0].ProdCode = CPXV2_CpLogProcessInfo.strProdCode; + summaryItem[0].TestListFileNo = CPXV2_CpLogProcessInfo.nTestListFileNo; + summaryItem[0].TestListVariantNo = CPXV2_CpLogProcessInfo.nTestListVariantNo; + summaryItem[0].TestListCntID = strTestListID; + summaryItem[0].StepVersion = CPXV2_CpLogProcessInfo.nGetReadStepVersion; + summaryItem[0].Host = strHostID; + summaryItem[0].Section = strSection; + summaryItem[0].ProdNoC = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_C"].ToString(); + summaryItem[0].ProdNoP = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_P"].ToString(); + summaryItem[0].TestCode = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestCode"].ToString(); + summaryItem[0].TestListFileName = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["FileName"].ToString(); + summaryItem[0].ProductID = CPXV2_CpLogProcessInfo.dicCpLogHeader["PART_ID"]; + summaryItem[0].Result = CPXV2_CpLogProcessInfo.dicCpLogHeader["RESULT"]; + summaryItem[0].Duration = CPXV2_CpLogProcessInfo.dicCpLogHeader["DURATION"]; + summaryItem[0].TestDT = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime); + // + summaryItem[1].StationName = strStationName; + summaryItem[1].TestType = CPXV2_CpLogProcessInfo.strTestType; + summaryItem[1].Version = CPXV2_CpLogProcessInfo.strVersion; + summaryItem[1].ProdCode = CPXV2_CpLogProcessInfo.strProdCode; + summaryItem[1].TestListFileNo = CPXV2_CpLogProcessInfo.nTestListFileNo; + summaryItem[1].TestListVariantNo = CPXV2_CpLogProcessInfo.nTestListVariantNo; + summaryItem[1].TestListCntID = strTestListID; + summaryItem[1].StepVersion = CPXV2_CpLogProcessInfo.nGetReadStepVersion; + summaryItem[1].Host = strHostID; + summaryItem[1].Section = strSection; + summaryItem[1].ProdNoC = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_C"].ToString(); + summaryItem[1].ProdNoP = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_P"].ToString(); + summaryItem[1].TestCode = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestCode"].ToString(); + summaryItem[1].TestListFileName = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["FileName"].ToString(); + summaryItem[1].ProductID = CPXV2_CpLogProcessInfo.dicCpLogHeader["PART_ID"]; + summaryItem[1].Result = CPXV2_CpLogProcessInfo.dicCpLogHeader["RESULT"]; + summaryItem[1].Duration = CPXV2_CpLogProcessInfo.dicCpLogHeader["DURATION"]; + summaryItem[1].TestDT = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime); + } + + private async Task CPXV2_CheckDuplicateData(eConnCategory eConnType, int iPos, string strStationName, string strHostID, string strSection, Int64 nPreNo) + { + DataSet dsLastSummaryInfo = null; + DataSet dsDateTimeInfo = null; + + string strGetTableName = string.Empty; + + if(nPreNo < 0) + return false; + + if (eConnType == eConnCategory.ShortTerm) + strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE; + else if (eConnType == eConnCategory.LongTerm) + strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SUMMARY_TABLE; + else + return true; + + string strSummaryQueryText = "SELECT " + + "StationName, " + + "TestType, " + + "Version, " + + "ProdCode, " + + "TestListFileNo, " + + "TestListVariantNo, " + + "TestListCntID," + + "StepVersion, " + + "HostID, " + + "Section, " + + "ProdNo_C, " + + "ProdNo_P, " + + "Testcode, " + + "TestListFileName, " + + "ProductID, " + + "Result, " + + "Duration, " + + "TestDT " + + "FROM [" + strGetTableName + "] " + + "WHERE No = " + nPreNo.ToString() + ";"; + + //직전 Summary Information 획득 + dsLastSummaryInfo = QueryStreamProcess(eConnType, strSummaryQueryText); + + if (XCommons.isHasRow(dsLastSummaryInfo) == false) + return false; + + //직전정보와 이전정보를 비교를 위한 선언 > 검사기측 중복으로 동일 로그를 전송해도 무시 하도록 + string[] strSummaryInsertInfo = new string[18]; + string[] strSummaryBeforeInfo = new string[18]; + + bool bCompareResult = false; + + try + { + //현재 정보중 비교할 정보 삽입 + strSummaryInsertInfo[0] = strStationName; + strSummaryInsertInfo[1] = CPXV2_CpLogProcessInfo.strTestType; + strSummaryInsertInfo[2] = CPXV2_CpLogProcessInfo.strVersion; + strSummaryInsertInfo[3] = CPXV2_CpLogProcessInfo.strProdCode; + strSummaryInsertInfo[4] = CPXV2_CpLogProcessInfo.nTestListFileNo.ToString(); + strSummaryInsertInfo[5] = CPXV2_CpLogProcessInfo.nTestListVariantNo.ToString(); + strSummaryInsertInfo[6] = CPXV2_CpLogProcessInfo.strTestListCntID.ToString(); + strSummaryInsertInfo[7] = CPXV2_CpLogProcessInfo.nGetReadStepVersion.ToString(); + strSummaryInsertInfo[8] = strHostID; + strSummaryInsertInfo[9] = strSection; + strSummaryInsertInfo[10] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_C"].ToString(); + strSummaryInsertInfo[11] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_P"].ToString(); + strSummaryInsertInfo[12] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestCode"].ToString(); + strSummaryInsertInfo[13] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["FileName"].ToString(); + strSummaryInsertInfo[14] = CPXV2_CpLogProcessInfo.dicCpLogHeader["PART_ID"]; + strSummaryInsertInfo[15] = CPXV2_CpLogProcessInfo.dicCpLogHeader["RESULT"]; + strSummaryInsertInfo[16] = CPXV2_CpLogProcessInfo.dicCpLogHeader["DURATION"]; + strSummaryInsertInfo[17] = CPXV2_CpLogProcessInfo.strStTime; + + //이전 정보중 비교할 정보 삽입 + strSummaryBeforeInfo[0] = dsLastSummaryInfo.Tables[0].Rows[0][0].ToString(); + strSummaryBeforeInfo[1] = dsLastSummaryInfo.Tables[0].Rows[0][1].ToString(); + strSummaryBeforeInfo[2] = dsLastSummaryInfo.Tables[0].Rows[0][2].ToString(); + strSummaryBeforeInfo[3] = dsLastSummaryInfo.Tables[0].Rows[0][3].ToString(); + strSummaryBeforeInfo[4] = dsLastSummaryInfo.Tables[0].Rows[0][4].ToString(); + strSummaryBeforeInfo[5] = dsLastSummaryInfo.Tables[0].Rows[0][5].ToString(); + strSummaryBeforeInfo[6] = dsLastSummaryInfo.Tables[0].Rows[0][6].ToString(); + strSummaryBeforeInfo[7] = dsLastSummaryInfo.Tables[0].Rows[0][7].ToString(); + strSummaryBeforeInfo[8] = dsLastSummaryInfo.Tables[0].Rows[0][8].ToString(); + strSummaryBeforeInfo[9] = dsLastSummaryInfo.Tables[0].Rows[0][9].ToString(); + strSummaryBeforeInfo[10] = dsLastSummaryInfo.Tables[0].Rows[0][10].ToString(); + strSummaryBeforeInfo[11] = dsLastSummaryInfo.Tables[0].Rows[0][11].ToString(); + strSummaryBeforeInfo[12] = dsLastSummaryInfo.Tables[0].Rows[0][12].ToString(); + strSummaryBeforeInfo[13] = dsLastSummaryInfo.Tables[0].Rows[0][13].ToString(); + strSummaryBeforeInfo[14] = dsLastSummaryInfo.Tables[0].Rows[0][14].ToString(); + strSummaryBeforeInfo[15] = dsLastSummaryInfo.Tables[0].Rows[0][15].ToString(); + strSummaryBeforeInfo[16] = dsLastSummaryInfo.Tables[0].Rows[0][16].ToString(); + strSummaryBeforeInfo[17] = dsLastSummaryInfo.Tables[0].Rows[0][17].ToString(); + + int nDateTimePos = 17; + if (strSummaryBeforeInfo[nDateTimePos].IndexOf("AM") >= 0 || strSummaryBeforeInfo[nDateTimePos].IndexOf("PM") >= 0) + { + string strQueryDateTime = "SELECT DBO.XConvertDateE('" + strSummaryBeforeInfo[nDateTimePos] + "') AS 'DATETIME';"; + + dsDateTimeInfo = QueryStreamProcess(eConnType, strQueryDateTime); + + if (XCommons.isHasRow(dsDateTimeInfo)) + { + strSummaryBeforeInfo[nDateTimePos] = dsDateTimeInfo.Tables[0].Rows[0][0].ToString(); + + strSummaryBeforeInfo[nDateTimePos] = strSummaryBeforeInfo[nDateTimePos].Remove(strSummaryBeforeInfo[nDateTimePos].Length - 8, 8); + } + } + else if (strSummaryBeforeInfo[nDateTimePos].IndexOf("오전") >= 0 || strSummaryBeforeInfo[nDateTimePos].IndexOf("오후") >= 0) + { + string strQueryDateTime = "SELECT DBO.XConvertDateK('" + strSummaryBeforeInfo[nDateTimePos] + "') AS 'DATETIME';"; + + dsDateTimeInfo = QueryStreamProcess(eConnType, strQueryDateTime); + + if (XCommons.isHasRow(dsDateTimeInfo)) + { + strSummaryBeforeInfo[nDateTimePos] = dsDateTimeInfo.Tables[0].Rows[0][0].ToString(); + + strSummaryBeforeInfo[nDateTimePos] = strSummaryBeforeInfo[nDateTimePos].Remove(strSummaryBeforeInfo[nDateTimePos].Length - 8, 8); + } + } + + //동일 한지 비교 + bCompareResult = strSummaryInsertInfo.SequenceEqual(strSummaryBeforeInfo); + } + catch + { + bCompareResult = true; + } + + await Task.Delay(0); + + //True : 같다 / False : 다르다 + return bCompareResult; + } + + private bool CPXV2_CpLogProcess(LogMappedPacket GetMappedInfo, Dictionary dicSetLogFileInfo = null, string strSetLogFilePos = "") + { + int iPos = int.MinValue; + + bool bRequiredProcLogFile = false; + + if (strSetLogFilePos.Length > 0) + bRequiredProcLogFile = true; + + if (bRequiredProcLogFile == false) + iPos = GetMappedInfo.nNumber; + else + iPos = 0; + + bool bProcessResult = true; + bool bDupLogSkipState = false; + + string strProcessDebugInfo = string.Empty; + + if (bRequiredProcLogFile == false) + { + strProcessDebugInfo = "[" + (iPos).ToString("D2") + "]" + + "[" + GetMappedInfo.nStreamPort + "]" + + "[" + GetMappedInfo.objHost[0].Data + "]" + + "[" + GetMappedInfo.objSection[0].Data + "]"; + } + else + { + strProcessDebugInfo = "[" + (iPos).ToString("D2") + "]" + + "[FTP]" + + "[" + dicSetLogFileInfo["HOST"] + "]" + + "[" + dicSetLogFileInfo["SECTION"] + "]"; + } + + CPXV2_CpLogProcessInfo.strProcessDebugInfo = strProcessDebugInfo; + + string strMakeDate = string.Empty; + + string strSuccessFileName = string.Empty; + string strFailedFileName = string.Empty; + string strGetFileName = string.Empty; + + CpLogHeader getCpLogHeader = null; + + DataTable dtShortLogData = null; + DataTable dtLongLogData = null; + + try + { + //파일생성 위치 및 파일명 생성 + if (bRequiredProcLogFile == false) + { + strMakeDate = DateTime.Now.ToString(@"yyyy\\MM\\dd\\"); + + strSuccessFileName = CPXV2_GetFileSaveInformation(eCPXV2_CreateFileInfo.SuccessSavePos, GetMappedInfo, iPos, strMakeDate); + strFailedFileName = CPXV2_GetFileSaveInformation(eCPXV2_CreateFileInfo.FailedSavePos, GetMappedInfo, iPos, strMakeDate); + + strGetFileName = Path.GetFileName(strSuccessFileName); + + byte[] ucGetFileData = new byte[GetMappedInfo.nLogDataSize]; + Array.Copy(GetMappedInfo.ucLogData, 0, ucGetFileData, 0, GetMappedInfo.nLogDataSize); + + byte[] ucSetFileData = null; + + if (GetMappedInfo.objLogType[0].Data == "RAW_SIZE") + ucSetFileData = XDataArchive.DecompressGZipByteToByte(ucGetFileData); + else if (GetMappedInfo.objLogType[0].Data == "FILE_TRANSFER") + ucSetFileData = XDataArchive.DecompressDeflateByteToByte(ucGetFileData); + else + throw new Exception(); + + try + { + File.WriteAllBytes(strSuccessFileName, ucSetFileData); + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess [Log File] Create failed. - Need Hard Disk Space Check. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + } + else + strSuccessFileName = strSetLogFilePos; + + //해당 CpLog 파일 읽기 및 헤더 정보 획득 + dtShortLogData = CpLogFileIO.GetLogData(strSuccessFileName, out getCpLogHeader); + + dtLongLogData = dtShortLogData.Copy(); + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess Log make information failed. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + + try + { + //CpLog 파일 읽은 여부 확인 + if (dtShortLogData == null || getCpLogHeader == null) + { + throw new Exception("[" + strGetFileName + "] Reading to CpLog file failed."); + } + + CPXV2_CpLogProcessInfo.strGetFileName = strGetFileName; + + //해당 프로젝트 사용 객체 생성(Summary 생성 관련) + CommonProtocol cp = new CommonProtocol(); + + //Summary 테이블 다중 접근 방지(인덱스) + Stopwatch stMeasTime = new Stopwatch(); + stMeasTime.Start(); + + DataSet ds = null; + + bool hasRows = false; + + Int64 nSummaryRowsCount = 0; + + Int64 nShortTermLastNo = 0; + Int64 nLongTermLastNo = 0; + + Int64 nShortTermPreNo = 0; + Int64 nLongTermPreNo = 0; + + int nLogItemCnt = dtShortLogData.Rows.Count; + //int iNPos = 0; + + if (CPXV2_SummaryLastNoCheck(eConnCategory.ShortTerm, ref nShortTermLastNo, ref nSummaryRowsCount) == false) + throw new Exception(); + else + { + if (nShortTermLastNo == 0) + nShortTermLastNo = nSummaryRowsCount; + else + nShortTermLastNo += 1; + + nShortTermPreNo = nShortTermLastNo - 1; + } + + if (CPXV2_SummaryLastNoCheck(eConnCategory.LongTerm, ref nLongTermLastNo, ref nSummaryRowsCount) == false) + throw new Exception(); + else + { + if (nLongTermLastNo == 0) + nLongTermLastNo = nSummaryRowsCount; + else + nLongTermLastNo += 1; + + nLongTermPreNo = nLongTermLastNo - 1; + } + + //Summary 삽입 정보 생성 + if (bRequiredProcLogFile == false) + { + CPXV2_CpLogProcessInfo.strHostID = GetMappedInfo.objHost[0].Data.Trim(); + CPXV2_CpLogProcessInfo.strSection = GetMappedInfo.objSection[0].Data.Trim(); + CPXV2_CpLogProcessInfo.strStationID = getCpLogHeader.CHANNEL.Trim(); + CPXV2_CpLogProcessInfo.nShortTermIdent = nShortTermLastNo; + CPXV2_CpLogProcessInfo.nLongTermIdent = nLongTermLastNo; + CPXV2_CpLogProcessInfo.strStationName = GetMappedInfo.objStationName[0].Data; + CPXV2_CpLogProcessInfo.strProdNo_P = GetMappedInfo.objProdPNo[0].Data; + CPXV2_CpLogProcessInfo.strProdNo_C = GetMappedInfo.objProdCNo[0].Data; + CPXV2_CpLogProcessInfo.strTestType = GetMappedInfo.objTestType[0].Data; + CPXV2_CpLogProcessInfo.strTestCode = GetMappedInfo.objTestCode[0].Data; + CPXV2_CpLogProcessInfo.strVersion = GetMappedInfo.objVersion[0].Data; + CPXV2_CpLogProcessInfo.strProdCode = GetMappedInfo.objProdCode[0].Data; + CPXV2_CpLogProcessInfo.nTestListVariantNo = (int)GetMappedInfo.nTestListVariantNo; + CPXV2_CpLogProcessInfo.strTestListCntID = GetMappedInfo.objResultTestListCntID[0].Data; + } + else + { + CPXV2_CpLogProcessInfo.strHostID = dicSetLogFileInfo["HOST"]; + CPXV2_CpLogProcessInfo.strSection = dicSetLogFileInfo["SECTION"]; + CPXV2_CpLogProcessInfo.strStationID = getCpLogHeader.CHANNEL.Trim(); + CPXV2_CpLogProcessInfo.nShortTermIdent = nShortTermLastNo; + CPXV2_CpLogProcessInfo.nLongTermIdent = nLongTermLastNo; + CPXV2_CpLogProcessInfo.strStationName = dicSetLogFileInfo["STATION_NAME"]; + CPXV2_CpLogProcessInfo.strProdNo_P = dicSetLogFileInfo["P_TTNR"]; + CPXV2_CpLogProcessInfo.strProdNo_C = dicSetLogFileInfo["TTNR"]; + CPXV2_CpLogProcessInfo.strTestType = dicSetLogFileInfo["TEST_TYPE"]; + CPXV2_CpLogProcessInfo.strTestCode = dicSetLogFileInfo["TEST_CODE"]; + CPXV2_CpLogProcessInfo.strVersion = dicSetLogFileInfo["VERSION"]; + CPXV2_CpLogProcessInfo.strProdCode = dicSetLogFileInfo["PROD_CODE"]; + CPXV2_CpLogProcessInfo.nTestListVariantNo = Convert.ToInt32(dicSetLogFileInfo["VARIANT_NO"]); + CPXV2_CpLogProcessInfo.strTestListCntID = dicSetLogFileInfo["TESTLIST_ID"]; + } + + CPXV2_CpLogProcessInfo.dicCpLogHeader.Clear(); + CPXV2_CpLogProcessInfo.nGetReadStepVersion = int.MaxValue; + + /* + * CpLog Header 상 검사 시작 시간 획득 및 맨앞 공백 제거 + */ + CPXV2_CpLogProcessInfo.strStTime = getCpLogHeader.ST_TIME.Replace("_", " "); + CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 11, "-"); + CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 9, "-"); + CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 4, ":"); + CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 2, ":"); + + if (CPXV2_CpLogProcessInfo.strStTime[0] == ' ') + CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Remove(0, 1); + + try + { + //CpLog 헤더에 대한 항목 Dictionary 생성 > Summary 정보 삽입 위함 + Type type = typeof(CpLogHeader); + FieldInfo[] f = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + + foreach (FieldInfo item in f) + { + CPXV2_CpLogProcessInfo.dicCpLogHeader.Add(item.Name.Substring(item.Name.IndexOf("<") + 1, item.Name.IndexOf(">") - item.Name.IndexOf("<") - 1) + , item.GetValue(getCpLogHeader).ToString().Trim()); + } + // + CPXV2_CpLogProcessInfo.strCpLogFileComment = getCpLogHeader.COMMENT; + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CPXV2 CpLogProcess - CpLogHeader failed to create per-item for header. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + /* + string strQueryTestListInformation = "SELECT A.ProdNo_C, " + + "B.ProdNo_P, " + + "D.TestCode, " + + "B.FileName, " + + "B.UseTLPosition " + + "FROM [PROD_Release] AS A " + + "INNER JOIN(SELECT X.No, X.ProdNo_P, X.TestType, X.Version, X.ProdCode, X.FileName, X.UseTLPosition, X.GroupNo " + + "FROM [PROD_TestList] AS X WITH(NOLOCK) WHERE X.No = " + CpLogProcessInfo.nTestListVariantNo + " " + + "AND TestType = '" + CpLogProcessInfo.strTestType + "' " + + "AND Version = '" + CpLogProcessInfo.strVersion + "' " + + "AND ProdCode = '" + CpLogProcessInfo.strProdCode + "') AS B " + + "ON B.No = " + CpLogProcessInfo.nTestListVariantNo + " " + + "INNER JOIN(SELECT * FROM [PROD_Group] AS Y WITH(NOLOCK)) AS C " + + "ON C.No = B.GroupNo " + + "INNER JOIN(SELECT * FROM [STAT_TestCode] AS Z WITH(NOLOCK)) AS D " + + "ON A.ProdNo_C = '" + CpLogProcessInfo.strProdNo_C + "' " + + "AND D.TestCode = '" + CpLogProcessInfo.strTestCode + "' " + + "AND B.No = A.TestListNo AND D.No = A.TestCodeNo;"; + */ + + string strQueryTestListInformation = $"SELECT X.ProdNo_C, Z.ProdNo_P, Y.TestCode, J.FileName, Z.UseTLPosition, J.No AS 'TestListFileNo', Z.No AS 'VariantNo', J.TestType, J.Version, J.ProdCode " + + $"FROM [PROD_Release] AS X WITH(NOLOCK) " + + $"INNER JOIN [STAT_TestCode] AS Y WITH(NOLOCK) ON X.TestCodeNo = Y.No " + + $"INNER JOIN [PROD_Variant] AS Z WITH(NOLOCK) ON X.VariantNo = Z.No " + + $"INNER JOIN [PROD_Group] AS K WITH(NOLOCK) ON Z.GroupNo = K.No " + + $"INNER JOIN [STOR_TestListFile] AS J WITH(NOLOCK) ON Z.TestListFileNo = J.No " + + $"WHERE X.VariantNo = " + CPXV2_CpLogProcessInfo.nTestListVariantNo + " " + + $"AND X.ProdNo_C = '" + CPXV2_CpLogProcessInfo.strProdNo_C + "' " + + $"AND Y.TestCode = '" + CPXV2_CpLogProcessInfo.strTestCode + "' " + + $"AND J.TestType = '" + CPXV2_CpLogProcessInfo.strTestType + "' " + + $"AND J.Version = '" + CPXV2_CpLogProcessInfo.strVersion + "' " + + $"AND J.ProdCode = '" + CPXV2_CpLogProcessInfo.strProdCode + "' " + + $"ORDER BY X.No ASC;"; + + //Release 테스트리스트 정보 확인 [TestListNo] + strTestType + strTestCode + strVersion + strProdCode + thisConnInfo[iPos].geyLatestTestListInfo = QueryStreamProcess(eConnCategory.Main, strQueryTestListInformation); + + int nLoadPosition = 0; + + if (XCommons.isHasRow(thisConnInfo[iPos].geyLatestTestListInfo)) + nLoadPosition = Convert.ToInt32(thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["UseTLPosition"]); + else + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 CpLogProcess fail. Test-list cannot be searched with client information.(TestList Information) [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + int nGetTestListFileNo = int.MaxValue; + int nGetTestListVariantNo = int.MaxValue; + + string strGetTestListFileNo = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestListFileNo"].ToString(); + string strGetTestListVariantNo = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["VariantNo"].ToString(); + + if (int.TryParse(strGetTestListFileNo, out nGetTestListFileNo) == false || + int.TryParse(strGetTestListVariantNo, out nGetTestListVariantNo) == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 CpLogProcess fail. Test-list cannot be searched with client information.(TestListFileNo or TestListVariantNo) [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + CPXV2_CpLogProcessInfo.nTestListFileNo = nGetTestListFileNo; + CPXV2_CpLogProcessInfo.nTestListVariantNo = nGetTestListVariantNo; + + if (CPXV2_ReadVRFYList(iPos, CPXV2_CpLogProcessInfo.nTestListFileNo, CPXV2_CpLogProcessInfo.nTestListVariantNo, strProcessDebugInfo, out CPXV2_CpLogProcessInfo.nGetReadStepVersion, nLoadPosition, false) == false) + throw new Exception(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + " " + CPXV2_CpLogProcessInfo.nTestListVariantNo + " Failed ReadVRFYList()"); + + //동일 할시 로그 미처리 및 리턴 + var chkDataTsk = CPXV2_CheckDuplicateData(eConnCategory.ShortTerm, iPos, + CPXV2_CpLogProcessInfo.strStationName, + CPXV2_CpLogProcessInfo.strHostID, + CPXV2_CpLogProcessInfo.strSection, + nShortTermPreNo); + + //DB 에 전송한 Summary 객체 생성 + HISTLogSummary[] summaryItem = new HISTLogSummary[2]; + summaryItem[0] = new HISTLogSummary(); + summaryItem[1] = new HISTLogSummary(); + + CPXV2_MakeSummaryData(iPos, + CPXV2_CpLogProcessInfo.strStationName, + CPXV2_CpLogProcessInfo.strTestListCntID, + CPXV2_CpLogProcessInfo.strHostID, + CPXV2_CpLogProcessInfo.strSection, + ref summaryItem); + + Task tskLongTerm = null; + //if (MngDBConn.InfoConnection.UTSI_STATE == false) + + //tskLongTerm = Task.Run(async () => await CpLogProcessLongTerm(iPos, GetMappedInfo, getCpLogHeader, dtLogData, summaryItem[1])); + //var result = task.WaitAndUnwrapException(); + tskLongTerm = Task.Run(() => CPXV2_CpLogProcessLongTerm(iPos, nLongTermLastNo, nLongTermPreNo, getCpLogHeader, dtLongLogData, summaryItem[1])); + //tskLongTerm = CPXV2_CpLogProcessLongTerm(iPos, GetMappedInfo, getCpLogHeader, dtLongLogData, summaryItem[1]); + //tskLongTerm.Start(); + + if (chkDataTsk.Result) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 ShortTerm-CpLogProcess fail. Reason : ShortTerm Duplicated Before CpLog-File. [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + bDupLogSkipState = true; + + if (tskLongTerm != null) + lstBulkLongTermLog.Add(tskLongTerm.Result); + + return false; + } + + //Summary 객체를 이용해 DB 삽입할 SqlCommand 생성 + SqlCommand cmd = cp.LogDataSummaryInsert(MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE, summaryItem[0]); + + //Summary 삽입 > 실패시 처리 + bProcessResult = ExcuteNonQueryStreamProcess(eConnCategory.ShortTerm, cmd); + + // TODO : SHM JSON + /* + try + { + CpxShorTermLogJson.Instance.HIST_LogSummary.Add(new CPXV2LogJson.Tables.HIST_LogSummary + { + LogNo = nCurrentLogAccessKey, + LogCount = nLogItemCnt + 1, + StationName = summaryItem[0].StationName, + TestType = summaryItem[0].TestType, + Version = summaryItem[0].Version, + ProdCode = summaryItem[0].ProdCode, + TestListFileNo = summaryItem[0].TestListFileNo, + TestListVariantNo = summaryItem[0].TestListVariantNo, + TestListCntID = summaryItem[0].TestListCntID, + StepVersion = summaryItem[0].StepVersion, + HostID = summaryItem[0].Host, + Section = summaryItem[0].Section, + ProdNo_C = summaryItem[0].ProdNoC, + ProdNo_P = summaryItem[0].ProdNoP, + Testcode = summaryItem[0].TestCode, + TestListFileName = summaryItem[0].TestListFileName, + ProductID = summaryItem[0].ProductID, + Result = summaryItem[0].Result, + Duration = summaryItem[0].Duration, + TestDT = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime) + }); + CpxShorTermLogJson.Instance.SaveChanges(); + + } + catch (Exception e) + { + bProcessResult = false; + } + */ + + if (bProcessResult == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CPXV2 CpLogProcess HIST_LogSummary insert failed. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Red, LogMessageLevel.FATAL); + + //throw new Exception(); + } + else + { + //CpLog 삽입할 DataRow 생성 + DataRow[] SetMakeLogRows = CPXV2_ShortProcessMakeLogRows(nLogItemCnt + 1, thisConnInfo[iPos].dsLatestVRFYRel, dtShortLogData); + + if (SetMakeLogRows == null) + throw new Exception(""); + + StringBuilder ShortLogJsonSb = new StringBuilder(); + ShortLogJsonSb.Append(JsonConvert.SerializeObject(SetMakeLogRows.Select(x => new CPXV2Log.Tables.HIST_TestResult + { + StepID = (long)x.ItemArray[1], + MeasVal = (decimal)x.ItemArray[2], + MeasValStr = x.ItemArray[3].ToString(), + Message = x.ItemArray[4].ToString(), + GlobalMin = x.ItemArray[5].ToString(), + GlobalMAx = x.ItemArray[6].ToString(), + Result = x.ItemArray[7].ToString(), + SpentTime = x.ItemArray[8].ToString(), + })).GzipCompress()); + + DataTable SetProcLogTable; + SetProcLogTable = CPXV2_MakeProcLogTable(); + + DataRow SetProcLogDr = SetProcLogTable.NewRow(); + + //Make Comment Step + try + { + SetProcLogDr["No"] = Int64.MinValue; + SetProcLogDr["TestDT"] = DateTime.Now; + SetProcLogDr["LogData"] = '-'; + + //DataRow 를 설정된 DataTable Format으로 한행 생성 + SetProcLogDr["No"] = CPXV2_CpLogProcessInfo.nShortTermIdent; + SetProcLogDr["TestDT"] = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime); + + if (ShortLogJsonSb.ToString().Length > 0) + SetProcLogDr["LogData"] = ShortLogJsonSb.ToString(); + else + SetProcLogDr["LogData"] = '-'; + } + catch + { + SetProcLogDr["No"] = Int64.MinValue; + SetProcLogDr["TestDT"] = DateTime.Now; + SetProcLogDr["LogData"] = '-'; + + //throw new Exception(""); + } + + lstBulkShortTermLog.Add(SetProcLogDr); + } + + if (tskLongTerm != null) + lstBulkLongTermLog.Add(tskLongTerm.Result); + + //처리 시간 확인 + CPXV2_CpLogProcessInfo.lMainMeasTime = stMeasTime.ElapsedMilliseconds; + + if (GetMappedInfo.bShowCpLogProcessTime) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" MainTime : " + CPXV2_CpLogProcessInfo.lMainMeasTime.ToString() + ", SubTime(LongTerm) : " + CPXV2_CpLogProcessInfo.lLongTermMeasTime + " [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Green, LogMessageLevel.DEBUG); + } + + LogDataProcessText.Enqueue(new StringBuilder(">>[MainTime(ShortTerm)-MakeLogData][" + CPXV2_CpLogProcessInfo.lMainMeasTime + "][Include SubTime(LongTerm)-MakeLogData][" + CPXV2_CpLogProcessInfo.lLongTermMeasTime + "]\r\n")); + } + catch (Exception e) + { + bProcessResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" CPXV2 Make CpLogProcess fail.[SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + finally + { + if (bDupLogSkipState == false) + { + if (bProcessResult) + { + if (File.Exists(strSuccessFileName)) + File.Delete(strSuccessFileName); + } + else + { + if (bRequiredProcLogFile == false) + { + if (File.Exists(strSuccessFileName)) + File.Copy(strSuccessFileName, strFailedFileName); + } + } + } + } + + return bProcessResult; + } + + private async Task CPXV2_CpLogProcessLongTerm(int iPos, Int64 nLongTermNo, Int64 nLongTermPreNo, CpLogHeader getCpLogHeader, DataTable dtLogData, HISTLogSummary summaryItem) + { + Stopwatch stMeasTime = new Stopwatch(); + stMeasTime.Start(); + + bool bProcessResult = true; + + int nLogItemCnt = dtLogData.Rows.Count; + + DataTable SetProcLogTable; + SetProcLogTable = CPXV2_MakeProcLogTable(); + + DataRow SetProcLogDr = SetProcLogTable.NewRow(); + + try + { + SetProcLogDr["No"] = Int64.MinValue; + SetProcLogDr["TestDT"] = DateTime.Now; + SetProcLogDr["LogData"] = '-'; + + //동일 할시 로그 미처리 및 리턴 + var chkDataTsk = CPXV2_CheckDuplicateData(eConnCategory.LongTerm, iPos, + CPXV2_CpLogProcessInfo.strStationName, + CPXV2_CpLogProcessInfo.strHostID, + CPXV2_CpLogProcessInfo.strSection, + nLongTermPreNo); + + CommonProtocol cp = new CommonProtocol(); + + //Summary 객체를 이용해 DB 삽입할 SqlCommand 생성 + SqlCommand cmd = cp.LogDataSummaryInsert(MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SUMMARY_TABLE, summaryItem); + + if (chkDataTsk.Result) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 LongTerm-CpLogProcess fail. Reason : LongTerm Duplicated Before CpLog-File. [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + return SetProcLogDr; + } + + //Summary 삽입 > 실패시 처리 + bProcessResult = ExcuteNonQueryStreamProcess(eConnCategory.LongTerm, cmd); + + if (bProcessResult == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + + @" CPXV2 CpLogProcess HIST_LogSummary insert failed. [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessLongTerm]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + //CpLog 삽입할 DataRow 생성 + DataRow[] SetMakeLogRows = CPXV2_LongProcessMakeLogRows(nLogItemCnt + 1, thisConnInfo[iPos].dsLongTermLatestVRFYRel, dtLogData); + + if (SetMakeLogRows == null) + throw new Exception(""); + + StringBuilder LongLogJsonSb = new StringBuilder(); + LongLogJsonSb.Append(JsonConvert.SerializeObject(SetMakeLogRows.Select(x => new CPXV2Log.Tables.HIST_TestResult + { + StepID = (long)x.ItemArray[1], + MeasVal = (decimal)x.ItemArray[2], + MeasValStr = x.ItemArray[3].ToString(), + Message = x.ItemArray[4].ToString(), + GlobalMin = x.ItemArray[5].ToString(), + GlobalMAx = x.ItemArray[6].ToString(), + Result = x.ItemArray[7].ToString(), + SpentTime = x.ItemArray[8].ToString(), + })).GzipCompress()); + + //Make Comment Step + try + { + //DataRow 를 설정된 DataTable Format으로 한행 생성 + SetProcLogDr["No"] = CPXV2_CpLogProcessInfo.nLongTermIdent; + SetProcLogDr["TestDT"] = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime); + + if (LongLogJsonSb.ToString().Length > 0) + SetProcLogDr["LogData"] = LongLogJsonSb.ToString(); + else + SetProcLogDr["LogData"] = '-'; + } + catch + { + SetProcLogDr["No"] = Int64.MinValue; + SetProcLogDr["TestDT"] = DateTime.Now; + SetProcLogDr["LogData"] = '-'; + + throw new Exception(""); + } + + //처리 시간 확인 + CPXV2_CpLogProcessInfo.lLongTermMeasTime = stMeasTime.ElapsedMilliseconds; + } + catch (Exception e) + { + bProcessResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 LongTerm Make CpLogProcess fail.[SystemX.Net.MiddlewareUI : MainForm.CpLogProcessLongTerm]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + finally + { + ;// + } + + await Task.Delay(0); + + return SetProcLogDr; + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Command-LogScan.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Command-LogScan.cs new file mode 100644 index 0000000..96d7027 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Command-LogScan.cs @@ -0,0 +1,268 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; + +//using SystemX.Common.Protocol.SIA; + +using DevExpress.Utils.Extensions; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; +using SystemX.Net.Platform.SystemX.Common; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + private async void WatchRecvCommandQueue() + { + await Task.Delay(250); + + while (!m_bTaskCommandBlock) + { + try + { + CT.ThrowIfCancellationRequested(); + } + catch (OperationCanceledException CancelEx) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvCommndQueue]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + break; + } + // + try + { + if (bTaskCommandWaitLock == false) + QueryRecvCommandQueue(); + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed.[1] [SystemX.Net.MiddlewareUI : MainForm.WatchRecvCommndQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + + await Task.Delay(500); + } + } + + private bool LogMemoryPushProcess(int nPos, int nStPos) + { + int nSetSize = int.MaxValue; + byte[] ucSetLogArray = null; + + bool bProcResult = false; + + using (LogSharedMemory memLog = new LogSharedMemory(ParamterMapLog)) + { + if (memLog.CheckFile(nPos)) + { + LogMappedPacket LogMapFile = new LogMappedPacket(); + nSetSize = Marshal.SizeOf(LogMapFile); + ucSetLogArray = new byte[nSetSize]; + LogMapFile = (LogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, LogMapFile.GetType()); + + bool bFindLogResult = false; + + LogMapFile = memLog.Get(nPos, nStPos, out bFindLogResult, nSetSize).Value; + + if (bFindLogResult == false) + return false; + + if (LogMapFile.bLogFileReadComplete == false) + { + LogMapFile.bLogFileReadComplete = true; + + memLog.Set(nPos, LogMapFile); + + StringBuilder sb = new StringBuilder(); + sb.Append("[" + (++nEnqueueCount).ToString() + "][Enqueue]"); + sb.Append("["); + sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + sb.Append("], "); + sb.Append("Type [" + LogMapFile.objLogType[0].Data.ToString() + "], "); + sb.Append("S Port [" + LogMapFile.nStreamPort.ToString() + "], "); + sb.Append("C Port [" + LogMapFile.nCommandPort.ToString() + "], "); + sb.Append("Size [" + LogMapFile.nLogDataSize.ToString() + "], "); + sb.Append("Number [" + LogMapFile.nNumber.ToString() + "], "); + sb.Append("Host [" + LogMapFile.objHost[0].Data + "], "); + sb.Append("Section [" + LogMapFile.objSection[0].Data + "], "); + sb.Append("St Name [" + LogMapFile.objStationName[0].Data + "], "); + sb.Append("St ID [" + LogMapFile.nStationID.ToString() + "], "); + sb.Append("File Name [" + LogMapFile.objOptionFileName[0].Data + "], "); + sb.Append("File Extension [" + LogMapFile.objOptionFileExtension[0].Data + "] "); + + /* + sb.Append("TL ID[" + LogMapFile.objResultTestListCntID[0].Data + "], "); + sb.Append("V[" + LogMapFile.objProdPNo[0].Data + "], "); + sb.Append("PN[" + LogMapFile.objProdCNo[0].Data + "], "); + sb.Append("TT[" + LogMapFile.objTestType[0].Data + "], "); + sb.Append("TC[" + LogMapFile.objTestCode[0].Data + "], "); + sb.Append("Ver[" + LogMapFile.objVersion[0].Data + "], "); + sb.Append("PC[" + LogMapFile.objProdCode[0].Data + "], "); + sb.Append("DB V No[" + LogMapFile.nTestListVariantNo.ToString() + "] "); + */ + + sb.AppendLine(); + + if (nEnqueueCount >= Int64.MaxValue) + nEnqueueCount = 0; + + LogDataRecvText.Enqueue(sb); + + LogDataQueue[nPos].Enqueue(LogMapFile); + + bProcResult = true; + } + } + } + + return bProcResult; + } + + private bool QueryRecvCommandQueue() + { + bool bState = true; + + string strProcessDebugInfo = string.Empty; + + long l1 = long.MinValue; + long l2 = long.MinValue; + + try + { + bTaskCommandWaitLock = true; + + Stopwatch stProcessTimeChk = new Stopwatch(); + stProcessTimeChk.Start(); + + using (InfoLogSharedMemory memInfoLog = new InfoLogSharedMemory(ParamterMapInfoLog)) + { + InfoLogMappedPacket InfoLogMapFile = new InfoLogMappedPacket(); + int nSetSize = Marshal.SizeOf(InfoLogMapFile); + byte[] ucSetLogArray = new byte[nSetSize]; + InfoLogMapFile = (InfoLogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, InfoLogMapFile.GetType()); + + if (memInfoLog.CheckFile()) + { + bool bFindInfoLogResult = false; + + //로그 처리가 필요한 위치 조회 + bool[] bGetStationReadyLog = memInfoLog.Get(out bFindInfoLogResult, nSetSize); + + if (bFindInfoLogResult == false) + return bState; + + //Array.Copy(bGetStationReadyLog, 0, InfoLogMapFile.bLogDataReady, 0, SharedMemory.nMaxInfoFullAccessSize); + + Array.Clear(bCompareLogReadyState, 0, SharedMemory.nMaxInfoFullAccessSize); + for (int i = 0; i < SharedMemory.nMaxInfoFullAccessSize; i++) + { + if (bGetStationReadyLog[i] != bBeforeLogReadyState[i]) + bCompareLogReadyState[i] = true; + } + + //존재할 경우 + if (bCompareLogReadyState.Any(x => x == true)) + { + //존재하는 개수 파악 + bool[] arrCheckNum = Array.FindAll(bCompareLogReadyState, x => x == true); + + //개수 확인 + int nFindCount = arrCheckNum.Count(); + + //개수 만큼 Index 확인 + for (int i = 0; i < nFindCount; i++) + { + Stopwatch stItemTimeChk = new Stopwatch(); + stItemTimeChk.Start(); + + int nIdx = Array.FindIndex(bCompareLogReadyState, x => x == true); + + //Index 포트 변환 및 Station(최대 8) 확인 + int nPos = (nIdx / SharedMemory.nMaxStationSize) + PORT_DISTRIBUTION_NUM; + + int nAccessPart = nIdx / SharedMemory.nMaxStationSize; + int nSubPos = nIdx % SharedMemory.nMaxStationSize; + + if (bCompareLogReadyState[nIdx]) + { + LogMemoryPushProcess(nPos, nSubPos); + + bCompareLogReadyState[nIdx] = false; + } + + l2 = stItemTimeChk.ElapsedMilliseconds; + } + + /*for (int i = PORT_DISTRIBUTION_NUM; i < ALL_MANAGE_NUM && !m_bTaskStreamBlock; i++) + { + for (int j = (i - PORT_DISTRIBUTION_NUM) * SharedMemory.nMaxStationSize; + j < ((i - PORT_DISTRIBUTION_NUM) * SharedMemory.nMaxStationSize) + SharedMemory.nMaxStationSize; j++) + { + if (bGetStationReadyLog[j]) + { + LogMemoryProcess(i, j); + + bGetStationReadyLog[j] = false; + } + } + + Thread.Sleep(10); + }*/ + + //memInfoLog.Set(bGetStationReadyLog); + Array.Copy(bGetStationReadyLog, 0, bBeforeLogReadyState, 0, SharedMemory.nMaxInfoFullAccessSize); + } + } + + } + + l1 = stProcessTimeChk.ElapsedMilliseconds; + + if (l1 != long.MinValue && l2 != long.MinValue) + { + LogDataRecvText.Enqueue(new StringBuilder(">>[Enqueue-Process][" + l1.ToString() + "][Enqueue-Item][" + l2.ToString() + "]\r\n")); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue process fail.[SystemX.Net.MiddlewareUI : MainForm.QueryRecvCommandQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + bState = false; + } + finally + { + bTaskCommandWaitLock = false; + } + + return bState; + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/FileProcess.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/FileProcess.cs new file mode 100644 index 0000000..62dff1a --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/FileProcess.cs @@ -0,0 +1,73 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using System.Threading.Tasks; + +//using SystemX.Common.Protocol.SIA; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using SystemX.Net.Platform.Common.ExtensionMethods; +using SystemX.Net.Platform.SystemX.Common; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + /* + private string GetFileName(int iPos, LogMappedPacket GetMappedInfo, string strCreateName, string strSubName) + { + Random randNumber = new Random(); + + string strFileName = strCreateName; + + if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0) + strFileName += @strSubName + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + else + strFileName += @GetMappedInfo.objOptionFileName[0].Data + @GetMappedInfo.objOptionFileExtension[0].Data; + + if (File.Exists(strFileName) == true) + { + while (true) + { + strFileName = strCreateName; + + if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0) + strFileName += @strSubName + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + else + strFileName += @GetMappedInfo.objOptionFileName[0].Data + "_" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data; + + if (File.Exists(strFileName) == false) + break; + } + } + + return strFileName; + } + */ + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Function.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Function.cs new file mode 100644 index 0000000..f2ae1ea --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Function.cs @@ -0,0 +1,214 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using System.Threading.Tasks; + +//using SystemX.Common.Protocol.SIA; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using System.Threading; +using SystemX.Net.Platform.Common.ExtensionMethods; + +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; +using System.Net.NetworkInformation; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + public bool CPX_ReadVRFYList(int nConnId, int nTestListNo, string strProcessDebugInfo, out int nReadStepVersion, /*int nSetReadStepVersion,*/ int nLoadPosition = 0, bool bForceRead = true) + { + nReadStepVersion = int.MaxValue; + + try + { + string strGetVersionTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VERSION_TABLE; + string strGetVRFYTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VRFY_TABLE; + + try + { + //해당 테스트리스 정보 마지막 업데이트 번호 가져오기 + thisConnInfo[nConnId].getLatestStepVer = QueryStreamProcess(eConnCategory.Main, "SELECT LatestStepVersion FROM [" + strGetVersionTableName + "] WHERE TestlistNo = " + nTestListNo + ";"); + + nReadStepVersion = Convert.ToInt32(thisConnInfo[nConnId].getLatestStepVer.Tables[0].Rows[0]["LatestStepVersion"]); + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CpLogProcess [" + strGetVersionTableName + "] MSV failed to obtain the most recent update number for VRFY (VRFY could not be found with the loading test list information.). [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + //이전 버전 사용 일시 + if (nLoadPosition > 0) + nReadStepVersion -= nLoadPosition; + + /* Changed + * 마지막 업데이트 번호가 다를때만 테스트리스트(VRFY) 갱신(Enabled Step 별 가장 최근 업데이트 번호 목록 정리) + * > 항상 최근 해당 테스트리스트(VRFY) 조회로 변경 + * > 매번 조회시 속도 문제로 동일한 VRFY일 경우 SKIP + * > INDEX 사용 + */ + if (bForceRead || + (thisConnInfo[nConnId].bQueryVRFYLoaded == false || + thisConnInfo[nConnId].nLastQueryTLFileNumber != nTestListNo || + thisConnInfo[nConnId].nLastQueryTLStepVersion != nReadStepVersion)) + { + try + { + thisConnInfo[nConnId].dsLatestVRFYRel = QueryStreamProcess(eConnCategory.Main, "SELECT * FROM ( " + + "SELECT *, ROW_NUMBER() OVER(PARTITION BY StepID ORDER BY StepVersion DESC) " + + "AS RN FROM [" + strGetVRFYTableName + "] WITH (INDEX=[CSK_VRFY_Release_1]) WHERE TestlistNo = " + nTestListNo + " " + + "AND StepVersion <= " + nReadStepVersion + ") X WHERE RN = 1 ORDER BY X.StepID ASC;"); + + thisConnInfo[nConnId].dsLongTermLatestVRFYRel = thisConnInfo[nConnId].dsLatestVRFYRel.Copy(); + + DataColumn[] keys1 = new DataColumn[1]; + keys1[0] = new DataColumn(); + keys1[0] = thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].Columns["StepID"]; + + thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].PrimaryKey = keys1; + + DataColumn[] keys2 = new DataColumn[1]; + keys2[0] = new DataColumn(); + keys2[0] = thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].Columns["StepID"]; + + thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].PrimaryKey = keys2; + + thisConnInfo[nConnId].nLastQueryTLFileNumber = nTestListNo; + thisConnInfo[nConnId].nLastQueryTLStepVersion = nReadStepVersion; + + thisConnInfo[nConnId].bQueryVRFYLoaded = true; + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CpLogProcess Failed to get list from [" + strGetVRFYTableName + "]. [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + } + } + catch + { + return false; + } + + return true; + } + + public bool CPXV2_ReadVRFYList(int nConnId, int nTestListFileNo, int nTestListVariantNo, string strProcessDebugInfo, out int nReadStepVersion, /*int nSetReadStepVersion,*/ int nLoadPosition = 0, bool bForceRead = true) + { + nReadStepVersion = int.MaxValue; + + try + { + //HIST_TestListFileLatestStepVersion + //VRFY_TestListFileRelease + + string strGetVersionTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VERSION_TABLE; + string strGetVRFYTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VRFY_TABLE; + + try + { + //해당 테스트리스 정보 마지막 업데이트 번호 가져오기 + thisConnInfo[nConnId].getLatestStepVer = QueryStreamProcess(eConnCategory.Main, "SELECT LatestStepVersion FROM [" + strGetVersionTableName + "] WITH(NOLOCK) WHERE TestListFileNo = " + nTestListFileNo + ";"); + + nReadStepVersion = Convert.ToInt32(thisConnInfo[nConnId].getLatestStepVer.Tables[0].Rows[0]["LatestStepVersion"]); + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CpLogProcess [" + strGetVersionTableName + "] MSV failed to obtain the most recent update number for VRFY (VRFY could not be found with the loading test list information.). [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + + //이전 버전 사용 일시 + if (nLoadPosition > 0) + nReadStepVersion -= nLoadPosition; + + /* Changed + * 마지막 업데이트 번호가 다를때만 테스트리스트(VRFY) 갱신(Enabled Step 별 가장 최근 업데이트 번호 목록 정리) + * > 항상 최근 해당 테스트리스트(VRFY) 조회로 변경 + * > 매번 조회시 속도 문제로 동일한 VRFY일 경우 SKIP + * > INDEX 사용 + */ + if (bForceRead || + (thisConnInfo[nConnId].bQueryVRFYLoaded == false || + thisConnInfo[nConnId].nLastQueryTLFileNumber != nTestListFileNo || + thisConnInfo[nConnId].nLastQueryTLVariantNumber != nTestListVariantNo || + thisConnInfo[nConnId].nLastQueryTLStepVersion != nReadStepVersion)) + { + try + { + string strQueryVRFY = "SELECT * FROM ( " + + "SELECT *, ROW_NUMBER() OVER(PARTITION BY StepID ORDER BY StepVersion DESC) " + + "AS RN FROM [" + strGetVRFYTableName + "] WITH (NOLOCK, INDEX=[CSK_VRFY_Release_2]) WHERE TestListFileNo = " + nTestListFileNo + " " + + "AND StepVersion <= " + nReadStepVersion + ") X WHERE RN = 1 ORDER BY X.StepID ASC;"; + + thisConnInfo[nConnId].dsLatestVRFYRel = QueryStreamProcess(eConnCategory.Main, strQueryVRFY); + + thisConnInfo[nConnId].dsLongTermLatestVRFYRel = thisConnInfo[nConnId].dsLatestVRFYRel.Copy(); + + DataColumn[] keys1 = new DataColumn[1]; + keys1[0] = new DataColumn(); + keys1[0] = thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].Columns["StepID"]; + + thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].PrimaryKey = keys1; + + DataColumn[] keys2 = new DataColumn[1]; + keys2[0] = new DataColumn(); + keys2[0] = thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].Columns["StepID"]; + + thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].PrimaryKey = keys2; + + thisConnInfo[nConnId].nLastQueryTLFileNumber = nTestListFileNo; + thisConnInfo[nConnId].nLastQueryTLVariantNumber = nTestListVariantNo; + thisConnInfo[nConnId].nLastQueryTLStepVersion = nReadStepVersion; + + thisConnInfo[nConnId].bQueryVRFYLoaded = true; + } + catch + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + + @" CpLogProcess Failed to get list from [" + strGetVRFYTableName + "]. [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL); + + throw new Exception(); + } + } + } + catch + { + return false; + } + + return true; + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Query.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Query.cs new file mode 100644 index 0000000..706d07b --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Query.cs @@ -0,0 +1,456 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using System.Threading.Tasks; + +//using SystemX.Common.Protocol.SIA; + +using SystemX.Net.Middleware.Log.Commons; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using System.Threading; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + private bool IsImageExtension(string strFileNameInfo, bool bOnlyExtension = true) + { + if (bOnlyExtension) + return -1 != Array.IndexOf(COMMON.mediaExtensions, strFileNameInfo.ToUpperInvariant()); + else + return -1 != Array.IndexOf(COMMON.mediaExtensions, Path.GetExtension(strFileNameInfo).ToUpperInvariant()); + } + + public List QueryStreamProcess(string strGetQuery, out byte[] ucQueryByteArray, out DataSet setResultDataSet) + { + SqlDataReader xSqlReader = null; + + int iFieldCnt = 0; + int iRecordsAffectedCnt = 0; + bool bHasRow = false; + + ucQueryByteArray = null; + + setResultDataSet = null; + + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + DataSet getDS = Task.Run(() => + { + try + { + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabase(strGetQuery); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + + return ds; + }).Result; + + if(XCommons.isHasRow(ds)) + setResultDataSet = ds.Copy(); + + List getStreamList = XCommons.ObjectToByteStreamList(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.RAW_SIZE), getDS); + + return getStreamList; + } + + public void QueryResultRemake(DataSet dsResult, int iSetFieldCnt, int iSetRecordsAffectedCnt, bool bSetHasRow, out byte[] ucQueryByteArray, params string[] strParameters) + { + int iFieldCnt = iSetFieldCnt; + int iRecordsAffectedCnt = iSetRecordsAffectedCnt; + bool bHasRow = bSetHasRow; + + ucQueryByteArray = null; + + ucQueryByteArray = XCommons.ObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.DATASET_TRANSEFER), + dsResult, + null, + 0, + iRecordsAffectedCnt, + bHasRow, + iFieldCnt, + strParameters); + } + + public Tuple QueryProcess(string strGetQuery, out byte[] ucQueryByteArray, params string[] strParameters) + { + SqlDataReader xSqlReader = null; + + int iFieldCnt = 0; + int iRecordsAffectedCnt = 0; + bool bHasRow = false; + + ucQueryByteArray = null; + + DataSet getDS = Task.Run(() => + { + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + try + { + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabase(strGetQuery); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + + return ds; + }).Result; + + ucQueryByteArray = XCommons.ObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.DATASET_TRANSEFER), + getDS, + null, + 0, + iRecordsAffectedCnt, + bHasRow, + iFieldCnt, + strParameters); + + return new Tuple(getDS, iRecordsAffectedCnt, iFieldCnt, bHasRow); + } + + private bool ExcuteNonQueryCommandProcess(SqlCommand cmd) + { + return Task.Run(() => + { + bool bExcuteResult = true; + + try + { + try + { + bExcuteResult = MngDBLogConn.CurrentConnection(eConnCategory.Main).ExecuteNonCommandQuery(cmd); + } + catch (Exception e) + { + bExcuteResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + cmd.CommandText + "> Query excute fail![SystemX.Net.MiddlewareUI : MainForm.AsyncExcuteNonQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + ; + } + + return bExcuteResult; + }).Result; + } + + private bool ExcuteNonQueryStreamProcess(eConnCategory eConnType, SqlCommand cmd) + { + return Task.Run(() => + { + bool bExcuteResult = true; + + try + { + try + { + bExcuteResult = MngDBLogConn.CurrentConnection(eConnType).ExecuteNonStreamQuery(cmd); + } + catch (Exception e) + { + bExcuteResult = false; + + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + cmd.CommandText + "> Query excute fail![SystemX.Net.MiddlewareUI : MainForm.AsyncExcuteNonQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + ; + } + + return bExcuteResult; + }).Result; + } + + private DataSet QueryCommandProcess(eConnCategory eConnType, string strGetQuery, bool bUseTransaction = false) + { + return Task.Run(() => + { + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + try + { + SqlDataReader xSqlReader = null; + + try + { + int iFieldCnt = 0; + int iRecordsAffectedCnt = 0; + bool bHasRow = false; + + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryCommandDatabase(strGetQuery, bUseTransaction); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + } + finally + { + ; + } + + return ds; + }).Result; + } + + private DataSet QueryStreamProcess(eConnCategory eConnType, string strGetQuery) + { + return Task.Run(() => + { + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + try + { + SqlDataReader xSqlReader = null; + + try + { + int iFieldCnt = 0; + int iRecordsAffectedCnt = 0; + bool bHasRow = false; + + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryStreamDatabase(strGetQuery); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + } + finally + { + ; + } + + return ds; + }).Result; + } + + private DataSet QueryStreamProcess(eConnCategory eConnType, string strGetQuery, ref int nRecAffectedCnt) + { + nRecAffectedCnt = -2; + + int iFieldCnt = 0; + int iRecordsAffectedCnt = -2; + bool bHasRow = false; + + DataSet dsResult = null; + + dsResult = Task.Run(() => + { + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + try + { + SqlDataReader xSqlReader = null; + + try + { + + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryStreamDatabase(strGetQuery); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + //Default -2 Fail 0 Select -1 + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + } + finally + { + ; + } + + return ds; + }).Result; + + nRecAffectedCnt = iRecordsAffectedCnt; + + return dsResult; + } + + private DataSet QueryProcess(string strGetQuery) + { + return Task.Run(() => + { + SqlDataReader xSqlReader = null; + + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + + int iFieldCnt = 0; + int iRecordsAffectedCnt = 0; + bool bHasRow = false; + + try + { + try + { + xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabaseSub(strGetQuery); + + if (xSqlReader != null) + { + iFieldCnt = xSqlReader.FieldCount; + iRecordsAffectedCnt = xSqlReader.RecordsAffected; + bHasRow = xSqlReader.HasRows; + + dt.Load(xSqlReader); + ds.Tables.Add(dt); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + finally + { + if (xSqlReader != null) + xSqlReader.Close(); + + xSqlReader = null; + } + + return ds; + }).Result; + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Stream-LogProcess.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Stream-LogProcess.cs new file mode 100644 index 0000000..8a544a2 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Stream-LogProcess.cs @@ -0,0 +1,701 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.IO.Compression; +using System.Diagnostics; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using System.Threading.Tasks; + +//using SystemX.Common.Protocol.SIA; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using System.Threading; +using SystemX.Net.Middleware.Log.Commons; +using SystemX.Net.Platform.SystemX.Common; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; +using SystemX.Net.Middleware.Log.DeleteProc; +using SystemX.Net.Comm.IIS_FTP; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + private async void WatchRecvStreamQueue() + { + await Task.Delay(250); + + stCheckTermBulkWaitTime.Start(); + while (!m_bTaskStreamBlock) + { + try + { + CT.ThrowIfCancellationRequested(); + } + catch (OperationCanceledException CancelEx) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + break; + } + // + try + { + if (bDatabaseConnResult == false) + continue; + + if (MngDBLogConn.GetMainDBAccessTime() >= 120000) + QueryStreamProcess(eConnCategory.Main, "SELECT GETDATE() AS 'CHECK PING';"); + if (MngDBLogConn.GetShortTermDBAccessTime() >= 120000) + QueryStreamProcess(eConnCategory.ShortTerm, "SELECT GETDATE() AS 'CHECK PING';"); + if (MngDBLogConn.GetLongTermDBAccessTime() >= 120000) + QueryStreamProcess(eConnCategory.LongTerm, "SELECT GETDATE() AS 'CHECK PING';"); + + nBulkLogCount = lstBulkTermLogInfo.Count; + nBulkLongTermCount = lstBulkShortTermLog.Count; + nBulkShortTermCount = lstBulkLongTermLog.Count; + nBulkTimeValue = stCheckTermBulkWaitTime.ElapsedMilliseconds; + + if (stCheckTermBulkWaitTime.ElapsedMilliseconds >= LoadInfo.BULK_ProcessTime_ms || bTryBulkInsertBuffer) + { + Stopwatch stMeasProcTime = new Stopwatch(); + + if (lstBulkTermLogInfo.Count > 0) + { + stMeasProcTime.Start(); + + foreach (string str in lstBulkTermLogInfo.ToArray()) + { + LogDataRecvText.Enqueue(new StringBuilder(str)); + LogDataRecvText.Enqueue(new StringBuilder("\r\n")); + } + + lstBulkTermLogInfo.Clear(); + } + // + if(lstBulkShortTermLog.Count > 0) + SetLogDataInsertProc(eConnCategory.ShortTerm); + if (lstBulkLongTermLog.Count > 0) + SetLogDataInsertProc(eConnCategory.LongTerm); + + BULK_INSERT_EXIT: + + if (stMeasProcTime.IsRunning) + { + LogDataRecvText.Enqueue(new StringBuilder(">>[BulkInsert-Process][" + stMeasProcTime.ElapsedMilliseconds.ToString() + "]\r\n")); + + //Check Server Time And Db Change + bDatabaseConnResult = MngDBLogConn.CheckDatabaseConnection(); + } + + bTryBulkInsertBuffer = false; + + stCheckTermBulkWaitTime.Restart(); + } + + //Map Log File Check + if (bTaskStreamWaitLock == false) + QueryRecvStreamQueue(); + + // TODO : FTP ALIS + if (StateFTP != eFTPServiceStatus.Connected) + goto ROUTINE_END; + + //FTP Server Check + nFTPTimeValue = stProcessCheckFTPTime.ElapsedMilliseconds; + + if (stProcessCheckFTPTime.ElapsedMilliseconds >= LoadInfo.FTP_ScanTime_ms) + { + List lstFile = ControlFTP.PositionRootCheckList(); + + List lstDownlaodFile = new List(); + List lstDeleteFailedFile = new List(); + + if (lstFile.Count == 0) + goto BRANCH_EXIT; + + string strGetDownloadPath = GetFTPDownloadPath(); + + foreach (string f in lstFile) + lstDownlaodFile.Add(await ControlFTP.FileDownload(f, strGetDownloadPath)); + + foreach (string f in lstDownlaodFile) + { + string strGetFileName = Path.GetFileName(f); + + if (ControlFTP.DeleteFile(strGetFileName) == false) + lstDeleteFailedFile.Add(strGetFileName); + } + + BRANCH_EXIT: + + ProcFTPCheckLogFiles(); + + foreach (string f in lstDeleteFailedFile) + { + string strGetFileName = Path.GetFileName(f); + + if (ControlFTP.DeleteFile(strGetFileName) == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"FTP > file delete process failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + + stProcessCheckFTPTime.Restart(); + } + + ROUTINE_END:; + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + + await Task.Delay(100); + } + } + + private void SetLogDataInsertProc(eConnCategory SetCategory) + { + bool bBulkCopyResult = true; + + string strSetLogTable = string.Empty; + string strAddText = string.Empty; + + if (SetCategory == eConnCategory.ShortTerm) + { + strSetLogTable = MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE; + strAddText = "ShortTerm"; + } + else if (SetCategory == eConnCategory.LongTerm) + { + strSetLogTable = MngDBLogConn.GetDBConnectInfo().ConnLongTerm.LOG_TABLE; + strAddText = "LongTerm"; + } + + try + { + //LogData Set Bulk + using (SqlTransaction sqlTran = MngDBLogConn.CurrentConnection(SetCategory).getConnection().BeginTransaction()) + { + //Sql Bulk Insert 준비 - Short Log + //Make Result Command + SqlBulkCopy sbc = new SqlBulkCopy(sqlTran.Connection, + SqlBulkCopyOptions.CheckConstraints | + SqlBulkCopyOptions.FireTriggers | + SqlBulkCopyOptions.KeepNulls, sqlTran); + sbc.BatchSize = 5000; + sbc.DestinationTableName = "dbo." + strSetLogTable; + sbc.BulkCopyTimeout = 120; + + try + { + // Write from the source to the destination. + //생성된 DataRow 들을 Bulk Copy 실시 + if (SetCategory == eConnCategory.ShortTerm) + sbc.WriteToServer(lstBulkShortTermLog.ToArray()); + else if (SetCategory == eConnCategory.LongTerm) + sbc.WriteToServer(lstBulkLongTermLog.ToArray()); + + //if (MngDBConn.InfoConnection.UTSI_STATE) + //{ + // //Long Log + // SqlBulkCopy sbcL = new SqlBulkCopy(sqlTran.Connection, + // SqlBulkCopyOptions.CheckConstraints | + // SqlBulkCopyOptions.FireTriggers | + // SqlBulkCopyOptions.KeepNulls, sqlTran); + // sbcL.BatchSize = 5000; + // sbcL.DestinationTableName = "dbo.HIST_TestResultLongTerm"; + // sbcL.BulkCopyTimeout = 120; + // + // sbcL.WriteToServer(SetMakeLogRows); + //} + } + catch (Exception ex) + { + Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + $@" CPXV2 CpLogProcess fail.({strAddText} - Bulk Upload) [SystemX.Net.MiddlewareUI : MainForm.SetLogDataInsertProc]\r\n" + ex.Message, ConsoleColor.Red, LogMessageLevel.FATAL); + + bBulkCopyResult = false; + } + finally + { + // Close the SqlDataReader. The SqlBulkCopy + // object is automatically closed at the end + // of the using block. + if (bBulkCopyResult) + { + sqlTran.Commit(); + + if (SetCategory == eConnCategory.ShortTerm) + lstBulkShortTermLog.Clear(); + else if (SetCategory == eConnCategory.LongTerm) + lstBulkLongTermLog.Clear(); + + LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - All CpLogs(Bulk)Process Result [OK]>\r\n")); + } + else + { + sqlTran.Rollback(); + + LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - All CpLogs(Bulk)Process Result [NOK]>\r\n")); + + //throw new Exception(); + } + } + } + } + catch + { + ;// + } + finally + { + ;// + } + + if (bBulkCopyResult == false) + { + CommonProtocol cp = new CommonProtocol(); + + List lstRefRow = null; + + if (SetCategory == eConnCategory.ShortTerm) + lstRefRow = lstBulkShortTermLog; + else if (SetCategory == eConnCategory.LongTerm) + lstRefRow = lstBulkLongTermLog; + + foreach (DataRow dr in lstRefRow) + { + if (Convert.ToInt64(dr["No"]) == Int64.MinValue) + continue; + + //Summary 객체를 이용해 DB 삽입할 SqlCommand 생성 + SqlCommand cmd = cp.LogDataResultInsert(strSetLogTable, dr); + + //Summary 삽입 > 실패시 처리 + bool bProcessResult = ExcuteNonQueryStreamProcess(SetCategory, cmd); + + if (bProcessResult == false) + { + LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - CpLogs(Command) Process Result [NOK]>\r\n")); + + continue; + } + else + LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - CpLogs(Command) Process Result [OK]>\r\n")); + } + + if (SetCategory == eConnCategory.ShortTerm) + lstBulkShortTermLog.Clear(); + else if (SetCategory == eConnCategory.LongTerm) + lstBulkLongTermLog.Clear(); + } + } + + private bool QueryRecvStreamQueue() + { + //StackTrace st = new StackTrace(true); + + bool bState = true; + + string strProcessDebugInfo = string.Empty; + + long l1 = long.MinValue; + long l2 = long.MinValue; + + try + { + bTaskStreamWaitLock = true; + + //Log Process + Stopwatch stProcessTimeChk = new Stopwatch(); + stProcessTimeChk.Start(); + + for (int i = PORT_DISTRIBUTION_NUM; i < ALL_MANAGE_NUM && !m_bTaskCommandBlock; i++) + { + Stopwatch stItemTimeChk = new Stopwatch(); + stItemTimeChk.Start(); + + if (LogDataQueue[i].Count <= 0) + continue; + + LogMappedPacket LogMapFile = new LogMappedPacket(); + int nSetSize = Marshal.SizeOf(LogMapFile); + byte[] ucSetLogArray = new byte[nSetSize]; + LogMapFile = (LogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, LogMapFile.GetType()); + + int iPos = LogMapFile.nNumber; + strProcessDebugInfo = "[" + (iPos).ToString("D2") + "]" + + "[" + LogMapFile.nCommandPort + "]" + + "[" + LogMapFile.objHost[0].Data + "]" + + "[" + LogMapFile.objSection[0].Data + "]"; + // + if (LogDataQueue[i].TryPeek(out LogMapFile)) //LogDataQueue[i].TryDequeue(out LogMapFile)) + { + if (bShowCpLogProcessTime) + LogMapFile.bShowCpLogProcessTime = true; + + StringBuilder sb = new StringBuilder(); + sb.Append("[" + (++nDequeueCount).ToString() + "][TryDequeue]"); + sb.Append("["); + sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); + sb.Append("], "); + sb.Append("Type [" + LogMapFile.objLogType[0].Data.ToString() + "], "); + sb.Append("S Port [" + LogMapFile.nStreamPort.ToString() + "], "); + sb.Append("C Port [" + LogMapFile.nCommandPort.ToString() + "], "); + sb.Append("Size [" + LogMapFile.nLogDataSize.ToString() + "], "); + sb.Append("Number [" + LogMapFile.nNumber.ToString() + "], "); + sb.Append("Host [" + LogMapFile.objHost[0].Data + "], "); + sb.Append("Section [" + LogMapFile.objSection[0].Data + "], "); + sb.Append("St Name [" + LogMapFile.objStationName[0].Data + "], "); + sb.Append("St ID [" + LogMapFile.nStationID.ToString() + "], "); + sb.Append("File Name [" + LogMapFile.objOptionFileName[0].Data + "], "); + sb.Append("File Extension [" + LogMapFile.objOptionFileExtension[0].Data + "] "); + sb.Append("TL ID[" + LogMapFile.objResultTestListCntID[0].Data + "], "); + sb.Append("V[" + LogMapFile.objProdPNo[0].Data + "], "); + sb.Append("PN[" + LogMapFile.objProdCNo[0].Data + "], "); + sb.Append("TT[" + LogMapFile.objTestType[0].Data + "], "); + sb.Append("TC[" + LogMapFile.objTestCode[0].Data + "], "); + sb.Append("Ver[" + LogMapFile.objVersion[0].Data + "], "); + sb.Append("PC[" + LogMapFile.objProdCode[0].Data + "], "); + sb.Append("DB V No[" + LogMapFile.nTestListVariantNo.ToString() + "], "); + + if (nDequeueCount >= Int64.MaxValue) + nDequeueCount = 0; + + bool bProcResult = false; + + if (MngDBLogConn.GetDBConnectInfo().ConnVersion == XDBConnInfo.eVersion.CPX) + { + sb.Append("!Use Log Process Version [CPX] - No longer supported."); + + //bProcResult = CPX_CpLogProcess(LogMapFile); + + bProcResult = false; + } + else if (MngDBLogConn.GetDBConnectInfo().ConnVersion == XDBConnInfo.eVersion.CPXV2) + { + bProcResult = CPXV2_CpLogProcess(LogMapFile); + + if(bProcResult == true) + lstBulkTermLogInfo.Add(sb.ToString()); + + sb.Append("!Use Log Process Version [CPXV2] "); + } + + if (bProcResult) + sb.Append(""); + else + sb.Append(""); + + sb.AppendLine(); + + LogDataProcessText.Enqueue(sb); + + if (LogDataQueue[i].TryDequeue(out LogMapFile) == false) + { + if (LogDataQueue[i].TryDequeue(out LogMapFile) == false) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue try-dequeue failed. [SystemX.Net.MiddlewareUI : MainForm.QueryRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG); + } + } + } + + l2 = stItemTimeChk.ElapsedMilliseconds; + } + + l1 = stProcessTimeChk.ElapsedMilliseconds; + + if (l1 != long.MinValue && l2 != long.MinValue) + { + LogDataProcessText.Enqueue(new StringBuilder(">>[TryDequeue-Process][" + l1.ToString() + "][TryDequeue-Item][" + l2.ToString() + "]\r\n")); + } + } + catch (Exception e) + { + MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue stream process unknown fail. [SystemX.Net.MiddlewareUI : MainForm.QueryRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); + + bState = false; + } + finally + { + bTaskStreamWaitLock = false; + } + + return bState; + } + + // TODO : FTP ALIS + internal eFTPServiceStatus StartFTPService() + { + ControlFTP = new CtrlFTP(LoadInfo.FTP_Use, + IPAddress.Parse(LoadInfo.FTP_IPAddress), Convert.ToInt32(LoadInfo.FTP_Port), + LoadInfo.FTP_Account, LoadInfo.FTP_Password); + + if (ControlFTP.FTPConnState) + return eFTPServiceStatus.Connected; + else + return eFTPServiceStatus.Disconnected; + } + + private string GetFTPDownloadPath() + { + string strYYYY = DateTime.Today.ToString("yyyy"); + string strMM = DateTime.Today.ToString("MM"); + string strdd = DateTime.Today.ToString("dd"); + + string strHHmmssfff = DateTime.Now.ToString("HHmmssfff"); + string strGetRoot = Path.GetPathRoot(Environment.CurrentDirectory); + string DirPath = @strGetRoot + $@"\XProc\FTP\CpLog\{strYYYY}\{strMM}\{strdd}\"; + + //string CpLogDirPath = @strGetRoot + $@"XProcCpLog\Temp\{strYYYY}\{strMM}\{strdd}\{strHHmmssfff}\"; + + DirectoryInfo di1 = new DirectoryInfo(@DirPath); + if (!di1.Exists) Directory.CreateDirectory(@DirPath); + + //DirectoryInfo di2 = new DirectoryInfo(@CpLogDirPath); + //if (!di2.Exists) Directory.CreateDirectory(@CpLogDirPath); + + return DirPath; + } + + private void ProcFTPCheckLogFiles() + { + //Scan And Send File + string strGetRoot = Path.GetPathRoot(Environment.CurrentDirectory); + + //오늘 포함 -6일전까지 검색 + string[] strScanYYYY = new string[7]; + string[] strScanMM = new string[7]; + string[] strScandd = new string[7]; + + for (int n = 6; n >= 0; n--) + { + DateTime dtSet = DateTime.Today.AddDays(-n); + strScanYYYY[n] = dtSet.ToString("yyyy"); + strScanMM[n] = dtSet.ToString("MM"); + strScandd[n] = dtSet.ToString("dd"); + } + // + // 7일치 위치 확인 + // + for (int n = 0; n < 7; n++) + { + string DirPath = strGetRoot + $@"\XProc\FTP\CpLog\{strScanYYYY[n]}\{strScanMM[n]}\{strScandd[n]}\"; + string DirMovePath = strGetRoot + $@"\XProc\FTP\CpLog\{strScanYYYY[n]}\{strScanMM[n]}\{strScandd[n]}\History\"; + + //생성 폴더가 없을경우 SKIP + if (Directory.Exists(DirPath) == false) + continue; + + if (Directory.Exists(DirMovePath) == false) + Directory.CreateDirectory(DirMovePath); + + string fileExtension = "zip"; + + string[] dirs = Directory.GetDirectories(DirPath); + string[] files = Directory.GetFiles(DirPath, $"*.{fileExtension}", SearchOption.TopDirectoryOnly); + + if (files.Length <= 0) + continue; + + ProcFTPLogFiles(files, DirPath, DirMovePath); + } + } + + private void ProcFTPLogFiles(string[] strArrFiles, string strReadDirPath, string strMoveDirPath) + { + string strExtractFilePos = string.Empty; + string strOrgRemoveFilePos = string.Empty; + + string strHeaderInfo = string.Empty; + string strLogFileNameInfo = string.Empty; + + long l1 = long.MinValue; + + //Log Process + Stopwatch stProcessTimeChk = new Stopwatch(); + stProcessTimeChk.Start(); + + foreach (string f in strArrFiles) + { + strOrgRemoveFilePos = f; + + strHeaderInfo = string.Empty; + strLogFileNameInfo = string.Empty; + + string[] strInfos = f.Split(';'); + + //파일정보 확인(로그 저장관련 정보) + /* + string strSetDateTime = strInfos[1]; + string strSetStationName = strInfos[2]; + int nSetTestListVariantNo = int.Parse(strInfos[3]); + string strSetProcNoP = strInfos[4]; + string strSetProcNoC = strInfos[5]; + string strSetTestType = strInfos[6]; + string strSetTestCode = strInfos[7]; + string strSetVersion = strInfos[8]; + string strSetProdCode = strInfos[9]; + string strSetTestListCntID = strInfos[10]; + string strHost = strInfos[11]; + string strSection = strInfos[12]; + */ + int nSetTryNo = int.Parse(strInfos[13]); + + Dictionary dicSetLogInfo = new Dictionary(); + dicSetLogInfo.Add("DATE_TIME", strInfos[1]); + dicSetLogInfo.Add("STATION_NAME", strInfos[2]); + dicSetLogInfo.Add("VARIANT_NO", strInfos[3]); + dicSetLogInfo.Add("P_TTNR", strInfos[4]); + dicSetLogInfo.Add("TTNR", strInfos[5]); + dicSetLogInfo.Add("TEST_TYPE", strInfos[6]); + dicSetLogInfo.Add("TEST_CODE", strInfos[7]); + dicSetLogInfo.Add("VERSION", strInfos[8]); + dicSetLogInfo.Add("PROD_CODE", strInfos[9]); + dicSetLogInfo.Add("TESTLIST_ID", strInfos[10]); + dicSetLogInfo.Add("HOST", strInfos[11]); + dicSetLogInfo.Add("SECTION", strInfos[12]); + + for (int m = 1; m < 12; m++) + strHeaderInfo += (strInfos[m + 1] + ";"); + + strHeaderInfo = strHeaderInfo.Remove(strHeaderInfo.Length - 1, 1); + + //압축해제 하여 로그 파일 추출 + using (FileStream fs = new FileStream(f, FileMode.Open)) + using (ZipArchive zip = new ZipArchive(fs, ZipArchiveMode.Update, false)) + { + foreach (ZipArchiveEntry zae in zip.Entries) + { + strLogFileNameInfo = zae.FullName; + + if (strLogFileNameInfo.IndexOf(".txt") >= 0) + continue; + + strExtractFilePos = strReadDirPath + strLogFileNameInfo; + + //ZipFileExtensions + zae.ExtractToFile(strExtractFilePos, true); + } + } + + //Sometihing Procee + LogMappedPacket EmptyLogMapFile = new LogMappedPacket(); + + StringBuilder sb = new StringBuilder(); + sb.Append("[" + (++nDequeueCount).ToString() + "][TryDequeue]"); + sb.Append("["); + sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); + sb.Append("], "); + sb.Append("Type [FTP], "); + sb.Append("Host [" + dicSetLogInfo["HOST"] + "], "); + sb.Append("Section [" + dicSetLogInfo["SECTION"] + "], "); + sb.Append("St Name [" + dicSetLogInfo["STATION_NAME"] + "], "); + sb.Append("File Name [" + Path.GetFileName(strExtractFilePos) + "], "); + sb.Append("File Extension [" + Path.GetExtension(strExtractFilePos) + "] "); + sb.Append("TL ID[" + dicSetLogInfo["TESTLIST_ID"] + "], "); + sb.Append("V[" + dicSetLogInfo["P_TTNR"] + "], "); + sb.Append("PN[" + dicSetLogInfo["TTNR"] + "], "); + sb.Append("TT[" + dicSetLogInfo["TEST_TYPE"] + "], "); + sb.Append("TC[" + dicSetLogInfo["TEST_CODE"] + "], "); + sb.Append("Ver[" + dicSetLogInfo["VERSION"] + "], "); + sb.Append("PC[" + dicSetLogInfo["PROD_CODE"] + "], "); + sb.Append("DB V No[" + dicSetLogInfo["VARIANT_NO"] + "], "); + + if (nDequeueCount >= Int64.MaxValue) + nDequeueCount = 0; + + bool bGetLogProcResult = CPXV2_CpLogProcess(EmptyLogMapFile, dicSetLogInfo, strExtractFilePos); + + if (bGetLogProcResult == true) + lstBulkTermLogInfo.Add(sb.ToString()); + + sb.Append("!Use Log Process Version [FTP-CPXV2] "); + + if (bGetLogProcResult) + sb.Append(""); + else + sb.Append(""); + + sb.AppendLine(); + + LogDataProcessText.Enqueue(sb); + + l1 = stProcessTimeChk.ElapsedMilliseconds; + + if (l1 != long.MinValue) + { + LogDataProcessText.Enqueue(new StringBuilder(">>[FTP-Process][" + l1.ToString() + "]\r\n")); + } + + //Failed + if (bGetLogProcResult == false) + { + //실패시 + nSetTryNo++; + + string strTryNo = string.Empty; + + string strCopyPos = string.Empty; + + //재시도 3회 초과 일시 히스토리로 이동 + if (nSetTryNo > 3) + { + strCopyPos = strMoveDirPath; + + strTryNo = "X"; + } + else + { + strCopyPos = strReadDirPath; + + strTryNo = nSetTryNo.ToString(); + } + + for (int m = 0; m < 12; m++) + strCopyPos += (";" + strInfos[m + 1]); + + strCopyPos += (";" + strTryNo + ";.zip"); + + File.Copy(f, strCopyPos, true); + } + + //압축해제 파일 삭제 + if (File.Exists(strExtractFilePos)) + File.Delete(strExtractFilePos); + + //성공시나 실패시 새로운 파일생성 되기 때문에 기존 파일 삭제 + if (strOrgRemoveFilePos != string.Empty) + { + if (File.Exists(strOrgRemoveFilePos)) + File.Delete(strOrgRemoveFilePos); + } + + stProcessTimeChk.Restart(); + } + } + } +} diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/UI.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/UI.cs new file mode 100644 index 0000000..83c85f0 --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/UI.cs @@ -0,0 +1,166 @@ +using DevExpress.Data.Helpers; +using DevExpress.XtraBars; +using DevExpress.XtraBars.Navigation; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml.Linq; +using System.IO; +using System.Diagnostics; + +using SystemX.Net; +using SystemX.Common; +using SystemX.Net.BaseProtocol; +using SystemX.Net.Comm; +using SystemX.Net.Schedule; +using SystemX.Net.DB.LogProcess; +using SystemX.Common.Serialization; +using SystemX.Common.Archive; +using System.Threading.Tasks; + +//using SystemX.Common.Protocol.SIA; + +using static SystemX.Net.Platform.Common.Util.LogMessage; +using System.Threading; +using SystemX.Net.Platform.Common.Util; +using SystemX.Net.Platform.Common.ExtensionMethods; +using SystemX.Net.Middleware.Log.Commons; +using static SystemX.Net.DB.LogProcess.XLogDBConnManager; + +namespace SystemX.Net.MiddlewareUI +{ + public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm + { + private void Chktimer_Tick(object sender, EventArgs e) + { + Chktimer.Enabled = false; + + if (MiddlewareLogStartState == false) + { + ConsoleUtil.ConsoleVisibleControl(); + + //The program is automatically terminated. + MessageBox.Show("Server information could not be retrieved. Check the console error text.", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.OK, MessageBoxIcon.Error); + + // TODO : FTP ALIS + this.Close(); + } + } + + private void UItimer_Tick(object sender, EventArgs e) + { + if (m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] == false) + { + m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] = true; + + if (bTryBulkInsertBuffer) + { + if (buttonBulkInsertStart.BackColor != Color.Yellow) + buttonBulkInsertStart.BackColor = Color.Yellow; + } + else + { + if (buttonBulkInsertStart.BackColor != Color.Silver) + buttonBulkInsertStart.BackColor = Color.Silver; + } + + labelBulkCntInfo1.Text = nBulkLogCount.ToString(); + labelBulkCntInfo2.Text = nBulkShortTermCount.ToString(); + labelBulkCntInfo3.Text = nBulkLongTermCount.ToString(); + + labelBulkTime.Text = nBulkTimeValue.ToString(); + labelFTPTime.Text = nFTPTimeValue.ToString(); + + labelDBMain.Text = "Information [" + MngDBLogConn.GetDBConnectInfo().ConnMain.SCHEMA + "]"; + labelDBShortTerm.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SCHEMA + "]"; + labelShortTermSummaryTableName.Text = "└ [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE + "]"; + labelShortTermLogTableName.Text = "└ [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE + "]"; + labelDBLongTerm.Text = "LongTerm [" + MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SCHEMA + "]"; + + if (bDatabaseConnResult) + { + if (panelDBMain2.BackColor != Color.LimeGreen) panelDBMain2.BackColor = Color.LimeGreen; + if (panelDBShortTerm2.BackColor != Color.LimeGreen) panelDBShortTerm2.BackColor = Color.LimeGreen; + if (panelDBLongTerm2.BackColor != Color.LimeGreen) panelDBLongTerm2.BackColor = Color.LimeGreen; + + if (buttonDbConnect.Visible) buttonDbConnect.Visible = false; + } + else + { + if (panelDBMain2.BackColor != Color.Red) panelDBMain2.BackColor = Color.Red; + if (panelDBShortTerm2.BackColor != Color.Red) panelDBShortTerm2.BackColor = Color.Red; + if (panelDBLongTerm2.BackColor != Color.Red) panelDBLongTerm2.BackColor = Color.Red; + + if (buttonDbConnect.Visible == false) buttonDbConnect.Visible = true; + } + + if (progressBarProgram.Value + 20 <= 100) + progressBarProgram.Value += 20; + else + progressBarProgram.Value = 0; + + int nPanelHeight = panelMain.Height / 2; + + panelRecv.Height = nPanelHeight - 20; + panelProcess.Height = nPanelHeight - 20; + + int n1 = richTextBoxRecv.Lines.Count(); + int n2 = richTextBoxProcess.Lines.Count(); + + if (richTextBoxRecv.Lines.Count() > 8192) + richTextBoxRecv.Clear(); + if (richTextBoxProcess.Lines.Count() > 8192) + richTextBoxProcess.Clear(); + + if (LogDataRecvText.Count > 0) + { + StringBuilder sb = null; + + if (LogDataRecvText.TryDequeue(out sb)) + { + //richTextBoxRecv.SuspendLayout(); + richTextBoxRecv.AppendText(sb.ToString()); + + richTextBoxRecv.ScrollToCaret(); + //richTextBoxRecv.ResumeLayout(); + } + } + + if (LogDataProcessText.Count > 0) + { + StringBuilder sb = null; + + if (LogDataProcessText.TryDequeue(out sb)) + { + //richTextBoxProcess.SuspendLayout(); + richTextBoxProcess.AppendText(sb.ToString()); + + richTextBoxProcess.ScrollToCaret(); + //richTextBoxProcess.ResumeLayout(); + } + } + + m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] = false; + } + } + + private string MakeInfoConnectProcessText(int nPos, int nCommandPort, int nStreamPort) + { + string strSetProcessInfo = nPos.ToString("D2") + ":" + + nCommandPort.ToString("D4") + ":" + + nStreamPort.ToString("D4"); + + return strSetProcessInfo; + } + } +} \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/SystemX.Net.CP.Middleware.Log.csproj b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/SystemX.Net.CP.Middleware.Log.csproj new file mode 100644 index 0000000..32c0a9c --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/SystemX.Net.CP.Middleware.Log.csproj @@ -0,0 +1,343 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {3658FBE5-9A84-4F76-8E19-867DB9F4484D} + Exe + Properties + SystemX.Net.MiddlewareUI.Log + SystemX.Net.MiddlewareUI.Log + v4.8 + 512 + + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + + + AppIcon.ico + + + + + + true + bin\x64\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + true + + + bin\x64\ + TRACE + true + pdbonly + x64 + 7.3 + prompt + true + + + + ..\packages\Common.Logging.3.4.1\lib\net40\Common.Logging.dll + + + ..\packages\Common.Logging.Core.3.4.1\lib\net40\Common.Logging.Core.dll + + + ..\..\Output.SystemX\CpApplciationIntrf.dll + + + ..\..\Output.SystemX\CpApplication.dll + + + ..\..\Output.SystemX\CpCommon.dll + + + + + + + + ..\..\Output.SystemX\log4net.dll + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.1\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll + + + ..\packages\Microsoft.Data.SqlClient.1.1.3\lib\net46\Microsoft.Data.SqlClient.dll + + + ..\packages\Microsoft.EntityFrameworkCore.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.dll + + + ..\packages\Microsoft.EntityFrameworkCore.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Abstractions.dll + + + ..\packages\Microsoft.EntityFrameworkCore.Relational.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Relational.dll + + + ..\packages\Microsoft.EntityFrameworkCore.SqlServer.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.SqlServer.dll + + + ..\packages\Microsoft.Extensions.Caching.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Caching.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Caching.Memory.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Caching.Memory.dll + + + ..\packages\Microsoft.Extensions.Configuration.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.dll + + + ..\packages\Microsoft.Extensions.Configuration.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Configuration.Binder.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.Binder.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.3.1.32\lib\net461\Microsoft.Extensions.DependencyInjection.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Logging.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Logging.dll + + + ..\packages\Microsoft.Extensions.Logging.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Options.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Options.dll + + + ..\packages\Microsoft.Extensions.Primitives.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll + + + ..\packages\Microsoft.Identity.Client.3.0.8\lib\net45\Microsoft.Identity.Client.dll + + + ..\packages\Microsoft.IdentityModel.JsonWebTokens.5.5.0\lib\net461\Microsoft.IdentityModel.JsonWebTokens.dll + + + ..\packages\Microsoft.IdentityModel.Logging.5.5.0\lib\net461\Microsoft.IdentityModel.Logging.dll + + + ..\packages\Microsoft.IdentityModel.Protocols.5.5.0\lib\net461\Microsoft.IdentityModel.Protocols.dll + + + ..\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.5.5.0\lib\net461\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll + + + ..\packages\Microsoft.IdentityModel.Tokens.5.5.0\lib\net461\Microsoft.IdentityModel.Tokens.dll + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + ..\packages\System.Collections.Immutable.1.7.1\lib\net461\System.Collections.Immutable.dll + + + ..\packages\System.ComponentModel.Annotations.4.7.0\lib\net461\System.ComponentModel.Annotations.dll + + + + + ..\packages\System.Data.Common.4.3.0\lib\net451\System.Data.Common.dll + True + True + + + ..\packages\System.Diagnostics.DiagnosticSource.4.7.1\lib\net46\System.Diagnostics.DiagnosticSource.dll + + + + ..\packages\System.IdentityModel.Tokens.Jwt.5.5.0\lib\net461\System.IdentityModel.Tokens.Jwt.dll + + + + + ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll + + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + + + + + + + + + False + ..\..\Output.SystemX\SystemX.Net.Platform.dll + + + ..\..\Output.SystemX\SystemX.XEFCore.dll + + + + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + + Form + + + MainForm.cs + + + + + + + + + + + MainForm.cs + Designer + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다. + + + + + \ No newline at end of file diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/packages.config b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/packages.config new file mode 100644 index 0000000..88b057a --- /dev/null +++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/packages.config @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file