summaryrefslogtreecommitdiff
path: root/patchtracker
diff options
context:
space:
mode:
authorSean Finney <seanius@debian.org>2008-06-26 00:20:28 +0200
committerSean Finney <seanius@debian.org>2008-06-26 00:21:48 +0200
commitd08d138655cce56e9e10c4afbc01ccf4eb55a69e (patch)
tree9638d9e71dade18319bc62baf4cdc63baed732ad /patchtracker
parent5832e7ab80b1470b2d20b710251e4ee4e036e02c (diff)
downloadpatch-tracker-d08d138655cce56e9e10c4afbc01ccf4eb55a69e.tar.gz
add new collection row factory, query cleanup
Diffstat (limited to 'patchtracker')
-rw-r--r--patchtracker/DB.py62
-rwxr-xr-xpatchtracker/SourceArchive.py17
2 files changed, 37 insertions, 42 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 \
diff --git a/patchtracker/SourceArchive.py b/patchtracker/SourceArchive.py
index c15c5f9..b8bc9eb 100755
--- a/patchtracker/SourceArchive.py
+++ b/patchtracker/SourceArchive.py
@@ -119,20 +119,6 @@ class SourcePackage:
def __str__(self):
return self.name
-class MasterIndex:
- def __init__(self):
- self.pkgcounts = {}
-
- def add(self, name):
- idx = getidx(name)
- if not self.pkgcounts.has_key(idx):
- self.pkgcounts[idx] = 1
- else:
- self.pkgcounts[idx] += 1
-
- def indices(self):
- return sorted(self.pkgcounts.iterkeys())
-
class SourcePackageIndex:
def __init__(self):
self.pkgs = {}
@@ -149,8 +135,7 @@ class SourcePackageIndex:
return self.pkgs[getidx(letter)]
def indices(self):
- for k,v in sorted(self.pkgs.iteritems()):
- yield (k,v)
+ return sorted(self.pkgs.iterkeys())
# basic module tests
if __name__ == "__main__":