using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Linq; using SystemX.Net.BaseProtocol; using SystemX.Net.DB; using CpTesterPlatform.CpLogUtil; using static SystemX.Net.Platform.Common.Util.LogMessage; namespace SystemX.Common.Log.Query { /// /// Query Base Infomation /// /// public class CallPreMadeQueryInfo { public bool bReadInfoState { set; get; } public bool bHasItem { set; get; } public bool bLoading { set; get; } private string strInfoFilePos; //TestID, TableName private Dictionary dicIDInfo; //ID - FROM - QUERY TEXT - RETURN FIELD(INDEX OR FIELD NAME) private Dictionary> dicUserQueryItem; public CallPreMadeQueryInfo(string strGetInfoPath) { strInfoFilePos = strGetInfoPath; dicIDInfo = new Dictionary(); dicUserQueryItem = new Dictionary>(); bHasItem = false; bReadInfoState = false; bLoading = false; } public List>> GetUserQueryInfo(string strTestID) { if (dicIDInfo.Keys.Contains(strTestID)) return dicUserQueryItem.ToList().FindAll(x => x.Value.Item1 == strTestID); else return null; } public Tuple GetUserQueryText(string strTestID, List LstParam = null) { string strResultQueryText = string.Empty; string strMakeQueryText = string.Empty; string strVarParam1 = string.Empty; try { if (bHasItem == false) throw new Exception("User query no have item."); if (dicIDInfo.Keys.Contains(strTestID) == false) throw new Exception("Can't find call id."); var getQuery = dicUserQueryItem.ToList().FindAll(x => x.Value.Item1 == strTestID); if (getQuery == null) throw new Exception("Can't find [" + strTestID + "] ID user query."); //받은 파라미터 개수 int nParamNum = LstParam != null ? LstParam.Count() : 0; string strQueryID = getQuery[0].Value.Item1; string strQueryFrom = getQuery[0].Value.Item2; strMakeQueryText = getQuery[0].Value.Item3; strVarParam1 = getQuery[0].Value.Item4; //From 부분 대체 int nParamPos = 0; if (strQueryFrom.Length > 0) { if (strMakeQueryText.IndexOf("@$UseFrom@$") < 0) throw new Exception("Access table argument format [@$UseFrom@$] syntax does not exist."); string[] strLstQueryForms = strQueryFrom.Split(';'); foreach (string strFormParam in strLstQueryForms) { if (strMakeQueryText.IndexOf("@$UseFrom@$") < 0) throw new Exception("The number of parameters and the number of argument types do not match."); strMakeQueryText = strMakeQueryText.Replace("@$UseFrom@$[" + (nParamPos + 1).ToString() + "]", strFormParam); nParamPos++; } } //사용자 입력 쿼리 텍스트 파라미터 개수 파악 if (nParamNum > 0) { int nQueryParamNum = 0; string strTemp = strMakeQueryText; while (true) { if (strTemp.IndexOf("@$PARAM@$") >= 0) nQueryParamNum++; else break; strTemp = strTemp.Remove(strTemp.IndexOf("@$PARAM@$"), 12); } if (nParamNum != nQueryParamNum) throw new Exception("The number of parameters does not match."); //파라미터 위치 값으로 대체 nParamPos = 0; foreach (string strParamValue in LstParam) { strMakeQueryText = strMakeQueryText.Replace("@$PARAM@$[" + (nParamPos + 1).ToString() + "]", strParamValue); nParamPos++; } } } catch { ;// } finally { strResultQueryText = strMakeQueryText; } //Query Text, Return Field Pos or Field Name return new Tuple(strResultQueryText, strVarParam1); } private void GetUserQueryItemInfo(List ListGetElement) { bLoading = true; dicIDInfo.Clear(); dicUserQueryItem.Clear(); int nSetPos = 0; foreach (var getXElement in ListGetElement) { bHasItem = true; string strBaseID = getXElement.Attribute("ID").Value; string strUseFrom = getXElement.Attribute("UseFrom").Value; dicIDInfo.Add(strBaseID, nSetPos); if (getXElement.Elements().ToList().Count == 1) { for (int i = 0; i < getXElement.Elements().ToList().Count; i++) { string strQueryText = getXElement.Element("QueryDetail").Attribute("QueryText").Value; string strVarParam1 = getXElement.Element("QueryDetail").Attribute("ReturnField").Value; dicUserQueryItem.Add(nSetPos++, new Tuple( strBaseID, strUseFrom, strQueryText, strVarParam1)); } } else throw new Exception("Need only one by one Query-Information!"); } bLoading = false; } public bool Load() { bReadInfoState = true; try { XDocument xDoc = XDocument.Load(strInfoFilePos); var xElement = xDoc.Element("ROOT"); if (xElement != null) { var ListGetElement = xElement.Elements("UserQueryItem").ToList(); GetUserQueryItemInfo(ListGetElement); } } catch (Exception ex) { bReadInfoState = false; MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"UserQueryItem read failed. [SystemX.Common.Protocol.Log.Query : UserQueryInfo.Load]\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG); } return bReadInfoState; } } }