public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/layman:master commit in: layman/db_modules/xml_db/, layman/db_modules/sqlite_db/, layman/, ...
@ 2015-08-05  6:02 Devan Franchini
  0 siblings, 0 replies; 2+ messages in thread
From: Devan Franchini @ 2015-08-05  6:02 UTC (permalink / raw
  To: gentoo-commits

commit:     daafd7d31457b018797407d97188a4829839172e
Author:     Devan Franchini <twitch153 <AT> gentoo <DOT> org>
AuthorDate: Wed Aug  5 05:55:16 2015 +0000
Commit:     Devan Franchini <twitch153 <AT> gentoo <DOT> org>
CommitDate: Wed Aug  5 05:58:59 2015 +0000
URL:        https://gitweb.gentoo.org/proj/layman.git/commit/?id=daafd7d3

Adds remove function for overlay removal from databases

sqlite_db.py: Also changes the way in which feeds are gathered in
read_db(), this shows the nature of feeds being an unrequired attribute
of the overlay.

 layman/db.py                             |  2 +-
 layman/db_modules/json_db/__init__.py    |  3 ++-
 layman/db_modules/json_db/json_db.py     |  8 ++++++++
 layman/db_modules/sqlite_db/__init__.py  |  5 +++--
 layman/db_modules/sqlite_db/sqlite_db.py | 23 ++++++++++++++++-------
 layman/db_modules/xml_db/__init__.py     |  3 ++-
 layman/db_modules/xml_db/xml_db.py       |  8 ++++++++
 layman/dbbase.py                         | 13 +++++++++++++
 8 files changed, 53 insertions(+), 12 deletions(-)

diff --git a/layman/db.py b/layman/db.py
index ba7399c..673e6bf 100644
--- a/layman/db.py
+++ b/layman/db.py
@@ -148,7 +148,7 @@ class DB(DbBase):
         if overlay.name in self.overlays.keys():
             overlay.delete(self.config['storage'])
             repo_ok = self.repo_conf.delete(overlay)
-            del self.overlays[overlay.name]
+            self.remove(overlay, self.path)
             self.write(self.path)
         else:
             self.output.error('No local overlay named "' + overlay.name + '"!')

diff --git a/layman/db_modules/json_db/__init__.py b/layman/db_modules/json_db/__init__.py
index 1502b9d..ac4daa7 100644
--- a/layman/db_modules/json_db/__init__.py
+++ b/layman/db_modules/json_db/__init__.py
@@ -13,10 +13,11 @@ module_spec = {
             'name': 'json_db',
             'class': 'DBHandler',
             'description': __doc__,
-            'functions': ['add_new', 'read_db', 'write'],
+            'functions': ['add_new', 'read_db', 'remove', 'write'],
             'func_desc': {
                 'add_new': 'Adds overlay(s) from provided database text',
                 'read_db': 'Reads the list of overlays from database file',
+                'remove' : 'Removes overlay from installed overlays list',
                 'write'  : 'Writes the list of overlays to database file',
             },
         }

diff --git a/layman/db_modules/json_db/json_db.py b/layman/db_modules/json_db/json_db.py
index 47413c6..d466385 100644
--- a/layman/db_modules/json_db/json_db.py
+++ b/layman/db_modules/json_db/json_db.py
@@ -104,6 +104,14 @@ class DBHandler(object):
         return True
 
 
+    def remove(self, overlay, path):
+        '''
+        Removes an overlay from installed overlays list.
+        '''
+        if overlay.name in self.overlays:
+            del self.overlays[overlay.name]
+
+
     def write(self, path):
         '''
         Write the list of overlays to a file.

diff --git a/layman/db_modules/sqlite_db/__init__.py b/layman/db_modules/sqlite_db/__init__.py
index 7d2fba4..536fc2d 100644
--- a/layman/db_modules/sqlite_db/__init__.py
+++ b/layman/db_modules/sqlite_db/__init__.py
@@ -13,10 +13,11 @@ module_spec = {
             'name': 'sqlite_db',
             'class': 'DBHandler',
             'description': __doc__,
-            'functions': ['add_new', 'read_db', 'write'],
+            'functions': ['add_new', 'read_db', 'remove', 'write'],
             'func_desc': {
-                'add_new': 'Adds overlay(s) from provided database text',
+                'add_new': 'Adds overlay(s) from provided database file',
                 'read_db': 'Reads the list of overlays from database file',
+                'remove' : 'Removes overlay from provided database file',
                 'write'  : 'Writes the list of overlays to database file',
             },
         }

diff --git a/layman/db_modules/sqlite_db/sqlite_db.py b/layman/db_modules/sqlite_db/sqlite_db.py
index 1d079a3..aef9661 100644
--- a/layman/db_modules/sqlite_db/sqlite_db.py
+++ b/layman/db_modules/sqlite_db/sqlite_db.py
@@ -103,8 +103,8 @@ class DBHandler(object):
                 cursor.execute('''CREATE TABLE IF NOT EXISTS Overlay
                 ( Overlay_ID INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, 
                 Priority TEXT, Status TEXT, Quality TEXT, Homepage 
-                TEXT, IRC TEXT, License TEXT, UNIQUE (Name, Homepage, License) 
-                ON CONFLICT IGNORE )''')
+                TEXT, IRC TEXT, License TEXT, UNIQUE (Name) ON CONFLICT IGNORE )
+                ''')
                 cursor.execute('''CREATE TABLE IF NOT EXISTS Owner ( Owner_ID
                 INTEGER PRIMARY KEY AUTOINCREMENT, Owner_Name TEXT, 
                 Owner_Email TEXT, UNIQUE (Owner_Name, Owner_Email) ON 
@@ -180,15 +180,17 @@ class DBHandler(object):
 
             cursor.execute('''SELECT Description FROM Description JOIN Overlay 
             USING (Overlay_ID) WHERE Overlay_ID = ?''', (overlay_id,))
-            overlay['description'] = cursor.fetchall()
-
-            if len(overlay['description']):
-                overlay['description'] = overlay['description'][0]
+            overlay['description'] = cursor.fetchall()[0]
 
             overlay['status'] = overlay_info[3]
             overlay['quality'] = overlay_info[4]
             overlay['priority'] = overlay_info[2]
-            overlay['license'] = overlay_info[7]
+
+            if overlay_info[7]:
+                overlay['license'] = overlay_info[7]
+            else:
+                overlay['license'] = None
+
             overlay['homepage'] = overlay_info[5]
             overlay['IRC'] = overlay_info[6]
 
@@ -196,9 +198,13 @@ class DBHandler(object):
             (Overlay_ID) WHERE Overlay_ID = ?''', (overlay_id,))
             overlay['feed'] = cursor.fetchall()
 
