#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS

function display_help() {
    uecho "$scriptname: Faire une requête MySQL et formater la sortie pour traitement avec awkcsv

USAGE
    $scriptname [query [db]] [-- mysql options]

query   est la requête sql à exécuter. Si query n'est pas spécifiée, la(les)
        requête(s) sql sont prises sur l'entrée standard, ou depuis un fichier
        si l'option -f est spécifiée.
db      est le nom de la base de données. Cette argument n'est lu que si le nom
        de la base de donnée n'est ni spécifié dans le fichier de configuration,
        ni spécifié avec l'option -D

OPTIONS
    -h, --host HOST
    -P, --port PORT
    -u, --user USER
    -pPASSWORD
    -D, --database DATABASE
        Informations de connexion à la base de données
    -C, --config CONFIG
        Prendre les informations de connexion depuis le fichier spécifié.
        Le fichier doit être de la forme
            host=HOST
            #post=3306
            user=USER
            password=PASS
            #database=DB
            #query=QUERY
        Les variables port, database et query sont facultatives.
        Les valeurs définies dans ce fichier sont prioritaires par rapport à
        celles qui auraient été spécifiées sur la ligne de commande.
        Utiliser password=--NOT-SET-- s'il faut se connecter sans mot de passe
        Cette option peut être utilisée plusieurs fois, auquel cas les fichiers
        sont chargés dans l'ordre.
    --profile PROFILE
        La variable \$PROFILE est définie avec la valeur spécifiée avant de
        sourcer les fichiers de configuration. Cela permet d'avoir des fichiers
        de configuration qui calculent dynamiquement les paramètres en fonction
        de la valeur du profil.
    -N, --no-headers
        Ne pas afficher les en-têtes
    -c, --force
        Continuer le traitement même en cas d'erreur
    -r, --raw
        Ne pas autoriser mysql à mettre en échappement certaines valeurs
        retournées par le serveur. Par défaut, les transformations suivantes
        sont effectuées:
            newline --> \\n
            tab     --> \\t
            nul     --> \\0
            \\      --> \\\\
    -n, --nulls
        Transformer dans le flux en sortie les valeurs NULL en chaines vides
    -f, --input INPUT
        Lire la requête depuis le fichier input au lieu de le lire depuis la
        ligne de commande ou l'entrée standard. Ne pas spécifier cette option
        ou utiliser '-' pour lire depuis l'entrée standard.
        Cette option est ignorée si la requête est spécifiée parmi les
        arguments."
}

host=
port=
user=
password=--NOT-SET--
database=
configs=()
profile=
noheaders=
force=
raw=
fixnulls=
input=
parse_opts "${PRETTYOPTS[@]}" \
    --help '$exit_with display_help' \
    -h:,-H:,--host: host= \
    -P:,--port: port= \
    -u:,--user: user= \
    -p::,--passwd:,--password: password= \
    -D:,--database: database= \
    -C:,--config: configs \
    --profile: profile= \
    -N,--no-headers,--skip-column-names noheaders=1 \
    -c,--force force=1 \
    -r,--raw raw=1 \
    -n,--nulls,--fix-nulls fixnulls=1 \
    -f:,--input: input= \
    @ args -- "$@" && set -- "${args[@]}" || die "$args"

if [ "$1" != "--" ]; then
    # le premier argument est la requête
    query="$1"; shift
fi

if [ -n "$input" -a "$input" != "-" ]; then
    [ -f "$input" ] || die "$input: fichier introuvable"
fi

if [ -n "${configs[*]}" ]; then
    PROFILE="$profile"
    array_fix_paths configs
    for config in "${configs[@]}"; do
        [ -f "$config" ] || die "Fichier introuvable: $config"
        source "$(abspath "$config")"
    done
fi

if [ -z "$database" -a "$1" != "--" ]; then
    # le deuxième argument est éventuellement le nom de la base de données, si
    # cela n'a pas été spécifié dans le fichier de configuration
    database="$1"; shift
fi
[ "$1" == "--" ] && shift

mysqlcmd='mysql "${mysqlargs[@]}" "$@"'
mysqlargs=(
    -B --default-character-set=utf8
    ${host:+-h "$host"} ${port:+-P "$port"}
    ${user:+-u "$user"}
    ${noheaders:+-N} ${force:+-f} ${raw:+-r}
    ${database:+-D "$database"}
    ${query:+-e "$query"}
)
if [ "$password" != "--NOT-SET--" ]; then
    mysqlargs=("${mysqlargs[@]}" -p"$password")
fi

if [ -z "$query" -a -n "$input" -a "$input" != "-" ]; then
    mysqlcmd="<$(qval "$input") $mysqlcmd"
fi

eval "$mysqlcmd" |
awkrun -f FS="$TAB" fixnulls:int="$fixnulls" '{
  if (fixnulls) {
    for (i = 1; i <= NF; i++) {
      if ($i == "NULL") $i = ""
    }
  }
  printcsv()
}'
