From 67d9d6088c28ada9bca045d7b6c09c3982ad59e2 Mon Sep 17 00:00:00 2001 From: Ansgar Burchardt Date: Sun, 28 Jul 2013 15:35:21 +0200 Subject: [PATCH] dak/rm.py: use database instead of file access The projectb database knows which binary packages is built from which source package. So use this information instead of looking at the actual files. This makes the rm command faster and also works with an outdated version of the archive, as for example present on the developer-accessible mirror. --- dak/rm.py | 47 ++++++++++++++++------------------------------- 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/dak/rm.py b/dak/rm.py index e90cfea0..0d40e22b 100755 --- a/dak/rm.py +++ b/dak/rm.py @@ -257,46 +257,31 @@ def main (): if Options["Binary-Only"]: # Binary-only q = session.execute("SELECT b.package, b.version, a.arch_string, b.id, b.maintainer FROM binaries b, bin_associations ba, architecture a, suite su, files f, files_archive_map af, component c WHERE ba.bin = b.id AND ba.suite = su.id AND b.architecture = a.id AND b.file = f.id AND af.file_id = f.id AND af.archive_id = su.archive_id AND af.component_id = c.id %s %s %s %s" % (con_packages, con_suites, con_components, con_architectures)) - for i in q.fetchall(): - to_remove.append(i) + to_remove.extend(q) else: # Source-only - source_packages = {} - q = session.execute("SELECT archive.path || '/pool/' || c.name || '/', f.filename, s.source, s.version, 'source', s.id, s.maintainer FROM source s, src_associations sa, suite su, archive, files f, files_archive_map af, component c WHERE sa.source = s.id AND sa.suite = su.id AND archive.id = su.archive_id AND s.file = f.id AND af.file_id = f.id AND af.archive_id = su.archive_id AND af.component_id = c.id %s %s %s" % (con_packages, con_suites, con_components)) - for i in q.fetchall(): - source_packages[i[2]] = i[:2] - to_remove.append(i[2:]) + q = session.execute("SELECT s.source, s.version, 'source', s.id, s.maintainer FROM source s, src_associations sa, suite su, archive, files f, files_archive_map af, component c WHERE sa.source = s.id AND sa.suite = su.id AND archive.id = su.archive_id AND s.file = f.id AND af.file_id = f.id AND af.archive_id = su.archive_id AND af.component_id = c.id %s %s %s" % (con_packages, con_suites, con_components)) + to_remove.extend(q) if not Options["Source-Only"]: # Source + Binary - binary_packages = {} - # First get a list of binary package names we suspect are linked to the source q = session.execute("SELECT DISTINCT b.package FROM binaries b, source s, src_associations sa, suite su, archive, files f, files_archive_map af, component c WHERE b.source = s.id AND sa.source = s.id AND sa.suite = su.id AND su.archive_id = archive.id AND s.file = f.id AND f.id = af.file_id AND af.archive_id = su.archive_id AND af.component_id = c.id %s %s %s" % (con_packages, con_suites, con_components)) - for i in q.fetchall(): - binary_packages[i[0]] = "" - # Then parse each .dsc that we found earlier to see what binary packages it thinks it produces - for i in source_packages.keys(): - filename = "/".join(source_packages[i]) - try: - dsc = utils.parse_changes(filename, dsc_file=1) - except CantOpenError: - utils.warn("couldn't open '%s'." % (filename)) - continue - for package in dsc.get("binary").split(','): - package = package.strip() - binary_packages[package] = "" # Then for each binary package: find any version in # unstable, check the Source: field in the deb matches our # source package and if so add it to the list of packages # to be removed. - for package in binary_packages.keys(): - q = session.execute("SELECT archive.path || '/pool/' || c.name || '/', f.filename, b.package, b.version, a.arch_string, b.id, b.maintainer FROM binaries b, bin_associations ba, architecture a, suite su, archive, files f, files_archive_map af, component c WHERE ba.bin = b.id AND ba.suite = su.id AND archive.id = su.archive_id AND b.architecture = a.id AND b.file = f.id AND f.id = af.file_id AND af.archive_id = su.archive_id AND af.component_id = c.id %s %s %s AND b.package = '%s'" % (con_suites, con_components, con_architectures, package)) - for i in q.fetchall(): - filename = "/".join(i[:2]) - control = apt_pkg.TagSection(utils.deb_extract_control(utils.open_file(filename))) - source = control.find("Source", control.find("Package")) - source = re_strip_source_version.sub('', source) - if source_packages.has_key(source): - to_remove.append(i[2:]) + q = session.execute(""" + SELECT b.package, b.version, a.arch_string, b.id, b.maintainer + FROM binaries b + JOIN bin_associations ba ON b.id = ba.bin + JOIN architecture a ON b.architecture = a.id + JOIN suite su ON ba.suite = su.id + JOIN archive ON archive.id = su.archive_id + JOIN files_archive_map af ON b.file = af.file_id AND af.archive_id = archive.id + JOIN component c ON af.component_id = c.id + JOIN source s ON b.source = s.id + JOIN src_associations sa ON s.id = sa.source AND sa.suite = su.id + WHERE TRUE %s %s %s %s""" % (con_packages, con_suites, con_components, con_architectures)) + to_remove.extend(q) print "done." if not to_remove: -- 2.39.5