+            if len(overlay['feed']):
+                overlay['feed'] = overlay['feed'][0]
+
             self.overlays[overlay_info[1]] = Overlay(self.config,
                                                      ovl_dict=overlay,
                                                      ignore=self.ignore)
+        connection.close()
 
 
     def add_new(self, document=None, origin=None):
@@ -316,6 +322,9 @@ class DBHandler(object):
 
             connection.commit()
 
+        if overlay.name in self.overlays:
+            del self.overlays[overlay.name]
+
 
     def write(self, path):
         '''

diff --git a/layman/db_modules/xml_db/__init__.py b/layman/db_modules/xml_db/__init__.py
index 3a3abd1..c8a5bf9 100644
--- a/layman/db_modules/xml_db/__init__.py
+++ b/layman/db_modules/xml_db/__init__.py
@@ -13,10 +13,11 @@ module_spec = {
             'name': 'xml_db',
             'class': 'DBHandler',
             'description': __doc__,
-            'functions': ['add_new', 'read_db', 'write'],
+            'functions': ['add_new', 'read_db', 'remove', 'write'],
             'func_desc': {
                 'add_new': 'Adds overlay(s) from provided database text',
                 'read_db': 'Reads the list of overlays from database file',
+                'remove' : 'Removes overlay from installed overlays list',
                 'write'  : 'Writes the list of overlays to database file',
             },
         }

diff --git a/layman/db_modules/xml_db/xml_db.py b/layman/db_modules/xml_db/xml_db.py
index 38a19d2..316d8f9 100644
--- a/layman/db_modules/xml_db/xml_db.py
+++ b/layman/db_modules/xml_db/xml_db.py
@@ -149,6 +149,14 @@ class DBHandler(object):
         return True
 
 
+    def remove(self, overlay, path):
+        '''
+        Removes an overlay from list of installed overlays.
+        '''
+        if overlay.name in self.overlays:
+            del self.overlays[overlay.name]
+
+
     def write(self, path):
         '''
         Write the list of overlays to a file.

