#!/usr/bin/env bash
# database/import -- load a .sql or .sql.gz file into an existing database
set -o pipefail
SELF=$(readlink -f "${BASH_SOURCE[0]}")
NV_BASE=$(cd "$(dirname "$SELF")/../../.." && pwd)
export NV_BASE
# shellcheck source=/dev/null
. "$NV_BASE/lib/core/bootstrap.sh"

nv_require_root || exit 1
ui_header "$(t db_m_import)"
db_available || { ui_err "$(t db_unreachable)"; exit 1; }

printf '  %s: ' "$(t db_prompt_name)"
read -r name || exit 130
name=$(nv_trim "$name")
nv_valid_dbname "$name" || { ui_err "$(t db_bad_name)"; exit 2; }
db_root_exec "SHOW DATABASES LIKE '$name'" 2>/dev/null | grep -q . \
    || { ui_err "$(t db_not_found "$name")"; exit 2; }

printf '  %s: ' "$(t db_import_path)"
read -r file || exit 130
file=$(nv_trim "$file")
[ -r "$file" ] || { ui_err "$(t ssl_import_no_file "$file")"; exit 2; }

ui_blank
ui_warn "$(t db_import_warn "$name")"
ui_confirm_typed "$(t db_drop_confirm)" "$name" || { ui_info "$(t pf_cancelled)"; exit 3; }

nv_lock_acquire "db:$name" 10 || { nv_fail 6199 "$(t lock_busy "$name")"; exit 1; }

safety="$NV_BACKUP_ROOT/$(date -u '+%Y%m%dT%H%M%SZ').pre-import"
install -d -m 0700 "$safety"
ui_step "$(t backup_dump_current)"
pass=$(nv_secret db_root_password)
if [ -n "$pass" ]; then
    mysqldump --protocol=socket -u root -p"$pass" --single-transaction "$name" 2>/dev/null \
        | gzip -9 >"$safety/$name.sql.gz"
else
    mysqldump --protocol=socket -u root --single-transaction "$name" 2>/dev/null \
        | gzip -9 >"$safety/$name.sql.gz"
fi
ui_ok "$(t backup_safety_at "$safety")"

ui_step "$(t db_import_running)"
if case $file in
       *.gz) gunzip -c "$file" | mariadb --protocol=socket -u root "$name" ;;
       *)    mariadb --protocol=socket -u root "$name" <"$file" ;;
   esac
then
    nv_trace db-import "$name <- $file"
    nv_lock_release "db:$name"
    ui_ok "$(t db_import_done "$name")"
else
    nv_lock_release "db:$name"
    nv_fail 3111 "$(t db_import_failed)"
    ui_info "$(t backup_restore_safety "$safety")"
    exit 1
fi
exit 0
