132 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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 [db [query]] [-- mysql options]
 | 
						|
 | 
						|
db      est le nom de la base de données
 | 
						|
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.
 | 
						|
 | 
						|
OPTIONS
 | 
						|
    -h host
 | 
						|
    -P port
 | 
						|
    -u user
 | 
						|
    -ppassword
 | 
						|
        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--
 | 
						|
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= \
 | 
						|
    -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"
 | 
						|
 | 
						|
database="$1"; shift
 | 
						|
query="$1"; shift
 | 
						|
[ "$1" == "--" ] && shift
 | 
						|
 | 
						|
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
 | 
						|
 | 
						|
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()
 | 
						|
}'
 |