Commit 964db367 authored by Barry Warsaw's avatar Barry Warsaw

history(): Jim says that the `version' argument is a bug, and should

be ignored.  This simplifies the logic a bit.
parent 181fdd8c
...@@ -4,7 +4,7 @@ See Minimal.py for an implementation of Berkeley storage that does not support ...@@ -4,7 +4,7 @@ See Minimal.py for an implementation of Berkeley storage that does not support
undo or versioning. undo or versioning.
""" """
__version__ = '$Revision: 1.25 $'[-2:][0] __version__ = '$Revision: 1.26 $'[-2:][0]
import struct import struct
import time import time
...@@ -845,49 +845,49 @@ class Full(BerkeleyBase): ...@@ -845,49 +845,49 @@ class Full(BerkeleyBase):
def history(self, oid, version=None, size=1, filter=None): def history(self, oid, version=None, size=1, filter=None):
self._lock_acquire() self._lock_acquire()
try: try:
# Find the vid for the version # Jim says:
if version is None: #
tvid = None # This documentation is wrong. I think that the version should
version = '' # be ignored. It really shouldn't be in the signature. Zope
elif version == '': # never passes the version argument.
tvid = 0 #
else: # so we ignore `version', which makes our lives a bit easier. We
# BAW: for now, let KeyErrors percolate up # start with the most recent revision of the object, then search
tvid = self._vids[version] # the transaction records backwards until we find enough records.
# Start with the most recent revision of the object, then search
# the transaction records backwards finding revisions in the
# selected version.
history = [] history = []
revid = self._serials[oid] revid = self._serials[oid]
# BAW: Again, let KeyErrors percolate up # BAW: Again, let KeyErrors percolate up
while len(history) < size: while len(history) < size:
# Some information comes out of the revision metadata...
vid, nvrevid, lrevid, previd = struct.unpack( vid, nvrevid, lrevid, previd = struct.unpack(
'>8s8s8s8s', self._metadata[oid+revid]) '>8s8s8s8s', self._metadata[oid+revid])
if tvid is None or vid == ZERO or tvid == vid: # ...while other information comes out of the transaction
# Get transaction metadata, which we need to fill in the # metadata.
# appropriate HistoryEntry slots. txnmeta = self._txnMetadata[revid]
txnmeta = self._txnMetadata[revid] userlen, desclen = struct.unpack('>II', txnmeta[1:9])
userlen, desclen = struct.unpack('>II', txnmeta[1:9]) user = txnmeta[9:9+userlen]
user = txnmeta[9:9+userlen] desc = txnmeta[9+userlen:9+userlen+desclen]
desc = txnmeta[9+userlen:9+userlen+desclen] # Now get the pickle size
# Now get the pickle size data = self._pickles[oid+lrevid]
data = self._pickles[oid+lrevid] # Create a HistoryEntry structure, which turns out to be a
# Create a HistoryEntry structure, which turns out to be a # dictionary with some specifically named entries (BAW:
# dictionary with some specifically named entries (BAW: # although this poorly documented).
# although this poorly documented). if vid == ZERO:
if vid == ZERO: retvers = ''
retvers = '' else:
else: retvers = self._versions[vid]
retvers = version # The HistoryEntry object
d = {'time' : TimeStamp(revid).timeTime(), d = {'time' : TimeStamp(revid).timeTime(),
'user_name' : user, 'user_name' : user,
'description': desc, 'description': desc,
'serial' : revid, 'serial' : revid,
'version' : retvers, 'version' : retvers,
'size' : len(data), 'size' : len(data),
} }
if filter is None or filter(d): if filter is None or filter(d):
history.append(d) history.append(d)
# Chase the link backwards to the next most historical
# revision, stopping when we've reached the end.
if previd == ZERO: if previd == ZERO:
break break
revid = previd revid = previd
......
...@@ -4,7 +4,7 @@ See Minimal.py for an implementation of Berkeley storage that does not support ...@@ -4,7 +4,7 @@ See Minimal.py for an implementation of Berkeley storage that does not support
undo or versioning. undo or versioning.
""" """
__version__ = '$Revision: 1.25 $'[-2:][0] __version__ = '$Revision: 1.26 $'[-2:][0]
import struct import struct
import time import time
...@@ -845,49 +845,49 @@ class Full(BerkeleyBase): ...@@ -845,49 +845,49 @@ class Full(BerkeleyBase):
def history(self, oid, version=None, size=1, filter=None): def history(self, oid, version=None, size=1, filter=None):
self._lock_acquire() self._lock_acquire()
try: try:
# Find the vid for the version # Jim says:
if version is None: #
tvid = None # This documentation is wrong. I think that the version should
version = '' # be ignored. It really shouldn't be in the signature. Zope
elif version == '': # never passes the version argument.
tvid = 0 #
else: # so we ignore `version', which makes our lives a bit easier. We
# BAW: for now, let KeyErrors percolate up # start with the most recent revision of the object, then search
tvid = self._vids[version] # the transaction records backwards until we find enough records.
# Start with the most recent revision of the object, then search
# the transaction records backwards finding revisions in the
# selected version.
history = [] history = []
revid = self._serials[oid] revid = self._serials[oid]
# BAW: Again, let KeyErrors percolate up # BAW: Again, let KeyErrors percolate up
while len(history) < size: while len(history) < size:
# Some information comes out of the revision metadata...
vid, nvrevid, lrevid, previd = struct.unpack( vid, nvrevid, lrevid, previd = struct.unpack(
'>8s8s8s8s', self._metadata[oid+revid]) '>8s8s8s8s', self._metadata[oid+revid])
if tvid is None or vid == ZERO or tvid == vid: # ...while other information comes out of the transaction
# Get transaction metadata, which we need to fill in the # metadata.
# appropriate HistoryEntry slots. txnmeta = self._txnMetadata[revid]
txnmeta = self._txnMetadata[revid] userlen, desclen = struct.unpack('>II', txnmeta[1:9])
userlen, desclen = struct.unpack('>II', txnmeta[1:9]) user = txnmeta[9:9+userlen]
user = txnmeta[9:9+userlen] desc = txnmeta[9+userlen:9+userlen+desclen]
desc = txnmeta[9+userlen:9+userlen+desclen] # Now get the pickle size
# Now get the pickle size data = self._pickles[oid+lrevid]
data = self._pickles[oid+lrevid] # Create a HistoryEntry structure, which turns out to be a
# Create a HistoryEntry structure, which turns out to be a # dictionary with some specifically named entries (BAW:
# dictionary with some specifically named entries (BAW: # although this poorly documented).
# although this poorly documented). if vid == ZERO:
if vid == ZERO: retvers = ''
retvers = '' else:
else: retvers = self._versions[vid]
retvers = version # The HistoryEntry object
d = {'time' : TimeStamp(revid).timeTime(), d = {'time' : TimeStamp(revid).timeTime(),
'user_name' : user, 'user_name' : user,
'description': desc, 'description': desc,
'serial' : revid, 'serial' : revid,
'version' : retvers, 'version' : retvers,
'size' : len(data), 'size' : len(data),
} }
if filter is None or filter(d): if filter is None or filter(d):
history.append(d) history.append(d)
# Chase the link backwards to the next most historical
# revision, stopping when we've reached the end.
if previd == ZERO: if previd == ZERO:
break break
revid = previd revid = previd
......
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