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,27 +845,24 @@ class Full(BerkeleyBase): ...@@ -845,27 +845,24 @@ 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]
...@@ -878,7 +875,8 @@ class Full(BerkeleyBase): ...@@ -878,7 +875,8 @@ class Full(BerkeleyBase):
if vid == ZERO: if vid == ZERO:
retvers = '' retvers = ''
else: else:
retvers = version retvers = self._versions[vid]
# The HistoryEntry object
d = {'time' : TimeStamp(revid).timeTime(), d = {'time' : TimeStamp(revid).timeTime(),
'user_name' : user, 'user_name' : user,
'description': desc, 'description': desc,
...@@ -888,6 +886,8 @@ class Full(BerkeleyBase): ...@@ -888,6 +886,8 @@ class Full(BerkeleyBase):
} }
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,27 +845,24 @@ class Full(BerkeleyBase): ...@@ -845,27 +845,24 @@ 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]
...@@ -878,7 +875,8 @@ class Full(BerkeleyBase): ...@@ -878,7 +875,8 @@ class Full(BerkeleyBase):
if vid == ZERO: if vid == ZERO:
retvers = '' retvers = ''
else: else:
retvers = version retvers = self._versions[vid]
# The HistoryEntry object
d = {'time' : TimeStamp(revid).timeTime(), d = {'time' : TimeStamp(revid).timeTime(),
'user_name' : user, 'user_name' : user,
'description': desc, 'description': desc,
...@@ -888,6 +886,8 @@ class Full(BerkeleyBase): ...@@ -888,6 +886,8 @@ class Full(BerkeleyBase):
} }
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