/// <summary> /// Записать срез в таблицы срезов, выбрав нужные таблицы /// </summary> private void WriteSrez(SrezTypes srezType, DateTime srezDT) { if (srezType == SrezTypes.Cur) { // запись нового текущего среза if (Settings.WriteCur) WriteCurSrez(curSrezAdapter, srezDT); if (Settings.WriteCurCopy) WriteCurSrez(curSrezCopyAdapter, srezDT); } else { // определение параметров записи среза bool writeMain; bool writeCopy; AvgData[] avgData; if (srezType == SrezTypes.Min) { writeMain = Settings.WriteMin; writeCopy = Settings.WriteMinCopy; avgData = minAvgData; } else // srezType == SrezTypes.Hour { writeMain = Settings.WriteHr; writeCopy = Settings.WriteHrCopy; avgData = hrAvgData; } // получение кэша таблицы срезов SrezTableCache srezTableCache = GetSrezTableCache(srezDT.Date, srezType); // запись нового минутного или часового среза lock (srezTableCache) { if (writeMain) WriteArcSrez(srezTableCache.SrezTable, srezTableCache.SrezAdapter, srezDT, avgData); if (writeCopy) WriteArcSrez(srezTableCache.SrezTableCopy, srezTableCache.SrezCopyAdapter, srezDT, avgData); } } }
/// <summary> /// Получить таблицу срезов, содержащую данные заданных каналов /// </summary> public SrezTableLight GetSrezTable(DateTime date, SrezTypes srezType, int[] cnlNums) { try { SrezTableLight destSrezTable; int cnlNumsLen = cnlNums == null ? 0 : cnlNums.Length; if (serverIsReady && cnlNumsLen > 0) { // получение кэша таблицы срезов SrezTableCache srezTableCache = GetSrezTableCache(date.Date, srezType); lock (srezTableCache) { // заполнение таблицы срезов в кэше srezTableCache.FillSrezTable(); // создание новой таблицы срезов и копирование в неё данных заданных каналов SrezTable srcSrezTable = srezTableCache.SrezTable; SrezTable.SrezDescr prevSrezDescr = null; int[] cnlNumIndexes = new int[cnlNumsLen]; destSrezTable = new SrezTableLight(); foreach (SrezTable.Srez srcSrez in srcSrezTable.SrezList.Values) { // определение индексов каналов if (!srcSrez.SrezDescr.Equals(prevSrezDescr)) { for (int i = 0; i < cnlNumsLen; i++) cnlNumIndexes[i] = Array.BinarySearch<int>(srcSrez.CnlNums, cnlNums[i]); } // создание и заполнение среза, содержащего заданные каналы SrezTableLight.Srez destSrez = new SrezTableLight.Srez(srcSrez.DateTime, cnlNumsLen); for (int i = 0; i < cnlNumsLen; i++) { destSrez.CnlNums[i] = cnlNums[i]; int cnlNumInd = cnlNumIndexes[i]; destSrez.CnlData[i] = cnlNumInd < 0 ? SrezTableLight.CnlData.Empty : srcSrez.CnlData[cnlNumInd]; } destSrezTable.SrezList.Add(destSrez.DateTime, destSrez); prevSrezDescr = srcSrez.SrezDescr; } } } else { destSrezTable = null; } return destSrezTable; } catch (Exception ex) { AppLog.WriteAction((Localization.UseRussian ? "Ошибка при получении таблицы срезов: " : "Error getting snapshot table: ") + ex.Message, Log.ActTypes.Exception); return null; } }
/// <summary> /// Получить кэш таблицы срезов, создав его при необходимости /// </summary> private SrezTableCache GetSrezTableCache(DateTime date, SrezTypes srezType) { SortedList<DateTime, SrezTableCache> srezTableCacheList; SrezTableCache srezTableCache; if (srezType == SrezTypes.Min) srezTableCacheList = minSrezTableCache; else if (srezType == SrezTypes.Hour) srezTableCacheList = hrSrezTableCache; else throw new ArgumentException(Localization.UseRussian ? "Недопустимый тип срезов." : "Illegal snapshot type."); lock (srezTableCacheList) { if (srezTableCacheList.TryGetValue(date, out srezTableCache)) { srezTableCache.AccessDT = DateTime.Now; } else { // создание кэша таблицы срезов srezTableCache = new SrezTableCache(date); srezTableCacheList.Add(date, srezTableCache); if (srezType == SrezTypes.Min) { if (Localization.UseRussian) { srezTableCache.SrezTable.Descr = "минутных срезов"; srezTableCache.SrezTableCopy.Descr = "копий минутных срезов"; } else { srezTableCache.SrezTable.Descr = "minute data"; srezTableCache.SrezTableCopy.Descr = "minute data copy"; } srezTableCache.SrezAdapter.FileName = ServerUtils.BuildMinFileName(Settings.ArcDir, date); srezTableCache.SrezCopyAdapter.FileName = ServerUtils.BuildMinFileName(Settings.ArcCopyDir, date); } else { if (Localization.UseRussian) { srezTableCache.SrezTable.Descr = "часовых срезов"; srezTableCache.SrezTableCopy.Descr = "копий часовых срезов"; } else { { srezTableCache.SrezTable.Descr = "hourly data"; srezTableCache.SrezTableCopy.Descr = "hourly data copy"; } } srezTableCache.SrezAdapter.FileName = ServerUtils.BuildHourFileName(Settings.ArcDir, date); srezTableCache.SrezCopyAdapter.FileName = ServerUtils.BuildHourFileName(Settings.ArcCopyDir, date); } } } return srezTableCache; }