@@ -32,12 +32,10 @@ class Connection
3232
3333 private array $ options ;
3434
35- private Driver $ driver ;
35+ private ? Driver $ driver = null ;
3636
3737 private SqlPreprocessor $ preprocessor ;
3838
39- private ?PDO $ pdo = null ;
40-
4139 /** @var callable(array, ResultSet): array */
4240 private $ rowNormalizer = [Helpers::class, 'normalizeRow ' ];
4341
@@ -59,23 +57,20 @@ public function __construct(string $dsn, string $user = null, string $password =
5957
6058 public function connect (): void
6159 {
62- if ($ this ->pdo ) {
60+ if ($ this ->driver ) {
6361 return ;
6462 }
65-
66- try {
67- $ this ->pdo = new PDO ($ this ->params [0 ], $ this ->params [1 ], $ this ->params [2 ], $ this ->options );
68- $ this ->pdo ->setAttribute (PDO ::ATTR_ERRMODE , PDO ::ERRMODE_EXCEPTION );
69- } catch (PDOException $ e ) {
70- throw ConnectionException::from ($ e );
71- }
72-
63+ $ dsn = explode (': ' , $ this ->params [0 ])[0 ];
7364 $ class = empty ($ this ->options ['driverClass ' ])
74- ? 'Nette\Database\Drivers \\' . ucfirst (str_replace ('sql ' , 'Sql ' , $ this -> pdo -> getAttribute ( PDO :: ATTR_DRIVER_NAME ) )) . 'Driver '
65+ ? 'Nette\Database\Drivers \\' . ucfirst (str_replace ('sql ' , 'Sql ' , $ dsn )) . 'Driver '
7566 : $ this ->options ['driverClass ' ];
76- $ this ->driver = new $ class ;
67+ if (!class_exists ($ class )) {
68+ throw new ConnectionException ("Invalid data source ' $ dsn'. " );
69+ }
70+
71+ $ this ->driver = new $ class ($ this );
72+ $ this ->driver ->connect ($ this ->params [0 ], $ this ->params [1 ], $ this ->params [2 ], $ this ->options );
7773 $ this ->preprocessor = new SqlPreprocessor ($ this );
78- $ this ->driver ->initialize ($ this , $ this ->options );
7974 Arrays::invoke ($ this ->onConnect , $ this );
8075 }
8176
@@ -89,7 +84,7 @@ public function reconnect(): void
8984
9085 public function disconnect (): void
9186 {
92- $ this ->pdo = null ;
87+ $ this ->driver = null ;
9388 }
9489
9590
@@ -99,10 +94,11 @@ public function getDsn(): string
9994 }
10095
10196
97+ /** deprecated use getDriver()->getPDO() */
10298 public function getPdo (): PDO
10399 {
104100 $ this ->connect ();
105- return $ this ->pdo ;
101+ return $ this ->driver -> getPDO () ;
106102 }
107103
108104
0 commit comments