]> git.ipfire.org Git - pakfire.git/commitdiff
Add "vendor" to database and add possibility to migrate databases.
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 11 Oct 2011 19:16:30 +0000 (19:16 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 11 Oct 2011 19:44:13 +0000 (19:44 +0000)
python/pakfire/constants.py
python/pakfire/packages/base.py
python/pakfire/packages/installed.py
python/pakfire/packages/solv.py
python/pakfire/repository/database.py

index 9b4c40e362c9055bb68069efbe6c80aa274c1636..eb4a5529a97a2b8a65a1680aa5cc5dbb5433c306 100644 (file)
@@ -63,6 +63,9 @@ PACKAGE_FORMATS_SUPPORTED = [0, 1, 2]
 PACKAGE_EXTENSION = "pfm"
 MAKEFILE_EXTENSION = "nm"
 
+DATABASE_FORMAT = 1
+DATABASE_FORMATS_SUPPORTED = [0, 1]
+
 PACKAGE_FILENAME_FMT = "%(name)s-%(version)s-%(release)s.%(arch)s.%(ext)s"
 
 BUILD_PACKAGES = [
index 96046392c5cab748000c99919c26bb1f88db3e45..c9ce4e9506b9e04684931f8627f5cd852c5d54f2 100644 (file)
@@ -129,6 +129,8 @@ class Package(object):
                        if self.maintainer:
                                items.append((_("Maintainer"), self.maintainer))
 
+                       items.append((_("Vendor"), self.vendor))
+
                        items.append((_("UUID"), self.uuid))
                        items.append((_("Build ID"), self.build_id))
                        items.append((_("Build date"), self.build_date))
@@ -236,7 +238,7 @@ class Package(object):
 
        @property
        def metadata(self):
-               raise NotImplementedError
+               raise NotImplementedError, self
 
        @property
        def friendly_name(self):
index 40e11e2517d5768971634897f8a2ab179566591b..2072524950f89e046a90d54eaac58639211461d7 100644 (file)
@@ -126,6 +126,10 @@ class DatabasePackage(Package):
        def build_id(self):
                return self.metadata.get("build_id")
 
+       @property
+       def vendor(self):
+               return self.metadata.get("vendor")
+
        @property
        def uuid(self):
                return self.metadata.get("uuid")
index 9030c2f9dd75ecf0a0c9970b8a4655cd159a44f8..2a27ef11c30f37c82a185b18bbc4efa6d1db02dd 100644 (file)
@@ -121,6 +121,15 @@ class SolvPackage(base.Package):
        def size(self):
                return self.solvable.get_downloadsize()
 
+       @property
+       def vendor(self):
+               vendor = self.solvable.get_vendor()
+
+               if vendor == "<NULL>":
+                       return None
+
+               return vendor
+
        @property
        def uuid(self):
                return self.solvable.get_uuid()
index 87aecd2a1ee52fc90486a165d3d3587292c901e4..48adbe0594182077d4018d248100840cabd3bb0a 100644 (file)
@@ -29,6 +29,7 @@ import time
 import pakfire.packages as packages
 
 from pakfire.constants import *
+from pakfire.i18n import _
 
 class Cursor(sqlite3.Cursor):
        def execute(self, *args, **kwargs):
@@ -53,6 +54,9 @@ class Database(object):
        def create(self):
                pass
 
+       def migrate(self):
+               pass
+
        def open(self):
                if self._db is None:
                        logging.debug("Open database %s" % self.filename)
@@ -67,8 +71,12 @@ class Database(object):
                        self._db = sqlite3.connect(self.filename)
                        self._db.row_factory = sqlite3.Row
 
-                       # Create the database if it was not there, yet.
-                       if not database_exists:
+                       # In the case, the database was not existant, it is
+                       # filled with content. In case it has been there
+                       # we call the migrate method to update it if neccessary.
+                       if database_exists:
+                               self.migrate()
+                       else:
                                self.create()
 
        def close(self):
@@ -94,8 +102,15 @@ class DatabaseLocal(Database):
                # Generate filename for package database
                filename = os.path.join(pakfire.path, PACKAGES_DB)
 
+               # Cache format number.
+               self.__format = None
+
                Database.__init__(self, pakfire, filename)
 
+               # Check if we actually can open the database.
+               if not self.format in DATABASE_FORMATS_SUPPORTED:
+                       raise DatabaseFormatError, _("The format of the database is not supported by this version of pakfire.")
+
        def __len__(self):
                count = 0
 
@@ -107,6 +122,23 @@ class DatabaseLocal(Database):
 
                return count
 
+       @property
+       def format(self):
+               if self.__format is None:
+                       c = self.cursor()
+
+                       c.execute("SELECT val FROM settings WHERE key = 'version' LIMIT 1")
+                       for row in c:
+                               try:
+                                       self.__format = int(row["val"])
+                                       break
+                               except ValueError:
+                                       pass
+
+                       c.close()
+
+               return self.__format
+
        def create(self):
                c = self.cursor()
                c.executescript("""
@@ -114,7 +146,7 @@ class DatabaseLocal(Database):
                                key                     TEXT,
                                val                     TEXT
                        );
-                       INSERT INTO settings(key, val) VALUES('version', '0');
+                       INSERT INTO settings(key, val) VALUES('version', '%s');
 
                        CREATE TABLE files(
                                id                      INTEGER PRIMARY KEY,
@@ -144,6 +176,7 @@ class DatabaseLocal(Database):
                                summary         TEXT,
                                description     TEXT,
                                uuid            TEXT,
+                               vendor          TEXT,
                                build_id        TEXT,
                                build_host      TEXT,
                                build_date      TEXT,
@@ -166,11 +199,31 @@ class DatabaseLocal(Database):
                                dependency      TEXT,
                                scriptlet       TEXT
                        );
-               """)
+               """ % DATABASE_FORMAT)
                # XXX add some indexes here
                self.commit()
                c.close()
 
+       def migrate(self):
+               # If we have already the latest version, there is nothing to do.
+               if self.format == DATABASE_FORMAT:
+                       return
+
+               logging.info(_("Migrating database from format %s to %s.") % (self.format, DATABASE_FORMAT))
+
+               # Get a database cursor.
+               c = self.cursor()
+
+               # 1) The vendor column was added.
+               if self.format < 1:
+                       c.execute("ALTER TABLE packages ADD COLUMN vendor TEXT AFTER uuid")
+
+               # In the end, we can easily update the version of the database.
+               c.execute("UPDATE settings SET val = ? WHERE key = 'version'", (DATABASE_FORMAT,))
+               self.__format = DATABASE_FORMAT
+
+               c.close()
+
        def add_package(self, pkg, reason=None):
                logging.debug("Adding package to database: %s" % pkg.friendly_name)
 
@@ -196,6 +249,7 @@ class DatabaseLocal(Database):
                                        summary,
                                        description,
                                        uuid,
+                                       vendor,
                                        build_id,
                                        build_host,
                                        build_date,
@@ -203,7 +257,7 @@ class DatabaseLocal(Database):
                                        installed,
                                        repository,
                                        reason
-                               ) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
+                               ) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
                                (
                                        pkg.name,
                                        pkg.epoch,
@@ -222,6 +276,7 @@ class DatabaseLocal(Database):
                                        pkg.summary,
                                        pkg.description,
                                        pkg.uuid,
+                                       pkg.vendor or "",
                                        pkg.build_id,
                                        pkg.build_host,
                                        pkg.build_date,