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;
|
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();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue