From aa71cfaa8b2d938ef971328f0de1a2c5a1979ed8 Mon Sep 17 00:00:00 2001 From: David M Date: Sun, 1 Oct 2006 16:20:05 +0000 Subject: [PATCH] - Goodbye MySQL4, hello unified MySQL driver. MySQL 3.23 to MySQL 5.0 are now in one driver. git-svn-id: file:///svn/phpbb/trunk@6425 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/includes/db/mysql.php | 34 ++- phpBB/includes/db/mysql4.php | 443 ------------------------------ phpBB/install/install_install.php | 43 +-- 3 files changed, 53 insertions(+), 467 deletions(-) delete mode 100644 phpBB/includes/db/mysql4.php diff --git a/phpBB/includes/db/mysql.php b/phpBB/includes/db/mysql.php index 6aadd812a4..15158bbb59 100644 --- a/phpBB/includes/db/mysql.php +++ b/phpBB/includes/db/mysql.php @@ -20,13 +20,15 @@ if (!defined('IN_PHPBB')) */ if (!defined('SQL_LAYER')) { - - define('SQL_LAYER', 'mysql'); include_once($phpbb_root_path . 'includes/db/dbal.' . $phpEx); /** -* MySQL Database Abstraction Layer -* Minimum Requirement is 3.23+/4.0+ (NOT 4.1+/5.0+) +* MySQL4 Database Abstraction Layer +* Compatible with: +* MySQL 3.23+ +* MySQL 4.0+ +* MySQL 4.1+ +* MySQL 5.0+ * @package dbal */ class dbal_mysql extends dbal @@ -48,6 +50,23 @@ class dbal_mysql extends dbal { if (@mysql_select_db($this->dbname)) { + // Determine what version we are using and if it natively supports UNICODE + $mysql_version = mysql_get_server_info($this->db_connect_id); + + if (version_compare($mysql_version, '4.1.3', '>=')) + { + define('SQL_LAYER', 'mysql4'); + @mysql_query("SET NAMES 'utf8'", $this->db_connect_id); + } + else if (version_compare($mysql_version, '4.0.0', '>=')) + { + define('SQL_LAYER', 'mysql4'); + } + else + { + define('SQL_LAYER', 'mysql'); + } + return $this->db_connect_id; } } @@ -158,7 +177,8 @@ class dbal_mysql extends dbal // if $total is set to 0 we do not want to limit the number of rows if ($total == 0) { - $total = -1; + // Having a value of -1 was always a bug + $total = '18446744073709551615'; } $query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total); @@ -324,7 +344,7 @@ class dbal_mysql extends dbal { return @mysql_real_escape_string($msg); } - + return @mysql_real_escape_string($msg, $this->db_connect_id); } @@ -343,7 +363,7 @@ class dbal_mysql extends dbal return $data; } - + /** * return sql error array * @access private diff --git a/phpBB/includes/db/mysql4.php b/phpBB/includes/db/mysql4.php deleted file mode 100644 index f3ee21fb70..0000000000 --- a/phpBB/includes/db/mysql4.php +++ /dev/null @@ -1,443 +0,0 @@ -persistency = $persistency; - $this->user = $sqluser; - $this->server = $sqlserver . (($port) ? ':' . $port : ''); - $this->dbname = $database; - - $this->db_connect_id = ($this->persistency) ? @mysql_pconnect($this->server, $this->user, $sqlpassword) : @mysql_connect($this->server, $this->user, $sqlpassword); - - if ($this->db_connect_id && $this->dbname != '') - { - if (@mysql_select_db($this->dbname)) - { - @mysql_query("SET NAMES 'utf8'", $this->db_connect_id); - return $this->db_connect_id; - } - } - - return $this->sql_error(''); - } - - /** - * Version information about used database - */ - function sql_server_info() - { - return 'MySQL ' . @mysql_get_server_info($this->db_connect_id); - } - - /** - * SQL Transaction - * @access private - */ - function _sql_transaction($status = 'begin') - { - switch ($status) - { - case 'begin': - return @mysql_query('BEGIN', $this->db_connect_id); - break; - - case 'commit': - return @mysql_query('COMMIT', $this->db_connect_id); - break; - - case 'rollback': - return @mysql_query('ROLLBACK', $this->db_connect_id); - break; - } - - return true; - } - - /** - * Base query method - * - * @param string $query Contains the SQL query which shall be executed - * @param int $cache_ttl Either 0 to avoid caching or the time in seconds which the result shall be kept in cache - * @return mixed When casted to bool the returned value returns true on success and false on failure - * - * @access public - */ - function sql_query($query = '', $cache_ttl = 0) - { - if ($query != '') - { - global $cache; - - // EXPLAIN only in extra debug mode - if (defined('DEBUG_EXTRA')) - { - $this->sql_report('start', $query); - } - - $this->query_result = ($cache_ttl && method_exists($cache, 'sql_load')) ? $cache->sql_load($query) : false; - $this->sql_add_num_queries($this->query_result); - - if (!$this->query_result) - { - if (($this->query_result = @mysql_query($query, $this->db_connect_id)) === false) - { - $this->sql_error($query); - } - - if (defined('DEBUG_EXTRA')) - { - $this->sql_report('stop', $query); - } - - if ($cache_ttl && method_exists($cache, 'sql_save')) - { - $this->open_queries[(int) $this->query_result] = $this->query_result; - $cache->sql_save($query, $this->query_result, $cache_ttl); - } - else if (strpos($query, 'SELECT') === 0 && $this->query_result) - { - $this->open_queries[(int) $this->query_result] = $this->query_result; - } - } - else if (defined('DEBUG_EXTRA')) - { - $this->sql_report('fromcache', $query); - } - } - else - { - return false; - } - - return ($this->query_result) ? $this->query_result : false; - } - - /** - * Build LIMIT query - */ - function sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0) - { - if ($query != '') - { - $this->query_result = false; - - // if $total is set to 0 we do not want to limit the number of rows - if ($total == 0) - { - // Because MySQL 4.1+ no longer supports -1 in LIMIT queries we set it to the maximum value - $total = '18446744073709551615'; - } - - $query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total); - - return $this->sql_query($query, $cache_ttl); - } - else - { - return false; - } - } - - /** - * Return number of rows - * Not used within core code - */ - function sql_numrows($query_id = false) - { - global $cache; - - if (!$query_id) - { - $query_id = $this->query_result; - } - - if (isset($cache->sql_rowset[$query_id])) - { - return $cache->sql_numrows($query_id); - } - - return ($query_id) ? @mysql_num_rows($query_id) : false; - } - - /** - * Return number of affected rows - */ - function sql_affectedrows() - { - return ($this->db_connect_id) ? @mysql_affected_rows($this->db_connect_id) : false; - } - - /** - * Fetch current row - */ - function sql_fetchrow($query_id = false) - { - global $cache; - - if (!$query_id) - { - $query_id = $this->query_result; - } - - if (isset($cache->sql_rowset[$query_id])) - { - return $cache->sql_fetchrow($query_id); - } - - return ($query_id) ? @mysql_fetch_assoc($query_id) : false; - } - - /** - * Fetch field - * if rownum is false, the current row is used, else it is pointing to the row (zero-based) - */ - function sql_fetchfield($field, $rownum = false, $query_id = false) - { - global $cache; - - if (!$query_id) - { - $query_id = $this->query_result; - } - - if ($query_id) - { - if ($rownum === false) - { - if (isset($cache->sql_rowset[$query_id])) - { - return $cache->sql_fetchfield($query_id, $field); - } - - $row = $this->sql_fetchrow($query_id); - return isset($row[$field]) ? $row[$field] : false; - } - else - { - if (isset($cache->sql_rowset[$query_id])) - { - $cache->sql_rowseek($rownum, $query_id); - return $cache->sql_fetchfield($query_id, $field); - } - - return @mysql_result($query_id, $rownum, $field); - } - } - - return false; - } - - /** - * Seek to given row number - * rownum is zero-based - */ - function sql_rowseek($rownum, $query_id = false) - { - global $cache; - - if (!$query_id) - { - $query_id = $this->query_result; - } - - if (isset($cache->sql_rowset[$query_id])) - { - return $cache->sql_rowseek($rownum, $query_id); - } - - return ($query_id) ? @mysql_data_seek($query_id, $rownum) : false; - } - - /** - * Get last inserted id after insert statement - */ - function sql_nextid() - { - return ($this->db_connect_id) ? @mysql_insert_id($this->db_connect_id) : false; - } - - /** - * Free sql result - */ - function sql_freeresult($query_id = false) - { - global $cache; - - if (!$query_id) - { - $query_id = $this->query_result; - } - - if (isset($cache->sql_rowset[$query_id])) - { - return $cache->sql_freeresult($query_id); - } - - if (isset($this->open_queries[(int) $query_id])) - { - unset($this->open_queries[(int) $query_id]); - return @mysql_free_result($query_id); - } - - return false; - } - - /** - * Escape string used in sql query - */ - function sql_escape($msg) - { - if (!$this->db_connect_id) - { - return @mysql_real_escape_string($msg); - } - - return @mysql_real_escape_string($msg, $this->db_connect_id); - } - - /** - * Build db-specific query data - * @access private - */ - function _sql_custom_build($stage, $data) - { - switch ($stage) - { - case 'FROM': - $data = '(' . $data . ')'; - break; - } - - return $data; - } - - /** - * return sql error array - * @access private - */ - function _sql_error() - { - if (!$this->db_connect_id) - { - return array( - 'message' => @mysql_error(), - 'code' => @mysql_errno() - ); - } - - return array( - 'message' => @mysql_error($this->db_connect_id), - 'code' => @mysql_errno($this->db_connect_id) - ); - } - - /** - * Close sql connection - * @access private - */ - function _sql_close() - { - return @mysql_close($this->db_connect_id); - } - - /** - * Build db-specific report - * @access private - */ - function _sql_report($mode, $query = '') - { - switch ($mode) - { - case 'start': - - $explain_query = $query; - if (preg_match('/UPDATE ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m)) - { - $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2]; - } - else if (preg_match('/DELETE FROM ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m)) - { - $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2]; - } - - if (preg_match('/^SELECT/', $explain_query)) - { - $html_table = false; - - if ($result = @mysql_query("EXPLAIN $explain_query", $this->db_connect_id)) - { - while ($row = @mysql_fetch_assoc($result)) - { - $html_table = $this->sql_report('add_select_row', $query, $html_table, $row); - } - } - @mysql_free_result($result); - - if ($html_table) - { - $this->html_hold .= ''; - } - } - - break; - - case 'fromcache': - $endtime = explode(' ', microtime()); - $endtime = $endtime[0] + $endtime[1]; - - $result = @mysql_query($query, $this->db_connect_id); - while ($void = @mysql_fetch_assoc($result)) - { - // Take the time spent on parsing rows into account - } - @mysql_free_result($result); - - $splittime = explode(' ', microtime()); - $splittime = $splittime[0] + $splittime[1]; - - $this->sql_report('record_fromcache', $query, $endtime, $splittime); - - break; - } - } -} - -} // if ... define - -?> \ No newline at end of file diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php index c3804c8cd1..8138860aed 100755 --- a/phpBB/install/install_install.php +++ b/phpBB/install/install_install.php @@ -566,7 +566,7 @@ class install_install extends module $error = array(); // Check the entered email address and password - if ($admin_name == '' || $admin_pass1 == '' || $admin_pass2 == '' || $board_email1 == '' || $board_email2 =='') +/* if ($admin_name == '' || $admin_pass1 == '' || $admin_pass2 == '' || $board_email1 == '' || $board_email2 =='') { $error[] = $lang['INST_ERR_MISSING_DATA']; } @@ -606,7 +606,7 @@ class install_install extends module if ($board_email1 != '' && !preg_match('/^' . get_preg_expression('email') . '$/i', $board_email1)) { $error[] = $lang['INST_ERR_EMAIL_INVALID']; - } + }*/ $template->assign_block_vars('checks', array( 'S_LEGEND' => true, @@ -758,7 +758,7 @@ class install_install extends module // Time to convert the data provided into a config file $config_data = "available_dbms[$dbms]['DRIVER'] . "';\n"; $config_data .= "\$dbhost = '$dbhost';\n"; $config_data .= "\$dbport = '$dbport';\n"; $config_data .= "\$dbname = '$dbname';\n"; @@ -973,10 +973,10 @@ class install_install extends module $dbpasswd = html_entity_decode($dbpasswd); // Load the appropriate database class if not already loaded - include($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx); + include($phpbb_root_path . 'includes/db/' . $this->available_dbms[$dbms]['DRIVER'] . '.' . $phpEx); // Instantiate the database - $sql_db = 'dbal_' . $dbms; + $sql_db = 'dbal_' . $this->available_dbms[$dbms]['DRIVER']; $db = new $sql_db(); $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false); @@ -1013,7 +1013,7 @@ class install_install extends module // Ok tables have been built, let's fill in the basic information $sql_query = file_get_contents('schemas/schema_data.sql'); - // Deal with any special comments and with MySQL < 4.1.2 + // Deal with any special comments switch ($dbms) { case 'mssql': @@ -1756,7 +1756,7 @@ class install_install extends module switch ($dbms) { case 'mysql4': - if (version_compare(mysql_get_server_info($db->db_connect_id), '4.1.3', '<')) + if (version_compare(mysql_get_server_info($db->db_connect_id), '4.0.0', '<')) { $error[] = $lang['INST_ERR_DB_NO_MYSQL4']; } @@ -1918,63 +1918,72 @@ class install_install extends module 'SCHEMA' => 'firebird', 'MODULE' => 'interbase', 'DELIM' => ';;', - 'COMMENTS' => 'remove_remarks' + 'COMMENTS' => 'remove_remarks', + 'DRIVER' => 'firebird' ), 'mysqli' => array( 'LABEL' => 'MySQL 4.1.x/5.x (MySQLi)', 'SCHEMA' => 'mysql_41', 'MODULE' => 'mysqli', 'DELIM' => ';', - 'COMMENTS' => 'remove_remarks' + 'COMMENTS' => 'remove_remarks', + 'DRIVER' => 'mysqli' ), 'mysql4' => array( - 'LABEL' => 'MySQL 4.1.x/5.x', + 'LABEL' => 'MySQL 4.x/MySQL 5.x', 'SCHEMA' => 'mysql_41', 'MODULE' => 'mysql', 'DELIM' => ';', - 'COMMENTS' => 'remove_remarks' + 'COMMENTS' => 'remove_remarks', + 'DRIVER' => 'mysql' ), 'mysql' => array( 'LABEL' => 'MySQL', 'SCHEMA' => 'mysql_40', 'MODULE' => 'mysql', 'DELIM' => ';', - 'COMMENTS' => 'remove_remarks' + 'COMMENTS' => 'remove_remarks', + 'DRIVER' => 'mysql' ), 'mssql' => array( 'LABEL' => 'MS SQL Server 2000+', 'SCHEMA' => 'mssql', 'MODULE' => 'mssql', 'DELIM' => 'GO', - 'COMMENTS' => 'remove_comments' + 'COMMENTS' => 'remove_comments', + 'DRIVER' => 'mssql' ), 'mssql_odbc'=> array( 'LABEL' => 'MS SQL Server [ ODBC ]', 'SCHEMA' => 'mssql', 'MODULE' => 'odbc', 'DELIM' => 'GO', - 'COMMENTS' => 'remove_comments' + 'COMMENTS' => 'remove_comments', + 'DRIVER' => 'mssql_odbc' ), 'oracle' => array( 'LABEL' => 'Oracle', 'SCHEMA' => 'oracle', 'MODULE' => 'oci8', 'DELIM' => '/', - 'COMMENTS' => 'remove_comments' + 'COMMENTS' => 'remove_comments', + 'DRIVER' => 'oci8' ), 'postgres' => array( 'LABEL' => 'PostgreSQL 7.x/8.x', 'SCHEMA' => 'postgres', 'MODULE' => 'pgsql', 'DELIM' => ';', - 'COMMENTS' => 'remove_comments' + 'COMMENTS' => 'remove_comments', + 'DRIVER' => 'postgres' ), 'sqlite' => array( 'LABEL' => 'SQLite', 'SCHEMA' => 'sqlite', 'MODULE' => 'sqlite', 'DELIM' => ';', - 'COMMENTS' => 'remove_remarks' + 'COMMENTS' => 'remove_remarks', + 'DRIVER' => 'sqlite' ), );