Ok, the oracle database backup never actually worked at all. We used the wrong delimiter, did not preserve correct sequence order, did not merge primary keys and uniques... i think no one ever tried to actually restore an oracle backup.

Fix all of this.

git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@10174 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
Meik Sievertsen 2009-09-21 17:59:39 +00:00
parent 61c6c07abc
commit 3d5ca6b2b7

View file

@ -142,7 +142,7 @@ class acp_database
break; break;
case 'oracle': case 'oracle':
$extractor->flush('TRUNCATE TABLE ' . $table_name . "\\\n"); $extractor->flush('TRUNCATE TABLE ' . $table_name . "/\n");
break; break;
default: default:
@ -1716,8 +1716,7 @@ class oracle_extractor extends base_extractor
{ {
global $db; global $db;
$sql_data = '-- Table: ' . $table_name . "\n"; $sql_data = '-- Table: ' . $table_name . "\n";
$sql_data .= "DROP TABLE $table_name;\n"; $sql_data .= "DROP TABLE $table_name\n/\n";
$sql_data .= '\\' . "\n";
$sql_data .= "\nCREATE TABLE $table_name (\n"; $sql_data .= "\nCREATE TABLE $table_name (\n";
$sql = "SELECT COLUMN_NAME, DATA_TYPE, DATA_PRECISION, DATA_LENGTH, NULLABLE, DATA_DEFAULT $sql = "SELECT COLUMN_NAME, DATA_TYPE, DATA_PRECISION, DATA_LENGTH, NULLABLE, DATA_DEFAULT
@ -1732,7 +1731,7 @@ class oracle_extractor extends base_extractor
if ($row['data_type'] !== 'CLOB') if ($row['data_type'] !== 'CLOB')
{ {
if ($row['data_type'] !== 'VARCHAR2') if ($row['data_type'] !== 'VARCHAR2' && $row['data_type'] !== 'CHAR')
{ {
$line .= '(' . $row['data_precision'] . ')'; $line .= '(' . $row['data_precision'] . ')';
} }
@ -1762,12 +1761,20 @@ class oracle_extractor extends base_extractor
AND A.TABLE_NAME = '{$table_name}'"; AND A.TABLE_NAME = '{$table_name}'";
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$primary_key = array();
$contraint_name = '';
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$rows[] = " CONSTRAINT {$row['constraint_name']} PRIMARY KEY ({$row['column_name']})"; $constraint_name = '"' . $row['constraint_name'] . '"';
$primary_key[] = '"' . $row['column_name'] . '"';
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if (sizeof($primary_key))
{
$rows[] = " CONSTRAINT {$constraint_name} PRIMARY KEY (" . implode(', ', $primary_key) . ')';
}
$sql = "SELECT A.CONSTRAINT_NAME, A.COLUMN_NAME $sql = "SELECT A.CONSTRAINT_NAME, A.COLUMN_NAME
FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
@ -1775,24 +1782,44 @@ class oracle_extractor extends base_extractor
AND A.TABLE_NAME = '{$table_name}'"; AND A.TABLE_NAME = '{$table_name}'";
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$unique = array();
$contraint_name = '';
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$rows[] = " CONSTRAINT {$row['constraint_name']} UNIQUE ({$row['column_name']})"; $constraint_name = '"' . $row['constraint_name'] . '"';
$unique[] = '"' . $row['column_name'] . '"';
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$sql_data .= implode(",\n", $rows); if (sizeof($unique))
$sql_data .= "\n)\n\\"; {
$rows[] = " CONSTRAINT {$constraint_name} UNIQUE (" . implode(', ', $unique) . ')';
}
$sql = "SELECT A.REFERENCED_NAME $sql_data .= implode(",\n", $rows);
FROM USER_DEPENDENCIES A, USER_TRIGGERS B $sql_data .= "\n)\n/\n";
$sql = "SELECT A.REFERENCED_NAME, C.*
FROM USER_DEPENDENCIES A, USER_TRIGGERS B, USER_SEQUENCES C
WHERE A.REFERENCED_TYPE = 'SEQUENCE' WHERE A.REFERENCED_TYPE = 'SEQUENCE'
AND A.NAME = B.TRIGGER_NAME AND A.NAME = B.TRIGGER_NAME
AND B. TABLE_NAME = '{$table_name}'"; AND B.TABLE_NAME = '{$table_name}'
AND C.SEQUENCE_NAME = A.REFERENCED_NAME";
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$type = request_var('type', '');
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$sql_data .= "\nCREATE SEQUENCE {$row['referenced_name']}\\\n"; $sql_data .= "\nDROP SEQUENCE \"{$row['referenced_name']}\"\n/\n";
$sql_data .= "\nCREATE SEQUENCE \"{$row['referenced_name']}\"";
if ($type == 'full')
{
$sql_data .= ' START WITH ' . $row['last_number'];
}
$sql_data .= "\n/\n";
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -1802,7 +1829,7 @@ class oracle_extractor extends base_extractor
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$sql_data .= "\nCREATE OR REPLACE TRIGGER {$row['description']}WHEN ({$row['when_clause']})\n{$row['trigger_body']}\\"; $sql_data .= "\nCREATE OR REPLACE TRIGGER {$row['description']}WHEN ({$row['when_clause']})\n{$row['trigger_body']}\n/\n";
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -1822,7 +1849,7 @@ class oracle_extractor extends base_extractor
foreach ($index as $index_name => $column_names) foreach ($index as $index_name => $column_names)
{ {
$sql_data .= "\nCREATE INDEX $index_name ON $table_name(" . implode(', ', $column_names) . ")\n\\"; $sql_data .= "\nCREATE INDEX $index_name ON $table_name(" . implode(', ', $column_names) . ")\n/\n";
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$this->flush($sql_data); $this->flush($sql_data);
@ -1858,7 +1885,7 @@ class oracle_extractor extends base_extractor
// Oracle uses uppercase - we use lowercase // Oracle uses uppercase - we use lowercase
$str_val = $row[strtolower($ary_name[$i])]; $str_val = $row[strtolower($ary_name[$i])];
if (preg_match('#char|text|bool|raw#i', $ary_type[$i])) if (preg_match('#char|text|bool|raw|clob#i', $ary_type[$i]))
{ {
$str_quote = ''; $str_quote = '';
$str_empty = "''"; $str_empty = "''";
@ -1892,7 +1919,7 @@ class oracle_extractor extends base_extractor
// Take the ordered fields and their associated data and build it // Take the ordered fields and their associated data and build it
// into a valid sql statement to recreate that field in the data. // into a valid sql statement to recreate that field in the data.
$sql_data = "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\n"; $sql_data = "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ")\n/\n";
$this->flush($sql_data); $this->flush($sql_data);
} }
@ -2211,8 +2238,10 @@ function sanitize_data_mssql($text)
function sanitize_data_oracle($text) function sanitize_data_oracle($text)
{ {
$data = preg_split('/[\0\n\t\r\b\f\'"\\\]/', $text); // $data = preg_split('/[\0\n\t\r\b\f\'"\/\\\]/', $text);
preg_match_all('/[\0\n\t\r\b\f\'"\\\]/', $text, $matches); // preg_match_all('/[\0\n\t\r\b\f\'"\/\\\]/', $text, $matches);
$data = preg_split('/[\0\b\f\'\/]/', $text);
preg_match_all('/[\0\r\b\f\'\/]/', $text, $matches);
$val = array(); $val = array();