Merge lp:~eday/burrow/backend-unittests into lp:burrow

Proposed by Eric Day
Status: Merged
Approved by: Eric Day
Approved revision: 22
Merged at revision: 26
Proposed branch: lp:~eday/burrow/backend-unittests
Merge into: lp:burrow
Diff against target: 227 lines (+155/-20)
3 files modified
burrow/backend/sqlite.py (+134/-17)
test/backend/test_memory.py (+0/-3)
test/backend/test_sqlite.py (+21/-0)
To merge this branch: bzr merge lp:~eday/burrow/backend-unittests
Reviewer Review Type Date Requested Status
Burrow Core Team Pending
Review via email: mp+68891@code.launchpad.net

Description of the change

Rewrote account/queue handling for SQLite backend.

To post a comment you must log in.
lp:~eday/burrow/backend-unittests updated
23. By Eric Day

Merged trunk.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'burrow/backend/sqlite.py'
2--- burrow/backend/sqlite.py 2011-07-15 06:11:46 +0000
3+++ burrow/backend/sqlite.py 2011-07-22 18:31:22 +0000
4@@ -54,39 +54,156 @@
5 if len(filters) == 0:
6 self.db.execute('DELETE FROM queues')
7 self.db.execute('DELETE FROM messages')
8- return []
9- return []
10+ return
11+ query = 'SELECT rowid,account FROM queues'
12+ values = tuple()
13+ marker = filters.get('marker', None)
14+ if marker is not None:
15+ query += ' WHERE account >= ?'
16+ values += (marker,)
17+ limit = filters.get('limit', None)
18+ detail = self._get_detail(filters, 'id')
19+ current_account = None
20+ ids = []
21+ marker_found = False
22+ for row in self.db.execute(query, values):
23+ if marker == row[1]:
24+ marker_found = True
25+ continue
26+ elif marker is not None and not marker_found:
27+ break
28+ if current_account != row[1]:
29+ if limit is not None:
30+ if limit == 0:
31+ break
32+ limit -= 1
33+ current_account = row[1]
34+ if detail is 'id':
35+ yield row[1]
36+ elif detail is 'all':
37+ yield dict(id=row[1])
38+ ids.append(row[0])
39+ if len(ids) == 999:
40+ self._delete_queues(ids)
41+ ids = []
42+ if marker is not None and not marker_found:
43+ filters = dict(filters)
44+ filters.pop('marker')
45+ for account in self.delete_accounts(filters):
46+ yield account
47+ if len(ids) > 0:
48+ self._delete_queues(ids)
49
50 def get_accounts(self, filters={}):
51 query = 'SELECT DISTINCT account FROM queues'
52 values = tuple()
53+ limit = filters.get('limit', None)
54 marker = filters.get('marker', None)
55 if marker is not None:
56- query += ' WHERE account > ?'
57+ query += ' WHERE account >= ?'
58 values += (marker,)
59- limit = filters.get('limit', None)
60+ if limit is not None:
61+ limit += 1
62 if limit is not None:
63 query += ' LIMIT ?'
64 values += (limit,)
65+ detail = self._get_detail(filters, 'id')
66+ marker_found = False
67 for row in self.db.execute(query, values):
68- yield row[0]
69+ if marker == row[0]:
70+ marker_found = True
71+ continue
72+ elif marker is not None and not marker_found:
73+ break
74+ if detail is 'id':
75+ yield row[0]
76+ elif detail is 'all':
77+ yield dict(id=row[0])
78+ if marker is not None and not marker_found:
79+ filters = dict(filters)
80+ filters.pop('marker')
81+ for account in self.get_accounts(filters):
82+ yield account
83
84 def delete_queues(self, account, filters={}):
85- query = 'SELECT rowid FROM queues WHERE account=?'
86+ query = 'SELECT rowid,queue FROM queues WHERE account=?'
87+ values = (account,)
88+ query, values, marker = self._add_queue_filters(query, values, filters)
89+ detail = self._get_detail(filters, None)
90 ids = []
91- for row in self.db.execute(query, (account,)):
92- ids.append(str(row[0]))
93- if len(ids) == 0:
94- return []
95- query = 'DELETE FROM messages WHERE queue IN (%s)'
96- self.db.execute(query % ','.join(ids))
97- self.db.execute('DELETE FROM queues WHERE account=?', (account,))
98- return []
99+ marker_found = False
100+ for row in self.db.execute(query, values):
101+ if marker == row[1]:
102+ marker_found = True
103+ continue
104+ elif marker is not None and not marker_found:
105+ break
106+ if detail is 'id':
107+ yield row[1]
108+ elif detail is 'all':
109+ yield dict(id=row[1])
110+ ids.append(row[0])
111+ if len(ids) == 999:
112+ self._delete_queues(ids)
113+ ids = []
114+ if marker is not None and not marker_found:
115+ filters = dict(filters)
116+ filters.pop('marker')
117+ for queue in self.delete_queues(account, filters):
118+ yield queue
119+ if len(ids) > 0:
120+ self._delete_queues(ids)
121
122 def get_queues(self, account, filters={}):
123 query = 'SELECT queue FROM queues WHERE account=?'
124- for row in self.db.execute(query, (account,)):
125- yield row[0]
126+ values = (account,)
127+ query, values, marker = self._add_queue_filters(query, values, filters)
128+ detail = self._get_detail(filters, 'id')
129+ marker_found = False
130+ for row in self.db.execute(query, values):
131+ if marker == row[0]:
132+ marker_found = True
133+ continue
134+ elif marker is not None and not marker_found:
135+ break
136+ if detail is 'id':
137+ yield row[0]
138+ elif detail is 'all':
139+ yield dict(id=row[0])
140+ if marker is not None and not marker_found:
141+ filters = dict(filters)
142+ filters.pop('marker')
143+ for queue in self.get_queues(account, filters):
144+ yield queue
145+
146+ def _add_queue_filters(self, query, values, filters):
147+ limit = filters.get('limit', None)
148+ marker = filters.get('marker', None)
149+ if marker is not None:
150+ query += ' AND queue >= ?'
151+ values += (marker,)
152+ if limit is not None:
153+ limit += 1
154+ if limit is not None:
155+ query += ' LIMIT ?'
156+ values += (limit,)
157+ return query, values, marker
158+
159+ def _delete_queues(self, ids):
160+ query = 'DELETE FROM messages WHERE queue IN (?' + \
161+ (',?' * (len(ids) - 1)) + ')'
162+ self.db.execute(query, tuple(ids))
163+ query = 'DELETE FROM queues WHERE rowid IN (?' + \
164+ (',?' * (len(ids) - 1)) + ')'
165+ self.db.execute(query, tuple(ids))
166+
167+ def _get_detail(self, filters, default=None):
168+ detail = filters.get('detail', default)
169+ if detail is 'none':
170+ detail = None
171+ elif detail is not None and detail not in ['id', 'all']:
172+ raise burrow.backend.BadDetail(detail)
173+ return detail
174
175 def delete_messages(self, account, queue, filters={}):
176 result = self._get_messages(account, queue, filters)
177@@ -148,7 +265,7 @@
178 self.db.execute(query % ','.join('?' * len(ids)), values)
179 self.notify(account, queue)
180
181- def create_message(self, account, queue, message, body, attributes):
182+ def create_message(self, account, queue, message, body, attributes={}):
183 query = "SELECT rowid FROM queues " \
184 "WHERE account='%s' AND queue='%s'" % (account, queue)
185 result = self.db.execute(query).fetchall()
186
187=== modified file 'test/backend/test_memory.py'
188--- test/backend/test_memory.py 2011-07-14 22:34:10 +0000
189+++ test/backend/test_memory.py 2011-07-22 18:31:22 +0000
190@@ -13,11 +13,8 @@
191 # limitations under the License.
192
193 import ConfigParser
194-import time
195 import unittest
196
197-import eventlet
198-
199 import burrow.backend.memory
200
201
202
203=== added file 'test/backend/test_sqlite.py'
204--- test/backend/test_sqlite.py 1970-01-01 00:00:00 +0000
205+++ test/backend/test_sqlite.py 2011-07-22 18:31:22 +0000
206@@ -0,0 +1,21 @@
207+# Copyright (C) 2011 OpenStack LLC.
208+#
209+# Licensed under the Apache License, Version 2.0 (the "License");
210+# you may not use this file except in compliance with the License.
211+# You may obtain a copy of the License at
212+#
213+# http://www.apache.org/licenses/LICENSE-2.0
214+#
215+# Unless required by applicable law or agreed to in writing, software
216+# distributed under the License is distributed on an "AS IS" BASIS,
217+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
218+# See the License for the specific language governing permissions and
219+# limitations under the License.
220+
221+import burrow.backend.sqlite
222+import test.backend.test_memory
223+
224+
225+class TestSQLite(test.backend.test_memory.TestMemory):
226+ '''Unittests for the SQLite backend.'''
227+ backend_class = burrow.backend.sqlite.Backend

Subscribers

People subscribed via source and target branches