public StorageFragment(IDualBinaryStore store) { bool isFragmented; _tableOfContent = Store.TableOfContent.From(store.Right, out isFragmented); _maintenance = new StorageMaintenance(this, this) { IsFragmented = isFragmented }; _store = store.Left; _tableOfContentStore = store.Right; }
public static TableOfContent From(IBinaryStore store, out bool isFragmented) { var entries = new Dictionary<IKey, Entry>(); if (store.IsEmpty) { isFragmented = false; return new TableOfContent(store, entries); } var entryReader = new EntryReader(store); Entry entry; while (entryReader.TryGetNext(out entry)) entries.Add(entry.Key, entry); isFragmented = entryReader.IsFragmented; return new TableOfContent(store, entries); }
public static TableOfContent From(IBinaryStore store) { bool isFragmented; return From(store, out isFragmented); }
public TableOfContent(IBinaryStore store, IDictionary<IKey, Entry> entries) { _entries = new ConcurrentDictionary<IKey, Entry>(entries); _store = store; _entryWriter = new EntryWriter(store); }
public EntryWriter(IBinaryStore store) { _store = store; _converter = EntryBinaryConverter.Instance; }
public DualBinaryStore(IStreamProvider provider, long start, long maxLength) { if (provider == null) throw new ArgumentNullException("provider"); if (start < 0) throw new ArgumentException("start parameter must have a value equal or greater than 0"); if (maxLength <= 0) throw new ArgumentException("maxLength parameter must have a value greater than 0"); _provider = provider; _start = start; _maxLength = maxLength; _writeHeaderStream = provider.AcquireWriteStream(); _writeLeftStream = provider.AcquireWriteStream(); _writeRightStream = provider.AcquireWriteStream(); _writeHeaderStream.Seek(start, SeekOrigin.Begin); if (_writeHeaderStream.Length > start) { using (var readStream = _provider.AcquireReadStream()) { readStream.Seek(start, SeekOrigin.Begin); var headerBuffer = new byte[16]; readStream.Read(headerBuffer, 0, headerBuffer.Length); _leftOffset = BitConverter.ToInt64(headerBuffer, 0); _rightOffset = BitConverter.ToInt64(headerBuffer, 8); // If the buffer was not generated by the store if (_leftOffset <= 0) _leftOffset = 16; if (_rightOffset <= 0) _rightOffset = maxLength; } _writeLeftStream.Seek(start + _leftOffset, SeekOrigin.Begin); _writeRightStream.Seek(start + _rightOffset, SeekOrigin.Begin); } else { _leftOffset = 16; _rightOffset = maxLength; var headerBuffer = BitConverter.GetBytes(_leftOffset); _writeHeaderStream.Write(headerBuffer, 0, headerBuffer.Length); headerBuffer = BitConverter.GetBytes(_rightOffset); _writeHeaderStream.Write(headerBuffer, 0, headerBuffer.Length); _writeHeaderStream.Seek(-16, SeekOrigin.Current); _writeRightStream.Seek(start + _leftOffset, SeekOrigin.Begin); var buffer = new byte[maxLength - _leftOffset]; _writeRightStream.Write(buffer, 0, buffer.Length); _writeLeftStream.Seek(start + _leftOffset, SeekOrigin.Begin); } _lastFlushedLeftOffset = _leftOffset; _lastFlushedRightOffset = _rightOffset; _left = new LeftBinaryStoreSegment(this); _right = new RightBinaryStoreSegment(this); }
public EntryReader(IBinaryStore store) { _data = store.ReadAll(out _start); _converter = EntryBinaryConverter.Instance; }