66
77use PDOException ;
88use Tempest \Database \Builder \ModelDefinition ;
9- use Tempest \Database \Config \DatabaseConfig ;
109use Tempest \Database \Config \DatabaseDialect ;
1110use Tempest \Database \Database ;
1211use Tempest \Database \DatabaseMigration as MigrationInterface ;
1817use Tempest \Database \QueryStatements \SetForeignKeyChecksStatement ;
1918use Tempest \Database \QueryStatements \ShowTablesStatement ;
2019use Throwable ;
21- use UnhandledMatchError ;
2220
2321use function Tempest \event ;
2422
2523final readonly class MigrationManager
2624{
2725 public function __construct (
28- private DatabaseConfig $ databaseConfig ,
26+ private DatabaseDialect $ dialect ,
2927 private Database $ database ,
3028 private RunnableMigrations $ migrations ,
3129 ) {}
@@ -35,7 +33,7 @@ public function up(): void
3533 try {
3634 $ existingMigrations = Migration::all ();
3735 } catch (PDOException $ pdoException ) {
38- if ($ pdoException -> getCode () === $ this ->databaseConfig -> dialect ->tableNotFoundCode () && str_contains ( $ pdoException-> getMessage (), ' table ' )) {
36+ if ($ this ->dialect ->isTableNotFoundError ( $ pdoException )) {
3937 $ this ->executeUp (new CreateMigrationsTable ());
4038 $ existingMigrations = Migration::all ();
4139 } else {
@@ -62,13 +60,14 @@ public function down(): void
6260 try {
6361 $ existingMigrations = Migration::all ();
6462 } catch (PDOException $ pdoException ) {
65- /** @throw UnhandledMatchError */
66- match ((string ) $ pdoException ->getCode ()) {
67- $ this ->databaseConfig ->dialect ->tableNotFoundCode () => event (
68- event: new MigrationFailed (name: new ModelDefinition (Migration::class)->getTableDefinition ()->name , exception: new TableNotFoundException ()),
69- ),
70- default => throw new UnhandledMatchError ($ pdoException ->getMessage ()),
71- };
63+ if (! $ this ->dialect ->isTableNotFoundError ($ pdoException )) {
64+ throw $ pdoException ;
65+ }
66+
67+ event (new MigrationFailed (
68+ name: new ModelDefinition (Migration::class)->getTableDefinition ()->name ,
69+ exception: new TableNotFoundException (),
70+ ));
7271
7372 return ;
7473 }
@@ -90,26 +89,24 @@ public function down(): void
9089
9190 public function dropAll (): void
9291 {
93- $ dialect = $ this ->databaseConfig ->dialect ;
94-
9592 try {
9693 // Get all tables
97- $ tables = $ this ->getTableDefinitions ($ dialect );
94+ $ tables = $ this ->getTableDefinitions ();
9895
9996 // Disable foreign key checks
100- new SetForeignKeyChecksStatement (enable: false )->execute ($ dialect );
97+ new SetForeignKeyChecksStatement (enable: false )->execute ($ this -> dialect );
10198
10299 // Drop each table
103100 foreach ($ tables as $ table ) {
104- new DropTableStatement ($ table ->name )->execute ($ dialect );
101+ new DropTableStatement ($ table ->name )->execute ($ this -> dialect );
105102
106103 event (new TableDropped ($ table ->name ));
107104 }
108105 } catch (Throwable $ throwable ) {
109106 event (new FreshMigrationFailed ($ throwable ));
110107 } finally {
111108 // Enable foreign key checks
112- new SetForeignKeyChecksStatement (enable: true )->execute ($ dialect );
109+ new SetForeignKeyChecksStatement (enable: true )->execute ($ this -> dialect );
113110 }
114111 }
115112
@@ -180,9 +177,7 @@ public function executeUp(MigrationInterface $migration): void
180177 return ;
181178 }
182179
183- $ dialect = $ this ->databaseConfig ->dialect ;
184-
185- $ query = new Query ($ statement ->compile ($ dialect ));
180+ $ query = new Query ($ statement ->compile ($ this ->dialect ));
186181
187182 try {
188183 $ this ->database ->execute ($ query );
@@ -208,23 +203,21 @@ public function executeDown(MigrationInterface $migration): void
208203 return ;
209204 }
210205
211- $ dialect = $ this ->databaseConfig ->dialect ;
212-
213- $ query = new Query ($ statement ->compile ($ dialect ));
206+ $ query = new Query ($ statement ->compile ($ this ->dialect ));
214207
215208 try {
216209 // TODO: don't just disable FK checking when executing down
217210
218211 // Disable foreign key checks
219- new SetForeignKeyChecksStatement (enable: false )->execute ($ dialect );
212+ new SetForeignKeyChecksStatement (enable: false )->execute ($ this -> dialect );
220213
221214 $ this ->database ->execute ($ query );
222215
223216 // Disable foreign key checks
224- new SetForeignKeyChecksStatement (enable: true )->execute ($ dialect );
217+ new SetForeignKeyChecksStatement (enable: true )->execute ($ this -> dialect );
225218 } catch (PDOException $ pdoException ) {
226219 // Disable foreign key checks
227- new SetForeignKeyChecksStatement (enable: true )->execute ($ dialect );
220+ new SetForeignKeyChecksStatement (enable: true )->execute ($ this -> dialect );
228221
229222 event (new MigrationFailed ($ migration ->name , $ pdoException ));
230223
@@ -253,15 +246,15 @@ public function executeDown(MigrationInterface $migration): void
253246 /**
254247 * @return \Tempest\Database\Migrations\TableMigrationDefinition[]
255248 */
256- private function getTableDefinitions (DatabaseDialect $ dialect ): array
249+ private function getTableDefinitions (): array
257250 {
258251 return array_map (
259- fn (array $ item ) => match ($ dialect ) {
252+ fn (array $ item ) => match ($ this -> dialect ) {
260253 DatabaseDialect::SQLITE => new TableMigrationDefinition ($ item ['name ' ]),
261254 DatabaseDialect::POSTGRESQL => new TableMigrationDefinition ($ item ['table_name ' ]),
262255 DatabaseDialect::MYSQL => new TableMigrationDefinition (array_values ($ item )[0 ]),
263256 },
264- new ShowTablesStatement ()->fetch ($ dialect ),
257+ new ShowTablesStatement ()->fetch ($ this -> dialect ),
265258 );
266259 }
267260
@@ -279,7 +272,7 @@ private function getMinifiedSqlFromStatement(?QueryStatement $statement): string
279272 return '' ;
280273 }
281274
282- $ query = new Query ($ statement ->compile ($ this ->databaseConfig -> dialect ));
275+ $ query = new Query ($ statement ->compile ($ this ->dialect ));
283276
284277 // Remove comments
285278 $ sql = preg_replace ('/--.*$/m ' , '' , $ query ->toSql ()); // Remove SQL single-line comments
0 commit comments