public ArchiveFetch(TimeInfo timeInfo, List<PointPair> valueList) { this.TimeInfo = timeInfo; this.ValueList = valueList; }
public ArchiveFetch(TimeInfo timeInfo, List <PointPair> valueList) { this.TimeInfo = timeInfo; this.ValueList = valueList; }
/// <summary> /// Fetch data from a single archive. Note that checks for validity of the time /// period requested happen above this level so it's possible to wrap around the /// archive on a read and request data older than the archive's retention /// </summary> private static ArchiveFetch ArchiveFetch(FileStream fh, ArchiveInfo archive, long fromTime, long untilTime) { Debug.WriteLine(string.Format("ArchiveFetch from {0} to {1} in archive [{2},{3}]", fromTime, untilTime, archive.SecondsPerPoint, archive.Points)); var fromInterval = (fromTime - (fromTime.Mod(archive.SecondsPerPoint))) + (int)archive.SecondsPerPoint; var untilInterval = (untilTime - (untilTime.Mod(archive.SecondsPerPoint))) + (int)archive.SecondsPerPoint; fh.Seek(archive.Offset, SeekOrigin.Begin); using (var reader = new EndianBinaryReader(EndianBitConverter.Big, new NonClosingStreamWrapper(fh))) { var baseInterval = reader.ReadInt64(); // timestamp var baseValue = reader.ReadDouble(); // value if (baseInterval == 0) { var step = archive.SecondsPerPoint; var points = (int)((untilInterval - fromInterval) / step); var _timeInfo = new TimeInfo(fromInterval, untilInterval, archive.SecondsPerPoint); var _valueList = Enumerable.Repeat(new PointPair(0, 0), points).ToList(); return(new ArchiveFetch(_timeInfo, _valueList)); } // Determine fromOffset var timeDistance = fromInterval - baseInterval; var pointDistance = timeDistance / archive.SecondsPerPoint; var byteDistance = pointDistance * PointSize; var fromOffset = (int)(archive.Offset + (byteDistance.Mod(archive.Size))); // Determine untilOffset timeDistance = untilInterval - baseInterval; pointDistance = timeDistance / archive.SecondsPerPoint; byteDistance = pointDistance * PointSize; var untilOffset = (int)(archive.Offset + (byteDistance.Mod(archive.Size))); // read all the points in the interval fh.Seek(fromOffset, SeekOrigin.Begin); byte[] seriesBuffer; int bytesRead = 0; if (fromOffset < untilOffset) { // If we don't wrap around the archive seriesBuffer = new byte[(int)(untilOffset - fromOffset)]; bytesRead += fh.Read(seriesBuffer, 0, seriesBuffer.Length); if (bytesRead != seriesBuffer.Length) { throw new CorruptWhisperFileException(string.Format("read: {0} != {1}", bytesRead, seriesBuffer.Length)); } Debug.WriteLine(string.Format("read {0} points starting at offset {1}", (bytesRead / PointSize), fromOffset)); } else { // We do wrap around the archive, so we need two reads var archiveEnd = archive.Offset + archive.Size; var firstPart = (int)(archiveEnd - fromOffset); var secondPart = (int)(untilOffset - archive.Offset); seriesBuffer = new byte[firstPart + secondPart]; bytesRead += fh.Read(seriesBuffer, 0, firstPart); Debug.WriteLine(string.Format("read {0} points starting at offset {1}", (firstPart / PointSize), fromOffset)); fh.Seek(archive.Offset, SeekOrigin.Begin); bytesRead += fh.Read(seriesBuffer, firstPart, secondPart); Debug.WriteLine(string.Format("read {0} points starting at offset {1}", (secondPart / PointSize), archive.Offset)); } var valueList = UnpackSeriesBuffer(seriesBuffer, bytesRead); var timeInfo = new TimeInfo(fromInterval, untilInterval, archive.SecondsPerPoint); return(new ArchiveFetch(timeInfo, valueList.Where(x => !x.Equals(default(PointPair)) && x.Timestamp != default(long)).ToList())); } }
/// <summary> /// Fetch data from a single archive. Note that checks for validity of the time /// period requested happen above this level so it's possible to wrap around the /// archive on a read and request data older than the archive's retention /// </summary> private static ArchiveFetch ArchiveFetch(FileStream fh, ArchiveInfo archive, long fromTime, long untilTime) { Debug.WriteLine(string.Format("ArchiveFetch from {0} to {1} in archive [{2},{3}]", fromTime, untilTime, archive.SecondsPerPoint, archive.Points)); var fromInterval = (fromTime - (fromTime.Mod(archive.SecondsPerPoint))) + (int)archive.SecondsPerPoint; var untilInterval = (untilTime - (untilTime.Mod(archive.SecondsPerPoint))) + (int)archive.SecondsPerPoint; fh.Seek(archive.Offset, SeekOrigin.Begin); using (var reader = new EndianBinaryReader(EndianBitConverter.Big, new NonClosingStreamWrapper(fh))) { var baseInterval = reader.ReadInt64(); // timestamp var baseValue = reader.ReadDouble(); // value if (baseInterval == 0) { var step = archive.SecondsPerPoint; var points = (int)((untilInterval - fromInterval) / step); var _timeInfo = new TimeInfo(fromInterval, untilInterval, archive.SecondsPerPoint); var _valueList = Enumerable.Repeat(new PointPair(0, 0), points).ToList(); return new ArchiveFetch(_timeInfo, _valueList); } // Determine fromOffset var timeDistance = fromInterval - baseInterval; var pointDistance = timeDistance / archive.SecondsPerPoint; var byteDistance = pointDistance * PointSize; var fromOffset = (int)(archive.Offset + (byteDistance.Mod(archive.Size))); // Determine untilOffset timeDistance = untilInterval - baseInterval; pointDistance = timeDistance / archive.SecondsPerPoint; byteDistance = pointDistance * PointSize; var untilOffset = (int)(archive.Offset + (byteDistance.Mod(archive.Size))); // read all the points in the interval fh.Seek(fromOffset, SeekOrigin.Begin); byte[] seriesBuffer; int bytesRead = 0; if (fromOffset < untilOffset) { // If we don't wrap around the archive seriesBuffer = new byte[(int)(untilOffset - fromOffset)]; bytesRead += fh.Read(seriesBuffer, 0, seriesBuffer.Length); if (bytesRead != seriesBuffer.Length) { throw new CorruptWhisperFileException(string.Format("read: {0} != {1}", bytesRead, seriesBuffer.Length)); } Debug.WriteLine(string.Format("read {0} points starting at offset {1}", (bytesRead / PointSize), fromOffset)); } else { // We do wrap around the archive, so we need two reads var archiveEnd = archive.Offset + archive.Size; var firstPart = (int)(archiveEnd - fromOffset); var secondPart = (int)(untilOffset - archive.Offset); seriesBuffer = new byte[firstPart + secondPart]; bytesRead += fh.Read(seriesBuffer, 0, firstPart); Debug.WriteLine(string.Format("read {0} points starting at offset {1}", (firstPart / PointSize), fromOffset)); fh.Seek(archive.Offset, SeekOrigin.Begin); bytesRead += fh.Read(seriesBuffer, firstPart, secondPart); Debug.WriteLine(string.Format("read {0} points starting at offset {1}", (secondPart / PointSize), archive.Offset)); } var valueList = UnpackSeriesBuffer(seriesBuffer, bytesRead); var timeInfo = new TimeInfo(fromInterval, untilInterval, archive.SecondsPerPoint); return new ArchiveFetch(timeInfo, valueList.Where(x => !x.Equals(default(PointPair)) && x.Timestamp != default(long)).ToList()); } }