| | |
| | | 'dblib' => 'mssql', |
| | | 'mysqli' => 'mysql', |
| | | 'oci' => 'oracle', |
| | | 'oci8' => 'oracle', |
| | | ); |
| | | |
| | | $driver = isset($driver_map[$driver]) ? $driver_map[$driver] : $driver; |
| | |
| | | return $this->dbh; |
| | | } |
| | | |
| | | // connect to database |
| | | if ($dbh = $this->conn_create($dsn)) { |
| | | $this->dbh = $dbh; |
| | | $this->dbhs[$mode] = $dbh; |
| | | $this->db_mode = $mode; |
| | | $this->db_connected = true; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Create PDO connection |
| | | */ |
| | | protected function conn_create($dsn) |
| | | { |
| | | // Get database specific connection options |
| | | $dsn_string = $this->dsn_string($dsn); |
| | | $dsn_options = $this->dsn_options($dsn); |
| | |
| | | |
| | | // don't throw exceptions or warnings |
| | | $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); |
| | | |
| | | $this->conn_configure($dsn, $dbh); |
| | | } |
| | | catch (Exception $e) { |
| | | $this->db_error = true; |
| | |
| | | return null; |
| | | } |
| | | |
| | | $this->dbh = $dbh; |
| | | $this->dbhs[$mode] = $dbh; |
| | | $this->db_mode = $mode; |
| | | $this->db_connected = true; |
| | | $this->conn_configure($dsn, $dbh); |
| | | return $dbh; |
| | | } |
| | | |
| | | /** |
| | |
| | | // log query |
| | | $this->debug($query); |
| | | |
| | | return $this->query_execute($query); |
| | | } |
| | | |
| | | /** |
| | | * Query execution |
| | | */ |
| | | protected function query_execute($query) |
| | | { |
| | | // destroy reference to previous result, required for SQLite driver (#1488874) |
| | | $this->last_result = null; |
| | | $this->last_result = null; |
| | | $this->db_error_msg = null; |
| | | |
| | | // send query |
| | |
| | | $result = $this->handle_error($query); |
| | | } |
| | | |
| | | $this->last_result = $result; |
| | | |
| | | return $result; |
| | | return $this->last_result = $result; |
| | | } |
| | | |
| | | /** |
| | |
| | | public function affected_rows($result = null) |
| | | { |
| | | if ($result || ($result === null && ($result = $this->last_result))) { |
| | | return $result->rowCount(); |
| | | if ($result !== true) { |
| | | return $result->rowCount(); |
| | | } |
| | | } |
| | | |
| | | return 0; |
| | |
| | | */ |
| | | public function num_rows($result = null) |
| | | { |
| | | if ($result || ($result === null && ($result = $this->last_result))) { |
| | | if (($result || ($result === null && ($result = $this->last_result))) && $result !== true) { |
| | | // repeat query with SELECT COUNT(*) ... |
| | | if (preg_match('/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/ims', $result->queryString, $m)) { |
| | | $query = $this->dbh->query('SELECT COUNT(*) FROM ' . $m[1], PDO::FETCH_NUM); |
| | |
| | | protected function _fetch_row($result, $mode) |
| | | { |
| | | if ($result || ($result === null && ($result = $this->last_result))) { |
| | | return $result->fetch($mode); |
| | | if ($result !== true) { |
| | | return $result->fetch($mode); |
| | | } |
| | | } |
| | | |
| | | return false; |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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->dbh->beginTransaction(); |
| | | } |
| | | |
| | | /** |
| | | * 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'); |
| | | |
| | | return $this->last_result = $this->dbh->commit(); |
| | | } |
| | | |
| | | /** |
| | | * 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'); |
| | | |
| | | return $this->last_result = $this->dbh->rollBack(); |
| | | } |
| | | |
| | | /** |
| | | * Formats input so it can be safely used in a query |
| | | * |
| | | * @param mixed $input Value to quote |