2013-08-27 15:14:44 +04:00
|
|
|
#!/bin/bash
|
|
|
|
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
2023-01-25 17:14:03 +04:00
|
|
|
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
|
2013-08-27 15:14:44 +04:00
|
|
|
|
|
|
|
function display_help() {
|
|
|
|
uecho "$scriptname: Faire une requête MySQL et formater la sortie pour traitement avec awkcsv
|
|
|
|
|
|
|
|
USAGE
|
2014-01-22 15:42:11 +04:00
|
|
|
$scriptname [query [db]] [-- mysql options]
|
2013-08-27 15:14:44 +04:00
|
|
|
|
|
|
|
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.
|
2014-01-22 15:42:11 +04:00
|
|
|
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
|
2013-08-27 15:14:44 +04:00
|
|
|
|
|
|
|
OPTIONS
|
2014-03-03 17:08:49 +04:00
|
|
|
-h, --host HOST
|
|
|
|
-P, --port PORT
|
|
|
|
-u, --user USER
|
2014-01-22 15:42:11 +04:00
|
|
|
-pPASSWORD
|
2014-03-03 17:08:49 +04:00
|
|
|
-D, --database DATABASE
|
2013-08-27 15:14:44 +04:00
|
|
|
Informations de connexion à la base de données
|
2014-03-03 17:08:49 +04:00
|
|
|
-C, --config CONFIG
|
2013-08-27 15:14:44 +04:00
|
|
|
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.
|
2014-03-03 17:08:49 +04:00
|
|
|
-N, --no-headers
|
2013-08-27 15:14:44 +04:00
|
|
|
Ne pas afficher les en-têtes
|
2014-03-03 17:08:49 +04:00
|
|
|
-c, --force
|
2013-08-27 15:14:44 +04:00
|
|
|
Continuer le traitement même en cas d'erreur
|
2014-03-03 17:08:49 +04:00
|
|
|
-r, --raw
|
2013-08-27 15:14:44 +04:00
|
|
|
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
|
|
|
|
\\ --> \\\\
|
2014-03-03 17:08:49 +04:00
|
|
|
-n, --nulls
|
2013-08-27 15:14:44 +04:00
|
|
|
Transformer dans le flux en sortie les valeurs NULL en chaines vides
|
2014-03-03 17:08:49 +04:00
|
|
|
-f, --input INPUT
|
2013-08-27 15:14:44 +04:00
|
|
|
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--
|
2014-01-22 15:42:11 +04:00
|
|
|
database=
|
2013-08-27 15:14:44 +04:00
|
|
|
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= \
|
2014-01-22 15:42:11 +04:00
|
|
|
-D:,--database: database= \
|
2013-08-27 15:14:44 +04:00
|
|
|
-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"
|
|
|
|
|
2014-01-22 15:42:11 +04:00
|
|
|
if [ "$1" != "--" ]; then
|
|
|
|
# le premier argument est la requête
|
|
|
|
query="$1"; shift
|
|
|
|
fi
|
2013-08-27 15:14:44 +04:00
|
|
|
|
2014-01-22 17:31:18 +04:00
|
|
|
if [ -n "$input" -a "$input" != "-" ]; then
|
|
|
|
[ -f "$input" ] || die "$input: fichier introuvable"
|
|
|
|
fi
|
|
|
|
|
2013-08-27 15:14:44 +04:00
|
|
|
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
|
|
|
|
|
2014-01-22 15:42:11 +04:00
|
|
|
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
|
|
|
|
|
2013-08-27 15:14:44 +04:00
|
|
|
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
|
2017-03-01 22:34:59 +04:00
|
|
|
mysqlcmd="<$(qval "$input") $mysqlcmd"
|
2013-08-27 15:14:44 +04:00
|
|
|
fi
|
|
|
|
|
|
|
|
eval "$mysqlcmd" |
|
|
|
|
awkrun -f FS="$TAB" fixnulls:int="$fixnulls" '{
|
|
|
|
if (fixnulls) {
|
|
|
|
for (i = 1; i <= NF; i++) {
|
|
|
|
if ($i == "NULL") $i = ""
|
|
|
|
}
|
|
|
|
}
|
|
|
|
printcsv()
|
|
|
|
}'
|