]> git.decadent.org.uk Git - dak.git/blobdiff - dak/generate_filelist.py
show-new: reduce number of open DB sessions
[dak.git] / dak / generate_filelist.py
index 43a76054fefe2a3d21543e5b41a1a13251093ed0..e6a2ba57c3b53e21b8e83c90c8ad74e3c46a4b06 100755 (executable)
@@ -22,8 +22,22 @@ Generate file lists for apt-ftparchive.
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
+################################################################################
+
+# Ganneff> Please go and try to lock mhy now. After than try to lock NEW.
+# twerner> !lock mhy
+# dak> twerner: You suck, this is already locked by Ganneff
+# Ganneff> now try with NEW
+# twerner> !lock NEW
+# dak> twerner: also locked NEW
+# mhy> Ganneff: oy, stop using me for locks and highlighting me you tall muppet
+# Ganneff> hehe :)
+
+################################################################################
+
 from daklib.dbconn import *
 from daklib.config import Config
+from daklib.threadpool import ThreadPool
 from daklib import utils
 import apt_pkg, os, sys
 
@@ -44,11 +58,46 @@ def getSources(suite, component, session):
 
 def getBinaries(suite, component, architecture, type, session):
     query = """
-        SELECT path, filename
-            FROM binfiles_suite_component_arch
-            WHERE suite = :suite AND component = :component AND type = :type AND
-                  (architecture = :architecture OR architecture = 2)
-            ORDER BY filename
+CREATE TEMP TABLE gf_candidates (
+    filename text,
+    path text,
+    architecture integer,
+    src integer,
+    source text);
+
+INSERT INTO gf_candidates (filename, path, architecture, src, source)
+    SELECT f.filename, l.path, b.architecture, b.source as src, s.source
+       FROM binaries b
+       JOIN bin_associations ba ON b.id = ba.bin
+       JOIN source s ON b.source = s.id
+        JOIN files f ON b.file = f.id
+        JOIN location l ON f.location = l.id
+       WHERE ba.suite = :suite AND b.type = :type AND
+            l.component = :component AND b.architecture IN (2, :architecture);
+
+WITH arch_any AS
+
+    (SELECT path, filename FROM gf_candidates
+       WHERE architecture > 2),
+
+     arch_all_with_any AS
+    (SELECT path, filename FROM gf_candidates
+       WHERE architecture = 2 AND
+             src IN (SELECT src FROM gf_candidates WHERE architecture > 2)),
+
+     arch_all_without_any AS
+    (SELECT path, filename FROM gf_candidates
+       WHERE architecture = 2 AND
+             source NOT IN (SELECT DISTINCT source FROM gf_candidates WHERE architecture > 2)),
+
+     filelist AS
+    (SELECT * FROM arch_any
+    UNION
+    SELECT * FROM arch_all_with_any
+    UNION
+    SELECT * FROM arch_all_without_any)
+
+    SELECT * FROM filelist ORDER BY filename
     """
     args = { 'suite': suite.suite_id,
              'component': component.component_id,
@@ -69,16 +118,22 @@ def listPath(suite, component, architecture = None, type = None):
     pathname = os.path.join(Config()["Dir::Lists"], filename)
     return utils.open_file(pathname, "w")
 
-def writeSourceList(suite, component, session):
+def writeSourceList(args):
+    (suite, component) = args
     file = listPath(suite, component)
+    session = DBConn().session()
     for filename in getSources(suite, component, session):
         file.write(filename + '\n')
+    session.close()
     file.close()
 
-def writeBinaryList(suite, component, architecture, type, session):
+def writeBinaryList(args):
+    (suite, component, architecture, type) = args
     file = listPath(suite, component, architecture, type)
+    session = DBConn().session()
     for filename in getBinaries(suite, component, architecture, type, session):
         file.write(filename + '\n')
+    session.close()
     file.close()
 
 def usage():
@@ -119,6 +174,7 @@ def main():
         usage()
     session = DBConn().session()
     suite_arch = session.query(SuiteArchitecture)
+    threadpool = ThreadPool()
     for suite_name in utils.split_args(Options['Suite']):
         suite = query_suites.filter_by(suite_name = suite_name).one()
         join = suite_arch.filter_by(suite_id = suite.suite_id)
@@ -131,14 +187,17 @@ def main():
                 try:
                     join.filter_by(arch_id = architecture.arch_id).one()
                     if architecture_name == 'source':
-                        writeSourceList(suite, component, session)
+                        threadpool.queueTask(writeSourceList, (suite, component))
                     elif architecture_name != 'all':
-                        writeBinaryList(suite, component, architecture, 'deb', session)
-                        writeBinaryList(suite, component, architecture, 'udeb', session)
+                        threadpool.queueTask(writeBinaryList,
+                            (suite, component, architecture, 'deb'))
+                        threadpool.queueTask(writeBinaryList,
+                            (suite, component, architecture, 'udeb'))
                 except:
                     pass
+    threadpool.joinAll()
     # this script doesn't change the database
-    session.rollback()
+    session.close()
 
 if __name__ == '__main__':
     main()