summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorKitzunu <24550914+Kitzunu@users.noreply.github.com>2025-06-28 16:17:48 +0200
committerGitHub <noreply@github.com>2025-06-28 16:17:48 +0200
commitf4e049f227be7c6c610534bd3daf4dc9b1d889bc (patch)
tree2054d911ca8873482e1cb50218bb75557e4d7a92 /apps
parent969e0275a9f55c40585e8c86d05735f469d53456 (diff)
refactor(db-scripts): replace PowerShell database tools with Bash scripts and update documentation (#22372)
* closes https://github.com/azerothcore/azerothcore-wotlk/issues/4343 This pull request replaces the PowerShell implementation of the AzerothCore database export and squash tools with Bash scripts, streamlining the process and improving compatibility. It also updates the documentation to reflect these changes. The most important changes include the creation of new Bash scripts for exporting databases, squashing databases, and updating versions, as well as the removal of the previous PowerShell script and its associated documentation. ### Script Replacement and Enhancements: * [`apps/DatabaseSquash/DatabaseExporter/DatabaseExporter.sh`](diffhunk://#diff-af0bd252ac095aaad91b842c75b60a689792e6dc9ce88f5e2e4b6f68acf84dcaR1-R69): Introduced a Bash script to replace the PowerShell implementation for exporting database tables, with added features such as formatted SQL output and dynamic directory creation. * [`apps/DatabaseSquash/DatabaseSquash.sh`](diffhunk://#diff-79ff4f749c045a7d91e9b43aefb5d6fbebdc5fdfb430fbcba329e4d96d71a4fbR1-R52): Added a Bash script to automate the database squash process, integrating the version updater and database exporter tools. * [`apps/DatabaseSquash/VersionUpdater/VersionUpdater.sh`](diffhunk://#diff-3abc69c645cb80aff30824739e317c9e847e743eeab15ab4825951d10179b265R1-R84): Created a Bash script for automatically updating the version in `acore.json` and generating SQL update files with proper versioning. ### Documentation Updates: * [`apps/DatabaseSquash/DatabaseExporter/databaseexporter.md`](diffhunk://#diff-b2b291286f2b900a022474f00754ebfe78410780c010d46752335a372d688aefR1-R16): Rewritten documentation to reflect the usage of the new Bash script for database exporting. * [`apps/DatabaseSquash/VersionUpdater/versionupdater.md`](diffhunk://#diff-f12e21f8a404957c90d9120cf9df0724ff27a7efdb5de0798d974079cfe8adadR1-R10): Added documentation for the new version updater tool, explaining its functionality and usage. * [`apps/DatabaseSquash/databasesquash.md`](diffhunk://#diff-4a559f6e7404b529714bac65ad22744feb7b9f88343864a20e0a46974233767eR1-R11): Documented the overall database squash tool, detailing its integration of the version updater and database exporter scripts. ### Removal of Legacy Code: * [`apps/DatabaseExporter/DatabaseExporter.ps1`](diffhunk://#diff-2b4e49f704d88a372b5160c7278839668c81dbecaf52a4edd327873e30b9ae70L1-L234): Removed the PowerShell script for database exporting, along with its associated functionality and settings. * [`apps/DatabaseExporter/databaseexporter.md`](diffhunk://#diff-0618d62def0d611be6e0d4fc524df6f702f493cb87870d9382402aaf52f484e8L1-L85): Deleted outdated documentation for the PowerShell-based database exporter tool.
Diffstat (limited to 'apps')
-rw-r--r--apps/DatabaseExporter/DatabaseExporter.ps1234
-rw-r--r--apps/DatabaseExporter/databaseexporter.md85
-rw-r--r--apps/DatabaseSquash/DatabaseExporter/DatabaseExporter.sh69
-rw-r--r--apps/DatabaseSquash/DatabaseExporter/databaseexporter.md16
-rw-r--r--apps/DatabaseSquash/DatabaseSquash.sh52
-rw-r--r--apps/DatabaseSquash/VersionUpdater/VersionUpdater.sh84
-rw-r--r--apps/DatabaseSquash/VersionUpdater/versionupdater.md10
-rw-r--r--apps/DatabaseSquash/databasesquash.md11
-rw-r--r--apps/VersionUpdater/VersionUpdater.ps1132
-rw-r--r--apps/VersionUpdater/versionupdater.md53
-rw-r--r--apps/db_exporter/.gitignore1
-rw-r--r--apps/db_exporter/README.md12
-rw-r--r--apps/db_exporter/db_export.sh52
13 files changed, 242 insertions, 569 deletions
diff --git a/apps/DatabaseExporter/DatabaseExporter.ps1 b/apps/DatabaseExporter/DatabaseExporter.ps1
deleted file mode 100644
index 2ac987b0e3..0000000000
--- a/apps/DatabaseExporter/DatabaseExporter.ps1
+++ /dev/null
@@ -1,234 +0,0 @@
-########################################################################################
-# SETTINGS #
-########################################################################################
-$mysql_host = "127.0.0.1"
-$mysql_user = "export"
-$mysql_password = "export"
-$mysql_database_auth = "acore_auth"
-$mysql_database_characters = "acore_characters"
-$mysql_database_world = "acore_world"
-########################################################################################
-# SETTINGS END #
-########################################################################################
-
-# Set MySQL password as temporary env var
-$env:MYSQL_PWD = $mysql_password
-
-# Get the directory to sql\base directory
-$scriptDirectory = $PSScriptRoot
-$relativePath = "..\..\data\sql\base"
-$combinedPath = Join-Path -Path $scriptDirectory -ChildPath $relativePath
-$fullPath = Resolve-Path -Path $combinedPath
-
-# Define the output directory (using database name)
-$output_directory_auth = "$fullPath\db_auth"
-$output_directory_characters = "$fullPath\db_characters"
-$output_directory_world = "$fullPath\db_world"
-
-Write-Host " ___ _ _ ___ "
-Write-Host "/ \ ___ ___ _ _ ___ | |_ | |_ / __| ___ _ _ ___ "
-Write-Host "| - ||_ // -_)| '_|/ _ \| _|| \ | (__ / _ \| '_|/ -_)"
-Write-Host "|_|_|/__|\___||_| \___/ \__||_||_| \___|\___/|_| \___|"
-Write-Host "AzerothCore 3.3.5a - www.azerothcore.org"
-Write-Host ""
-Write-Host "Welcome to the AzerothCore Database Exporter for database squashes!"
-Write-Host ""
-Write-Host "You have configured:"
-Write-Host "Database Auth: '$mysql_database_auth'"
-Write-Host "Database Characters: '$mysql_database_characters'"
-Write-Host "Database World: '$mysql_database_world'"
-Write-Host "Output Dir Auth: '$output_directory_auth'"
-Write-Host "Output Dir Characters: '$output_directory_characters'"
-Write-Host "Output Dir World: '$output_directory_world'"
-Write-Host ""
-Write-Host "Make sure you read the entire process before you continue."
-Write-Host "https://github.com/azerothcore/azerothcore-wotlk/blob/master/data/sql/base/database-squash.md"
-Write-Host "https://github.com/azerothcore/azerothcore-wotlk/blob/master/apps/DatabaseExporter/databaseexporter.md"
-Write-Host ""
-
-# Check if the user wants to continue using the tool
-do {
- $confirmation = Read-Host "Do you want to continue using the tool? (Y/N)"
-
- if ($confirmation -eq 'Y' -or $confirmation -eq 'y') {
- # Continue the script
- Write-Host "AzerothCore Database Exporter starts."
- $continue = $true
- }
- elseif ($confirmation -eq 'N' -or $confirmation -eq 'n') {
- # Exit the script
- Write-Host "Exiting the AzerothCore Database Exporter."
- exit
- }
- else {
- Write-Host "Invalid input. Please enter Y or N."
- $continue = $null
- }
-} while ($continue -eq $null)
-
-# Remove the output directory if it exist
-if (Test-Path $output_directory_auth) {
- Remove-Item -Path $output_directory_auth -Recurse -Force
- Write-Host "Deleted directory $output_directory_auth"
-}
-if (Test-Path $output_directory_characters) {
- Remove-Item -Path $output_directory_characters -Recurse -Force
- Write-Host "Deleted directory $output_directory_characters"
-}
-if (Test-Path $output_directory_world) {
- Remove-Item -Path $output_directory_world -Recurse -Force
- Write-Host "Deleted directory $output_directory_world"
-}
-
-# Create the output directory if it doesn't exist
-if (-not (Test-Path -Path $output_directory_auth)) {
- New-Item -ItemType Directory -Force -Path $output_directory_auth
- Write-Host "Created directory $output_directory_auth"
-}
-if (-not (Test-Path -Path $output_directory_characters)) {
- New-Item -ItemType Directory -Force -Path $output_directory_characters
- Write-Host "Created directory $output_directory_characters"
-}
-if (-not (Test-Path -Path $output_directory_world)) {
- New-Item -ItemType Directory -Force -Path $output_directory_world
- Write-Host "Created directory $output_directory_world"
-}
-
-# Fix for dumping TIMESTAMP data
-$timezone = "+01:00"
-$mysqlCommand = "SET time_zone = '$timezone';"
-$mysqlExec = "mysql -h $mysql_host -u $mysql_user -p$mysql_password -e `"$mysqlCommand`""
-Invoke-Expression -Command $mysqlExec
-
-# PS script uses non-utf-8 encoding by default
-# https://stackoverflow.com/a/58438716
-# Save the current encoding and switch to UTF-8.
-$prev = [Console]::OutputEncoding
-[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
-
-Write-Host ""
-Write-Host "#########################################################"
-Write-Host "EXPORT AUTH DATABASE START"
-Write-Host "#########################################################"
-Write-Host ""
-Write-Host "Please enter your password for user '$mysql_user'"
-
-# Export Auth Database
-# Connect to MySQL and get all the tables
-$tables_auth = mysql -h $mysql_host -u $mysql_user -D $mysql_database_auth -e "SHOW TABLES;" | Select-Object -Skip 1
-# Iterate through each table and export both the structure and contents into the same SQL file
-foreach ($table in $tables_auth) {
- # Define the output file path for this table
- $output_file = "$output_directory_auth\$table.sql"
-
- # Clear the content of the output file if it exists, or create a new one
- if (Test-Path $output_file) {
- Clear-Content -Path $output_file
- }
-
- # Export the table structure (CREATE TABLE) and table data (INSERT) to the SQL file
- $create_table_command = "mysqldump -h $mysql_host -u $mysql_user --skip-tz-utc $mysql_database_auth $table"
- $create_table_output = Invoke-Expression -Command $create_table_command
- # write file with utf-8 encoding
- # https://stackoverflow.com/a/32951824
- [IO.File]::WriteAllLines($output_file, $create_table_output)
-
- # Format the INSERT values to be on seperate lines.
- $content = Get-Content -Raw $output_file
- $formattedContent = $content -replace 'VALUES \(', "VALUES`r`n("
- $formattedContent = $formattedContent -replace '\),', "),`r`n"
- $formattedContent | Set-Content $output_file
-
- Write-Host "Exported structure and data for table $table to $output_file"
-}
-
-Write-Host ""
-Write-Host "#########################################################"
-Write-Host "EXPORT AUTH DATABASE END"
-Write-Host "#########################################################"
-Write-Host ""
-Write-Host "#########################################################"
-Write-Host "EXPORT CHARACTERS DATABASE START"
-Write-Host "#########################################################"
-Write-Host ""
-Write-Host "Please enter your password for user '$mysql_user'"
-
-# Export Characters Database
-# Connect to MySQL and get all the tables
-$tables_characters = mysql -h $mysql_host -u $mysql_user -D $mysql_database_characters -e "SHOW TABLES;" | Select-Object -Skip 1
-# Iterate through each table and export both the structure and contents into the same SQL file
-foreach ($table in $tables_characters) {
- # Define the output file path for this table
- $output_file = "$output_directory_characters\$table.sql"
-
- # Clear the content of the output file if it exists, or create a new one
- if (Test-Path $output_file) {
- Clear-Content -Path $output_file
- }
-
- # Export the table structure (CREATE TABLE) and table data (INSERT) to the SQL file
- $create_table_command = "mysqldump -h $mysql_host -u $mysql_user --skip-tz-utc $mysql_database_characters $table"
- $create_table_output = Invoke-Expression -Command $create_table_command
- # write file with utf-8 encoding
- # https://stackoverflow.com/a/32951824
- [IO.File]::WriteAllLines($output_file, $create_table_output)
-
- # Format the INSERT values to be on seperate lines.
- $content = Get-Content -Raw $output_file
- $formattedContent = $content -replace 'VALUES \(', "VALUES`r`n("
- $formattedContent = $formattedContent -replace '\),', "),`r`n"
- $formattedContent | Set-Content $output_file
-
- Write-Host "Exported structure and data for table $table to $output_file"
-}
-
-Write-Host ""
-Write-Host "#########################################################"
-Write-Host "EXPORT CHARACTERS DATABASE END"
-Write-Host "#########################################################"
-Write-Host ""
-Write-Host "#########################################################"
-Write-Host "EXPORT WORLD DATABASE START"
-Write-Host "#########################################################"
-Write-Host ""
-Write-Host "Please enter your password for user '$mysql_user'"
-
-# Export World Database
-# Connect to MySQL and get all the tables
-$tables_world = mysql -h $mysql_host -u $mysql_user -D $mysql_database_world -e "SHOW TABLES;" | Select-Object -Skip 1
-# Iterate through each table and export both the structure and contents into the same SQL file
-foreach ($table in $tables_world) {
- # Define the output file path for this table
- $output_file = "$output_directory_world\$table.sql"
-
- # Clear the content of the output file if it exists, or create a new one
- if (Test-Path $output_file) {
- Clear-Content -Path $output_file
- }
-
- # Export the table structure (CREATE TABLE) and table data (INSERT) to the SQL file
- $create_table_command = "mysqldump -h $mysql_host -u $mysql_user --skip-tz-utc $mysql_database_world $table"
- $create_table_output = Invoke-Expression -Command $create_table_command
- # write file with utf-8 encoding
- # https://stackoverflow.com/a/32951824
- [IO.File]::WriteAllLines($output_file, $create_table_output)
-
- # Format the INSERT values to be on seperate lines.
- $content = Get-Content -Raw $output_file
- $formattedContent = $content -replace 'VALUES \(', "VALUES`r`n("
- $formattedContent = $formattedContent -replace '\),', "),`r`n"
- $formattedContent | Set-Content $output_file
-
- Write-Host "Exported structure and data for table $table to $output_file"
-}
-
-Write-Host ""
-Write-Host "#########################################################"
-Write-Host "EXPORT WORLD DATABASE END"
-Write-Host "#########################################################"
-Write-Host ""
-Write-Host "Database Exporter completed."
-Write-Host "Have a nice day :)"
-
-# Restore the previous encoding.
-[Console]::OutputEncoding = $prev
diff --git a/apps/DatabaseExporter/databaseexporter.md b/apps/DatabaseExporter/databaseexporter.md
deleted file mode 100644
index 83e966147b..0000000000
--- a/apps/DatabaseExporter/databaseexporter.md
+++ /dev/null
@@ -1,85 +0,0 @@
-# The AzerothCore Database Exporter for Database Squashes
-
-> [!CAUTION]
-> These steps are only for project maintainers who intend to update base files.
-
-## Manual setting updates
-
-Update the settings in `DatabaseExporter.ps1` to reflect your setup by opening it with your preffered text editor.
-
-> [!NOTE]
-> Only update the settings within the SETTINGS block.
-
-These are the default settings:
-```ps
-########################################################################################
-# SETTINGS #
-########################################################################################
-$mysql_host = "127.0.0.1"
-$mysql_user = "export"
-$mysql_password = "export"
-$mysql_database_auth = "acore_auth"
-$mysql_database_characters = "acore_characters"
-$mysql_database_world = "acore_world"
-########################################################################################
-# SETTINGS END #
-########################################################################################
-```
-
-## Description of the tool
-
-This tool updates the base files automatically. Hence, it must run from this directory.
-
-This is how it works step-by-step:
-
-1. Check that all paths look correct.
-2. Accept to continue using the tool.
-3. The tool will delete the `db_auth` `db_characters` `db_world` directories in `..\..\data\sql\base\`
-4. The tool will create the `db_auth` `db_characters` `db_world` directories in `..\..\data\sql\base\`
-5. The tool will export the `db_auth` table into `..\..\data\sql\base\db_auth\`
-6. The tool will export the `db_characters` table into `..\..\data\sql\base\db_characters\`
-7. The tool will export the `db_world` table into `..\..\data\sql\base\db_world\`
-
-## Run the tool
-
-> [!IMPORTANT]
-> This tool CAN NOT be moved outside this directory. If you do it will create files in the wrong places.
-
-1. Make sure you have MySQL installed on your system and that the mysqldump tool is accessible by your PATH system variable. If it is not set you will encounter errors.
-
- - Go into System Variables
- - Open the PATH variable
- - Add the path to your $\MySQL Server\bin\ - e.g. C:\Program Files\MySQL\MySQL Server 8.4\bin\
-
-2. If you haven't run PowerShell scripts before, you'll need to adjust the execution policy.
-
- - Open PowerShell as an Administrator.
- - Run the following command to allow running scripts:
- ```ps
- Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
- ```
- - This allows scripts to run on your system, but they need to be locally created or downloaded from trusted sources.
-
-3. Open PowerShell (PS)
-
- - Press Win + X and select Windows PowerShell (Admin) / Terminal (Admin)
-
-4. Navigate to the script
-
- - In PS, use the `cd` command to change the directory
- ```ps
- cd "C:\AzerothCore\apps\DatabaseExporter"
- ```
-
-5. Run the script
-
- - In PS, run the script
- ```ps
- .\DatabaseExporter.ps1
- ```
-
-6. Follow the instructions given by the tool.
-
-7. Now refer back to the database-squash.md instructions. (Located in ..\..\data\sql\base\)
-
-Completed :)
diff --git a/apps/DatabaseSquash/DatabaseExporter/DatabaseExporter.sh b/apps/DatabaseSquash/DatabaseExporter/DatabaseExporter.sh
new file mode 100644
index 0000000000..8d7162f6f3
--- /dev/null
+++ b/apps/DatabaseSquash/DatabaseExporter/DatabaseExporter.sh
@@ -0,0 +1,69 @@
+#!/bin/bash
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
+
+if [[ "$PROJECT_ROOT" =~ ^/([a-zA-Z])/(.*) ]]; then
+ DRIVE_LETTER="${BASH_REMATCH[1]}"
+ PATH_REMAINDER="${BASH_REMATCH[2]}"
+ PROJECT_ROOT="${DRIVE_LETTER^^}:/${PATH_REMAINDER}"
+fi
+
+BASE_OUTPUT_DIR="$PROJECT_ROOT/data/sql/base"
+
+read -p "Enter MySQL username: " DB_USER
+read -p "Enter MySQL password: " DB_PASS
+read -p "Enter MySQL host (default: localhost): " DB_HOST
+DB_HOST=${DB_HOST:-localhost}
+read -p "Enter MySQL port (default: 3306): " DB_PORT
+DB_PORT=${DB_PORT:-3306}
+
+# Prompt for database names
+read -p "Enter name of Auth database [default: acore_auth]: " DB_AUTH
+DB_AUTH=${DB_AUTH:-acore_auth}
+read -p "Enter name of Characters database [default: acore_characters]: " DB_CHARACTERS
+DB_CHARACTERS=${DB_CHARACTERS:-acore_characters}
+read -p "Enter name of World database [default: acore_world]: " DB_WORLD
+DB_WORLD=${DB_WORLD:-acore_world}
+
+# Mapping for folder names
+declare -A DB_MAP=(
+ ["$DB_AUTH"]="db_auth"
+ ["$DB_CHARACTERS"]="db_characters"
+ ["$DB_WORLD"]="db_world"
+)
+
+# Dump each database
+for DB_NAME in "${!DB_MAP[@]}"; do
+ FOLDER_NAME="${DB_MAP[$DB_NAME]}"
+ echo "📦 Dumping database '$DB_NAME' into folder '$FOLDER_NAME'"
+ echo "$BASE_OUTPUT_DIR/$FOLDER_NAME"
+ mkdir -p "$BASE_OUTPUT_DIR/$FOLDER_NAME"
+
+ TABLES=$(mysql -u "$DB_USER" -p"$DB_PASS" -h "$DB_HOST" -P "$DB_PORT" -N -e "SHOW TABLES FROM \`$DB_NAME\`;")
+
+ if [[ -z "$TABLES" ]]; then
+ echo "⚠️ No tables found or failed to connect to '$DB_NAME'. Skipping."
+ continue
+ fi
+
+ while IFS= read -r raw_table; do
+ TABLE=$(echo "$raw_table" | tr -d '\r"' | xargs)
+ if [[ -n "$TABLE" ]]; then
+ echo " ➤ Dumping table: $TABLE"
+ mysqldump -u $DB_USER -p$DB_PASS -h $DB_HOST -P $DB_PORT --extended-insert $DB_NAME $TABLE > $BASE_OUTPUT_DIR/$FOLDER_NAME/$TABLE.sql
+
+ # cleanup files
+ sed -E '
+ s/VALUES[[:space:]]*/VALUES\n/;
+ :a
+ s/\),\(/\),\n\(/g;
+ ta
+ ' "$BASE_OUTPUT_DIR/$FOLDER_NAME/$TABLE.sql" > "$BASE_OUTPUT_DIR/$FOLDER_NAME/${TABLE}_formatted.sql"
+ mv "$BASE_OUTPUT_DIR/$FOLDER_NAME/${TABLE}_formatted.sql" "$BASE_OUTPUT_DIR/$FOLDER_NAME/$TABLE.sql"
+ fi
+ done <<< "$TABLES"
+done
+
+echo "âś… Done dumping all specified databases."
diff --git a/apps/DatabaseSquash/DatabaseExporter/databaseexporter.md b/apps/DatabaseSquash/DatabaseExporter/databaseexporter.md
new file mode 100644
index 0000000000..bf219fbddf
--- /dev/null
+++ b/apps/DatabaseSquash/DatabaseExporter/databaseexporter.md
@@ -0,0 +1,16 @@
+# The AzerothCore Database Exporter for Database Squashes
+
+> [!CAUTION]
+> These steps are only for project maintainers who intend to update base files.
+
+## Requirements
+
+1. MySQL
+2. mysqldump
+
+## Usage
+
+1. Run DatabaseExporter.sh from the current directory.
+2. Fill in required data within the CLI.
+3. The tool will autopopulate the basefile directories.
+4. Done.
diff --git a/apps/DatabaseSquash/DatabaseSquash.sh b/apps/DatabaseSquash/DatabaseSquash.sh
new file mode 100644
index 0000000000..c489e41af9
--- /dev/null
+++ b/apps/DatabaseSquash/DatabaseSquash.sh
@@ -0,0 +1,52 @@
+#!/usr/bin/env bash
+
+echo "âť—CAUTION"
+echo "This tool is only supposed to be used by AzerothCore Maintainers."
+echo "The tool is used to prepare for, and generate a database squash."
+echo
+echo "Before you continue make sure you have read"
+echo "https://github.com/azerothcore/azerothcore-wotlk/blob/master/data/sql/base/database-squash.md"
+echo
+read -p "Are you sure you want to continue (Y/N)?" choice
+case "$choice" in
+ y|Y ) echo "Starting...";;
+ * ) echo "Aborted"; exit 0 ;;
+esac
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
+
+if [[ "$PROJECT_ROOT" =~ ^/([a-zA-Z])/(.*) ]]; then
+ DRIVE_LETTER="${BASH_REMATCH[1]}"
+ PATH_REMAINDER="${BASH_REMATCH[2]}"
+ PROJECT_ROOT="${DRIVE_LETTER^^}:/${PATH_REMAINDER}"
+fi
+
+VERSION_UPDATER_PATH="$PROJECT_ROOT/apps/DatabaseSquash/VersionUpdater/versionupdater.sh"
+
+"$VERSION_UPDATER_PATH"
+
+echo "âś… VersionUpdater Completed..."
+echo
+echo "âť—IMPORTANT!"
+echo "1. Before you continue you need to drop all your databases."
+echo "2. Run WorldServer to populate the database."
+echo
+echo "âť—DO NOT continue before you have completed the steps above!"
+echo
+echo "The next step will export your database and overwrite the base files."
+echo
+read -p "Are you sure you want to export your database (Y/N)?" choice
+case "$choice" in
+ y|Y ) echo "Starting...";;
+ * ) echo "Aborted"; exit 0 ;;
+esac
+
+DATABASE_EXPORTER_PATH="$PROJECT_ROOT/apps/DatabaseSquash/DatabaseExporter/databaseexporter.sh"
+
+"$DATABASE_EXPORTER_PATH"
+
+echo "âś… DatabaseExporter Completed..."
+echo "âś… DatabaseSquash Completed... "
+echo
+read -p "Press Enter to exit..."
diff --git a/apps/DatabaseSquash/VersionUpdater/VersionUpdater.sh b/apps/DatabaseSquash/VersionUpdater/VersionUpdater.sh
new file mode 100644
index 0000000000..25cf9b755a
--- /dev/null
+++ b/apps/DatabaseSquash/VersionUpdater/VersionUpdater.sh
@@ -0,0 +1,84 @@
+#!/bin/bash
+
+set -e
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
+
+if [[ "$PROJECT_ROOT" =~ ^/([a-zA-Z])/(.*) ]]; then
+ DRIVE_LETTER="${BASH_REMATCH[1]}"
+ PATH_REMAINDER="${BASH_REMATCH[2]}"
+ PROJECT_ROOT="${DRIVE_LETTER^^}:/${PATH_REMAINDER}"
+fi
+
+ACORE_JSON_PATH="$PROJECT_ROOT/acore.json"
+DB_WORLD_UPDATE_DIR="$PROJECT_ROOT/data/sql/updates/db_world"
+
+VERSION_LINE=$(grep '"version"' "$ACORE_JSON_PATH")
+VERSION=$(echo "$VERSION_LINE" | sed -E 's/.*"version": *"([^"]+)".*/\1/')
+
+# Parse version into parts
+if [[ "$VERSION" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)(.*)$ ]]; then
+ MAJOR="${BASH_REMATCH[1]}"
+ SUFFIX="${BASH_REMATCH[4]}"
+ NEW_VERSION="$((MAJOR + 1)).0.0$SUFFIX"
+
+ # Replace version in file
+ sed -i.bak -E "s/(\"version\": *\")[^\"]+(\" *)/\1$NEW_VERSION\2/" "$ACORE_JSON_PATH"
+ rm -f "$ACORE_JSON_PATH.bak"
+
+ echo "âś… Version updated to $NEW_VERSION"
+else
+ echo "Error: Could not parse version string: $VERSION"
+ exit 1
+fi
+
+# Extract the new major version from NEW_VERSION
+if [[ "$NEW_VERSION" =~ ^([0-9]+)\. ]]; then
+ NEW_MAJOR="${BASH_REMATCH[1]}"
+else
+ echo "Error: Unable to extract major version from $NEW_VERSION"
+ exit 1
+fi
+
+# Prepare SQL content
+DB_VERSION_CONTENT="'ACDB 335.${NEW_MAJOR}-dev'"
+SQL_QUERY="UPDATE \`version\` SET \`db_version\`=${DB_VERSION_CONTENT}, \`cache_id\`=${NEW_MAJOR} LIMIT 1;"
+
+# Format date as yyyy_mm_dd
+TODAY=$(date +%Y_%m_%d)
+
+# Ensure directory exists
+mkdir -p "$DB_WORLD_UPDATE_DIR"
+
+# List existing files for today
+existing_files=($(find "$DB_WORLD_UPDATE_DIR" -maxdepth 1 -type f -name "${TODAY}_*.sql" 2>/dev/null))
+
+# Determine next xx counter
+# Determine next xx
+COUNTER="00"
+if [ ${#existing_files[@]} -gt 0 ]; then
+ max=0
+ for file in "${existing_files[@]}"; do
+ basename=$(basename "$file")
+ if [[ "$basename" =~ ^${TODAY}_([0-9]{2})\.sql$ ]]; then
+ num=${BASH_REMATCH[1]}
+ if [[ "$num" =~ ^[0-9]+$ ]] && (( 10#$num > max )); then
+ max=$((10#$num))
+ fi
+ fi
+ done
+ COUNTER=$(printf "%02d" $((max + 1)))
+fi
+
+# Compose final file path
+SQL_FILENAME="${TODAY}_${COUNTER}.sql"
+SQL_FILE_PATH="$DB_WORLD_UPDATE_DIR/$SQL_FILENAME"
+
+# Write to file
+{
+ echo "-- Auto-generated by VersionUpdater.sh on $(date)"
+ echo "$SQL_QUERY"
+} > "$SQL_FILE_PATH"
+
+echo "âś… SQL file created at $SQL_FILE_PATH"
diff --git a/apps/DatabaseSquash/VersionUpdater/versionupdater.md b/apps/DatabaseSquash/VersionUpdater/versionupdater.md
new file mode 100644
index 0000000000..343ca370a7
--- /dev/null
+++ b/apps/DatabaseSquash/VersionUpdater/versionupdater.md
@@ -0,0 +1,10 @@
+# The AzerothCore Version Updater for Database Squashes
+
+> [!CAUTION]
+> These steps are only for project maintainers who intend to update base files.
+
+## Usage
+
+1. Run VersionUpdater.sh from the current directory.
+2. The tool will update acore.json and create a new update sql file.
+3. Done.
diff --git a/apps/DatabaseSquash/databasesquash.md b/apps/DatabaseSquash/databasesquash.md
new file mode 100644
index 0000000000..e6b84355ed
--- /dev/null
+++ b/apps/DatabaseSquash/databasesquash.md
@@ -0,0 +1,11 @@
+# The AzerothCore DatabaseSquash tool for Database Squashes
+
+> [!CAUTION]
+> These steps are only for project maintainers who intend to update base files.
+
+## Usage
+
+1. Run DatabaseSquash.sh from the current directory.
+2. The tool will run VersionUpdater.sh and DatabaseExporter.sh
+3. Follow the instructions in the CLI.
+4. Done.
diff --git a/apps/VersionUpdater/VersionUpdater.ps1 b/apps/VersionUpdater/VersionUpdater.ps1
deleted file mode 100644
index 64be051310..0000000000
--- a/apps/VersionUpdater/VersionUpdater.ps1
+++ /dev/null
@@ -1,132 +0,0 @@
-# Get the directory to acore.json
-$scriptDirectory = $PSScriptRoot
-$relativePath = "..\.."
-$combinedPath = Join-Path -Path $scriptDirectory -ChildPath $relativePath
-$fullPath = Resolve-Path -Path $combinedPath
-$jsonFilePath = "$fullPath\acore.json"
-# Get the directory for SQL update
-$relativePathDbWorldUpdate = "..\..\data\sql\updates\db_world"
-$combinedPathDbWorldUpdate = Join-Path -Path $scriptDirectory -ChildPath $relativePathDbWorldUpdate
-$fullPathDbWorldUpdate = Resolve-Path -Path $combinedPathDbWorldUpdate
-
-Write-Host " ___ _ _ ___ "
-Write-Host "/ \ ___ ___ _ _ ___ | |_ | |_ / __| ___ _ _ ___ "
-Write-Host "| - ||_ // -_)| '_|/ _ \| _|| \ | (__ / _ \| '_|/ -_)"
-Write-Host "|_|_|/__|\___||_| \___/ \__||_||_| \___|\___/|_| \___|"
-Write-Host "AzerothCore 3.3.5a - www.azerothcore.org"
-Write-Host ""
-Write-Host "Welcome to the AzerothCore Version Updater for database squashes!"
-Write-Host ""
-Write-Host "You have configured:"
-Write-Host "acore.json Path: '$jsonFilePath'"
-Write-Host "World SQL Updates path: '$fullPathDbWorldUpdate'"
-Write-Host ""
-Write-Host "Make sure you read the entire process before you continue."
-Write-Host "https://github.com/azerothcore/azerothcore-wotlk/blob/master/data/sql/base/database-squash.md"
-Write-Host "https://github.com/azerothcore/azerothcore-wotlk/blob/master/apps/VersionUpdater/versionupdater.md"
-Write-Host ""
-
-# Check if the user wants to continue using the tool
-do {
- $confirmation = Read-Host "Do you want to continue using the tool? (Y/N)"
-
- if ($confirmation -eq 'Y' -or $confirmation -eq 'y') {
- # Continue the script
- Write-Host "AzerothCore Version Updater starts."
- Write-Host ""
- $continue = $true
- }
- elseif ($confirmation -eq 'N' -or $confirmation -eq 'n') {
- # Exit the script
- Write-Host "Exiting the AzerothCore Version Updater."
- exit
- }
- else {
- Write-Host "Invalid input. Please enter Y or N."
- $continue = $null
- }
-} while ($continue -eq $null)
-
-# Read the JSON file and convert it to a PowerShell object
-$jsonContent = Get-Content -Path $jsonFilePath | ConvertFrom-Json
-
-# Get the current version
-$currentVersion = $jsonContent.version
-
-# Match version components (major.minor.patch and optional suffix like -dev or -alpha)
-if ($currentVersion -match '(\d+)\.(\d+)\.(\d+)(-.*)?') {
- $major = $matches[1]
- $minor = $matches[2]
- $patch = $matches[3]
- $suffix = $matches[4]
-
- # Increment the major version
- $major = [int]$major + 1
-
- # Reset minor and patch version to 0 (if incrementing major)
- $minor = 0
- $patch = 0
-
- # Reassemble the version with the suffix if it exists
- $newVersion = "$major.$minor.$patch$suffix"
-
- # Update the version in the JSON object
- $jsonContent.version = $newVersion
-} else {
- Write-Host "Unknown error in $jsonFilePath. Exiting."
- exit
-}
-
-# Convert the updated object back to JSON format
-$newJsonContent = $jsonContent | ConvertTo-Json -Depth 3
-
-# Write the updated content back to the file
-$newJsonContent | Set-Content -Path $jsonFilePath
-
-Write-Host "acore.json version updated to $newVersion"
-
-# Create the SQL Version update file.
-# Get today's date in the format YYYY_MM_DD
-$today = Get-Date -Format "yyyy_MM_dd"
-
-# Get the list of files in the directory that match the pattern "YYYY_MM_DD_versionNumber.sql"
-$existingFiles = Get-ChildItem -Path $fullPathDbWorldUpdate -Filter "$today*_*.sql"
-
-# If no files exist for today, start with version number 00
-if ($existingFiles.Count -eq 0) {
- [int]$newVersionNumber = 0
-} else {
- # Extract the version number from the existing files (e.g., YYYY_MM_DD_versionNumber.sql)
- $maxVersionNumber = $existingFiles | ForEach-Object {
- if ($_ -match "$today_(\d{2})\.sql") {
- [int]$matches[1]
- }
- } | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum
-
- # Increment the version number by 1
- [int]$newVersionNumber = $maxVersionNumber + 1
-}
-
-# Format the new version number as a two-digit number (e.g., 01, 02, etc.)
-$formattedVersionNumber = $newVersionNumber.ToString("D2")
-
-# Define the new filename using the date and incremented version number
-$newFileName = "$today" + "_$formattedVersionNumber.sql"
-$newFilePath = Join-Path -Path $fullPathDbWorldUpdate -ChildPath $newFileName
-
-# Define the SQL content to write to the file
-$tableName = '`version`'
-$db_version = '`db_version`'
-$db_version_content = "'ACDB 335.$major-dev'"
-$cache_id = '`cache_id`'
-$sqlContent = "UPDATE $tableName SET $db_version=$db_version_content, $cache_id=$major LIMIT 1;"
-
-# Write the content to the new SQL file
-$sqlContent | Set-Content -Path $newFilePath
-
-Write-Host "SQL file created: $newFilePath"
-Write-Host "SQL content: $sqlContent"
-
-Write-Host ""
-Write-Host "Version Updater completed."
-Write-Host "Have a nice day :)"
diff --git a/apps/VersionUpdater/versionupdater.md b/apps/VersionUpdater/versionupdater.md
deleted file mode 100644
index 9cd3508c85..0000000000
--- a/apps/VersionUpdater/versionupdater.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# The AzerothCore Version Updater for Database Squashes
-
-> [!CAUTION]
-> These steps are only for project maintainers who intend to update base files.
-
-## Description of the tool
-
-This tool updates the version in DB and acore.json automatically. Hence, it must run from this directory.
-
-This is how it works step-by-step:
-
-1. Check that all paths look correct.
-2. Accept to continue using the tool.
-3. The tool will update the acore.json file and increment it by 1.
-4. The tool will create a file with the proper UPDATE for world database in `..\..\data\sql\updates\db_world`.
-
-## Run the tool
-
-> [!IMPORTANT]
-> This tool CAN NOT be moved outside this directory. If you do it will create files in the wrong places.
-
-1. If you haven't run PowerShell scripts before, you'll need to adjust the execution policy.
-
- - Open PowerShell as an Administrator.
- - Run the following command to allow running scripts:
- ```ps
- Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
- ```
- - This allows scripts to run on your system, but they need to be locally created or downloaded from trusted sources.
-
-2. Open PowerShell (PS)
-
- - Press Win + X and select Windows PowerShell (Admin) / Terminal (Admin)
-
-3. Navigate to the script
-
- - In PS, use the `cd` command to change the directory
- ```ps
- cd "C:\AzerothCore\apps\VersionUpdater"
- ```
-
-4. Run the script
-
- - In PS, run the script
- ```ps
- .\VersionUpdater.ps1
- ```
-
-5. Follow the instructions given by the tool.
-
-6. Now refer back to the database-squash.md instructions. (Located in ..\..\data\sql\base\)
-
-Completed :)
diff --git a/apps/db_exporter/.gitignore b/apps/db_exporter/.gitignore
deleted file mode 100644
index cdd7c19c8d..0000000000
--- a/apps/db_exporter/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-config.sh
diff --git a/apps/db_exporter/README.md b/apps/db_exporter/README.md
deleted file mode 100644
index 98703a88df..0000000000
--- a/apps/db_exporter/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-This script is used by devs to export the databases to base directories
-
-You should use it on clean databases
-
-## USAGE
-
-NOTE: this script is only working under unix currently
-
-1) You must create a config.sh file changing DB connection configurations
-of /conf/config.sh.dist
-
-2) Run the db_export.sh script and wait
diff --git a/apps/db_exporter/db_export.sh b/apps/db_exporter/db_export.sh
deleted file mode 100644
index e5ce4a5c67..0000000000
--- a/apps/db_exporter/db_export.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env bash
-
-ROOTPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../../" && pwd )"
-
-source "$ROOTPATH/apps/bash_shared/includes.sh"
-
-if [ -f "./config.sh" ]; then
- source "./config.sh" # should overwrite previous
-fi
-
-echo "This is a dev-only procedure to export the DB into the SQL base files. All base files will be overwritten."
-read -p "Are you sure you want to continue (y/N)? " choice
-case "$choice" in
- y|Y ) echo "Exporting the DB into the SQL base files...";;
- * ) return;;
-esac
-
-echo "===== STARTING PROCESS ====="
-
-
-function export() {
- echo "Working on: "$1
- database=$1
-
- var_base_path="DB_"$database"_PATHS"
- base_path=${!var_base_path%/}
-
- base_conf="TPATH="$base_path";\
- CLEANFOLDER=1; \
- CHMODE=0; \
- TEXTDUMPS=0; \
- PARSEDUMP=1; \
- FULL=0; \
- DUMPOPTS='--skip-comments --skip-set-charset --routines --extended-insert --order-by-primary --single-transaction --quick'; \
- "
-
- var_base_conf="DB_"$database"_CONF"
- base_conf=$base_conf${!var_base_conf}
-
- var_base_name="DB_"$database"_NAME"
- base_name=${!var_base_name}
-
-
- bash "$AC_PATH_DEPS/acore/mysql-tools/mysql-tools" "dump" "" "$base_name" "" "$base_conf"
-}
-
-for db in ${DATABASES[@]}
-do
- export "$db"
-done
-
-echo "===== DONE ====="