dbms/app/Controllers/CLI/DBMigration/DBMigration.php
2025-07-11 17:07:12 +09:00

95 lines
2.9 KiB
PHP

<?php
namespace App\Controllers\CLI\DBMigration;
use App\Controllers\BaseController;
use CodeIgniter\Database\BaseConnection;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use App\Libraries\DBMigration\Process\ClientProcess;
use App\Libraries\DBMigration\Process\LineProcess;
use App\Libraries\DBMigration\Process\ServerCodeProcess;
use App\Libraries\DBMigration\Process\SwitchCodeProcess;
use App\Libraries\DBMigration\Process\MigrationProcessInterface;
abstract class DBMigration extends BaseController
{
private $_targetDB = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
}
abstract protected function getSourceDB(): BaseConnection;
abstract protected function getClient(): array;
abstract protected function getLine(): array;
abstract protected function getServerCode(): array;
abstract protected function getSwitchCode(): array;
final protected function getTargetDB(): BaseConnection
{
if ($this->_targetDB === null) {
$this->_targetDB = \Config\Database::connect('default');
}
return $this->_targetDB;
}
/**
* 공통 마이그레이션 처리 로직
*/
private function processMigration(MigrationProcessInterface $processor, array $rows, string $functionName): void
{
$this->getTargetDB()->transStart();
try {
$cnt = 1;
foreach ($rows as $row) {
$processor->process($row, $cnt);
$cnt++;
}
echo "{$functionName} 작업을 완료하였습니다.";
$this->getTargetDB()->transCommit();
} catch (\Exception $e) {
$this->getTargetDB()->transRollback();
echo "{$functionName} 작업을 실패하였습니다.\n--------------\n" . $e->getMessage() . "\n--------------\n";
}
}
final public function client(): void
{
$this->processMigration(
new ClientProcess($this->getTargetDB()),
$this->getClient(),
__FUNCTION__
);
}
final public function line(): void
{
$this->processMigration(
new LineProcess($this->getTargetDB()),
$this->getLine(),
__FUNCTION__
);
}
final public function servercode(): void
{
$this->processMigration(
new ServerCodeProcess($this->getTargetDB()),
$this->getServerCode(),
__FUNCTION__
);
}
final public function switchcode(): void
{
$this->processMigration(
new SwitchCodeProcess($this->getTargetDB()),
$this->getSwitchCode(),
__FUNCTION__
);
}
}