From 9b653aa0d5f2924dc9b14eec8ed7dc977cd57161 Mon Sep 17 00:00:00 2001 From: Jure Kajzer Date: Tue, 8 Jun 2010 18:14:28 +0000 Subject: [PATCH] * Fixed parserTests compatibility for Oracle * Fixed DBPrefix not being set in the old installer --- config/Installer.php | 2 +- includes/db/DatabaseOracle.php | 24 ++++- maintenance/ora/tables.sql | 172 +++++++++++++++++++-------------- 3 files changed, 122 insertions(+), 76 deletions(-) diff --git a/config/Installer.php b/config/Installer.php index 66190dda38..082d491468 100644 --- a/config/Installer.php +++ b/config/Installer.php @@ -1866,7 +1866,7 @@ function writeLocalSettings( $conf ) { } elseif( $conf->DBtype == 'oracle' ) { $dbsettings = "# Oracle specific settings -\$wgDBprefix = \"{$slconf['DBprefix']}\";"; +\$wgDBprefix = \"{$slconf['DBprefix_ora']}\";"; } else { // ummm... :D $dbsettings = ''; diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php index e0602bdda3..bd60bbf88a 100644 --- a/includes/db/DatabaseOracle.php +++ b/includes/db/DatabaseOracle.php @@ -767,7 +767,27 @@ class DatabaseOracle extends DatabaseBase { function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseOracle::duplicateTableStructure' ) { $temporary = $temporary ? 'TRUE' : 'FALSE'; - return $this->query( 'BEGIN DUPLICATE_TABLE(\'' . $oldName . '\', \'' . $newName . '\', ' . $temporary . '); END;', $fname ); + $oldName = trim(strtoupper($oldName), '"'); + $oldParts = explode('_', $oldName); + + $newName = trim(strtoupper($newName), '"'); + $newParts = explode('_', $newName); + + $oldPrefix = ''; + $newPrefix = ''; + for ($i = count($oldParts)-1; $i >= 0; $i--) { + if ($oldParts[$i] != $newParts[$i]) { + $oldPrefix = implode('_', $oldParts).'_'; + $newPrefix = implode('_', $newParts).'_'; + break; + } + unset($oldParts[$i]); + unset($newParts[$i]); + } + + $tabName = substr($oldName, strlen($oldPrefix)); + + return $this->query( 'BEGIN DUPLICATE_TABLE(\'' . $tabName . '\', \'' . $oldPrefix . '\', \''.$newPrefix.'\', ' . $temporary . '); END;', $fname ); } function timestamp( $ts = 0 ) { @@ -855,7 +875,7 @@ class DatabaseOracle extends DatabaseBase { $tableWhere = '= \''.$table.'\''; } - $fieldInfoStmt = oci_parse( $this->mConn, 'SELECT * FROM '.$this->tableName('wiki_field_info_full').' WHERE table_name '.$tableWhere.' and column_name = \''.$field.'\'' ); + $fieldInfoStmt = oci_parse( $this->mConn, 'SELECT * FROM wiki_field_info_full WHERE table_name '.$tableWhere.' and column_name = \''.$field.'\'' ); if ( oci_execute( $fieldInfoStmt, OCI_DEFAULT ) === false ) { $e = oci_error( $fieldInfoStmt ); $this->reportQueryError( $e['message'], $e['code'], 'fieldInfo QUERY', __METHOD__ ); diff --git a/maintenance/ora/tables.sql b/maintenance/ora/tables.sql index 914ce2c5c5..d2d1a21b14 100644 --- a/maintenance/ora/tables.sql +++ b/maintenance/ora/tables.sql @@ -581,7 +581,8 @@ CREATE TABLE &mw_prefix.l10n_cache ( ); CREATE INDEX &mw_prefix.l10n_cache_u01 ON &mw_prefix.l10n_cache (lc_lang, lc_key); -CREATE TABLE &mw_prefix.wiki_field_info_full ( +-- do not prefix this table as it breaks parserTests +CREATE TABLE wiki_field_info_full ( table_name VARCHAR2(35) NOT NULL, column_name VARCHAR2(35) NOT NULL, data_default VARCHAR2(4000), @@ -592,14 +593,14 @@ prim NUMBER(1), uniq NUMBER(1), nonuniq NUMBER(1) ); -ALTER TABLE &mw_prefix.wiki_field_info_full ADD CONSTRAINT &mw_prefix.wiki_field_info_full_pk PRIMARY KEY (table_name, column_name); +ALTER TABLE wiki_field_info_full ADD CONSTRAINT wiki_field_info_full_pk PRIMARY KEY (table_name, column_name); /*$mw$*/ -CREATE PROCEDURE &mw_prefix.fill_wiki_info IS +CREATE PROCEDURE fill_wiki_info IS BEGIN - DELETE &mw_prefix.wiki_field_info_full; + DELETE wiki_field_info_full; - FOR x_rec IN (SELECT '&mw_prefix.' || t.table_name table_name, t.column_name, + FOR x_rec IN (SELECT t.table_name table_name, t.column_name, t.data_default, t.data_length, t.data_type, DECODE (t.nullable, 'Y', '1', 'N', '0') not_null, (SELECT 1 @@ -629,7 +630,7 @@ CREATE PROCEDURE &mw_prefix.fill_wiki_info IS FROM user_tab_columns t, user_tables ut WHERE ut.table_name = t.table_name) LOOP - INSERT INTO &mw_prefix.wiki_field_info_full + INSERT INTO wiki_field_info_full (table_name, column_name, data_default, data_length, data_type, not_null, prim, @@ -646,79 +647,104 @@ END; /*$mw$*/ /*$mw$*/ -CREATE OR REPLACE PROCEDURE duplicate_table(p_oldname IN VARCHAR2, p_newname IN VARCHAR2, p_temporary IN BOOLEAN) -IS - v_oldname VARCHAR2(32) := RTRIM(LTRIM(p_oldname, '"'), '"'); - v_newname VARCHAR2(32) := RTRIM(LTRIM(p_newname, '"'), '"'); - v_prefix VARCHAR2(32) := SUBSTR(v_newname, 1, INSTR(v_newname, v_oldname, -1)-1); - e_table_not_exist EXCEPTION; - PRAGMA EXCEPTION_INIT(e_table_not_exist, -00942); +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); BEGIN - BEGIN - EXECUTE IMMEDIATE 'DROP TABLE '||v_newname||' CASCADE CONSTRAINTS'; - EXCEPTION WHEN e_table_not_exist THEN NULL; END; - - IF (p_temporary) THEN - EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE '||v_newname|| - ' AS SELECT * FROM '||v_oldname||' WHERE ROWNUM = 0'; - ELSE - EXECUTE IMMEDIATE 'CREATE TABLE '||v_newname|| - ' AS SELECT * FROM '||v_oldname||' WHERE ROWNUM = 0'; - END IF; - - FOR rc IN (SELECT column_name, data_default - FROM user_tab_columns - WHERE table_name = v_oldname - AND data_default IS NOT NULL) LOOP - EXECUTE IMMEDIATE 'ALTER TABLE '||v_newname||' 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||'"."', USER||'"."'||v_prefix), - '"'||constraint_name||'"', '"'||v_prefix||constraint_name||'"') DDLVC2 - , constraint_name - FROM user_constraints uc - WHERE table_name = v_oldname - AND constraint_type = 'P') LOOP - EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE')-1); - END LOOP; - - FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl ('REF_CONSTRAINT', constraint_name), 32767, 1), - USER||'"."', USER||'"."'||v_prefix) DDLVC2 - , constraint_name - FROM user_constraints uc - WHERE table_name = v_oldname - AND constraint_type = 'R') LOOP - EXECUTE IMMEDIATE rc.ddlvc2; - END LOOP; - - FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl ('INDEX', index_name), 32767, 1), - USER||'"."', USER||'"."'||v_prefix), - '"'||index_name||'"', '"'||v_prefix||index_name||'"') DDLVC2 - , index_name - FROM user_indexes ui - WHERE table_name = v_oldname - AND index_type != 'LOB' - AND NOT EXISTS (SELECT NULL FROM user_constraints - WHERE table_name = ui.table_name - AND constraint_name = ui.index_name)) LOOP - EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE')-1); - END LOOP; - - FOR rc IN (SELECT REPLACE(REPLACE(UPPER(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl ('TRIGGER', trigger_name), 32767, 1)), - USER||'"."', USER||'"."'||v_prefix), - ' ON '||v_oldname, ' ON '||v_newname) DDLVC2 - , trigger_name - FROM user_triggers - WHERE table_name = v_oldname) LOOP - EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ')-1); - END LOOP; + 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 + dbms_output.put_line(SUBSTR(rc.ddlvc2, + 1, + INSTR(rc.ddlvc2, 'PCTFREE') - 1)); + EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1); + 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 + EXECUTE IMMEDIATE rc.ddlvc2; + END LOOP; + 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 + FROM user_indexes ui + WHERE table_name = p_oldprefix || p_tabname + AND index_type != 'LOB' + AND NOT EXISTS + (SELECT NULL + FROM user_constraints + WHERE table_name = ui.table_name + AND constraint_name = ui.index_name)) LOOP + EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE') - 1); + 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 + EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ') - 1); + END LOOP; END; /*$mw$*/ /*$mw$*/ BEGIN - &mw_prefix.fill_wiki_info; + fill_wiki_info; END; /*$mw$*/ -- 2.20.1