mirror of
https://github.com/uprightbass360/AzerothCore-RealmMaster.git
synced 2026-02-05 11:53:50 +00:00
fix: character import updates
This commit is contained in:
133
backup-merge.sh
133
backup-merge.sh
@@ -24,6 +24,7 @@ BACKUP_DIR=""
|
|||||||
AUTH_DB="acore_auth"
|
AUTH_DB="acore_auth"
|
||||||
CHARACTERS_DB="acore_characters"
|
CHARACTERS_DB="acore_characters"
|
||||||
DRY_RUN=false
|
DRY_RUN=false
|
||||||
|
AUTO_CONFIRM=false
|
||||||
IMPORT_ACCOUNTS=()
|
IMPORT_ACCOUNTS=()
|
||||||
IMPORT_CHARACTERS=()
|
IMPORT_CHARACTERS=()
|
||||||
IMPORT_ALL_ACCOUNTS=false
|
IMPORT_ALL_ACCOUNTS=false
|
||||||
@@ -52,6 +53,7 @@ Options:
|
|||||||
--skip-conflicts Skip accounts/characters that already exist
|
--skip-conflicts Skip accounts/characters that already exist
|
||||||
--exclude-bots Exclude bot accounts/characters (RNDBOT*, playerbots)
|
--exclude-bots Exclude bot accounts/characters (RNDBOT*, playerbots)
|
||||||
--dry-run Show what would be imported without making changes
|
--dry-run Show what would be imported without making changes
|
||||||
|
--yes Skip confirmation prompt
|
||||||
-h, --help Show this help and exit
|
-h, --help Show this help and exit
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
@@ -123,6 +125,10 @@ while [[ $# -gt 0 ]]; do
|
|||||||
DRY_RUN=true
|
DRY_RUN=true
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
--yes)
|
||||||
|
AUTO_CONFIRM=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
-h|--help)
|
-h|--help)
|
||||||
usage
|
usage
|
||||||
exit 0
|
exit 0
|
||||||
@@ -516,6 +522,12 @@ EOF
|
|||||||
|
|
||||||
log "ID mapping tables created"
|
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
|
# Summary
|
||||||
info ""
|
info ""
|
||||||
info "═══════════════════════════════════════════════════════════"
|
info "═══════════════════════════════════════════════════════════"
|
||||||
@@ -545,12 +557,14 @@ if $DRY_RUN; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Confirmation prompt
|
# Confirmation prompt
|
||||||
info ""
|
if ! $AUTO_CONFIRM; then
|
||||||
read -p "Proceed with import? [y/N]: " -n 1 -r
|
info ""
|
||||||
echo
|
read -p "Proceed with import? [y/N]: " -n 1 -r
|
||||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
echo
|
||||||
warn "Import cancelled"
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
exit 0
|
warn "Import cancelled"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Import phase
|
# Import phase
|
||||||
@@ -569,7 +583,8 @@ if [[ $ACCOUNTS_TO_IMPORT -gt 0 ]]; then
|
|||||||
log "Importing $ACCOUNTS_TO_IMPORT account(s)..."
|
log "Importing $ACCOUNTS_TO_IMPORT account(s)..."
|
||||||
|
|
||||||
# Import main account table
|
# Import main account table
|
||||||
cat <<EOSQL | sed "s/STAGE_AUTH_DB/$STAGE_AUTH_DB/g" | mysql_exec "$AUTH_DB"
|
info " Importing main account table..."
|
||||||
|
ACCOUNT_SQL=$(cat <<EOSQL
|
||||||
INSERT INTO account (id, username, salt, verifier, session_key, totp_secret, email, reg_mail,
|
INSERT INTO account (id, username, salt, verifier, session_key, totp_secret, email, reg_mail,
|
||||||
joindate, last_ip, last_attempt_ip, failed_logins, locked, lock_country,
|
joindate, last_ip, last_attempt_ip, failed_logins, locked, lock_country,
|
||||||
last_login, online, expansion, Flags, mutetime, mutereason, muteby, locale,
|
last_login, online, expansion, Flags, mutetime, mutereason, muteby, locale,
|
||||||
@@ -603,21 +618,40 @@ SELECT
|
|||||||
FROM $STAGE_AUTH_DB.account a
|
FROM $STAGE_AUTH_DB.account a
|
||||||
INNER JOIN $STAGE_AUTH_DB.account_id_map m ON a.id = m.old_id;
|
INNER JOIN $STAGE_AUTH_DB.account_id_map m ON a.id = m.old_id;
|
||||||
EOSQL
|
EOSQL
|
||||||
|
)
|
||||||
|
ACCOUNT_SQL_EXPANDED=$(echo "$ACCOUNT_SQL" | sed "s/STAGE_AUTH_DB/$STAGE_AUTH_DB/g")
|
||||||
|
ACCOUNT_RESULT=$(echo "$ACCOUNT_SQL_EXPANDED" | docker exec -i ac-mysql mysql -uroot -p"$MYSQL_PW" "$AUTH_DB" 2>&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
|
# Import account_access
|
||||||
cat <<EOSQL | sed "s/STAGE_AUTH_DB/$STAGE_AUTH_DB/g" | mysql_exec "$AUTH_DB"
|
info " Importing account_access..."
|
||||||
|
ACCESS_SQL=$(cat <<EOSQL
|
||||||
INSERT INTO account_access (id, gmlevel, RealmID, comment)
|
INSERT INTO account_access (id, gmlevel, RealmID, comment)
|
||||||
SELECT
|
SELECT
|
||||||
m.new_id,
|
m.new_id,
|
||||||
aa.gmlevel,
|
aa.gmlevel,
|
||||||
aa.RealmID,
|
aa.RealmID,
|
||||||
aa.comment
|
aa.comment
|
||||||
FROM $STAGE_AUTH_DB.account_access aa
|
FROM STAGE_AUTH_DB.account_access aa
|
||||||
INNER JOIN $STAGE_AUTH_DB.account_id_map m ON aa.id = m.old_id;
|
INNER JOIN STAGE_AUTH_DB.account_id_map m ON aa.id = m.old_id;
|
||||||
EOSQL
|
EOSQL
|
||||||
|
)
|
||||||
|
ACCESS_SQL_EXPANDED=$(echo "$ACCESS_SQL" | sed "s/STAGE_AUTH_DB/$STAGE_AUTH_DB/g")
|
||||||
|
ACCESS_RESULT=$(echo "$ACCESS_SQL_EXPANDED" | docker exec -i ac-mysql mysql -uroot -p"$MYSQL_PW" "$AUTH_DB" 2>&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
|
# Import account_banned
|
||||||
cat <<EOSQL | sed "s/STAGE_AUTH_DB/$STAGE_AUTH_DB/g" | mysql_exec "$AUTH_DB"
|
info " Importing account_banned..."
|
||||||
|
BANNED_SQL=$(cat <<EOSQL
|
||||||
INSERT INTO account_banned (id, bandate, unbandate, bannedby, banreason, active)
|
INSERT INTO account_banned (id, bandate, unbandate, bannedby, banreason, active)
|
||||||
SELECT
|
SELECT
|
||||||
m.new_id,
|
m.new_id,
|
||||||
@@ -626,12 +660,21 @@ SELECT
|
|||||||
ab.bannedby,
|
ab.bannedby,
|
||||||
ab.banreason,
|
ab.banreason,
|
||||||
ab.active
|
ab.active
|
||||||
FROM $STAGE_AUTH_DB.account_banned ab
|
FROM STAGE_AUTH_DB.account_banned ab
|
||||||
INNER JOIN $STAGE_AUTH_DB.account_id_map m ON ab.id = m.old_id;
|
INNER JOIN STAGE_AUTH_DB.account_id_map m ON ab.id = m.old_id;
|
||||||
EOSQL
|
EOSQL
|
||||||
|
)
|
||||||
|
BANNED_SQL_EXPANDED=$(echo "$BANNED_SQL" | sed "s/STAGE_AUTH_DB/$STAGE_AUTH_DB/g")
|
||||||
|
BANNED_RESULT=$(echo "$BANNED_SQL_EXPANDED" | docker exec -i ac-mysql mysql -uroot -p"$MYSQL_PW" "$AUTH_DB" 2>&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
|
# Import account_muted
|
||||||
cat <<EOSQL | sed "s/STAGE_AUTH_DB/$STAGE_AUTH_DB/g" | mysql_exec "$AUTH_DB"
|
info " Importing account_muted..."
|
||||||
|
MUTED_SQL=$(cat <<EOSQL
|
||||||
INSERT INTO account_muted (guid, mutedate, mutetime, mutedby, mutereason)
|
INSERT INTO account_muted (guid, mutedate, mutetime, mutedby, mutereason)
|
||||||
SELECT
|
SELECT
|
||||||
m.new_id,
|
m.new_id,
|
||||||
@@ -639,9 +682,17 @@ SELECT
|
|||||||
am.mutetime,
|
am.mutetime,
|
||||||
am.mutedby,
|
am.mutedby,
|
||||||
am.mutereason
|
am.mutereason
|
||||||
FROM $STAGE_AUTH_DB.account_muted am
|
FROM STAGE_AUTH_DB.account_muted am
|
||||||
INNER JOIN $STAGE_AUTH_DB.account_id_map m ON am.guid = m.old_id;
|
INNER JOIN STAGE_AUTH_DB.account_id_map m ON am.guid = m.old_id;
|
||||||
EOSQL
|
EOSQL
|
||||||
|
)
|
||||||
|
MUTED_SQL_EXPANDED=$(echo "$MUTED_SQL" | sed "s/STAGE_AUTH_DB/$STAGE_AUTH_DB/g")
|
||||||
|
MUTED_RESULT=$(echo "$MUTED_SQL_EXPANDED" | docker exec -i ac-mysql mysql -uroot -p"$MYSQL_PW" "$AUTH_DB" 2>&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"
|
log "✓ Accounts imported successfully"
|
||||||
fi
|
fi
|
||||||
@@ -686,7 +737,7 @@ ON DUPLICATE KEY UPDATE tut0=VALUES(tut0), tut1=VALUES(tut1), tut2=VALUES(tut2),
|
|||||||
EOSQL
|
EOSQL
|
||||||
|
|
||||||
# Import main characters table
|
# Import main characters table
|
||||||
cat <<EOSQL | sed "s/STAGE_AUTH_DB/$STAGE_AUTH_DB/g; s/STAGE_CHARS_DB/$STAGE_CHARS_DB/g" | mysql_exec "$CHARACTERS_DB"
|
CHAR_SQL=$(cat <<EOSQL
|
||||||
INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face,
|
INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face,
|
||||||
hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags,
|
hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags,
|
||||||
position_x, position_y, position_z, map, instance_id, instance_mode_mask,
|
position_x, position_y, position_z, map, instance_id, instance_mode_mask,
|
||||||
@@ -785,13 +836,23 @@ FROM $STAGE_CHARS_DB.characters c
|
|||||||
INNER JOIN $STAGE_CHARS_DB.character_guid_map cm ON c.guid = cm.old_guid
|
INNER JOIN $STAGE_CHARS_DB.character_guid_map cm ON c.guid = cm.old_guid
|
||||||
INNER JOIN $STAGE_AUTH_DB.account_id_map am ON c.account = am.old_id;
|
INNER JOIN $STAGE_AUTH_DB.account_id_map am ON c.account = am.old_id;
|
||||||
EOSQL
|
EOSQL
|
||||||
|
)
|
||||||
|
CHAR_SQL_EXPANDED=$(echo "$CHAR_SQL" | sed "s/STAGE_AUTH_DB/$STAGE_AUTH_DB/g; s/STAGE_CHARS_DB/$STAGE_CHARS_DB/g")
|
||||||
|
CHAR_RESULT=$(echo "$CHAR_SQL_EXPANDED" | docker exec -i ac-mysql mysql -uroot -p"$MYSQL_PW" "$CHARACTERS_DB" 2>&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"
|
log "✓ Main character data imported"
|
||||||
|
|
||||||
# Import items
|
# Import items
|
||||||
log "Importing character items..."
|
log "Importing character items..."
|
||||||
|
|
||||||
cat <<EOSQL | sed "s/STAGE_CHARS_DB/$STAGE_CHARS_DB/g" | mysql_exec "$CHARACTERS_DB"
|
ITEM_SQL=$(cat <<EOSQL
|
||||||
INSERT INTO item_instance (guid, itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count,
|
INSERT INTO item_instance (guid, itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count,
|
||||||
duration, charges, flags, enchantments, randomPropertyId, durability,
|
duration, charges, flags, enchantments, randomPropertyId, durability,
|
||||||
playedTime, text)
|
playedTime, text)
|
||||||
@@ -814,8 +875,14 @@ FROM $STAGE_CHARS_DB.item_instance ii
|
|||||||
INNER JOIN $STAGE_CHARS_DB.item_guid_map im ON ii.guid = im.old_guid
|
INNER JOIN $STAGE_CHARS_DB.item_guid_map im ON ii.guid = im.old_guid
|
||||||
INNER JOIN $STAGE_CHARS_DB.character_guid_map cm ON ii.owner_guid = cm.old_guid;
|
INNER JOIN $STAGE_CHARS_DB.character_guid_map cm ON ii.owner_guid = cm.old_guid;
|
||||||
EOSQL
|
EOSQL
|
||||||
|
)
|
||||||
|
ITEM_SQL_EXPANDED=$(echo "$ITEM_SQL" | sed "s/STAGE_CHARS_DB/$STAGE_CHARS_DB/g")
|
||||||
|
ITEM_COUNT=$(echo "$ITEM_SQL_EXPANDED" | docker exec -i ac-mysql mysql -uroot -p"$MYSQL_PW" "$CHARACTERS_DB" 2>&1 | tee /dev/stderr | grep -c "ERROR" || echo "0")
|
||||||
|
if [[ "$ITEM_COUNT" != "0" ]]; then
|
||||||
|
warn " Warning: Errors occurred during item_instance import"
|
||||||
|
fi
|
||||||
|
|
||||||
cat <<EOSQL | sed "s/STAGE_CHARS_DB/$STAGE_CHARS_DB/g" | mysql_exec "$CHARACTERS_DB"
|
INV_SQL=$(cat <<EOSQL
|
||||||
INSERT INTO character_inventory (guid, bag, slot, item)
|
INSERT INTO character_inventory (guid, bag, slot, item)
|
||||||
SELECT
|
SELECT
|
||||||
cm.new_guid,
|
cm.new_guid,
|
||||||
@@ -826,6 +893,18 @@ FROM $STAGE_CHARS_DB.character_inventory ci
|
|||||||
INNER JOIN $STAGE_CHARS_DB.character_guid_map cm ON ci.guid = cm.old_guid
|
INNER JOIN $STAGE_CHARS_DB.character_guid_map cm ON ci.guid = cm.old_guid
|
||||||
INNER JOIN $STAGE_CHARS_DB.item_guid_map im ON ci.item = im.old_guid;
|
INNER JOIN $STAGE_CHARS_DB.item_guid_map im ON ci.item = im.old_guid;
|
||||||
EOSQL
|
EOSQL
|
||||||
|
)
|
||||||
|
INV_SQL_EXPANDED=$(echo "$INV_SQL" | sed "s/STAGE_CHARS_DB/$STAGE_CHARS_DB/g")
|
||||||
|
INV_COUNT=$(echo "$INV_SQL_EXPANDED" | docker exec -i ac-mysql mysql -uroot -p"$MYSQL_PW" "$CHARACTERS_DB" 2>&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"
|
log "✓ Items imported"
|
||||||
|
|
||||||
@@ -898,12 +977,16 @@ EOSQL
|
|||||||
select_list=$(echo "$columns" | sed 's/\bguid\b/cm.new_guid/g')
|
select_list=$(echo "$columns" | sed 's/\bguid\b/cm.new_guid/g')
|
||||||
|
|
||||||
# Import with guid remapping
|
# Import with guid remapping
|
||||||
cat <<EOSQL | sed "s/STAGE_CHARS_DB/$STAGE_CHARS_DB/g" | mysql_exec "$CHARACTERS_DB" 2>/dev/null || warn " Warning: Could not import $table"
|
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;"
|
||||||
INSERT IGNORE INTO $table ($columns)
|
PROG_SQL_EXPANDED=$(echo "$PROG_SQL" | sed "s/STAGE_CHARS_DB/$STAGE_CHARS_DB/g")
|
||||||
SELECT $select_list
|
PROG_RESULT=$(echo "$PROG_SQL_EXPANDED" | docker exec -i ac-mysql mysql -uroot -p"$MYSQL_PW" "$CHARACTERS_DB" 2>&1)
|
||||||
FROM $STAGE_CHARS_DB.$table t
|
if echo "$PROG_RESULT" | grep -q "ERROR"; then
|
||||||
INNER JOIN $STAGE_CHARS_DB.character_guid_map cm ON t.guid = cm.old_guid;
|
warn " Warning: Errors importing $table:"
|
||||||
EOSQL
|
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
|
done
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user