Skip to content

Commit 15f8995

Browse files
authored
feat(database): add closable connection wrapper for PDO connection (#875)
1 parent 6ce796c commit 15f8995

23 files changed

+317
-87
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Database;
6+
7+
use Tempest\Container\Container;
8+
use Tempest\Container\Initializer;
9+
use Tempest\Container\Singleton;
10+
11+
/**
12+
* Reuses the same connection instance based on a static variable instead of the container.
13+
*
14+
* Used in testing where each test can have its own container instance.
15+
*/
16+
final class CachedConnectionInitializer implements Initializer
17+
{
18+
private static Connection|null $instance = null;
19+
20+
public function __construct(private readonly ConnectionInitializer $initializer)
21+
{
22+
}
23+
24+
#[Singleton]
25+
public function initialize(Container $container): Connection
26+
{
27+
if (self::$instance !== null) {
28+
return self::$instance;
29+
}
30+
31+
self::$instance = $this->initializer->initialize($container);
32+
33+
return self::$instance;
34+
}
35+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Database;
6+
7+
use PDOStatement;
8+
9+
interface Connection
10+
{
11+
public function beginTransaction(): bool;
12+
13+
public function commit(): bool;
14+
15+
public function rollback(): bool;
16+
17+
public function lastInsertId(): false|string;
18+
19+
public function prepare(string $sql): false|PDOStatement;
20+
21+
public function close(): void;
22+
23+
public function connect(): void;
24+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Database;
6+
7+
use Tempest\Container\Container;
8+
use Tempest\Container\Initializer;
9+
use Tempest\Container\Singleton;
10+
11+
final class ConnectionInitializer implements Initializer
12+
{
13+
#[Singleton]
14+
public function initialize(Container $container): Connection
15+
{
16+
$databaseConfig = $container->get(DatabaseConfig::class);
17+
18+
$connection = new PDOConnection($databaseConfig->connection());
19+
$connection->connect();
20+
21+
return $connection;
22+
}
23+
}

src/Tempest/Database/src/DatabaseConnection.php renamed to src/Tempest/Database/src/Connections/DatabaseConnection.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
declare(strict_types=1);
44

5-
namespace Tempest\Database;
5+
namespace Tempest\Database\Connections;
66

7+
use Tempest\Database\DatabaseDialect;
78
use Tempest\Database\Tables\NamingStrategy;
89

910
interface DatabaseConnection

src/Tempest/Database/src/DatabaseConnectionInitializer.php renamed to src/Tempest/Database/src/Connections/DatabaseConnectionInitializer.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22

33
declare(strict_types=1);
44

5-
namespace Tempest\Database;
5+
namespace Tempest\Database\Connections;
66

77
use Tempest\Container\Container;
88
use Tempest\Container\Initializer;
99
use Tempest\Container\Singleton;
10+
use Tempest\Database\DatabaseConfig;
1011

1112
final class DatabaseConnectionInitializer implements Initializer
1213
{

src/Tempest/Database/src/Connections/MySqlConnection.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace Tempest\Database\Connections;
66

77
use SensitiveParameter;
8-
use Tempest\Database\DatabaseConnection;
98
use Tempest\Database\DatabaseDialect;
109
use Tempest\Database\Tables\NamingStrategy;
1110
use Tempest\Database\Tables\PluralizedSnakeCaseStrategy;

src/Tempest/Database/src/Connections/PostgresConnection.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace Tempest\Database\Connections;
66

77
use SensitiveParameter;
8-
use Tempest\Database\DatabaseConnection;
98
use Tempest\Database\DatabaseDialect;
109
use Tempest\Database\Tables\NamingStrategy;
1110
use Tempest\Database\Tables\PluralizedSnakeCaseStrategy;

src/Tempest/Database/src/Connections/SQLiteConnection.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace Tempest\Database\Connections;
66

77
use SensitiveParameter;
8-
use Tempest\Database\DatabaseConnection;
98
use Tempest\Database\DatabaseDialect;
109
use Tempest\Database\Tables\NamingStrategy;
1110
use Tempest\Database\Tables\PluralizedSnakeCaseStrategy;

src/Tempest/Database/src/DatabaseConfig.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
namespace Tempest\Database;
66

7+
use Tempest\Database\Connections\DatabaseConnection;
8+
79
final class DatabaseConfig
810
{
911
private array $migrations = [];

src/Tempest/Database/src/DatabaseDialectInitializer.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Tempest\Container\Container;
88
use Tempest\Container\Initializer;
9+
use Tempest\Database\Connections\DatabaseConnection;
910

1011
final readonly class DatabaseDialectInitializer implements Initializer
1112
{

0 commit comments

Comments
 (0)