nutools/mysqlcsv

146 lines
4.6 KiB
Plaintext
Raw Permalink Normal View History

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
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
-h, --host HOST
-P, --port PORT
-u, --user USER
2014-01-22 15:42:11 +04:00
-pPASSWORD
-D, --database DATABASE
2013-08-27 15:14:44 +04:00
Informations de connexion à la base de données
-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.
-N, --no-headers
2013-08-27 15:14:44 +04:00
Ne pas afficher les en-têtes
-c, --force
2013-08-27 15:14:44 +04:00
Continuer le traitement même en cas d'erreur
-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
\\ --> \\\\
-n, --nulls
2013-08-27 15:14:44 +04:00
Transformer dans le flux en sortie les valeurs NULL en chaines vides
-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
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()
}'