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