|
<?php |
|
|
|
namespace PicoDb\Driver; |
|
|
|
use PDO; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Mssql extends Base |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
protected $requiredAttributes = array( |
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function __construct(array $settings) |
|
{ |
|
parent::__construct($settings); |
|
$this->useTop = true; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $schemaTable = 'schema_version'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function createConnection(array $settings) |
|
{ |
|
$dsn = $settings['driver'] . ':'; |
|
|
|
|
|
if ($settings['driver'] == 'odbc') { |
|
$dsn .= $settings['odbc-dsn']; |
|
} else { |
|
if ($settings['driver'] == 'dblib') { |
|
$dsn .= 'host=' . $settings['hostname']; |
|
} elseif ($settings['driver'] == 'sqlsrv') { |
|
$dsn .= 'Server=' . $settings['hostname']; |
|
} |
|
if (! empty($settings['port'])) { |
|
$dsn .= ',' . $settings['port']; |
|
} |
|
} |
|
|
|
if (! empty($settings['database'])) { |
|
if ($settings['driver'] == 'dblib') { |
|
$dsn .= ';dbname=' . $settings['database']; |
|
} elseif ($settings['driver'] == 'sqlsrv') { |
|
$dsn .= ';Database=' . $settings['database']; |
|
} |
|
} |
|
|
|
|
|
if (! empty($settings['appname'])) { |
|
if ($settings['driver'] == 'dblib') { |
|
$dsn .= ';appname=' . $settings['appname']; |
|
} elseif ($settings['driver'] == 'sqlsrv') { |
|
$dsn .= ';APP=' . $settings['appname']; |
|
} |
|
} |
|
|
|
|
|
if (! empty($settings['username'])) { |
|
$this->pdo = new PDO($dsn, $settings['username'], $settings['password']); |
|
} else { |
|
$this->pdo = new PDO($dsn); |
|
} |
|
|
|
if (isset($settings['schema_table'])) { |
|
$this->schemaTable = $settings['schema_table']; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
public function enableForeignKeys() |
|
{ |
|
$this->pdo->exec('EXEC sp_MSforeachtable @command1="ALTER TABLE ? CHECK CONSTRAINT ALL";'); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
public function disableForeignKeys() |
|
{ |
|
$this->pdo->exec('EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL";'); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function isDuplicateKeyError($code) |
|
{ |
|
|
|
|
|
|
|
return array_search($code, ['2601','2627','23000']) !== false; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function escape($identifier) |
|
{ |
|
return '['.str_replace("]","]]",$identifier).']'; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getOperator($operator) |
|
{ |
|
if ($operator === 'LIKE' || $operator === 'ILIKE') { |
|
return 'LIKE'; |
|
} |
|
|
|
return ''; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getLastId() |
|
{ |
|
try { |
|
$rq = $this->pdo->prepare('SELECT @@IDENTITY'); |
|
$rq->execute(); |
|
|
|
return $rq->fetchColumn(); |
|
} |
|
catch (PDOException $e) { |
|
return 0; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getSchemaVersion() |
|
{ |
|
$this->pdo->exec(" |
|
IF OBJECT_ID(N'dbo.".$this->schemaTable."', N'U') IS NULL |
|
CREATE TABLE dbo.".$this->schemaTable." ( |
|
version INT DEFAULT '0' |
|
); |
|
"); |
|
|
|
$rq = $this->pdo->prepare('SELECT version FROM dbo.'.$this->schemaTable.''); |
|
$rq->execute(); |
|
$result = $rq->fetchColumn(); |
|
|
|
if ($result !== false) { |
|
return (int) $result; |
|
} |
|
else { |
|
$this->pdo->exec('INSERT INTO dbo.'.$this->schemaTable.' (version) 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) |
|
{ |
|
$this->getConnection()->exec('SET SHOWPLAN_ALL ON'); |
|
return $this->getConnection()->query($this->getSqlFromPreparedStatement($sql, $values))->fetchAll(PDO::FETCH_ASSOC); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getDatabaseVersion() |
|
{ |
|
return $this->getConnection()->query('SELECT @@VERSION;')->fetchColumn(); |
|
} |
|
|
|
} |
|
|