mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-28 06:08:52 +00:00
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:
parent
61c6c07abc
commit
3d5ca6b2b7
1 changed files with 47 additions and 18 deletions
|
@ -142,7 +142,7 @@ class acp_database
|
|||
break;
|
||||
|
||||
case 'oracle':
|
||||
$extractor->flush('TRUNCATE TABLE ' . $table_name . "\\\n");
|
||||
$extractor->flush('TRUNCATE TABLE ' . $table_name . "/\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1716,8 +1716,7 @@ class oracle_extractor extends base_extractor
|
|||
{
|
||||
global $db;
|
||||
$sql_data = '-- Table: ' . $table_name . "\n";
|
||||
$sql_data .= "DROP TABLE $table_name;\n";
|
||||
$sql_data .= '\\' . "\n";
|
||||
$sql_data .= "DROP TABLE $table_name\n/\n";
|
||||
$sql_data .= "\nCREATE TABLE $table_name (\n";
|
||||
|
||||
$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'] !== 'VARCHAR2')
|
||||
if ($row['data_type'] !== 'VARCHAR2' && $row['data_type'] !== 'CHAR')
|
||||
{
|
||||
$line .= '(' . $row['data_precision'] . ')';
|
||||
}
|
||||
|
@ -1762,12 +1761,20 @@ class oracle_extractor extends base_extractor
|
|||
AND A.TABLE_NAME = '{$table_name}'";
|
||||
$result = $db->sql_query($sql);
|
||||
|
||||
$primary_key = array();
|
||||
$contraint_name = '';
|
||||
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);
|
||||
|
||||
if (sizeof($primary_key))
|
||||
{
|
||||
$rows[] = " CONSTRAINT {$constraint_name} PRIMARY KEY (" . implode(', ', $primary_key) . ')';
|
||||
}
|
||||
|
||||
$sql = "SELECT A.CONSTRAINT_NAME, A.COLUMN_NAME
|
||||
FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
|
||||
WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
|
||||
|
@ -1775,24 +1782,44 @@ class oracle_extractor extends base_extractor
|
|||
AND A.TABLE_NAME = '{$table_name}'";
|
||||
$result = $db->sql_query($sql);
|
||||
|
||||
$unique = array();
|
||||
$contraint_name = '';
|
||||
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);
|
||||
|
||||
$sql_data .= implode(",\n", $rows);
|
||||
$sql_data .= "\n)\n\\";
|
||||
if (sizeof($unique))
|
||||
{
|
||||
$rows[] = " CONSTRAINT {$constraint_name} UNIQUE (" . implode(', ', $unique) . ')';
|
||||
}
|
||||
|
||||
$sql = "SELECT A.REFERENCED_NAME
|
||||
FROM USER_DEPENDENCIES A, USER_TRIGGERS B
|
||||
$sql_data .= implode(",\n", $rows);
|
||||
$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'
|
||||
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);
|
||||
|
||||
$type = request_var('type', '');
|
||||
|
||||
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);
|
||||
|
||||
|
@ -1802,7 +1829,7 @@ class oracle_extractor extends base_extractor
|
|||
$result = $db->sql_query($sql);
|
||||
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);
|
||||
|
||||
|
@ -1822,7 +1849,7 @@ class oracle_extractor extends base_extractor
|
|||
|
||||
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);
|
||||
$this->flush($sql_data);
|
||||
|
@ -1858,7 +1885,7 @@ class oracle_extractor extends base_extractor
|
|||
// Oracle uses uppercase - we use lowercase
|
||||
$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_empty = "''";
|
||||
|
@ -1892,7 +1919,7 @@ class oracle_extractor extends base_extractor
|
|||
|
||||
// Take the ordered fields and their associated data and build it
|
||||
// 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);
|
||||
}
|
||||
|
@ -2211,8 +2238,10 @@ function sanitize_data_mssql($text)
|
|||
|
||||
function sanitize_data_oracle($text)
|
||||
{
|
||||
$data = preg_split('/[\0\n\t\r\b\f\'"\\\]/', $text);
|
||||
preg_match_all('/[\0\n\t\r\b\f\'"\\\]/', $text, $matches);
|
||||
// $data = preg_split('/[\0\n\t\r\b\f\'"\/\\\]/', $text);
|
||||
// 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();
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue