#!/bin/sh

# This script tests a full database backup and replacement using xtrabackup

set -e

TEST_DB_NAME="testdb"
TEST_TABLE_NAME="testtable"
BACKUP_LOCATION="/data/backup"

# Create a new mysql database and add some entries to a table
setup_database() {
    mysql -e "CREATE DATABASE $TEST_DB_NAME;"
    mysql $TEST_DB_NAME -e "CREATE TABLE $TEST_TABLE_NAME (name VARCHAR(255), num INT, date DATE);"
    mysql $TEST_DB_NAME -e "INSERT INTO $TEST_TABLE_NAME (name, num, date) VALUES ('test1', 42, '2023-10-14');"
    mysql $TEST_DB_NAME -e "INSERT INTO $TEST_TABLE_NAME (name, num, date) VALUES ('test2', 26, '2028-04-27');"
}

# Get all data from the test table
extract_test_data() {
    mysql $TEST_DB_NAME -e "SELECT * FROM $TEST_TABLE_NAME;"
}

# Remove the first predefined entry in the database test table
remove_test1_entry() {
    mysql $TEST_DB_NAME -e "DELETE FROM $TEST_TABLE_NAME WHERE name = 'test1';"
}

# Use xtrabackup to fully backup the current mysql database
backup_database() {
    mkdir -p $BACKUP_LOCATION
    xtrabackup --backup --target-dir=$BACKUP_LOCATION
}

# Clear current database and restore the backup from xtrabackup
restore_database() {
    systemctl stop mysql
    xtrabackup --prepare --target-dir=$BACKUP_LOCATION
    rm -rf /var/lib/mysql
    xtrabackup --copy-back --target-dir=$BACKUP_LOCATION --datadir=/var/lib/mysql
    chown -R mysql:mysql /var/lib/mysql
    systemctl start mysql
}

setup_database

INITIAL_DATA=$(extract_test_data)

# Backup the database for later
backup_database

# Remove an entry and make sure the output data changes
remove_test1_entry

if [ "$INITIAL_DATA" = "$(extract_test_data)" ]; then
    echo "Error: Unable to change test data, found:"
    echo $INITIAL_DATA
    exit 1
fi

# Restore from backup and make sure data matches
restore_database

NEW_DATA=$(extract_test_data)

if [ "$INITIAL_DATA" != "$NEW_DATA" ]; then
    echo "Error: backup restore failed, expected:"
    echo $INITIAL_DATA
    echo "found:"
    echo $NEW_DATA
    exit 1
fi
