package com.codecademy.eventhub.base; import com.google.common.collect.Lists; import org.iq80.leveldb.DBIterator; import java.io.IOException; import java.util.List; import static org.fusesource.leveldbjni.JniDBFactory.asString; import static org.fusesource.leveldbjni.JniDBFactory.bytes; public class DB { private final org.iq80.leveldb.DB db; public DB(org.iq80.leveldb.DB db) { this.db = db; } public List<String> findByPrefix(String prefix, int substringStartsAt) { try (DBIterator iterator = db.iterator()) { List<String> keys = Lists.newArrayList(); for (iterator.seek(bytes(prefix)); iterator.hasNext(); iterator.next()) { String key = asString(iterator.peekNext().getKey()); if (!key.startsWith(prefix)) { break; } keys.add(key.substring(substringStartsAt)); } return keys; } catch (IOException e) { throw new RuntimeException(e); } } public void put(String key, String value) { db.put(bytes(key), bytes(value)); } public void put(String key, int value) { db.put(bytes(key), bytes(String.valueOf(value))); } public String get(String key) { byte[] bytes = db.get(bytes(key)); //noinspection ReturnOfNull return (bytes == null ? null : asString(bytes)); } public void close() throws IOException { db.close(); } public void put(AtomicWrite atomicWrite) { org.iq80.leveldb.WriteBatch origWriteBatch = db.createWriteBatch(); WriteBatch writeBatch = new WriteBatch(origWriteBatch); atomicWrite.write(writeBatch); db.write(origWriteBatch); } public interface AtomicWrite { public void write(WriteBatch writeBatch); } public static class WriteBatch { private final org.iq80.leveldb.WriteBatch writeBatch; private WriteBatch(org.iq80.leveldb.WriteBatch writeBatch) { this.writeBatch = writeBatch; } public void put(String key, byte[] value) { writeBatch.put(bytes(key), value); } } }