14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""Generic interface to all dbm clones.
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoInstead of
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import dbm
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = dbm.open(file, 'w', 0666)
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaouse
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import anydbm
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = anydbm.open(file, 'w')
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
134adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThe returned object is a dbhash, gdbm, dbm or dumbdbm object,
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodependent on the type of database being opened (determined by whichdb
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaomodule) in the case of an existing dbm. If the dbm does not exist and
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaothe create or new flag ('c' or 'n') was specified, the dbm type will
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaobe determined by the availability of the modules (tested in the above
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoorder).
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
204adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIt has the following interface (key and data are strings):
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d[key] = data   # store data at key (may override data at
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # existing key)
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        data = d[key]   # retrieve data at key (raise KeyError if no
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # such key)
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del d[key]      # delete data stored at key (raises KeyError
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # if no such key)
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        flag = key in d   # true if the key exists
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        list = d.keys() # return a list of all existing keys (slow!)
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
314adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoFuture versions may change the order in which implementations are
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotested for existence, and add interfaces to other dbm-like
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimplementations.
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass error(Exception):
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_names = ['dbhash', 'gdbm', 'dbm', 'dumbdbm']
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_errors = [error]
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_defaultmod = None
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofor _name in _names:
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        _mod = __import__(_name)
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except ImportError:
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        continue
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not _defaultmod:
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        _defaultmod = _mod
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _errors.append(_mod.error)
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif not _defaultmod:
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    raise ImportError, "no dbm clone found; tried %s" % _names
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoerror = tuple(_errors)
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef open(file, flag='r', mode=0666):
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Open or create database at path given by *file*.
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Optional argument *flag* can be 'r' (default) for read-only access, 'w'
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for read-write access of an existing database, 'c' for read-write access
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    to a new or existing database, and 'n' for read-write access to a new
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    database.
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Note: 'r' and 'w' fail if the database doesn't exist; 'c' creates it
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    only if it doesn't exist; and 'n' always creates a new database.
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # guess the type of an existing database
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from whichdb import whichdb
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    result=whichdb(file)
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if result is None:
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # db doesn't exist
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if 'c' in flag or 'n' in flag:
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # file doesn't exist and the new
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # flag was used so use default type
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            mod = _defaultmod
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise error, "need 'c' or 'n' flag to open new db"
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    elif result == "":
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # db type cannot be determined
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise error, "db type could not be determined"
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mod = __import__(result)
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return mod.open(file, flag, mode)
86