* Fixed parserTests compatibility for Oracle
authorJure Kajzer <freakolowsky@users.mediawiki.org>
Tue, 8 Jun 2010 18:14:28 +0000 (18:14 +0000)
committerJure Kajzer <freakolowsky@users.mediawiki.org>
Tue, 8 Jun 2010 18:14:28 +0000 (18:14 +0000)
* Fixed DBPrefix not being set in the old installer

config/Installer.php
includes/db/DatabaseOracle.php
maintenance/ora/tables.sql

index 66190dd..082d491 100644 (file)
@@ -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 = '';
index e0602bd..bd60bbf 100644 (file)
@@ -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__ );
index 914ce2c..d2d1a21 100644 (file)
@@ -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$*/