AvocadoAmber/AvocadoAmber/adm/board_migration.inc.php
2025-11-20 20:20:53 +09:00

219 lines
7 KiB
PHP

<?php
if (!defined('_GNUBOARD_'))
exit;
// 현재 마이그레이션 버전
define('BOARD_MIGRATION_VERSION', '2.0.0');
// 표준 게시판 테이블 구조 정의
function get_standard_board_structure()
{
return [
'wr_id' => 'int(11) NOT NULL AUTO_INCREMENT',
'wr_num' => 'int(11) NOT NULL DEFAULT 0',
'wr_reply' => 'varchar(10) NOT NULL',
'wr_parent' => 'int(11) NOT NULL DEFAULT 0',
'wr_is_comment' => 'tinyint(4) NOT NULL DEFAULT 0',
'wr_comment' => 'int(11) NOT NULL DEFAULT 0',
'wr_comment_reply' => 'varchar(5) NOT NULL',
'ca_name' => 'varchar(255) NOT NULL',
'wr_option' => "set('html1','html2','secret','mail') NOT NULL",
'wr_subject' => 'varchar(255) NOT NULL',
'wr_content' => 'mediumtext NOT NULL',
'wr_extra_vars' => 'text NOT NULL',
'wr_link1' => 'text NOT NULL',
'wr_link2' => 'text NOT NULL',
'wr_link1_hit' => 'int(11) NOT NULL DEFAULT 0',
'wr_link2_hit' => 'int(11) NOT NULL DEFAULT 0',
'wr_hit' => 'int(11) NOT NULL DEFAULT 0',
'wr_good' => 'int(11) NOT NULL DEFAULT 0',
'wr_nogood' => 'int(11) NOT NULL DEFAULT 0',
'mb_id' => 'varchar(20) NOT NULL',
'wr_password' => 'varchar(255) NOT NULL',
'wr_extrapassword' => 'varchar(255) NOT NULL',
'wr_name' => 'varchar(255) NOT NULL',
'wr_email' => 'varchar(255) NOT NULL',
'wr_homepage' => 'varchar(255) NOT NULL',
'wr_datetime' => "datetime NOT NULL DEFAULT '1970-01-01 00:00:00'",
'wr_file' => 'tinyint(4) NOT NULL DEFAULT 0',
'wr_last' => 'varchar(19) NOT NULL',
'wr_ip' => 'varchar(255) NOT NULL',
'wr_facebook_user' => 'varchar(255) NOT NULL',
'wr_twitter_user' => 'varchar(255) NOT NULL',
'wr_dice1' => 'int(11) NOT NULL DEFAULT 0',
'wr_dice2' => 'int(11) NOT NULL DEFAULT 0',
'wr_log' => 'text NOT NULL',
'wr_item' => 'int(11) NOT NULL DEFAULT 0',
'wr_item_log' => "varchar(255) NOT NULL DEFAULT ''",
'wr_action' => "varchar(255) NOT NULL DEFAULT ''",
'wr_secret' => 'int(11) NOT NULL DEFAULT 0',
'wr_adult' => 'int(11) NOT NULL DEFAULT 0',
'wr_wide' => 'int(11) NOT NULL DEFAULT 0',
'wr_plip' => 'int(11) NOT NULL DEFAULT 0',
'wr_noname' => 'int(11) NOT NULL DEFAULT 0',
'wr_ing' => 'int(11) NOT NULL DEFAULT 0',
'ch_id' => 'int(11) NOT NULL DEFAULT 0',
'ch_side' => 'int(11) NOT NULL DEFAULT 0',
'ch_class' => 'int(11) NOT NULL DEFAULT 0',
'ti_id' => 'int(11) NOT NULL DEFAULT 0',
'ma_id' => 'int(11) NOT NULL DEFAULT 0',
'wr_width' => 'int(11) NOT NULL DEFAULT 0',
'wr_height' => 'int(11) NOT NULL DEFAULT 0',
'wr_url' => "varchar(255) NOT NULL DEFAULT ''",
'wr_type' => "varchar(255) NOT NULL DEFAULT ''",
'wr_1' => "varchar(255) NOT NULL DEFAULT ''",
'wr_2' => "varchar(255) NOT NULL DEFAULT ''",
'wr_3' => "varchar(255) NOT NULL DEFAULT ''",
'wr_4' => "varchar(255) NOT NULL DEFAULT ''",
'wr_5' => "varchar(255) NOT NULL DEFAULT ''",
'wr_6' => "varchar(255) NOT NULL DEFAULT ''",
'wr_7' => "varchar(255) NOT NULL DEFAULT ''",
'wr_8' => "varchar(255) NOT NULL DEFAULT ''",
'wr_9' => "varchar(255) NOT NULL DEFAULT ''",
'wr_10' => "varchar(255) NOT NULL DEFAULT ''"
];
}
// bo_version 컬럼 체크 및 추가
function check_and_add_bo_version()
{
global $g5;
$sql = "SHOW COLUMNS FROM {$g5['board_table']} LIKE 'bo_version'";
$result = sql_query($sql);
if (sql_num_rows($result) == 0) {
$sql = "ALTER TABLE {$g5['board_table']} ADD `bo_version` varchar(255) NOT NULL DEFAULT '0'";
sql_query($sql);
return true;
}
return false;
}
// 현재 테이블 구조 가져오기
function get_current_table_structure($table_name)
{
$sql = "SHOW COLUMNS FROM `{$table_name}`";
$result = sql_query($sql);
$structure = [];
while ($row = sql_fetch_array($result)) {
$type = $row['Type'];
$null = $row['Null'] == 'NO' ? 'NOT NULL' : '';
$default = '';
if ($row['Default'] !== null) {
if (in_array(strtolower($row['Default']), ['current_timestamp'])) {
$default = "DEFAULT {$row['Default']}";
} else {
$default = "DEFAULT '{$row['Default']}'";
}
} else if ($row['Null'] == 'NO' && $row['Default'] === null && $row['Extra'] != 'auto_increment') {
// NOT NULL이고 DEFAULT가 없는 경우 처리
if (strpos($type, 'int') !== false) {
$default = 'DEFAULT 0';
} else if (strpos($type, 'text') !== false) {
// text 타입은 default를 설정할 수 없음
$default = '';
} else {
$default = "DEFAULT ''";
}
}
$extra = $row['Extra'];
if ($extra == 'auto_increment') {
$extra = 'AUTO_INCREMENT';
}
$definition = trim("{$type} {$null} {$default} {$extra}");
$structure[$row['Field']] = $definition;
}
return $structure;
}
// 테이블 구조 비교
function compare_table_structure($table_name)
{
$standard = get_standard_board_structure();
$current = get_current_table_structure($table_name);
$missing_columns = [];
foreach ($standard as $column => $definition) {
if (!isset($current[$column])) {
$missing_columns[$column] = $definition;
}
}
return $missing_columns;
}
// 게시판 테이블 마이그레이션 실행
function migrate_board_table($bo_table)
{
global $g5;
$write_table = $g5['write_prefix'] . $bo_table;
// 테이블 존재 확인
$sql = "SHOW TABLES LIKE '{$write_table}'";
$result = sql_query($sql);
if (sql_num_rows($result) == 0) {
return ['success' => false, 'message' => '테이블이 존재하지 않습니다.'];
}
// 누락된 컬럼 확인
$missing_columns = compare_table_structure($write_table);
if (empty($missing_columns)) {
// 버전 업데이트만 수행
$sql = "UPDATE {$g5['board_table']} SET bo_version = '" . BOARD_MIGRATION_VERSION . "' WHERE bo_table = '{$bo_table}'";
sql_query($sql);
return ['success' => true, 'message' => '이미 최신 버전입니다.', 'updated' => 0];
}
// 컬럼 추가
$updated = 0;
foreach ($missing_columns as $column => $definition) {
$sql = "ALTER TABLE `{$write_table}` ADD `{$column}` {$definition}";
if (sql_query($sql)) {
$updated++;
}
}
// 버전 업데이트
$sql = "UPDATE {$g5['board_table']} SET bo_version = '" . BOARD_MIGRATION_VERSION . "' WHERE bo_table = '{$bo_table}'";
sql_query($sql);
return ['success' => true, 'message' => '마이그레이션이 완료되었습니다.', 'updated' => $updated];
}
// 모든 게시판 체크
function check_all_boards_migration()
{
global $g5;
check_and_add_bo_version();
$sql = "SELECT bo_table, bo_version FROM {$g5['board_table']}";
$result = sql_query($sql);
$boards_need_update = [];
while ($row = sql_fetch_array($result)) {
if ($row['bo_version'] != BOARD_MIGRATION_VERSION) {
$write_table = $g5['write_prefix'] . $row['bo_table'];
$missing = compare_table_structure($write_table);
$boards_need_update[] = [
'bo_table' => $row['bo_table'],
'current_version' => $row['bo_version'],
'missing_columns' => count($missing)
];
}
}
return $boards_need_update;
}