# Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

import copy
from portage.cache import template


class database(template.database):

    autocommits = True
    serialize_eclasses = False
    store_eclass_paths = False

    def __init__(self, *args, **config):
        config.pop("gid", None)
        config.pop("perms", None)
        super(database, self).__init__(*args, **config)
        self._data = {}
        self._delitem = self._data.__delitem__

    def _setitem(self, name, values):
        self._data[name] = copy.deepcopy(values)

    def __getitem__(self, cpv):
        return copy.deepcopy(self._data[cpv])

    def __iter__(self):
        return iter(self._data)

    def __contains__(self, key):
        return key in self._data
