From 047ab5b81f34f5b3d12db30915c4d3a7c14aa066 Mon Sep 17 00:00:00 2001
From: Jim Fulton <jim@zope.com>
Date: Wed, 22 Mar 2000 02:04:26 +0000
Subject: [PATCH] Finally, implemented the 'history' method.

---
 trunk/src/ZODB/FileStorage.py | 54 ++++++++++++++++++++++++++++++++++-
 1 file changed, 53 insertions(+), 1 deletion(-)

diff --git a/trunk/src/ZODB/FileStorage.py b/trunk/src/ZODB/FileStorage.py
index 6483c9f9..fde9a2c2 100644
--- a/trunk/src/ZODB/FileStorage.py
+++ b/trunk/src/ZODB/FileStorage.py
@@ -184,7 +184,7 @@
 #   may have a back pointer to a version record or to a non-version
 #   record.
 #
-__version__='$Revision: 1.34 $'[11:-2]
+__version__='$Revision: 1.35 $'[11:-2]
 
 import struct, time, os, bpthread, string, base64, sys
 from struct import pack, unpack
@@ -863,6 +863,58 @@ class FileStorage(BaseStorage.BaseStorage):
 
         return r
 
+    def history(self, oid, version=None, length=1, filter=None):
+        r=[]
+        file=self._file
+        seek=file.seek
+        read=file.read
+        pos=self._index[oid]
+        wantver=version
+
+        while 1:
+            if len(r) >= length: return r
+            seek(pos)
+            h=read(42)
+            doid,serial,prev,tloc,vlen,plen = unpack(">8s8s8s8sH8s", h)
+            prev=u64(prev)
+
+            if vlen:
+                nv = read(8) != z64
+                file.seek(8,1) # Skip previous version record pointer
+                version=read(vlen)
+                if wantver is not None and version != wantver:
+                    if prev:
+                        pos=prev
+                        continue
+                    else:
+                        return r
+            else:
+                version=''
+                wantver=None
+            
+            seek(u64(tloc))
+            h=read(23)
+            tid, stl, status, ul, dl, el = unpack(">8s8scHHH",h)
+            if el < 0: el=t32-el
+            user_name=read(ul)
+            description=read(dl)
+            if el: d=loads(read(el))
+            else: d={}
+            
+            d['time']=TimeStamp(serial).timeTime()
+            d['user_name']=user_name
+            d['description']=description
+            d['serial']=serial
+            d['version']=version
+            d['size']=u64(plen)
+
+            if filter is None or filter(d):
+                r.append(d)
+
+            if prev: pos=prev
+            else: return r
+
+
     def pack(self, t, referencesf):
         """Copy data from the current database file to a packed file
     
-- 
GitLab