Example #1
0
        public async Task <List <HistoryValueElement> > GetComponentStatusValues(ComponentStatusFilter filter, CancellationToken cancellationToken)
        {
            var result = new List <HistoryValueElement>();

            await _lock.EnterAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                var rootPath = BuildComponentStatusPath(filter.ComponentUid, filter.StatusUid);
                var dayPaths = BuildDayPaths(filter.RangeStart, filter.RangeEnd);

                foreach (var dayPath in dayPaths)
                {
                    var path = Path.Combine(rootPath, dayPath.Path, ValuesFilename);
                    if (!File.Exists(path))
                    {
                        continue;
                    }

                    using (var fileStream = File.OpenRead(path))
                    {
                        var valueStream = new HistoryValuesStream(fileStream);

                        HistoryValueElement currentElement = null;

                        while (await valueStream.MoveNextAsync())
                        {
                            if (valueStream.CurrentToken is BeginToken beginToken)
                            {
                                currentElement = new HistoryValueElement
                                {
                                    Begin = new DateTime(
                                        dayPath.Year, dayPath.Month,
                                        dayPath.Day,
                                        beginToken.Value.Hours,
                                        beginToken.Value.Minutes,
                                        beginToken.Value.Seconds,
                                        beginToken.Value.Milliseconds,
                                        DateTimeKind.Utc)
                                };
                            }
                            else if (valueStream.CurrentToken is ValueToken valueToken)
                            {
                                currentElement.Value = valueToken.Value;
                            }
                            else if (valueStream.CurrentToken is EndToken endToken)
                            {
                                currentElement.End = new DateTime(
                                    dayPath.Year, dayPath.Month,
                                    dayPath.Day,
                                    endToken.Value.Hours,
                                    endToken.Value.Minutes,
                                    endToken.Value.Seconds,
                                    endToken.Value.Milliseconds,
                                    DateTimeKind.Utc);

                                result.Add(currentElement);
                            }
                        }
                    }
                }
            }
            finally
            {
                _lock.Exit();
            }

            return(result);
        }
        public async Task <List <HistoryValueElement> > Read(HistoryReadOperation readOperation, CancellationToken cancellationToken)
        {
            if (readOperation is null)
            {
                throw new ArgumentNullException(nameof(readOperation));
            }

            var result = new List <HistoryValueElement>();

            var dayPaths = BuildDayPaths(readOperation.RangeStart, readOperation.RangeEnd);

            await _lock.EnterAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                foreach (var dayPath in dayPaths)
                {
                    var path = Path.Combine(readOperation.Path, dayPath.Path, ValuesFilename);
                    if (!File.Exists(path))
                    {
                        continue;
                    }

                    using (var fileStream = File.OpenRead(path))
                    {
                        using (var valueStream = new HistoryValuesStream(fileStream))
                        {
                            HistoryValueElement currentElement = null;

                            while (await valueStream.MoveNextAsync().ConfigureAwait(false))
                            {
                                if (valueStream.CurrentToken is BeginToken beginToken)
                                {
                                    currentElement = new HistoryValueElement
                                    {
                                        Begin = new DateTime(
                                            dayPath.Year,
                                            dayPath.Month,
                                            dayPath.Day,
                                            beginToken.Value.Hours,
                                            beginToken.Value.Minutes,
                                            beginToken.Value.Seconds,
                                            beginToken.Value.Milliseconds,
                                            DateTimeKind.Utc)
                                    };
                                }
                                else if (valueStream.CurrentToken is ValueToken valueToken)
                                {
                                    currentElement.Value = valueToken.Value;
                                }
                                else if (valueStream.CurrentToken is EndToken endToken)
                                {
                                    currentElement.End = new DateTime(
                                        dayPath.Year,
                                        dayPath.Month,
                                        dayPath.Day,
                                        endToken.Value.Hours,
                                        endToken.Value.Minutes,
                                        endToken.Value.Seconds,
                                        endToken.Value.Milliseconds,
                                        DateTimeKind.Utc);

                                    result.Add(currentElement);
                                }
                            }
                        }
                    }
                }
            }
            finally
            {
                _lock.Exit();
            }

            return(result);
        }