|
<?php |
|
|
|
namespace PicoDb\Driver; |
|
|
|
use PDO; |
|
use PDOException; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Postgres extends Base |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
protected $requiredAttributes = array( |
|
'database', |
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $schemaTable = 'schema_version'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function createConnection(array $settings) |
|
{ |
|
$dsn = 'pgsql:dbname='.$settings['database']; |
|
$username = null; |
|
$password = null; |
|
$options = array(); |
|
|
|
if (! empty($settings['username'])) { |
|
$username = $settings['username']; |
|
} |
|
|
|
if (! empty($settings['password'])) { |
|
$password = $settings['password']; |
|
} |
|
|
|
if (! empty($settings['hostname'])) { |
|
$dsn .= ';host='.$settings['hostname']; |
|
} |
|
|
|
if (! empty($settings['port'])) { |
|
$dsn .= ';port='.$settings['port']; |
|
} |
|
|
|
if (! empty($settings['timeout'])) { |
|
$options[PDO::ATTR_TIMEOUT] = $settings['timeout']; |
|
} |
|
|
|
$this->pdo = new PDO($dsn, $username, $password, $options); |
|
|
|
if (isset($settings['schema_table'])) { |
|
$this->schemaTable = $settings['schema_table']; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
public function enableForeignKeys() |
|
{ |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
public function disableForeignKeys() |
|
{ |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function isDuplicateKeyError($code) |
|
{ |
|
return $code == 23505 || $code == 23503; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function escape($identifier) |
|
{ |
|
return '"'.$identifier.'"'; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getOperator($operator) |
|
{ |
|
if ($operator === 'LIKE') { |
|
return 'LIKE'; |
|
} |
|
else if ($operator === 'ILIKE') { |
|
return 'ILIKE'; |
|
} |
|
|
|
return ''; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getLastId() |
|
{ |
|
try { |
|
$rq = $this->pdo->prepare('SELECT LASTVAL()'); |
|
$rq->execute(); |
|
|
|
return $rq->fetchColumn(); |
|
} |
|
catch (PDOException $e) { |
|
return 0; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getSchemaVersion() |
|
{ |
|
$this->pdo->exec("CREATE TABLE IF NOT EXISTS ".$this->schemaTable." (version INTEGER DEFAULT 0)"); |
|
|
|
$rq = $this->pdo->prepare('SELECT "version" FROM "'.$this->schemaTable.'"'); |
|
$rq->execute(); |
|
$result = $rq->fetchColumn(); |
|
|
|
if ($result !== false) { |
|
return (int) $result; |
|
} |
|
else { |
|
$this->pdo->exec('INSERT INTO '.$this->schemaTable.' VALUES(0)'); |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function setSchemaVersion($version) |
|
{ |
|
$rq = $this->pdo->prepare('UPDATE '.$this->schemaTable.' SET version=?'); |
|
$rq->execute(array($version)); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function explain($sql, array $values) |
|
{ |
|
return $this->getConnection()->query('EXPLAIN (FORMAT YAML) '.$this->getSqlFromPreparedStatement($sql, $values))->fetchAll(PDO::FETCH_ASSOC); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getDatabaseVersion() |
|
{ |
|
return $this->getConnection()->query('SHOW server_version')->fetchColumn(); |
|
} |
|
} |
|
|