584 lines
19 KiB
C#
584 lines
19 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.Text;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Forms;
|
||
using System.Diagnostics;
|
||
using System.Data.SqlClient;
|
||
using System.Net;
|
||
using System.Security.Policy;
|
||
using System.Data.Common;
|
||
|
||
using DataBaseConnection.Control;
|
||
|
||
using DevExpress.XtraBars;
|
||
|
||
using SystemX.Product.ALIS.UI.View;
|
||
using SystemX.Net.Platform.Common.Util;
|
||
using SystemX.Product.ALIS.UI.Subs;
|
||
using SystemX.Product.ALIS.Interface;
|
||
using SystemX.Product.ALIS.UI.View.Base;
|
||
|
||
using static SystemX.Product.ALIS.UI.View.ViewCfg;
|
||
using static SystemX.Net.Platform.Common.Util.LogMessage;
|
||
using static SystemX.Product.ALIS.UI.Commons;
|
||
using SystemX.Common;
|
||
|
||
namespace SystemX.Product.ALIS.UI
|
||
{
|
||
public partial class FrmMain : DevExpress.XtraBars.Ribbon.RibbonForm, IChildController, IDataController
|
||
{
|
||
public class UserInfo
|
||
{
|
||
public string UserID;
|
||
public string Name;
|
||
public string Dept;
|
||
public string Email;
|
||
public string Comment;
|
||
public string Password;
|
||
|
||
public UserInfo()
|
||
{
|
||
UserID = "";
|
||
Name = "";
|
||
Dept = "";
|
||
Email = "";
|
||
Comment = "";
|
||
Password = "";
|
||
}
|
||
public void Clear()
|
||
{
|
||
UserID = "";
|
||
Name = "";
|
||
Dept = "";
|
||
Email = "";
|
||
Comment = "";
|
||
Password = "";
|
||
}
|
||
}
|
||
|
||
private List<FrmChild> DocFrames { get; set; }
|
||
|
||
|
||
/*DbConnection conn { get; set; }
|
||
|
||
DbCommand SQLCmd { get; set; }*/
|
||
|
||
private SqlConnection SQLConnection { get; set; }
|
||
private SqlCommand SQLCmd { get; set; }
|
||
|
||
BackgroundWorker worker = new BackgroundWorker();
|
||
WaitProgressForm loadForm = null;
|
||
Stopwatch stLoadFormWait = new Stopwatch();
|
||
|
||
private string strUserInputConnectInfo;
|
||
|
||
private async void ReadingCompleted(object args)
|
||
{
|
||
loadForm.BringToFront();
|
||
loadForm.Focus();
|
||
|
||
if (stLoadFormWait.ElapsedMilliseconds <= 1000)
|
||
{
|
||
int iremainTime = 1000 - (int)stLoadFormWait.ElapsedMilliseconds;
|
||
await Task.Delay(iremainTime);
|
||
}
|
||
|
||
if (loadForm != null)
|
||
{
|
||
loadForm.Close();
|
||
loadForm = null;
|
||
}
|
||
|
||
if (SQLConnection == null)
|
||
{
|
||
bDatabaseConnState = false;
|
||
|
||
MessageBox.Show("DB connection failed. Check the DB status or check the connection address.", "[SystemX.Product.ALIS.UI]", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
}
|
||
|
||
if (bDatabaseConnState == false)
|
||
{
|
||
//this.Close();
|
||
|
||
SetDBConn();
|
||
}
|
||
else
|
||
{
|
||
ConnectInfoINICtrl CCtrl = new ConnectInfoINICtrl();
|
||
CCtrl.SetLastestConnectInfo(strUserInputConnectInfo);
|
||
|
||
barStaticItemConn.Visibility = BarItemVisibility.Always;
|
||
|
||
barStaticItemConn.ShowImageInToolbar = true;
|
||
|
||
string strAddress = (strConnIPAddress == string.Empty ? "LocalHost" : strConnIPAddress);
|
||
|
||
strAddress += " , " + nConnPort.ToString();
|
||
|
||
barStaticItemConn.Caption += " [" + strAddress + "] [" + strConnCN /*DatabaseConnControl.CatalogName*/ + "] [" + strConnUID + "]";
|
||
|
||
barButtonItemConnect.Enabled = false;
|
||
barButtonItemLogout.Enabled = true;
|
||
}
|
||
}
|
||
|
||
private void CheckSqlOption(SqlConnection SqlConn)
|
||
{
|
||
//옵션 확인 및 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 문 실행 중에
|
||
발생한 오류에는 영향을 주지 않는다.
|
||
*/
|
||
|
||
DataTable dtResult1 = new DataTable();
|
||
DataTable dtResult2 = new DataTable();
|
||
|
||
using (SqlCommand SqlCommand = new SqlCommand(strGetQuery1, SqlConn))
|
||
{
|
||
SqlCommand.CommandTimeout = 300;
|
||
|
||
DbDataReader dtReader = SqlCommand.ExecuteReader();
|
||
|
||
dtResult1.Load(dtReader);
|
||
|
||
dtReader.Close();
|
||
}
|
||
//
|
||
using (SqlCommand SqlCommand = new SqlCommand(strGetQuery2, SqlConn))
|
||
{
|
||
SqlCommand.CommandTimeout = 300;
|
||
|
||
DbDataReader dtReader = SqlCommand.ExecuteReader();
|
||
|
||
dtResult2.Load(dtReader);
|
||
|
||
dtReader.Close();
|
||
}
|
||
//
|
||
if (XCommons.isHasRow(dtResult1))
|
||
{
|
||
bool bOptionState = dtResult1.Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false;
|
||
|
||
if (bOptionState == false)
|
||
SetSqlOption(SqlConn, "SET ARITHABORT ON");
|
||
}
|
||
if (XCommons.isHasRow(dtResult2))
|
||
{
|
||
bool bOptionState = dtResult2.Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false;
|
||
|
||
if (bOptionState == false)
|
||
SetSqlOption(SqlConn, "SET ARITHIGNORE ON");
|
||
}
|
||
}
|
||
|
||
private void SetSqlOption(SqlConnection SqlConn, string strQuery)
|
||
{
|
||
using (SqlCommand SqlCommand = new SqlCommand(strQuery, SqlConn))
|
||
{
|
||
SqlCommand.CommandTimeout = 300;
|
||
|
||
int nRows = SqlCommand.ExecuteNonQuery();
|
||
}
|
||
}
|
||
|
||
private void PerformDatabaseConnect()
|
||
{
|
||
SQLConnection = null;
|
||
|
||
try
|
||
{
|
||
try
|
||
{
|
||
//TODO : Conn Database
|
||
if (strConnIPAddress == string.Empty)
|
||
SQLConnection = DatabaseConnControl.ConnectDB(strConnCN);
|
||
else
|
||
SQLConnection = DatabaseConnControl.ConnectDB(strConnIPAddress,
|
||
strConnCN,
|
||
strConnUID,
|
||
strConnPW,
|
||
nConnPort);
|
||
|
||
SQLCmd = new SqlCommand();
|
||
SQLCmd.Connection = DatabaseConnControl.conn;
|
||
|
||
CheckSqlOption(SQLConnection);
|
||
|
||
bDatabaseConnState = true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
bDatabaseConnState = false;
|
||
|
||
MessageOutput.ConsoleWrite($"DB Connection Error: {ex.Message}", ConsoleColor.Red, LogMessage.LogMessageLevel.FATAL);
|
||
}
|
||
}
|
||
finally
|
||
{
|
||
if (SQLConnection == null)
|
||
{
|
||
bDatabaseConnState = false;
|
||
|
||
MessageBox.Show("DB connection failed. Check DB status. Automatically close the program.", "[SystemX.Product.ALIS.UI]", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
}
|
||
}
|
||
}
|
||
|
||
public UserInfo CurrentUser;
|
||
|
||
public LoginAccessLevel ACCESS_LEVEL { internal set; get; }
|
||
|
||
private string strTitleLabel;
|
||
|
||
private Stopwatch stCheckLoginTime;
|
||
|
||
private string strConnIPAddress;
|
||
|
||
private int nConnPort;
|
||
|
||
private string strConnCN;
|
||
|
||
private string strConnUID;
|
||
|
||
private string strConnPW;
|
||
|
||
eAppFunctionType eCurrentSelectFuncType;
|
||
|
||
public string GetServerConnectIP()
|
||
{
|
||
return strConnIPAddress;
|
||
}
|
||
|
||
public int GetServerConnectPort()
|
||
{
|
||
return nConnPort;
|
||
}
|
||
|
||
private bool bDatabaseConnState;
|
||
|
||
public FrmMain()
|
||
{
|
||
InitializeComponent();
|
||
|
||
ConsoleUtil.ConsoleHide();
|
||
|
||
CurrentUser = new UserInfo();
|
||
|
||
ACCESS_LEVEL = LoginAccessLevel.None;
|
||
|
||
strTitleLabel = this.Text;
|
||
|
||
SetOnOperationMarker(false);
|
||
|
||
stCheckLoginTime = new Stopwatch();
|
||
stCheckLoginTime.Start();
|
||
|
||
worker.DoWork += (sender, args) => PerformDatabaseConnect();
|
||
worker.RunWorkerCompleted += (sender, args) => ReadingCompleted(bDatabaseConnState);
|
||
|
||
stLoadFormWait.Start();
|
||
|
||
ribbon.SelectedPage = ribbonPageMain;
|
||
|
||
this.KeyPreview = true;
|
||
|
||
eCurrentSelectFuncType = eAppFunctionType.None;
|
||
}
|
||
|
||
protected override void WndProc(ref Message message)
|
||
{
|
||
if (LoginCheck(LoginAccessLevel.Basic))
|
||
stCheckLoginTime.Restart();
|
||
|
||
base.WndProc(ref message);
|
||
}
|
||
|
||
private bool CheckDatabaseConnState()
|
||
{
|
||
if (bDatabaseConnState == false)
|
||
MessageBox.Show("No database connected. Connect first.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
|
||
return bDatabaseConnState;
|
||
}
|
||
|
||
void RefreshView(eAppFunctionType funcType)
|
||
{
|
||
if (CheckDatabaseConnState() == false)
|
||
return;
|
||
|
||
try
|
||
{
|
||
FrmChild frmFound = DocFrames.Find(x => x.DocType == funcType);
|
||
|
||
if (frmFound == null)
|
||
return;
|
||
else
|
||
{
|
||
frmFound.RefreshView();
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogMessage.MessageOutput.ConsoleWrite($"Error On Open View. Error Message: {ex.Message}");
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
UserControl OpenViewModel(eAppFunctionType funcType, LoginAccessLevel CreateAccessLevel, eSelectType eSelType = eSelectType.None, bool bLoginState = false)
|
||
{
|
||
if (CheckDatabaseConnState() == false)
|
||
return null;
|
||
|
||
if (DocFrames == null)
|
||
DocFrames = new List<FrmChild>();
|
||
|
||
try
|
||
{
|
||
FrmChild frmFound = DocFrames.Find(x => x.DocType == funcType);
|
||
|
||
if (frmFound == null)
|
||
{
|
||
frmFound = new FrmChild(this, funcType, eSelType, funcType.ToString(), CreateAccessLevel, bLoginState);
|
||
frmFound.Text = funcType.ToString();
|
||
|
||
DocFrames.Add(frmFound);
|
||
|
||
frmFound.Show();
|
||
}
|
||
else
|
||
{
|
||
frmFound.Select();
|
||
}
|
||
|
||
return frmFound.WindowControl as UcBaseView;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogMessage.MessageOutput.ConsoleWrite($"Error On Open View. Error Message: {ex.Message}");
|
||
|
||
return null;
|
||
}
|
||
}
|
||
|
||
private void SetDBConn()
|
||
{
|
||
strConnIPAddress = string.Empty;
|
||
|
||
strConnCN = DatabaseConnControl.CatalogName;
|
||
|
||
strConnUID = DatabaseConnControl.CatalogConnUID;
|
||
|
||
strConnPW = DatabaseConnControl.CatalogConnPW;
|
||
|
||
nConnPort = DatabaseConnControl.CatalogConnPort;
|
||
|
||
this.BringToFront();
|
||
this.Focus();
|
||
|
||
ConnectForm connFrm = new ConnectForm(null);
|
||
DialogResult dr = connFrm.ShowDialog();
|
||
|
||
if (dr == DialogResult.OK || dr == DialogResult.Ignore)
|
||
{
|
||
strUserInputConnectInfo = connFrm.strInputText;
|
||
|
||
strConnIPAddress = connFrm.strGetConnIPAddress;
|
||
|
||
nConnPort = connFrm.nGetConnPort;
|
||
|
||
strConnCN = connFrm.strGetConnCN;
|
||
|
||
strConnUID = connFrm.strGetConnUID;
|
||
|
||
strConnPW = connFrm.strGetConnPW;
|
||
|
||
loadForm = new WaitProgressForm();
|
||
loadForm.setDescription("Connecting ...");
|
||
loadForm.Location = new Point(this.Width / 2, this.Height / 2);
|
||
|
||
//loadForm.ShowOnTopMode = DevExpress.XtraWaitForm.ShowFormOnTopMode.AboveAll;
|
||
|
||
stLoadFormWait.Restart();
|
||
|
||
worker.RunWorkerAsync(null);
|
||
|
||
loadForm.ShowDialog();
|
||
}
|
||
else
|
||
this.Close();
|
||
}
|
||
|
||
private void FrmMain_Load(object sender, EventArgs e)
|
||
{
|
||
SetDBConn();
|
||
}
|
||
|
||
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
|
||
{
|
||
switch (msg.Msg)
|
||
{
|
||
case 0x100:
|
||
case 0x104:
|
||
switch (keyData)
|
||
{
|
||
case Keys.Control | Keys.I:
|
||
MessageBox.Show("Ctrl + I pressed");
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
return base.ProcessCmdKey(ref msg, keyData);
|
||
}
|
||
|
||
private void LoginProc()
|
||
{
|
||
//SetOnOperationMarker(false);
|
||
|
||
if (CheckDatabaseConnState() == false)
|
||
return;
|
||
|
||
LoginForm loginForm = new LoginForm(this);
|
||
|
||
using (GetOnOperationUserLoginMarker())
|
||
{
|
||
DialogResult dr = loginForm.ShowDialog();
|
||
switch (dr)
|
||
{
|
||
case DialogResult.OK:
|
||
{
|
||
LoginInfoINICtrl LCtrl = new LoginInfoINICtrl();
|
||
LCtrl.SetLastestLoginInfo(loginForm.UserID);
|
||
|
||
CurrentUser.UserID = loginForm.UserID;
|
||
CurrentUser.Name = loginForm.UserName;
|
||
CurrentUser.Dept = loginForm.UserDept;
|
||
CurrentUser.Email = loginForm.UserEmail;
|
||
CurrentUser.Comment = loginForm.UserComment;
|
||
CurrentUser.Password = loginForm.UserPassword;
|
||
|
||
if (CurrentUser.UserID.CompareTo("Admin") == 0)
|
||
ACCESS_LEVEL = LoginAccessLevel.Admin;
|
||
else
|
||
ACCESS_LEVEL = LoginAccessLevel.Basic;
|
||
|
||
SetOnOperationMarker(true);
|
||
|
||
ribbon.SelectedPage = ribbonPageManagement;
|
||
}
|
||
break;
|
||
case DialogResult.Cancel:
|
||
{
|
||
SetOnOperationMarker(false);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
private void barButtonItem_Login_ItemClick(object sender, ItemClickEventArgs e)
|
||
{
|
||
LoginProc();
|
||
}
|
||
|
||
private void barButtonItemUserLogout_ItemClick(object sender, ItemClickEventArgs e)
|
||
{
|
||
SetOnOperationMarker(false);
|
||
}
|
||
|
||
private void timerSystem_Tick(object sender, EventArgs e)
|
||
{
|
||
if (LoginCheck(LoginAccessLevel.Basic))
|
||
{
|
||
if (Commons.DEBUG_MODE == false)
|
||
{
|
||
DispLoginTimeText();
|
||
|
||
/* Login Timeout Disabled
|
||
if (stCheckLoginTime.ElapsedMilliseconds >= 600000)
|
||
SetOnOperationMarker(false);
|
||
*/
|
||
}
|
||
}
|
||
}
|
||
|
||
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
|
||
{
|
||
if (SQLConnection != null) // && bDatabaseConnState)
|
||
{
|
||
if (MessageBox.Show("You want to program exit?", "[SystemX.Product.ALIS.UI]", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
|
||
e.Cancel = true;
|
||
else
|
||
{
|
||
DatabaseConnControl.DisconnectDB();
|
||
|
||
e.Cancel = false;
|
||
}
|
||
}
|
||
}
|
||
|
||
private void barButtonItemConsole_ItemClick(object sender, ItemClickEventArgs e)
|
||
{
|
||
ConsoleUtil.ConsoleVisibleControl();
|
||
}
|
||
|
||
private void barButtonItemConnect_ItemClick(object sender, ItemClickEventArgs e)
|
||
{
|
||
using (GetOnOperationDBConnMarker(true))
|
||
{
|
||
if (bDatabaseConnState)
|
||
{
|
||
;//
|
||
}
|
||
|
||
SetDBConn();
|
||
}
|
||
}
|
||
|
||
private void barButtonItemLogout_ItemClick(object sender, ItemClickEventArgs e)
|
||
{
|
||
using (GetOnOperationDBConnMarker(false))
|
||
{
|
||
SetOnOperationMarker(false);
|
||
|
||
CloseAllChildForm();
|
||
|
||
DatabaseConnControl.DisconnectDB();
|
||
|
||
bDatabaseConnState = false;
|
||
}
|
||
}
|
||
|
||
private void FrmMain_KeyDown(object sender, KeyEventArgs e)
|
||
{
|
||
switch(e.KeyCode)
|
||
{
|
||
case Keys.F1: LoginProc(); break;
|
||
case Keys.F2: OpenViewModel(eAppFunctionType.M_TestListFile, LoginAccessLevel.Basic, eSelectType.TestListFile, LoginCheck(LoginAccessLevel.Basic)); break;
|
||
case Keys.F3: OpenViewModel(eAppFunctionType.M_TestListVariant, LoginAccessLevel.Basic, eSelectType.TestListVariant, LoginCheck(LoginAccessLevel.Basic)); break;
|
||
case Keys.F4: OpenViewModel(eAppFunctionType.M_TestListRelease, LoginAccessLevel.Basic, eSelectType.TestListRelease, LoginCheck(LoginAccessLevel.Basic)); break;
|
||
case Keys.F5: RefreshView(eCurrentSelectFuncType); break;
|
||
case Keys.F6: OpenViewModel(eAppFunctionType.M_HostList, LoginAccessLevel.Basic, eSelectType.HostList, LoginCheck(LoginAccessLevel.Basic)); break;
|
||
case Keys.F7: OpenViewModel(eAppFunctionType.M_GroupList, LoginAccessLevel.Basic, eSelectType.GroupList, LoginCheck(LoginAccessLevel.Basic)); break;
|
||
case Keys.F8: OpenViewModel(eAppFunctionType.M_TestCodeList, LoginAccessLevel.Basic, eSelectType.TestCodeList, LoginCheck(LoginAccessLevel.Basic)); break;
|
||
case Keys.F9: OpenViewModel(eAppFunctionType.M_UserList, LoginAccessLevel.Admin, eSelectType.UserList, LoginCheck(LoginAccessLevel.Admin)); break;
|
||
}
|
||
}
|
||
}
|
||
} |