From 2967a448649b0db1a10edb558a56e0e9b1c12a61 Mon Sep 17 00:00:00 2001 From: Jure Kajzer Date: Thu, 2 Jun 2011 22:23:05 +0000 Subject: [PATCH] * fixed table duplication for phpunit testing --- includes/db/DatabaseOracle.php | 10 +- includes/installer/OracleUpdater.php | 14 +++ .../oracle/archives/patch_rebuild_dupfunc.sql | 119 ++++++++++++++++++ maintenance/oracle/tables.sql | 51 +++++--- 4 files changed, 172 insertions(+), 22 deletions(-) create mode 100644 maintenance/oracle/archives/patch_rebuild_dupfunc.sql diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php index c29c03148c..23d7249e07 100644 --- a/includes/db/DatabaseOracle.php +++ b/includes/db/DatabaseOracle.php @@ -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(); diff --git a/includes/installer/OracleUpdater.php b/includes/installer/OracleUpdater.php index 22271980fe..2bf0266ba7 100644 --- a/includes/installer/OracleUpdater.php +++ b/includes/installer/OracleUpdater.php @@ -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 index 0000000000..7d637da45c --- /dev/null +++ b/maintenance/oracle/archives/patch_rebuild_dupfunc.sql @@ -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$*/ + diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql index d40b102cac..53979d2cff 100644 --- a/maintenance/oracle/tables.sql +++ b/maintenance/oracle/tables.sql @@ -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$*/ -- 2.20.1