maison_alexandra/development/database/bin/load_structure.sh

114 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# Configure mysql for further usage
credentialsFile="/opt/bin/mysql-credentials.cnf"
dump_file=""
progress_msg=""
default_db_name="maison_alexandra_lv"
# Set passed arguments
for i in "$@"; do
case $i in
-db=*|--db_name=*) default_db_name="${i#*=}" ;;
-file=*|--dump_file=*) dump_file="${i#*=}" ;;
-progress-title=*) progress_msg="${i#*=}" ;;
*) echo "Unknown parameter passed: $i"; exit 1 ;;
esac
done
# Show progress bar
function ProgressBar {
# Process data
let _progress=(${1}*100/${2}*100)/100
let _done=(${_progress}*4)/10
let _left=40-$_done
# Build progressbar string lengths
_fill=$(printf "%${_done}s")
_empty=$(printf "%${_left}s")
printf "\rProgress : ${_fill// /█}${_empty// / } | ${_progress}%% \t$progress_msg"
if [ $_progress -eq 100 ]; then
echo -e
fi
}
# Remove the existing schema if it exists and recreate it
mysql --defaults-extra-file=$credentialsFile -e "DROP SCHEMA IF EXISTS \`$default_db_name\`"
mysql --defaults-extra-file=$credentialsFile -e "CREATE SCHEMA \`$default_db_name\` COLLATE utf8_general_ci"
# Check if dump file specified & load it
if [[ "$dump_file" ]]; then
if [[ -e "/opt/db_dumps/$dump_file" ]]; then
mysql --defaults-extra-file=$credentialsFile $default_db_name < "/opt/db_dumps/$dump_file";
ProgressBar 1 1
exit 0
fi
else
# Loop over the sql files and import each one from the base dir
for file in "/opt/structure/$default_db_name/*.sql"; do
if [[ -e $file ]]; then
mysql --defaults-extra-file=$credentialsFile $default_db_name < $file;
fi
done
fi
# Setup progressbar
loaded_files=0
total_files=$(find "/opt/structure/$default_db_name" -type f -name "*.sql" -printf x | wc -c)
# Loop over the table schema files and import each one
if [ -d /opt/structure/$default_db_name/tables ]; then
for file in /opt/structure/$default_db_name/tables/*.sql; do
if [[ -e $file ]]; then
mysql --defaults-extra-file=$credentialsFile $default_db_name < $file;
let loaded_files++
ProgressBar ${loaded_files} ${total_files}
fi
done
fi
# Loop over the procedure schema files and import each one
if [ -d /opt/structure/$default_db_name/procedures ]; then
for file in /opt/structure/$default_db_name/procedures/*.sql; do
if [[ -e $file ]]; then
mysql --defaults-extra-file=$credentialsFile $default_db_name < $file;
let loaded_files++
ProgressBar ${loaded_files} ${total_files}
fi
done
fi
# Loop over the view schema files and import each one
declare -a WRONG_ORDER
if [ -d /opt/structure/$default_db_name/views ]; then
for file in /opt/structure/$default_db_name/views/*.sql; do
if [[ -e $file ]]; then
if [[ $(mysql --defaults-extra-file=$credentialsFile $default_db_name < $file 2>&1 >/dev/null | grep -ic "doesn't exist") -gt 0 ]]; then
WRONG_ORDER+=($file)
else
let loaded_files++
ProgressBar ${loaded_files} ${total_files}
fi
fi
done
fi
attempts=0
while [ ${#WRONG_ORDER[@]} -gt 0 ]; do
# Exit if exceed 5 attempts
if [[ "$attempts" -gt 4 ]]; then
exit 1
fi
index=0
for i in "${WRONG_ORDER[@]}"; do
if [[ $(mysql --defaults-extra-file=$credentialsFile $default_db_name < $i 2>&1 >/dev/null | grep -ic "doesn't exist") -eq 0 ]]; then
unset WRONG_ORDER[index]
let loaded_files++
ProgressBar ${loaded_files} ${total_files}
fi
let index++
done
let attempts++
done