| | |
| | | |
| | | private final class CursorImpl implements Cursor { |
| | | private final Exchange ex; |
| | | private boolean useCurrentKeyForNext = false; |
| | | private ByteString currentKey; |
| | | private ByteString currentValue; |
| | | |
| | |
| | | bytesToKey(ex.getKey(), key); |
| | | try { |
| | | ex.fetch(); |
| | | useCurrentKeyForNext = ex.getValue().isDefined(); |
| | | return useCurrentKeyForNext; |
| | | return ex.getValue().isDefined(); |
| | | } catch (PersistitException e) { |
| | | useCurrentKeyForNext = false; |
| | | throw new StorageRuntimeException(e); |
| | | } |
| | | } |
| | |
| | | bytesToKey(ex.getKey(), key); |
| | | try { |
| | | ex.fetch(); |
| | | if (ex.getValue().isDefined()) { |
| | | useCurrentKeyForNext = true; |
| | | } else { |
| | | // provided key does not exist, look for next key |
| | | useCurrentKeyForNext = ex.next(); |
| | | } |
| | | return useCurrentKeyForNext; |
| | | return ex.getValue().isDefined() || ex.next(); |
| | | } catch (PersistitException e) { |
| | | useCurrentKeyForNext = false; |
| | | throw new StorageRuntimeException(e); |
| | | } |
| | | } |
| | |
| | | try { |
| | | clearCurrentKeyAndValue(); |
| | | ex.getKey().to(Key.AFTER); |
| | | useCurrentKeyForNext = ex.previous() && ex.getValue().isDefined(); |
| | | return useCurrentKeyForNext; |
| | | return ex.previous(); |
| | | } catch (PersistitException e) { |
| | | useCurrentKeyForNext = false; |
| | | throw new StorageRuntimeException(e); |
| | | } |
| | | } |
| | |
| | | @Override |
| | | public boolean next() { |
| | | clearCurrentKeyAndValue(); |
| | | if (useCurrentKeyForNext) { |
| | | useCurrentKeyForNext = false; |
| | | return true; |
| | | } |
| | | try { |
| | | return ex.next(); |
| | | } catch (PersistitException e) { |