1
0
mirror of https://github.com/dg/dibi.git synced 2025-07-31 19:30:30 +02:00

renamed driver classes

This commit is contained in:
David Grudl
2024-09-03 16:39:56 +02:00
parent 57aa64095f
commit 9814e8d3e2
30 changed files with 145 additions and 136 deletions

View File

@@ -23,6 +23,18 @@ use const PHP_SAPI;
*/
class Connection
{
private const Drivers = [
'firebird' => Drivers\Ibase\Connection::class,
'mysqli' => Drivers\MySQLi\Connection::class,
'odbc' => Drivers\ODBC\Connection::class,
'oracle' => Drivers\OCI8\Connection::class,
'pdo' => Drivers\PDO\Connection::class,
'postgre' => Drivers\PgSQL\Connection::class,
'sqlite3' => Drivers\SQLite3\Connection::class,
'sqlite' => Drivers\SQLite3\Connection::class,
'sqlsrv' => Drivers\SQLSrv\Connection::class,
];
/** function (Event $event); Occurs after query is executed */
public ?array $onEvent = [];
private array $config;
@@ -131,8 +143,7 @@ class Connection
$class = $this->config['driver'];
} else {
$class = preg_replace(['#\W#', '#sql#'], ['_', 'Sql'], ucfirst(strtolower($this->config['driver'])));
$class = "Dibi\\Drivers\\{$class}Driver";
$class = self::Drivers[strtolower($this->config['driver'])] ?? throw new Exception("Unknown driver '{$this->config['driver']}'.");
if (!class_exists($class)) {
throw new Exception("Unable to create instance of Dibi driver '$class'.");
}
@@ -286,7 +297,7 @@ class Connection
throw $e;
}
$res = $this->createResultSet($res ?: new Drivers\NoDataResult(max(0, $this->driver->getAffectedRows())));
$res = $this->createResultSet($res ?: new Drivers\Dummy\Result(max(0, $this->driver->getAffectedRows())));
if ($event) {
$this->onEvent($event->done($res));
}

View File

