use of org.iq80.leveldb.DB in project cdap by caskdata.
the class LevelDBTableCore method undo.
public void undo(Map<byte[], ? extends Map<byte[], ?>> persisted, long version) throws IOException {
if (persisted.isEmpty()) {
return;
}
DB db = getDB();
WriteBatch batch = db.createWriteBatch();
for (Map.Entry<byte[], ? extends Map<byte[], ?>> row : persisted.entrySet()) {
for (Map.Entry<byte[], ?> column : row.getValue().entrySet()) {
byte[] key = createPutKey(row.getKey(), column.getKey(), version);
batch.delete(key);
}
}
db.write(batch, service.getWriteOptions());
}
use of org.iq80.leveldb.DB in project cdap by caskdata.
the class LevelDBTableService method dropTable.
public void dropTable(String name) throws IOException {
DB db = tables.remove(name);
if (db != null) {
db.close();
}
String dbPath = getDBPath(basePath, name);
factory.destroy(new File(dbPath), new Options());
}
use of org.iq80.leveldb.DB in project cdap by caskdata.
the class LevelDBTableService method openTable.
private DB openTable(String tableName) throws IOException {
String dbPath = getDBPath(basePath, tableName);
Options options = new Options();
options.createIfMissing(false);
options.errorIfExists(false);
options.comparator(new KeyValueDBComparator());
options.blockSize(blockSize);
options.cacheSize(cacheSize);
// unfortunately, with the java version of leveldb, with createIfMissing set to false, factory.open will
// see that there is no table and throw an exception, but it wont clean up after itself and will leave a
// directory there with a lock. So we want to avoid calling open if the path doesn't already exist and
// throw the exception ourselves.
File dbDir = new File(dbPath);
if (!dbDir.exists()) {
throw new IOException("Database " + dbPath + " does not exist and the create if missing option is disabled");
}
DB db = factory.open(dbDir, options);
tables.put(tableName, db);
return db;
}
use of org.iq80.leveldb.DB in project cdap by caskdata.
the class LevelDBTableCore method deleteRows.
/**
* Delete a list of rows from the table entirely, disregarding transactions.
* @param toDelete the row keys to delete
*/
public void deleteRows(Collection<byte[]> toDelete) throws IOException {
if (toDelete.isEmpty()) {
return;
}
// find first row to delete and first entry in the DB to examine
Iterator<byte[]> rows = toDelete.iterator();
byte[] currentRow = rows.next();
byte[] startKey = createStartKey(currentRow);
DB db = getDB();
WriteBatch batch = db.createWriteBatch();
try (DBIterator iterator = db.iterator()) {
iterator.seek(startKey);
if (!iterator.hasNext()) {
// nothing in the db to delete
return;
}
Map.Entry<byte[], byte[]> entry = iterator.next();
// iterate over the database and the rows to delete, collecting (raw) keys to delete
while (entry != null && currentRow != null) {
KeyValue kv = KeyValue.fromKey(entry.getKey());
int comp = Bytes.compareTo(kv.getRow(), currentRow);
if (comp == 0) {
// same row -> delete
batch.delete(entry.getKey());
entry = iterator.hasNext() ? iterator.next() : null;
} else if (comp > 0) {
// read past current row -> move to next row
currentRow = rows.hasNext() ? rows.next() : null;
} else if (comp < 0) {
// iterator must seek to current row
iterator.seek(createStartKey(currentRow));
entry = iterator.hasNext() ? iterator.next() : null;
}
}
}
// delete all the entries that were found
db.write(batch, getWriteOptions());
}
use of org.iq80.leveldb.DB in project cdap by caskdata.
the class LevelDBTableCore method persist.
public void persist(Map<byte[], ? extends Map<byte[], byte[]>> changes, long version) throws IOException {
DB db = getDB();
// todo support writing null when no transaction
WriteBatch batch = db.createWriteBatch();
for (Map.Entry<byte[], ? extends Map<byte[], byte[]>> row : changes.entrySet()) {
for (Map.Entry<byte[], byte[]> column : row.getValue().entrySet()) {
byte[] key = createPutKey(row.getKey(), column.getKey(), version);
batch.put(key, column.getValue() == null ? DELETE_MARKER : column.getValue());
}
}
db.write(batch, service.getWriteOptions());
}
Aggregations