summaryrefslogtreecommitdiff
path: root/portato/db
diff options
context:
space:
mode:
Diffstat (limited to 'portato/db')
-rw-r--r--portato/db/database.py14
-rw-r--r--portato/db/dict.py10
-rw-r--r--portato/db/sql.py18
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