219 lines
7 KiB
PHP
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;
|
|
}
|