public IEnumerable <TKey> GetReverseEnumerator() { long prevProtectionCounter = 0; var prevModificationCounter = 0; var pos = long.MaxValue; while (true) { if (pos == long.MaxValue) { prevModificationCounter = _modificationCounter; if (!_keyValueTr.FindLastKey(_prefix)) { break; } pos = _keyValueTr.GetKeyIndex(); } else { if (_keyValueTr.CursorMovedCounter != prevProtectionCounter) { if (prevModificationCounter != _modificationCounter) { ThrowModifiedDuringEnum(); } if (!_keyValueTr.SetKeyIndex(_prefix, pos)) { break; } } else { if (!_keyValueTr.FindPreviousKey(_prefix)) { break; } } } prevProtectionCounter = _keyValueTr.CursorMovedCounter; var key = CurrentToKey(); yield return(key); pos--; } }
public IEnumerable <KeyValuePair <TKey, TValue> > GetReverseEnumerator() { long prevProtectionCounter = 0; var prevModificationCounter = 0; var pos = long.MaxValue; while (true) { _keyValueTrProtector.Start(); if (pos == long.MaxValue) { prevModificationCounter = _modificationCounter; _keyValueTr.SetKeyPrefix(_prefix); if (!_keyValueTr.FindLastKey()) { break; } pos = _keyValueTr.GetKeyIndex(); } else { if (_keyValueTrProtector.WasInterupted(prevProtectionCounter)) { if (prevModificationCounter != _modificationCounter) { ThrowModifiedDuringEnum(); } _keyValueTr.SetKeyPrefix(_prefix); if (!_keyValueTr.SetKeyIndex(pos)) { break; } } else { if (!_keyValueTr.FindPreviousKey()) { break; } } } prevProtectionCounter = _keyValueTrProtector.ProtectionCounter; var keyBytes = _keyValueTr.GetKeyAsByteArray(); var valueBytes = _keyValueTr.GetValueAsByteArray(); var key = ByteArrayToKey(keyBytes); var value = ByteArrayToValue(valueBytes); yield return(new KeyValuePair <TKey, TValue>(key, value)); pos--; } }
internal static ByteBuffer FindLastKeyWithPrefix(ByteBuffer keyBytes, ByteBuffer endKeyBytes, IKeyValueDBTransaction keyValueTr, KeyValueDBTransactionProtector keyValueTrProtector) { var buffer = ByteBuffer.NewEmpty(); buffer = buffer.ResizingAppend(keyBytes).ResizingAppend(endKeyBytes); keyValueTrProtector.Start(); keyValueTr.SetKeyPrefix(buffer); if (!keyValueTr.FindLastKey()) { return(endKeyBytes); } var key = keyValueTr.GetKeyIncludingPrefix(); return(key.Slice(keyBytes.Length)); }
public AdvancedEnumerator(ODBSet <TKey> owner, AdvancedEnumeratorParam <TKey> param) { _owner = owner; _keyValueTr = _owner._keyValueTr; _ascending = param.Order == EnumerationOrder.Ascending; _prevModificationCounter = _owner._modificationCounter; _prevProtectionCounter = _keyValueTr.CursorMovedCounter; _keyValueTr.FindFirstKey(_owner._prefix); var prefixIndex = _keyValueTr.GetKeyIndex(); long startIndex; long endIndex; if (param.EndProposition == KeyProposition.Ignored) { _keyValueTr.FindLastKey(_owner._prefix); endIndex = _keyValueTr.GetKeyIndex() - prefixIndex - 1; } else { var keyBytes = _owner.KeyToByteArray(param.End); switch (_keyValueTr.Find(keyBytes, (uint)_owner._prefix.Length)) { case FindResult.Exact: endIndex = _keyValueTr.GetKeyIndex() - prefixIndex; if (param.EndProposition == KeyProposition.Excluded) { endIndex--; } break; case FindResult.Previous: endIndex = _keyValueTr.GetKeyIndex() - prefixIndex; break; case FindResult.Next: endIndex = _keyValueTr.GetKeyIndex() - prefixIndex - 1; break; case FindResult.NotFound: endIndex = -1; break; default: throw new ArgumentOutOfRangeException(); } } if (param.StartProposition == KeyProposition.Ignored) { startIndex = 0; } else { var keyBytes = _owner.KeyToByteArray(param.Start); switch (_keyValueTr.Find(keyBytes, (uint)_owner._prefix.Length)) { case FindResult.Exact: startIndex = _keyValueTr.GetKeyIndex() - prefixIndex; if (param.StartProposition == KeyProposition.Excluded) { startIndex++; } break; case FindResult.Previous: startIndex = _keyValueTr.GetKeyIndex() - prefixIndex + 1; break; case FindResult.Next: startIndex = _keyValueTr.GetKeyIndex() - prefixIndex; break; case FindResult.NotFound: startIndex = 0; break; default: throw new ArgumentOutOfRangeException(); } } _count = (uint)Math.Max(0, endIndex - startIndex + 1); _startPos = (uint)(_ascending ? startIndex : endIndex); _pos = 0; _seekState = SeekState.Undefined; }
public bool FindLastKey() { LogSimpleOperation(KVReplayOperation.FindLastKey); return(_tr.FindLastKey()); }
public bool FindLastKey() { return(_keyValueDBTransaction.FindLastKey()); }