[성현모] TRA Recovery 기능 수정
This commit is contained in:
@ -29,27 +29,29 @@
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.panel1 = new System.Windows.Forms.Panel();
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
||||
this.btnSelectDb = new System.Windows.Forms.Button();
|
||||
this.textMdf = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.textLdf = new System.Windows.Forms.TextBox();
|
||||
this.ledMdf = new System.Windows.Forms.Panel();
|
||||
this.ledLdf = new System.Windows.Forms.Panel();
|
||||
this.btnAttach = new System.Windows.Forms.Button();
|
||||
this.lbAttachResult = new System.Windows.Forms.Label();
|
||||
this.gridDB = new System.Windows.Forms.DataGridView();
|
||||
this.colIndex = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.colDb = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||
this.colRemove = new System.Windows.Forms.DataGridViewButtonColumn();
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.textRecoveryName = new System.Windows.Forms.TextBox();
|
||||
this.lbAttachResult = new System.Windows.Forms.Label();
|
||||
this.btnAttach = new System.Windows.Forms.Button();
|
||||
this.ledLdf = new System.Windows.Forms.Panel();
|
||||
this.ledMdf = new System.Windows.Forms.Panel();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.textLdf = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.textMdf = new System.Windows.Forms.TextBox();
|
||||
this.btnSelectDb = new System.Windows.Forms.Button();
|
||||
this.btnRefresh = new System.Windows.Forms.Button();
|
||||
this.panel1.SuspendLayout();
|
||||
this.groupBox1.SuspendLayout();
|
||||
this.groupBox2.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.gridDB)).BeginInit();
|
||||
this.groupBox1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// panel1
|
||||
@ -62,28 +64,9 @@
|
||||
this.panel1.Size = new System.Drawing.Size(651, 547);
|
||||
this.panel1.TabIndex = 0;
|
||||
//
|
||||
// groupBox1
|
||||
//
|
||||
this.groupBox1.Controls.Add(this.label3);
|
||||
this.groupBox1.Controls.Add(this.textRecoveryName);
|
||||
this.groupBox1.Controls.Add(this.lbAttachResult);
|
||||
this.groupBox1.Controls.Add(this.btnAttach);
|
||||
this.groupBox1.Controls.Add(this.ledLdf);
|
||||
this.groupBox1.Controls.Add(this.ledMdf);
|
||||
this.groupBox1.Controls.Add(this.label2);
|
||||
this.groupBox1.Controls.Add(this.textLdf);
|
||||
this.groupBox1.Controls.Add(this.label1);
|
||||
this.groupBox1.Controls.Add(this.textMdf);
|
||||
this.groupBox1.Controls.Add(this.btnSelectDb);
|
||||
this.groupBox1.Location = new System.Drawing.Point(12, 12);
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.Size = new System.Drawing.Size(627, 163);
|
||||
this.groupBox1.TabIndex = 0;
|
||||
this.groupBox1.TabStop = false;
|
||||
this.groupBox1.Text = "Attach";
|
||||
//
|
||||
// groupBox2
|
||||
//
|
||||
this.groupBox2.Controls.Add(this.btnRefresh);
|
||||
this.groupBox2.Controls.Add(this.gridDB);
|
||||
this.groupBox2.Location = new System.Drawing.Point(12, 181);
|
||||
this.groupBox2.Name = "groupBox2";
|
||||
@ -92,82 +75,6 @@
|
||||
this.groupBox2.TabStop = false;
|
||||
this.groupBox2.Text = "Management";
|
||||
//
|
||||
// btnSelectDb
|
||||
//
|
||||
this.btnSelectDb.Location = new System.Drawing.Point(17, 25);
|
||||
this.btnSelectDb.Name = "btnSelectDb";
|
||||
this.btnSelectDb.Size = new System.Drawing.Size(122, 23);
|
||||
this.btnSelectDb.TabIndex = 0;
|
||||
this.btnSelectDb.Text = "Select DB";
|
||||
this.btnSelectDb.UseVisualStyleBackColor = true;
|
||||
this.btnSelectDb.Click += new System.EventHandler(this.btnSelectDb_Click);
|
||||
//
|
||||
// textMdf
|
||||
//
|
||||
this.textMdf.Location = new System.Drawing.Point(195, 24);
|
||||
this.textMdf.Name = "textMdf";
|
||||
this.textMdf.Size = new System.Drawing.Size(379, 21);
|
||||
this.textMdf.TabIndex = 1;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(152, 30);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(31, 12);
|
||||
this.label1.TabIndex = 2;
|
||||
this.label1.Text = "MDF";
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(152, 57);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(27, 12);
|
||||
this.label2.TabIndex = 4;
|
||||
this.label2.Text = "LDF";
|
||||
//
|
||||
// textLdf
|
||||
//
|
||||
this.textLdf.Location = new System.Drawing.Point(195, 51);
|
||||
this.textLdf.Name = "textLdf";
|
||||
this.textLdf.Size = new System.Drawing.Size(379, 21);
|
||||
this.textLdf.TabIndex = 3;
|
||||
//
|
||||
// ledMdf
|
||||
//
|
||||
this.ledMdf.BackColor = System.Drawing.Color.White;
|
||||
this.ledMdf.Location = new System.Drawing.Point(580, 25);
|
||||
this.ledMdf.Name = "ledMdf";
|
||||
this.ledMdf.Size = new System.Drawing.Size(41, 21);
|
||||
this.ledMdf.TabIndex = 5;
|
||||
//
|
||||
// ledLdf
|
||||
//
|
||||
this.ledLdf.BackColor = System.Drawing.Color.White;
|
||||
this.ledLdf.Location = new System.Drawing.Point(580, 52);
|
||||
this.ledLdf.Name = "ledLdf";
|
||||
this.ledLdf.Size = new System.Drawing.Size(41, 21);
|
||||
this.ledLdf.TabIndex = 6;
|
||||
//
|
||||
// btnAttach
|
||||
//
|
||||
this.btnAttach.Location = new System.Drawing.Point(154, 104);
|
||||
this.btnAttach.Name = "btnAttach";
|
||||
this.btnAttach.Size = new System.Drawing.Size(467, 23);
|
||||
this.btnAttach.TabIndex = 7;
|
||||
this.btnAttach.Text = "Attach to SqlServer";
|
||||
this.btnAttach.UseVisualStyleBackColor = true;
|
||||
this.btnAttach.Click += new System.EventHandler(this.btnAttach_Click);
|
||||
//
|
||||
// lbAttachResult
|
||||
//
|
||||
this.lbAttachResult.Location = new System.Drawing.Point(152, 133);
|
||||
this.lbAttachResult.Name = "lbAttachResult";
|
||||
this.lbAttachResult.Size = new System.Drawing.Size(469, 22);
|
||||
this.lbAttachResult.TabIndex = 8;
|
||||
this.lbAttachResult.Text = "result";
|
||||
//
|
||||
// gridDB
|
||||
//
|
||||
this.gridDB.AllowUserToAddRows = false;
|
||||
@ -178,10 +85,10 @@
|
||||
this.colIndex,
|
||||
this.colDb,
|
||||
this.colRemove});
|
||||
this.gridDB.Location = new System.Drawing.Point(17, 34);
|
||||
this.gridDB.Location = new System.Drawing.Point(17, 42);
|
||||
this.gridDB.Name = "gridDB";
|
||||
this.gridDB.RowTemplate.Height = 23;
|
||||
this.gridDB.Size = new System.Drawing.Size(590, 306);
|
||||
this.gridDB.Size = new System.Drawing.Size(590, 298);
|
||||
this.gridDB.TabIndex = 0;
|
||||
this.gridDB.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.gridDB_CellContentClick);
|
||||
//
|
||||
@ -208,6 +115,37 @@
|
||||
this.colRemove.Name = "colRemove";
|
||||
this.colRemove.ReadOnly = true;
|
||||
//
|
||||
// groupBox1
|
||||
//
|
||||
this.groupBox1.Controls.Add(this.label4);
|
||||
this.groupBox1.Controls.Add(this.label3);
|
||||
this.groupBox1.Controls.Add(this.textRecoveryName);
|
||||
this.groupBox1.Controls.Add(this.lbAttachResult);
|
||||
this.groupBox1.Controls.Add(this.btnAttach);
|
||||
this.groupBox1.Controls.Add(this.ledLdf);
|
||||
this.groupBox1.Controls.Add(this.ledMdf);
|
||||
this.groupBox1.Controls.Add(this.label2);
|
||||
this.groupBox1.Controls.Add(this.textLdf);
|
||||
this.groupBox1.Controls.Add(this.label1);
|
||||
this.groupBox1.Controls.Add(this.textMdf);
|
||||
this.groupBox1.Controls.Add(this.btnSelectDb);
|
||||
this.groupBox1.Location = new System.Drawing.Point(12, 12);
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.Size = new System.Drawing.Size(627, 163);
|
||||
this.groupBox1.TabIndex = 0;
|
||||
this.groupBox1.TabStop = false;
|
||||
this.groupBox1.Text = "Attach";
|
||||
//
|
||||
// label4
|
||||
//
|
||||
this.label4.AutoSize = true;
|
||||
this.label4.ForeColor = System.Drawing.Color.DodgerBlue;
|
||||
this.label4.Location = new System.Drawing.Point(543, 84);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(64, 12);
|
||||
this.label4.TabIndex = 11;
|
||||
this.label4.Text = "_Recovery";
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
@ -221,9 +159,95 @@
|
||||
//
|
||||
this.textRecoveryName.Location = new System.Drawing.Point(256, 78);
|
||||
this.textRecoveryName.Name = "textRecoveryName";
|
||||
this.textRecoveryName.Size = new System.Drawing.Size(318, 21);
|
||||
this.textRecoveryName.Size = new System.Drawing.Size(286, 21);
|
||||
this.textRecoveryName.TabIndex = 9;
|
||||
//
|
||||
// lbAttachResult
|
||||
//
|
||||
this.lbAttachResult.Location = new System.Drawing.Point(152, 133);
|
||||
this.lbAttachResult.Name = "lbAttachResult";
|
||||
this.lbAttachResult.Size = new System.Drawing.Size(469, 22);
|
||||
this.lbAttachResult.TabIndex = 8;
|
||||
this.lbAttachResult.Text = "result";
|
||||
//
|
||||
// btnAttach
|
||||
//
|
||||
this.btnAttach.Location = new System.Drawing.Point(154, 104);
|
||||
this.btnAttach.Name = "btnAttach";
|
||||
this.btnAttach.Size = new System.Drawing.Size(467, 23);
|
||||
this.btnAttach.TabIndex = 7;
|
||||
this.btnAttach.Text = "Attach to SqlServer";
|
||||
this.btnAttach.UseVisualStyleBackColor = true;
|
||||
this.btnAttach.Click += new System.EventHandler(this.btnAttach_Click);
|
||||
//
|
||||
// ledLdf
|
||||
//
|
||||
this.ledLdf.BackColor = System.Drawing.Color.White;
|
||||
this.ledLdf.Location = new System.Drawing.Point(580, 52);
|
||||
this.ledLdf.Name = "ledLdf";
|
||||
this.ledLdf.Size = new System.Drawing.Size(41, 21);
|
||||
this.ledLdf.TabIndex = 6;
|
||||
//
|
||||
// ledMdf
|
||||
//
|
||||
this.ledMdf.BackColor = System.Drawing.Color.White;
|
||||
this.ledMdf.Location = new System.Drawing.Point(580, 25);
|
||||
this.ledMdf.Name = "ledMdf";
|
||||
this.ledMdf.Size = new System.Drawing.Size(41, 21);
|
||||
this.ledMdf.TabIndex = 5;
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(152, 57);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(27, 12);
|
||||
this.label2.TabIndex = 4;
|
||||
this.label2.Text = "LDF";
|
||||
//
|
||||
// textLdf
|
||||
//
|
||||
this.textLdf.Location = new System.Drawing.Point(195, 51);
|
||||
this.textLdf.Name = "textLdf";
|
||||
this.textLdf.Size = new System.Drawing.Size(379, 21);
|
||||
this.textLdf.TabIndex = 3;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(152, 30);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(31, 12);
|
||||
this.label1.TabIndex = 2;
|
||||
this.label1.Text = "MDF";
|
||||
//
|
||||
// textMdf
|
||||
//
|
||||
this.textMdf.Location = new System.Drawing.Point(195, 24);
|
||||
this.textMdf.Name = "textMdf";
|
||||
this.textMdf.Size = new System.Drawing.Size(379, 21);
|
||||
this.textMdf.TabIndex = 1;
|
||||
//
|
||||
// btnSelectDb
|
||||
//
|
||||
this.btnSelectDb.Location = new System.Drawing.Point(17, 25);
|
||||
this.btnSelectDb.Name = "btnSelectDb";
|
||||
this.btnSelectDb.Size = new System.Drawing.Size(122, 23);
|
||||
this.btnSelectDb.TabIndex = 0;
|
||||
this.btnSelectDb.Text = "Select DB";
|
||||
this.btnSelectDb.UseVisualStyleBackColor = true;
|
||||
this.btnSelectDb.Click += new System.EventHandler(this.btnSelectDb_Click);
|
||||
//
|
||||
// btnRefresh
|
||||
//
|
||||
this.btnRefresh.Location = new System.Drawing.Point(485, 13);
|
||||
this.btnRefresh.Name = "btnRefresh";
|
||||
this.btnRefresh.Size = new System.Drawing.Size(122, 23);
|
||||
this.btnRefresh.TabIndex = 1;
|
||||
this.btnRefresh.Text = "Refresh";
|
||||
this.btnRefresh.UseVisualStyleBackColor = true;
|
||||
this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
|
||||
//
|
||||
// Form1
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
|
||||
@ -233,10 +257,10 @@
|
||||
this.Name = "Form1";
|
||||
this.Text = "DB Management Tool";
|
||||
this.panel1.ResumeLayout(false);
|
||||
this.groupBox1.ResumeLayout(false);
|
||||
this.groupBox1.PerformLayout();
|
||||
this.groupBox2.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.gridDB)).EndInit();
|
||||
this.groupBox1.ResumeLayout(false);
|
||||
this.groupBox1.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
@ -261,6 +285,8 @@
|
||||
private System.Windows.Forms.DataGridViewButtonColumn colRemove;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.TextBox textRecoveryName;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private System.Windows.Forms.Button btnRefresh;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -50,54 +50,65 @@ namespace SystemX.Product.CP.RecoveryTool
|
||||
}
|
||||
textMdf.Text = mdfFile; //mdf
|
||||
textLdf.Text = ldfFile; //ldf
|
||||
}
|
||||
textRecoveryName.Text = Path.GetFileNameWithoutExtension(textMdf.Text);
|
||||
}
|
||||
}
|
||||
|
||||
private void btnAttach_Click(object sender, EventArgs e)
|
||||
{
|
||||
string error = "success";
|
||||
|
||||
if (File.Exists(mdfFile) == true)
|
||||
ledMdf.BackColor = Color.Lime;
|
||||
else
|
||||
{
|
||||
ledMdf.BackColor = Color.Red;
|
||||
error = "Invalid FIle";
|
||||
}
|
||||
DialogResult result = MessageBox.Show(
|
||||
$"Attach DB Name: '{textRecoveryName.Text}_Recovery' 연결 하시겠습니까?", // 메시지 내용
|
||||
"Attach DB", // 타이틀
|
||||
MessageBoxButtons.YesNo, // 버튼 옵션
|
||||
MessageBoxIcon.Question // 아이콘 (선택 사항)
|
||||
);
|
||||
|
||||
if (File.Exists(ldfFile) == true)
|
||||
ledLdf.BackColor = Color.Lime;
|
||||
else
|
||||
if(result == DialogResult.Yes)
|
||||
{
|
||||
ledLdf.BackColor = Color.Red;
|
||||
error = "Invalid FIle";
|
||||
}
|
||||
|
||||
recoveryName = textRecoveryName.Text;
|
||||
if (string.IsNullOrEmpty(recoveryName) == false)
|
||||
ledLdf.BackColor = Color.Lime;
|
||||
else
|
||||
{
|
||||
ledLdf.BackColor = Color.Red;
|
||||
error = "Invalid RecoveryName";
|
||||
}
|
||||
|
||||
lbAttachResult.Text = error;
|
||||
if (error == "success")
|
||||
{
|
||||
string attachError = Attach(mdfFile, ldfFile, recoveryName);
|
||||
if (string.IsNullOrEmpty(attachError) == false)
|
||||
if (File.Exists(mdfFile) == true)
|
||||
ledMdf.BackColor = Color.Lime;
|
||||
else
|
||||
{
|
||||
lbAttachResult.ForeColor = Color.Red;
|
||||
lbAttachResult.Text = attachError;
|
||||
ledMdf.BackColor = Color.Red;
|
||||
error = "Invalid Mdf File";
|
||||
}
|
||||
|
||||
if (File.Exists(ldfFile) == true)
|
||||
ledLdf.BackColor = Color.Lime;
|
||||
else
|
||||
{
|
||||
ledLdf.BackColor = Color.Red;
|
||||
error = "Invalid Ldf File";
|
||||
}
|
||||
|
||||
recoveryName = textRecoveryName.Text;
|
||||
if (string.IsNullOrEmpty(recoveryName) == false)
|
||||
ledLdf.BackColor = Color.Lime;
|
||||
else
|
||||
{
|
||||
ledLdf.BackColor = Color.Red;
|
||||
error = "Invalid RecoveryName";
|
||||
}
|
||||
|
||||
lbAttachResult.Text = error;
|
||||
if (error == "success")
|
||||
{
|
||||
string attachError = Attach(mdfFile, ldfFile, recoveryName);
|
||||
if (string.IsNullOrEmpty(attachError) == false)
|
||||
{
|
||||
lbAttachResult.ForeColor = Color.Red;
|
||||
lbAttachResult.Text = attachError;
|
||||
}
|
||||
else
|
||||
lbAttachResult.ForeColor = Color.Lime;
|
||||
}
|
||||
else
|
||||
lbAttachResult.ForeColor = Color.Lime;
|
||||
}
|
||||
else
|
||||
lbAttachResult.ForeColor = Color.Red;
|
||||
|
||||
SelectDBList();
|
||||
lbAttachResult.ForeColor = Color.Red;
|
||||
|
||||
SelectDBList();
|
||||
}
|
||||
}
|
||||
|
||||
private string Attach(string mdfFile, string ldfFile, string attachName)
|
||||
@ -105,7 +116,7 @@ namespace SystemX.Product.CP.RecoveryTool
|
||||
string error = string.Empty;
|
||||
|
||||
// 프로세스 설정
|
||||
string command = $" -S localhost -U alis -P Kefico!@34 -Q \"CREATE DATABASE {attachName} ON (FILENAME = '{mdfFile}'), (FILENAME = '{ldfFile}') FOR ATTACH;\"";
|
||||
string command = $" -S localhost -U alis -P Kefico!@34 -Q \"CREATE DATABASE {attachName}_Recovery ON (FILENAME = '{mdfFile}'), (FILENAME = '{ldfFile}') FOR ATTACH;\"";
|
||||
Console.WriteLine(command);
|
||||
ProcessStartInfo startInfo = new ProcessStartInfo
|
||||
{
|
||||
@ -182,7 +193,7 @@ namespace SystemX.Product.CP.RecoveryTool
|
||||
var connMain = new SqlConnection("server=127.0.0.1,1433;uid=alis;password=Kefico!@34;");
|
||||
connMain.Open();
|
||||
|
||||
SqlCommand SQLCmd = new SqlCommand("select name from sys.databases with(nolock) where owner_sid != 0x01;", connMain);
|
||||
SqlCommand SQLCmd = new SqlCommand("select name from sys.databases with(nolock) where owner_sid != 0x01 and name like '%Recovery%';", connMain);
|
||||
SQLCmd.CommandType = CommandType.Text;
|
||||
DbDataReader dtReader = SQLCmd.ExecuteReader();
|
||||
|
||||
@ -203,9 +214,25 @@ namespace SystemX.Product.CP.RecoveryTool
|
||||
if (e.ColumnIndex == 2)
|
||||
{
|
||||
var dbName = gridDB.Rows[e.RowIndex].Cells[1].Value.ToString();
|
||||
Detach(dbName);
|
||||
SelectDBList();
|
||||
|
||||
DialogResult result = MessageBox.Show(
|
||||
$"Attach DB Name: '{dbName}' 연결을 삭제 하시겠습니까?", // 메시지 내용
|
||||
"Detach DB", // 타이틀
|
||||
MessageBoxButtons.YesNo, // 버튼 옵션
|
||||
MessageBoxIcon.Question // 아이콘 (선택 사항)
|
||||
);
|
||||
|
||||
if(result == DialogResult.Yes)
|
||||
{
|
||||
Detach(dbName);
|
||||
SelectDBList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnRefresh_Click(object sender, EventArgs e)
|
||||
{
|
||||
SelectDBList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{287E64B3-C49B-4270-9555-3A254A14FFED}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>SystemX.Product.CP.RecoveryTool</RootNamespace>
|
||||
<AssemblyName>SystemX.Product.CP.RecoveryTool</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||
|
||||
Reference in New Issue
Block a user