~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/canonical/database/enumcol.py

  • Committer: Launchpad Patch Queue Manager
  • Date: 2011-10-06 01:24:37 UTC
  • mfrom: (14039.1.12 bug-759467)
  • Revision ID: launchpad@pqm.canonical.com-20111006012437-x4xn9cohnyp5ztlx
[r=gmb][bug=759467] [r=gmb][bug=759467] Store
 INCOMPLETE_WITH_RESPONSE and INCOMPLETE_WITHOUT_RESPONSE for BugTask status
 to make queries more efficient.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
    ]
17
17
 
18
18
 
 
19
def check_enum_type(enum):
 
20
    if not issubclass(enum, DBEnumeratedType):
 
21
        raise TypeError(
 
22
            '%r must be a DBEnumeratedType: %r' % (enum, type(enum)))
 
23
 
 
24
 
 
25
def check_type(enum):
 
26
    if type(enum) in (list, tuple):
 
27
        map(check_enum_type, enum)
 
28
    else:
 
29
        check_enum_type(enum)
 
30
 
 
31
 
19
32
class DBEnumVariable(Variable):
20
33
    """A Storm variable class representing a DBEnumeratedType."""
21
34
    __slots__ = ("_enum",)
22
35
 
23
36
    def __init__(self, *args, **kwargs):
24
 
        self._enum = kwargs.pop("enum")
25
 
        if not issubclass(self._enum, DBEnumeratedType):
26
 
            raise TypeError(
27
 
                '%r must be a DBEnumeratedType: %r'
28
 
                % (self._enum, type(self._enum)))
 
37
        enum = kwargs.pop("enum")
 
38
        if type(enum) not in (list, tuple):
 
39
            enum = (enum,)
 
40
        self._enum = enum
 
41
        check_type(self._enum)
29
42
        super(DBEnumVariable, self).__init__(*args, **kwargs)
30
43
 
31
44
    def parse_set(self, value, from_db):
32
45
        if from_db:
33
 
            return self._enum.items[value]
 
46
            for enum in self._enum:
 
47
                try:
 
48
                    return enum.items[value]
 
49
                except KeyError:
 
50
                    pass
 
51
            raise KeyError('%r not in present in any of %r' % (
 
52
                value, self._enum))
34
53
        else:
35
54
            if not zope_isinstance(value, DBItem):
36
55
                raise TypeError("Not a DBItem: %r" % (value,))
37
 
            if self._enum != value.enum:
38
 
                raise TypeError("DBItem from wrong type, %r != %r" % (
39
 
                        self._enum.name, value.enum.name))
 
56
            if value.enum not in self._enum:
 
57
                raise TypeError("DBItem from unknown enum, %r not in %r" % (
 
58
                        value.enum.name, self._enum))
40
59
            return value
41
60
 
42
61
    def parse_get(self, value, to_db):
56
75
            enum = kw.pop('enum')
57
76
        except KeyError:
58
77
            enum = kw.pop('schema')
59
 
        if not issubclass(enum, DBEnumeratedType):
60
 
            raise TypeError(
61
 
                '%r must be a DBEnumeratedType: %r' % (enum, type(enum)))
 
78
        check_type(enum)
62
79
        self._kwargs = {
63
 
            'enum': enum
 
80
            'enum': enum,
64
81
            }
65
82
        super(DBSchemaEnumCol, self).__init__(**kw)
66
83
 
67
84
 
68
85
EnumCol = DBSchemaEnumCol
69
 
 
70
 
 
71