assertTrue($adapter->supports(DatabaseMaintenance::ACTION_OPTIMIZE)); $this->assertTrue($adapter->supports(DatabaseMaintenance::ACTION_REPAIR)); $this->assertTrue($adapter->requiresTables(DatabaseMaintenance::ACTION_OPTIMIZE)); $optimize = $adapter->operations(DatabaseMaintenance::ACTION_OPTIMIZE, [ 'system_queue', 'admin.system_user', 'weird`name', ]); $repair = $adapter->operations(DatabaseMaintenance::ACTION_REPAIR, ['system_queue']); $this->assertSame('OPTIMIZE TABLE `system_queue`', $optimize[0]['statements'][0]['sql']); $this->assertSame('OPTIMIZE TABLE `admin`.`system_user`', $optimize[1]['statements'][0]['sql']); $this->assertSame('OPTIMIZE TABLE `weird``name`', $optimize[2]['statements'][0]['sql']); $this->assertSame(DatabaseMaintenance::MODE_QUERY, $optimize[0]['statements'][0]['mode']); $this->assertSame('REPAIR TABLE `system_queue`', $repair[0]['statements'][0]['sql']); } public function testSqliteBuildsDatabaseScopedOptimizeAndSkipsRepair(): void { $adapter = new DatabaseMaintenance('sqlite'); $this->assertTrue($adapter->supports(DatabaseMaintenance::ACTION_OPTIMIZE)); $this->assertFalse($adapter->supports(DatabaseMaintenance::ACTION_REPAIR)); $this->assertFalse($adapter->requiresTables(DatabaseMaintenance::ACTION_OPTIMIZE)); $operations = $adapter->operations(DatabaseMaintenance::ACTION_OPTIMIZE, ['system_queue']); $this->assertSame('数据库', $operations[0]['target']); $this->assertSame('PRAGMA optimize', $operations[0]['statements'][0]['sql']); $this->assertSame('VACUUM', $operations[0]['statements'][1]['sql']); $this->assertSame(DatabaseMaintenance::MODE_EXECUTE, $operations[0]['statements'][0]['mode']); $this->assertSame([], $adapter->operations(DatabaseMaintenance::ACTION_REPAIR, ['system_queue'])); $this->assertSame('SQLITE 数据库暂不支持 REPAIR 操作,已跳过处理。', $adapter->unsupportedMessage(DatabaseMaintenance::ACTION_REPAIR)); } public function testPgsqlBuildsVacuumAnalyzeWithDoubleQuotedTables(): void { $adapter = new DatabaseMaintenance('postgresql'); $this->assertTrue($adapter->supports(DatabaseMaintenance::ACTION_OPTIMIZE)); $this->assertFalse($adapter->supports(DatabaseMaintenance::ACTION_REPAIR)); $this->assertTrue($adapter->requiresTables(DatabaseMaintenance::ACTION_OPTIMIZE)); $operations = $adapter->operations(DatabaseMaintenance::ACTION_OPTIMIZE, [ 'public.system_queue', 'weird"name', ]); $this->assertSame('VACUUM (ANALYZE) "public"."system_queue"', $operations[0]['statements'][0]['sql']); $this->assertSame('VACUUM (ANALYZE) "weird""name"', $operations[1]['statements'][0]['sql']); $this->assertSame(DatabaseMaintenance::MODE_EXECUTE, $operations[0]['statements'][0]['mode']); } public function testSqlsrvBuildsIndexAndStatisticsStatementsWithBracketQuotedTables(): void { $adapter = new DatabaseMaintenance('mssql'); $this->assertTrue($adapter->supports(DatabaseMaintenance::ACTION_OPTIMIZE)); $this->assertFalse($adapter->supports(DatabaseMaintenance::ACTION_REPAIR)); $this->assertTrue($adapter->requiresTables(DatabaseMaintenance::ACTION_OPTIMIZE)); $operations = $adapter->operations(DatabaseMaintenance::ACTION_OPTIMIZE, [ 'dbo.system_queue', 'weird]name', ]); $this->assertSame('ALTER INDEX ALL ON [dbo].[system_queue] REORGANIZE', $operations[0]['statements'][0]['sql']); $this->assertSame('UPDATE STATISTICS [dbo].[system_queue]', $operations[0]['statements'][1]['sql']); $this->assertSame('ALTER INDEX ALL ON [weird]]name] REORGANIZE', $operations[1]['statements'][0]['sql']); $this->assertSame(DatabaseMaintenance::MODE_EXECUTE, $operations[0]['statements'][0]['mode']); } public function testUnsupportedDatabaseReturnsNoOperations(): void { $adapter = new DatabaseMaintenance('oracle'); $this->assertFalse($adapter->supports(DatabaseMaintenance::ACTION_OPTIMIZE)); $this->assertFalse($adapter->supports(DatabaseMaintenance::ACTION_REPAIR)); $this->assertSame([], $adapter->operations(DatabaseMaintenance::ACTION_OPTIMIZE, ['system_queue'])); $this->assertSame('ORACLE 数据库暂不支持 OPTIMIZE 操作,已跳过处理。', $adapter->unsupportedMessage(DatabaseMaintenance::ACTION_OPTIMIZE)); } }