feat: DB업그레이드에서 기존 상태 검사와 확인 이력 등록 지원
미기록 항목의 실제 실행 조건을 읽기 전용으로 확인해 실행 불필요 상태를 구분한다. 명시적 요청에서 선행 항목부터 확인 이력을 등록하고 등록 버튼을 왼쪽에 배치한다. 부분 적용·게시판별 컬럼·조회 오류와 순차 등록·실패 이력·체크섬·잠금 보호 검증을 추가한다.
This commit is contained in:
+24
-4
@@ -13,6 +13,7 @@ if ($is_admin != 'super') {
|
||||
$is_execute = isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST';
|
||||
$migration_result = array('success' => true, 'applied' => 0, 'skipped' => 0, 'errors' => array());
|
||||
$shop_install_result = null;
|
||||
$action = '';
|
||||
|
||||
if ($is_execute) {
|
||||
check_demo();
|
||||
@@ -20,6 +21,8 @@ if ($is_execute) {
|
||||
$action = isset($_POST['action']) ? trim($_POST['action']) : 'migrate';
|
||||
if ($action === 'install_shop') {
|
||||
$shop_install_result = g5_shop_install_run();
|
||||
} elseif ($action === 'record_existing') {
|
||||
$migration_result = g5_migration_run('', true);
|
||||
} else {
|
||||
$migration_id = isset($_POST['migration_id']) ? trim($_POST['migration_id']) : '';
|
||||
$migration_result = g5_migration_run($migration_id);
|
||||
@@ -29,8 +32,11 @@ if ($is_execute) {
|
||||
|
||||
$migration_statuses = g5_migration_status();
|
||||
$pending_count = 0;
|
||||
$unrecorded_count = 0;
|
||||
foreach ($migration_statuses as $migration_status) {
|
||||
if (isset($migration_status['error']) || $migration_status['status'] !== 'success' || $migration_status['checksum_changed']) {
|
||||
if (isset($migration_status['status']) && $migration_status['status'] === 'unrecorded') {
|
||||
$unrecorded_count++;
|
||||
} elseif (isset($migration_status['error']) || $migration_status['status'] !== 'success' || $migration_status['checksum_changed']) {
|
||||
$pending_count++;
|
||||
}
|
||||
}
|
||||
@@ -40,9 +46,11 @@ if ($shop_install_result !== null && $shop_install_result['success']) {
|
||||
} elseif ($shop_install_result !== null) {
|
||||
$db_upgrade_msg = '쇼핑몰 설치에 실패했습니다. 오류 내용을 확인해 주십시오.';
|
||||
} elseif (!$is_execute) {
|
||||
$db_upgrade_msg = $pending_count ? '적용하지 않은 DB 마이그레이션이 있습니다. 아래 내용을 확인한 뒤 실행해 주십시오.' : 'DB 마이그레이션이 모두 적용되어 있습니다.';
|
||||
$db_upgrade_msg = $pending_count ? '확인·실행이 필요한 DB 마이그레이션이 있습니다. 아래 내용을 확인해 주십시오.' : ($unrecorded_count ? '현재 실행할 변경은 없지만 기존 상태 확인 이력이 등록되지 않았습니다.' : 'DB 마이그레이션이 모두 적용되어 있습니다.');
|
||||
} elseif (!$migration_result['success']) {
|
||||
$db_upgrade_msg = 'DB 마이그레이션에 실패했습니다. 오류 내용을 확인해 주십시오.';
|
||||
} elseif ($action === 'record_existing') {
|
||||
$db_upgrade_msg = '기존 상태 확인 이력 ' . (int) $migration_result['skipped'] . '건을 등록했습니다. 선행 항목에 실행이 필요하거나 실패 이력이 있으면 등록을 중단합니다.';
|
||||
} elseif ($migration_result['applied'] || $migration_result['skipped']) {
|
||||
$db_upgrade_msg = 'DB 마이그레이션이 완료되었습니다.';
|
||||
} else {
|
||||
@@ -56,6 +64,10 @@ $dbupgrade_token = get_admin_token();
|
||||
|
||||
<div class="local_desc01 local_desc">
|
||||
<p><?php echo $db_upgrade_msg; ?></p>
|
||||
<?php if ($unrecorded_count) { ?>
|
||||
<p>실행 불필요 <?php echo (int) $unrecorded_count; ?>건: 현재 실행 조건상 건너뛰는 항목입니다. 과거 실행 성공을 의미하지 않으며, 선행 작업 후에는 결과가 달라질 수 있습니다. 기존 상태 등록은 처음부터 연속해서 실행 불필요한 항목만 기록합니다.</p>
|
||||
<?php } ?>
|
||||
<p>대기 항목에는 데이터 보정 등 조회만으로 완료를 판단할 수 없는 작업도 포함됩니다. 조회 시 DB 변경이나 이력 등록은 수행하지 않습니다.</p>
|
||||
</div>
|
||||
|
||||
<?php if ($shop_install_result !== null && !$shop_install_result['success']) { ?>
|
||||
@@ -71,6 +83,13 @@ $dbupgrade_token = get_admin_token();
|
||||
<?php } ?>
|
||||
|
||||
<div class="dbupgrade_all_actions">
|
||||
<?php if ($unrecorded_count) { ?>
|
||||
<form class="dbupgrade_existing_action" method="post" action="<?php echo G5_ADMIN_URL; ?>/dbupgrade.php">
|
||||
<input type="hidden" name="token" value="<?php echo $dbupgrade_token; ?>">
|
||||
<input type="hidden" name="action" value="record_existing">
|
||||
<button type="submit" class="btn_submit">기존 상태 확인 이력 등록</button>
|
||||
</form>
|
||||
<?php } ?>
|
||||
<?php if (!defined('G5_USE_SHOP') || !G5_USE_SHOP) { ?>
|
||||
<form method="post" action="<?php echo G5_ADMIN_URL; ?>/dbupgrade.php" onsubmit="return confirm('쇼핑몰을 설치하시겠습니까? 설치 전 데이터베이스와 data/dbconfig.php 백업을 권장합니다.');">
|
||||
<input type="hidden" name="token" value="<?php echo $dbupgrade_token; ?>">
|
||||
@@ -105,8 +124,8 @@ $dbupgrade_token = get_admin_token();
|
||||
<?php
|
||||
$current_migration_status = isset($migration_status['status']) ? $migration_status['status'] : 'error';
|
||||
$migration_succeeded = $current_migration_status === 'success' && !$migration_status['checksum_changed'];
|
||||
$migration_can_run = $current_migration_status !== 'error' && $current_migration_status !== 'success' && $previous_migrations_ready;
|
||||
$migration_button_title = $current_migration_status === 'success' ? '이미 성공한 마이그레이션입니다.' : ($previous_migrations_ready ? '' : '선행 마이그레이션을 먼저 실행해야 합니다.');
|
||||
$migration_can_run = in_array($current_migration_status, array('pending', 'failed'), true) && $previous_migrations_ready;
|
||||
$migration_button_title = $current_migration_status === 'unrecorded' ? '기존 상태 확인 이력을 등록해 주십시오.' : ($current_migration_status === 'success' ? '이미 성공한 마이그레이션입니다.' : ($previous_migrations_ready ? '' : '선행 마이그레이션을 먼저 실행해야 합니다.'));
|
||||
?>
|
||||
<tr>
|
||||
<?php if (isset($migration_status['error'])) { ?>
|
||||
@@ -131,6 +150,7 @@ $dbupgrade_token = get_admin_token();
|
||||
<style>
|
||||
.dbupgrade_all_actions {display:flex;width:100%;margin:0 0 20px;justify-content:flex-end;gap:5px}
|
||||
.dbupgrade_all_actions form {margin:0}
|
||||
.dbupgrade_all_actions .dbupgrade_existing_action {margin-right:auto}
|
||||
.dbupgrade_all_actions .btn_submit {display:inline-block;float:none;position:static;width:auto;height:30px;margin:0;padding:0 15px;border:0}
|
||||
.dbupgrade_sort {width:100%; border:0; background:transparent; color:inherit; font:inherit; cursor:pointer}
|
||||
#dbupgrade_migration_table td.dbupgrade_description {text-align:left}
|
||||
|
||||
Reference in New Issue
Block a user