Commit 2ef8c745 authored by Jim Fulton's avatar Jim Fulton

Added new method to load historical object revisions.

parent d9c39a6c
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
############################################################################## ##############################################################################
"""Handy standard storage machinery """Handy standard storage machinery
""" """
__version__='$Revision: 1.6 $'[11:-2] __version__='$Revision: 1.7 $'[11:-2]
import time, bpthread, UndoLogCompatible import time, bpthread, UndoLogCompatible
from POSException import UndoError from POSException import UndoError
...@@ -218,3 +218,6 @@ class BaseStorage(UndoLogCompatible.UndoLogCompatible): ...@@ -218,3 +218,6 @@ class BaseStorage(UndoLogCompatible.UndoLogCompatible):
def pack(self, t, referencesf): pass def pack(self, t, referencesf): pass
def loadSerial(self, oid, serial):
raise POSException.Unsupported, (
"Retrieval of historical revisions is not supported")
...@@ -84,8 +84,8 @@ ...@@ -84,8 +84,8 @@
############################################################################## ##############################################################################
"""Database connection support """Database connection support
$Id: Connection.py,v 1.32 2000/05/09 19:09:16 jim Exp $""" $Id: Connection.py,v 1.33 2000/05/20 15:54:28 jim Exp $"""
__version__='$Revision: 1.32 $'[11:-2] __version__='$Revision: 1.33 $'[11:-2]
from cPickleCache import PickleCache from cPickleCache import PickleCache
from POSException import ConflictError, ExportError from POSException import ConflictError, ExportError
...@@ -439,6 +439,15 @@ class Connection(ExportImport.ExportImport): ...@@ -439,6 +439,15 @@ class Connection(ExportImport.ExportImport):
error=sys.exc_info()) error=sys.exc_info())
raise raise
def oldstate(self, object, serial):
oid=object._p_oid
p = self._storage.loadSerial(oid, serial)
file=StringIO(p)
unpickler=Unpickler(file)
unpickler.persistent_load=self._persistent_load
unpickler.load()
return unpickler.load()
def setklassstate(self, object, def setklassstate(self, object,
tt=type(()), ct=type(HelperClass)): tt=type(()), ct=type(HelperClass)):
try: try:
......
...@@ -184,7 +184,7 @@ ...@@ -184,7 +184,7 @@
# may have a back pointer to a version record or to a non-version # may have a back pointer to a version record or to a non-version
# record. # record.
# #
__version__='$Revision: 1.36 $'[11:-2] __version__='$Revision: 1.37 $'[11:-2]
import struct, time, os, bpthread, string, base64, sys import struct, time, os, bpthread, string, base64, sys
from struct import pack, unpack from struct import pack, unpack
...@@ -584,6 +584,34 @@ class FileStorage(BaseStorage.BaseStorage): ...@@ -584,6 +584,34 @@ class FileStorage(BaseStorage.BaseStorage):
try: return self._load(oid, version, self._index, self._file) try: return self._load(oid, version, self._index, self._file)
finally: self._lock_release() finally: self._lock_release()
def loadSerial(self, oid, serial):
_index=self._index
file=self._file
seek=file.seek
read=file.read
pos=_index[oid]
while 1:
seek(pos)
h=read(42)
doid,dserial,prev,tloc,vlen,plen = unpack(">8s8s8s8sH8s", h)
if doid != oid: raise CorruptedDataError, h
if dserial == serial: break # Yeee ha!
# Keep looking for serial
pos=u64(prev)
if not pos: raise KeyError, serial
continue
if vlen:
pnv=read(8) # Read location of non-version data
read(8) # skip past version link
read(vlen) # skip version
if plen != z64: return read(u64(plen))
# We got a backpointer, probably from a commit.
pnv=read(8)
return _loadBack(file, oid, pnv)[0]
def modifiedInVersion(self, oid): def modifiedInVersion(self, oid):
self._lock_acquire() self._lock_acquire()
try: try:
......
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