diff --git a/layman/dbbase.py b/layman/dbbase.py
index 7832565..cecbf5c 100644
--- a/layman/dbbase.py
+++ b/layman/dbbase.py
@@ -215,6 +215,19 @@ class DbBase(object):
         db_ctl.write(path)
 
 
+    def remove(self, overlay, path):
+        '''
+        Remove an overlay from the database.
+        '''
+        db_ctl = self.mod_ctl.get_class(self.db_type)(self.config,
+                 self.overlays,
+                 self.paths,
+                 self.ignore,
+                 self.ignore_init_read_errors)
+
+        db_ctl.remove(overlay, path)
+
+
     def select(self, overlay):
         '''
         Select an overlay from the list.


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [gentoo-commits] proj/layman:master commit in: layman/db_modules/xml_db/, layman/db_modules/sqlite_db/, layman/, ...
@ 2016-02-29  6:11 Devan Franchini
  0 siblings, 0 replies; 2+ messages in thread
From: Devan Franchini @ 2016-02-29  6:11 UTC (permalink / raw
  To: gentoo-commits

commit:     f8eb545aa0b268cfd08644b0996a6681359dc0bc
Author:     Devan Franchini <twitch153 <AT> gentoo <DOT> org>
AuthorDate: Mon Feb 29 06:09:27 2016 +0000
Commit:     Devan Franchini <twitch153 <AT> gentoo <DOT> org>
CommitDate: Mon Feb 29 06:09:29 2016 +0000
URL:        https://gitweb.gentoo.org/proj/layman.git/commit/?id=f8eb545a

Adds error reporting for db read failures

If the database back-end fails to be read then layman will properly
report it and exit without causing an ugly traceback.

 layman/db_modules/json_db/json_db.py     |   7 +-
 layman/db_modules/sqlite_db/sqlite_db.py | 121 +++++++++++++++++--------------
 layman/db_modules/xml_db/xml_db.py       |  21 ++++--
 layman/dbbase.py                         |  12 ++-
 4 files changed, 95 insertions(+), 66 deletions(-)

diff --git a/layman/db_modules/json_db/json_db.py b/layman/db_modules/json_db/json_db.py
index 70e41d5..bf88593 100644
--- a/layman/db_modules/json_db/json_db.py
+++ b/layman/db_modules/json_db/json_db.py
@@ -75,6 +75,10 @@ class DBHandler(object):
             try:
                 with fileopen(path, 'r') as df:
                     document = df.read()
+            except ValueError as error:
+                msg = 'JSON DBHanlder - ValueError: %(err)s' % {'err': error}
+                self.output.error(msg)
+                return False
             except Exception as error:
                 if not self.ignore_init_read_errors:
                     msg = 'JSON DBHandler - Failed to read the overlay list at'\
@@ -82,7 +86,8 @@ class DBHandler(object):
                 self.output.error(msg)
                 raise error
 
-        self.add_new(document, origin=path)
+        success = self.add_new(document, origin=path)
+        return success
 
 
     def add_new(self, document=None, origin=None):

diff --git a/layman/db_modules/sqlite_db/sqlite_db.py b/layman/db_modules/sqlite_db/sqlite_db.py
index a3305a7..3585c4a 100644
--- a/layman/db_modules/sqlite_db/sqlite_db.py
+++ b/layman/db_modules/sqlite_db/sqlite_db.py
@@ -136,6 +136,8 @@ class DBHandler(object):
                 CONFLICT IGNORE )''')
 
                 connection.commit()
+            except sqlite3.DatabaseError as err:
+                raise err
             except Exception as err:
                 msg = 'SQLite DBHandler error; failed to create database.\n'\
                       'Error was: %(msg)s' % {'msg': err}
@@ -152,64 +154,71 @@ class DBHandler(object):
         overlay_id = None
         overlay = {}
 
