]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/dbconn.py
Merge remote branch 'drkranz/overrides' into merge
[dak.git] / daklib / dbconn.py
index a6878690e9f9e1b018b48e873696a8eeadd14351..baa16d0410a8095d54ec4494c58935a13b7fe95d 100755 (executable)
@@ -45,7 +45,7 @@ from tempfile import mkstemp, mkdtemp
 from inspect import getargspec
 
 import sqlalchemy
-from sqlalchemy import create_engine, Table, MetaData
+from sqlalchemy import create_engine, Table, MetaData, Column, Integer
 from sqlalchemy.orm import sessionmaker, mapper, relation
 from sqlalchemy import types as sqltypes
 
@@ -57,6 +57,7 @@ from sqlalchemy.orm.exc import NoResultFound
 # in the database
 from config import Config
 from textutils import fix_maintainer
+from dak_exceptions import NoSourceFieldError
 
 ################################################################################
 
@@ -2398,7 +2399,7 @@ def add_deb_to_db(u, filename, session=None):
     bin_sources = get_sources_from_name(entry["source package"], entry["source version"], session=session)
     if len(bin_sources) != 1:
         raise NoSourceFieldError, "Unable to find a unique source id for %s (%s), %s, file %s, type %s, signed by %s" % \
-                                  (bin.package, bin.version, bin.architecture.arch_string,
+                                  (bin.package, bin.version, entry["architecture"],
                                    filename, bin.binarytype, u.pkg.changes["fingerprint"])
 
     bin.source_id = bin_sources[0].source_id
@@ -2759,25 +2760,21 @@ class DBConn(object):
             self.__createconn()
 
     def __setuptables(self):
-        tables = (
+        tables_with_primary = (
             'architecture',
             'archive',
             'bin_associations',
             'binaries',
             'binary_acl',
             'binary_acl_map',
-            'bin_contents',
             'build_queue',
             'build_queue_files',
+            'changelogs_text',
             'component',
             'config',
             'changes_pending_binaries',
             'changes_pending_files',
-            'changes_pending_files_map',
             'changes_pending_source',
-            'changes_pending_source_files',
-            'changes_pool_files',
-            'deb_contents',
             'dsc_files',
             'files',
             'fingerprint',
@@ -2787,7 +2784,6 @@ class DBConn(object):
             'location',
             'maintainer',
             'new_comments',
-            'override',
             'override_type',
             'pending_bin_contents',
             'policy_queue',
@@ -2799,18 +2795,64 @@ class DBConn(object):
             'src_format',
             'src_uploaders',
             'suite',
+            'uid',
+            'upload_blocks',
+        )
+
+        tables_no_primary = (
+            'bin_contents',
+            'changes_pending_files_map',
+            'changes_pending_source_files',
+            'changes_pool_files',
+            'deb_contents',
+            'override',
             'suite_architectures',
             'suite_src_formats',
             'suite_build_queue_copy',
             'udeb_contents',
-            'uid',
-            'upload_blocks',
         )
 
-        for table_name in tables:
+        views = (
+            'almost_obsolete_all_associations',
+            'almost_obsolete_src_associations',
+            'any_associations_source',
+            'bin_assoc_by_arch',
+            'bin_associations_binaries',
+            'binaries_suite_arch',
+            'binfiles_suite_component_arch',
+            'changelogs',
+            'file_arch_suite',
+            'newest_all_associations',
+            'newest_any_associations',
+            'newest_source',
+            'newest_src_association',
+            'obsolete_all_associations',
+            'obsolete_any_associations',
+            'obsolete_any_by_all_associations',
+            'obsolete_src_associations',
+            'source_suite',
+            'src_associations_bin',
+            'src_associations_src',
+            'suite_arch_by_name',
+        )
+
+        # Sqlalchemy fails to reflect the SERIAL type correctly and that
+        # is why we have to use a workaround. It can be removed as soon
+        # as we switch to version 0.6.
+        for table_name in tables_with_primary:
+            table = Table(table_name, self.db_meta, \
+                Column('id', Integer, primary_key = True), \
+                autoload=True, useexisting=True)
+            setattr(self, 'tbl_%s' % table_name, table)
+
+        for table_name in tables_no_primary:
             table = Table(table_name, self.db_meta, autoload=True)
             setattr(self, 'tbl_%s' % table_name, table)
 
+        for view_name in views:
+            view = Table(view_name, self.db_meta, autoload=True)
+            setattr(self, 'view_%s' % view_name, view)
+
     def __setupmappers(self):
         mapper(Architecture, self.tbl_architecture,
                properties = dict(arch_id = self.tbl_architecture.c.id))