diff --git a/backup-merge.sh b/backup-merge.sh index 3771cc3..725ee8a 100755 --- a/backup-merge.sh +++ b/backup-merge.sh @@ -24,6 +24,7 @@ BACKUP_DIR="" AUTH_DB="acore_auth" CHARACTERS_DB="acore_characters" DRY_RUN=false +AUTO_CONFIRM=false IMPORT_ACCOUNTS=() IMPORT_CHARACTERS=() IMPORT_ALL_ACCOUNTS=false @@ -52,6 +53,7 @@ Options: --skip-conflicts Skip accounts/characters that already exist --exclude-bots Exclude bot accounts/characters (RNDBOT*, playerbots) --dry-run Show what would be imported without making changes + --yes Skip confirmation prompt -h, --help Show this help and exit Examples: @@ -123,6 +125,10 @@ while [[ $# -gt 0 ]]; do DRY_RUN=true shift ;; + --yes) + AUTO_CONFIRM=true + shift + ;; -h|--help) usage exit 0 @@ -516,6 +522,12 @@ EOF log "ID mapping tables created" +# Debug: Show mapping table counts +CHAR_MAP_COUNT=$(mysql_query "$STAGE_CHARS_DB" "SELECT COUNT(*) FROM character_guid_map;") +ITEM_MAP_COUNT=$(mysql_query "$STAGE_CHARS_DB" "SELECT COUNT(*) FROM item_guid_map;") +info " Character mappings created: $CHAR_MAP_COUNT" +info " Item mappings created: $ITEM_MAP_COUNT" + # Summary info "" info "═══════════════════════════════════════════════════════════" @@ -545,12 +557,14 @@ if $DRY_RUN; then fi # Confirmation prompt -info "" -read -p "Proceed with import? [y/N]: " -n 1 -r -echo -if [[ ! $REPLY =~ ^[Yy]$ ]]; then - warn "Import cancelled" - exit 0 +if ! $AUTO_CONFIRM; then + info "" + read -p "Proceed with import? [y/N]: " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + warn "Import cancelled" + exit 0 + fi fi # Import phase @@ -569,7 +583,8 @@ if [[ $ACCOUNTS_TO_IMPORT -gt 0 ]]; then log "Importing $ACCOUNTS_TO_IMPORT account(s)..." # Import main account table - cat <&1 || true) + if echo "$ACCOUNT_RESULT" | grep -q "ERROR"; then + err " ✗ Account import failed:" + echo "$ACCOUNT_RESULT" | grep "ERROR" >&2 + fatal "Account import failed. Check errors above." + fi + info " ✓ Main account table imported" # Import account_access - cat <&1 || true) + if echo "$ACCESS_RESULT" | grep -q "ERROR"; then + err " ✗ account_access import failed:" + echo "$ACCESS_RESULT" | grep "ERROR" >&2 + fi + info " ✓ account_access imported" # Import account_banned - cat <&1 || true) + if echo "$BANNED_RESULT" | grep -q "ERROR"; then + err " ✗ account_banned import failed:" + echo "$BANNED_RESULT" | grep "ERROR" >&2 + fi + info " ✓ account_banned imported" # Import account_muted - cat <&1 || true) + if echo "$MUTED_RESULT" | grep -q "ERROR"; then + err " ✗ account_muted import failed:" + echo "$MUTED_RESULT" | grep "ERROR" >&2 + fi + info " ✓ account_muted imported" log "✓ Accounts imported successfully" fi @@ -686,7 +737,7 @@ ON DUPLICATE KEY UPDATE tut0=VALUES(tut0), tut1=VALUES(tut1), tut2=VALUES(tut2), EOSQL # Import main characters table - cat <&1 | tee /tmp/char-import-result.log) + if echo "$CHAR_RESULT" | grep -q "ERROR"; then + err "✗ Character import failed with errors:" + echo "$CHAR_RESULT" >&2 + fatal "Character import SQL failed. See /tmp/char-import-result.log for details." + fi + CHARS_IMPORTED=$(mysql_query "$CHARACTERS_DB" "SELECT COUNT(*) FROM characters WHERE account IN (101, 102);") + info " Characters imported: $CHARS_IMPORTED" log "✓ Main character data imported" # Import items log "Importing character items..." - cat <&1 | tee /dev/stderr | grep -c "ERROR" || echo "0") + if [[ "$ITEM_COUNT" != "0" ]]; then + warn " Warning: Errors occurred during item_instance import" + fi - cat <&1 | tee /dev/stderr | grep -c "ERROR" || echo "0") + if [[ "$INV_COUNT" != "0" ]]; then + warn " Warning: Errors occurred during character_inventory import" + fi + + # Report counts + ITEMS_IMPORTED=$(mysql_query "$CHARACTERS_DB" "SELECT COUNT(*) FROM item_instance WHERE owner_guid IN (SELECT new_guid FROM $STAGE_CHARS_DB.character_guid_map);") + INV_IMPORTED=$(mysql_query "$CHARACTERS_DB" "SELECT COUNT(*) FROM character_inventory WHERE guid IN (SELECT new_guid FROM $STAGE_CHARS_DB.character_guid_map);") + info " Items imported: $ITEMS_IMPORTED" + info " Inventory slots imported: $INV_IMPORTED" log "✓ Items imported" @@ -898,12 +977,16 @@ EOSQL select_list=$(echo "$columns" | sed 's/\bguid\b/cm.new_guid/g') # Import with guid remapping - cat </dev/null || warn " Warning: Could not import $table" -INSERT IGNORE INTO $table ($columns) -SELECT $select_list -FROM $STAGE_CHARS_DB.$table t -INNER JOIN $STAGE_CHARS_DB.character_guid_map cm ON t.guid = cm.old_guid; -EOSQL + PROG_SQL="INSERT IGNORE INTO $table ($columns) SELECT $select_list FROM $STAGE_CHARS_DB.$table t INNER JOIN $STAGE_CHARS_DB.character_guid_map cm ON t.guid = cm.old_guid;" + PROG_SQL_EXPANDED=$(echo "$PROG_SQL" | sed "s/STAGE_CHARS_DB/$STAGE_CHARS_DB/g") + PROG_RESULT=$(echo "$PROG_SQL_EXPANDED" | docker exec -i ac-mysql mysql -uroot -p"$MYSQL_PW" "$CHARACTERS_DB" 2>&1) + if echo "$PROG_RESULT" | grep -q "ERROR"; then + warn " Warning: Errors importing $table:" + echo "$PROG_RESULT" | grep "ERROR" >&2 + else + ROWS_IMPORTED=$(mysql_query "$CHARACTERS_DB" "SELECT COUNT(*) FROM $table WHERE guid IN (SELECT new_guid FROM $STAGE_CHARS_DB.character_guid_map);") + info " $table: $ROWS_IMPORTED rows" + fi done