class BtcWallet(object): """ Attributes: masterkeys (ItemSet): private_keys (ItemSet): outpoints (ItemSet): """ def __init__(self, masterkeys=None, private_keys=None, outpoints=None): self.masterkeys = masterkeys or ItemSet() self.private_keys = private_keys or ItemSet() self.outpoints = outpoints or ItemSet() self.ON_STARTING_TX = Event() self.ON_ENDING_TX = Event() def begin_transaction(self): self.ON_STARTING_TX.fire() self.tx = Transaction() self.private_keys.begin_transaction(self.tx) self.outpoints.begin_transaction(self.tx) def commit_transaction(self): self.ON_ENDING_TX.fire() self.tx.commit()
def __init__(self, masterkeys=None, private_keys=None, outpoints=None): self.masterkeys = masterkeys or ItemSet() self.private_keys = private_keys or ItemSet() self.outpoints = outpoints or ItemSet() self.ON_STARTING_TX = Event() self.ON_ENDING_TX = Event()
class LogIndex(object): """ Attributes: tocommit (collections.deque) """ def __init__(self, tocommit=None): self.tocommit = tocommit or deque() self.ON_COMMITING = Event() self.ON_LOG = Event() self.ON_REVERTLOG = Event() self.ON_COMMITED = Event() def commit_step(self): assert self.tocommit logidx = self.tocommit.popleft() if logidx.command == LogIndexEntry.WRITE: self.ON_COMMITING.fire(logindex=logidx) logidx.needs_commit = False self.ON_COMMITED.fire(logindex=logidx) def commit(self): while self.tocommit: self.commit_step() def log(self, logindex): logindex.needs_commit = True self.tocommit.append(logindex) self.ON_LOG.fire(logindex=logindex) def revertlog(self): logidx = self.tocommit.pop() self.ON_REVERTLOG.fire(logindex=logidx) def recover(self): # Remove not entirely written logindex transactions at the end. idx = rindex(self.tocommit, lambda i: i.is_tx_command()) if idx is not None and self.tocommit[ idx].command == LogIndexEntry.BEGIN_TX: for i in range(len(self.tocommit) - idx): self.revertlog() # Commit at least the first transaction idx = lindex(self.tocommit, lambda i: i.is_tx_command()) if idx is not None and self.tocommit[ idx].command == LogIndexEntry.END_TX: for i in range(idx): self.commit_step()
class LogIndex(object): """ Attributes: tocommit (collections.deque) """ def __init__(self, tocommit=None): self.tocommit = tocommit or deque() self.ON_COMMITING = Event() self.ON_LOG = Event() self.ON_REVERTLOG = Event() self.ON_COMMITED = Event() def commit_step(self): assert self.tocommit logidx = self.tocommit.popleft() if logidx.command == LogIndexEntry.WRITE: self.ON_COMMITING.fire(logindex=logidx) logidx.needs_commit = False self.ON_COMMITED.fire(logindex=logidx) def commit(self): while self.tocommit: self.commit_step() def log(self, logindex): logindex.needs_commit = True self.tocommit.append(logindex) self.ON_LOG.fire(logindex=logindex) def revertlog(self): logidx = self.tocommit.pop() self.ON_REVERTLOG.fire(logindex=logidx) def recover(self): # Remove not entirely written logindex transactions at the end. idx = rindex(self.tocommit, lambda i: i.is_tx_command()) if idx is not None and self.tocommit[idx].command == LogIndexEntry.BEGIN_TX: for i in range(len(self.tocommit) - idx): self.revertlog() # Commit at least the first transaction idx = lindex(self.tocommit, lambda i: i.is_tx_command()) if idx is not None and self.tocommit[idx].command == LogIndexEntry.END_TX: for i in range(idx): self.commit_step()
def __init__(self, tocommit=None): self.tocommit = tocommit or deque() self.ON_COMMITING = Event() self.ON_LOG = Event() self.ON_REVERTLOG = Event() self.ON_COMMITED = Event()
def __init__(self, items_by_key=None): self.items_by_key = items_by_key or {} self.ON_CHANGING = Event() self.ON_CHANGED = Event() self.tx = None