package jelectrum; import org.mapdb.DBMaker; import org.mapdb.DB; import java.io.File; import java.util.Map; import java.util.HashSet; import java.text.DecimalFormat; import com.google.bitcoin.core.Sha256Hash; import com.google.bitcoin.core.Transaction; import com.google.bitcoin.core.StoredBlock; import com.google.bitcoin.core.Block; import java.util.concurrent.locks.ReentrantReadWriteLock; public class JelectrumDBMapDB extends JelectrumDB { private volatile DB db; ReentrantReadWriteLock hunch_lock; public JelectrumDBMapDB(Config conf) { super(conf); hunch_lock = new ReentrantReadWriteLock(true); openDb(); } private void openDb() { String path = conf.get("db_path"); db = DBMaker.newFileDB(new File(path + "/jelectrum")) .closeOnJvmShutdown() //.checksumEnable() //.compressionEnable() //.transactionDisable() //.mmapFileEnable() .make(); //tx_map = db.getHashMap("tx_map"); tx_map = new FragMap<Sha256Hash, SerializedTransaction>(db, "tx_map", 64); //address_to_tx_map = db.getHashMap("address_to_tx_map"); address_to_tx_map = new FragMap<String, HashSet<Sha256Hash> >(db, "address_to_tx_map", 64); block_store_map = db.getHashMap("block_store_map"); special_block_store_map = db.getHashMap("special_block_store_map"); block_map = db.getHashMap("block_map"); //tx_to_block_map = db.getHashMap("tx_to_block_map"); tx_to_block_map = new FragMap<Sha256Hash, HashSet<Sha256Hash> >(db, "tx_to_block_map", 64); //db.compact(); //System.out.println("Blocks: " + block_map.size()); //System.out.println("Transactions: " + tx_map.size()); //System.out.println("Addresses: " + address_to_tx_map.size()); } public void compact() { long t1 = System.currentTimeMillis(); System.out.println("Compact called"); db.compact(); long t2 = System.currentTimeMillis(); double sec = (t2 - t1) / 1000.0; DecimalFormat df = new DecimalFormat("0.000"); System.out.println("Compact completed in " + df.format(sec) + " seconds"); } public void commit() { long t1 = System.currentTimeMillis(); System.out.println("Commit called"); hunch_lock.writeLock().lock(); System.out.println("Commit has lock"); db.commit(); System.out.println("Reopening DB"); db.close(); openDb(); try { Thread.sleep(5000); } catch(Exception e){throw new RuntimeException(e);} hunch_lock.writeLock().unlock(); long t2 = System.currentTimeMillis(); double sec = (t2 - t1) / 1000.0; DecimalFormat df = new DecimalFormat("0.000"); System.out.println("Commit completed in " + df.format(sec) + " seconds"); } public void close() { db.close(); } public Map<Sha256Hash, StoredBlock> getBlockStoreMap() { return block_store_map; } public Map<String, StoredBlock> getSpecialBlockStoreMap() { return special_block_store_map; } public Map<Sha256Hash,SerializedTransaction> getTransactionMap() { return tx_map; } public Map<Sha256Hash, SerializedBlock> getBlockMap() { return block_map; } public Map<String, HashSet<Sha256Hash> > getAddressToTxMap() { return address_to_tx_map; } public Map<Sha256Hash, HashSet<Sha256Hash> > getTxToBlockMap() { return tx_to_block_map; } }