summaryrefslogtreecommitdiff
path: root/patchtracker/DB.py
diff options
context:
space:
mode:
Diffstat (limited to 'patchtracker/DB.py')
-rw-r--r--patchtracker/DB.py62
1 files changed, 36 insertions, 26 deletions
diff --git a/patchtracker/DB.py b/patchtracker/DB.py
index e706d97..370d691 100644
--- a/patchtracker/DB.py
+++ b/patchtracker/DB.py
@@ -24,6 +24,29 @@ def srcpkg_factory(cursor, row):
info[field] = d[col]
return SourceArchive.SourcePackage(info)
+def srcpkg_collection_factory(cursor, row):
+ d = {}
+ rest = {}
+ for idx, col in enumerate(cursor.description):
+ if not d.has_key(col[0]):
+ d[col[0]] = row[idx]
+ else:
+ rest[col[0]] = row[idx]
+
+ info = {}
+ info['Files'] = []
+ if d['diffgz_name']:
+ diffgz = {'name':d['diffgz_name'], 'size':d['diffgz_size'],
+ 'md5sum':d['diffgz_md5sum'] }
+ info['Files'].append(diffgz)
+
+ colmap = {'name':'Package','version':'Version','format':'Format',
+ 'loc':'Directory'}
+
+ for col,field in colmap.iteritems():
+ info[field] = d[col]
+ return (SourceArchive.SourcePackage(info), rest)
+
class PatchTrackerDB:
def __init__(self, dbname=Conf.database):
@@ -88,38 +111,25 @@ class PatchTrackerDB:
cursor = self.db.cursor()
cursor.execute(q, (component,))
- def findLetterToc(self, letter):
+ def findCollection(self, package="%"):
oldfactory = self.db.row_factory
- dcursor = self.db.cursor()
- dq = "SELECT id,name FROM suites"
- dcursor.execute(dq)
- suites = {}
- for id,suite in dcursor.fetchall():
- suites[id] = suite
-
- self.db.row_factory = srcpkg_factory
+ self.db.row_factory = srcpkg_collection_factory
cursor = self.db.cursor()
toc = SourceArchive.SourcePackageIndex()
- for s,v in suites.iteritems():
- q = "SELECT * FROM packages AS p,package_rel_map AS m \
- WHERE p.name like ? AND p.id = m.package_id and m.suite_id = ?"
- cursor.execute(q, (letter+"%", s))
- # use srcpkg_factory to fetch sourcepackages, once per suite
- for srcpkg in cursor.fetchall():
- toc.ins(srcpkg, v)
+ q = "SELECT * FROM packages AS p,package_rel_map AS m,suites AS s \
+ WHERE p.name LIKE ? AND p.id = m.package_id AND m.suite_id = s.id"
+ cursor.execute(q, (package,))
+ # use srcpkg_factory to fetch sourcepackages, once per suite
+ for srcpkg,rest in cursor.fetchall():
+ toc.ins(srcpkg, rest["name"])
self.db.row_factory = oldfactory
- return toc.getletter(letter)
+ return toc
+
+ def findLetterToc(self, letter):
+ return self.findCollection(package=letter+"%").getletter(letter)
def findMasterIndex(self):
- cursor = self.db.cursor()
- toc = SourceArchive.MasterIndex()
- q = "SELECT name FROM packages WHERE id > 0"
- cursor.execute(q)
- for name in cursor.fetchall():
- # XXX find a better way to do this..., probably just store metainfo
- # XXX in the db and update it via triggers
- toc.add(name[0])
- return toc
+ return self.findCollection(package="%")
def findSourcePackageRelation(self, srcpkg, suite):
q = "SELECT * FROM packages AS p,suites AS s,package_rel_map AS m \