diff options
Diffstat (limited to 'portato')
-rw-r--r-- | portato/db/database.py | 14 | ||||
-rw-r--r-- | portato/db/dict.py | 10 | ||||
-rw-r--r-- | portato/db/sql.py | 18 |
3 files changed, 30 insertions, 12 deletions
diff --git a/portato/db/database.py b/portato/db/database.py index 941c3a3..c36c5dc 100644 --- a/portato/db/database.py +++ b/portato/db/database.py @@ -16,15 +16,16 @@ from threading import RLock from functools import wraps class PkgData (object): - __slots__ = ("cat", "pkg", "inst") + __slots__ = ("cat", "pkg", "inst", "disabled") - def __init__ (self, cat, pkg, inst): + def __init__ (self, cat, pkg, inst = False, disabled = False): self.cat = cat self.pkg = pkg self.inst = inst + self.disabled = disabled def __iter__ (self): - return iter((self.cat, self.pkg, self.inst)) + return iter((self.cat, self.pkg, self.inst, self.disabled)) def __cmp__ (self, other): return cmp(self.pkg.lower(), other.pkg.lower()) @@ -80,6 +81,13 @@ class Database (object): """ raise NotImplentedError + def disable (self, cpv): + """Marks the CPV as disabled. + + @param cpv: the cpv to mark + """ + raise NotImplentedError + def reload (self, cat = None): """Reloads the given category. diff --git a/portato/db/dict.py b/portato/db/dict.py index d230821..422246f 100644 --- a/portato/db/dict.py +++ b/portato/db/dict.py @@ -51,7 +51,7 @@ class DictDatabase (Database): for p in packages: cat, pkg = p.split("/") inst = p in installed - t = PkgData(cat, pkg, inst) + t = PkgData(cat, pkg, inst, False) self._db[cat].append(t) self._db[self.ALL].append(t) @@ -124,6 +124,14 @@ class DictDatabase (Database): self.__initialize() self.populate() + @lock + def disable (self, cpv): + cat, pkg = cpv.split("/") + + c = self._db[cat] + p = c[c.find(PkgData(cat, pkg))] + p.disabled = True + def get_restrict (self): return self._restrict diff --git a/portato/db/sql.py b/portato/db/sql.py index 3cffd88..b406981 100644 --- a/portato/db/sql.py +++ b/portato/db/sql.py @@ -153,9 +153,8 @@ class SQLDatabase (Database): return f(*args, **kwargs) - return wrapper + return Database.lock(wrapper) - @lock @con def populate (self, category = None, connection = None): def _get(): @@ -169,7 +168,6 @@ class SQLDatabase (Database): connection.executemany("INSERT INTO packages (cat, name, inst, disabled) VALUES (?, ?, ?, ?)", _get()) connection.commit() - @lock @con def get_cat (self, category = None, byName = True, connection = None): sort = "ORDER BY name" @@ -177,15 +175,14 @@ class SQLDatabase (Database): sort = "ORDER BY inst DESC, name" if not category or category == self.ALL: - c = connection.execute("SELECT cat, name, inst FROM packages WHERE 1=1 %s %s" % (self.restrict, sort)) + c = connection.execute("SELECT cat, name, inst, disabled FROM packages WHERE 1=1 %s %s" % (self.restrict, sort)) else: - c = connection.execute("SELECT cat, name, inst FROM packages WHERE cat = ? %s %s" % (self.restrict ,sort), (category,)) + c = connection.execute("SELECT cat, name, inst, disabled FROM packages WHERE cat = ? %s %s" % (self.restrict ,sort), (category,)) for pkg in c: - yield PkgData(pkg["cat"], pkg["name"], pkg["inst"]) + yield PkgData(pkg["cat"], pkg["name"], pkg["inst"], pkg["disabled"]) c.close() - @lock @con def get_categories (self, installed = False, connection = None): @@ -205,7 +202,6 @@ class SQLDatabase (Database): for cat in l: yield cat["cat"] - @lock @con def reload (self, cat = None, connection = None): if cat: @@ -217,6 +213,12 @@ class SQLDatabase (Database): connection.commit() self.populate(connection = connection) + @con + def disable (self, cpv, connection = None): + cat, pkg = cpv.split("/") + connection.execute("UPDATE packages SET disabled = 1 WHERE cat = ? AND name = ?", (cat, pkg)) + connection.commit() + def get_restrict (self): return self._restrict |