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()
 | |
| }'
 |