* fixed table duplication for phpunit testing
authorJure Kajzer <freakolowsky@users.mediawiki.org>
Thu, 2 Jun 2011 22:23:05 +0000 (22:23 +0000)
committerJure Kajzer <freakolowsky@users.mediawiki.org>
Thu, 2 Jun 2011 22:23:05 +0000 (22:23 +0000)
includes/db/DatabaseOracle.php
includes/installer/OracleUpdater.php
maintenance/oracle/archives/patch_rebuild_dupfunc.sql [new file with mode: 0644]
maintenance/oracle/tables.sql

index c29c031..23d7249 100644 (file)
@@ -818,12 +818,12 @@ class DatabaseOracle extends DatabaseBase {
                $newName = strtoupper( $newName );
                $oldName = strtoupper( $oldName );
 
-               $tabName = $this->addIdentifierQuotes( substr( $newName, strlen( $wgDBprefix ) ) );
-               $oldPrefix = $this->addIdentifierQuotes( substr( $oldName, 0, strlen( $oldName ) - strlen( $tabName ) ) );
-               $newPrefix = $this->addIdentifierQuotes( $wgDBprefix );
+               $tabName = substr( $newName, strlen( $wgDBprefix ) );
+               $oldPrefix = substr( $oldName, 0, strlen( $oldName ) - strlen( $tabName ) );
+               $newPrefix = strtoupper( $wgDBprefix );
 
                $this->clearFlag( DBO_DDLMODE );
-               return $this->doQuery( "BEGIN DUPLICATE_TABLE( $tabName, $oldPrefix, $newPrefix, $temporary ); END;" );
+               return $this->doQuery( "BEGIN DUPLICATE_TABLE( '$tabName', '$oldPrefix', '$newPrefix', $temporary ); END;" );
        }
 
        function listTables( $prefix = null, $fname = 'DatabaseOracle::listTables' ) {
@@ -833,7 +833,7 @@ class DatabaseOracle extends DatabaseBase {
                }
                
                $owner = strtoupper( $this->mDBname );
-               $result = $this->doQuery( "SELECT table_name FROM all_tables WHERE owner='$owner' AND table_name NOT LIKE '%!_IDX$_' ESCAPE '!' $listWhere" );
+               $result = $this->doQuery( "SELECT table_name FROM all_tables WHERE owner='$owner' AND table_name NOT LIKE '%!_IDX\$_' ESCAPE '!' $listWhere" );
 
                // dirty code ... i know
                $endArray = array();
index 2227198..2bf0266 100644 (file)
@@ -36,6 +36,10 @@ class OracleUpdater extends DatabaseUpdater {
 
                        // 1.19
                        array( 'addTable', 'config', 'patch-config.sql' ),
+
+
+                       // till 2.0 i guess
+                       array( 'doRebuildDuplicateFunction' ),
                        
                );
        }
@@ -118,6 +122,16 @@ class OracleUpdater extends DatabaseUpdater {
                $this->output( "ok\n" );
        }
 