-        with self.__connect__(path) as connection:
-            cursor = connection.cursor()
-            cursor.execute('''SELECT Overlay_ID, Name, Priority, Status, 
-            Quality, Homepage, IRC, License FROM Overlay''')
-            overlays_info = cursor.fetchall()
-            connection.commit()
+        try:
+            connection = self.__connect__(path)
+        except sqlite3.DatabaseError as err:
+            msg = 'SQLite DBHandler DatabaseError: %(err)s' % {'err': err}
+            self.output.error(msg)
+            return False
 
-            for overlay_info in overlays_info:
-                overlay = {}
-                overlay_id = overlay_info[0]
-                overlay['name'] = overlay_info[1]
-
-                cursor.execute('''SELECT URL, Type, Branch FROM Overlay_Source 
-                JOIN Overlay USING (Overlay_ID) JOIN Source USING (Source_ID) 
-                WHERE Overlay_ID = ?''', (overlay_id,))
-                overlay['source'] = cursor.fetchall()
-
-                cursor.execute('''SELECT Owner_Email, Owner_Name FROM 
-                Overlay_Owner JOIN Overlay USING (Overlay_ID) JOIN Owner USING 
-                (Owner_ID) WHERE Overlay_ID = ?''', (overlay_id,))
-                owner_info = cursor.fetchall()
-                overlay['owner'] = []
-
-                for _owner in owner_info:
-                    owner = {}
-                    if _owner[0]:
-                        owner['email'] = _owner[0]
+        cursor = connection.cursor()
+        cursor.execute('''SELECT Overlay_ID, Name, Priority, Status,
+        Quality, Homepage, IRC, License FROM Overlay''')
+        overlays_info = cursor.fetchall()
+        connection.commit()
+
+        for overlay_info in overlays_info:
+            overlay = {}
+            overlay_id = overlay_info[0]
+            overlay['name'] = overlay_info[1]
+
+            cursor.execute('''SELECT URL, Type, Branch FROM Overlay_Source
+            JOIN Overlay USING (Overlay_ID) JOIN Source USING (Source_ID)
+            WHERE Overlay_ID = ?''', (overlay_id,))
+            overlay['source'] = cursor.fetchall()
+
+            cursor.execute('''SELECT Owner_Email, Owner_Name FROM Overlay_Owner
+            JOIN Overlay USING (Overlay_ID) JOIN Owner USING (Owner_ID)
+            WHERE Overlay_ID = ?''', (overlay_id,))
+            owner_info = cursor.fetchall()
+            overlay['owner'] = []
+            for _owner in owner_info:
+                owner = {}
+                if _owner[0]:
+                    owner['email'] = _owner[0]
+                else:
+                    owner['email'] = None
+                if len(_owner) > 1:
+                    if _owner[1]:
+                        owner['name'] = _owner[1]
                     else:
-                        owner['email'] = None
-                    if len(_owner) > 1:
-                        if _owner[1]:
-                            owner['name'] = _owner[1]
-                        else:
-                            owner['name'] = None
-                    overlay['owner'].append(owner)
-
-                cursor.execute('''SELECT Description FROM Description JOIN 
-                Overlay USING (Overlay_ID) WHERE Overlay_ID = ?''',
-                (overlay_id,))
-                overlay['description'] = cursor.fetchall()[0]
-
-                overlay['status'] = overlay_info[3]
-                overlay['quality'] = overlay_info[4]
-                overlay['priority'] = overlay_info[2]
-                overlay['license'] = overlay_info[7]
-                overlay['homepage'] = overlay_info[5]
-                overlay['IRC'] = overlay_info[6]
-
-                cursor.execute('''SELECT Feed FROM Feed JOIN Overlay USING 
-                (Overlay_ID) WHERE Overlay_ID = ?''', (overlay_id,))
-                overlay['feed'] = cursor.fetchall()
-
-                if len(overlay['feed']):
-                    overlay['feed'] = overlay['feed'][0]
-
-                self.overlays[overlay_info[1]] = Overlay(self.config,
-                                                         ovl_dict=overlay,
-                                                         ignore=self.ignore)
+                        owner['name'] = None
+                overlay['owner'].append(owner)
+
+            cursor.execute('''SELECT Description FROM Description
+            JOIN Overlay USING (Overlay_ID) WHERE Overlay_ID = ?''',
+            (overlay_id,))
+            overlay['description'] = cursor.fetchall()[0]
+
+            overlay['status'] = overlay_info[3]
+            overlay['quality'] = overlay_info[4]
+            overlay['priority'] = overlay_info[2]
+            overlay['license'] = overlay_info[7]
+            overlay['homepage'] = overlay_info[5]
+            overlay['IRC'] = overlay_info[6]
+
+            cursor.execute('''SELECT Feed FROM Feed JOIN Overlay USING
+            (Overlay_ID) WHERE Overlay_ID = ?''', (overlay_id,))
+            overlay['feed'] = cursor.fetchall()
+
+            if len(overlay['feed']):
+                overlay['feed'] = overlay['feed'][0]
+
+            self.overlays[overlay_info[1]] = Overlay(self.config,
+                                                     ovl_dict=overlay,
+                                                     ignore=self.ignore)
+        connection.close()
+        return True
 
 
     def add_new(self, document=None, origin=None):

