/// <summary> /// Initializes a new instance of the <see cref="PinSizeHistory" /> class. /// </summary> private PinSizeHistory(IClock clock, PinHistoryBuffer pinHistoryBuffer, long timestampInTick, AbsolutePath directoryPath) { Contract.Requires(clock != null); Contract.Requires(pinHistoryBuffer != null); Contract.Requires(directoryPath != null); _clock = clock; _pinHistoryBuffer = pinHistoryBuffer; _timestampInTick = timestampInTick; _directoryPath = directoryPath; }
/// <summary> /// Loads pin history from disk if exists, otherwise create a new instance. /// </summary> public static async Task <PinSizeHistory> LoadOrCreateNewAsync( IAbsFileSystem fileSystem, IClock clock, AbsolutePath directoryPath, int?newCapacity = default(int?)) { Contract.Requires(fileSystem != null); Contract.Requires(directoryPath != null); var filePath = directoryPath / BinaryFileName; try { if (!fileSystem.FileExists(filePath)) { return(new PinSizeHistory( clock, newCapacity.HasValue ? PinHistoryBuffer.Create(newCapacity.Value) : PinHistoryBuffer.Create(), clock.UtcNow.Ticks, directoryPath)); } using (var stream = await fileSystem.OpenReadOnlySafeAsync(filePath, FileShare.Delete)) { using (var reader = new BinaryReader(stream)) { var pinHistoryBuffer = PinHistoryBuffer.Deserialize(reader, newCapacity); var timeStampInTick = reader.ReadInt64(); return(new PinSizeHistory(clock, pinHistoryBuffer, timeStampInTick, directoryPath)); } } } catch (IOException) { return(new PinSizeHistory( clock, newCapacity.HasValue ? PinHistoryBuffer.Create(newCapacity.Value) : PinHistoryBuffer.Create(), clock.UtcNow.Ticks, directoryPath)); } }