using System; using System.Collections.Generic; using System.Linq; using System.Text; using DTS.Common.Enums.Hardware; using DTS.Common.Interface.DASFactory.Diagnostics.HardwareList; namespace HardareList.Model { public class SLICE6TreeNode : DTS.Common.Base.BasePropertyChanged, ISLICE6TreeNode { /// /// Id in DAS table in db /// public int DASId { get; set; } /// /// serial number for given das /// public string SerialNumber { get; set; } /// /// port on the S6DB /// public int Port { get; set; } /// /// string version of the port, this is just here for easier converting of invalid values /// public string PortString => Port < 0 ? "---" : Port.ToString(); /// /// the order of the das on the S6DB /// public int Number { get; set; } /// /// the order on the chain on a given port /// public int PositionOnChain { get; set; } /// /// string version of PositionOnChain, just for easier converting of invalid values /// public string PositionOnChainString => PositionOnChain < 0 ? "---" : PositionOnChain.ToString(); public SLICE6TreeNode(int dasId, string serialNumber, int port, int number, int positionOnChain) { DASId = dasId; SerialNumber = serialNumber; Port = port; Number = number; PositionOnChain = positionOnChain; } /// /// returns all S6 that are not associated with a given S6DB /// /// /// public static ISLICE6TreeNode[] GetAvailableTreeNodes(string serialNumberParent) { var nodes = new List(); if (string.IsNullOrWhiteSpace(serialNumberParent)) { return nodes.ToArray(); } using (var cmd = DTS.Common.Storage.DbOperations.GetSQLCommand()) { try { cmd.CommandType = System.Data.CommandType.Text; cmd.CommandText = $"SELECT [DASId], [SerialNumber], [PositionOnDistributor], [PositionOnChain], [Port] FROM [DAS] WHERE [ParentDAS]<>@ParentDAS AND [Type]={(int)HardwareTypes.SLICE6_Base} AND [Position] <> 'Prototype'"; cmd.Parameters.Add( new System.Data.SqlClient.SqlParameter("@ParentDAS", System.Data.SqlDbType.NVarChar, 50) { Value = serialNumberParent }); var reader = cmd.ExecuteReader(); while (reader.Read()) { var dasId = Convert.ToInt32(reader["DASId"]); var serialNumber = Convert.ToString(reader["SerialNumber"]); var positionOnDistributor = Convert.ToInt32(reader["PositionOnDistributor"]); var positionOnChain = Convert.ToInt32(reader["PositionOnChain"]); var port = Convert.ToInt32(reader["Port"]); nodes.Add(new SLICE6TreeNode(dasId, serialNumber, port, positionOnDistributor, positionOnChain)); } } finally { cmd.Connection.Dispose(); } } nodes.Sort((a, b) => a.SerialNumber.CompareTo(b.SerialNumber)); return nodes.ToArray(); } /// /// returns all SL6 associated with a given S6DB /// /// /// public static ISLICE6TreeNode[] GetTreeNodes(string serialNumberParent) { var nodes = new List(); if (!string.IsNullOrWhiteSpace(serialNumberParent)) { using (var cmd = DTS.Common.Storage.DbOperations.GetSQLCommand()) { try { cmd.CommandType = System.Data.CommandType.Text; cmd.CommandText = "SELECT [DASId], [SerialNumber], [PositionOnDistributor], [PositionOnChain], [Port] FROM [DAS] WHERE [ParentDAS]=@ParentDAS"; cmd.Parameters.Add( new System.Data.SqlClient.SqlParameter("@ParentDAS", System.Data.SqlDbType.NVarChar, 50) { Value = serialNumberParent }); var reader = cmd.ExecuteReader(); while (reader.Read()) { var dasId = Convert.ToInt32(reader["DASId"]); var serialNumber = Convert.ToString(reader["SerialNumber"]); var positionOnDistributor = Convert.ToInt32(reader["PositionOnDistributor"]); var positionOnChain = Convert.ToInt32(reader["PositionOnChain"]); var port = Convert.ToInt32(reader["Port"]); nodes.Add(new SLICE6TreeNode(dasId, serialNumber, port, positionOnDistributor, positionOnChain)); } } finally { cmd.Connection.Dispose(); } } nodes.Sort((a, b) => a.Number.CompareTo(b.Number)); } return nodes.ToArray(); } /// /// swaps the children das from one distributor to another in the db /// public static void SwapNodes(string serialNumberA, string serialNumberB) { var listA = new List(); var listB = new List(); using (var sql = DTS.Common.Storage.DbOperations.GetSQLCommand(true)) { try { sql.CommandType = System.Data.CommandType.Text; sql.CommandText = $"SELECT [DASId], [ParentDAS] FROM [DAS] WHERE [ParentDAS] in (@serialNumberA, @serialNumberB)"; sql.Parameters.Add(new System.Data.SqlClient.SqlParameter("@serialNumberA", System.Data.SqlDbType.NVarChar) { Value = serialNumberA }); sql.Parameters.Add(new System.Data.SqlClient.SqlParameter("@serialNumberB", System.Data.SqlDbType.NVarChar) { Value = serialNumberB }); var reader = sql.ExecuteReader(); while (reader.Read()) { var dasId = Convert.ToInt32(reader["DASId"]); var parentDAS = Convert.ToString(reader["ParentDAS"]).ToUpper(); if (parentDAS == serialNumberA) { listA.Add(dasId); } else { listB.Add(dasId); } } } finally { sql.Connection.Dispose(); } } if (listA.Any()) { Associate(serialNumberB, listA.ToArray()); } if (listB.Any()) { Associate(serialNumberB, listB.ToArray()); } } /// /// associates given das ids with a specific das /// private static void Associate(string parentDAS, int[] dasId) { using (var sql = DTS.Common.Storage.DbOperations.GetSQLCommand(true)) { try { sql.CommandType = System.Data.CommandType.Text; sql.Parameters.Add(new System.Data.SqlClient.SqlParameter("@ParentDAS", System.Data.SqlDbType.NVarChar) { Value = parentDAS }); var sb = new StringBuilder(); sb.Append("UPDATE [DAS] SET [ParentDAS]=@ParentDAS WHERE DASId in ("); for (var i = 0; i < dasId.Length; i++) { if (i > 0) { sb.Append(", "); } sb.Append($"@{i + 1}"); sql.Parameters.Add( new System.Data.SqlClient.SqlParameter($"@{i + 1}", System.Data.SqlDbType.NVarChar, 50) { Value = dasId[i] }); } sb.Append(")"); sql.CommandText = sb.ToString(); sql.ExecuteNonQuery(); } finally { sql.Connection.Dispose(); } } } /// /// commits any changes for associations for a S6DB to the Db /// /// serial number of S6DB /// all SL6 that should be associated with S6DB public static void SaveAssociations(string serialNumber, ISLICE6TreeNode[] attachedSLICE6) { //step1, remove all associations, step 2, add any associations needed using (var sql = DTS.Common.Storage.DbOperations.GetSQLCommand()) { try { sql.CommandType = System.Data.CommandType.Text; sql.CommandText = "UPDATE [DAS] SET [IsModule]=0, [PositionOnDistributor]=-1, [PositionOnChain]=-1, [Port]=-1, [ParentDAS]='' WHERE [ParentDAS]=@serialNumber"; sql.Parameters.Add( new System.Data.SqlClient.SqlParameter("@serialNumber", System.Data.SqlDbType.NVarChar, 50) { Value = serialNumber }); sql.ExecuteNonQuery(); } finally { sql.Connection.Dispose(); } } //step 2 create new associations foreach (var slice6 in attachedSLICE6) { using (var sql = DTS.Common.Storage.DbOperations.GetSQLCommand()) { try { sql.CommandType = System.Data.CommandType.Text; sql.CommandText = "UPDATE [DAS] SET [IsModule]=1, [PositionOnDistributor]=@positionOnDistributor, [PositionOnChain]=@positionOnChain, [Port]=@Port, [ParentDAS]=@serialNumber WHERE [DASId]=@DASId"; sql.Parameters.Add( new System.Data.SqlClient.SqlParameter("@serialNumber", System.Data.SqlDbType.NVarChar, 50) { Value = serialNumber }); sql.Parameters.Add( new System.Data.SqlClient.SqlParameter("@positionOnDistributor", System.Data.SqlDbType.Int) { Value = slice6.Number }); sql.Parameters.Add( new System.Data.SqlClient.SqlParameter("@positionOnChain", System.Data.SqlDbType.Int) { Value = slice6.PositionOnChain }); sql.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Port", System.Data.SqlDbType.Int) { Value = slice6.Port }); sql.Parameters.Add(new System.Data.SqlClient.SqlParameter("@DASId", System.Data.SqlDbType.Int) { Value = slice6.DASId }); sql.ExecuteNonQuery(); } finally { sql.Connection.Dispose(); } } } } } }