#!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 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 -P PORT -u USER -pPASSWORD -D DATABASE Informations de connexion à la base de données -C 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 Ne pas afficher les en-têtes -c Continuer le traitement même en cas d'erreur -r 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 Transformer dans le flux en sortie les valeurs NULL en chaines vides -f 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." } source "$(dirname "$0")/ulib/ulib" && urequire DEFAULTS || exit 1 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 "${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="<$(quoted_arg "$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() }'