文件
chengduzhongchuliang/migrations/20261028_granary_sites.php

49 行
2.7 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
// CLI: php this-file.php /absolute/backup/directory
if (PHP_SAPI !== 'cli') exit;
chdir(dirname(__DIR__));
define('APP_PATH', getcwd() . '/application/');
require getcwd() . '/thinkphp/base.php';
\think\App::initCommon();
$backup = isset($argv[1]) ? $argv[1] : '';
if (!is_dir($backup)) throw new Exception('Backup directory required');
$prefix = config('database.prefix');
if (!preg_match('/^[a-zA-Z0-9_]+$/D', $prefix)) throw new Exception('Invalid prefix');
$rows = \think\Db::name('granary')->select();
$mapping = [];
$keys = [];
foreach ($rows as $row) {
$site = isset($row['site']) && in_array($row['site'], ['center', 'xishui'], true) ? $row['site'] : '';
if ($site === '') {
if (strpos($row['storage'], '习水') !== false) $site = 'xishui';
elseif (strpos($row['storage'], '中心库') !== false) $site = 'center';
else throw new Exception('Unknown site for granary ' . $row['id']);
}
$key = $site . ':' . $row['num'];
if (isset($keys[$key])) throw new Exception('Duplicate site/number: ' . $key);
$keys[$key] = true;
$mapping[$row['id']] = $site;
}
$snapshot = $backup . '/granary-sites-before.json';
if (!file_exists($snapshot)) {
file_put_contents($snapshot, json_encode(['granaries' => $rows,
'admin_scopes' => \think\Db::name('admin')->field('id,username')->select()], JSON_UNESCAPED_UNICODE));
chmod($snapshot, 0600);
}
$columns = array_column(\think\Db::query('SHOW COLUMNS FROM `' . $prefix . 'granary`'), 'Field');
if (!in_array('site', $columns)) \think\Db::execute('ALTER TABLE `' . $prefix . 'granary` ADD `site` varchar(16) NOT NULL DEFAULT \'\' COMMENT \'库区:center中心库,xishui习水库\' AFTER `storage`');
// Use bound SQL because this process may have cached the pre-migration fields.
foreach ($mapping as $id => $site) \think\Db::execute('UPDATE `' . $prefix . 'granary` SET site = ? WHERE id = ?', [$site, $id]);
$indexes = array_column(\think\Db::query('SHOW INDEX FROM `' . $prefix . 'granary`'), 'Key_name');
if (!in_array('uq_granary_site_num', $indexes)) \think\Db::execute('ALTER TABLE `' . $prefix . 'granary` ADD UNIQUE KEY `uq_granary_site_num` (`site`,`num`)');
$columns = array_column(\think\Db::query('SHOW COLUMNS FROM `' . $prefix . 'admin`'), 'Field');
if (!in_array('granary_sites', $columns)) \think\Db::execute('ALTER TABLE `' . $prefix . 'admin` ADD `granary_sites` varchar(16) NOT NULL DEFAULT \'all\' COMMENT \'库区权限:all/center/xishui/none\'');
foreach (['granary', 'admin'] as $table) {
$schema = RUNTIME_PATH . 'schema/' . config('database.database') . '.' . $prefix . $table . '.php';
if (is_file($schema)) {
copy($schema, $backup . '/' . $table . '-schema-before.php');
unlink($schema);
}
}
echo "GRANARY_SITES_READY\n";