Commit e7b82a96 authored by Kirill Smelkov's avatar Kirill Smelkov

zodbcommit: Prepare to compute current serial of an oid lazily

This current serial will not be needed on new codepaths to be added to
zodbcommit in the next patch.

-> Move the computation to function to trigger it only from places where
knowing current serial is actually needed.

/reviewed-by @jerome
/reviewed-on nexedi/zodbtools!19
parent 67b42fa7
......@@ -55,11 +55,11 @@ from golang import func, defer, panic
def zodbcommit(stor, at, txn):
assert isinstance(txn, zodbdump.Transaction)
before = p64(u64(at)+1)
def _():
def current_serial(oid):
return _serial_at(stor, oid, at)
for obj in txn.objv:
data = None # data do be committed - setup vvv
if isinstance(obj, zodbdump.ObjectCopy):
......@@ -82,25 +82,12 @@ def zodbcommit(stor, at, txn):
panic('invalid object record: %r' % (obj,))
# now we have the data.
# find out what is oid's serial as of <before state
xdata = stor.loadBefore(obj.oid, before)
except POSKeyError:
serial_prev = z64
if xdata is None:
serial_prev = z64
_, serial_prev, _ = xdata
# store the object.
# we have the data -> store the object.
# if it will be ConflictError - we just fail and let the caller retry.
if data is None:
stor.deleteObject(obj.oid, serial_prev, txn)
stor.deleteObject(obj.oid, current_serial(obj.oid), txn)
else:, serial_prev, data, '', txn), current_serial(obj.oid), data, '', txn)
......@@ -118,6 +105,20 @@ def zodbcommit(stor, at, txn):
tid = _[0]
return tid
# _serial_at returns oid's serial as of @at database state.
def _serial_at(stor, oid, at):
before = p64(u64(at)+1)
xdata = stor.loadBefore(oid, before)
except POSKeyError:
serial = z64
if xdata is None:
serial = z64
_, serial, _ = xdata
return serial
# ----------------------------------------
import sys, getopt
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment