package ezdb.rocksdb; import java.io.IOException; import org.rocksdb.FlushOptions; import org.rocksdb.RocksDB; import org.rocksdb.RocksDBException; import org.rocksdb.WriteBatch; import org.rocksdb.WriteOptions; import ezdb.DbException; import ezdb.batch.RangeBatch; import ezdb.serde.Serde; import ezdb.util.Util; public class EzRocksDbBatch<H, R, V> implements RangeBatch<H, R, V> { private final RocksDB db; private final WriteBatch writeBatch; private Serde<H> hashKeySerde; private Serde<R> rangeKeySerde; private Serde<V> valueSerde; private WriteOptions writeOptions; public EzRocksDbBatch(RocksDB db, Serde<H> hashKeySerde, Serde<R> rangeKeySerde, Serde<V> valueSerde) { this.writeOptions = new WriteOptions(); this.db = db; this.writeBatch = new WriteBatch(); this.hashKeySerde = hashKeySerde; this.rangeKeySerde = rangeKeySerde; this.valueSerde = valueSerde; } @Override public void put(H hashKey, V value) { put(hashKey, null, value); } @Override public void delete(H hashKey) { delete(hashKey, null); } @Override public void flush() { try { db.write(writeOptions, writeBatch); } catch (RocksDBException e) { throw new DbException(e); } } @Override public void close() throws IOException { writeBatch.dispose(); writeOptions.dispose(); } @Override public void put(H hashKey, R rangeKey, V value) { writeBatch.put( Util.combine(hashKeySerde, rangeKeySerde, hashKey, rangeKey), valueSerde.toBytes(value)); } @Override public void delete(H hashKey, R rangeKey) { writeBatch.remove(Util.combine(hashKeySerde, rangeKeySerde, hashKey, rangeKey)); } }