<?php
include_once('./_common.php');
if (!$is_admin) exit;
if (empty($_SERVER['DOCUMENT_ROOT'])) {
$_SERVER['DOCUMENT_ROOT'] = '/home/www';
}
require_once $_SERVER['DOCUMENT_ROOT'] . '/DB/db_upbit.php';
$tables = [
'daemon_coin_container',
'daemon_coin_container_1h',
'daemon_coin_container_4h',
'daemon_coin_container_24h',
'daemon_coin_container_30d',
'daemon_coin_container_w',
];
$msg = '';
$msg_type = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['table'])) {
$target = $_POST['table'];
if (in_array($target, $tables, true)) {
try {
$db_upbit->exec("TRUNCATE TABLE `{$target}`");
$msg = '[' . date('Y-m-d H:i:s') . "] {$target} 전체 삭제 완료.";
$msg_type = 'success';
} catch (Throwable $e) {
$msg = '오류: ' . $e->getMessage();
$msg_type = 'error';
}
} else {
$msg = '허용되지 않은 테이블입니다.';
$msg_type = 'error';
}
}
$counts = [];
$total_rows = 0;
foreach ($tables as $table_name) {
try {
$row_count = $db_upbit->query("SELECT COUNT(*) FROM `{$table_name}`")->fetchColumn();
$counts[$table_name] = $row_count;
if (is_numeric($row_count)) {
$total_rows += (int) $row_count;
}
} catch (Throwable $e) {
$counts[$table_name] = 'ERR';
}
}
$table_total = count($tables);
include_once(G5_PATH . '/_head.php');
include_once('./web_tool_bookmark.php');
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>COIN CONTAINER TRUNCATE</title>
<link href="https://fonts.googleapis.com/css2?family=Share+Tech+Mono&family=Rajdhani:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="./web_tool.css">
</head>
<body>
<div class="page-shell">
<div class="wrap">
<section class="hero">
<div class="hero-panel">
<div class="eyebrow">Database Utility</div>
<h1><i class="fas fa-trash-alt"></i> Container Truncate</h1>
<p>코인 히스토리 수집용 컨테이너 테이블을 빠르게 비우는 관리 페이지입니다. 테이블 구조는 유지한 채 데이터만 초기화하도록 구성했습니다.</p>
<div class="hero-stats">
<div class="stat-card">
<div class="stat-label">Tracked Tables</div>
<div class="stat-value"><?= number_format($table_total) ?></div>
</div>
<div class="stat-card">
<div class="stat-label">Total Rows</div>
<div class="stat-value"><?= number_format($total_rows) ?></div>
</div>
<div class="stat-card">
<div class="stat-label">Last Refresh</div>
<div class="stat-value"><?= date('H:i:s') ?></div>
</div>
</div>
</div>
<aside class="hero-meta">
<div class="meta-block">
<strong>Palette</strong>
<span>#020617 / #0c1224 / #1a2436 / #232e42</span>
</div>
<div class="meta-block">
<strong>Layout</strong>
<span>반응형 단일 컬럼 전환</span>
</div>
<div class="meta-block">
<strong>Action Scope</strong>
<span>TRUNCATE TABLE 실행 / 허용된 테이블만 처리 / 오류 메시지 즉시 표시</span>
</div>
</aside>
</section>
<?php if ($msg): ?>
<div class="msg <?= $msg_type ?>"><?= htmlspecialchars($msg) ?></div>
<?php endif; ?>
<div class="section-head">
<h2>Table Queue</h2>
<p>전체 테이블 수 <?= number_format($table_total) ?> / 현재 서버 시각 <?= date('Y-m-d H:i:s') ?></p>
</div>
<div class="table-list">
<?php foreach ($tables as $table_name): ?>
<div class="table-row">
<div class="table-info">
<div class="table-name"><?= htmlspecialchars($table_name) ?></div>
<div class="table-count">행 수 : <span><?= is_numeric($counts[$table_name]) ? number_format($counts[$table_name]) : $counts[$table_name] ?></span></div>
</div>
<form method="POST" class="js-confirm-truncate" data-table-name="<?= htmlspecialchars($table_name, ENT_QUOTES) ?>">
<input type="hidden" name="table" value="<?= htmlspecialchars($table_name) ?>">
<button type="submit" class="btn-truncate">TRUNCATE</button>
</form>
</div>
<?php endforeach; ?>
</div>
<div class="footer-bar"><?= date('Y-m-d H:i:s') ?> - COIN CONTAINER MANAGER</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
var truncateForms = document.querySelectorAll('.js-confirm-truncate');
truncateForms.forEach(function (form) {
form.addEventListener('submit', function (event) {
var tableName = form.getAttribute('data-table-name') || '선택한 테이블';
var message = tableName + ' 전체 행을 삭제합니다.\n정말 계속하시겠습니까?';
if (!window.confirm(message)) {
event.preventDefault();
}
});
});
});
</script>
</body>
</html>
<?php require_once G5_PATH . '/_PAGE/tail.php'; ?>