Gentoo Archives: gentoo-commits

From: Devan Franchini <twitch153@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/layman:master commit in: layman/db_modules/xml_db/, layman/db_modules/sqlite_db/, layman/, ...
Date: Mon, 29 Feb 2016 06:11:23
Message-Id: 1456726169.f8eb545aa0b268cfd08644b0996a6681359dc0bc.twitch153@gentoo
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: