diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php index b25518e1c4..5d7450bdfd 100644 --- a/phpBB/includes/acp/acp_database.php +++ b/phpBB/includes/acp/acp_database.php @@ -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();