]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/dbconn.py
Merge commit 'ftpmaster/master'
[dak.git] / daklib / dbconn.py
index 89072918a2f2c25f4a7a5c81bf39fa7c26ca36ad..bb7473dc08b85d4f64c0268e1faeb094c3aca786 100755 (executable)
@@ -35,6 +35,7 @@
 
 import os
 import psycopg2
+import psycopg2.extras
 import traceback
 
 from singleton import Singleton
@@ -132,6 +133,17 @@ class DBConn(Singleton):
         return self.db_con.commit()
 
     ## Get functions
+    def __get_single_row(self, query, values):
+        c = self.db_con.cursor(cursor_factory=psycopg2.extras.DictCursor)
+        c.execute(query, values)
+
+        if c.rowcount < 1:
+            return None
+
+        res = c.fetchone()
+
+        return res
+
     def __get_single_id(self, query, values, cachename=None):
         # This is a bit of a hack but it's an internal function only
         if cachename is not None:
@@ -168,7 +180,7 @@ class DBConn(Singleton):
         @return: the database id for the given suite
 
         """
-        return self.__get_id('id', 'suite', 'suite_name', suite)
+        return int(self.__get_id('id', 'suite', 'suite_name', suite))
 
     def get_section_id(self, section):
         """
@@ -316,6 +328,15 @@ class DBConn(Singleton):
         return self.__get_single_id("SELECT id FROM source s WHERE s.source=%(source)s AND s.version=%(version)s",
                                  {'source': source, 'version': version}, cachename='source')
 
+    def get_suite(self, suite):
+        if isinstance(suite, str):
+            suite_id = self.get_suite_id(suite.lower())
+        elif type(suite) == int:
+            suite_id = suite
+
+        return self.__get_single_row("SELECT * FROM suite WHERE id = %(id)s",
+                                     {'id': suite_id})
+
     def get_suite_version(self, source, suite):
         """
         Returns database id for a combination of C{source} and C{suite}.
@@ -398,11 +419,11 @@ class DBConn(Singleton):
             else:
                 row = cursor.fetchone()
 
-                if row[1] != size or row[2] != md5sum:
+                if row[1] != int(size) or row[2] != md5sum:
                     res =  -2
 
                 else:
-                    self.caches[cachename].SetValue(values, row[0])
+                    self.caches['files'].SetValue(values, row[0])
                     res = row[0]
 
         return res
@@ -546,11 +567,15 @@ class DBConn(Singleton):
 
         c.execute("BEGIN WORK")
         try:
+            arch_id = self.get_architecture_id(package['Architecture'])
 
-                # Remove any already existing recorded files for this package
+            # Remove any already existing recorded files for this package
             c.execute("""DELETE FROM pending_content_associations
                          WHERE package=%(Package)s
-                         AND version=%(Version)s""", package )
+                         AND version=%(Version)s
+                         AND architecture=%(ArchID)s""", {'Package': package['Package'],
+                                                          'Version': package['Version'],
+                                                          'ArchID':  arch_id})
 
             for fullpath in fullpaths:
                 (path, file) = os.path.split(fullpath)
@@ -562,12 +587,41 @@ class DBConn(Singleton):
                 path_id = self.get_or_set_contents_path_id(path)
 
                 c.execute("""INSERT INTO pending_content_associations
-                               (package, version, filepath, filename)
-                           VALUES (%%(Package)s, %%(Version)s, '%d', '%d')""" % (path_id, file_id),
-                          package )
+                               (package, version, architecture, filepath, filename)
+                            VALUES (%%(Package)s, %%(Version)s, '%d', '%d', '%d')"""
+                    % (arch_id, path_id, file_id), package )
+
             c.execute("COMMIT")
             return True
         except:
             traceback.print_exc()
             c.execute("ROLLBACK")
             return False
+
+################################################################################
+
+class Suite(object):
+    # This should be kept in sync with the suites table;
+    # we should probably just do introspection on the table
+    # (or maybe use an ORM)
+    _fieldnames = ['announce', 'changelogbase', 'codename', 'commentsdir',
+                   'copychanges', 'copydotdak', 'description', 'id',
+                   'label', 'notautomatic', 'origin', 'overridecodename',
+                   'overridesuite', 'policy_engine', 'priority', 'suite_name',
+                   'untouchable', 'validtime', 'version']
+
+    def __init_fields(self):
+        for k in self._fieldnames:
+            setattr(self, k, None)
+
+    def __init__(self, suite):
+        self.__init_fields()
+        if suite is not None:
+            db_conn = DBConn()
+            suite_data = db_conn.get_suite(suite)
+            if suite_data is not None:
+                for k in suite_data.keys():
+                    setattr(self, k, suite_data[k])
+
+
+