Aleksander Machniak
2014-02-24 32c612c11291dd0ee3f19741683ed95276aa9065
program/lib/Roundcube/rcube_db_mysql.php
@@ -30,13 +30,37 @@
    public $db_provider = 'mysql';
    /**
     * Driver initialization/configuration
     * Object constructor
     *
     * @param string $db_dsnw DSN for read/write operations
     * @param string $db_dsnr Optional DSN for read only operations
     * @param bool   $pconn   Enables persistent connections
     */
    protected function init()
    public function __construct($db_dsnw, $db_dsnr = '', $pconn = false)
    {
        if (version_compare(PHP_VERSION, '5.3.0', '<')) {
            rcube::raise_error(array('code' => 600, 'type' => 'db',
                'line' => __LINE__, 'file' => __FILE__,
                'message' => "MySQL driver requires PHP >= 5.3, current version is " . PHP_VERSION),
                true, true);
        }
        parent::__construct($db_dsnw, $db_dsnr, $pconn);
        // SQL identifiers quoting
        $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)
    {
        $dbh->query("SET NAMES 'utf8'");
    }
    /**
@@ -104,11 +128,11 @@
        $result = array();
        if (!empty($dsn['key'])) {
            $result[PDO::MYSQL_ATTR_KEY] = $dsn['key'];
            $result[PDO::MYSQL_ATTR_SSL_KEY] = $dsn['key'];
        }
        if (!empty($dsn['cipher'])) {
            $result[PDO::MYSQL_ATTR_CIPHER] = $dsn['cipher'];
            $result[PDO::MYSQL_ATTR_SSL_CIPHER] = $dsn['cipher'];
        }
        if (!empty($dsn['cert'])) {
@@ -125,6 +149,9 @@
        // Always return matching (not affected only) rows count
        $result[PDO::MYSQL_ATTR_FOUND_ROWS] = true;
        // Enable AUTOCOMMIT mode (#1488902)
        $result[PDO::ATTR_AUTOCOMMIT] = true;
        return $result;
    }
@@ -144,7 +171,7 @@
            $result = $this->query('SHOW VARIABLES');
            while ($sql_arr = $this->fetch_array($result)) {
            while ($row = $this->fetch_array($result)) {
                $this->variables[$row[0]] = $row[1];
            }
        }
@@ -152,4 +179,29 @@
        return isset($this->variables[$varname]) ? $this->variables[$varname] : $default;
    }
    /**
     * Handle DB errors, re-issue the query on deadlock errors from InnoDB row-level locking
     *
     * @param string Query that triggered the error
     * @return mixed Result to be stored and returned
     */
    protected function handle_error($query)
    {
        $error = $this->dbh->errorInfo();
        // retry after "Deadlock found when trying to get lock" errors
        $retries = 2;
        while ($error[1] == 1213 && $retries >= 0) {
            usleep(50000);  // wait 50 ms
            $result = $this->dbh->query($query);
            if ($result !== false) {
                return $result;
            }
            $error = $this->dbh->errorInfo();
            $retries--;
        }
        return parent::handle_error($query);
    }
}