1111
1212use JetBrains \PhpStorm \Language ;
1313use Nette \Utils \Arrays ;
14- use Nette \Utils \DateTime ;
1514use PDOException ;
1615use function func_get_args , str_replace , ucfirst ;
1716
@@ -30,6 +29,7 @@ class Connection
3029 'pdo-sqlite ' => Drivers \PDO \SQLite \Driver::class,
3130 'pdo-sqlsrv ' => Drivers \PDO \SQLSrv \Driver::class,
3231 ];
32+ private const TypeConverterOptions = ['convertBoolean ' , 'newDateTime ' ];
3333
3434 /** @var array<callable(self): void> Occurs after connection is established */
3535 public array $ onConnect = [];
@@ -40,6 +40,7 @@ class Connection
4040 private ?Drivers \Connection $ connection = null ;
4141 private Drivers \Engine $ engine ;
4242 private SqlPreprocessor $ preprocessor ;
43+ private TypeConverter $ typeConverter ;
4344
4445 /** @var ?\Closure(array<string, mixed>, Result): array<string, mixed> */
4546 private ?\Closure $ rowNormalizer ;
@@ -54,23 +55,22 @@ public function __construct(
5455 ?string $ password = null ,
5556 array $ options = [],
5657 ) {
57- $ this ->rowNormalizer = ($ options ['newDateTime ' ] ?? null ) === false
58- ? fn (array $ row , ResultSet $ resultSet ): array => Helpers::normalizeRow ($ row , $ resultSet , DateTime::class)
59- : Helpers::normalizeRow (...);
60-
6158 $ driver = explode (': ' , $ dsn )[0 ];
6259 $ class = empty ($ options ['driverClass ' ])
6360 ? (self ::Drivers['pdo- ' . $ driver ] ?? throw new \LogicException ("Unknown PDO driver ' $ driver'. " ))
6461 : $ options ['driverClass ' ];
6562 $ args = compact ('dsn ' , 'username ' , 'password ' , 'options ' );
66- unset($ options ['lazy ' ], $ options ['newDateTime ' ], $ options [ ' driverClass ' ]);
63+ unset($ options ['lazy ' ], $ options ['driverClass ' ]);
6764 foreach ($ options as $ key => $ value ) {
6865 if (!is_int ($ key ) && $ value !== null ) {
6966 $ args [$ key ] = $ value ;
7067 unset($ args ['options ' ][$ key ]);
7168 }
7269 }
70+ $ args = array_diff_key ($ args , array_flip (self ::TypeConverterOptions));
7371 $ this ->driver = new $ class (...$ args );
72+ $ this ->typeConverter = new TypeConverter ;
73+ array_map (fn ($ opt ) => isset ($ options [$ opt ]) && ($ this ->typeConverter ->$ opt = (bool ) $ options [$ opt ]), self ::TypeConverterOptions);
7474 }
7575
7676
@@ -159,6 +159,12 @@ public function getReflection(): Reflection
159159 }
160160
161161
162+ public function getTypeConverter (): TypeConverter
163+ {
164+ return $ this ->typeConverter ;
165+ }
166+
167+
162168 /**
163169 * Sets callback for row preprocessing.
164170 */
0 commit comments