| | |
| | | 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'"); |
| | | } |
| | | |
| | | /** |
| | |
| | | $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'])) { |
| | |
| | | |
| | | // 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; |
| | | } |
| | |
| | | |
| | | $result = $this->query('SHOW VARIABLES'); |
| | | |
| | | while ($sql_arr = $this->fetch_array($result)) { |
| | | while ($row = $this->fetch_array($result)) { |
| | | $this->variables[$row[0]] = $row[1]; |
| | | } |
| | | } |
| | |
| | | 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); |
| | | } |
| | | |
| | | } |