diff --git a/layman/db_modules/xml_db/xml_db.py b/layman/db_modules/xml_db/xml_db.py
index fbd7a6a..f44b9c5 100644
--- a/layman/db_modules/xml_db/xml_db.py
+++ b/layman/db_modules/xml_db/xml_db.py
@@ -108,12 +108,13 @@ class DBHandler(object):
                     document = df.read()
             except Exception as error:
                 if not self.ignore_init_read_errors:
-                    msg = 'XML DBHandler - Failed to read the overlay list at'\
-                      '("%(path)s")' % {'path': path}
+                    msg = 'XML DBHandler - Failed to read the overlay list at '\
+                      '"%(path)s"' % {'path': path}
                 self.output.error(msg)
-                raise error
+                return False
 
-        self.read(document, origin=path)
+        success = self.read(document, origin=path)
+        return success
 
 
     def read(self, text, origin):
@@ -123,8 +124,10 @@ class DBHandler(object):
         '''
         try:
             document = ET.fromstring(text)
-        except xml.parsers.expat.ExpatError as err:
-            raise BrokenOverlayCatalog(origin, err, self._broken_catalog_hint())
+        except ET.ParseError as error:
+            msg = 'XML DBHandler - ET.ParseError: %(err)s' % {'err': error}
+            self.output.error(msg)
+            return False
 
         overlays = document.findall('overlay') + document.findall('repo')
 
@@ -134,6 +137,8 @@ class DBHandler(object):
             ovl = Overlay(config=self.config, xml=overlay, ignore=self.ignore)
             self.overlays[ovl.name] = ovl
 
+        return True
+
 
     def add_new(self, xml=None, origin=None):
         '''
@@ -145,8 +150,8 @@ class DBHandler(object):
             self.output.warn(msg)
             return False
 
-        self.read(xml, origin)
-        return True
+        success = self.read(xml, origin)
+        return success
 
 
     def remove(self, overlay, path):

diff --git a/layman/dbbase.py b/layman/dbbase.py
index c2b25b8..8b25fcd 100644
--- a/layman/dbbase.py
+++ b/layman/dbbase.py
@@ -111,7 +111,17 @@ class DbBase(object):
             if not os.path.exists(path):
                 continue
 
-            self.read_db(path)
+            success = self.read_db(path)
+            if not success:
+                msg = 'DbBase; error, Failed to read database at "%(path)s"\n'\
+                      'Hint: If you manually set db_type. Please reset it and '\
+                      'let layman-updater\nmigrate it. Otherwise layman\'s '\
+                      'database is not initialized, nor populated\nwith any '\
+                      'existing data.\nRun the following: "layman-updater -m '\
+                      '<db_type>"' % {'path': path}
+                self.output.error(msg)
+                sys.exit(-1)
+
             path_found = True
 
         if not path_found and not allow_missing:


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-02-29  6:11 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-05  6:02 [gentoo-commits] proj/layman:master commit in: layman/db_modules/xml_db/, layman/db_modules/sqlite_db/, layman/, Devan Franchini
  -- strict thread matches above, loose matches on Subject: below --
2016-02-29  6:11 Devan Franchini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox