X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fdatabase.py;h=095b13980ca5696d0f2984d4fbb7076487ef4102;hb=74c5a1256401a709d74c496b972cc0bd38decaa8;hp=a40696e2b2ba6aaa4a7ccf35225131d8aeaddfb3;hpb=9583602d5fa14f016ddf3f09b3ddf2d515e19768;p=dak.git diff --git a/daklib/database.py b/daklib/database.py old mode 100644 new mode 100755 index a40696e2..095b1398 --- a/daklib/database.py +++ b/daklib/database.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# DB access fucntions +""" DB access fucntions """ # Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006 James Troup # This program is free software; you can redistribute it and/or modify @@ -19,7 +19,9 @@ ################################################################################ -import sys, time, types +import sys +import time +import types ################################################################################ @@ -41,10 +43,12 @@ maintainer_cache = {} fingerprint_id_cache = {} queue_id_cache = {} uid_id_cache = {} +suite_version_cache = {} ################################################################################ def init (config, sql): + """ database module init. Just sets two variables""" global Cnf, projectB Cnf = config @@ -52,6 +56,11 @@ def init (config, sql): def do_query(q): + """ + Executes a database query q. Writes statistics to stderr and returns + the result. + + """ sys.stderr.write("query: \"%s\" ... " % (q)) before = time.time() r = projectB.query(q) @@ -68,6 +77,7 @@ def do_query(q): ################################################################################ def get_suite_id (suite): + """ Returns database suite_id for given suite, caches result. """ global suite_id_cache if suite_id_cache.has_key(suite): @@ -84,6 +94,7 @@ def get_suite_id (suite): return suite_id def get_section_id (section): + """ Returns database section_id for given section, caches result. """ global section_id_cache if section_id_cache.has_key(section): @@ -100,6 +111,7 @@ def get_section_id (section): return section_id def get_priority_id (priority): + """ Returns database priority_id for given priority, caches result. """ global priority_id_cache if priority_id_cache.has_key(priority): @@ -116,6 +128,7 @@ def get_priority_id (priority): return priority_id def get_override_type_id (type): + """ Returns database override_id for given override_type type, caches result. """ global override_type_id_cache if override_type_id_cache.has_key(type): @@ -132,6 +145,7 @@ def get_override_type_id (type): return override_type_id def get_architecture_id (architecture): + """ Returns database architecture_id for given architecture, caches result. """ global architecture_id_cache if architecture_id_cache.has_key(architecture): @@ -148,6 +162,7 @@ def get_architecture_id (architecture): return architecture_id def get_archive_id (archive): + """ Returns database archive_id for given archive, caches result. """ global archive_id_cache archive = archive.lower() @@ -166,6 +181,7 @@ def get_archive_id (archive): return archive_id def get_component_id (component): + """ Returns database component_id for given component, caches result. """ global component_id_cache component = component.lower() @@ -184,6 +200,18 @@ def get_component_id (component): return component_id def get_location_id (location, component, archive): + """ + Returns database location_id for given combination of + location + component + archive. + + The 3 parameters are the database ids returned by the respective + "get_foo_id" functions. + + The result will be cached. + + """ global location_id_cache cache_key = location + '_' + component + '_' + location @@ -207,6 +235,7 @@ def get_location_id (location, component, archive): return location_id def get_source_id (source, version): + """ Returns database source_id for given combination of source and version, caches result. """ global source_id_cache cache_key = source + '_' + version + '_' @@ -223,9 +252,41 @@ def get_source_id (source, version): return source_id +def get_suite_version(source, suite): + """ Returns database version for a given source in a given suite, caches result. """ + global suite_version_cache + cache_key = "%s_%s" % (source, suite) + + if suite_version_cache.has_key(cache_key): + return suite_version_cache[cache_key] + + q = projectB.query(""" + SELECT s.version FROM source s, suite su, src_associations sa + WHERE sa.source=s.id + AND sa.suite=su.id + AND su.suite_name='%s' + AND s.source='%s'""" + % (suite, source)) + + if not q.getresult(): + return None + + version = q.getresult()[0][0] + suite_version_cache[cache_key] = version + + return version + ################################################################################ def get_or_set_maintainer_id (maintainer): + """ + If maintainer does not have an entry in the maintainer table yet, create one + and return its id. + If maintainer already has an entry, simply return its id. + + Result is cached. + + """ global maintainer_id_cache if maintainer_id_cache.has_key(maintainer): @@ -243,6 +304,14 @@ def get_or_set_maintainer_id (maintainer): ################################################################################ def get_or_set_keyring_id (keyring): + """ + If keyring does not have an entry in the keyring table yet, create one + and return its id. + If keyring already has an entry, simply return its id. + + Result is cached. + + """ global keyring_id_cache if keyring_id_cache.has_key(keyring): @@ -260,6 +329,14 @@ def get_or_set_keyring_id (keyring): ################################################################################ def get_or_set_uid_id (uid): + """ + If uid does not have an entry in the uid table yet, create one + and return its id. + If uid already has an entry, simply return its id. + + Result is cached. + + """ global uid_id_cache if uid_id_cache.has_key(uid): @@ -277,6 +354,14 @@ def get_or_set_uid_id (uid): ################################################################################ def get_or_set_fingerprint_id (fingerprint): + """ + If fingerprintd does not have an entry in the fingerprint table yet, create one + and return its id. + If fingerprint already has an entry, simply return its id. + + Result is cached. + + """ global fingerprint_id_cache if fingerprint_id_cache.has_key(fingerprint): @@ -294,6 +379,25 @@ def get_or_set_fingerprint_id (fingerprint): ################################################################################ def get_files_id (filename, size, md5sum, location_id): + """ + Returns -1, -2 or the file_id for a given combination of + filename + size + md5sum + location_id. + + The database is queried using filename and location_id, size and md5sum are for + extra checks. + + Return values: + -1 - The given combination of arguments result in more (or less) than + one result from the database + -2 - The given size and md5sum do not match the values in the database + anything else is a file_id + + Result is cached. + + """ global files_id_cache cache_key = "%s_%d" % (filename, location_id) @@ -320,6 +424,14 @@ def get_files_id (filename, size, md5sum, location_id): ################################################################################ def get_or_set_queue_id (queue): + """ + If queue does not have an entry in the queue_name table yet, create one + and return its id. + If queue already has an entry, simply return its id. + + Result is cached. + + """ global queue_id_cache if queue_id_cache.has_key(queue): @@ -336,10 +448,16 @@ def get_or_set_queue_id (queue): ################################################################################ -def set_files_id (filename, size, md5sum, location_id): +def set_files_id (filename, size, md5sum, sha1sum, sha256sum, location_id): + """ + Insert a new entry into the files table. + + Returns the new file_id + + """ global files_id_cache - projectB.query("INSERT INTO files (filename, size, md5sum, location) VALUES ('%s', %d, '%s', %d)" % (filename, long(size), md5sum, location_id)) + projectB.query("INSERT INTO files (filename, size, md5sum, sha1sum, sha256sum, location) VALUES ('%s', %d, '%s', '%s', '%s', %d)" % (filename, long(size), md5sum, sha1sum, sha256sum, location_id)) return get_files_id (filename, size, md5sum, location_id) @@ -356,6 +474,7 @@ def set_files_id (filename, size, md5sum, location_id): ################################################################################ def get_maintainer (maintainer_id): + """ Return the name of the maintainer behind maintainer_id """ global maintainer_cache if not maintainer_cache.has_key(maintainer_id): @@ -365,3 +484,29 @@ def get_maintainer (maintainer_id): return maintainer_cache[maintainer_id] ################################################################################ + +def get_suites(pkgname, src=False): + """ Return the suites in which pkgname is. If src is True, query for source package, else binary. """ + if src: + sql = """ + SELECT suite_name + FROM source, + src_associations, + suite + WHERE source.id = src_associations.source + AND source.source = '%s' + AND src_associations.suite = suite.id + """ % (pkgname) + else: + sql = """ + SELECT suite_name + FROM binaries, + bin_associations, + suite + WHERE binaries.id = bin_associations.bin + AND package = '%s' + AND bin_associations.suite = suite.id + """ % (pkgname) + + q = projectB.query(sql) + return map(lambda x: x[0], q.getresult())