mirror of
https://github.com/dg/dibi.git
synced 2025-08-06 06:07:39 +02:00
removed support for SQLServer < 2012, PostgreSQL < 9.3
This commit is contained in:
@@ -24,14 +24,12 @@ use function sprintf;
|
|||||||
* - password (or pass)
|
* - password (or pass)
|
||||||
* - options (array) => driver specific options {@see PDO::__construct}
|
* - options (array) => driver specific options {@see PDO::__construct}
|
||||||
* - resource (PDO) => existing connection
|
* - resource (PDO) => existing connection
|
||||||
* - version
|
|
||||||
*/
|
*/
|
||||||
class PdoDriver implements Dibi\Driver
|
class PdoDriver implements Dibi\Driver
|
||||||
{
|
{
|
||||||
private ?PDO $connection;
|
private ?PDO $connection;
|
||||||
private ?int $affectedRows;
|
private ?int $affectedRows;
|
||||||
private string $driverName;
|
private string $driverName;
|
||||||
private string $serverVersion = '';
|
|
||||||
|
|
||||||
|
|
||||||
/** @throws Dibi\NotSupportedException */
|
/** @throws Dibi\NotSupportedException */
|
||||||
@@ -66,7 +64,6 @@ class PdoDriver implements Dibi\Driver
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->driverName = $this->connection->getAttribute(PDO::ATTR_DRIVER_NAME);
|
$this->driverName = $this->connection->getAttribute(PDO::ATTR_DRIVER_NAME);
|
||||||
$this->serverVersion = (string) ($config['version'] ?? @$this->connection->getAttribute(PDO::ATTR_SERVER_VERSION)); // @ - may be not supported
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -180,7 +177,7 @@ class PdoDriver implements Dibi\Driver
|
|||||||
return match ($this->driverName) {
|
return match ($this->driverName) {
|
||||||
'mysql' => new MySqlReflector($this),
|
'mysql' => new MySqlReflector($this),
|
||||||
'oci' => new OracleReflector($this),
|
'oci' => new OracleReflector($this),
|
||||||
'pgsql' => new PostgreReflector($this, $this->connection->getAttribute(PDO::ATTR_SERVER_VERSION)),
|
'pgsql' => new PostgreReflector($this),
|
||||||
'sqlite' => new SqliteReflector($this),
|
'sqlite' => new SqliteReflector($this),
|
||||||
'mssql', 'dblib', 'sqlsrv' => new SqlsrvReflector($this),
|
'mssql', 'dblib', 'sqlsrv' => new SqlsrvReflector($this),
|
||||||
default => throw new Dibi\NotSupportedException,
|
default => throw new Dibi\NotSupportedException,
|
||||||
@@ -360,7 +357,6 @@ class PdoDriver implements Dibi\Driver
|
|||||||
case 'mssql':
|
case 'mssql':
|
||||||
case 'sqlsrv':
|
case 'sqlsrv':
|
||||||
case 'dblib':
|
case 'dblib':
|
||||||
if (version_compare($this->serverVersion, '11.0') >= 0) { // 11 == SQL Server 2012
|
|
||||||
// requires ORDER BY, see https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx
|
// requires ORDER BY, see https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx
|
||||||
if ($limit !== null) {
|
if ($limit !== null) {
|
||||||
$sql = sprintf('%s OFFSET %d ROWS FETCH NEXT %d ROWS ONLY', rtrim($sql), $offset, $limit);
|
$sql = sprintf('%s OFFSET %d ROWS FETCH NEXT %d ROWS ONLY', rtrim($sql), $offset, $limit);
|
||||||
@@ -369,8 +365,7 @@ class PdoDriver implements Dibi\Driver
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
// break omitted
|
|
||||||
case 'odbc':
|
case 'odbc':
|
||||||
if ($offset) {
|
if ($offset) {
|
||||||
throw new Dibi\NotSupportedException('Offset is not supported by this database.');
|
throw new Dibi\NotSupportedException('Offset is not supported by this database.');
|
||||||
|
@@ -234,7 +234,7 @@ class PostgreDriver implements Dibi\Driver
|
|||||||
*/
|
*/
|
||||||
public function getReflector(): Dibi\Reflector
|
public function getReflector(): Dibi\Reflector
|
||||||
{
|
{
|
||||||
return new PostgreReflector($this, pg_parameter_status($this->connection, 'server_version'));
|
return new PostgreReflector($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -19,7 +19,6 @@ class PostgreReflector implements Dibi\Reflector
|
|||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private readonly Dibi\Driver $driver,
|
private readonly Dibi\Driver $driver,
|
||||||
private readonly string $version,
|
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,18 +38,15 @@ class PostgreReflector implements Dibi\Reflector
|
|||||||
FROM
|
FROM
|
||||||
information_schema.tables
|
information_schema.tables
|
||||||
WHERE
|
WHERE
|
||||||
table_schema = ANY (current_schemas(false))";
|
table_schema = ANY (current_schemas(false))
|
||||||
|
|
||||||
if ($this->version >= 9.3) {
|
|
||||||
$query .= '
|
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT
|
SELECT
|
||||||
matviewname, 1
|
matviewname, 1
|
||||||
FROM
|
FROM
|
||||||
pg_matviews
|
pg_matviews
|
||||||
WHERE
|
WHERE
|
||||||
schemaname = ANY (current_schemas(false))';
|
schemaname = ANY (current_schemas(false))";
|
||||||
}
|
|
||||||
|
|
||||||
$res = $this->driver->query($query);
|
$res = $this->driver->query($query);
|
||||||
$tables = [];
|
$tables = [];
|
||||||
|
@@ -56,11 +56,8 @@ class SqliteDriver implements Dibi\Driver
|
|||||||
}
|
}
|
||||||
|
|
||||||
// enable foreign keys support (defaultly disabled; if disabled then foreign key constraints are not enforced)
|
// enable foreign keys support (defaultly disabled; if disabled then foreign key constraints are not enforced)
|
||||||
$version = SQLite3::version();
|
|
||||||
if ($version['versionNumber'] >= '3006019') {
|
|
||||||
$this->query('PRAGMA foreign_keys = ON');
|
$this->query('PRAGMA foreign_keys = ON');
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -31,7 +31,6 @@ class SqlsrvDriver implements Dibi\Driver
|
|||||||
/** @var resource */
|
/** @var resource */
|
||||||
private $connection;
|
private $connection;
|
||||||
private ?int $affectedRows;
|
private ?int $affectedRows;
|
||||||
private string $version = '';
|
|
||||||
|
|
||||||
|
|
||||||
/** @throws Dibi\NotSupportedException */
|
/** @throws Dibi\NotSupportedException */
|
||||||
@@ -69,8 +68,6 @@ class SqlsrvDriver implements Dibi\Driver
|
|||||||
|
|
||||||
sqlsrv_configure('WarningsReturnAsErrors', 1);
|
sqlsrv_configure('WarningsReturnAsErrors', 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->version = sqlsrv_server_info($this->connection)['SQLServerVersion'];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -257,13 +254,6 @@ class SqlsrvDriver implements Dibi\Driver
|
|||||||
if ($limit < 0 || $offset < 0) {
|
if ($limit < 0 || $offset < 0) {
|
||||||
throw new Dibi\NotSupportedException('Negative offset or limit.');
|
throw new Dibi\NotSupportedException('Negative offset or limit.');
|
||||||
|
|
||||||
} elseif (version_compare($this->version, '11', '<')) { // 11 == SQL Server 2012
|
|
||||||
if ($offset) {
|
|
||||||
throw new Dibi\NotSupportedException('Offset is not supported by this database.');
|
|
||||||
|
|
||||||
} elseif ($limit !== null) {
|
|
||||||
$sql = sprintf('SELECT TOP (%d) * FROM (%s) t', $limit, $sql);
|
|
||||||
}
|
|
||||||
} elseif ($limit !== null) {
|
} elseif ($limit !== null) {
|
||||||
// requires ORDER BY, see https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx
|
// requires ORDER BY, see https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx
|
||||||
$sql = sprintf('%s OFFSET %d ROWS FETCH NEXT %d ROWS ONLY', rtrim($sql), $offset, $limit);
|
$sql = sprintf('%s OFFSET %d ROWS FETCH NEXT %d ROWS ONLY', rtrim($sql), $offset, $limit);
|
||||||
|
@@ -57,28 +57,28 @@ $fluent = $conn->select('*')
|
|||||||
->orderBy('customer_id');
|
->orderBy('customer_id');
|
||||||
|
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'),
|
||||||
(string) $fluent,
|
(string) $fluent,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
$fluent->fetch();
|
$fluent->fetch();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
'SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t',
|
'SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY',
|
||||||
dibi::$sql,
|
dibi::$sql,
|
||||||
);
|
);
|
||||||
$fluent->fetchSingle();
|
$fluent->fetchSingle();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'),
|
||||||
dibi::$sql,
|
dibi::$sql,
|
||||||
);
|
);
|
||||||
$fluent->fetchAll(0, 3);
|
$fluent->fetchAll(0, 3);
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP (3) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY'),
|
||||||
dibi::$sql,
|
dibi::$sql,
|
||||||
);
|
);
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'),
|
||||||
(string) $fluent,
|
(string) $fluent,
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -86,16 +86,16 @@ Assert::same(
|
|||||||
$fluent->limit(0);
|
$fluent->limit(0);
|
||||||
$fluent->fetch();
|
$fluent->fetch();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP (0) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 0 ROWS ONLY'),
|
||||||
dibi::$sql,
|
dibi::$sql,
|
||||||
);
|
);
|
||||||
$fluent->fetchSingle();
|
$fluent->fetchSingle();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP (0) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 0 ROWS ONLY'),
|
||||||
dibi::$sql,
|
dibi::$sql,
|
||||||
);
|
);
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP (0) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 0 ROWS ONLY'),
|
||||||
(string) $fluent,
|
(string) $fluent,
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -104,12 +104,12 @@ $fluent->removeClause('limit');
|
|||||||
$fluent->removeClause('offset');
|
$fluent->removeClause('offset');
|
||||||
$fluent->fetch();
|
$fluent->fetch();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'),
|
||||||
dibi::$sql,
|
dibi::$sql,
|
||||||
);
|
);
|
||||||
$fluent->fetchSingle();
|
$fluent->fetchSingle();
|
||||||
Assert::same(
|
Assert::same(
|
||||||
reformat('SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
|
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'),
|
||||||
dibi::$sql,
|
dibi::$sql,
|
||||||
);
|
);
|
||||||
Assert::same(
|
Assert::same(
|
||||||
|
@@ -11,13 +11,6 @@ use Tester\Assert;
|
|||||||
require __DIR__ . '/bootstrap.php';
|
require __DIR__ . '/bootstrap.php';
|
||||||
|
|
||||||
$tests = function ($conn) {
|
$tests = function ($conn) {
|
||||||
$resource = $conn->getDriver()->getResource();
|
|
||||||
$version = is_resource($resource)
|
|
||||||
? sqlsrv_server_info($resource)['SQLServerVersion']
|
|
||||||
: $resource->getAttribute(PDO::ATTR_SERVER_VERSION);
|
|
||||||
|
|
||||||
// MsSQL2012+
|
|
||||||
if (version_compare($version, '11.0') >= 0) {
|
|
||||||
// Limit and offset
|
// Limit and offset
|
||||||
Assert::same(
|
Assert::same(
|
||||||
'SELECT 1 OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY',
|
'SELECT 1 OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY',
|
||||||
@@ -71,22 +64,6 @@ $tests = function ($conn) {
|
|||||||
Dibi\NotSupportedException::class,
|
Dibi\NotSupportedException::class,
|
||||||
'Negative offset or limit.',
|
'Negative offset or limit.',
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
Assert::same(
|
|
||||||
'SELECT TOP (1) * FROM (SELECT 1) t',
|
|
||||||
$conn->translate('SELECT 1 %lmt', 1),
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::same(
|
|
||||||
'SELECT 1',
|
|
||||||
$conn->translate('SELECT 1 %lmt', -10),
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert::exception(
|
|
||||||
fn() => $conn->translate('SELECT 1 %ofs %lmt', 10, 10),
|
|
||||||
Dibi\NotSupportedException::class,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
$conn = new Dibi\Connection($config);
|
$conn = new Dibi\Connection($config);
|
||||||
|
Reference in New Issue
Block a user