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;
}
}
}