diff options
author | Aleksander Machniak <alec@alec.pl> | 2022-09-11 12:01:03 +0300 |
---|---|---|
committer | Aleksander Machniak <alec@alec.pl> | 2022-09-11 12:01:03 +0300 |
commit | 019801a430e27c95d03cbb24fc233ec22e692500 (patch) | |
tree | cbb783c8abbdec870b1f2dd49c1dbcde2fc9f99a /program | |
parent | 2847154cd0b11d4dead83507b8b272d8509d9aaa (diff) |
Removed support for MS SQL Server and Oracle (#7854)
Diffstat (limited to 'program')
-rw-r--r-- | program/include/rcmail_install.php | 4 | ||||
-rw-r--r-- | program/lib/Roundcube/README.md | 2 | ||||
-rw-r--r-- | program/lib/Roundcube/db/mssql.php | 185 | ||||
-rw-r--r-- | program/lib/Roundcube/db/oracle.php | 631 | ||||
-rw-r--r-- | program/lib/Roundcube/db/sqlsrv.php | 101 | ||||
-rw-r--r-- | program/lib/Roundcube/rcube_db.php | 9 | ||||
-rw-r--r-- | program/lib/Roundcube/rcube_imap_cache.php | 4 |
7 files changed, 3 insertions, 933 deletions
diff --git a/program/include/rcmail_install.php b/program/include/rcmail_install.php index 0585d0f94..eb922e0f5 100644 --- a/program/include/rcmail_install.php +++ b/program/include/rcmail_install.php @@ -70,10 +70,6 @@ class rcmail_install 'MySQL' => 'pdo_mysql', 'PostgreSQL' => 'pdo_pgsql', 'SQLite' => 'pdo_sqlite', - 'SQLite (v2)' => 'pdo_sqlite2', - 'SQL Server (SQLSRV)' => 'pdo_sqlsrv', - 'SQL Server (DBLIB)' => 'pdo_dblib', - 'Oracle' => 'oci8', ]; /** @var array List of config options with default value change per-release */ diff --git a/program/lib/Roundcube/README.md b/program/lib/Roundcube/README.md index 99ef46908..caf0109f3 100644 --- a/program/lib/Roundcube/README.md +++ b/program/lib/Roundcube/README.md @@ -20,7 +20,7 @@ REQUIREMENTS ------------ PHP Version 7.3 or greater including: - PCRE, DOM, JSON, Session, Sockets, OpenSSL, Mbstring, Filter, Ctype, Intl (required) - - PHP PDO with driver for either MySQL, PostgreSQL, SQL Server, Oracle or SQLite (required) + - PHP PDO with driver for either MySQL, PostgreSQL, or SQLite (required) - Iconv, Zip, Fileinfo, Exif (recommended) - LDAP for LDAP addressbook support (optional) diff --git a/program/lib/Roundcube/db/mssql.php b/program/lib/Roundcube/db/mssql.php deleted file mode 100644 index bd5c570d7..000000000 --- a/program/lib/Roundcube/db/mssql.php +++ /dev/null @@ -1,185 +0,0 @@ -<?php - -/** - +-----------------------------------------------------------------------+ - | This file is part of the Roundcube Webmail client | - | | - | Copyright (C) The Roundcube Dev Team | - | | - | Licensed under the GNU General Public License version 3 or | - | any later version with exceptions for skins & plugins. | - | See the README file for a full license statement. | - | | - | PURPOSE: | - | Database wrapper class that implements PHP PDO functions | - | for MS SQL Server database | - +-----------------------------------------------------------------------+ - | Author: Aleksander Machniak <alec@alec.pl> | - +-----------------------------------------------------------------------+ -*/ - -/** - * Database independent query interface - * This is a wrapper for the PHP PDO - * - * @package Framework - * @subpackage Database - */ -class rcube_db_mssql extends rcube_db -{ - public $db_provider = 'mssql'; - - /** - * {@inheritdoc} - */ - public function __construct($db_dsnw, $db_dsnr = '', $pconn = false) - { - parent::__construct($db_dsnw, $db_dsnr, $pconn); - - $this->options['identifier_start'] = '['; - $this->options['identifier_end'] = ']'; - } - - /** - * Driver-specific configuration of database connection - * - * @param array $dsn DSN for DB connections - * @param PDO $dbh Connection handler - */ - protected function conn_configure($dsn, $dbh) - { - // Set date format in case of non-default language (#1488918) - $dbh->query("SET DATEFORMAT ymd"); - } - - /** - * Return SQL function for current time and date - * - * @param int $interval Optional interval (in seconds) to add/subtract - * - * @return string SQL function to use in query - */ - public function now($interval = 0) - { - if ($interval) { - $interval = intval($interval); - return "dateadd(second, $interval, getdate())"; - } - - return "getdate()"; - } - - /** - * Return SQL statement to convert a field value into a unix timestamp - * - * @param string $field Field name - * - * @return string SQL statement to use in query - * @deprecated - */ - public function unixtimestamp($field) - { - return "DATEDIFF(second, '19700101', $field) + DATEDIFF(second, GETDATE(), GETUTCDATE())"; - } - - /** - * Abstract SQL statement for value concatenation - * - * @return string ...$args Values to concatenate - */ - public function concat(...$args) - { - if (count($args) == 1 && is_array($args[0])) { - $args = $args[0]; - } - - return '(' . implode('+', $args) . ')'; - } - - /** - * Adds TOP (LIMIT,OFFSET) clause to the query - * - * @param string $query SQL query - * @param int $limit Number of rows - * @param int $offset Offset - * - * @return string SQL query - */ - protected function set_limit($query, $limit = 0, $offset = 0) - { - $limit = intval($limit); - $offset = intval($offset); - $end = $offset + $limit; - - // query without OFFSET - if (!$offset) { - $query = preg_replace('/^SELECT\s/i', "SELECT TOP $limit ", $query); - return $query; - } - - $orderby = stristr($query, 'ORDER BY'); - $offset += 1; - - if ($orderby !== false) { - $query = trim(substr($query, 0, -1 * strlen($orderby))); - } - else { - // it shouldn't happen, paging without sorting has not much sense - // @FIXME: I don't know how to build paging query without ORDER BY - $orderby = "ORDER BY 1"; - } - - $query = preg_replace('/^SELECT\s/i', '', $query); - $query = "WITH paging AS (SELECT ROW_NUMBER() OVER ($orderby) AS [RowNumber], $query)" - . " SELECT * FROM paging WHERE [RowNumber] BETWEEN $offset AND $end ORDER BY [RowNumber]"; - - return $query; - } - - /** - * Returns PDO DSN string from DSN array - */ - protected function dsn_string($dsn) - { - $params = []; - $result = $dsn['phptype'] . ':'; - - if (isset($dsn['hostspec'])) { - $host = $dsn['hostspec']; - if (isset($dsn['port'])) { - $host .= ',' . $dsn['port']; - } - $params[] = 'host=' . $host; - } - - if (isset($dsn['database'])) { - $params[] = 'dbname=' . $dsn['database']; - } - - if (!empty($params)) { - $result .= implode(';', $params); - } - - return $result; - } - - /** - * Parse SQL file and fix table names according to table prefix - */ - protected function fix_table_names($sql) - { - if (!$this->options['table_prefix']) { - return $sql; - } - - // replace sequence names, and other postgres-specific commands - $sql = preg_replace_callback( - '/((TABLE|(?<!ON )UPDATE|INSERT INTO|FROM(?! deleted)| ON(?! (DELETE|UPDATE|\[PRIMARY\]))' - . '|REFERENCES|CONSTRAINT|TRIGGER|INDEX)\s+(\[dbo\]\.)?[\[\]]*)([^\[\]\( \r\n]+)/', - [$this, 'fix_table_names_callback'], - $sql - ); - - return $sql; - } -} diff --git a/program/lib/Roundcube/db/oracle.php b/program/lib/Roundcube/db/oracle.php deleted file mode 100644 index 038a4a52d..000000000 --- a/program/lib/Roundcube/db/oracle.php +++ /dev/null @@ -1,631 +0,0 @@ -<?php - -/** - +-----------------------------------------------------------------------+ - | This file is part of the Roundcube Webmail client | - | | - | Copyright (C) The Roundcube Dev Team | - | | - | Licensed under the GNU General Public License version 3 or | - | any later version with exceptions for skins & plugins. | - | See the README file for a full license statement. | - | | - | PURPOSE: | - | Database wrapper class that implements database functions | - | for Oracle database using OCI8 extension | - +-----------------------------------------------------------------------+ - | Author: Aleksander Machniak <machniak@kolabsys.com> | - +-----------------------------------------------------------------------+ -*/ - -/** - * Database independent query interface - * - * @package Framework - * @subpackage Database - */ -class rcube_db_oracle extends rcube_db -{ - public $db_provider = 'oracle'; - public $in_transaction = false; - - /** - * Create connection instance - */ - protected function conn_create($dsn) - { - // Get database specific connection options - $dsn_options = $this->dsn_options($dsn); - - $function = $this->db_pconn ? 'oci_pconnect' : 'oci_connect'; - - if (!function_exists($function)) { - $this->db_error = true; - $this->db_error_msg = 'OCI8 extension not loaded. See http://php.net/manual/en/book.oci8.php'; - - rcube::raise_error([ - 'code' => 500, 'type' => 'db', - 'line' => __LINE__, 'file' => __FILE__, - 'message' => $this->db_error_msg - ], true, false); - - return; - } - - // connect - $dbh = @$function($dsn['username'], $dsn['password'], $dsn_options['database'], $dsn_options['charset']); - - if (!$dbh) { - $error = oci_error(); - $this->db_error = true; - $this->db_error_msg = $error['message']; - - rcube::raise_error([ - 'code' => 500, 'type' => 'db', - 'line' => __LINE__, 'file' => __FILE__, - 'message' => $this->db_error_msg - ], true, false); - - return; - } - - // configure session - $this->conn_configure($dsn, $dbh); - - return $dbh; - } - - /** - * Driver-specific configuration of database connection - * - * @param array $dsn DSN for DB connections - * @param PDO $dbh Connection handler - */ - protected function conn_configure($dsn, $dbh) - { - $init_queries = [ - "ALTER SESSION SET nls_date_format = 'YYYY-MM-DD'", - "ALTER SESSION SET nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS'", - ]; - - foreach ($init_queries as $query) { - $stmt = oci_parse($dbh, $query); - oci_execute($stmt); - } - } - - /** - * Connection state checker - * - * @return bool True if in connected state - */ - public function is_connected() - { - return empty($this->dbh) ? false : $this->db_connected; - } - - /** - * Execute a SQL query with limits - * - * @param string $query SQL query to execute - * @param int $offset Offset for LIMIT statement - * @param int $numrows Number of rows for LIMIT statement - * @param array $params Values to be inserted in query - * - * @return PDOStatement|bool Query handle or False on error - */ - protected function _query($query, $offset, $numrows, $params) - { - $query = ltrim($query); - - $this->db_connect($this->dsn_select($query), true); - - // check connection before proceeding - if (!$this->is_connected()) { - return $this->last_result = false; - } - - if ($numrows || $offset) { - $query = $this->set_limit($query, $numrows, $offset); - } - - // replace self::DEFAULT_QUOTE with driver-specific quoting - $query = $this->query_parse($query); - - // Because in Roundcube we mostly use queries that are - // executed only once, we will not use prepared queries - $pos = 0; - $idx = 0; - $args = []; - - if (!empty($params)) { - while ($pos = strpos($query, '?', $pos)) { - if ($query[$pos+1] == '?') { // skip escaped '?' - $pos += 2; - } - else { - $val = $this->quote($params[$idx++]); - - // long strings are not allowed inline, need to be parametrized - if (strlen($val) > 4000) { - $key = ':param' . (count($args) + 1); - $args[$key] = $params[$idx-1]; - $val = $key; - } - - unset($params[$idx-1]); - $query = substr_replace($query, $val, $pos, 1); - $pos += strlen($val); - } - } - } - - $query = rtrim($query, " \t\n\r\0\x0B;"); - - // replace escaped '?' and quotes back to normal, see self::quote() - $query = str_replace( - ['??', self::DEFAULT_QUOTE.self::DEFAULT_QUOTE], - ['?', self::DEFAULT_QUOTE], - $query - ); - - // log query - $this->debug($query); - - // destroy reference to previous result - $this->last_result = null; - $this->db_error_msg = null; - - // prepare query - $result = @oci_parse($this->dbh, $query); - $mode = $this->in_transaction ? OCI_NO_AUTO_COMMIT : OCI_COMMIT_ON_SUCCESS; - - if ($result) { - foreach (array_keys($args) as $param) { - oci_bind_by_name($result, $param, $args[$param], -1, SQLT_LNG); - } - } - - // execute query - if (!$result || !@oci_execute($result, $mode)) { - $result = $this->handle_error($query, $result); - } - - return $this->last_result = $result; - } - - /** - * Helper method to handle DB errors. - * This by default logs the error but could be overridden by a driver implementation - * - * @param string Query that triggered the error - * @param resource Query result - * - * @return bool Result to be stored and returned - */ - protected function handle_error($query, $result = null) - { - $error = oci_error($result ?: $this->dbh); - - // @TODO: Find error codes for key errors - if (empty($this->options['ignore_key_errors']) || !in_array($error['code'], ['23000', '23505'])) { - $this->db_error = true; - $this->db_error_msg = sprintf('[%s] %s', $error['code'], $error['message']); - - rcube::raise_error([ - 'code' => 500, 'type' => 'db', - 'line' => __LINE__, 'file' => __FILE__, - 'message' => $this->db_error_msg . " (SQL Query: $query)" - ], true, false); - } - - return false; - } - - /** - * Get last inserted record ID - * - * @param string $table Table name (to find the incremented sequence) - * - * @return mixed ID or false on failure - */ - public function insert_id($table = null) - { - if (!$this->db_connected || $this->db_mode == 'r' || empty($table)) { - return false; - } - - $sequence = $this->quote_identifier($this->sequence_name($table)); - $result = $this->query("SELECT $sequence.currval FROM dual"); - $result = $this->fetch_array($result); - - return !empty($result[0]) ? $result[0] : false; - } - - /** - * Get number of affected rows for the last query - * - * @param mixed $result Optional query handle - * - * @return int Number of (matching) rows - */ - public function affected_rows($result = null) - { - if ($result || ($result === null && ($result = $this->last_result))) { - return oci_num_rows($result); - } - - return 0; - } - - /** - * Get number of rows for a SQL query - * If no query handle is specified, the last query will be taken as reference - * - * @param mixed $result Optional query handle - * - * @return mixed Number of rows or false on failure - * @deprecated This method shows very poor performance and should be avoided. - */ - public function num_rows($result = null) - { - // not implemented - return false; - } - - /** - * Get an associative array for one row - * If no query handle is specified, the last query will be taken as reference - * - * @param mixed $result Optional query handle - * - * @return mixed Array with col values or false on failure - */ - public function fetch_assoc($result = null) - { - return $this->_fetch_row($result, OCI_ASSOC); - } - - /** - * Get an index array for one row - * If no query handle is specified, the last query will be taken as reference - * - * @param mixed $result Optional query handle - * - * @return mixed Array with col values or false on failure - */ - public function fetch_array($result = null) - { - return $this->_fetch_row($result, OCI_NUM); - } - - /** - * Get col values for a result row - * - * @param mixed $result Optional query handle - * @param int $mode Fetch mode identifier - * - * @return array|false Array with col values or false on failure - */ - protected function _fetch_row($result, $mode) - { - if ($result || ($result === null && ($result = $this->last_result))) { - return oci_fetch_array($result, $mode + OCI_RETURN_NULLS + OCI_RETURN_LOBS); - } - - return false; - } - - /** - * Formats input so it can be safely used in a query - * PDO_OCI does not implement quote() method - * - * @param mixed $input Value to quote - * @param string $type Type of data (integer, bool, ident) - * - * @return string Quoted/converted string for use in query - */ - public function quote($input, $type = null) - { - // handle int directly for better performance - if ($type == 'integer' || $type == 'int') { - return intval($input); - } - - if (is_null($input)) { - return 'NULL'; - } - - if ($input instanceof DateTime) { - return $this->quote($input->format($this->options['datetime_format'])); - } - - if ($type == 'ident') { - return $this->quote_identifier($input); - } - - switch ($type) { - case 'bool': - case 'integer': - return intval($input); - default: - return "'" . strtr($input, [ - '?' => '??', - "'" => "''", - rcube_db::DEFAULT_QUOTE => rcube_db::DEFAULT_QUOTE . rcube_db::DEFAULT_QUOTE - ]) . "'"; - } - } - - /** - * Return correct name for a specific database sequence - * - * @param string $table Table name - * - * @return string Translated sequence name - */ - protected function sequence_name($table) - { - // Note: we support only one sequence per table - // Note: The sequence name must be <table_name>_seq - $sequence = $table . '_seq'; - - // modify sequence name if prefix is configured - if ($prefix = $this->options['table_prefix']) { - return $prefix . $sequence; - } - - return $sequence; - } - - /** - * Return SQL statement for case insensitive LIKE - * - * @param string $column Field name - * @param string $value Search value - * - * @return string SQL statement to use in query - */ - public function ilike($column, $value) - { - return 'UPPER(' . $this->quote_identifier($column) . ') LIKE UPPER(' . $this->quote($value) . ')'; - } - - /** - * Return SQL function for current time and date - * - * @param int $interval Optional interval (in seconds) to add/subtract - * - * @return string SQL function to use in query - */ - public function now($interval = 0) - { - if ($interval) { - $interval = intval($interval); - return "current_timestamp + INTERVAL '$interval' SECOND"; - } - - return "current_timestamp"; - } - - /** - * Return SQL statement to convert a field value into a unix timestamp - * - * @param string $field Field name - * - * @return string SQL statement to use in query - * @deprecated - */ - public function unixtimestamp($field) - { - return "(($field - to_date('1970-01-01','YYYY-MM-DD')) * 60 * 60 * 24)"; - } - - /** - * Adds TOP (LIMIT,OFFSET) clause to the query - * - * @param string $query SQL query - * @param int $limit Number of rows - * @param int $offset Offset - * - * @return string SQL query - */ - protected function set_limit($query, $limit = 0, $offset = 0) - { - $limit = intval($limit); - $offset = intval($offset); - $end = $offset + $limit; - - // @TODO: Oracle 12g has better OFFSET support - - if (!$offset) { - $query = "SELECT * FROM ($query) a WHERE rownum <= $end"; - } - else { - $query = "SELECT * FROM (SELECT a.*, rownum as rn FROM ($query) a WHERE rownum <= $end) b WHERE rn > $offset"; - } - - return $query; - } - - /** - * Parse SQL file and fix table names according to table prefix - */ - protected function fix_table_names($sql) - { - if (!$this->options['table_prefix']) { - return $sql; - } - - $sql = parent::fix_table_names($sql); - - // replace sequence names, and other Oracle-specific commands - $sql = preg_replace_callback('/(SEQUENCE ["]?)([^" \r\n]+)/', - [$this, 'fix_table_names_callback'], - $sql - ); - - $sql = preg_replace_callback( - '/([ \r\n]+["]?)([^"\' \r\n\.]+)(["]?\.nextval)/', - [$this, 'fix_table_names_seq_callback'], - $sql - ); - - return $sql; - } - - /** - * Preg_replace callback for fix_table_names() - */ - protected function fix_table_names_seq_callback($matches) - { - return $matches[1] . $this->options['table_prefix'] . $matches[2] . $matches[3]; - } - - /** - * Returns connection options from DSN array - */ - protected function dsn_options($dsn) - { - $params = []; - - if (isset($dsn['hostspec'])) { - $host = $dsn['hostspec']; - if (isset($dsn['port'])) { - $host .= ':' . $dsn['port']; - } - - $params['database'] = $host . '/' . $dsn['database']; - } - - $params['charset'] = 'UTF8'; - - return $params; - } - - /** - * Execute the given SQL script - * - * @param string $sql SQL queries to execute - * - * @return bool True on success, False on error - */ - public function exec_script($sql) - { - $sql = $this->fix_table_names($sql); - $buff = ''; - $body = false; - - foreach (explode("\n", $sql) as $line) { - $tok = strtolower(trim($line)); - if (preg_match('/^--/', $line) || $tok == '' || $tok == '/') { - continue; - } - - $buff .= $line . "\n"; - - // detect PL/SQL function bodies, don't break on semicolon - if ($body && $tok == 'end;') { - $body = false; - } - else if (!$body && $tok == 'begin') { - $body = true; - } - - if (!$body && substr($tok, -1) == ';') { - $this->query($buff); - $buff = ''; - if ($this->db_error) { - break; - } - } - } - - return !$this->db_error; - } - - /** - * Start transaction - * - * @return bool True on success, False on failure - */ - public function startTransaction() - { - $this->db_connect('w', true); - - // check connection before proceeding - if (!$this->is_connected()) { - return $this->last_result = false; - } - - $this->debug('BEGIN TRANSACTION'); - - return $this->last_result = $this->in_transaction = true; - } - - /** - * Commit transaction - * - * @return bool True on success, False on failure - */ - public function endTransaction() - { - $this->db_connect('w', true); - - // check connection before proceeding - if (!$this->is_connected()) { - return $this->last_result = false; - } - - $this->debug('COMMIT TRANSACTION'); - - if ($result = @oci_commit($this->dbh)) { - $this->in_transaction = true; - } - else { - $this->handle_error('COMMIT'); - } - - return $this->last_result = $result; - } - - /** - * Rollback transaction - * - * @return bool True on success, False on failure - */ - public function rollbackTransaction() - { - $this->db_connect('w', true); - - // check connection before proceeding - if (!$this->is_connected()) { - return $this->last_result = false; - } - - $this->debug('ROLLBACK TRANSACTION'); - - if (@oci_rollback($this->dbh)) { - $this->in_transaction = false; - } - else { - $this->handle_error('ROLLBACK'); - } - - return $this->last_result = $this->dbh->rollBack(); - } - - /** - * Terminate database connection. - */ - public function closeConnection() - { - // release statement and close connection(s) - $this->last_result = null; - foreach ($this->dbhs as $dbh) { - oci_close($dbh); - } - - parent::closeConnection(); - } -} diff --git a/program/lib/Roundcube/db/sqlsrv.php b/program/lib/Roundcube/db/sqlsrv.php deleted file mode 100644 index f064c95ae..000000000 --- a/program/lib/Roundcube/db/sqlsrv.php +++ /dev/null @@ -1,101 +0,0 @@ -<?php - -/** - +-----------------------------------------------------------------------+ - | This file is part of the Roundcube Webmail client | - | | - | Copyright (C) The Roundcube Dev Team | - | | - | Licensed under the GNU General Public License version 3 or | - | any later version with exceptions for skins & plugins. | - | See the README file for a full license statement. | - | | - | PURPOSE: | - | Database wrapper class that implements PHP PDO functions | - | for MS SQL Server database | - +-----------------------------------------------------------------------+ - | Author: Aleksander Machniak <alec@alec.pl> | - +-----------------------------------------------------------------------+ -*/ - -/** - * Database independent query interface - * This is a wrapper for the PHP PDO - * - * @package Framework - * @subpackage Database - */ -class rcube_db_sqlsrv extends rcube_db_mssql -{ - - /** - * Get last inserted record ID - * - * @param string $table Table name (to find the incremented sequence) - * - * @return string|false The ID or False on failure - */ - public function insert_id($table = '') - { - if (!$this->db_connected || $this->db_mode == 'r') { - return false; - } - - if ($table) { - // For some unknown reason the constant described in the driver docs - // might not exist, we'll fallback to PDO::ATTR_CLIENT_VERSION (#7564) - if (defined('PDO::ATTR_DRIVER_VERSION')) { - $driver_version = $this->dbh->getAttribute(PDO::ATTR_DRIVER_VERSION); - } - else if (defined('PDO::ATTR_CLIENT_VERSION')) { - $client_version = $this->dbh->getAttribute(PDO::ATTR_CLIENT_VERSION); - $driver_version = $client_version['ExtensionVer']; - } - else { - $driver_version = 5; - } - - // Starting from version 5 of the driver lastInsertId() method expects - // a sequence name instead of a table name. We'll unset the argument - // to get the last insert sequence (#7564) - if (version_compare($driver_version, '5', '>=')) { - $table = null; - } - else { - // resolve table name - $table = $this->table_name($table); - } - } - - return $this->dbh->lastInsertId($table); - } - - /** - * Returns PDO DSN string from DSN array - */ - protected function dsn_string($dsn) - { - $params = []; - $result = 'sqlsrv:'; - - if (isset($dsn['hostspec'])) { - $host = $dsn['hostspec']; - - if (isset($dsn['port'])) { - $host .= ',' . $dsn['port']; - } - - $params[] = 'Server=' . $host; - } - - if (isset($dsn['database'])) { - $params[] = 'Database=' . $dsn['database']; - } - - if (!empty($params)) { - $result .= implode(';', $params); - } - - return $result; - } -} diff --git a/program/lib/Roundcube/rcube_db.php b/program/lib/Roundcube/rcube_db.php index af1eee923..cab70eeb9 100644 --- a/program/lib/Roundcube/rcube_db.php +++ b/program/lib/Roundcube/rcube_db.php @@ -80,11 +80,7 @@ class rcube_db $driver = strtolower(substr($db_dsnw, 0, strpos($db_dsnw, ':'))); $driver_map = [ 'sqlite2' => 'sqlite', - 'sybase' => 'mssql', - 'dblib' => 'mssql', 'mysqli' => 'mysql', - 'oci' => 'oracle', - 'oci8' => 'oracle', ]; $driver = $driver_map[$driver] ?? $driver; @@ -1418,10 +1414,7 @@ class rcube_db continue; } - if ($trimmed == 'GO') { - $exec = $buff; - } - else if ($trimmed[strlen($trimmed)-1] == ';') { + if ($trimmed[strlen($trimmed)-1] == ';') { $exec = $buff . substr(rtrim($line), 0, -1); } diff --git a/program/lib/Roundcube/rcube_imap_cache.php b/program/lib/Roundcube/rcube_imap_cache.php index 0de7a77af..a115ed4d3 100644 --- a/program/lib/Roundcube/rcube_imap_cache.php +++ b/program/lib/Roundcube/rcube_imap_cache.php @@ -544,8 +544,6 @@ class rcube_imap_cache } } - $binary_check = $this->db->db_provider == 'oracle' ? "BITAND(`flags`, %d)" : "(`flags` & %d)"; - $this->db->query( "UPDATE {$this->messages_table}" ." SET `expires` = ". ($this->ttl ? $this->db->now($this->ttl) : 'NULL') @@ -553,7 +551,7 @@ class rcube_imap_cache ." WHERE `user_id` = ?" ." AND `mailbox` = ?" .(!empty($uids) ? " AND `uid` IN (".$this->db->array2list($uids, 'integer').")" : "") - ." AND " . sprintf($binary_check, $idx) . ($enabled ? " = 0" : " = $idx"), + ." AND (`flags` & $idx) = " . ($enabled ? '0' : $idx), $this->userid, $mailbox ); } |