예제 #1
0
        /// <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;
        }
예제 #2
0
        /// <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));
            }
        }