10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi"""Run all test cases.
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi"""
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport sys
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitry:
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # For Pythons w/distutils pybsddb
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    import bsddb3 as bsddb
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiexcept ImportError:
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # For Python 2.3
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    import bsddb
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif sys.version_info[0] >= 3 :
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    charset = "iso8859-1"  # Full 8 bit
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class logcursor_py3k(object) :
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __init__(self, env) :
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._logcursor = env.log_cursor()
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __getattr__(self, v) :
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return getattr(self._logcursor, v)
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __next__(self) :
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = getattr(self._logcursor, "next")()
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = (v[0], v[1].decode(charset))
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        next = __next__
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def first(self) :
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._logcursor.first()
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = (v[0], v[1].decode(charset))
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def last(self) :
400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._logcursor.last()
410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = (v[0], v[1].decode(charset))
430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def prev(self) :
460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._logcursor.prev()
470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = (v[0], v[1].decode(charset))
490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def current(self) :
520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._logcursor.current()
530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = (v[0], v[1].decode(charset))
550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def set(self, lsn) :
580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._logcursor.set(lsn)
590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = (v[0], v[1].decode(charset))
610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class cursor_py3k(object) :
640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __init__(self, db, *args, **kwargs) :
650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._dbcursor = db.cursor(*args, **kwargs)
660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __getattr__(self, v) :
680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return getattr(self._dbcursor, v)
690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def _fix(self, v) :
710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is None : return None
720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            key, value = v
730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, bytes) :
740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = key.decode(charset)
750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return (key, value.decode(charset))
760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __next__(self) :
780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = getattr(self._dbcursor, "next")()
790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._fix(v)
800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        next = __next__
820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def previous(self) :
840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._dbcursor.previous()
850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._fix(v)
860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def last(self) :
880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._dbcursor.last()
890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._fix(v)
900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def set(self, k) :
920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(k, str) :
930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                k = bytes(k, charset)
940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._dbcursor.set(k)
950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._fix(v)
960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def set_recno(self, num) :
980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._dbcursor.set_recno(num)
990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._fix(v)
1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def set_range(self, k, dlen=-1, doff=-1) :
1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(k, str) :
1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                k = bytes(k, charset)
1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._dbcursor.set_range(k, dlen=dlen, doff=doff)
1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._fix(v)
1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def dup(self, flags=0) :
1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cursor = self._dbcursor.dup(flags)
1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return dup_cursor_py3k(cursor)
1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def next_dup(self) :
1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._dbcursor.next_dup()
1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._fix(v)
1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def next_nodup(self) :
1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._dbcursor.next_nodup()
1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._fix(v)
1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def put(self, key, data, flags=0, dlen=-1, doff=-1) :
1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, str) :
1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = bytes(key, charset)
1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(data, str) :
1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                value = bytes(data, charset)
1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._dbcursor.put(key, data, flags=flags, dlen=dlen,
1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    doff=doff)
1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def current(self, flags=0, dlen=-1, doff=-1) :
1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._dbcursor.current(flags=flags, dlen=dlen, doff=doff)
1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._fix(v)
1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def first(self) :
1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._dbcursor.first()
1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._fix(v)
1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def pget(self, key=None, data=None, flags=0) :
1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # Incorrect because key can be a bare number,
1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # but enough to pass testsuite
1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, int) and (data is None) and (flags == 0) :
1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                flags = key
1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = None
1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, str) :
1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = bytes(key, charset)
1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(data, int) and (flags==0) :
1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                flags = data
1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                data = None
1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(data, str) :
1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                data = bytes(data, charset)
1480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v=self._dbcursor.pget(key=key, data=data, flags=flags)
1490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
1500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v1, v2, v3 = v
1510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if isinstance(v1, bytes) :
1520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    v1 = v1.decode(charset)
1530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if isinstance(v2, bytes) :
1540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    v2 = v2.decode(charset)
1550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = (v1, v2, v3.decode(charset))
1570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
1590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def join_item(self) :
1610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._dbcursor.join_item()
1620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
1630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = v.decode(charset)
1640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
1650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get(self, *args, **kwargs) :
1670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            l = len(args)
1680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if l == 2 :
1690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                k, f = args
1700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if isinstance(k, str) :
1710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    k = bytes(k, "iso8859-1")
1720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                args = (k, f)
1730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            elif l == 3 :
1740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                k, d, f = args
1750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if isinstance(k, str) :
1760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    k = bytes(k, charset)
1770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if isinstance(d, str) :
1780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    d = bytes(d, charset)
1790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                args =(k, d, f)
1800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._dbcursor.get(*args, **kwargs)
1820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
1830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                k, v = v
1840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if isinstance(k, bytes) :
1850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    k = k.decode(charset)
1860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = (k, v.decode(charset))
1870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
1880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get_both(self, key, value) :
1900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, str) :
1910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = bytes(key, charset)
1920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(value, str) :
1930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                value = bytes(value, charset)
1940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v=self._dbcursor.get_both(key, value)
1950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._fix(v)
1960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class dup_cursor_py3k(cursor_py3k) :
1980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __init__(self, dbcursor) :
1990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._dbcursor = dbcursor
2000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class DB_py3k(object) :
2020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __init__(self, *args, **kwargs) :
2030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            args2=[]
2040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for i in args :
2050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if isinstance(i, DBEnv_py3k) :
2060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    i = i._dbenv
2070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                args2.append(i)
2080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            args = tuple(args2)
2090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for k, v in kwargs.items() :
2100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if isinstance(v, DBEnv_py3k) :
2110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    kwargs[k] = v._dbenv
2120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._db = bsddb._db.DB_orig(*args, **kwargs)
2140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __contains__(self, k) :
2160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(k, str) :
2170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                k = bytes(k, charset)
2180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return getattr(self._db, "has_key")(k)
2190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __getitem__(self, k) :
2210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(k, str) :
2220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                k = bytes(k, charset)
2230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = self._db[k]
2240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
2250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = v.decode(charset)
2260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
2270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __setitem__(self, k, v) :
2290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(k, str) :
2300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                k = bytes(k, charset)
2310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(v, str) :
2320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = bytes(v, charset)
2330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._db[k] = v
2340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __delitem__(self, k) :
2360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(k, str) :
2370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                k = bytes(k, charset)
2380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            del self._db[k]
2390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __getattr__(self, v) :
2410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return getattr(self._db, v)
2420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __len__(self) :
2440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return len(self._db)
2450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def has_key(self, k, txn=None) :
2470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(k, str) :
2480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                k = bytes(k, charset)
2490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._db.has_key(k, txn=txn)
2500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def set_re_delim(self, c) :
2520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(c, str) :  # We can use a numeric value byte too
2530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                c = bytes(c, charset)
2540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._db.set_re_delim(c)
2550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def set_re_pad(self, c) :
2570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(c, str) :  # We can use a numeric value byte too
2580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                c = bytes(c, charset)
2590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._db.set_re_pad(c)
2600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get_re_source(self) :
2620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            source = self._db.get_re_source()
2630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return source.decode(charset)
2640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def put(self, key, data, txn=None, flags=0, dlen=-1, doff=-1) :
2660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, str) :
2670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = bytes(key, charset)
2680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(data, str) :
2690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                value = bytes(data, charset)
2700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._db.put(key, data, flags=flags, txn=txn, dlen=dlen,
2710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    doff=doff)
2720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def append(self, value, txn=None) :
2740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(value, str) :
2750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                value = bytes(value, charset)
2760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._db.append(value, txn=txn)
2770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get_size(self, key) :
2790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, str) :
2800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = bytes(key, charset)
2810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._db.get_size(key)
2820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def exists(self, key, *args, **kwargs) :
2840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, str) :
2850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = bytes(key, charset)
2860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._db.exists(key, *args, **kwargs)
2870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get(self, key, default="MagicCookie", txn=None, flags=0, dlen=-1, doff=-1) :
2890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, str) :
2900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = bytes(key, charset)
2910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if default != "MagicCookie" :  # Magic for 'test_get_none.py'
2920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v=self._db.get(key, default=default, txn=txn, flags=flags,
2930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        dlen=dlen, doff=doff)
2940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else :
2950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v=self._db.get(key, txn=txn, flags=flags,
2960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        dlen=dlen, doff=doff)
2970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if (v is not None) and isinstance(v, bytes) :
2980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = v.decode(charset)
2990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
3000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def pget(self, key, txn=None) :
3020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, str) :
3030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = bytes(key, charset)
3040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v=self._db.pget(key, txn=txn)
3050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
3060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v1, v2 = v
3070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if isinstance(v1, bytes) :
3080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    v1 = v1.decode(charset)
3090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = (v1, v2.decode(charset))
3110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
3120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get_both(self, key, value, txn=None, flags=0) :
3140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, str) :
3150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = bytes(key, charset)
3160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(value, str) :
3170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                value = bytes(value, charset)
3180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v=self._db.get_both(key, value, txn=txn, flags=flags)
3190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if v is not None :
3200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = v.decode(charset)
3210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return v
3220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def delete(self, key, txn=None) :
3240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if isinstance(key, str) :
3250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                key = bytes(key, charset)
3260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._db.delete(key, txn=txn)
3270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def keys(self) :
3290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            k = self._db.keys()
3300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if len(k) and isinstance(k[0], bytes) :
3310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return [i.decode(charset) for i in self._db.keys()]
3320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else :
3330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return k
3340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def items(self) :
3360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            data = self._db.items()
3370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if not len(data) : return data
3380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            data2 = []
3390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for k, v in data :
3400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if isinstance(k, bytes) :
3410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    k = k.decode(charset)
3420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                data2.append((k, v.decode(charset)))
3430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return data2
3440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def associate(self, secondarydb, callback, flags=0, txn=None) :
3460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class associate_callback(object) :
3470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __init__(self, callback) :
3480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self._callback = callback
3490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def callback(self, key, data) :
3510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(key, str) :
3520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        key = key.decode(charset)
3530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    data = data.decode(charset)
3540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    key = self._callback(key, data)
3550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if (key != bsddb._db.DB_DONOTINDEX) :
3560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        if isinstance(key, str) :
3570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            key = bytes(key, charset)
3580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        elif isinstance(key, list) :
3590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            key2 = []
3600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            for i in key :
3610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                if isinstance(i, str) :
3620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                    i = bytes(i, charset)
3630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                key2.append(i)
3640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            key = key2
3650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return key
3660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._db.associate(secondarydb._db,
3680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    associate_callback(callback).callback, flags=flags,
3690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    txn=txn)
3700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def cursor(self, txn=None, flags=0) :
3720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return cursor_py3k(self._db, txn=txn, flags=flags)
3730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def join(self, cursor_list) :
3750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cursor_list = [i._dbcursor for i in cursor_list]
3760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return dup_cursor_py3k(self._db.join(cursor_list))
3770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class DBEnv_py3k(object) :
3790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __init__(self, *args, **kwargs) :
3800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._dbenv = bsddb._db.DBEnv_orig(*args, **kwargs)
3810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __getattr__(self, v) :
3830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return getattr(self._dbenv, v)
3840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def log_cursor(self, flags=0) :
3860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return logcursor_py3k(self._dbenv)
3870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get_lg_dir(self) :
3890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._dbenv.get_lg_dir().decode(charset)
3900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get_tmp_dir(self) :
3920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._dbenv.get_tmp_dir().decode(charset)
3930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get_data_dirs(self) :
3950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return tuple(
3960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                (i.decode(charset) for i in self._dbenv.get_data_dirs()))
3970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class DBSequence_py3k(object) :
3990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __init__(self, db, *args, **kwargs) :
4000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._db=db
4010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._dbsequence = bsddb._db.DBSequence_orig(db._db, *args, **kwargs)
4020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __getattr__(self, v) :
4040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return getattr(self._dbsequence, v)
4050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def open(self, key, *args, **kwargs) :
4070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._dbsequence.open(bytes(key, charset), *args, **kwargs)
4080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get_key(self) :
4100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return  self._dbsequence.get_key().decode(charset)
4110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def get_dbp(self) :
4130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._db
4140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    import string
4160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    string.letters=[chr(i) for i in xrange(65,91)]
4170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    bsddb._db.DBEnv_orig = bsddb._db.DBEnv
4190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    bsddb._db.DB_orig = bsddb._db.DB
4200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if bsddb.db.version() <= (4, 3) :
4210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        bsddb._db.DBSequence_orig = None
4220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    else :
4230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        bsddb._db.DBSequence_orig = bsddb._db.DBSequence
4240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def do_proxy_db_py3k(flag) :
4260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        flag2 = do_proxy_db_py3k.flag
4270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        do_proxy_db_py3k.flag = flag
4280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if flag :
4290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            bsddb.DBEnv = bsddb.db.DBEnv = bsddb._db.DBEnv = DBEnv_py3k
4300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            bsddb.DB = bsddb.db.DB = bsddb._db.DB = DB_py3k
4310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            bsddb._db.DBSequence = DBSequence_py3k
4320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else :
4330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            bsddb.DBEnv = bsddb.db.DBEnv = bsddb._db.DBEnv = bsddb._db.DBEnv_orig
4340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            bsddb.DB = bsddb.db.DB = bsddb._db.DB = bsddb._db.DB_orig
4350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            bsddb._db.DBSequence = bsddb._db.DBSequence_orig
4360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return flag2
4370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    do_proxy_db_py3k.flag = False
4390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    do_proxy_db_py3k(True)
4400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitry:
4420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # For Pythons w/distutils pybsddb
4430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    from bsddb3 import db, dbtables, dbutils, dbshelve, \
4440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            hashopen, btopen, rnopen, dbobj
4450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiexcept ImportError:
4460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # For Python 2.3
4470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    from bsddb import db, dbtables, dbutils, dbshelve, \
4480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            hashopen, btopen, rnopen, dbobj
4490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitry:
4510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    from bsddb3 import test_support
4520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiexcept ImportError:
4530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if sys.version_info[0] < 3 :
4540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        from test import test_support
4550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    else :
4560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        from test import support as test_support
4570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitry:
4600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if sys.version_info[0] < 3 :
4610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        from threading import Thread, currentThread
4620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del Thread, currentThread
4630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    else :
4640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        from threading import Thread, current_thread
4650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del Thread, current_thread
4660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    have_threads = True
4670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiexcept ImportError:
4680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    have_threads = False
4690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiverbose = 0
4710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif 'verbose' in sys.argv:
4720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    verbose = 1
4730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    sys.argv.remove('verbose')
4740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif 'silent' in sys.argv:  # take care of old flag, just in case
4760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    verbose = 0
4770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    sys.argv.remove('silent')
4780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef print_versions():
4810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print
4820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print '-=' * 38
4830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print db.DB_VERSION_STRING
4840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'bsddb.db.version():   %s' % (db.version(), )
4850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if db.version() >= (5, 0) :
4860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        print 'bsddb.db.full_version(): %s' %repr(db.full_version())
4870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'bsddb.db.__version__: %s' % db.__version__
4880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'bsddb.db.cvsid:       %s' % db.cvsid
4890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Workaround for allowing generating an EGGs as a ZIP files.
4910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    suffix="__"
4920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'py module:            %s' % getattr(bsddb, "__file"+suffix)
4930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'extension module:     %s' % getattr(bsddb, "__file"+suffix)
4940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'python version:       %s' % sys.version
4960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print 'My pid:               %s' % os.getpid()
4970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print '-=' * 38
4980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef get_new_path(name) :
5010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    get_new_path.mutex.acquire()
5020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    try :
5030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import os
5040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        path=os.path.join(get_new_path.prefix,
5050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                name+"_"+str(os.getpid())+"_"+str(get_new_path.num))
5060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        get_new_path.num+=1
5070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    finally :
5080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        get_new_path.mutex.release()
5090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return path
5100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef get_new_environment_path() :
5120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    path=get_new_path("environment")
5130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    import os
5140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    try:
5150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        os.makedirs(path,mode=0700)
5160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    except os.error:
5170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.rmtree(path)
5180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        os.makedirs(path)
5190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return path
5200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef get_new_database_path() :
5220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    path=get_new_path("database")
5230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    import os
5240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if os.path.exists(path) :
5250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        os.remove(path)
5260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return path
5270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# This path can be overriden via "set_test_path_prefix()".
5300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os, os.path
5310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiget_new_path.prefix=os.path.join(os.environ.get("TMPDIR",
5320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    os.path.join(os.sep,"tmp")), "z-Berkeley_DB")
5330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiget_new_path.num=0
5340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef get_test_path_prefix() :
5360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return get_new_path.prefix
5370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef set_test_path_prefix(path) :
5390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    get_new_path.prefix=path
5400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef remove_test_path_directory() :
5420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    test_support.rmtree(get_new_path.prefix)
5430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif have_threads :
5450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    import threading
5460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    get_new_path.mutex=threading.Lock()
5470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    del threading
5480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse :
5490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    class Lock(object) :
5500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def acquire(self) :
5510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
5520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def release(self) :
5530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
5540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    get_new_path.mutex=Lock()
5550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    del Lock
5560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass PrintInfoFakeTest(unittest.TestCase):
5600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def testPrintVersions(self):
5610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        print_versions()
5620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# This little hack is for when this module is run as main and all the
5650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# other modules import it so they will still be able to get the right
5660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# verbose setting.  It's confusing but it works.
5670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif sys.version_info[0] < 3 :
5680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    import test_all
5690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    test_all.verbose = verbose
5700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse :
5710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    import sys
5720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print >>sys.stderr, "Work to do!"
5730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef suite(module_prefix='', timing_check=None):
5760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    test_modules = [
5770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_associate',
5780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_basics',
5790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_dbenv',
5800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_db',
5810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_compare',
5820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_compat',
5830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_cursor_pget_bug',
5840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_dbobj',
5850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_dbshelve',
5860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_dbtables',
5870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_distributed_transactions',
5880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_early_close',
5890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_fileid',
5900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_get_none',
5910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_join',
5920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_lock',
5930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_misc',
5940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_pickle',
5950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_queue',
5960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_recno',
5970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_replication',
5980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_sequence',
5990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'test_thread',
6000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ]
6010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    alltests = unittest.TestSuite()
6030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    for name in test_modules:
6040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        #module = __import__(name)
6050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Do it this way so that suite may be called externally via
6060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # python's Lib/test/test_bsddb3.
6070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        module = __import__(module_prefix+name, globals(), locals(), name)
6080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        alltests.addTest(module.test_suite())
6100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if timing_check:
6110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            alltests.addTest(unittest.makeSuite(timing_check))
6120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return alltests
6130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_suite():
6160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    suite = unittest.TestSuite()
6170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    suite.addTest(unittest.makeSuite(PrintInfoFakeTest))
6180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return suite
6190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == '__main__':
6220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    print_versions()
6230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    unittest.main(defaultTest='suite')
624