14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""Run all test cases.
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # For Pythons w/distutils pybsddb
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import bsddb3 as bsddb
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError:
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # For Python 2.3
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import bsddb
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif sys.version_info[0] >= 3 :
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    charset = "iso8859-1"  # Full 8 bit
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class logcursor_py3k(object) :
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __init__(self, env) :
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._logcursor = env.log_cursor()
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __getattr__(self, v) :
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return getattr(self._logcursor, v)
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __next__(self) :
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = getattr(self._logcursor, "next")()
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = (v[0], v[1].decode(charset))
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        next = __next__
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def first(self) :
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._logcursor.first()
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = (v[0], v[1].decode(charset))
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def last(self) :
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._logcursor.last()
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = (v[0], v[1].decode(charset))
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def prev(self) :
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._logcursor.prev()
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = (v[0], v[1].decode(charset))
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def current(self) :
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._logcursor.current()
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = (v[0], v[1].decode(charset))
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def set(self, lsn) :
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._logcursor.set(lsn)
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = (v[0], v[1].decode(charset))
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class cursor_py3k(object) :
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __init__(self, db, *args, **kwargs) :
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._dbcursor = db.cursor(*args, **kwargs)
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __getattr__(self, v) :
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return getattr(self._dbcursor, v)
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def _fix(self, v) :
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is None : return None
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            key, value = v
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, bytes) :
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = key.decode(charset)
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return (key, value.decode(charset))
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __next__(self) :
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = getattr(self._dbcursor, "next")()
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._fix(v)
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        next = __next__
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def previous(self) :
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._dbcursor.previous()
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._fix(v)
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def last(self) :
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._dbcursor.last()
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._fix(v)
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def set(self, k) :
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(k, str) :
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                k = bytes(k, charset)
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._dbcursor.set(k)
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._fix(v)
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def set_recno(self, num) :
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._dbcursor.set_recno(num)
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._fix(v)
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def set_range(self, k, dlen=-1, doff=-1) :
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(k, str) :
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                k = bytes(k, charset)
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._dbcursor.set_range(k, dlen=dlen, doff=doff)
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._fix(v)
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def dup(self, flags=0) :
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cursor = self._dbcursor.dup(flags)
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return dup_cursor_py3k(cursor)
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def next_dup(self) :
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._dbcursor.next_dup()
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._fix(v)
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def next_nodup(self) :
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._dbcursor.next_nodup()
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._fix(v)
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def put(self, key, data, flags=0, dlen=-1, doff=-1) :
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, str) :
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = bytes(key, charset)
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(data, str) :
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                value = bytes(data, charset)
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._dbcursor.put(key, data, flags=flags, dlen=dlen,
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    doff=doff)
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def current(self, flags=0, dlen=-1, doff=-1) :
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._dbcursor.current(flags=flags, dlen=dlen, doff=doff)
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._fix(v)
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def first(self) :
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._dbcursor.first()
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._fix(v)
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def pget(self, key=None, data=None, flags=0) :
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Incorrect because key can be a bare number,
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # but enough to pass testsuite
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, int) and (data is None) and (flags == 0) :
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                flags = key
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = None
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, str) :
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = bytes(key, charset)
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(data, int) and (flags==0) :
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                flags = data
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                data = None
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(data, str) :
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                data = bytes(data, charset)
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v=self._dbcursor.pget(key=key, data=data, flags=flags)
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v1, v2, v3 = v
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(v1, bytes) :
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    v1 = v1.decode(charset)
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(v2, bytes) :
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    v2 = v2.decode(charset)
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = (v1, v2, v3.decode(charset))
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def join_item(self) :
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._dbcursor.join_item()
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = v.decode(charset)
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get(self, *args, **kwargs) :
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            l = len(args)
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if l == 2 :
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                k, f = args
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(k, str) :
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    k = bytes(k, "iso8859-1")
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                args = (k, f)
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif l == 3 :
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                k, d, f = args
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(k, str) :
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    k = bytes(k, charset)
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(d, str) :
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    d = bytes(d, charset)
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                args =(k, d, f)
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._dbcursor.get(*args, **kwargs)
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                k, v = v
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(k, bytes) :
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    k = k.decode(charset)
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = (k, v.decode(charset))
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get_both(self, key, value) :
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, str) :
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = bytes(key, charset)
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(value, str) :
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                value = bytes(value, charset)
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v=self._dbcursor.get_both(key, value)
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._fix(v)
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class dup_cursor_py3k(cursor_py3k) :
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __init__(self, dbcursor) :
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._dbcursor = dbcursor
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class DB_py3k(object) :
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __init__(self, *args, **kwargs) :
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            args2=[]
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for i in args :
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(i, DBEnv_py3k) :
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    i = i._dbenv
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                args2.append(i)
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            args = tuple(args2)
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for k, v in kwargs.items() :
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(v, DBEnv_py3k) :
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    kwargs[k] = v._dbenv
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._db = bsddb._db.DB_orig(*args, **kwargs)
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __contains__(self, k) :
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(k, str) :
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                k = bytes(k, charset)
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return getattr(self._db, "has_key")(k)
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __getitem__(self, k) :
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(k, str) :
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                k = bytes(k, charset)
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v = self._db[k]
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = v.decode(charset)
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __setitem__(self, k, v) :
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(k, str) :
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                k = bytes(k, charset)
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(v, str) :
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = bytes(v, charset)
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._db[k] = v
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __delitem__(self, k) :
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(k, str) :
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                k = bytes(k, charset)
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            del self._db[k]
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __getattr__(self, v) :
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return getattr(self._db, v)
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __len__(self) :
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return len(self._db)
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def has_key(self, k, txn=None) :
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(k, str) :
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                k = bytes(k, charset)
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._db.has_key(k, txn=txn)
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def set_re_delim(self, c) :
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(c, str) :  # We can use a numeric value byte too
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                c = bytes(c, charset)
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._db.set_re_delim(c)
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def set_re_pad(self, c) :
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(c, str) :  # We can use a numeric value byte too
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                c = bytes(c, charset)
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._db.set_re_pad(c)
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get_re_source(self) :
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            source = self._db.get_re_source()
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return source.decode(charset)
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def put(self, key, data, txn=None, flags=0, dlen=-1, doff=-1) :
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, str) :
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = bytes(key, charset)
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(data, str) :
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                value = bytes(data, charset)
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._db.put(key, data, flags=flags, txn=txn, dlen=dlen,
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    doff=doff)
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def append(self, value, txn=None) :
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(value, str) :
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                value = bytes(value, charset)
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._db.append(value, txn=txn)
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get_size(self, key) :
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, str) :
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = bytes(key, charset)
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._db.get_size(key)
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def exists(self, key, *args, **kwargs) :
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, str) :
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = bytes(key, charset)
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._db.exists(key, *args, **kwargs)
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get(self, key, default="MagicCookie", txn=None, flags=0, dlen=-1, doff=-1) :
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, str) :
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = bytes(key, charset)
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if default != "MagicCookie" :  # Magic for 'test_get_none.py'
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v=self._db.get(key, default=default, txn=txn, flags=flags,
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        dlen=dlen, doff=doff)
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else :
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v=self._db.get(key, txn=txn, flags=flags,
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        dlen=dlen, doff=doff)
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if (v is not None) and isinstance(v, bytes) :
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = v.decode(charset)
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def pget(self, key, txn=None) :
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, str) :
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = bytes(key, charset)
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v=self._db.pget(key, txn=txn)
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v1, v2 = v
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(v1, bytes) :
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    v1 = v1.decode(charset)
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = (v1, v2.decode(charset))
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get_both(self, key, value, txn=None, flags=0) :
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, str) :
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = bytes(key, charset)
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(value, str) :
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                value = bytes(value, charset)
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            v=self._db.get_both(key, value, txn=txn, flags=flags)
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if v is not None :
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = v.decode(charset)
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return v
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def delete(self, key, txn=None) :
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(key, str) :
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                key = bytes(key, charset)
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._db.delete(key, txn=txn)
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def keys(self) :
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            k = self._db.keys()
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if len(k) and isinstance(k[0], bytes) :
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return [i.decode(charset) for i in self._db.keys()]
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else :
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return k
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def items(self) :
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            data = self._db.items()
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not len(data) : return data
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            data2 = []
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for k, v in data :
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(k, bytes) :
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    k = k.decode(charset)
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                data2.append((k, v.decode(charset)))
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return data2
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def associate(self, secondarydb, callback, flags=0, txn=None) :
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            class associate_callback(object) :
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                def __init__(self, callback) :
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self._callback = callback
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                def callback(self, key, data) :
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if isinstance(key, str) :
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        key = key.decode(charset)
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    data = data.decode(charset)
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    key = self._callback(key, data)
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if (key != bsddb._db.DB_DONOTINDEX) :
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        if isinstance(key, str) :
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            key = bytes(key, charset)
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        elif isinstance(key, list) :
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            key2 = []
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            for i in key :
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                if isinstance(i, str) :
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                    i = bytes(i, charset)
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                key2.append(i)
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            key = key2
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return key
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._db.associate(secondarydb._db,
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    associate_callback(callback).callback, flags=flags,
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    txn=txn)
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def cursor(self, txn=None, flags=0) :
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return cursor_py3k(self._db, txn=txn, flags=flags)
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def join(self, cursor_list) :
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cursor_list = [i._dbcursor for i in cursor_list]
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return dup_cursor_py3k(self._db.join(cursor_list))
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class DBEnv_py3k(object) :
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __init__(self, *args, **kwargs) :
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._dbenv = bsddb._db.DBEnv_orig(*args, **kwargs)
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __getattr__(self, v) :
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return getattr(self._dbenv, v)
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def log_cursor(self, flags=0) :
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return logcursor_py3k(self._dbenv)
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get_lg_dir(self) :
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._dbenv.get_lg_dir().decode(charset)
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get_tmp_dir(self) :
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._dbenv.get_tmp_dir().decode(charset)
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get_data_dirs(self) :
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return tuple(
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                (i.decode(charset) for i in self._dbenv.get_data_dirs()))
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class DBSequence_py3k(object) :
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __init__(self, db, *args, **kwargs) :
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._db=db
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._dbsequence = bsddb._db.DBSequence_orig(db._db, *args, **kwargs)
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __getattr__(self, v) :
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return getattr(self._dbsequence, v)
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def open(self, key, *args, **kwargs) :
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._dbsequence.open(bytes(key, charset), *args, **kwargs)
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get_key(self) :
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return  self._dbsequence.get_key().decode(charset)
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def get_dbp(self) :
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._db
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import string
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    string.letters=[chr(i) for i in xrange(65,91)]
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    bsddb._db.DBEnv_orig = bsddb._db.DBEnv
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    bsddb._db.DB_orig = bsddb._db.DB
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if bsddb.db.version() <= (4, 3) :
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        bsddb._db.DBSequence_orig = None
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else :
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        bsddb._db.DBSequence_orig = bsddb._db.DBSequence
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_proxy_db_py3k(flag) :
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        flag2 = do_proxy_db_py3k.flag
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        do_proxy_db_py3k.flag = flag
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if flag :
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bsddb.DBEnv = bsddb.db.DBEnv = bsddb._db.DBEnv = DBEnv_py3k
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bsddb.DB = bsddb.db.DB = bsddb._db.DB = DB_py3k
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bsddb._db.DBSequence = DBSequence_py3k
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else :
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bsddb.DBEnv = bsddb.db.DBEnv = bsddb._db.DBEnv = bsddb._db.DBEnv_orig
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bsddb.DB = bsddb.db.DB = bsddb._db.DB = bsddb._db.DB_orig
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bsddb._db.DBSequence = bsddb._db.DBSequence_orig
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return flag2
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_proxy_db_py3k.flag = False
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_proxy_db_py3k(True)
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # For Pythons w/distutils pybsddb
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from bsddb3 import db, dbtables, dbutils, dbshelve, \
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            hashopen, btopen, rnopen, dbobj
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError:
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # For Python 2.3
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from bsddb import db, dbtables, dbutils, dbshelve, \
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            hashopen, btopen, rnopen, dbobj
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from bsddb3 import test_support
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError:
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if sys.version_info[0] < 3 :
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from test import test_support
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else :
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from test import support as test_support
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if sys.version_info[0] < 3 :
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from threading import Thread, currentThread
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del Thread, currentThread
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else :
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from threading import Thread, current_thread
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del Thread, current_thread
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    have_threads = True
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError:
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    have_threads = False
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoverbose = 0
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif 'verbose' in sys.argv:
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    verbose = 1
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    sys.argv.remove('verbose')
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif 'silent' in sys.argv:  # take care of old flag, just in case
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    verbose = 0
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    sys.argv.remove('silent')
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef print_versions():
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print '-=' * 38
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print db.DB_VERSION_STRING
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print 'bsddb.db.version():   %s' % (db.version(), )
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if db.version() >= (5, 0) :
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print 'bsddb.db.full_version(): %s' %repr(db.full_version())
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print 'bsddb.db.__version__: %s' % db.__version__
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print 'bsddb.db.cvsid:       %s' % db.cvsid
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Workaround for allowing generating an EGGs as a ZIP files.
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    suffix="__"
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print 'py module:            %s' % getattr(bsddb, "__file"+suffix)
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print 'extension module:     %s' % getattr(bsddb, "__file"+suffix)
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print 'python version:       %s' % sys.version
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print 'My pid:               %s' % os.getpid()
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print '-=' * 38
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef get_new_path(name) :
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    get_new_path.mutex.acquire()
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try :
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import os
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        path=os.path.join(get_new_path.prefix,
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                name+"_"+str(os.getpid())+"_"+str(get_new_path.num))
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        get_new_path.num+=1
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    finally :
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        get_new_path.mutex.release()
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return path
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef get_new_environment_path() :
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    path=get_new_path("environment")
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import os
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        os.makedirs(path,mode=0700)
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except os.error:
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_support.rmtree(path)
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        os.makedirs(path)
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return path
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef get_new_database_path() :
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    path=get_new_path("database")
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import os
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if os.path.exists(path) :
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        os.remove(path)
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return path
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# This path can be overriden via "set_test_path_prefix()".
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os, os.path
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoget_new_path.prefix=os.path.join(os.environ.get("TMPDIR",
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    os.path.join(os.sep,"tmp")), "z-Berkeley_DB")
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoget_new_path.num=0
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef get_test_path_prefix() :
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return get_new_path.prefix
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef set_test_path_prefix(path) :
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    get_new_path.prefix=path
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef remove_test_path_directory() :
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_support.rmtree(get_new_path.prefix)
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif have_threads :
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import threading
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    get_new_path.mutex=threading.Lock()
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    del threading
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelse :
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class Lock(object) :
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def acquire(self) :
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def release(self) :
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    get_new_path.mutex=Lock()
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    del Lock
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass PrintInfoFakeTest(unittest.TestCase):
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testPrintVersions(self):
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print_versions()
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# This little hack is for when this module is run as main and all the
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# other modules import it so they will still be able to get the right
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# verbose setting.  It's confusing but it works.
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif sys.version_info[0] < 3 :
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import test_all
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_all.verbose = verbose
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelse :
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import sys
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print >>sys.stderr, "Work to do!"
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef suite(module_prefix='', timing_check=None):
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_modules = [
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_associate',
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_basics',
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_dbenv',
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_db',
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_compare',
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_compat',
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_cursor_pget_bug',
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_dbobj',
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_dbshelve',
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_dbtables',
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_distributed_transactions',
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_early_close',
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_fileid',
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_get_none',
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_join',
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_lock',
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_misc',
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_pickle',
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_queue',
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_recno',
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_replication',
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_sequence',
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'test_thread',
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ]
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    alltests = unittest.TestSuite()
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for name in test_modules:
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #module = __import__(name)
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Do it this way so that suite may be called externally via
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # python's Lib/test/test_bsddb3.
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        module = __import__(module_prefix+name, globals(), locals(), name)
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        alltests.addTest(module.test_suite())
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if timing_check:
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            alltests.addTest(unittest.makeSuite(timing_check))
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return alltests
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_suite():
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    suite = unittest.TestSuite()
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    suite.addTest(unittest.makeSuite(PrintInfoFakeTest))
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return suite
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == '__main__':
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print_versions()
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    unittest.main(defaultTest='suite')
624