summaryrefslogtreecommitdiffstats
path: root/Lib/bsddb/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/bsddb/__init__.py')
-rw-r--r--Lib/bsddb/__init__.py237
1 files changed, 237 insertions, 0 deletions
diff --git a/Lib/bsddb/__init__.py b/Lib/bsddb/__init__.py
new file mode 100644
index 0000000..a2d820c
--- /dev/null
+++ b/Lib/bsddb/__init__.py
@@ -0,0 +1,237 @@
+#----------------------------------------------------------------------
+# Copyright (c) 1999-2001, Digital Creations, Fredericksburg, VA, USA
+# and Andrew Kuchling. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# o Redistributions of source code must retain the above copyright
+# notice, this list of conditions, and the disclaimer that follows.
+#
+# o Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# o Neither the name of Digital Creations nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS AND CONTRIBUTORS *AS
+# IS* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL
+# CREATIONS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+#----------------------------------------------------------------------
+
+
+"""
+This package initialization module provides a compatibility interface
+that should enable bsddb3 to be a near drop-in replacement for the original
+old bsddb module. The functions and classes provided here are all
+wrappers around the new functionality provided in the bsddb3.db module.
+
+People interested in the more advanced capabilites of Berkeley DB 3.x
+should use the bsddb3.db module directly.
+"""
+
+import _bsddb
+# bsddb3 calls it _db
+_db = _bsddb
+__version__ = _db.__version__
+
+error = _db.DBError # So bsddb3.error will mean something...
+
+#----------------------------------------------------------------------
+
+
+class _DBWithCursor:
+ """
+ A simple wrapper around DB that makes it look like the bsddbobject in
+ the old module. It uses a cursor as needed to provide DB traversal.
+ """
+ def __init__(self, db):
+ self.db = db
+ self.dbc = None
+ self.db.set_get_returns_none(0)
+
+ def __del__(self):
+ self.close()
+
+ def _checkCursor(self):
+ if self.dbc is None:
+ self.dbc = self.db.cursor()
+
+ def _checkOpen(self):
+ if self.db is None:
+ raise error, "BSDDB object has already been closed"
+
+ def isOpen(self):
+ return self.db is not None
+
+ def __len__(self):
+ self._checkOpen()
+ return len(self.db)
+
+ def __getitem__(self, key):
+ self._checkOpen()
+ return self.db[key]
+
+ def __setitem__(self, key, value):
+ self._checkOpen()
+ self.db[key] = value
+
+ def __delitem__(self, key):
+ self._checkOpen()
+ del self.db[key]
+
+ def close(self):
+ if self.dbc is not None:
+ self.dbc.close()
+ v = 0
+ if self.db is not None:
+ v = self.db.close()
+ self.dbc = None
+ self.db = None
+ return v
+
+ def keys(self):
+ self._checkOpen()
+ return self.db.keys()
+
+ def has_key(self, key):
+ self._checkOpen()
+ return self.db.has_key(key)
+
+ def set_location(self, key):
+ self._checkOpen()
+ self._checkCursor()
+ return self.dbc.set(key)
+
+ def next(self):
+ self._checkOpen()
+ self._checkCursor()
+ rv = self.dbc.next()
+ return rv
+
+ def previous(self):
+ self._checkOpen()
+ self._checkCursor()
+ rv = self.dbc.prev()
+ return rv
+
+ def first(self):
+ self._checkOpen()
+ self._checkCursor()
+ rv = self.dbc.first()
+ return rv
+
+ def last(self):
+ self._checkOpen()
+ self._checkCursor()
+ rv = self.dbc.last()
+ return rv
+
+ def sync(self):
+ self._checkOpen()
+ return self.db.sync()
+
+
+#----------------------------------------------------------------------
+# Compatibility object factory functions
+
+def hashopen(file, flag='c', mode=0666, pgsize=None, ffactor=None, nelem=None,
+ cachesize=None, lorder=None, hflags=0):
+
+ flags = _checkflag(flag)
+ d = _db.DB()
+ d.set_flags(hflags)
+ if cachesize is not None: d.set_cachesize(0, cachesize)
+ if pgsize is not None: d.set_pagesize(pgsize)
+ if lorder is not None: d.set_lorder(lorder)
+ if ffactor is not None: d.set_h_ffactor(ffactor)
+ if nelem is not None: d.set_h_nelem(nelem)
+ d.open(file, _db.DB_HASH, flags, mode)
+ return _DBWithCursor(d)
+
+#----------------------------------------------------------------------
+
+def btopen(file, flag='c', mode=0666,
+ btflags=0, cachesize=None, maxkeypage=None, minkeypage=None,
+ pgsize=None, lorder=None):
+
+ flags = _checkflag(flag)
+ d = _db.DB()
+ if cachesize is not None: d.set_cachesize(0, cachesize)
+ if pgsize is not None: d.set_pagesize(pgsize)
+ if lorder is not None: d.set_lorder(lorder)
+ d.set_flags(btflags)
+ if minkeypage is not None: d.set_bt_minkey(minkeypage)
+ if maxkeypage is not None: d.set_bt_maxkey(maxkeypage)
+ d.open(file, _db.DB_BTREE, flags, mode)
+ return _DBWithCursor(d)
+
+#----------------------------------------------------------------------
+
+
+def rnopen(file, flag='c', mode=0666,
+ rnflags=0, cachesize=None, pgsize=None, lorder=None,
+ rlen=None, delim=None, source=None, pad=None):
+
+ flags = _checkflag(flag)
+ d = _db.DB()
+ if cachesize is not None: d.set_cachesize(0, cachesize)
+ if pgsize is not None: d.set_pagesize(pgsize)
+ if lorder is not None: d.set_lorder(lorder)
+ d.set_flags(rnflags)
+ if delim is not None: d.set_re_delim(delim)
+ if rlen is not None: d.set_re_len(rlen)
+ if source is not None: d.set_re_source(source)
+ if pad is not None: d.set_re_pad(pad)
+ d.open(file, _db.DB_RECNO, flags, mode)
+ return _DBWithCursor(d)
+
+#----------------------------------------------------------------------
+
+
+def _checkflag(flag):
+ if flag == 'r':
+ flags = _db.DB_RDONLY
+ elif flag == 'rw':
+ flags = 0
+ elif flag == 'w':
+ flags = _db.DB_CREATE
+ elif flag == 'c':
+ flags = _db.DB_CREATE
+ elif flag == 'n':
+ flags = _db.DB_CREATE | _db.DB_TRUNCATE
+ else:
+ raise error, "flags should be one of 'r', 'w', 'c' or 'n'"
+ return flags | _db.DB_THREAD
+
+#----------------------------------------------------------------------
+
+
+# This is a silly little hack that allows apps to continue to use the
+# DB_THREAD flag even on systems without threads without freaking out
+# BerkeleyDB.
+#
+# This assumes that if Python was built with thread support then
+# BerkeleyDB was too.
+
+try:
+ import thread
+ del thread
+except ImportError:
+ _db.DB_THREAD = 0
+
+
+#----------------------------------------------------------------------