DataBases changes tracker introduced
+ TrackDatabase object wraps the Database and support commit/rollback
This commit is contained in:
parent
33af300619
commit
333849dac0
|
@ -0,0 +1,45 @@
|
||||||
|
package org.ethereum.db;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* www.ethereumJ.com
|
||||||
|
*
|
||||||
|
* @author: Roman Mandeleil
|
||||||
|
* Created on: 11/06/2014 15:02
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ByteArrayWrapper {
|
||||||
|
|
||||||
|
private final byte[] data;
|
||||||
|
|
||||||
|
public ByteArrayWrapper(byte[] data)
|
||||||
|
{
|
||||||
|
if (data == null)
|
||||||
|
{
|
||||||
|
throw new NullPointerException();
|
||||||
|
}
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object other)
|
||||||
|
{
|
||||||
|
if (!(other instanceof ByteArrayWrapper))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return Arrays.equals(data, ((ByteArrayWrapper)other).data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
return Arrays.hashCode(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public byte[] getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
package org.ethereum.db;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* www.ethereumJ.com
|
||||||
|
*
|
||||||
|
* @author: Roman Mandeleil
|
||||||
|
* Created on: 11/06/2014 14:09
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class TrackDatabase {
|
||||||
|
|
||||||
|
private Database db;
|
||||||
|
|
||||||
|
private boolean trackingChanges;
|
||||||
|
private Map<ByteArrayWrapper, byte[]> changes;
|
||||||
|
private Map<ByteArrayWrapper, byte[]> deletes;
|
||||||
|
|
||||||
|
public TrackDatabase(Database db) {
|
||||||
|
this.db = db;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void startTrack(){
|
||||||
|
changes = new HashMap<>();
|
||||||
|
deletes = new HashMap<>();
|
||||||
|
trackingChanges = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void commitTrack(){
|
||||||
|
for(ByteArrayWrapper key : changes.keySet()){
|
||||||
|
db.put(key.getData(), changes.get(key));
|
||||||
|
}
|
||||||
|
changes = null;
|
||||||
|
trackingChanges = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rollbackTrack(){
|
||||||
|
changes = new HashMap<>();
|
||||||
|
deletes = new HashMap<>();
|
||||||
|
changes = null;
|
||||||
|
trackingChanges = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void put(byte[] key, byte[] value) {
|
||||||
|
if (trackingChanges){
|
||||||
|
changes.put( new ByteArrayWrapper(key) , value);
|
||||||
|
} else {
|
||||||
|
db.put(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] get(byte[] key) {
|
||||||
|
if(trackingChanges){
|
||||||
|
ByteArrayWrapper wKey = new ByteArrayWrapper(key);
|
||||||
|
if (deletes.get(wKey) != null) return null;
|
||||||
|
if (changes.get(wKey) != null) return changes.get(wKey);
|
||||||
|
return db.get(key);
|
||||||
|
}
|
||||||
|
return db.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Delete object (key) from db **/
|
||||||
|
public void delete(byte[] key) {
|
||||||
|
if (trackingChanges){
|
||||||
|
ByteArrayWrapper wKey = new ByteArrayWrapper(key);
|
||||||
|
deletes.put(wKey, null);
|
||||||
|
} else {
|
||||||
|
db.delete(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue