X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fstats.py;h=f33873475029ff701fdd2509ee57275fbf28b6f6;hb=f601bd71e61c6c265b5fa1f296a5258385e6f154;hp=df608214cda1f84d7c615ca5a5dbc634ed176b8f;hpb=5ea129bba83114905c1266b77744eeed8e9bb020;p=dak.git diff --git a/dak/stats.py b/dak/stats.py index df608214..f3387347 100755 --- a/dak/stats.py +++ b/dak/stats.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Various statistical pr0nography fun and games +""" Various statistical pr0nography fun and games """ # Copyright (C) 2000, 2001, 2002, 2003, 2006 James Troup # This program is free software; you can redistribute it and/or modify @@ -30,14 +30,15 @@ ################################################################################ -import pg, sys +import sys import apt_pkg -import daklib.utils + +from daklib import utils +from daklib.dbconn import DBConn, get_suite_architectures, Suite, Architecture ################################################################################ Cnf = None -projectB = None ################################################################################ @@ -58,22 +59,25 @@ The following MODEs are available: ################################################################################ def per_arch_space_use(): - q = projectB.query(""" -SELECT a.arch_string as Architecture, sum(f.size) + session = DBConn().session() + q = session.execute(""" +SELECT a.arch_string as Architecture, sum(f.size) AS sum FROM files f, binaries b, architecture a WHERE a.id=b.architecture AND f.id=b.file - GROUP BY a.arch_string""") - print q - q = projectB.query("SELECT sum(size) FROM files WHERE filename ~ '.(diff.gz|tar.gz|dsc)$'") - print q + GROUP BY a.arch_string ORDER BY sum""").fetchall() + for j in q: + print "%-15.15s %s" % (j[0], j[1]) + print + q = session.execute("SELECT sum(size) FROM files WHERE filename ~ '.(diff.gz|tar.gz|dsc)$'").fetchall() + print "%-15.15s %s" % ("Source", q[0][0]) ################################################################################ def daily_install_stats(): stats = {} - file = daklib.utils.open_file("2001-11") - for line in file.readlines(): - split = line.strip().split('~') + f = utils.open_file("2001-11") + for line in f.readlines(): + split = line.strip().split('|') program = split[1] if program != "katie" and program != "process-accepted": continue @@ -107,80 +111,55 @@ def longest(list): longest = l return longest -def suite_sort(a, b): - if Cnf.has_key("Suite::%s::Priority" % (a)): - a_priority = int(Cnf["Suite::%s::Priority" % (a)]) - else: - a_priority = 0 - if Cnf.has_key("Suite::%s::Priority" % (b)): - b_priority = int(Cnf["Suite::%s::Priority" % (b)]) - else: - b_priority = 0 - return cmp(a_priority, b_priority) - def output_format(suite): output_suite = [] for word in suite.split("-"): output_suite.append(word[0]) return "-".join(output_suite) -# Obvious query with GROUP BY and mapped names -> 50 seconds -# GROUP BY but ids instead of suite/architecture names -> 28 seconds -# Simple query -> 14 seconds -# Simple query into large dictionary + processing -> 21 seconds -# Simple query into large pre-created dictionary + processing -> 18 seconds - def number_of_packages(): arches = {} arch_ids = {} suites = {} suite_ids = {} d = {} + session = DBConn().session() # Build up suite mapping - q = projectB.query("SELECT id, suite_name FROM suite") - suite_ql = q.getresult() - for i in suite_ql: - (id, name) = i - suites[id] = name - suite_ids[name] = id + for i in session.query(Suite).all(): + suites[i.suite_id] = i.suite_name + suite_ids[i.suite_name] = i.suite_id # Build up architecture mapping - q = projectB.query("SELECT id, arch_string FROM architecture") - for i in q.getresult(): - (id, name) = i - arches[id] = name - arch_ids[name] = id + for i in session.query(Architecture).all(): + arches[i.arch_id] = i.arch_string + arch_ids[i.arch_string] = i.arch_id # Pre-create the dictionary for suite_id in suites.keys(): d[suite_id] = {} for arch_id in arches.keys(): d[suite_id][arch_id] = 0 # Get the raw data for binaries - q = projectB.query(""" -SELECT ba.suite, b.architecture - FROM binaries b, bin_associations ba - WHERE b.id = ba.bin""") # Simultate 'GROUP by suite, architecture' with a dictionary - for i in q.getresult(): - (suite_id, arch_id) = i - d[suite_id][arch_id] = d[suite_id][arch_id] + 1 + # XXX: Why don't we just get the DB to do this? + for i in session.execute("""SELECT suite, architecture, COUNT(suite) + FROM bin_associations + LEFT JOIN binaries ON bin = binaries.id + GROUP BY suite, architecture""").fetchall(): + d[ i[0] ][ i[1] ] = i[2] # Get the raw data for source arch_id = arch_ids["source"] - q = projectB.query(""" -SELECT suite, count(suite) FROM src_associations GROUP BY suite;""") - for i in q.getresult(): + for i in session.execute('SELECT suite, COUNT(suite) FROM src_associations GROUP BY suite').fetchall(): (suite_id, count) = i d[suite_id][arch_id] = d[suite_id][arch_id] + count ## Print the results # Setup suite_list = suites.values() - suite_list.sort(suite_sort) suite_id_list = [] suite_arches = {} for suite in suite_list: suite_id = suite_ids[suite] suite_arches[suite_id] = {} - for arch in Cnf.ValueList("Suite::%s::Architectures" % (suite)): - suite_arches[suite_id][arch] = "" + for arch in get_suite_architectures(suite): + suite_arches[suite_id][arch.arch_string] = "" suite_id_list.append(suite_id) output_list = [ output_format(i) for i in suite_list ] longest_suite = longest(output_list) @@ -201,7 +180,7 @@ SELECT suite, count(suite) FROM src_associations GROUP BY suite;""") output = output + arch.center(longest_arch)+" |" for suite_id in suite_id_list: if suite_arches[suite_id].has_key(arch): - count = repr(d[suite_id][arch_id]) + count = "%d" % d[suite_id][arch_id] else: count = "-" output = output + count.rjust(longest_suite)+" |" @@ -211,30 +190,28 @@ SELECT suite, count(suite) FROM src_associations GROUP BY suite;""") ################################################################################ def main (): - global Cnf, projectB + global Cnf - Cnf = daklib.utils.get_conf() + Cnf = utils.get_conf() Arguments = [('h',"help","Stats::Options::Help")] for i in [ "help" ]: - if not Cnf.has_key("Stats::Options::%s" % (i)): - Cnf["Stats::Options::%s" % (i)] = "" + if not Cnf.has_key("Stats::Options::%s" % (i)): + Cnf["Stats::Options::%s" % (i)] = "" - args = apt_pkg.ParseCommandLine(Cnf, Arguments, sys.argv) + args = apt_pkg.parse_commandline(Cnf, Arguments, sys.argv) - Options = Cnf.SubTree("Stats::Options") + Options = Cnf.subtree("Stats::Options") if Options["Help"]: - usage() + usage() if len(args) < 1: - daklib.utils.warn("dak stats requires a MODE argument") + utils.warn("dak stats requires a MODE argument") usage(1) elif len(args) > 1: - daklib.utils.warn("dak stats accepts only one MODE argument") + utils.warn("dak stats accepts only one MODE argument") usage(1) mode = args[0].lower() - projectB = pg.connect(Cnf["DB::Name"], Cnf["DB::Host"], int(Cnf["DB::Port"])) - if mode == "arch-space": per_arch_space_use() elif mode == "pkg-nums": @@ -242,11 +219,10 @@ def main (): elif mode == "daily-install": daily_install_stats() else: - daklib.utils.warn("unknown mode '%s'" % (mode)) + utils.warn("unknown mode '%s'" % (mode)) usage(1) ################################################################################ if __name__ == '__main__': main() -