~unity-2d-team/unity-2d/Shell-MultiMonitor

« back to all changes in this revision

Viewing changes to grackle/server/model.py

  • Committer: William Grant
  • Date: 2012-01-22 06:41:06 UTC
  • Revision ID: william.grant@canonical.com-20120122064106-6at8ool919624m0z
Let the HTTP client decide count and order (to an extent).

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
    TIME_UUID_TYPE,
29
29
    )
30
30
 
31
 
from grackle.cassandra import workaround_1779
32
 
 
33
 
 
34
 
def create_schema(host, keyspace, clobber=False, create_keyspace=False):
 
31
from grackle.server.cassandra import workaround_1779
 
32
 
 
33
 
 
34
def create_schema(host, keyspace, clobber=False):
35
35
    mgr = SystemManager(host)
36
36
 
37
 
    if create_keyspace:
38
 
        mgr.create_keyspace(keyspace, replication_factor=1)
39
 
 
40
37
    if clobber:
41
38
        for cf in mgr.get_keyspace_column_families(keyspace):
42
39
            mgr.drop_column_family(keyspace, cf)
54
51
        mgr.close()
55
52
 
56
53
 
57
 
def _parse_message(message):
58
 
    """Get a date and dict of an RFC822 message."""
59
 
    parsed = email.parser.Parser().parsestr(message)
60
 
    message_dict = {}
61
 
 
62
 
    for key in ('from', 'to', 'subject', 'message-id'):
63
 
        value = parsed.get(key, None)
64
 
        if value is not None:
65
 
            message_dict[key] = value
66
 
 
67
 
    date = parsed.get('date')
68
 
    if date is not None:
69
 
        try:
70
 
            pdate = parsedate_tz(date)
71
 
            date = datetime.datetime(
72
 
                *pdate[:6],
73
 
                tzinfo=dateutil.tz.tzoffset('', pdate[9]))
74
 
        except ValueError:
75
 
            pass
76
 
    message_dict['date'] = date.isoformat() if date is not None else None
77
 
 
78
 
    return date, message_dict
79
 
 
80
 
 
81
54
class CassandraConnection(object):
82
55
 
83
56
    def __init__(self, keyspace, host):
95
68
 
96
69
    def add_message(self, archive_uuid, message):
97
70
        message_uuid = uuid.uuid4()
98
 
        message_date, message_dict = _parse_message(message)
99
 
        message_dict['content'] = message
100
 
        message_dict['date_created'] = (
101
 
            datetime.datetime.utcnow().isoformat() + 'Z')
102
 
        self.messages.insert(message_uuid, message_dict)
 
71
        parsed = email.parser.Parser().parsestr(message)
 
72
        date = parsed.get('date')
 
73
        if date is not None:
 
74
            try:
 
75
                pdate = parsedate_tz(date)
 
76
                date = datetime.datetime(
 
77
                    *pdate[:6],
 
78
                    tzinfo=dateutil.tz.tzoffset('', pdate[9]))
 
79
            except ValueError:
 
80
                pass
 
81
        self.messages.insert(
 
82
            message_uuid,
 
83
            {'date_created': datetime.datetime.utcnow().isoformat() + 'Z',
 
84
             'content': message,
 
85
             'from': parsed.get('From'),
 
86
             'subject': parsed.get('Subject'),
 
87
             'date': date.isoformat() if date is not None else None,
 
88
             'message_id': parsed.get('Message-ID'),
 
89
             })
103
90
        self.archive_messages.insert(
104
91
            archive_uuid,
105
 
            {message_date.astimezone(dateutil.tz.tzutc()): message_uuid})
 
92
            {date.astimezone(dateutil.tz.tzutc()): message_uuid})
106
93
        logging.debug(
107
 
            'Imported %s into %s'
108
 
            % (message_dict.get('message-id', None), archive_uuid))
 
94
            'Imported %s into %s' % (parsed.get('Message-ID'), archive_uuid))
109
95
        return message_uuid
110
96
 
111
97
    def _format_message(self, message):
112
98
        return {
113
 
            'date': message.get('date'),
114
 
            'from': message.get('from'),
115
 
            'subject': message.get('subject'),
116
 
            'message-id': message.get('message-id'),
 
99
            'date': message['date'],
 
100
            'from': message['from'],
 
101
            'subject': message['subject'],
117
102
            }
118
103
 
119
 
    def _trim(self, sequence, end):
120
 
        if end:
121
 
            return sequence[:-1]
122
 
        else:
123
 
            return sequence[1:]
124
 
 
125
 
    def get_messages(self, archive_uuid, order, count, memo, backward=False):
 
104
    def get_messages(self, archive_uuid, count, order):
126
105
        if order in ("date", "-date"):
127
106
            reversed = order[0] == '-'
128
107
        else:
129
108
            raise AssertionError("Unsupported order.")
130
 
        if memo != '':
131
 
            memo = uuid.UUID(memo)
132
 
        # Get up to n+1 messages from the memo: the last item of the
133
 
        # previous batch (because that's where the memo starts) + this
134
 
        # batch.
135
 
        if backward:
136
 
            start = ''
137
 
            finish = memo
138
 
        else:
139
 
            start = memo
140
 
            finish = ''
141
 
        pairs = self.archive_messages.get(
142
 
            archive_uuid, column_count=count + 1, column_start=start,
143
 
            column_finish=finish, column_reversed=reversed).items()
144
 
        if memo and len(pairs) and pairs[0][0] <= memo:
145
 
            pairs = self._trim(pairs, False ^ backward)
146
 
        elif len(pairs) > count:
147
 
            pairs = self._trim(pairs, True ^ backward)
148
 
 
149
 
        if len(pairs) == 0:
150
 
            return (None, [], None)
151
 
 
152
 
        assert 0 < len(pairs) <= count
153
 
 
154
 
        ids = [v for k, v in pairs]
155
 
        messages = self.messages.multiget(
156
 
            ids, columns=['date', 'from', 'subject', 'message-id'])
157
 
 
158
 
        return (
159
 
            str(pairs[0][0]),
160
 
            [self._format_message(messages[id]) for id in ids],
161
 
            str(pairs[-1][0]),
162
 
            )
 
109
        ids = self.archive_messages.get(
 
110
            archive_uuid, column_count=count,
 
111
            column_reversed=reversed).values()
 
112
        messages = self.messages.multiget(ids)
 
113
        return [self._format_message(messages[id]) for id in ids]