Replace rcube_mdb2/PEAR::MDB2 with rcube_db

pull/18/head
Aleksander Machniak 12 years ago
parent 0d94fd45f4
commit 398bff5925

@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail CHANGELOG Roundcube Webmail
=========================== ===========================
- Add new DB abstraction layer based on PHP PDO, supporting SQLite3 (#1488332)
- Fix handling of unitless CSS size values in HTML message (#1488535) - Fix handling of unitless CSS size values in HTML message (#1488535)
- Fix removing contact photo using LDAP addressbook (#1488420) - Fix removing contact photo using LDAP addressbook (#1488420)
- Fix storing X-ANNIVERSARY date in vCard format (#1488527) - Fix storing X-ANNIVERSARY date in vCard format (#1488527)

@ -137,7 +137,7 @@ if ($RCI->configured) {
// check database schema // check database schema
if ($RCI->config['db_dsnw']) { if ($RCI->config['db_dsnw']) {
$DB = new rcube_mdb2($RCI->config['db_dsnw'], '', false); $DB = new rcube_db::factory($RCI->config['db_dsnw'], '', false);
$DB->db_connect('w'); $DB->db_connect('w');
if ($db_error_msg = $DB->is_error()) { if ($db_error_msg = $DB->is_error()) {
echo "Error connecting to database: $db_error_msg\n"; echo "Error connecting to database: $db_error_msg\n";

@ -6,7 +6,8 @@ $required_php_exts = array(
'DOM' => 'dom', 'DOM' => 'dom',
'Session' => 'session', 'Session' => 'session',
'XML' => 'xml', 'XML' => 'xml',
'JSON' => 'json' 'JSON' => 'json',
'PDO' => 'PDO',
); );
$optional_php_exts = array( $optional_php_exts = array(
@ -21,19 +22,11 @@ $optional_php_exts = array(
$required_libs = array( $required_libs = array(
'PEAR' => 'PEAR.php', 'PEAR' => 'PEAR.php',
'MDB2' => 'MDB2.php',
'Net_SMTP' => 'Net/SMTP.php', 'Net_SMTP' => 'Net/SMTP.php',
'Net_IDNA2' => 'Net/IDNA2.php', 'Net_IDNA2' => 'Net/IDNA2.php',
'Mail_mime' => 'Mail/mime.php', 'Mail_mime' => 'Mail/mime.php',
); );
$supported_dbs = array(
'MySQL' => 'mysql',
'MySQLi' => 'mysqli',
'PostgreSQL' => 'pgsql',
'SQLite (v2)' => 'sqlite',
);
$ini_checks = array( $ini_checks = array(
'file_uploads' => 1, 'file_uploads' => 1,
'session.auto_start' => 0, 'session.auto_start' => 0,
@ -61,8 +54,14 @@ $source_urls = array(
'DOM' => 'http://www.php.net/manual/en/book.dom.php', 'DOM' => 'http://www.php.net/manual/en/book.dom.php',
'Intl' => 'http://www.php.net/manual/en/book.intl.php', 'Intl' => 'http://www.php.net/manual/en/book.intl.php',
'Exif' => 'http://www.php.net/manual/en/book.exif.php', 'Exif' => 'http://www.php.net/manual/en/book.exif.php',
'PDO' => 'http://www.php.net/manual/en/book.pdo.php',
'pdo_mysql' => 'http://www.php.net/manual/en/book.pdo-mysql.php',
'pdo_pgsql' => 'http://www.php.net/manual/en/book.pdo-pgsql.php',
'pdo_sqlite' => 'http://www.php.net/manual/en/book.pdo-sqlite.php',
'pdo_sqlite2' => 'http://www.php.net/manual/en/book.pdo-sqlite.php',
'pdo_sqlsrv' => 'http://www.php.net/manual/en/book.pdo-sqlsrv.php',
'pdo_dblib' => 'http://www.php.net/manual/en/book.pdo-dblib.php',
'PEAR' => 'http://pear.php.net', 'PEAR' => 'http://pear.php.net',
'MDB2' => 'http://pear.php.net/package/MDB2',
'Net_SMTP' => 'http://pear.php.net/package/Net_SMTP', 'Net_SMTP' => 'http://pear.php.net/package/Net_SMTP',
'Mail_mime' => 'http://pear.php.net/package/Mail_mime', 'Mail_mime' => 'http://pear.php.net/package/Mail_mime',
'Net_IDNA2' => 'http://pear.php.net/package/Net_IDNA2', 'Net_IDNA2' => 'http://pear.php.net/package/Net_IDNA2',
@ -127,14 +126,14 @@ foreach ($optional_php_exts as $name => $ext) {
<?php <?php
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : ''; $prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
foreach ($supported_dbs as $database => $ext) { foreach ($RCI->supported_dbs as $database => $ext) {
if (extension_loaded($ext)) { if (extension_loaded($ext)) {
$RCI->pass($database); $RCI->pass($database);
} }
else { else {
$_ext = $ext_dir . '/' . $prefix . $ext . '.' . PHP_SHLIB_SUFFIX; $_ext = $ext_dir . '/' . $prefix . $ext . '.' . PHP_SHLIB_SUFFIX;
$msg = @is_readable($_ext) ? 'Could be loaded. Please add in php.ini' : 'Not installed'; $msg = @is_readable($_ext) ? 'Could be loaded. Please add in php.ini' : '';
$RCI->na($database, $msg, $source_urls[$database]); $RCI->na($database, $msg, $source_urls[$ext]);
} }
echo '<br />'; echo '<br />';
} }

@ -267,13 +267,8 @@ echo $input_syslogfacility->show($RCI->getprop('syslog_facility'), LOG_USER);
<p>Database settings for read/write operations:</p> <p>Database settings for read/write operations:</p>
<?php <?php
require_once 'MDB2.php';
$supported_dbs = array('MySQL' => 'mysql', 'MySQLi' => 'mysqli',
'PgSQL' => 'pgsql', 'SQLite' => 'sqlite');
$select_dbtype = new html_select(array('name' => '_dbtype', 'id' => "cfgdbtype")); $select_dbtype = new html_select(array('name' => '_dbtype', 'id' => "cfgdbtype"));
foreach ($supported_dbs AS $database => $ext) { foreach ($RCI->supported_dbs as $database => $ext) {
if (extension_loaded($ext)) { if (extension_loaded($ext)) {
$select_dbtype->add($database, $ext); $select_dbtype->add($database, $ext);
} }
@ -284,7 +279,7 @@ $input_dbname = new html_inputfield(array('name' => '_dbname', 'size' => 20, 'id
$input_dbuser = new html_inputfield(array('name' => '_dbuser', 'size' => 20, 'id' => "cfgdbuser")); $input_dbuser = new html_inputfield(array('name' => '_dbuser', 'size' => 20, 'id' => "cfgdbuser"));
$input_dbpass = new html_passwordfield(array('name' => '_dbpass', 'size' => 20, 'id' => "cfgdbpass")); $input_dbpass = new html_passwordfield(array('name' => '_dbpass', 'size' => 20, 'id' => "cfgdbpass"));
$dsnw = MDB2::parseDSN($RCI->getprop('db_dsnw')); $dsnw = rcube_db::parse_dsn($RCI->getprop('db_dsnw'));
echo $select_dbtype->show($RCI->is_post ? $_POST['_dbtype'] : $dsnw['phptype']); echo $select_dbtype->show($RCI->is_post ? $_POST['_dbtype'] : $dsnw['phptype']);
echo '<label for="cfgdbtype">Database type</label><br />'; echo '<label for="cfgdbtype">Database type</label><br />';

@ -50,6 +50,17 @@ class rcube_install
'des_key', 'session_lifetime', 'support_url', 'des_key', 'session_lifetime', 'support_url',
); );
// list of supported database drivers
var $supported_dbs = array(
'MySQL' => 'pdo_mysql',
'PostgreSQL' => 'pdo_pgsql',
'SQLite' => 'pdo_sqlite',
'SQLite (v2)' => 'pdo_sqlite2',
'SQL Server (SQLSRV)' => 'pdo_sqlsrv',
'SQL Server (DBLIB)' => 'pdo_dblib',
);
/** /**
* Constructor * Constructor
*/ */
@ -371,7 +382,7 @@ class rcube_install
$errors[] = "Missing columns in table '$table': " . join(',', $diff); $errors[] = "Missing columns in table '$table': " . join(',', $diff);
} }
} }
return !empty($errors) ? $errors : false; return !empty($errors) ? $errors : false;
} }
@ -394,87 +405,8 @@ class rcube_install
} }
} }
} }
return $schema;
}
/**
* Compare the local database schema with the reference schema
* required for this version of Roundcube
*
* @param boolean True if the schema schould be updated
* @return boolean True if the schema is up-to-date, false if not or an error occured
*/
function mdb2_schema_check($update = false)
{
if (!$this->configured)
return false;
$options = array(
'use_transactions' => false,
'log_line_break' => "\n",
'idxname_format' => '%s',
'debug' => false,
'quote_identifier' => true,
'force_defaults' => false,
'portability' => true
);
$dsnw = $this->config['db_dsnw'];
$schema = MDB2_Schema::factory($dsnw, $options);
$schema->db->supported['transactions'] = false;
if (PEAR::isError($schema)) {
$this->raise_error(array('code' => $schema->getCode(), 'message' => $schema->getMessage() . ' ' . $schema->getUserInfo()));
return false;
}
else {
$definition = $schema->getDefinitionFromDatabase();
$definition['charset'] = 'utf8';
if (PEAR::isError($definition)) {
$this->raise_error(array('code' => $definition->getCode(), 'message' => $definition->getMessage() . ' ' . $definition->getUserInfo()));
return false;
}
// load reference schema
$dsn_arr = MDB2::parseDSN($this->config['db_dsnw']);
$ref_schema = INSTALL_PATH . 'SQL/' . $dsn_arr['phptype'] . '.schema.xml';
if (is_readable($ref_schema)) {
$reference = $schema->parseDatabaseDefinition($ref_schema, false, array(), $schema->options['fail_on_invalid_names']);
if (PEAR::isError($reference)) {
$this->raise_error(array('code' => $reference->getCode(), 'message' => $reference->getMessage() . ' ' . $reference->getUserInfo()));
}
else {
$diff = $schema->compareDefinitions($reference, $definition);
if (empty($diff)) {
return true;
}
else if ($update) {
// update database schema with the diff from the above check
$success = $schema->alterDatabase($reference, $definition, $diff);
if (PEAR::isError($success)) {
$this->raise_error(array('code' => $success->getCode(), 'message' => $success->getMessage() . ' ' . $success->getUserInfo()));
}
else
return true;
}
echo '<pre>'; var_dump($diff); echo '</pre>';
return false;
}
}
else
$this->raise_error(array('message' => "Could not find reference schema file ($ref_schema)"));
return false;
}
return false; return $schema;
} }

@ -125,9 +125,9 @@ else {
$db_working = false; $db_working = false;
if ($RCI->configured) { if ($RCI->configured) {
if (!empty($RCI->config['db_dsnw'])) { if (!empty($RCI->config['db_dsnw'])) {
$DB = new rcube_db::factory($RCI->config['db_dsnw'], '', false);
$DB = new rcube_mdb2($RCI->config['db_dsnw'], '', false);
$DB->db_connect('w'); $DB->db_connect('w');
if (!($db_error_msg = $DB->is_error())) { if (!($db_error_msg = $DB->is_error())) {
$RCI->pass('DSN (write)'); $RCI->pass('DSN (write)');
echo '<br />'; echo '<br />';

@ -23,7 +23,6 @@ function __autoload($classname)
{ {
$filename = preg_replace( $filename = preg_replace(
array( array(
'/MDB2_(.+)/',
'/Mail_(.+)/', '/Mail_(.+)/',
'/Net_(.+)/', '/Net_(.+)/',
'/Auth_(.+)/', '/Auth_(.+)/',
@ -31,7 +30,6 @@ function __autoload($classname)
'/^utf8$/' '/^utf8$/'
), ),
array( array(
'MDB2/\\1',
'Mail/\\1', 'Mail/\\1',
'Net/\\1', 'Net/\\1',
'Auth/\\1', 'Auth/\\1',

@ -407,7 +407,7 @@ function rcube_autoload($classname)
'/^utf8$/', '/^utf8$/',
), ),
array( array(
'MDB2/\\1', 'Mail/\\1',
'Mail/\\1', 'Mail/\\1',
'Net/\\1', 'Net/\\1',
'Auth/\\1', 'Auth/\\1',

Loading…
Cancel
Save