package jelectrum; import java.util.Map; import java.util.HashSet; import java.util.Set; import java.util.Collection; import java.util.LinkedList; import com.google.bitcoin.core.Sha256Hash; import com.google.bitcoin.core.Transaction; import com.google.bitcoin.core.StoredBlock; import com.google.bitcoin.core.Block; public class JelectrumDBSQL extends JelectrumDB { private Config conf; protected SqlMapSet<String> address_to_tx_map; protected SqlMapSet<Sha256Hash> tx_to_block_map; protected boolean compress=false; public JelectrumDBSQL(Config config) throws Exception { super(config); config.require("sql_db_driver"); config.require("sql_db_uri"); config.require("sql_db_username"); config.require("sql_db_password"); config.require("sql_db_conns"); DB.openConnectionPool( "jelectrum_db", config.get("sql_db_driver"), config.get("sql_db_uri"), config.get("sql_db_username"), config.get("sql_db_password"), config.getInt("sql_db_conns"), 16); this.conf = config; open(); } public synchronized void open() { try { //tx_map = new BandingMap<Sha256Hash, SerializedTransaction>(new SqlMap<Sha256Hash, SerializedTransaction>("tx_map", 64),100); tx_map = new SqlMap<Sha256Hash, SerializedTransaction>("tx_map", 64); block_store_map = new CacheMap<Sha256Hash, StoredBlock>(25000,new SqlMap<Sha256Hash, StoredBlock>("block_store_map",64)); special_block_store_map = new SqlMap<String, StoredBlock>("special_block_store_map",128); block_map = new CacheMap<Sha256Hash, SerializedBlock>(240,new SqlMap<Sha256Hash, SerializedBlock>("block_map",64)); block_rescan_map = new SqlMap<Sha256Hash, String>("block_rescan_map",64); special_object_map = new SqlMap<String, Object>("special_object_map",128); header_chunk_map = new CacheMap<Integer, String>(200, new SqlMap<Integer, String>("header_chunk_map",32)); utxo_trie_map = new CacheMap<String, UtxoTrieNode>(10000, new SqlMap<String, UtxoTrieNode>("utxo_trie_map",56*2)); //address_to_tx_map = new BandingMapSet<String, Sha256Hash>(new SqlMapSet<String>("address_to_tx_map",35),10); //tx_to_block_map = new BandingMapSet<Sha256Hash, Sha256Hash>(new SqlMapSet<Sha256Hash>("tx_to_block_map",64),10); //txout_spent_by_map = new BandingMapSet<String, Sha256Hash>(new SqlMapSet<String>("txout_spent_by_map",128),10); address_to_tx_map = new SqlMapSet<String>("address_to_tx_map",35); tx_to_block_map = new SqlMapSet<Sha256Hash>("tx_to_block_map",64); } catch(Exception e) { throw new RuntimeException(e); } } public synchronized Map<Sha256Hash, StoredBlock> getBlockStoreMap() { return block_store_map; } public synchronized Map<String, StoredBlock> getSpecialBlockStoreMap() { return special_block_store_map; } public synchronized Map<Sha256Hash,SerializedTransaction> getTransactionMap() { return tx_map; } public synchronized Map<Sha256Hash, SerializedBlock> getBlockMap() { return block_map; } private synchronized MapSet<String,Sha256Hash> getAddressToTxMap() { return address_to_tx_map; } public void addAddressToTxMap(String address, Sha256Hash hash) { getAddressToTxMap().add(address, hash); } @Override public void addAddressesToTxMap(Collection<Map.Entry<String, Sha256Hash> > lst) { address_to_tx_map.addAll(lst); } public Set<Sha256Hash> getAddressToTxSet(String address) { return getAddressToTxMap().getSet(address); } private synchronized MapSet<Sha256Hash,Sha256Hash> getTxToBlockMap() { return tx_to_block_map; } public void addTxToBlockMap(Sha256Hash tx, Sha256Hash block) { getTxToBlockMap().add(tx, block); } @Override public void addTxsToBlockMap(Collection<Map.Entry<Sha256Hash, Sha256Hash> > in_lst) { /*LinkedList<Map.Entry<String, Sha256Hash> > lst = new LinkedList<Map.Entry<String, Sha256Hash> >(); for(Map.Entry<Sha256Hash, Sha256Hash> me : in_lst) { lst.add(new java.util.AbstractMap.SimpleEntry<String,Sha256Hash>(me.getKey().toString(), me.getValue())); }*/ tx_to_block_map.addAll(in_lst); } public Set<Sha256Hash> getTxToBlockMap(Sha256Hash tx) { return getTxToBlockMap().getSet(tx); } public synchronized Map<Sha256Hash, String> getBlockRescanMap() { return block_rescan_map; } public synchronized Map<String, Object> getSpecialObjectMap() { return special_object_map; } public synchronized Map<Integer, String> getHeaderChunkMap() { return header_chunk_map; } }