コード例 #1
0
ファイル: StorageFragment.cs プロジェクト: jaygumji/EnigmaDb
 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;
 }
コード例 #2
0
ファイル: TableOfContent.cs プロジェクト: jaygumji/EnigmaDb
        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);
        }
コード例 #3
0
ファイル: TableOfContent.cs プロジェクト: jaygumji/EnigmaDb
 public static TableOfContent From(IBinaryStore store)
 {
     bool isFragmented;
     return From(store, out isFragmented);
 }
コード例 #4
0
ファイル: TableOfContent.cs プロジェクト: jaygumji/EnigmaDb
 public TableOfContent(IBinaryStore store, IDictionary<IKey, Entry> entries)
 {
     _entries = new ConcurrentDictionary<IKey, Entry>(entries);
     _store = store;
     _entryWriter = new EntryWriter(store);
 }
コード例 #5
0
ファイル: EntryWriter.cs プロジェクト: jaygumji/EnigmaDb
 public EntryWriter(IBinaryStore store)
 {
     _store = store;
     _converter = EntryBinaryConverter.Instance;
 }
コード例 #6
0
ファイル: DualBinaryStore.cs プロジェクト: jaygumji/EnigmaDb
        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);
        }
コード例 #7
0
ファイル: EntryReader.cs プロジェクト: jaygumji/EnigmaDb
 public EntryReader(IBinaryStore store)
 {
     _data = store.ReadAll(out _start);
     _converter = EntryBinaryConverter.Instance;
 }