diff --git a/scripts/world-db-from-base.sh b/scripts/world-db-from-base.sh new file mode 100755 index 0000000..84d7524 --- /dev/null +++ b/scripts/world-db-from-base.sh @@ -0,0 +1,66 @@ +#!/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."