@@ -7,15 +7,16 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\Dummy;
use Dibi;
use Dibi\Drivers;
/**
* The dummy driver for testing purposes.
*/
class DummyDriver implements Connection, Result, Engine
class Connection implements Drivers\Connection, Drivers\Result, Drivers\Engine
{
public function disconnect(): void
{
@@ -64,7 +65,7 @@ class DummyDriver implements Connection, Result, Engine
/**
* Returns the connection reflector.
*/
public function getReflector(): Engine
public function getReflector(): Drivers\Engine
{
return $this;
}

View File

@@ -7,14 +7,15 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\Dummy;
use Dibi\Drivers;
/**
* The driver for no result set.
*/
class NoDataResult implements Result
class Result implements Drivers\Result
{
public function __construct(
private readonly int $rows,

View File

@@ -7,14 +7,16 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\Engines;
use Dibi\Drivers\Connection;
use Dibi\Drivers\Engine;
/**
* The reflector for Firebird/InterBase database.
*/
class FirebirdReflector implements Engine
class FirebirdEngine implements Engine
{
public function __construct(
private readonly Connection $driver,

View File

@@ -7,16 +7,18 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\Engines;
use Dibi;
use Dibi\Drivers\Connection;
use Dibi\Drivers\Engine;
/**
* The reflector for MySQL databases.
* @internal
*/
class MySqlReflector implements Engine
class MySQLEngine implements Engine
{
public function __construct(
private readonly Connection $driver,

View File

@@ -7,15 +7,17 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\Engines;
use Dibi;
use Dibi\Drivers\Connection;
use Dibi\Drivers\Engine;
/**
* The reflector for ODBC connections.
*/
class OdbcReflector implements Engine
class ODBCEngine implements Engine
{
public function __construct(
private readonly Connection $driver,

View File

@@ -7,15 +7,17 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\Engines;
use Dibi;
use Dibi\Drivers\Connection;
use Dibi\Drivers\Engine;
/**
* The reflector for Oracle database.
*/
class OracleReflector implements Engine
class OracleEngine implements Engine
{
public function __construct(
private readonly Connection $driver,

View File

@@ -7,14 +7,16 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\Engines;
use Dibi\Drivers\Connection;
use Dibi\Drivers\Engine;
/**
* The reflector for PostgreSQL database.
*/
class PostgreReflector implements Engine
class PostgreSQLEngine implements Engine
{
public function __construct(
private readonly Connection $driver,

View File

@@ -7,16 +7,17 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\Engines;
use Dibi;
use function sprintf;
use Dibi\Drivers\Connection;
use Dibi\Drivers\Engine;
/**
* The reflector for Microsoft SQL Server and SQL Azure databases.
*/
class SqlsrvReflector implements Engine
class SQLServerEngine implements Engine
{
public function __construct(
private readonly Connection $driver,

View File

@@ -7,14 +7,16 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\Engines;
use Dibi\Drivers\Connection;
use Dibi\Drivers\Engine;
/**
* The reflector for SQLite database.
*/
class SqliteReflector implements Engine
class SQLiteEngine implements Engine
{
public function __construct(
private readonly Connection $driver,

View File

@@ -7,9 +7,10 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\Ibase;
use Dibi;
use Dibi\Drivers;
use Dibi\Helpers;
use function is_resource;
@@ -25,7 +26,7 @@ use function is_resource;
* - buffers (int) => buffers is the number of database buffers to allocate for the server-side cache. If 0 or omitted, server chooses its own default.
* - resource (resource) => existing connection resource
*/
class FirebirdDriver implements Connection
class Connection implements Drivers\Connection
{
public const ErrorExceptionThrown = -836;
@@ -200,9 +201,9 @@ class FirebirdDriver implements Connection
/**
* Returns the connection reflector.
*/
public function getReflector(): Engine
public function getReflector(): Drivers\Engine
{
return new FirebirdReflector($this);
return new Drivers\Engines\FirebirdEngine($this);
}
@@ -210,9 +211,9 @@ class FirebirdDriver implements Connection
* Result set driver factory.
* @param resource $resource
*/
public function createResultDriver($resource): FirebirdResult
public function createResultDriver($resource): Result
{
return new FirebirdResult($resource);
return new Result($resource);
}

View File

@@ -7,9 +7,10 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\Ibase;
use Dibi;
use Dibi\Drivers;
use Dibi\Helpers;
use function is_resource;
@@ -17,7 +18,7 @@ use function is_resource;
/**
* The driver for Firebird/InterBase result set.
*/
class FirebirdResult implements Result
class Result implements Drivers\Result
{
public function __construct(
/** @var resource */
@@ -46,7 +47,7 @@ class FirebirdResult implements Result
: @ibase_fetch_row($this->resultSet, IBASE_TEXT); // intentionally @
if (ibase_errcode()) {
if (ibase_errcode() === FirebirdDriver::ERROR_EXCEPTION_THROWN) {
if (ibase_errcode() === Connection::ERROR_EXCEPTION_THROWN) {
preg_match('/exception (\d+) (\w+) (.*)/is', ibase_errmsg(), $match);
throw new Dibi\ProcedureException($match[3], $match[1], $match[2]);

View File

@@ -7,9 +7,10 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\MySQLi;
use Dibi;
use Dibi\Drivers;
use function in_array;
use const MYSQLI_REPORT_OFF, MYSQLI_STORE_RESULT, MYSQLI_USE_RESULT, PREG_SET_ORDER;
@@ -32,7 +33,7 @@ use const MYSQLI_REPORT_OFF, MYSQLI_STORE_RESULT, MYSQLI_USE_RESULT, PREG_SET_OR
* - sqlmode => see http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html
* - resource (mysqli) => existing connection resource
*/
class MySqliDriver implements Connection
class Connection implements Drivers\Connection
{
public const ErrorAccessDenied = 1045;
public const ErrorDuplicateEntry = 1062;
@@ -265,18 +266,18 @@ class MySqliDriver implements Connection
/**
* Returns the connection reflector.
*/
public function getReflector(): Engine
public function getReflector(): Drivers\Engine
{
return new MySqlReflector($this);
return new Drivers\Engines\MySQLEngine($this);
}
/**
* Result set driver factory.
*/
public function createResultDriver(\mysqli_result $result): MySqliResult
public function createResultDriver(\mysqli_result $result): Result
{
return new MySqliResult($result, $this->buffered);
return new Result($result, $this->buffered);
}

View File

@@ -7,16 +7,17 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\MySQLi;
use Dibi;
use Dibi\Drivers;
use const MYSQLI_TYPE_LONG, MYSQLI_TYPE_SHORT, MYSQLI_TYPE_TIME, MYSQLI_TYPE_TINY;
/**
* The driver for MySQL result set.
*/
class MySqliResult implements Result
class Result implements Drivers\Result
{
public function __construct(
private readonly \mysqli_result $resultSet,

View File

@@ -7,9 +7,10 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\OCI8;
use Dibi;
use Dibi\Drivers;
use function in_array, is_resource;
@@ -26,7 +27,7 @@ use function in_array, is_resource;
* - resource (resource) => existing connection resource
* - persistent => Creates persistent connections with oci_pconnect instead of oci_new_connect
*/
class OracleDriver implements Connection
class Connection implements Drivers\Connection
{
/** @var resource */
private $connection;
@@ -190,9 +191,9 @@ class OracleDriver implements Connection
/**
* Returns the connection reflector.
*/
public function getReflector(): Engine
public function getReflector(): Drivers\Engine
{
return new OracleReflector($this);
return new Drivers\Engines\OracleEngine($this);
}
@@ -200,9 +201,9 @@ class OracleDriver implements Connection
* Result set driver factory.
* @param resource $resource
*/
public function createResultDriver($resource): OracleResult
public function createResultDriver($resource): Result
{
return new OracleResult($resource);
return new Result($resource);
}

View File

@@ -7,16 +7,17 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\OCI8;
use Dibi;
use Dibi\Drivers;
use function is_resource;
/**
* The driver for Oracle result set.
*/
class OracleResult implements Result
class Result implements Drivers\Result
{
public function __construct(
/** @var resource */

View File

@@ -7,9 +7,10 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\ODBC;
use Dibi;
use Dibi\Drivers;
use function is_resource;
@@ -24,7 +25,7 @@ use function is_resource;
* - resource (resource) => existing connection resource
* - microseconds (bool) => use microseconds in datetime format?
*/
class OdbcDriver implements Connection
class Connection implements Drivers\Connection
{
/** @var resource */
private $connection;
@@ -176,9 +177,9 @@ class OdbcDriver implements Connection
/**
* Returns the connection reflector.
*/
public function getReflector(): Engine
public function getReflector(): Drivers\Engine
{
return new OdbcReflector($this);
return new Drivers\Engines\ODBCEngine($this);
}
@@ -186,9 +187,9 @@ class OdbcDriver implements Connection
* Result set driver factory.
* @param resource $resource
*/
public function createResultDriver($resource): OdbcResult
public function createResultDriver($resource): Result
{
return new OdbcResult($resource);
return new Result($resource);
}

View File

@@ -7,16 +7,17 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\ODBC;
use Dibi;
use Dibi\Drivers;
use function is_resource;
/**
* The driver interacting with result set via ODBC connections.
*/
class OdbcResult implements Result
class Result implements Drivers\Result
{
private int $row = 0;

View File

@@ -7,9 +7,11 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\PDO;
use Dibi;
use Dibi\Drivers;
use Dibi\Drivers\Engines;
use Dibi\Helpers;
use PDO;
use function sprintf;
@@ -25,7 +27,7 @@ use function sprintf;
* - options (array) => driver specific options {@see PDO::__construct}
* - resource (PDO) => existing connection
*/
class PdoDriver implements Connection
class Connection implements Drivers\Connection
{
private ?PDO $connection;
private ?int $affectedRows;
@@ -94,10 +96,10 @@ class PdoDriver implements Connection
$code ??= 0;
$message = "SQLSTATE[$sqlState]: $message";
throw match ($this->driverName) {
'mysql' => MySqliDriver::createException($message, $code, $sql),
'oci' => OracleDriver::createException($message, $code, $sql),
'pgsql' => PostgreDriver::createException($message, $sqlState, $sql),
'sqlite' => SqliteDriver::createException($message, $code, $sql),
'mysql' => Drivers\MySQLi\Connection::createException($message, $code, $sql),
'oci' => Drivers\OCI8\Connection::createException($message, $code, $sql),
'pgsql' => Drivers\PgSQL\Connection::createException($message, $sqlState, $sql),
'sqlite' => Drivers\SQLite3\Connection::createException($message, $code, $sql),
default => new Dibi\DriverException($message, $code, $sql),
};
}
@@ -172,14 +174,14 @@ class PdoDriver implements Connection
/**
* Returns the connection reflector.
*/
public function getReflector(): Engine
public function getReflector(): Drivers\Engine
{
return match ($this->driverName) {
'mysql' => new MySqlReflector($this),
'oci' => new OracleReflector($this),
'pgsql' => new PostgreReflector($this),
'sqlite' => new SqliteReflector($this),
'mssql', 'dblib', 'sqlsrv' => new SqlsrvReflector($this),
'mysql' => new Engines\MySQLEngine($this),
'oci' => new Engines\OracleEngine($this),
'pgsql' => new Engines\PostgreSQLEngine($this),
'sqlite' => new Engines\SQLiteEngine($this),
'mssql', 'dblib', 'sqlsrv' => new Engines\SQLServerEngine($this),
default => throw new Dibi\NotSupportedException,
};
}
@@ -188,9 +190,9 @@ class PdoDriver implements Connection
/**
* Result set driver factory.
*/
public function createResultDriver(\PDOStatement $result): PdoResult
public function createResultDriver(\PDOStatement $result): Result
{
return new PdoResult($result, $this->driverName);
return new Result($result, $this->driverName);
}

View File

@@ -7,9 +7,10 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\PDO;
use Dibi;
use Dibi\Drivers;
use Dibi\Helpers;
use PDO;
@@ -17,7 +18,7 @@ use PDO;
/**
* The driver for PDO result set.
*/
class PdoResult implements Result
class Result implements Drivers\Result
{
public function __construct(
private ?\PDOStatement $resultSet,

View File

@@ -7,9 +7,10 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\PgSQL;
use Dibi;
use Dibi\Drivers;
use Dibi\Helpers;
use PgSql;
use function in_array, is_array, is_resource, strlen;
@@ -27,7 +28,7 @@ use function in_array, is_array, is_resource, strlen;
* - resource (PgSql\Connection) => existing connection resource
* - connect_type (int) => see pg_connect()
*/
class PostgreDriver implements Connection
class Connection implements Drivers\Connection
{
private PgSql\Connection $connection;
private ?int $affectedRows;
@@ -232,18 +233,18 @@ class PostgreDriver implements Connection
/**
* Returns the connection reflector.
*/
public function getReflector(): Engine
public function getReflector(): Drivers\Engine
{
return new PostgreReflector($this);
return new Drivers\Engines\PostgreSQLEngine($this);
}
/**
* Result set driver factory.
*/
public function createResultDriver(PgSql\Result $resource): PostgreResult
public function createResultDriver(PgSql\Result $resource): Result
{
return new PostgreResult($resource);
return new Result($resource);
}

View File

@@ -7,8 +7,9 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\PgSQL;
use Dibi\Drivers;
use Dibi\Helpers;
use PgSql;
use function is_resource;
@@ -17,7 +18,7 @@ use function is_resource;
/**
* The driver for PostgreSQL result set.
*/
class PostgreResult implements Result
class Result implements Drivers\Result
{
public function __construct(
private readonly PgSql\Result $resultSet,

View File

@@ -7,9 +7,10 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\SQLSrv;
use Dibi;
use Dibi\Drivers;
use Dibi\Helpers;
use function is_resource, sprintf;
@@ -26,7 +27,7 @@ use function is_resource, sprintf;
* - charset => character encoding to set (default is UTF-8)
* - resource (resource) => existing connection resource
*/
class SqlsrvDriver implements Connection
class Connection implements Drivers\Connection
{
/** @var resource */
private $connection;
@@ -171,9 +172,9 @@ class SqlsrvDriver implements Connection
/**
* Returns the connection reflector.
*/
public function getReflector(): Engine
public function getReflector(): Drivers\Engine
{
return new SqlsrvReflector($this);
return new Drivers\Engines\SQLServerEngine($this);
}
@@ -181,9 +182,9 @@ class SqlsrvDriver implements Connection
* Result set driver factory.
* @param resource $resource
*/
public function createResultDriver($resource): SqlsrvResult
public function createResultDriver($resource): Result
{
return new SqlsrvResult($resource);
return new Result($resource);
}

View File

@@ -7,16 +7,17 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\SQLSrv;
use Dibi;
use Dibi\Drivers;
use function is_resource;
/**
* The driver for Microsoft SQL Server and SQL Azure result set.
*/
class SqlsrvResult implements Result
class Result implements Drivers\Result
{
public function __construct(
/** @var resource */

View File

@@ -7,9 +7,10 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\SQLite3;
use Dibi;
use Dibi\Drivers;
use Dibi\Helpers;
use SQLite3;
@@ -23,7 +24,7 @@ use SQLite3;
* - formatDateTime => how to format datetime in SQL (@see date)
* - resource (SQLite3) => existing connection resource
*/
class SqliteDriver implements Connection
class Connection implements Drivers\Connection
{
private SQLite3 $connection;
private string $fmtDate;
@@ -174,18 +175,18 @@ class SqliteDriver implements Connection
/**
* Returns the connection reflector.
*/
public function getReflector(): Engine
public function getReflector(): Drivers\Engine
{
return new SqliteReflector($this);
return new Drivers\Engines\SQLiteEngine($this);
}
/**
* Result set driver factory.
*/
public function createResultDriver(\SQLite3Result $result): SqliteResult
public function createResultDriver(\SQLite3Result $result): Result
{
return new SqliteResult($result);
return new Result($result);
}

View File

@@ -7,9 +7,10 @@
declare(strict_types=1);
namespace Dibi\Drivers;
namespace Dibi\Drivers\SQLite3;
use Dibi;
use Dibi\Drivers;
use Dibi\Helpers;
use const SQLITE3_ASSOC, SQLITE3_BLOB, SQLITE3_FLOAT, SQLITE3_INTEGER, SQLITE3_NULL, SQLITE3_NUM, SQLITE3_TEXT;
@@ -17,7 +18,7 @@ use const SQLITE3_ASSOC, SQLITE3_BLOB, SQLITE3_FLOAT, SQLITE3_INTEGER, SQLITE3_N
/**
* The driver for SQLite result set.
*/
class SqliteResult implements Result
class Result implements Drivers\Result
{
public function __construct(
private readonly \SQLite3Result $resultSet,

View File

@@ -1,18 +0,0 @@
<?php
/**
* This file is part of the Dibi, smart database abstraction layer (https://dibiphp.com)
* Copyright (c) 2005 David Grudl (https://davidgrudl.com)
*/
declare(strict_types=1);
namespace Dibi\Drivers;
/**
* Alias for SqliteDriver driver.
*/
class Sqlite3Driver extends SqliteDriver
{
}

View File

@@ -1,18 +0,0 @@
<?php
/**
* This file is part of the Dibi, smart database abstraction layer (https://dibiphp.com)
* Copyright (c) 2005 David Grudl (https://davidgrudl.com)
*/
declare(strict_types=1);
namespace Dibi\Drivers;
/**
* Alias for SqliteResult driver.
*/
class Sqlite3Result extends SqliteResult
{
}

View File

@@ -2,12 +2,14 @@
declare(strict_types=1);
use Dibi\Drivers\SQLSrv\Connection;
use Dibi\Drivers\SQLSrv\Result;
use Tester\Assert;
require __DIR__ . '/bootstrap.php';
class MockDriver extends Dibi\Drivers\SqlsrvDriver
class MockDriver extends Connection
{
public function __construct()
{
@@ -19,14 +21,14 @@ class MockDriver extends Dibi\Drivers\SqlsrvDriver
}
public function query(string $sql): ?Dibi\Drivers\Result
public function query(string $sql): ?Result
{
return new MockResult;
}
}
class MockResult extends Dibi\Drivers\SqlsrvResult
class MockResult extends Result
{
public function __construct()
{

View File

@@ -14,7 +14,7 @@ function buildPdoDriver(?int $errorMode)
$pdo->setAttribute(PDO::ATTR_ERRMODE, $errorMode);
}
new Dibi\Drivers\PdoDriver(['resource' => $pdo]);
new Dibi\Drivers\PDO\Connection(['resource' => $pdo]);
}