+
+       /**
+        * rebuilding of the function that duplicates tables for tests
+        */
+       protected function doRebuildDuplicateFunction() {
+               $this->output( "Rebuilding duplicate function ... " );
+               $this->applyPatch( 'patch_rebuild_dupfunc.sql', false );
+               $this->output( "ok\n" );
+       }
+
        /**
         * Overload: after this action field info table has to be rebuilt
         *
diff --git a/maintenance/oracle/archives/patch_rebuild_dupfunc.sql b/maintenance/oracle/archives/patch_rebuild_dupfunc.sql
new file mode 100644 (file)
index 0000000..7d637da
--- /dev/null
@@ -0,0 +1,119 @@
+/*$mw$*/
+CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname   IN VARCHAR2,
+                                            p_oldprefix IN VARCHAR2,
+                                            p_newprefix IN VARCHAR2,
+                                            p_temporary IN BOOLEAN) IS
+  e_table_not_exist EXCEPTION;
+  PRAGMA EXCEPTION_INIT(e_table_not_exist, -00942);
+  l_temp_ei_sql VARCHAR2(2000);
+BEGIN
+  BEGIN
+    EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
+                      ' CASCADE CONSTRAINTS';
+  EXCEPTION
+    WHEN e_table_not_exist THEN
+      NULL;
+  END;
+  IF (p_temporary) THEN
+    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE ' || p_newprefix ||
+                      p_tabname || ' AS SELECT * FROM ' || p_oldprefix ||
+                      p_tabname || ' WHERE ROWNUM = 0';
+  ELSE
+    EXECUTE IMMEDIATE 'CREATE TABLE ' || p_newprefix || p_tabname ||
+                      ' AS SELECT * FROM ' || p_oldprefix || p_tabname ||
+                      ' WHERE ROWNUM = 0';
+  END IF;
+  FOR rc IN (SELECT column_name, data_default
+               FROM user_tab_columns
+              WHERE table_name = p_oldprefix || p_tabname
+                AND data_default IS NOT NULL) LOOP
+    EXECUTE IMMEDIATE 'ALTER TABLE ' || p_newprefix || p_tabname ||
+                      ' MODIFY ' || rc.column_name || ' DEFAULT ' ||
+                      SUBSTR(rc.data_default, 1, 2000);
+  END LOOP;
+  FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('CONSTRAINT',
+                                                                          constraint_name),
+                                                    32767,
+                                                    1),
+                                    USER || '"."' || p_oldprefix,
+                                    USER || '"."' || p_newprefix),
+                            '"' || constraint_name || '"',
+                            '"' || p_newprefix || constraint_name || '"') DDLVC2,
+                    constraint_name
+               FROM user_constraints uc
+              WHERE table_name = p_oldprefix || p_tabname
+                AND constraint_type = 'P') LOOP
+    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
+    l_temp_ei_sql := SUBSTR(l_temp_ei_sql,
+                            1,
+                            INSTR(l_temp_ei_sql,
+                                  ')',
+                                  INSTR(l_temp_ei_sql, 'PRIMARY KEY') + 1) + 1);
+    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
+      EXECUTE IMMEDIATE l_temp_ei_sql;
+    END IF;
+  END LOOP;
+  IF (NOT p_temporary) THEN
+    FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('REF_CONSTRAINT',
+                                                                    constraint_name),
+                                              32767,
+                                              1),
+                              USER || '"."' || p_oldprefix,
+                              USER || '"."' || p_newprefix) DDLVC2,
+                      constraint_name
+                 FROM user_constraints uc
+                WHERE table_name = p_oldprefix || p_tabname
+                  AND constraint_type = 'R') LOOP
+      IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
+        EXECUTE IMMEDIATE l_temp_ei_sql;
+      END IF;
+    END LOOP;
+  END IF;
+  FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
+                                                                          index_name),
+                                                    32767,
+                                                    1),
+                                    USER || '"."' || p_oldprefix,
+                                    USER || '"."' || p_newprefix),
+                            '"' || index_name || '"',
+                            '"' || p_newprefix || index_name || '"') DDLVC2,
+                    index_name,
+                    index_type
+               FROM user_indexes ui
+              WHERE table_name = p_oldprefix || p_tabname
+                AND index_type NOT IN ('LOB', 'DOMAIN')
+                AND NOT EXISTS
+              (SELECT NULL
+                       FROM user_constraints
+                      WHERE table_name = ui.table_name
+                        AND constraint_name = ui.index_name)) LOOP
+    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
+    l_temp_ei_sql := SUBSTR(l_temp_ei_sql,
+                            1,
+                            INSTR(l_temp_ei_sql,
+                                  ')',
+                                  INSTR(l_temp_ei_sql,
+                                        '"' || USER || '"."' || p_newprefix || '"') + 1) + 1);
+    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
+      EXECUTE IMMEDIATE l_temp_ei_sql;
+    END IF;
+  END LOOP;
+  FOR rc IN (SELECT REPLACE(REPLACE(UPPER(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('TRIGGER',
+                                                                                trigger_name),
+                                                          32767,
+                                                          1)),
+                                    USER || '"."' || p_oldprefix,
+                                    USER || '"."' || p_newprefix),
+                            ' ON ' || p_oldprefix || p_tabname,
+                            ' ON ' || p_newprefix || p_tabname) DDLVC2,
+                    trigger_name
+               FROM user_triggers
+              WHERE table_name = p_oldprefix || p_tabname) LOOP
+    l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ') - 1);
+    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
+      EXECUTE IMMEDIATE l_temp_ei_sql;
+    END IF;
+  END LOOP;
+END;
+/*$mw$*/
+
index d40b102..53979d2 100644 (file)
@@ -756,22 +756,30 @@ BEGIN
               WHERE table_name = p_oldprefix || p_tabname
                 AND constraint_type = 'P') LOOP
     l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
