diff options
author | Sean Finney <seanius@debian.org> | 2008-06-26 00:20:28 +0200 |
---|---|---|
committer | Sean Finney <seanius@debian.org> | 2008-06-26 00:21:48 +0200 |
commit | d08d138655cce56e9e10c4afbc01ccf4eb55a69e (patch) | |
tree | 9638d9e71dade18319bc62baf4cdc63baed732ad /patchtracker | |
parent | 5832e7ab80b1470b2d20b710251e4ee4e036e02c (diff) | |
download | patch-tracker-d08d138655cce56e9e10c4afbc01ccf4eb55a69e.tar.gz |
add new collection row factory, query cleanup
Diffstat (limited to 'patchtracker')
-rw-r--r-- | patchtracker/DB.py | 62 | ||||
-rwxr-xr-x | patchtracker/SourceArchive.py | 17 |
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__": |