* phpunit fixes & optimizations for oracle backend
authorJure Kajzer <freakolowsky@users.mediawiki.org>
Wed, 9 Nov 2011 15:50:24 +0000 (15:50 +0000)
committerJure Kajzer <freakolowsky@users.mediawiki.org>
Wed, 9 Nov 2011 15:50:24 +0000 (15:50 +0000)
includes/db/DatabaseOracle.php
maintenance/oracle/archives/patch_rebuild_dupfunc.sql
maintenance/oracle/tables.sql
tests/phpunit/MediaWikiTestCase.php

index fa7a86f..5e63767 100644 (file)
@@ -745,7 +745,7 @@ class DatabaseOracle extends DatabaseBase {
        }
 
        function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseOracle::duplicateTableStructure' ) {
-               $temporary = $temporary ? 'TRUE' : 'FALSE';
+               $temporary = 'FALSE'; //$temporary ? 'TRUE' : 'FALSE';
 
                $newName = strtoupper( $newName );
                $oldName = strtoupper( $oldName );
@@ -768,9 +768,9 @@ class DatabaseOracle extends DatabaseBase {
 
                // dirty code ... i know
                $endArray = array();
-               $endArray[] = $prefix.'MWUSER';
-               $endArray[] = $prefix.'PAGE';
-               $endArray[] = $prefix.'IMAGE';
+               $endArray[] = strtoupper($prefix.'MWUSER');
+               $endArray[] = strtoupper($prefix.'PAGE');
+               $endArray[] = strtoupper($prefix.'IMAGE');
                $fixedOrderTabs = $endArray;
                while (($row = $result->fetchRow()) !== false) {
                        if (!in_array($row['table_name'], $fixedOrderTabs))
index 0a232db..56ee5b3 100644 (file)
@@ -10,7 +10,7 @@ CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname   IN VARCHAR2,
 BEGIN
   BEGIN
     EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
-                      ' CASCADE CONSTRAINTS';
+                      ' CASCADE CONSTRAINTS PURGE';
   EXCEPTION
     WHEN e_table_not_exist THEN
       NULL;
@@ -20,8 +20,9 @@ BEGIN
   END IF;
   IF (l_temporary) THEN
     EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE ' || p_newprefix ||
-                      p_tabname || ' AS SELECT * FROM ' || p_oldprefix ||
-                      p_tabname || ' WHERE ROWNUM = 0';
+                      p_tabname ||
+                      ' ON COMMIT PRESERVE ROWS 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 ||
@@ -68,7 +69,8 @@ BEGIN
                  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
+      IF nvl(length(l_temp_ei_sql), 0) > 0 AND
+         INSTR(l_temp_ei_sql, 'PRIMARY KEY') = 0 THEN
         EXECUTE IMMEDIATE l_temp_ei_sql;
       END IF;
     END LOOP;
@@ -142,5 +144,6 @@ BEGIN
     END IF;
   END LOOP;
 END;
+
 /*$mw$*/
 
index 02488cd..b406926 100644 (file)
@@ -781,7 +781,7 @@ CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname   IN VARCHAR2,
 BEGIN
   BEGIN
     EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
-                      ' CASCADE CONSTRAINTS';
+                      ' CASCADE CONSTRAINTS PURGE';
   EXCEPTION
     WHEN e_table_not_exist THEN
       NULL;
@@ -791,8 +791,9 @@ BEGIN
   END IF;
   IF (l_temporary) THEN
     EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE ' || p_newprefix ||
-                      p_tabname || ' AS SELECT * FROM ' || p_oldprefix ||
-                      p_tabname || ' WHERE ROWNUM = 0';
+                      p_tabname ||
+                      ' ON COMMIT PRESERVE ROWS 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 ||
@@ -839,7 +840,8 @@ BEGIN
                  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
+      IF nvl(length(l_temp_ei_sql), 0) > 0 AND
+         INSTR(l_temp_ei_sql, 'PRIMARY KEY') = 0 THEN
         EXECUTE IMMEDIATE l_temp_ei_sql;
       END IF;
     END LOOP;
index 7a64fab..0dc32f3 100644 (file)
@@ -125,6 +125,22 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        $this->db->insert( 'user', array(
                                'user_id'               => 0,
                                'user_name'     => 'Anonymous' ) );
+
+                       # Insert 0 page to prevent FK violations
+                       # Blank page
+                       $this->db->insert( 'page', array(
+                               'page_id' => 0,
+                               'page_namespace' => 0,
+                               'page_title' => ' ',
+                               'page_restrictions' => NULL,
+                               'page_counter' => 0,
+                               'page_is_redirect' => 0,
+                               'page_is_new' => 0,
+                               'page_random' => 0,
+                               'page_touched' => $this->db->timestamp(),
+                               'page_latest' => 0,
+                               'page_len' => 0 ) );
+
                }
        }
 
@@ -134,8 +150,28 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        private function resetDB() {
                if( $this->db ) {
                        foreach( $this->listTables() as $tbl ) {
-                               if( $tbl == 'interwiki' || $tbl == 'user' ) continue;
-                               $this->db->delete( $tbl, '*', __METHOD__ );
+                               if( $tbl == 'interwiki' || $tbl == 'user' || $tbl == 'MWUSER' ) continue;
+                               if ( $this->db->getType() == 'oracle' ) 
+                                       $this->db->query( 'TRUNCATE TABLE '.$this->db->tableName($tbl), __METHOD__ );
+                               else
+                                       $this->db->delete( $tbl, '*', __METHOD__ );
+                       }
+
+                       if ( $this->db->getType() == 'oracle' ) {
+                               # Insert 0 page to prevent FK violations
+                               # Blank page
+                               $this->db->insert( 'page', array(
+                                       'page_id' => 0,
+                                       'page_namespace' => 0,
+                                       'page_title' => ' ',
+                                       'page_restrictions' => NULL,
+                                       'page_counter' => 0,
+                                       'page_is_redirect' => 0,
+                                       'page_is_new' => 0,
+                                       'page_random' => 0,
+                                       'page_touched' => $this->db->timestamp(),
+                                       'page_latest' => 0,
+                                       'page_len' => 0 ) );
                        }
                }
        }