from Queue import Queue
import time, threading
+
+SQL_LIMIT=200
+
class AbeStore(Datastore_class):
def __init__(self, config):
for row in inrows:
_hash = self.binout(row[6])
if not _hash:
- print "WARNING: missing tx_in for tx", txid
+ #print "WARNING: missing tx_in for tx", txid
continue
address = hash_to_address(chr(0), _hash)
for row in outrows:
_hash = self.binout(row[6])
if not _hash:
- print "WARNING: missing tx_out for tx", txid
+ #print "WARNING: missing tx_out for tx", txid
continue
address = hash_to_address(chr(0), _hash)
self.address_queue.put(address)
def safe_sql(self,sql, params=(), lock=True):
+
+ error = False
try:
if lock: self.dblock.acquire()
ret = self.selectall(sql,params)
except:
- print "sql error", sql
- ret = []
+ error = True
finally:
if lock: self.dblock.release()
+ if error:
+ raise BaseException('sql error')
+
return ret
ORDER BY txin.txin_pos
"""%(tx_id,), (), lock)
+
def get_address_out_rows(self, dbhash):
- return self.safe_sql(""" SELECT
+ out = self.safe_sql(""" SELECT
b.block_nTime,
cc.chain_id,
b.block_height,
JOIN txout prevout ON (txin.txout_id = prevout.txout_id)
JOIN pubkey ON (pubkey.pubkey_id = prevout.pubkey_id)
WHERE pubkey.pubkey_hash = ?
- AND cc.in_longest = 1""", (dbhash,))
+ AND cc.in_longest = 1
+ LIMIT ? """, (dbhash,SQL_LIMIT))
+
+ if len(out)==SQL_LIMIT:
+ raise BaseException('limit reached')
+ return out
def get_address_out_rows_memorypool(self, dbhash):
- return self.safe_sql(""" SELECT
+ out = self.safe_sql(""" SELECT
1,
tx.tx_hash,
tx.tx_id,
JOIN txin ON (txin.tx_id = tx.tx_id)
JOIN txout prevout ON (txin.txout_id = prevout.txout_id)
JOIN pubkey ON (pubkey.pubkey_id = prevout.pubkey_id)
- WHERE pubkey.pubkey_hash = ? """, (dbhash,))
+ WHERE pubkey.pubkey_hash = ?
+ LIMIT ? """, (dbhash,SQL_LIMIT))
+
+ if len(out)==SQL_LIMIT:
+ raise BaseException('limit reached')
+ return out
def get_address_in_rows(self, dbhash):
- return self.safe_sql(""" SELECT
+ out = self.safe_sql(""" SELECT
b.block_nTime,
cc.chain_id,
b.block_height,
JOIN txout ON (txout.tx_id = tx.tx_id)
JOIN pubkey ON (pubkey.pubkey_id = txout.pubkey_id)
WHERE pubkey.pubkey_hash = ?
- AND cc.in_longest = 1""", (dbhash,))
+ AND cc.in_longest = 1
+ LIMIT ? """, (dbhash,SQL_LIMIT))
+
+ if len(out)==SQL_LIMIT:
+ raise BaseException('limit reached')
+ return out
def get_address_in_rows_memorypool(self, dbhash):
- return self.safe_sql( """ SELECT
+ out = self.safe_sql( """ SELECT
0,
tx.tx_hash,
tx.tx_id,
FROM tx
JOIN txout ON (txout.tx_id = tx.tx_id)
JOIN pubkey ON (pubkey.pubkey_id = txout.pubkey_id)
- WHERE pubkey.pubkey_hash = ? """, (dbhash,))
+ WHERE pubkey.pubkey_hash = ?
+ LIMIT ? """, (dbhash,SQL_LIMIT))
+
+ if len(out)==SQL_LIMIT:
+ raise BaseException('limit reached')
+ return out
def get_history(self, addr):
for row in inrows:
_hash = self.binout(row[6])
if not _hash:
- print "WARNING: missing tx_in for tx", tx_id, addr
+ #print "WARNING: missing tx_in for tx", tx_id, addr
continue
address = hash_to_address(chr(0), _hash)
txinputs.append(address)
for row in outrows:
_hash = self.binout(row[6])
if not _hash:
- print "WARNING: missing tx_out for tx", tx_id, addr
+ #print "WARNING: missing tx_out for tx", tx_id, addr
continue
address = hash_to_address(chr(0), _hash)
txoutputs.append(address)
message_id = request['id']
method = request['method']
params = request.get('params',[])
- result = ''
+ result = None
+ error = None
+
if method == 'blockchain.numblocks.subscribe':
result = self.block_number
+
elif method == 'blockchain.address.subscribe':
- address = params[0]
- self.watch_address(address)
- status = self.store.get_status(address)
- result = status
+ try:
+ address = params[0]
+ result = self.store.get_status(address)
+ self.watch_address(address)
+ except BaseException, e:
+ error = str(e)
+
elif method == 'blockchain.address.get_history':
- address = params[0]
- result = self.store.get_history( address )
+ try:
+ address = params[0]
+ result = self.store.get_history( address )
+ except BaseException, e:
+ error = str(e)
+
elif method == 'blockchain.transaction.broadcast':
txo = self.store.send_tx(params[0])
print "sent tx:", txo
result = txo
+
else:
- print "unknown method", request
+ error = "unknown method:%s"%method
+
- if result != '':
+ if error:
+ response = { 'id':message_id, 'error':error }
+ self.push_response(response)
+ elif result != '':
response = { 'id':message_id, 'result':result }
self.push_response(response)