From 636f304d20179baf1d3415892d1067d507969eb3 Mon Sep 17 00:00:00 2001 From: Jure Kajzer Date: Wed, 9 Nov 2011 15:50:24 +0000 Subject: [PATCH] * phpunit fixes & optimizations for oracle backend --- includes/db/DatabaseOracle.php | 8 ++-- .../oracle/archives/patch_rebuild_dupfunc.sql | 11 +++-- maintenance/oracle/tables.sql | 10 +++-- tests/phpunit/MediaWikiTestCase.php | 40 ++++++++++++++++++- 4 files changed, 55 insertions(+), 14 deletions(-) diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php index fa7a86f3ae..5e637677ee 100644 --- a/includes/db/DatabaseOracle.php +++ b/includes/db/DatabaseOracle.php @@ -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)) diff --git a/maintenance/oracle/archives/patch_rebuild_dupfunc.sql b/maintenance/oracle/archives/patch_rebuild_dupfunc.sql index 0a232dbc2c..56ee5b3edb 100644 --- a/maintenance/oracle/archives/patch_rebuild_dupfunc.sql +++ b/maintenance/oracle/archives/patch_rebuild_dupfunc.sql @@ -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$*/ diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql index 02488cd35e..b406926204 100644 --- a/maintenance/oracle/tables.sql +++ b/maintenance/oracle/tables.sql @@ -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; diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php index 7a64fab9be..0dc32f3212 100644 --- a/tests/phpunit/MediaWikiTestCase.php +++ b/tests/phpunit/MediaWikiTestCase.php @@ -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 ) ); } } } -- 2.20.1