diff options
author | Sean Finney <seanius@debian.org> | 2008-06-26 01:55:58 +0200 |
---|---|---|
committer | Sean Finney <seanius@debian.org> | 2008-06-26 01:55:58 +0200 |
commit | bb37cf116269d5948d7f4d592557642696b5d9c7 (patch) | |
tree | 279809d4fd86e92043e5f8b70dbf2d502d902678 | |
parent | d08d138655cce56e9e10c4afbc01ccf4eb55a69e (diff) | |
download | patch-tracker-bb37cf116269d5948d7f4d592557642696b5d9c7.tar.gz |
package search / versionless implementation
going to /packages/pkg now gives a table of contents with
the available versions for the package, or the results of
a widers search in the case of no exact matches
also removed a bunch of dead code from DB mostly
-rwxr-xr-x | pagehandler.py | 32 | ||||
-rw-r--r-- | patchtracker/DB.py | 52 | ||||
-rwxr-xr-x | patchtracker/SourceArchive.py | 14 | ||||
-rwxr-xr-x | patchtracker/Templates.py | 15 |
4 files changed, 61 insertions, 52 deletions
diff --git a/pagehandler.py b/pagehandler.py index eba862f..ea01be1 100755 --- a/pagehandler.py +++ b/pagehandler.py @@ -5,7 +5,7 @@ import cgi import os import sys import patchtracker.Conf as Conf -from patchtracker.Templates import ErrorTemplate, PatchTemplate, PackageVersTemplate, LetterTocTemplate, FrontPageTemplate +from patchtracker.Templates import ErrorTemplate, PatchTemplate, PackageVersTemplate, LetterTocTemplate, FrontPageTemplate, SearchResultsTemplate from patchtracker.DiffGzHandler import DiffGzHandler import patchtracker.DB as DB from patchtracker.DB import PatchTrackerDB @@ -83,15 +83,28 @@ class PatchCmd: class PackageCmd: def __init__(self, args): - self.db = PatchTrackerDB() - self.db.setFactory(DB.srcpkg_factory) + db = PatchTrackerDB() self.name = args[0] - self.version = args[1] - self.srcpkg = self.db.findSourcePackage(self) + if len(args) > 1: + version = args[1] + else: + version = None + self.toc = db.findCollection(package=self.name, version=version) + if self.toc.size() == 0: + self.toc = db.findCollection(package="%"+self.name+"%", version=version) def output(self): - print "Content-Type: text/html\n\n" - print PackageVersTemplate(self.srcpkg) + plist = self.toc.getletter(self.name) + if not plist or len(plist) == 0: + error("can't find any package named or containing '%s'"%self.name) + else: + p = self.toc.getpackage(self.name) + print "Content-Type: text/html\n\n" + if not p or len(p) > 1: + print SearchResultsTemplate(self.name, self.toc) + else: + print PackageVersTemplate(p.popitem()[1]) + class IndexCmd: def __init__(self, args): @@ -112,9 +125,8 @@ class JumpCmd: self.name = form.getfirst("package") def output(self): - print "Location: http://%s%s/index/%s#%s\n\n"%( - os.getenv("HTTP_HOST"), Conf.root_url, - SourceArchive.getidx(self.name), self.name) + print "Location: http://%s%s/package/%s\n\n"%( + os.getenv("HTTP_HOST"), Conf.root_url, self.name) class FrontPageCmd: def __init__(self): diff --git a/patchtracker/DB.py b/patchtracker/DB.py index 370d691..9324e97 100644 --- a/patchtracker/DB.py +++ b/patchtracker/DB.py @@ -66,13 +66,6 @@ class PatchTrackerDB: def setFactory(self, factory): self.db.row_factory = factory - def findSourcePackage(self, srcpkg): - q = "SELECT * FROM packages WHERE name=? AND version=?" - cursor = self.db.cursor() - cursor.execute(q, (srcpkg.name, srcpkg.version)) - s = cursor.fetchone() - return s - def saveSourcePackage(self, srcpkg): cursor = self.db.cursor() #print "creating new record for",srcpkg @@ -83,42 +76,31 @@ class PatchTrackerDB: srcpkg.version,srcpkg.diffgz_name,srcpkg.diffgz_size, srcpkg.diffgz_md5sum)) - def findSuite(self, suite): - q = "SELECT * FROM suites WHERE name = ?" + def saveSuite(self, suite): + q = "INSERT OR REPLACE INTO suites (id,name) \ + VALUES ((SELECT MAX(id)+1 FROM suites),?)" cursor = self.db.cursor() cursor.execute(q, (suite,)) - return cursor.fetchone() - def saveSuite(self, suite): - s = self.findSuite(suite) - if not s: - q = "INSERT INTO suites (id,name) \ - VALUES ((SELECT MAX(id)+1 FROM suites),?)" - cursor = self.db.cursor() - cursor.execute(q, (suite,)) - - def findComponent(self, component): - q = "SELECT * FROM components WHERE name = ?" + def saveComponent(self, component): + q = "INSERT OR REPLACE INTO components (id,name) \ + VALUES ((SELECT MAX(id)+1 FROM components),?)" cursor = self.db.cursor() cursor.execute(q, (component,)) - return cursor.fetchone() - def saveComponent(self, component): - c = self.findComponent(component) - if not c: - q = "INSERT INTO components (id,name) \ - VALUES ((SELECT MAX(id)+1 FROM components),?)" - cursor = self.db.cursor() - cursor.execute(q, (component,)) - - def findCollection(self, package="%"): + def findCollection(self, package="%", version=None): oldfactory = self.db.row_factory self.db.row_factory = srcpkg_collection_factory cursor = self.db.cursor() toc = SourceArchive.SourcePackageIndex() 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,)) + qargs = (package,) + if version: + q += " AND p.version = ?" + qargs += (version,) + + cursor.execute(q, qargs) # use srcpkg_factory to fetch sourcepackages, once per suite for srcpkg,rest in cursor.fetchall(): toc.ins(srcpkg, rest["name"]) @@ -131,14 +113,6 @@ class PatchTrackerDB: def findMasterIndex(self): return self.findCollection(package="%") - def findSourcePackageRelation(self, srcpkg, suite): - q = "SELECT * FROM packages AS p,suites AS s,package_rel_map AS m \ - WHERE p.name=? AND s.name=? AND m.package_id=p.id \ - AND m.suite_id=s.id" - cursor = self.db.cursor() - cursor.execute(q, (srcpkg.name, suite)) - return cursor.fetchone() - def relateSourcePackage(self, name, version, suite, component): q = "INSERT OR REPLACE INTO package_rel_map \ (package_id,suite_id,component_id) \ diff --git a/patchtracker/SourceArchive.py b/patchtracker/SourceArchive.py index b8bc9eb..a30e07d 100755 --- a/patchtracker/SourceArchive.py +++ b/patchtracker/SourceArchive.py @@ -131,8 +131,20 @@ class SourcePackageIndex: if not self.pkgs[srcpkg.idx][srcpkg.name].has_key(rel): self.pkgs[srcpkg.idx][srcpkg.name][rel] = srcpkg + def size(self): + return sum([len(self.pkgs[i]) for i in self.pkgs.iterkeys()]) + + def getpackage(self, name): + try: + return self.getletter(name)[name] + except KeyError: + return None + def getletter(self, letter): - return self.pkgs[getidx(letter)] + try: + return self.pkgs[getidx(letter)] + except KeyError: + return None def indices(self): return sorted(self.pkgs.iterkeys()) diff --git a/patchtracker/Templates.py b/patchtracker/Templates.py index ba9764c..0848da1 100755 --- a/patchtracker/Templates.py +++ b/patchtracker/Templates.py @@ -44,8 +44,19 @@ class LetterTocTemplate(OurTemplate): tpl = os.sep.join([Conf.template_dir, "letter_toc.tmpl"]) OurTemplate.__init__(self, file=tpl) - def releases(self): - return dists +class SearchResultsTemplate(OurTemplate): + def __init__(self, search, collection): + self.pkgs = {} + self.idx = search + self.dists = {} + for idx in collection.indices(): + for name,packagelist in collection.getletter(idx).iteritems(): + self.pkgs[name] = packagelist + for d in packagelist.iterkeys(): + self.dists[d] = True + tpl = os.sep.join([Conf.template_dir, "searchresults.tmpl"]) + OurTemplate.__init__(self, file=tpl) + class ErrorTemplate(OurTemplate): def __init__(self, msg): |