Commit 97389124 authored by Guido van Rossum's avatar Guido van Rossum

Use cPickle and cStringIO when available.

parent 4066077b
...@@ -28,8 +28,17 @@ Dependent on the implementation, closing a persistent dictionary may ...@@ -28,8 +28,17 @@ Dependent on the implementation, closing a persistent dictionary may
or may not be necessary to flush changes to disk. or may not be necessary to flush changes to disk.
""" """
import pickle # Try using cPickle and cStringIO if available.
import StringIO
try:
from cPickle import Pickler, Unpickler
except ImportError:
from pickle import Pickler, Unpickler
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
class Shelf: class Shelf:
...@@ -52,12 +61,12 @@ class Shelf: ...@@ -52,12 +61,12 @@ class Shelf:
return self.dict.has_key(key) return self.dict.has_key(key)
def __getitem__(self, key): def __getitem__(self, key):
f = StringIO.StringIO(self.dict[key]) f = StringIO(self.dict[key])
return pickle.Unpickler(f).load() return Unpickler(f).load()
def __setitem__(self, key, value): def __setitem__(self, key, value):
f = StringIO.StringIO() f = StringIO()
p = pickle.Pickler(f) p = Pickler(f)
p.dump(value) p.dump(value)
self.dict[key] = f.getvalue() self.dict[key] = f.getvalue()
...@@ -80,11 +89,12 @@ class Shelf: ...@@ -80,11 +89,12 @@ class Shelf:
class BsdDbShelf(Shelf): class BsdDbShelf(Shelf):
"""Shelf implementation using the "BSD" db interface. """Shelf implementation using the "BSD" db interface.
The actual database is opened using one of thethe "bsddb" modules This adds methods first(), next(), previous(), last() and
"open" routines (i.e. bsddb.hashopen, bsddb.btopen or bsddb.rnopen.) set_location() that have no counterpart in [g]dbm databases.
This class is initialized with the the database object The actual database must be opened using one of the "bsddb"
returned from one of the bsddb open functions. modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
bsddb.rnopen) and passed to the constructor.
See the module's __doc__ string for an overview of the interface. See the module's __doc__ string for an overview of the interface.
""" """
...@@ -94,28 +104,28 @@ class BsdDbShelf(Shelf): ...@@ -94,28 +104,28 @@ class BsdDbShelf(Shelf):
def set_location(self, key): def set_location(self, key):
(key, value) = self.dict.set_location(key) (key, value) = self.dict.set_location(key)
f = StringIO.StringIO(value) f = StringIO(value)
return (key, pickle.Unpickler(f).load()) return (key, Unpickler(f).load())
def next(self): def next(self):
(key, value) = self.dict.next() (key, value) = self.dict.next()
f = StringIO.StringIO(value) f = StringIO(value)
return (key, pickle.Unpickler(f).load()) return (key, Unpickler(f).load())
def previous(self): def previous(self):
(key, value) = self.dict.previous() (key, value) = self.dict.previous()
f = StringIO.StringIO(value) f = StringIO(value)
return (key, pickle.Unpickler(f).load()) return (key, Unpickler(f).load())
def first(self): def first(self):
(key, value) = self.dict.first() (key, value) = self.dict.first()
f = StringIO.StringIO(value) f = StringIO(value)
return (key, pickle.Unpickler(f).load()) return (key, Unpickler(f).load())
def last(self): def last(self):
(key, value) = self.dict.last() (key, value) = self.dict.last()
f = StringIO.StringIO(value) f = StringIO(value)
return (key, pickle.Unpickler(f).load()) return (key, Unpickler(f).load())
class DbfilenameShelf(Shelf): class DbfilenameShelf(Shelf):
......
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