summaryrefslogtreecommitdiff
path: root/installer
diff options
context:
space:
mode:
authorAleksander Machniak <alec@alec.pl>2014-04-29 11:34:43 +0200
committerAleksander Machniak <alec@alec.pl>2014-04-29 11:59:07 +0200
commit720e7d376ffe0fb625d0b1e250121823a71da094 (patch)
treecfafb6731e3978926fff6150d05d25df567f9c47 /installer
parent7e3af82c4f7081d4ae0af9d7eea91d29f20bfd73 (diff)
Fix varius db_prefix issues (#1489839)
- Move DDL script execution code to rcube_db class(es). - Improve prefix replacement code, so index names are also modified
Diffstat (limited to 'installer')
-rw-r--r--installer/rcube_install.php60
-rw-r--r--installer/test.php1
2 files changed, 3 insertions, 58 deletions
diff --git a/installer/rcube_install.php b/installer/rcube_install.php
index 2fae3c5ca..ef7000688 100644
--- a/installer/rcube_install.php
+++ b/installer/rcube_install.php
@@ -724,7 +724,8 @@ class rcube_install
// read schema file from /SQL/*
$fname = INSTALL_PATH . "SQL/$engine.initial.sql";
if ($sql = @file_get_contents($fname)) {
- $this->exec_sql($sql, $DB);
+ $DB->set_option('table_prefix', $this->config['db_prefix']);
+ $DB->exec_script($sql);
}
else {
$this->fail('DB Schema', "Cannot read the schema file: $fname");
@@ -759,63 +760,6 @@ class rcube_install
/**
- * Execute the given SQL queries on the database connection
- *
- * @param string SQL queries to execute
- * @param object rcube_db Database connection
- * @return boolen True on success, False on error
- */
- function exec_sql($sql, $DB)
- {
- $sql = $this->fix_table_names($sql, $DB);
- $buff = '';
- foreach (explode("\n", $sql) as $line) {
- if (preg_match('/^--/', $line) || trim($line) == '')
- continue;
-
- $buff .= $line . "\n";
- if (preg_match('/(;|^GO)$/', trim($line))) {
- $DB->query($buff);
- $buff = '';
- if ($DB->is_error())
- break;
- }
- }
-
- return !$DB->is_error();
- }
-
-
- /**
- * Parse SQL file and fix table names according to db_prefix
- * Note: This need to be a complete database initial file
- */
- private function fix_table_names($sql, $DB)
- {
- if (empty($this->config['db_prefix'])) {
- return $sql;
- }
-
- // replace table names
- if (preg_match_all('/CREATE TABLE (\[dbo\]\.|IF NOT EXISTS )?[`"\[\]]*([^`"\[\] \r\n]+)/i', $sql, $matches)) {
- foreach ($matches[2] as $table) {
- $real_table = $this->config['db_prefix'] . $table;
- $sql = preg_replace("/([^a-zA-Z0-9_])$table([^a-zA-Z0-9_])/", "\\1$real_table\\2", $sql);
- }
- }
- // replace sequence names
- if ($DB->db_provider == 'postgres' && preg_match_all('/CREATE SEQUENCE (IF NOT EXISTS )?"?([^" \n\r]+)/i', $sql, $matches)) {
- foreach ($matches[2] as $sequence) {
- $real_sequence = $this->config['db_prefix'] . $sequence;
- $sql = preg_replace("/([^a-zA-Z0-9_])$sequence([^a-zA-Z0-9_])/", "\\1$real_sequence\\2", $sql);
- }
- }
-
- return $sql;
- }
-
-
- /**
* Handler for Roundcube errors
*/
function raise_error($p)
diff --git a/installer/test.php b/installer/test.php
index 5d28d5f57..40b052bdc 100644
--- a/installer/test.php
+++ b/installer/test.php
@@ -115,6 +115,7 @@ $db_working = false;
if ($RCI->configured) {
if (!empty($RCI->config['db_dsnw'])) {
$DB = rcube_db::factory($RCI->config['db_dsnw'], '', false);
+ $DB->set_debug((bool)$RCI->config['sql_debug']);
$DB->db_connect('w');
if (!($db_error_msg = $DB->is_error())) {