Skip to content

Commit

Permalink
database connection moved to PdoDriver::connect()
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Apr 21, 2024
1 parent 4d8a121 commit 45298a5
Show file tree
Hide file tree
Showing 10 changed files with 76 additions and 54 deletions.
26 changes: 12 additions & 14 deletions src/Database/Connection.php
Expand Up @@ -25,9 +25,8 @@ class Connection

/** @var array<callable(self, ResultSet|DriverException): void> Occurs after query is executed */
public array $onQuery = [];
private Driver $driver;
private ?Driver $driver = null;
private SqlPreprocessor $preprocessor;
private ?PDO $pdo = null;

/** @var callable(array, ResultSet): array */
private $rowNormalizer;
Expand All @@ -53,23 +52,21 @@ public function __construct(

public function connect(): void
{
if ($this->pdo) {
if ($this->driver) {
return;
}

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

$dsn = explode(':', $this->dsn)[0];
$class = empty($this->options['driverClass'])
? 'Nette\Database\Drivers\\' . ucfirst(str_replace('sql', 'Sql', $this->pdo->getAttribute(PDO::ATTR_DRIVER_NAME))) . 'Driver'
? 'Nette\Database\Drivers\\' . ucfirst(str_replace('sql', 'Sql', $dsn)) . 'Driver'
: $this->options['driverClass'];
if (!class_exists($class)) {
throw new ConnectionException("Invalid data source '$dsn'.");
}

$this->driver = new $class;
$this->driver->connect($this->dsn, $this->user, $this->password, $this->options);
$this->preprocessor = new SqlPreprocessor($this);
$this->driver->initialize($this, $this->options);
Arrays::invoke($this->onConnect, $this);
}

Expand All @@ -83,7 +80,7 @@ public function reconnect(): void

public function disconnect(): void
{
$this->pdo = null;
$this->driver = null;
}


Expand All @@ -93,10 +90,11 @@ public function getDsn(): string
}


/** deprecated use getDriver()->getPdo() */
public function getPdo(): PDO
{
$this->connect();
return $this->pdo;
return $this->driver->getPdo();
}


Expand Down
3 changes: 2 additions & 1 deletion src/Database/Driver.php
Expand Up @@ -25,8 +25,9 @@ interface Driver

/**
* Initializes connection.
* @throws ConnectionException
*/
function initialize(Connection $connection, array $options): void;
function connect(string $dsn, ?string $user = null, ?string $password = null, ?array $options = null): void;

/**
* Converts PDOException to DriverException or its descendant.
Expand Down
9 changes: 0 additions & 9 deletions src/Database/Drivers/MsSqlDriver.php
Expand Up @@ -17,15 +17,6 @@
*/
class MsSqlDriver extends PdoDriver
{
private Nette\Database\Connection $connection;


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


public function convertException(\PDOException $e): Nette\Database\DriverException
{
return Nette\Database\DriverException::from($e);
Expand Down
17 changes: 11 additions & 6 deletions src/Database/Drivers/MySqlDriver.php
Expand Up @@ -22,7 +22,6 @@ class MySqlDriver extends PdoDriver
ERROR_DUPLICATE_ENTRY = 1062,
ERROR_DATA_TRUNCATED = 1265;

private Nette\Database\Connection $connection;
private bool $supportBooleans;


Expand All @@ -32,17 +31,23 @@ class MySqlDriver extends PdoDriver
* - sqlmode => see http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html
* - supportBooleans => converts INT(1) to boolean
*/
public function initialize(Nette\Database\Connection $connection, array $options): void
public function connect(
string $dsn,
?string $user = null,
#[\SensitiveParameter]
?string $password = null,
?array $options = null,
): void
{
$this->connection = $connection;
parent::connect($dsn, $user, $password, $options);
$charset = $options['charset']
?? (version_compare($connection->getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION), '5.5.3', '>=') ? 'utf8mb4' : 'utf8');
?? (version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '5.5.3', '>=') ? 'utf8mb4' : 'utf8');
if ($charset) {
$connection->query('SET NAMES ?', $charset);
$this->pdo->query('SET NAMES ' . $this->pdo->quote($charset));
}

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

$this->supportBooleans = (bool) ($options['supportBooleans'] ?? false);
Expand Down
11 changes: 8 additions & 3 deletions src/Database/Drivers/OciDriver.php
Expand Up @@ -17,13 +17,18 @@
*/
class OciDriver extends PdoDriver
{
private Nette\Database\Connection $connection;
private string $fmtDateTime;


public function initialize(Nette\Database\Connection $connection, array $options): void
public function connect(
string $dsn,
?string $user = null,
#[\SensitiveParameter]
?string $password = null,
?array $options = null,
): void
{
$this->connection = $connection;
parent::connect($dsn, $user, $password, $options);
$this->fmtDateTime = $options['formatDateTime'] ?? 'U';
}

Expand Down
5 changes: 0 additions & 5 deletions src/Database/Drivers/OdbcDriver.php
Expand Up @@ -17,11 +17,6 @@
*/
class OdbcDriver extends PdoDriver
{
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
26 changes: 26 additions & 0 deletions src/Database/Drivers/PdoDriver.php
Expand Up @@ -10,11 +10,37 @@
namespace Nette\Database\Drivers;

use Nette;
use PDO;
use PDOException;


/**
* PDO-based driver.
*/
abstract class PdoDriver implements Nette\Database\Driver
{
protected ?PDO $pdo = null;


public function connect(
string $dsn,
?string $user = null,
#[\SensitiveParameter]
?string $password = null,
?array $options = null,
): void
{
try {
$this->pdo = new PDO($dsn, $user, $password, $options);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
throw Nette\Database\ConnectionException::from($e);
}
}


public function getPdo(): ?PDO
{
return $this->pdo;
}
}
9 changes: 0 additions & 9 deletions src/Database/Drivers/PgSqlDriver.php
Expand Up @@ -17,15 +17,6 @@
*/
class PgSqlDriver extends PdoDriver
{
private Nette\Database\Connection $connection;


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


public function convertException(\PDOException $e): Nette\Database\DriverException
{
$code = $e->errorInfo[0] ?? null;
Expand Down
11 changes: 8 additions & 3 deletions src/Database/Drivers/SqliteDriver.php
Expand Up @@ -17,13 +17,18 @@
*/
class SqliteDriver extends PdoDriver
{
private Nette\Database\Connection $connection;
private string $fmtDateTime;


public function initialize(Nette\Database\Connection $connection, array $options): void
public function connect(
string $dsn,
?string $user = null,
#[\SensitiveParameter]
?string $password = null,
?array $options = null,
): void
{
$this->connection = $connection;
parent::connect($dsn, $user, $password, $options);
$this->fmtDateTime = $options['formatDateTime'] ?? 'U';
}

Expand Down
13 changes: 9 additions & 4 deletions src/Database/Drivers/SqlsrvDriver.php
Expand Up @@ -17,14 +17,19 @@
*/
class SqlsrvDriver extends PdoDriver
{
private Nette\Database\Connection $connection;
private string $version;


public function initialize(Nette\Database\Connection $connection, array $options): void
public function connect(
string $dsn,
?string $user = null,
#[\SensitiveParameter]
?string $password = null,
?array $options = null,
): void
{
$this->connection = $connection;
$this->version = $connection->getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION);
parent::connect($dsn, $user, $password, $options);
$this->version = $this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION);
}


Expand Down

0 comments on commit 45298a5

Please sign in to comment.