Author: astaric
Date: Wed May  8 11:14:34 2013
New Revision: 1480224

URL: http://svn.apache.org/r1480224
Log:
Translate SELECT part of CREATE TABLE ... AS SELECT ... queries.

Fixes an issue where some product plugin tables were prepopulated with
rows from global product.

Modified:
    bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py
    bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py
    bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py

Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py?rev=1480224&r1=1480223&r2=1480224&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/multiproduct/dbcursor.py Wed May  
8 11:14:34 2013
@@ -700,7 +700,16 @@ class BloodhoundProductSQLTranslate(obje
             table_name = self._get_entity_name_from_token(parent, token)
             if not table_name:
                 raise Exception("Invalid CREATE TABLE statement, expected 
table name")
+
+            as_token = self._token_next_match(parent, token,
+                                              Tokens.Keyword, 'AS')
             self._replace_table_entity_name(parent, token, table_name)
+
+            if as_token:
+                select_token = self._token_next_match(parent, as_token,
+                                                      Tokens.DML, 'SELECT')
+                if select_token:
+                    return self._select(parent, select_token)
         elif token.match(Tokens.Keyword, ['UNIQUE', 'INDEX']):
             if token.match(Tokens.Keyword, 'UNIQUE'):
                 token = self._token_next(parent, token)

Modified: bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py?rev=1480224&r1=1480223&r2=1480224&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/tests/db/cursor.py Wed May  8 
11:14:34 2013
@@ -955,8 +955,13 @@ data = {
                                          " PRIMARY KEY(bklg_id, tkt_id))""",
 """CREATE TEMPORARY TABLE "PRODUCT_backlog_ticket" (bklg_id INTEGER NOT NULL,"
                                          " tkt_id INTEGER NOT NULL,"
-                                                  " tkt_order REAL,"
-                                     " PRIMARY KEY(bklg_id, tkt_id))"""
+                                         " tkt_order REAL,"
+                                         " PRIMARY KEY(bklg_id, tkt_id))"""
+        ),
+        (
+"""CREATE TEMPORARY TABLE table_old AS SELECT * FROM table""",
+"""CREATE TEMPORARY TABLE "PRODUCT_table_old" AS SELECT * FROM"""
+""" (SELECT * FROM "PRODUCT_table") AS table""",
         ),
     ],
 

Modified: bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py?rev=1480224&r1=1480223&r2=1480224&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py Wed May  8 
11:14:34 2013
@@ -312,6 +312,7 @@ class EnvironmentUpgradeTestCase(unittes
             db("""SELECT * FROM "@_dummy_table" """)
 
     def test_upgrading_existing_plugin_leaves_data_in_global_env(self):
+        DummyPlugin.version = 2
         self._enable_component(DummyPlugin)
         self.env.upgrade()
         with self.env.db_direct_transaction as db:
@@ -427,27 +428,45 @@ class DummyPlugin(Component):
 
     def upgrade_environment(self, db):
         old_version = current_version = self.get_version(db)
+        db_connector, dummy = DatabaseManager(self.env)._get_connector()
 
-        if current_version < 1 <= self.version:
-            db_connector, dummy = DatabaseManager(self.env)._get_connector()
-            for statement in db_connector.to_sql(DUMMY_TABLE):
-                db(statement)
-            current_version = 1
         while current_version < self.version:
+            if current_version > 0:
+                db("CREATE TEMPORARY TABLE dummy_table_old AS "
+                               "SELECT * FROM dummy_table")
+                db("DROP TABLE dummy_table")
+
+            table = self.construct_dummy_table(current_version+1)
+            for statement in db_connector.to_sql(table):
+                db(statement)
+
+            if current_version > 0:
+                cols = ['id'] + ['v%i' % (i+1)
+                                 for i in range(current_version+1)]
+                db("""INSERT INTO dummy_table (%s)
+                                  SELECT %s, '' FROM dummy_table_old
+                   """ % (', '.join(cols), ', '.join(cols[:-1])))
+                db("DROP TABLE dummy_table_old")
+
             current_version += 1
-            db("ALTER TABLE dummy_table "
-               "ADD COLUMN v%d text" % current_version)
+
         if current_version != old_version:
             self.update_version(db, current_version)
 
+    def construct_dummy_table(self, n_custom_fields=1):
+        fields = [Column('id')] + [
+            Column('v%d' % (i+1)) for i in range(n_custom_fields)
+        ]
+        return Table('dummy_table')[fields]
+
     def get_version(self, db):
         rows = db("SELECT value FROM system WHERE name = %s",
                   (self.__class__.__name__,))
-        return int(rows[0][0]) if rows else -1
+        return int(rows[0][0]) if rows else 0
 
     def update_version(self, db, version):
         old_version = self.get_version(db)
-        if old_version != -1:
+        if old_version:
             db("UPDATE system SET value=%s WHERE name=%s",
                (version, self.__class__.__name__,))
         else:
@@ -455,11 +474,6 @@ class DummyPlugin(Component):
                % (self.__class__.__name__, version))
         return version
 
-DUMMY_TABLE = Table('dummy_table')[(
-    Column('id'),
-    Column('v1'),
-)]
-
 
 def test_suite():
     suite = unittest.TestSuite()


Reply via email to