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 19, 2024
1 parent 8a20c98 commit 5459204
Show file tree
Hide file tree
Showing 18 changed files with 164 additions and 82 deletions.
3 changes: 1 addition & 2 deletions src/Database/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,7 @@ public function connect(): void
throw ConnectionException::from($e);
}

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

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);
}
}
32 changes: 30 additions & 2 deletions src/Database/Drivers/PDO/MySQL/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,38 @@
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;
}
}
22 changes: 20 additions & 2 deletions src/Database/Drivers/PDO/OCI/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,26 @@ 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);
}
}
22 changes: 20 additions & 2 deletions src/Database/Drivers/PDO/SQLSrv/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,26 @@ class Driver implements Drivers\Driver
private const EngineClass = Drivers\Engines\SQLServerEngine::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;
}
}
22 changes: 20 additions & 2 deletions src/Database/Drivers/PDO/SQLite/Driver.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,26 @@ class Driver implements Drivers\Driver
private const EngineClass = Drivers\Engines\SQLiteEngine::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;
}
}
2 changes: 1 addition & 1 deletion src/Database/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,6 @@ public function createDriverFromDsn(
}
}

return new $class;
return new $class(['dsn' => $dsn, 'username' => $username, 'password' => $password, 'options' => $options]);
}
}

0 comments on commit 5459204

Please sign in to comment.