Skip to content

Commit

Permalink
connection & engines are created by Driver
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Aug 29, 2024
1 parent 434a8ed commit c29c178
Show file tree
Hide file tree
Showing 19 changed files with 172 additions and 90 deletions.
12 changes: 4 additions & 8 deletions src/Database/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,11 @@ public function connect(): void
}

try {
$this->pdo = new PDO($this->dsn, $this->user, $this->password, $this->options);
$this->pdo = $this->driver->connect();
} catch (PDOException $e) {
throw ConnectionException::from($e);
}

$this->engine = $this->driver->createDatabaseEngine();
$this->engine->initialize($this, $this->options);
Arrays::invoke($this->onConnect, $this);
}

Expand Down Expand Up @@ -105,15 +103,13 @@ public function getPdo(): PDO
public function getSupplementalDriver(): Drivers\Engine
{
trigger_error(__METHOD__ . '() is deprecated, use getDriver()', E_USER_DEPRECATED);
$this->connect();
return $this->engine;
return $this->getDatabaseEngine();
}


public function getDatabaseEngine(): Drivers\Engine
{
$this->connect();
return $this->engine;
return $this->engine ??= $this->driver->createDatabaseEngine($this);
}


Expand All @@ -136,7 +132,7 @@ public function getInsertId(?string $sequence = null): string
$res = $this->getPdo()->lastInsertId($sequence);
return $res === false ? '0' : $res;
} catch (PDOException $e) {
throw $this->engine->convertException($e);
throw $this->getDatabaseEngine()->convertException($e);
}
}

Expand Down
4 changes: 3 additions & 1 deletion src/Database/Drivers/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,7 @@
*/
interface Driver
{
function createDatabaseEngine(): Engine;
function connect();

function createDatabaseEngine($connection): Engine;
}
5 changes: 0 additions & 5 deletions src/Database/Drivers/Engine.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,6 @@ interface Engine
SupportSubselect = 'subselect',
SupportSchema = 'schema';

/**
* Initializes connection.
*/
function initialize(Database\Connection $connection, array $options): void;

