""" A dbm clone using sqlite under the covers. XXX TO DO: Everything. """ import sqlite3 import collections __all__ = ["error", "open"] error = sqlite3.OperationalError class _Database(collections.MutableMapping): def __init__(self, filename, mode): self._mode = mode self._filename = filename self._conn = sqlite3.connect(filename) self.initialize_table() def initialize_table(self): c = self._conn.cursor() try: c.execute("select count(key) from dict") except sqlite3.OperationalError: c.execute("""create table dict (key text, value text)""") self._conn.commit() finally: c.close() def __getitem__(self, key): c = self._conn.cursor() try: c.execute("select value from dict" " where key = ?", (key,)) rows = list(c) if not rows: raise KeyError(key) return rows[0][0] finally: c.close() def __setitem__(self, key, val): del self[key] c = self._conn.cursor() try: c.execute("insert into dict" " (key, value) values (?, ?)", (key, val)) self._conn.commit() finally: c.close() def __delitem__(self, key): c = self._conn.cursor() try: c.execute("delete from dict where key = ?", (key,)) self._conn.commit() finally: c.close() def keys(self): c = self._conn.cursor() try: c.execute("select key from dict order by key") return [e[0] for e in c] finally: c.close() def values(self): c = self._conn.cursor() try: c.execute("select value from dict order by key") return [e[0] for e in c] finally: c.close() def items(self): c = self._conn.cursor() try: c.execute("select key, value from dict order by key") return list(c) finally: c.close() def __contains__(self, key): c = self._conn.cursor() try: c.execute("select value from dict" " where key = ?", (key,)) return not not list(c) finally: c.close() def iterkeys(self): return iter(self.keys()) __iter__ = iterkeys def iteritems(self): return iter(self.items()) def itervalues(self): return iter(self.values()) def __len__(self): c = self._conn.cursor() try: c.execute("select count(key) from dict") return int(list(c)[0]) finally: c.close() def close(self): if self._conn is not None: self._conn.close() self._conn = None def open(file, flag=None, mode=0o666): return _Database(file, mode)