[Zope-Checkins] CVS: StandaloneZODB/ZODB - fsIndex.py:1.1.2.4

Jeremy Hylton jeremy@zope.com
Mon, 3 Dec 2001 16:36:24 -0500


Update of /cvs-repository/StandaloneZODB/ZODB
In directory cvs.zope.org:/tmp/cvs-serv16528/ZODB

Modified Files:
      Tag: BTreeFSIndex-branch
	fsIndex.py 
Log Message:
Many small changes, mostly cosmetic.

One interface change: Allow import error on _fsBTree to percolate.

One non-functional, performance fix: values() now iterates over only
the values() of the btrees and not the items().

Reformat code according to guidelines from the Society for the
Promotion of Whitespace (SPOW).

Use local str2num() and num2str() functions instead of p64() and U64()
+ slice.

Replace negative slices with positive slices.  I find it much easier
to read key[:6] than key[:-2].

Use default as default value in get() implementation.


=== StandaloneZODB/ZODB/fsIndex.py 1.1.2.3 => 1.1.2.4 ===
 # bytes back before using U64 to convert the data back to (long)
 # integers.
-#
 
-try:
-    from BTrees._fsBTree import fsBTree as _fsBTree
-    print 'Using fsBTrees'
-    #from BTrees.OOBTree import OOBTree as _fsBTree
-except ImportError:
-    def fsIndex(): return {}
-else:
-
-    from utils import U64, p64
-
-    class fsIndex:
-
-        def __init__(self):
-            self._data={}
-
-        def __getitem__(self, key):
-            return U64('\0\0'+self._data[key[:-2]][key[-2:]])
-
-        def get(self, key, default=None):
-            v=self._data.get(key[:-2], self)
-            if v is self: return default
-            v=v.get(key[-2:], self)
-            if v is self: return default
-            return U64('\0\0'+v)
-
-        def __setitem__(self, key, value):
-            value=p64(value)
-            if value[:2] != '\0\0':
-                raise ValueError('Values too large')
-            tree=self._data.get(key[:-2], self)
-            if tree is self:
-                tree = _fsBTree()
-                self._data[key[:-2]]=tree
-            tree[key[-2:]]=value[2:]
-
-        def __len__(self):
-            r=0
-            for tree in self._data.values(): r+=len(tree)
-            return r
-
-        def update(self, mapping):
-            for k, v in mapping.items():
-                self[k]=v
-
-        def has_key(self, key):
-            v=self.get(key, self)
-            return v is not self
-
-        def clear(self): self._data.clear()
-
-        def keys(self):
-            r=[]
-            for prefix, tree in self._data.items():
-                for suffix, v in tree.items():
-                    r.append(prefix+suffix)
-            return r
-
-        def items(self):
-            r=[]
-            for prefix, tree in self._data.items():
-                for suffix, v in tree.items():
-                    r.append(((prefix+suffix), U64('\0\0'+v)))
-            return r
-
-        def values(self):
-            r=[]
-            for prefix, tree in self._data.items():
-                for suffix, v in tree.items():
-                    r.append(U64('\0\0',v))
-            return r
+from BTrees._fsBTree import fsBTree as _fsBTree
+
+import struct
+
+# convert between numbers and six-byte strings
+
+_t32 = 1L<< 32
+
+def num2str(n):
+    h, l = divmod(long(n), _t32)
+    return struct.pack(">HI", h, l)
+
+def str2num(s):
+    h, l = struct.unpack(">HI", s)
+    if h:
+        return (long(h) << 32) + l
+    else:
+       return l
+
+class fsIndex:
+
+    def __init__(self):
+        self._data = {}
+
+    def __getitem__(self, key):
+        return str2num(self._data[key[:6]][key[6:]])
+
+    def get(self, key, default=None):
+        tree = self._data.get(key[:6], default)
+        if tree is default:
+            return default
+        v = tree.get(key[6:], default)
+        if v is default:
+            return default
+        return str2num(v)
+
+    def __setitem__(self, key, value):
+        value = num2str(value)
+        treekey = key[:6]
+        tree = self._data.get(treekey)
+        if tree is None:
+            tree = _fsBTree()
+            self._data[treekey] = tree
+        tree[key[6:]] = value
+
+    def __len__(self):
+        r = 0
+        for tree in self._data.values():
+            r += len(tree)
+        return r
+
+    def update(self, mapping):
+        for k, v in mapping.items():
+            self[k] = v
+
+    def has_key(self, key):
+        v=self.get(key, self)
+        return v is not self
+
+    def clear(self):
+        self._data.clear()
+
+    def keys(self):
+        r = []
+        for prefix, tree in self._data.items():
+            for suffix in tree.keys():
+                r.append(prefix + suffix)
+        return r
+
+    def items(self):
+        r = []
+        for prefix, tree in self._data.items():
+            for suffix, v in tree.items():
+                r.append(((prefix + suffix), str2num(v)))
+        return r
+
+    def values(self):
+        r = []
+        for prefix, tree in self._data.items():
+            for v in tree.values():
+                r.append(str2num(v))
+        return r