Use DBAL Driver middleware to handle the correct connection timezone

I looked into using DBAL events for this but found that DBAL events
are deprecated so I went with middleware as they are recommended
as a replacement for the DBAL events.
[MAILPOET-6142]
This commit is contained in:
Rostislav Wolny
2024-08-13 10:36:13 +02:00
committed by Aschepikov
parent 3ea44e45d4
commit 9f32c59e49
4 changed files with 34 additions and 8 deletions

View File

@@ -2,12 +2,16 @@
namespace MailPoet\Doctrine; namespace MailPoet\Doctrine;
use MailPoet\Doctrine\Middlewares\PostConnectMiddleware;
use MailPoet\Doctrine\Types\BigIntType; use MailPoet\Doctrine\Types\BigIntType;
use MailPoet\Doctrine\Types\DateTimeTzToStringType; use MailPoet\Doctrine\Types\DateTimeTzToStringType;
use MailPoet\Doctrine\Types\JsonOrSerializedType; use MailPoet\Doctrine\Types\JsonOrSerializedType;
use MailPoet\Doctrine\Types\JsonType; use MailPoet\Doctrine\Types\JsonType;
use MailPoet\Doctrine\Types\SerializedArrayType; use MailPoet\Doctrine\Types\SerializedArrayType;
use MailPoet\Doctrine\WPDB\Driver as WPDBDriver; use MailPoet\Doctrine\WPDB\Driver as WPDBDriver;
use MailPoetVendor\Doctrine\DBAL\Configuration;
use MailPoetVendor\Doctrine\DBAL\Driver;
use MailPoetVendor\Doctrine\DBAL\Driver\Middleware;
use MailPoetVendor\Doctrine\DBAL\DriverManager; use MailPoetVendor\Doctrine\DBAL\DriverManager;
use MailPoetVendor\Doctrine\DBAL\Platforms\MySQLPlatform; use MailPoetVendor\Doctrine\DBAL\Platforms\MySQLPlatform;
use MailPoetVendor\Doctrine\DBAL\Types\Type; use MailPoetVendor\Doctrine\DBAL\Types\Type;
@@ -32,7 +36,7 @@ class ConnectionFactory {
]; ];
$this->setupTypes(); $this->setupTypes();
return DriverManager::getConnection($connectionParams); return DriverManager::getConnection($connectionParams, $this->getConfiguration());
} }
private function setupTypes() { private function setupTypes() {
@@ -44,4 +48,15 @@ class ConnectionFactory {
} }
} }
} }
private function getConfiguration(): Configuration {
$config = new Configuration();
$driverMiddleware = new class implements Middleware {
public function wrap(Driver $driver): Driver {
return new PostConnectMiddleware($driver);
}
};
$config->setMiddlewares([$driverMiddleware]);
return $config;
}
} }

View File

@@ -0,0 +1,14 @@
<?php declare(strict_types = 1);
namespace MailPoet\Doctrine\Middlewares;
use MailPoetVendor\Doctrine\DBAL\Driver\Connection;
use MailPoetVendor\Doctrine\DBAL\Driver\Middleware\AbstractDriverMiddleware;
class PostConnectMiddleware extends AbstractDriverMiddleware {
public function connect(array $params): Connection {
$connection = parent::connect($params);
$connection->exec('SET time_zone = "+00:00"');
return $connection;
}
}

View File

@@ -18,11 +18,6 @@ class Connection implements ServerInfoAwareConnection {
if (!$wpdb instanceof wpdb) { if (!$wpdb instanceof wpdb) {
throw new ConnectionException('WPDB is not initialized.'); throw new ConnectionException('WPDB is not initialized.');
} }
/**
* Ensure connection is in UTC timezone.
* We use timestamp columns and we expect to get UTC time
*/
$wpdb->query("SET time_zone = '+00:00'");
} }
public function prepare(string $sql): Statement { public function prepare(string $sql): Statement {

View File

@@ -3,10 +3,11 @@
namespace MailPoet\Test\Config; namespace MailPoet\Test\Config;
use MailPoet\Doctrine\ConnectionFactory; use MailPoet\Doctrine\ConnectionFactory;
use MailPoet\Doctrine\Middlewares\PostConnectMiddleware;
use MailPoet\Doctrine\Types\JsonOrSerializedType; use MailPoet\Doctrine\Types\JsonOrSerializedType;
use MailPoet\Doctrine\Types\JsonType; use MailPoet\Doctrine\Types\JsonType;
use MailPoet\Doctrine\WPDB\Driver as WPDBDriver;
use MailPoetVendor\Doctrine\DBAL\Connection; use MailPoetVendor\Doctrine\DBAL\Connection;
use MailPoetVendor\Doctrine\DBAL\Driver;
use MailPoetVendor\Doctrine\DBAL\Platforms\MySQLPlatform; use MailPoetVendor\Doctrine\DBAL\Platforms\MySQLPlatform;
use MailPoetVendor\Doctrine\DBAL\Types\Type; use MailPoetVendor\Doctrine\DBAL\Types\Type;
@@ -16,7 +17,8 @@ class ConnectionFactoryTest extends \MailPoetTest {
$connection = $connectionFactory->createConnection(); $connection = $connectionFactory->createConnection();
verify($connection)->instanceOf(Connection::class); verify($connection)->instanceOf(Connection::class);
verify($connection->getDriver())->instanceOf(WPDBDriver::class); verify($connection->getDriver())->instanceOf(Driver::class);
verify($connection->getDriver())->instanceOf(PostConnectMiddleware::class);
verify($connection->getDatabasePlatform())->instanceOf(MySQLPlatform::class); verify($connection->getDatabasePlatform())->instanceOf(MySQLPlatform::class);
verify(Type::getType(JsonType::NAME))->instanceOf(JsonType::class); verify(Type::getType(JsonType::NAME))->instanceOf(JsonType::class);