1 |
commit: f8eb545aa0b268cfd08644b0996a6681359dc0bc |
2 |
Author: Devan Franchini <twitch153 <AT> gentoo <DOT> org> |
3 |
AuthorDate: Mon Feb 29 06:09:27 2016 +0000 |
4 |
Commit: Devan Franchini <twitch153 <AT> gentoo <DOT> org> |
5 |
CommitDate: Mon Feb 29 06:09:29 2016 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/layman.git/commit/?id=f8eb545a |
7 |
|
8 |
Adds error reporting for db read failures |
9 |
|
10 |
If the database back-end fails to be read then layman will properly |
11 |
report it and exit without causing an ugly traceback. |
12 |
|
13 |
layman/db_modules/json_db/json_db.py | 7 +- |
14 |
layman/db_modules/sqlite_db/sqlite_db.py | 121 +++++++++++++++++-------------- |
15 |
layman/db_modules/xml_db/xml_db.py | 21 ++++-- |
16 |
layman/dbbase.py | 12 ++- |
17 |
4 files changed, 95 insertions(+), 66 deletions(-) |
18 |
|
19 |
diff --git a/layman/db_modules/json_db/json_db.py b/layman/db_modules/json_db/json_db.py |
20 |
index 70e41d5..bf88593 100644 |
21 |
--- a/layman/db_modules/json_db/json_db.py |
22 |
+++ b/layman/db_modules/json_db/json_db.py |
23 |
@@ -75,6 +75,10 @@ class DBHandler(object): |
24 |
try: |
25 |
with fileopen(path, 'r') as df: |
26 |
document = df.read() |
27 |
+ except ValueError as error: |
28 |
+ msg = 'JSON DBHanlder - ValueError: %(err)s' % {'err': error} |
29 |
+ self.output.error(msg) |
30 |
+ return False |
31 |
except Exception as error: |
32 |
if not self.ignore_init_read_errors: |
33 |
msg = 'JSON DBHandler - Failed to read the overlay list at'\ |
34 |
@@ -82,7 +86,8 @@ class DBHandler(object): |
35 |
self.output.error(msg) |
36 |
raise error |
37 |
|
38 |
- self.add_new(document, origin=path) |
39 |
+ success = self.add_new(document, origin=path) |
40 |
+ return success |
41 |
|
42 |
|
43 |
def add_new(self, document=None, origin=None): |
44 |
|
45 |
diff --git a/layman/db_modules/sqlite_db/sqlite_db.py b/layman/db_modules/sqlite_db/sqlite_db.py |
46 |
index a3305a7..3585c4a 100644 |
47 |
--- a/layman/db_modules/sqlite_db/sqlite_db.py |
48 |
+++ b/layman/db_modules/sqlite_db/sqlite_db.py |
49 |
@@ -136,6 +136,8 @@ class DBHandler(object): |
50 |
CONFLICT IGNORE )''') |
51 |
|
52 |
connection.commit() |
53 |
+ except sqlite3.DatabaseError as err: |
54 |
+ raise err |
55 |
except Exception as err: |
56 |
msg = 'SQLite DBHandler error; failed to create database.\n'\ |
57 |
'Error was: %(msg)s' % {'msg': err} |
58 |
@@ -152,64 +154,71 @@ class DBHandler(object): |
59 |
overlay_id = None |
60 |
overlay = {} |
61 |
|
62 |
- with self.__connect__(path) as connection: |
63 |
- cursor = connection.cursor() |
64 |
- cursor.execute('''SELECT Overlay_ID, Name, Priority, Status, |
65 |
- Quality, Homepage, IRC, License FROM Overlay''') |
66 |
- overlays_info = cursor.fetchall() |
67 |
- connection.commit() |
68 |
+ try: |
69 |
+ connection = self.__connect__(path) |
70 |
+ except sqlite3.DatabaseError as err: |
71 |
+ msg = 'SQLite DBHandler DatabaseError: %(err)s' % {'err': err} |
72 |
+ self.output.error(msg) |
73 |
+ return False |
74 |
|
75 |
- for overlay_info in overlays_info: |
76 |
- overlay = {} |
77 |
- overlay_id = overlay_info[0] |
78 |
- overlay['name'] = overlay_info[1] |
79 |
- |
80 |
- cursor.execute('''SELECT URL, Type, Branch FROM Overlay_Source |
81 |
- JOIN Overlay USING (Overlay_ID) JOIN Source USING (Source_ID) |
82 |
- WHERE Overlay_ID = ?''', (overlay_id,)) |
83 |
- overlay['source'] = cursor.fetchall() |
84 |
- |
85 |
- cursor.execute('''SELECT Owner_Email, Owner_Name FROM |
86 |
- Overlay_Owner JOIN Overlay USING (Overlay_ID) JOIN Owner USING |
87 |
- (Owner_ID) WHERE Overlay_ID = ?''', (overlay_id,)) |
88 |
- owner_info = cursor.fetchall() |
89 |
- overlay['owner'] = [] |
90 |
- |
91 |
- for _owner in owner_info: |
92 |
- owner = {} |
93 |
- if _owner[0]: |
94 |
- owner['email'] = _owner[0] |
95 |
+ cursor = connection.cursor() |
96 |
+ cursor.execute('''SELECT Overlay_ID, Name, Priority, Status, |
97 |
+ Quality, Homepage, IRC, License FROM Overlay''') |
98 |
+ overlays_info = cursor.fetchall() |
99 |
+ connection.commit() |
100 |
+ |
101 |
+ for overlay_info in overlays_info: |
102 |
+ overlay = {} |
103 |
+ overlay_id = overlay_info[0] |
104 |
+ overlay['name'] = overlay_info[1] |
105 |
+ |
106 |
+ cursor.execute('''SELECT URL, Type, Branch FROM Overlay_Source |
107 |
+ JOIN Overlay USING (Overlay_ID) JOIN Source USING (Source_ID) |
108 |
+ WHERE Overlay_ID = ?''', (overlay_id,)) |
109 |
+ overlay['source'] = cursor.fetchall() |
110 |
+ |
111 |
+ cursor.execute('''SELECT Owner_Email, Owner_Name FROM Overlay_Owner |
112 |
+ JOIN Overlay USING (Overlay_ID) JOIN Owner USING (Owner_ID) |
113 |
+ WHERE Overlay_ID = ?''', (overlay_id,)) |
114 |
+ owner_info = cursor.fetchall() |
115 |
+ overlay['owner'] = [] |
116 |
+ for _owner in owner_info: |
117 |
+ owner = {} |
118 |
+ if _owner[0]: |
119 |
+ owner['email'] = _owner[0] |
120 |
+ else: |
121 |
+ owner['email'] = None |
122 |
+ if len(_owner) > 1: |
123 |
+ if _owner[1]: |
124 |
+ owner['name'] = _owner[1] |
125 |
else: |
126 |
- owner['email'] = None |
127 |
- if len(_owner) > 1: |
128 |
- if _owner[1]: |
129 |
- owner['name'] = _owner[1] |
130 |
- else: |
131 |
- owner['name'] = None |
132 |
- overlay['owner'].append(owner) |
133 |
- |
134 |
- cursor.execute('''SELECT Description FROM Description JOIN |
135 |
- Overlay USING (Overlay_ID) WHERE Overlay_ID = ?''', |
136 |
- (overlay_id,)) |
137 |
- overlay['description'] = cursor.fetchall()[0] |
138 |
- |
139 |
- overlay['status'] = overlay_info[3] |
140 |
- overlay['quality'] = overlay_info[4] |
141 |
- overlay['priority'] = overlay_info[2] |
142 |
- overlay['license'] = overlay_info[7] |
143 |
- overlay['homepage'] = overlay_info[5] |
144 |
- overlay['IRC'] = overlay_info[6] |
145 |
- |
146 |
- cursor.execute('''SELECT Feed FROM Feed JOIN Overlay USING |
147 |
- (Overlay_ID) WHERE Overlay_ID = ?''', (overlay_id,)) |
148 |
- overlay['feed'] = cursor.fetchall() |
149 |
- |
150 |
- if len(overlay['feed']): |
151 |
- overlay['feed'] = overlay['feed'][0] |
152 |
- |
153 |
- self.overlays[overlay_info[1]] = Overlay(self.config, |
154 |
- ovl_dict=overlay, |
155 |
- ignore=self.ignore) |
156 |
+ owner['name'] = None |
157 |
+ overlay['owner'].append(owner) |
158 |
+ |
159 |
+ cursor.execute('''SELECT Description FROM Description |
160 |
+ JOIN Overlay USING (Overlay_ID) WHERE Overlay_ID = ?''', |
161 |
+ (overlay_id,)) |
162 |
+ overlay['description'] = cursor.fetchall()[0] |
163 |
+ |
164 |
+ overlay['status'] = overlay_info[3] |
165 |
+ overlay['quality'] = overlay_info[4] |
166 |
+ overlay['priority'] = overlay_info[2] |
167 |
+ overlay['license'] = overlay_info[7] |
168 |
+ overlay['homepage'] = overlay_info[5] |
169 |
+ overlay['IRC'] = overlay_info[6] |
170 |
+ |
171 |
+ cursor.execute('''SELECT Feed FROM Feed JOIN Overlay USING |
172 |
+ (Overlay_ID) WHERE Overlay_ID = ?''', (overlay_id,)) |
173 |
+ overlay['feed'] = cursor.fetchall() |
174 |
+ |
175 |
+ if len(overlay['feed']): |
176 |
+ overlay['feed'] = overlay['feed'][0] |
177 |
+ |
178 |
+ self.overlays[overlay_info[1]] = Overlay(self.config, |
179 |
+ ovl_dict=overlay, |
180 |
+ ignore=self.ignore) |
181 |
+ connection.close() |
182 |
+ return True |
183 |
|
184 |
|
185 |
def add_new(self, document=None, origin=None): |
186 |
|
187 |
diff --git a/layman/db_modules/xml_db/xml_db.py b/layman/db_modules/xml_db/xml_db.py |
188 |
index fbd7a6a..f44b9c5 100644 |
189 |
--- a/layman/db_modules/xml_db/xml_db.py |
190 |
+++ b/layman/db_modules/xml_db/xml_db.py |
191 |
@@ -108,12 +108,13 @@ class DBHandler(object): |
192 |
document = df.read() |
193 |
except Exception as error: |
194 |
if not self.ignore_init_read_errors: |
195 |
- msg = 'XML DBHandler - Failed to read the overlay list at'\ |
196 |
- '("%(path)s")' % {'path': path} |
197 |
+ msg = 'XML DBHandler - Failed to read the overlay list at '\ |
198 |
+ '"%(path)s"' % {'path': path} |
199 |
self.output.error(msg) |
200 |
- raise error |
201 |
+ return False |
202 |
|
203 |
- self.read(document, origin=path) |
204 |
+ success = self.read(document, origin=path) |
205 |
+ return success |
206 |
|
207 |
|
208 |
def read(self, text, origin): |
209 |
@@ -123,8 +124,10 @@ class DBHandler(object): |
210 |
''' |
211 |
try: |
212 |
document = ET.fromstring(text) |
213 |
- except xml.parsers.expat.ExpatError as err: |
214 |
- raise BrokenOverlayCatalog(origin, err, self._broken_catalog_hint()) |
215 |
+ except ET.ParseError as error: |
216 |
+ msg = 'XML DBHandler - ET.ParseError: %(err)s' % {'err': error} |
217 |
+ self.output.error(msg) |
218 |
+ return False |
219 |
|
220 |
overlays = document.findall('overlay') + document.findall('repo') |
221 |
|
222 |
@@ -134,6 +137,8 @@ class DBHandler(object): |
223 |
ovl = Overlay(config=self.config, xml=overlay, ignore=self.ignore) |
224 |
self.overlays[ovl.name] = ovl |
225 |
|
226 |
+ return True |
227 |
+ |
228 |
|
229 |
def add_new(self, xml=None, origin=None): |
230 |
''' |
231 |
@@ -145,8 +150,8 @@ class DBHandler(object): |
232 |
self.output.warn(msg) |
233 |
return False |
234 |
|
235 |
- self.read(xml, origin) |
236 |
- return True |
237 |
+ success = self.read(xml, origin) |
238 |
+ return success |
239 |
|
240 |
|
241 |
def remove(self, overlay, path): |
242 |
|
243 |
diff --git a/layman/dbbase.py b/layman/dbbase.py |
244 |
index c2b25b8..8b25fcd 100644 |
245 |
--- a/layman/dbbase.py |
246 |
+++ b/layman/dbbase.py |
247 |
@@ -111,7 +111,17 @@ class DbBase(object): |
248 |
if not os.path.exists(path): |
249 |
continue |
250 |
|
251 |
- self.read_db(path) |
252 |
+ success = self.read_db(path) |
253 |
+ if not success: |
254 |
+ msg = 'DbBase; error, Failed to read database at "%(path)s"\n'\ |
255 |
+ 'Hint: If you manually set db_type. Please reset it and '\ |
256 |
+ 'let layman-updater\nmigrate it. Otherwise layman\'s '\ |
257 |
+ 'database is not initialized, nor populated\nwith any '\ |
258 |
+ 'existing data.\nRun the following: "layman-updater -m '\ |
259 |
+ '<db_type>"' % {'path': path} |
260 |
+ self.output.error(msg) |
261 |
+ sys.exit(-1) |
262 |
+ |
263 |
path_found = True |
264 |
|
265 |
if not path_found and not allow_missing: |