1: using Microsoft.EntityFrameworkCore;
2: using System;
3: using System.Collections.Generic;
4: using System.Data;
5: using System.Linq;
6: using System.Text;
7:
8: namespace Ia.Ngn.Cl.Model.Data.Huawei
9: {
10: ////////////////////////////////////////////////////////////////////////////
11:
12: /// <summary publish="true">
13: /// Huawei's Board support class of Optical Fiber Network (OFN) data model.
14: /// </summary>
15: ///
16: /// <remarks>
17: /// Copyright © 2016-2018 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
18: ///
19: /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
20: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
21: ///
22: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
23: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
24: ///
25: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
26: ///
27: /// Copyright notice: This notice may not be removed or altered from any source distribution.
28: /// </remarks>
29: public class Board
30: {
31: /// <summary/>
32: public Board() { }
33:
34: ////////////////////////////////////////////////////////////////////////////
35:
36: /// <summary>
37: ///
38: /// </summary>
39: public static bool Update(Ia.Ngn.Cl.Model.Business.Huawei.Ems.Response response, out Ia.Cl.Model.Result result)
40: {
41: bool isUpdated;
42: int did, fn, sn, queryFn, querySn, readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount;
43: string id, queryCommand, queryDev;
44: DataColumnCollection columns;
45: DataRow columnDataRow;
46: Ia.Ngn.Cl.Model.Huawei.EmsBoard board, newBoard;
47: Ia.Ngn.Cl.Model.Huawei.EmsDev dev;
48: List<string> itemIdList;
49: List<Ia.Ngn.Cl.Model.Huawei.EmsBoard> boardList;
50:
51: isUpdated = false;
52: readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
53: result = new Ia.Cl.Model.Result();
54:
55: if (response.CompletionCode == "COMPLD")
56: {
57: if (response.QueryDataTable != null)
58: {
59: queryCommand = response.CommandFromCorrelationTagDictionaryByCtag;
60: //queryCommand = "LST-BOARD::DEV=MDU-SMC-1126-002,FN=0:{ctag}::SHOWOPTION=BNAME;"; // debug
61:
62: // LST-BOARD::DEV=MDU-FNT-806-002,FN=0:{ctag}::SHOWOPTION=BNAME;
63: // LST-BOARD::DEV=MDU-FNT-806-002,FN=0,SN=3:{ctag}::SHOWOPTION=BNAME;
64: queryDev = Ia.Cl.Model.Default.Match(queryCommand, @"DEV=(.+?),");
65: queryFn = int.Parse(Ia.Cl.Model.Default.Match(queryCommand, @"FN=(\d+)"));
66: querySn = int.TryParse(Ia.Cl.Model.Default.Match(queryCommand, @"SN=(\d+)"), out int i) ? i : 0;
67:
68: columns = response.QueryDataTable.Columns;
69: readItemCount = response.QueryDataTable.Rows.Count;
70:
71: dev = Ia.Ngn.Cl.Model.Data.Huawei.Dev.ReadByDev(queryDev);
72:
73: if (dev != null)
74: {
75: itemIdList = new List<string>(response.QueryDataTable.Rows.Count + 1);
76:
77: using (var db = new Ia.Ngn.Cl.Model.Ngn())
78: {
79: boardList = (from eb in db.EmsBoards where eb.EmsDev.DEV == queryDev select eb).ToList();
80:
81: existingItemCount = boardList.Count;
82:
83: if (response.QueryDataTable.Rows.Count >= 1)
84: {
85: columnDataRow = response.QueryDataTable.Rows[0];
86:
87: foreach (DataRow dataRow in response.QueryDataTable.Rows)
88: {
89: did = int.Parse(dataRow[columns.IndexOf("DID")].ToString());
90: fn = int.Parse(dataRow[columns.IndexOf("FN")].ToString());
91: sn = int.Parse(dataRow[columns.IndexOf("SN")].ToString());
92:
93: id = Ia.Ngn.Cl.Model.Business.Huawei.Board.BoardId(dev.Id, fn, sn);
94:
95: board = (from b in boardList where b.Id == id select b).SingleOrDefault();
96:
97: newBoard = new Ia.Ngn.Cl.Model.Huawei.EmsBoard()
98: {
99: Id = id,
100: DID = did,
101: FN = fn,
102: SN = sn,
103: BT = columns.Contains("BT") ? dataRow[columns.IndexOf("BT")].ToString() : string.Empty,
104: BVER = columns.Contains("BVER") ? dataRow[columns.IndexOf("BVER")].ToString() : string.Empty,
105: BSTAT = columns.Contains("BSTAT") ? dataRow[columns.IndexOf("BSTAT")].ToString() : string.Empty,
106: DEV = columns.Contains("DEV") ? dataRow[columns.IndexOf("DEV")].ToString() : string.Empty,
107: BNAME = columns.Contains("BNAME") ? dataRow[columns.IndexOf("BNAME")].ToString() : string.Empty,
108: NAME = columns.Contains("NAME") ? dataRow[columns.IndexOf("NAME")].ToString() : string.Empty,
109: ALIAS = columns.Contains("ALIAS") ? dataRow[columns.IndexOf("ALIAS")].ToString() : string.Empty,
110: ELABEL = columns.Contains("ELABEL") ? dataRow[columns.IndexOf("ELABEL")].ToString() : string.Empty,
111: PCBVER = columns.Contains("PCBVER") ? dataRow[columns.IndexOf("PCBVER")].ToString() : string.Empty,
112: SWVER = columns.Contains("SWVER") ? dataRow[columns.IndexOf("SWVER")].ToString() : string.Empty,
113: ROLE = columns.Contains("ROLE") ? dataRow[columns.IndexOf("ROLE")].ToString() : string.Empty,
114: ALARM = columns.Contains("ALARM") ? dataRow[columns.IndexOf("ALARM")].ToString() : string.Empty,
115: ST = columns.Contains("ST") ? dataRow[columns.IndexOf("ST")].ToString() : string.Empty,
116: PROTECTMODE = columns.Contains("PROTECTMODE") ? dataRow[columns.IndexOf("PROTECTMODE")].ToString() : string.Empty,
117: PORTCOUNT = columns.Contains("PORTCOUNT") ? dataRow[columns.IndexOf("PORTCOUNT")].ToString() : string.Empty,
118: PORTTYPE = columns.Contains("PORTTYPE") ? dataRow[columns.IndexOf("PORTTYPE")].ToString() : string.Empty,
119: WORKMODE = columns.Contains("WORKMODE") ? dataRow[columns.IndexOf("WORKMODE")].ToString() : string.Empty,
120: REPLACE = columns.Contains("REPLACE") ? dataRow[columns.IndexOf("REPLACE")].ToString() : string.Empty,
121: EmsDev = (from ed in db.EmsDevs where ed.Id == dev.Id select ed).SingleOrDefault()
122: };
123:
124: if (board == null)
125: {
126: newBoard.Created = newBoard.Updated = DateTime.UtcNow.AddHours(3);
127:
128: db.EmsBoards.Add(newBoard);
129:
130: insertedItemCount++;
131: }
132: else // update
133: {
134: // below: copy values from newBoard to board
135:
136: if (board.Update(newBoard))
137: {
138: db.EmsBoards.Attach(board);
139: db.Entry(board).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
140:
141: updatedItemCount++;
142: }
143: }
144:
145: itemIdList.Add(id); // keep at the end
146: }
147:
148: // below: this function will remove values that were not present in the reading
149: if (boardList.Count > 0)
150: {
151: foreach (Ia.Ngn.Cl.Model.Huawei.EmsBoard bo in boardList)
152: {
153: if (!itemIdList.Contains(bo.Id))
154: {
155: board = (from eb in db.EmsBoards where eb.Id == bo.Id select eb).SingleOrDefault();
156:
157: db.EmsBoards.Remove(board);
158:
159: deletedItemCount++;
160: }
161: }
162: }
163: }
164: else
165: {
166: // below: remove all values since reading was empty
167:
168: if (boardList.Count > 0)
169: {
170: foreach (Ia.Ngn.Cl.Model.Huawei.EmsBoard bo in boardList)
171: {
172: board = (from eb in db.EmsBoards where eb.Id == bo.Id select eb).SingleOrDefault();
173:
174: db.EmsBoards.Remove(board);
175:
176: deletedItemCount++;
177: }
178: }
179: }
180:
181: db.SaveChanges();
182: }
183:
184: if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
185: else isUpdated = false;
186:
187: result.AddSuccess("LST-BOARD (" + response.Ctag + "): (" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
188: }
189: else
190: {
191: result.AddError("Dev is null for dev: " + queryDev);
192: }
193: }
194: else
195: {
196: result.AddWarning("LST-BOARD (" + response.Ctag + "): QueryDataTable is null, (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
197: }
198: }
199: else
200: {
201: result.AddWarning("LST-BOARD (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
202: }
203:
204: return isUpdated;
205: }
206:
207: ////////////////////////////////////////////////////////////////////////////
208:
209: /// <summary>
210: ///
211: /// </summary>
212: public static List<Ia.Ngn.Cl.Model.Huawei.EmsBoard> List()
213: {
214: List<Ia.Ngn.Cl.Model.Huawei.EmsBoard> list;
215:
216: using (var db = new Ia.Ngn.Cl.Model.Ngn())
217: {
218: list = (from eb in db.EmsBoards select eb).Include(u => u.EmsDev).AsNoTracking().ToList();
219: }
220:
221: return list.ToList();
222: }
223:
224: ////////////////////////////////////////////////////////////////////////////
225:
226: /// <summary>
227: ///
228: /// </summary>
229: public static List<Ia.Ngn.Cl.Model.Huawei.EmsBoard> List(int devId)
230: {
231: List<Ia.Ngn.Cl.Model.Huawei.EmsBoard> list;
232:
233: using (var db = new Ia.Ngn.Cl.Model.Ngn())
234: {
235: list = (from b in db.EmsBoards where b.EmsDev.Id == devId select b).ToList();
236: }
237:
238: return list;
239: }
240:
241: ////////////////////////////////////////////////////////////////////////////
242:
243: /// <summary>
244: ///
245: /// </summary>
246: public static Ia.Ngn.Cl.Model.Huawei.EmsBoard ReadByEmsNameFnSn(string emsName, int fn, int sn)
247: {
248: Ia.Ngn.Cl.Model.Huawei.EmsBoard item;
249:
250: using (var db = new Ia.Ngn.Cl.Model.Ngn())
251: {
252: item = (from b in db.EmsBoards where b.DEV == emsName && b.FN == fn && b.SN == sn select b).SingleOrDefault();
253: }
254:
255: return item;
256: }
257:
258: ////////////////////////////////////////////////////////////////////////////
259:
260: /// <summary>
261: ///
262: /// </summary>
263: public static Ia.Ngn.Cl.Model.Huawei.EmsBoard ReadByDidFnSn(int did, int fn, int sn)
264: {
265: Ia.Ngn.Cl.Model.Huawei.EmsBoard item;
266:
267: using (var db = new Ia.Ngn.Cl.Model.Ngn())
268: {
269: item = (from b in db.EmsBoards where b.DID == did && b.FN == fn && b.SN == sn select b).SingleOrDefault();
270: }
271:
272: return item;
273: }
274:
275: ////////////////////////////////////////////////////////////////////////////
276: ////////////////////////////////////////////////////////////////////////////
277:
278: /// <summary>
279: ///
280: /// </summary>
281: public static string ToSimpleTextString(Ia.Ngn.Cl.Model.Huawei.EmsBoard emdBoard)
282: {
283: StringBuilder sb;
284:
285: sb = new StringBuilder();
286:
287: sb.AppendLine("DID: " + emdBoard.DID);
288: sb.AppendLine("FN: " + emdBoard.FN);
289: sb.AppendLine("SN: " + emdBoard.SN);
290: sb.AppendLine("BT: " + emdBoard.BT);
291: sb.AppendLine("BVER: " + emdBoard.BVER);
292: sb.AppendLine("BSTAT: " + emdBoard.BSTAT);
293:
294: return sb.ToString();
295: }
296:
297: ////////////////////////////////////////////////////////////////////////////
298: ////////////////////////////////////////////////////////////////////////////
299: }
300:
301: ////////////////////////////////////////////////////////////////////////////
302: ////////////////////////////////////////////////////////////////////////////
303: }