def tpc_begin(self, transaction, tid=None, status=' '): if self._is_read_only: raise POSException.ReadOnlyError() self._lock_acquire() try: if self._transaction is transaction: return self._lock_release() self._commit_lock_acquire() self._lock_acquire() self._transaction = transaction self._clear_temp() user = transaction.user desc = transaction.description ext = transaction._extension if ext: ext = cPickle.dumps(ext, 1) else: ext = "" self._ude = user, desc, ext if tid is None: now = time.time() t = TimeStamp(*(time.gmtime(now)[:5] + (now % 60,))) self._ts = t = t.laterThan(self._ts) self._serial = `t` else: self._ts = TimeStamp(tid) self._serial = tid self._tstatus = status self._begin(self._serial, user, desc, ext) finally: self._lock_release()
def copyTransactionsFrom(self, other, verbose=0): """Copy transactions from another storage. This is typically used for converting data from one storage to another. """ _ts=None ok=1 preindex={}; preget=preindex.get # waaaa # restore() is a new storage API method which has an identical # signature to store() except that it does not return anything. # Semantically, restore() is also identical to store() except that it # doesn't do the ConflictError or VersionLockError consistency # checks. The reason to use restore() over store() in this method is # that store() cannot be used to copy transactions spanning a version # commit or abort, or over transactional undos. # # We'll use restore() if it's available, otherwise we'll fall back to # using store(). However, if we use store, then # copyTransactionsFrom() may fail with VersionLockError or # ConflictError. if hasattr(self, 'restore'): restoring = 1 else: restoring = 0 fiter = other.iterator() for transaction in fiter: tid=transaction.tid if _ts is None: _ts=TimeStamp(tid) else: t=TimeStamp(tid) if t <= _ts: if ok: print ('Time stamps out of order %s, %s' % (_ts, t)) ok=0 _ts=t.laterThan(_ts) tid=`_ts` else: _ts = t if not ok: print ('Time stamps back in order %s' % (t)) ok=1 if verbose: print _ts self.tpc_begin(transaction, tid, transaction.status) for r in transaction: oid=r.oid if verbose: print `oid`, r.version, len(r.data) if restoring: self.restore(oid, r.serial, r.data, r.version, r.data_txn, transaction) else: pre=preget(oid, None) s=self.store(oid, pre, r.data, r.version, transaction) preindex[oid]=s self.tpc_vote(transaction) self.tpc_finish(transaction) fiter.close()