#!/usr/bin/env bash
# Fuehrt SQL gegen die Datenbank aus, die eine Shopware-Installation laut
# ihrer .env.local benutzt.
#
#   db-sql.sh <installationsverzeichnis> "<SQL>"
#   echo "<SQL>" | db-sql.sh <installationsverzeichnis>
#
# Gedacht fuer den Blick von aussen: auf den Frontends laeuft kein
# Datenbankdienst, ein blosses "mariadb" sucht den lokalen Socket und
# scheitert. Und parse_ini_file() stolpert ueber die Sonderzeichen in der
# .env.local - deshalb dieselbe Python-Zerlegung wie in shop-import.sh.
#
# Die Zugangsdaten gehen ausschliesslich ueber eine Optionsdatei mit
# Rechten 600; auf der Befehlszeile stuenden sie in der Prozessliste.
set -euo pipefail

ZIEL="${1:?Installationsverzeichnis fehlt, z. B. /var/www/riccardo}"
SQL="${2:-}"
[ -f "$ZIEL/.env.local" ] || { echo "Kein $ZIEL/.env.local gefunden." >&2; exit 1; }

eval "$(python3 - "$ZIEL/.env.local" <<'PYEOF'
import re, sys, shlex
from urllib.parse import urlparse, unquote
inhalt = open(sys.argv[1], encoding='utf-8').read()
treffer = re.search(r'^DATABASE_URL=(.+)$', inhalt, re.M)
if not treffer:
    sys.exit(0)
u = urlparse(treffer.group(1).strip().strip('"\''))
for name, wert in (('DBHOST', u.hostname or ''), ('DBPORT', str(u.port or 3306)),
                   ('DBUSER', unquote(u.username or '')), ('DBPASS', unquote(u.password or '')),
                   ('DBNAME', (u.path or '/').lstrip('/'))):
    print('%s=%s' % (name, shlex.quote(wert)))
PYEOF
)"
[ -n "${DBHOST:-}" ] || { echo "Kein DATABASE_URL in $ZIEL/.env.local." >&2; exit 1; }

OPT=$(mktemp); chmod 600 "$OPT"
trap 'rm -f "$OPT"' EXIT
printf '[client]\nhost=%s\nport=%s\nuser=%s\npassword=%s\n' \
    "$DBHOST" "$DBPORT" "$DBUSER" "$DBPASS" > "$OPT"

if [ -n "$SQL" ]; then
    printf '%s\n' "$SQL" | mariadb --defaults-extra-file="$OPT" "$DBNAME"
else
    mariadb --defaults-extra-file="$OPT" "$DBNAME"
fi
