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); }