Esempio n. 1
0
        /// <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);
                }
            }
        }
Esempio n. 2
0
        /// <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;
            }
        }
Esempio n. 3
0
        /// <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;
        }