summaryrefslogtreecommitdiff
path: root/mailman/interfaces/database.py
blob: 0bacdaa3adf8fc897ef5597153cc6b4967fcdc83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# Copyright (C) 2007-2008 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
# USA.

"""Interfaces for database interaction.

By providing an object with this interface and declaring it in a package
setup.py file as an entry point in the 'mailman.database' group with the name
'initializer', you can distribute entirely different database layers for
Mailman's back end.
"""

from zope.interface import Interface, Attribute

from mailman.Version import DATABASE_SCHEMA_VERSION
from mailman.interfaces.errors import MailmanError



class DatabaseError(MailmanError):
    """A problem with the database occurred."""


class SchemaVersionMismatchError(DatabaseError):
    """The database schema version number did not match what was expected."""

    def __init__(self, got):
        self._got = got

    def __str__(self):
        return (
            'Incompatible database schema version (got: %d, expected: %d)'
            % (self._got, DATABASE_SCHEMA_VERSION))



class IDatabase(Interface):
    """Database layer interface."""

    def initialize(debug=None):
        """Initialize the database layer, using whatever means necessary.

        :param debug: When None (the default), the configuration file
            determines whether the database layer should have increased
            debugging or not.  When True or False, this overrides the
            configuration file setting.
        """

    def _reset():
        """Reset the database to its pristine state.

        This is only used by the test framework.
        """

    # XXX Eventually we probably need to support a transaction manager
    # interface, e.g. begin(), commit(), abort().  We will probably also need
    # to support a shutdown() method for cleanly disconnecting from the
    # database.sy

    list_manager = Attribute(
        """The IListManager instance provided by the database layer.""")

    user_manager = Attribute(
        """The IUserManager instance provided by the database layer.""")

    message_store = Attribute(
        """The IMessageStore instance provided by the database layer.""")

    pendings = Attribute(
        """The IPending instance provided by the database layer.""")