Files
Fractured/scripts/world-db-from-base.sh
2026-05-09 00:59:49 -05:00

67 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# Rebuild acore_world from data/sql/base/db_world only (AzerothCore "shortcut"):
# the shipped base `updates` table already records archived migrations as applied,
# so worldserver only needs to run pending files under data/sql/updates/db_world
# (and your custom/pending paths if used).
#
# Usage:
# export MYSQL_PWD='...'
# ./scripts/world-db-from-base.sh -h 10.0.13.252 -u acore -D acore_world
#
# Requires: mysql client. Optional: pass --force to skip confirmation.
set -euo pipefail
usage() {
echo "Usage: $0 -h HOST -u USER -D DATABASE [--port PORT] [--force]" >&2
echo " Or set: MYSQL_HOST MYSQL_USER MYSQL_DATABASE [MYSQL_PWD in env]" >&2
exit 1
}
HOST="${MYSQL_HOST:-}"
USER="${MYSQL_USER:-}"
DBNAME="${MYSQL_DATABASE:-}"
PORT="${MYSQL_PORT:-3306}"
FORCE=0
while [[ $# -gt 0 ]]; do
case "$1" in
-h) HOST="$2"; shift 2 ;;
-u) USER="$2"; shift 2 ;;
-D) DBNAME="$2"; shift 2 ;;
--port) PORT="$2"; shift 2 ;;
--force) FORCE=1; shift ;;
*) usage ;;
esac
done
: "${HOST:?set -h or MYSQL_HOST}"
: "${USER:?set -u or MYSQL_USER}"
: "${DBNAME:?set -D or MYSQL_DATABASE}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
BASE_DIR="$REPO_ROOT/data/sql/base/db_world"
if [[ ! -d "$BASE_DIR" ]]; then
echo "Base directory not found: $BASE_DIR" >&2
exit 1
fi
if [[ "$FORCE" -ne 1 ]]; then
read -r -p "DESTROY database '$DBNAME' on $HOST and rebuild from base? [yes/no]: " ans
[[ "$ans" == "yes" ]] || { echo "Aborted."; exit 1; }
fi
MYSQL=(mysql -h "$HOST" -P "$PORT" -u "$USER" --protocol=tcp)
"${MYSQL[@]}" -e "DROP DATABASE IF EXISTS \`$DBNAME\`; CREATE DATABASE \`$DBNAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mapfile -t SQL_FILES < <(find "$BASE_DIR" -maxdepth 1 -name '*.sql' -printf '%f\n' | sort)
for f in "${SQL_FILES[@]}"; do
echo ">> $f"
"${MYSQL[@]}" "$DBNAME" <"$BASE_DIR/$f"
done
echo ">> Done. Start worldserver once; it should report World DB up-to-date or only apply updates/db_world."