1 // Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
2 package org.rocksdb;
3 
4 /**
5  * <p>A TransactionLogIterator is used to iterate over the transactions in a db.
6  * One run of the iterator is continuous, i.e. the iterator will stop at the
7  * beginning of any gap in sequences.</p>
8  */
9 public class TransactionLogIterator extends RocksObject {
10 
11   /**
12    * <p>An iterator is either positioned at a WriteBatch
13    * or not valid. This method returns true if the iterator
14    * is valid. Can read data from a valid iterator.</p>
15    *
16    * @return true if iterator position is valid.
17    */
isValid()18   public boolean isValid() {
19     return isValid(nativeHandle_);
20   }
21 
22   /**
23    * <p>Moves the iterator to the next WriteBatch.
24    * <strong>REQUIRES</strong>: Valid() to be true.</p>
25    */
next()26   public void next() {
27     next(nativeHandle_);
28   }
29 
30   /**
31    * <p>Throws RocksDBException if something went wrong.</p>
32    *
33    * @throws org.rocksdb.RocksDBException if something went
34    *     wrong in the underlying C++ code.
35    */
status()36   public void status() throws RocksDBException {
37     status(nativeHandle_);
38   }
39 
40   /**
41    * <p>If iterator position is valid, return the current
42    * write_batch and the sequence number of the earliest
43    * transaction contained in the batch.</p>
44    *
45    * <p>ONLY use if Valid() is true and status() is OK.</p>
46    *
47    * @return {@link org.rocksdb.TransactionLogIterator.BatchResult}
48    *     instance.
49    */
getBatch()50   public BatchResult getBatch() {
51     assert(isValid());
52     return getBatch(nativeHandle_);
53   }
54 
55   /**
56    * <p>TransactionLogIterator constructor.</p>
57    *
58    * @param nativeHandle address to native address.
59    */
TransactionLogIterator(final long nativeHandle)60   TransactionLogIterator(final long nativeHandle) {
61     super(nativeHandle);
62   }
63 
64   /**
65    * <p>BatchResult represents a data structure returned
66    * by a TransactionLogIterator containing a sequence
67    * number and a {@link WriteBatch} instance.</p>
68    */
69   public static final class BatchResult {
70     /**
71      * <p>Constructor of BatchResult class.</p>
72      *
73      * @param sequenceNumber related to this BatchResult instance.
74      * @param nativeHandle to {@link org.rocksdb.WriteBatch}
75      *     native instance.
76      */
BatchResult(final long sequenceNumber, final long nativeHandle)77     public BatchResult(final long sequenceNumber,
78         final long nativeHandle) {
79       sequenceNumber_ = sequenceNumber;
80       writeBatch_ = new WriteBatch(nativeHandle, true);
81     }
82 
83     /**
84      * <p>Return sequence number related to this BatchResult.</p>
85      *
86      * @return Sequence number.
87      */
sequenceNumber()88     public long sequenceNumber() {
89       return sequenceNumber_;
90     }
91 
92     /**
93      * <p>Return contained {@link org.rocksdb.WriteBatch}
94      * instance</p>
95      *
96      * @return {@link org.rocksdb.WriteBatch} instance.
97      */
writeBatch()98     public WriteBatch writeBatch() {
99       return writeBatch_;
100     }
101 
102     private final long sequenceNumber_;
103     private final WriteBatch writeBatch_;
104   }
105 
disposeInternal(final long handle)106   @Override protected final native void disposeInternal(final long handle);
isValid(long handle)107   private native boolean isValid(long handle);
next(long handle)108   private native void next(long handle);
status(long handle)109   private native void status(long handle)
110       throws RocksDBException;
getBatch(long handle)111   private native BatchResult getBatch(long handle);
112 }
113