"""Generic interface to all dbm clones.

Instead of

	import dbm
	d = dbm.open(file, 'w', 0666)

use

	import anydbm
	d = anydbm.open(file, 'w')

The returned object is a dbhash, gdbm, dbm or dumbdbm object,
dependent on the type of database being opened (determined by whichdb
module) in the case of an existing dbm. If the dbm does not exist and
the create or new flag ('c' or 'n') was specified, the dbm type will
be determined by the availability of the modules (tested in the above
order).

It has the following interface (key and data are strings):

	d[key] = data	# store data at key (may override data at
			# existing key)
	data = d[key]	# retrieve data at key (raise KeyError if no
			# such key)
	del d[key]	# delete data stored at key (raises KeyError
			# if no such key)
	flag = d.has_key(key)	# true if the key exists
	list = d.keys()	# return a list of all existing keys (slow!)

Future versions may change the order in which implementations are
tested for existence, add interfaces to other dbm-like
implementations.

The open function has an optional second argument.  This can be 'r',
for read-only access, 'w', for read-write access of an existing
database, 'n' or 'c' for read-write access to a new database.  The
default is 'r'.

Note: the difference between 'w' and 'n' is that 'w' fails if the
database doesn't already exist.  There appears to be no difference
between 'n' and 'c'.

"""

try:
	class error(Exception):
		pass
except:
	error = "anydbm.error"

_names = ['dbhash', 'gdbm', 'dbm', 'dumbdbm']
_errors = [error]
_defaultmod = None

for _name in _names:
	try:
		_mod = __import__(_name)
	except ImportError:
		continue
	if not _defaultmod:
		_defaultmod = _mod
	_errors.append(_mod.error)

if not _defaultmod:
	raise ImportError, "no dbm clone found; tried %s" % _names

error = tuple(_errors)

def open(file, flag = 'r', mode = 0666):
	# guess the type of an existing database
	from whichdb import whichdb
	result=whichdb(file)
	if result is None:
		# db doesn't exist
		if 'c' in flag or 'n' in flag:
			# file doesn't exist and the new
			# flag was used so use default type
			mod = _defaultmod
		else:
			raise error, "need 'c' or 'n' flag to open new db"
	elif result == "":
		# db type cannot be determined
		raise error, "db type could not be determined"
	else:
		mod = __import__(result)
	return mod.open(file, flag, mode)
