]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/database.py
Merge commit 'ftpmaster/master' into psycopg2
[dak.git] / daklib / database.py
old mode 100644 (file)
new mode 100755 (executable)
index 2aad601..e2c596a
@@ -19,7 +19,9 @@
 
 ################################################################################
 
-import sys, time, types
+import sys
+import time
+import types
 
 ################################################################################
 
@@ -34,16 +36,19 @@ archive_id_cache = {}
 component_id_cache = {}
 location_id_cache = {}
 maintainer_id_cache = {}
+keyring_id_cache = {}
 source_id_cache = {}
 files_id_cache = {}
 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
@@ -51,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)
@@ -67,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):
@@ -83,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):
@@ -99,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):
@@ -115,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):
@@ -131,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):
@@ -147,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()
@@ -165,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()
@@ -183,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
@@ -206,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 + '_'
@@ -222,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):
@@ -241,7 +303,40 @@ 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):
+        return keyring_id_cache[keyring]
+
+    q = projectB.query("SELECT id FROM keyrings WHERE name = '%s'" % (keyring))
+    if not q.getresult():
+        projectB.query("INSERT INTO keyrings (name) VALUES ('%s')" % (keyring))
+        q = projectB.query("SELECT id FROM keyrings WHERE name = '%s'" % (keyring))
+    keyring_id = q.getresult()[0][0]
+    keyring_id_cache[keyring] = keyring_id
+
+    return keyring_id
+
+################################################################################
+
 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):
@@ -259,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):
@@ -276,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)
@@ -302,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):
@@ -318,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)
 
@@ -338,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):
@@ -347,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())