/**
* Converts PDOException to DriverException or its descendant.
*/
Expand Down
9 changes: 3 additions & 6 deletions src/Database/Drivers/Engines/MSSQLEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,9 @@
*/
class MSSQLEngine implements Engine
{
private Nette\Database\Connection $connection;


public function initialize(Nette\Database\Connection $connection, array $options): void
{
$this->connection = $connection;
public function __construct(
private readonly Nette\Database\Connection $connection,
) {
}


Expand Down
25 changes: 4 additions & 21 deletions src/Database/Drivers/Engines/MySQLEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,29 +18,12 @@
*/
class MySQLEngine implements Engine
{
private Nette\Database\Connection $connection;
private bool $convertBoolean;
public bool $convertBoolean = true;


/**
* Driver options:
* - charset => character encoding to set (default is utf8mb4)
* - sqlmode => see http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html
* - convertBoolean => converts INT(1) to boolean
*/
public function initialize(Nette\Database\Connection $connection, array $options): void
{
$this->connection = $connection;
$charset = $options['charset'] ?? 'utf8mb4';
if ($charset) {
$connection->query('SET NAMES ?', $charset);
}

if (isset($options['sqlmode'])) {
$connection->query('SET sql_mode=?', $options['sqlmode']);
}

$this->convertBoolean = (bool) ($options['convertBoolean'] ?? true);
public function __construct(
private readonly Nette\Database\Connection $connection,
) {
}


Expand Down
5 changes: 0 additions & 5 deletions src/Database/Drivers/Engines/ODBCEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,6 @@
*/
class ODBCEngine implements Engine
{
public function initialize(Nette\Database\Connection $connection, array $options): void
{
}


public function convertException(\PDOException $e): Nette\Database\DriverException
{
return Nette\Database\DriverException::from($e);
Expand Down
12 changes: 5 additions & 7 deletions src/Database/Drivers/Engines/OracleEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,12 @@
*/
class OracleEngine implements Engine
{
private Nette\Database\Connection $connection;
private string $fmtDateTime;
public string $formatDateTime = 'U';


public function initialize(Nette\Database\Connection $connection, array $options): void
{
$this->connection = $connection;
$this->fmtDateTime = $options['formatDateTime'] ?? 'U';
public function __construct(
private readonly Nette\Database\Connection $connection,
) {
}


Expand Down Expand Up @@ -59,7 +57,7 @@ public function delimite(string $name): string

public function formatDateTime(\DateTimeInterface $value): string
{
return $value->format($this->fmtDateTime);
return $value->format($this->formatDateTime);
}


Expand Down
9 changes: 3 additions & 6 deletions src/Database/Drivers/Engines/PostgreSQLEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,9 @@
*/
class PostgreSQLEngine implements Engine
{
private Nette\Database\Connection $connection;


public function initialize(Nette\Database\Connection $connection, array $options): void
{
$this->connection = $connection;
public function __construct(
private readonly Nette\Database\Connection $connection,
) {
}


Expand Down
9 changes: 3 additions & 6 deletions src/Database/Drivers/Engines/SQLServerEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,9 @@
*/
class SQLServerEngine implements Engine
{
private Nette\Database\Connection $connection;


public function initialize(Nette\Database\Connection $connection, array $options): void
{
$this->connection = $connection;
public function __construct(
private readonly Nette\Database\Connection $connection,
) {
}


Expand Down
14 changes: 6 additions & 8 deletions src/Database/Drivers/Engines/SQLiteEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,12 @@
*/
class SQLiteEngine implements Engine
{
private Nette\Database\Connection $connection;
private string $fmtDateTime;
public string $formatDateTime = 'U';


public function initialize(Nette\Database\Connection $connection, array $options): void
{
$this->connection = $connection;
$this->fmtDateTime = $options['formatDateTime'] ?? 'U';
public function __construct(
private readonly Nette\Database\Connection $connection,
) {
}


Expand Down Expand Up @@ -72,7 +70,7 @@ public function delimite(string $name): string

public function formatDateTime(\DateTimeInterface $value): string
{
return $value->format($this->fmtDateTime);
return $value->format($this->formatDateTime);
}


Expand Down Expand Up @@ -235,7 +233,7 @@ public function getColumnTypes(\PDOStatement $statement): array
for ($col = 0; $col < $count; $col++) {
$meta = $statement->getColumnMeta($col);
if (isset($meta['sqlite:decl_type'])) {
$types[$meta['name']] = $this->fmtDateTime === 'U' && in_array($meta['sqlite:decl_type'], ['DATE', 'DATETIME'], strict: true)
$types[$meta['name']] = $this->formatDateTime === 'U' && in_array($meta['sqlite:decl_type'], ['DATE', 'DATETIME'], strict: true)
? Nette\Database\IStructure::FIELD_UNIX_TIMESTAMP
: Nette\Database\Helpers::detectType($meta['sqlite:decl_type']);
} elseif (isset($meta['native_type'])) {
Expand Down
17 changes: 15 additions & 2 deletions src/Database/Drivers/PDO/MSSQL/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,21 @@ class Driver implements Drivers\Driver
private const EngineClass = Drivers\Engines\MSSQLEngine::class;


public function createDatabaseEngine(): Drivers\Engine
public function __construct(
#[\SensitiveParameter]
private readonly array $params,
) {
}


public function connect()
{
return new \PDO(...$this->params);
}


public function createDatabaseEngine($connection): Drivers\Engine
{
return new (self::EngineClass);
return new (self::EngineClass)($connection);
}
}
36 changes: 34 additions & 2 deletions src/Database/Drivers/PDO/MySQL/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,46 @@

/**
* PDO MySQL database driver.
* Options:
* - charset => character encoding to set (default is utf8 or utf8mb4 since MySQL 5.5.3)
* - sqlmode => see http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html
* - convertBoolean => converts INT(1) to boolean
*/
class Driver implements Drivers\Driver
{
private const EngineClass = Drivers\Engines\MySQLEngine::class;
private const DefaultCharset = 'utf8mb4';


public function createDatabaseEngine(): Drivers\Engine
public function __construct(
#[\SensitiveParameter]
private readonly array $params,
) {
}


public function connect()
{
$connection = new \PDO(...$this->params);
$options = $this->params['options'];
if ($charset = $options['charset'] ?? self::DefaultCharset) {
$connection->query('SET NAMES ' . $connection->quote($charset));
}

if (isset($options['sqlmode'])) {
$connection->query('SET sql_mode=' . $connection->quote($options['sqlmode']));
}
return $connection;
}


public function createDatabaseEngine($connection): Drivers\Engine
{
return new (self::EngineClass)();
$engine = new (self::EngineClass)($connection);
$options = $this->params['options'];
if (isset($options['convertBoolean'])) {
$engine->convertBoolean = (bool) $options['convertBoolean'];
}
return $engine;
}
}
24 changes: 22 additions & 2 deletions src/Database/Drivers/PDO/OCI/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,34 @@

/**
* PDO Oracle database driver.
* Options:
* - formatDateTime => the format in which the date is stored in the database
*/
class Driver implements Drivers\Driver
{
private const EngineClass = Drivers\Engines\OracleEngine::class;


public function createDatabaseEngine(): Drivers\Engine
public function __construct(
#[\SensitiveParameter]
private readonly array $params,
) {
}


public function connect()
{
return new \PDO(...$this->params);
}


public function createDatabaseEngine($connection): Drivers\Engine
{
return new (self::EngineClass)();
$engine = new (self::EngineClass)($connection);
$options = $this->params['options'];
if (isset($options['formatDateTime'])) {
$engine->formatDateTime = $options['formatDateTime'];
}
return $engine;
}
}
17 changes: 15 additions & 2 deletions src/Database/Drivers/PDO/ODBC/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,21 @@ class Driver implements Drivers\Driver
private const EngineClass = Drivers\Engines\ODBCEngine::class;


public function createDatabaseEngine(): Drivers\Engine
public function __construct(
#[\SensitiveParameter]
private readonly array $params,
) {
}


public function connect()
{
return new \PDO(...$this->params);
}


public function createDatabaseEngine($connection): Drivers\Engine
{
return new (self::EngineClass)();
return new (self::EngineClass)($connection);
}
}
17 changes: 15 additions & 2 deletions src/Database/Drivers/PDO/PgSQL/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,21 @@ class Driver implements Drivers\Driver
private const EngineClass = Drivers\Engines\PostgreSQLEngine::class;


public function createDatabaseEngine(): Drivers\Engine
public function __construct(
#[\SensitiveParameter]
private readonly array $params,
) {
}


public function connect()
{
return new \PDO(...$this->params);
}


public function createDatabaseEngine($connection): Drivers\Engine
{
return new (self::EngineClass)();
return new (self::EngineClass)($connection);
}
}
Loading

0 comments on commit c29c178

Please sign in to comment.