-    l_temp_ei_sql := SUBSTR(l_temp_ei_sql, 1, INSTR(l_temp_ei_sql, ')', INSTR(l_temp_ei_sql, 'PRIMARY KEY')+1)+1);
-    EXECUTE IMMEDIATE l_temp_ei_sql;
+    l_temp_ei_sql := SUBSTR(l_temp_ei_sql,
+                            1,
+                            INSTR(l_temp_ei_sql,
+                                  ')',
+                                  INSTR(l_temp_ei_sql, 'PRIMARY KEY') + 1) + 1);
+    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
+      EXECUTE IMMEDIATE l_temp_ei_sql;
+    END IF;
   END LOOP;
   IF (NOT p_temporary) THEN
-  FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('REF_CONSTRAINT',
-                                                                  constraint_name),
-                                            32767,
-                                            1),
-                            USER || '"."' || p_oldprefix,
-                            USER || '"."' || p_newprefix) DDLVC2,
-                    constraint_name
-               FROM user_constraints uc
-              WHERE table_name = p_oldprefix || p_tabname
-                AND constraint_type = 'R') LOOP
-    EXECUTE IMMEDIATE rc.ddlvc2;
-  END LOOP;
+    FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('REF_CONSTRAINT',
+                                                                    constraint_name),
+                                              32767,
+                                              1),
+                              USER || '"."' || p_oldprefix,
+                              USER || '"."' || p_newprefix) DDLVC2,
+                      constraint_name
+                 FROM user_constraints uc
+                WHERE table_name = p_oldprefix || p_tabname
+                  AND constraint_type = 'R') LOOP
+      IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
+        EXECUTE IMMEDIATE l_temp_ei_sql;
+      END IF;
+    END LOOP;
   END IF;
   FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('INDEX',
                                                                           index_name),
@@ -792,8 +800,15 @@ BEGIN
                       WHERE table_name = ui.table_name
                         AND constraint_name = ui.index_name)) LOOP
     l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1);
-    l_temp_ei_sql := SUBSTR(l_temp_ei_sql, 1, INSTR(l_temp_ei_sql, ')', INSTR(l_temp_ei_sql, '"' || USER || '"."' || p_newprefix || '"')+1)+1);
-    EXECUTE IMMEDIATE l_temp_ei_sql;
+    l_temp_ei_sql := SUBSTR(l_temp_ei_sql,
+                            1,
+                            INSTR(l_temp_ei_sql,
+                                  ')',
+                                  INSTR(l_temp_ei_sql,
+                                        '"' || USER || '"."' || p_newprefix || '"') + 1) + 1);
+    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
+      EXECUTE IMMEDIATE l_temp_ei_sql;
+    END IF;
   END LOOP;
   FOR rc IN (SELECT REPLACE(REPLACE(UPPER(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl('TRIGGER',
                                                                                 trigger_name),
@@ -807,7 +822,9 @@ BEGIN
                FROM user_triggers
               WHERE table_name = p_oldprefix || p_tabname) LOOP
     l_temp_ei_sql := SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ') - 1);
-    EXECUTE IMMEDIATE l_temp_ei_sql;
+    IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
+      EXECUTE IMMEDIATE l_temp_ei_sql;
+    END IF;
   END LOOP;
 END;
 /*$mw$*/