Introduction
SQSH (prononcer skwish) est un remplaçant très pratique de l’utilitaire isql
fourni par Sybase. Il permet d’intégrer du shell dans les commandes SQL :
historique des commandes, variables, redirections, pipes, fonctions,
combinaison avec les utilitaires awk, grep
, etc.
% sqsh -r ../etc/sqshrc
sqsh-2.1.7 Copyright (C) 1995-2001 Scott C. Gray Portions Copyright (C) 2004-2010 Michael Peppler This is free software with ABSOLUTELY NO WARRANTY For more information type '\warranty' Password:
[10] DEV_D2_ASE.master.1> select name from sysobjects [10] DEV_D2_ASE.master.2> go | grep 'LD_OUT'
LD_OUT_ADM_ALL_MIRT_ACC LD_OUT_ADM_ALL_MIRT_BTY_BUS LD_OUT_ADM_ALL_MIRT_CAF_LEVEL
Cet utilitaire sqsh
est portable sur les environnements Windows grâce à
Cygwin.
La compilation de sqsh 2.1.7 avec SunStudio 12.1 sur une plateforme Solaris 10 X86 en 64 bits avec Sybase Adaptive Server Enterprise 15.5 64 bits nécessite quelques adaptations assez importantes, adaptations qui font l’objet de cet article. Pour plus d’informations sur l’installation des compilateurs SunStudio 12.1 : Installation de Sun Studio 12 sur Sun Solaris 10 X86 pour les compilations .
sqsh 2.1.7 est compilé avec la librairie GNU readline 6.2 64 bits, librairie
qui permet d’activer l’historique des commandes dans sqsh
. Pour plus
d’informations sur la compilation de GNU Readline sur Sun Solaris 10 X86 : Compilation de GNU Readline sur Sun Solaris 10 X86.
La distribution Sybase 15.5 ESD#4 64 bits pour Sun Solaris 10 X86 est
installée dans le répertoire /Software/sybase/sybase-15.5
($SYBASE
). Pour la
compilation de sqsh 2.1.7, la distribution Sybase SDK Open Client/Open Server
15.5 ESD#10 est installée également dans le répertoire $SYBASE
.
Quelques exemples pratiques d’utilisation de sqsh
sont ensuite proposés,
notamment à propos des dernières nouveautés.
Téléchargement
sqsh 2.1.7 est disponible en téléchargement sous la forme d’une archive
compressée (sqsh-2.1.7.tar.gz
) à cette adresse : SQSH Download.
L’archive sqsh-2.1.7.tar.gz
est transférée avec ftp
sur la machine cible
dans le répertoire /Software/tools/temp
puis décompressée et désarchivée avec
les utilitaires gunzip
et tar
% cd /Software/tools/temp
% gunzip -c sqsh-2.1.7.tar.gz | tar xvf -
Le code source est alors désarchivé avec la commande tar
dans le sous
répertoire ./sqsh-2.1.7
.
Préparation de l’environnement pour la compilation de sqsh 2.1.7 avec SunStudio 64 bits
Environnement général
La variable $PATH
est mise à jour avant la compilation pour référencer
/usr/ccs/bin
, répertoire qui contient les binaires ld
et ar
, indispensables
pour la génération des librairies dynamiques et statiques.
% PATH=/usr/ccs/bin:$PATH
% export PATH
Si les liens de SunStudio n’ont pas été installés dans /usr/bin
lors de
l’installation, la variable $PATH
doit référencer également le répertoire
<répertoire de sunstudio 12.1>/bin
pour trouver les compilateurs.
% PATH=/opt/sunstudio12.1/bin:$PATH
% export PATH
Il s’agit d’une compilation en 64 bits, la variable $CFLAGS
est donc mise à
jour à -m64
:
% CFLAGS=-m64
% export CFLAGS
Environnement Sybase Open Client 64 bits
Pour une compilation optimale avec les librairies Sybase 15.5 Open Client 64
bits, sourcer l’environnement Sybase grâce au script SYBASE.sh
qui se trouve à
la racine de la distribution Sybase (/Software/sybase/sybase-15.5
ici).
% . /Software/sybase/sybase-15.5/SYBASE.sh
Ce script générique bien connu initialise les variables d’environnement
$SYBASE, $SYBASE_OCS, $LD_LIBRARY_PATH, $LD_LIBRARY_PATH_64
, etc. (la sortie
est allégée pour la lisibilité).
% env
SYBASE=/Software/sybase/sybase-15.5 SYBASE_OCS=OCS-15_0 INCLUDE=/Software/sybase/sybase-15.5/OCS-15_0/include LD_LIBRARY_PATH_64=/Software/sybase/sybase-15.5/DataAccess64/ODBC/lib: /Software/sybase/sybase-15.5/DataAccess64/ODBC/dm/lib64: /Software/sybase/sybase-15.5/ASE-15_0/lib: /Software/sybase/sybase-15.5/OCS-15_0/lib:/Software/sybase/sybase-15.5/OCS-15_0/lib3p64: /Software/sybase/sybase-15.5/OCS-15_0/lib3p
Les librairies 64 bits de l’Open Client Sybase 15.5 sont dans le répertoire
$SYBASE/$SYBASE_OCS/lib
. Celles qui sont utiles à sqsh
sont les suivantes :
Librairie | Commentaire |
---|---|
libsybblk64.so |
Librairie pour les APIs Bulk Copy |
libsybct64.so |
Librairie CT-LIB (Client Library) |
libsybcs64.so |
Librairie CS-LIB |
libsybtcl64.so |
Librairie Transport Control Layer (Couche de contrôle de transport) |
libsybcomn64.so |
Librairie interne commune |
libsybintl64.so |
Librairie support de localisation (Jeux de caractères, langues…). |
Si l’environnement Sybase n’est pas sourcé, le script de configuration tombe en erreur :
configure: error: Unable to locate Sybase installation.
Check your SYBASE environment variable setting.
Lorsque l’environnement est sourcé : le script de configuration remonte la détection des librairies Sybase :
checking Open Client installation... /Software/sybase/sybase-15.5/OCS-15_0
checking Open Client libraries... -lsybblk64 -lsybcs64 -lsybct64
-lsybtcl64 -lsybcomn64 -lsybintl64
Pour une compilation avec Sybase Open Client 15 64 bits, l’option -DSYB_LP64
doit être mentionnée dans la variable $CFLAGS
:
% CFLAGS=" -DSYB_LP64 $CFLAGS"
% export CFLAGS
Environnement readline
Lorsque sqsh
est compilé en 64 bits, la librairie readline doit être également en 64 bits.
Dans le contexte de cet article, la librairie GNU readline 6.2 64 bits est
installée dans un répertoire non standard : /Software/tools/misc/lib
. Pour plus
d’informations sur la compilation de GNU Readline sur Sun Solaris 10 X86 : Compilation de GNU Readline sur Sun Solaris
10 X86.
Afin que le script de configuration de la compilation de sqsh 2.1.7 détecte
la librairie readline 6.2 libreadline.so.6
identifiée par le lien symbolique
libreadline.so
, la variable $LD_LIBRARY_PATH
est mise à jour pour référencer le
répertoire /Software/tools/misc/lib
en premier.
% LD_LIBRARY_PATH=/Software/tools/misc/lib:$LD_LIBRARY_PATH
% export LD_LIBRARY_PATH
La sortie du script de configuration de la compilation de sqsh 2.1.7 permet de bien vérifier où la librairie readline est détectée et si il s’agit de la bonne version :
checking for libreadline... /Software/tools/misc/lib
...
checking for rl_completion_matches in -lreadline... yes
Lorsqu’aucune librairie readline n’est détectée à la configuration :
checking for libreadline... not found
Configuration
Une fois l’environnement préparé (variables $PATH, $CFLAGS
), la
configuration de la compilation peut être déclenchée. L’option --help
renvoie
les options de configuration (la sortie de l’option --help
est allégée pour la
lisibilité).
% cd /Software/tools/temp/sqsh-2.1.7 % ./configure --help
`configure' configures this package to adapt to many kinds of systems. ... Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, `make install' will install all the files in `/usr/local/bin', `/usr/local/lib' etc. You can specify an installation prefix other than `/usr/local' using `--prefix', for instance `--prefix=$HOME'. ... Optional Packages: ... --with-readline support fancy command line editing --with-old-readline Force readline backwards compatibilty ...
L’option --prefix
est spécifiée pour sqsh
afin de délocaliser l’installation
dans le répertoire /Software/tools/sqsh
(DIR) : --prefix=/Software/tools/sqsh
.
L’installation n’est pas réalisée dans son répertoire par défaut /usr/local
.
Afin de bénéficier de l’historique et du rappel des commandes dans sqsh
grâce à la librairie readline, la configuration est réalisée avec l’option
--with-readline
.
La ligne de configuration de la compilation est la suivante dans cet exemple pratique :
% cd /Software/tools/temp/sqsh-2.1.7
% ./configure --prefix=/Software/tools/sqsh --with-readline
Malheureusement, pour la librairie readline, le script de configuration
recherche les fichiers entête *.h
(readline.h) dans les répertoires systèmes
/usr.
checking for readline/readline.h... not found
Même la mise à jour de la variable $CFLAGS
pour ajouter
-I/Software/tools/misc/include
est sans effet. Si la librairie readline n’est
pas dans les répertoires systèmes /usr
comme c’est le cas ici, il faut éditer
le script configure
et modifier vers la ligne 3107 la définition de la variable
SEARCH_PATH
afin d’y inclure le répertoire include
qui contient le fichier
entête readline.h
.
configure
…
SEARCH_PATH="/Software/tools/misc/include:/usr/include:/usr/local/include:
${HOME}/include:${HOME}/usr/include"
…
checking for readline/readline.h... /Software/tools/misc/include
Compilation et installation
La compilation et l’installation de sqsh 2.1.7 sont réalisées avec les
commandes make
et make install
.
% cd /Software/tools/temp/sqsh-2.1.7
% make
% make install
À cette étape, les ennuis arrivent sur des incompatibilités 32 bits/64 bits:
ld: fatal: file cmd_alias.o: wrong ELF class: ELFCLASS64
ld: fatal: File processing errors. No output written to sqsh
*** Error code 1
make: Fatal error: Command failed for target `sqsh'
Current working directory /Software/tools/temp/sqsh-2.1.7/src
*** Error code 1
The following command caused the error:
for dir in src; do \
(cd $dir; make) \
done
make: Fatal error: Command failed for target `build-subdirs'
Si une telle erreur se produit, c’est une erreur qui se glisse dans le
fichier ./src/Makefile
à l’issue de la configuration : il manque l’option -m64
pour cc
. Éditer le fichier Makefile
et ajouter l’option -m64
:
./src/Makefile
…
CC = cc -m64
…
Utilisation
Configuration
sqsh
est un simple binaire installé dans DIR/bin
.
Avant d’utiliser sqsh
, l’environnement Sybase 15.x Open client 64 bits doit
être sourcé si ce n’est pas le cas avec un script comme par exemple SYBASE.sh
mentionné précédemment.
% . /Software/sybase/sybase-15.5/SYBASE.sh % ldd /Software/tools/sqsh/bin/sqsh
libsybblk64.so => /Software/sybase/sybase-15.5/OCS-15_0/lib/libsybblk64.so libsybcs64.so => /Software/sybase/sybase-15.5/OCS-15_0/lib/libsybcs64.so libsybct64.so => /Software/sybase/sybase-15.5/OCS-15_0/lib/libsybct64.so libsybtcl64.so => /Software/sybase/sybase-15.5/OCS-15_0/lib/libsybtcl64.so libsybcomn64.so => /Software/sybase/sybase-15.5/OCS-15_0/lib/libsybcomn64.so libsybintl64.so => /Software/sybase/sybase-15.5/OCS-15_0/lib/libsybintl64.so ...
Il est accompagné d’un fichier de configuration sqshrc
installé dans le
répertoire DIR/etc
, fichier de configuration qui définit des variables comme la
profondeur d’historique des commandes, la nomenclature de l’invite des
commandes, etc. Ce fichier de configuration permet également de définir le
serveur Sybase ASE et le compte sa
/Software/tools/sqsh/etc/sqshrc
...
\set histsize=20
\set prompt='[$histnum] ${DSQUERY}.${database}.${lineno}> '
...
\set DSQUERY=DEV_D2_ASE
\set username=sa
\set password=*********
Le fichier de configuration sqshrc
est donné au binaire sqsh
avec l’option
-r
:
% cd /Software/tools/sqsh/bin
% sqsh -r ../etc/sqshrc
Les historiques des commandes sont gérés automatiquement dans les fichiers
$HOME/.sqsh.readline
et $HOME/.sqsh.history
.
Pour être encore plus générique et ne pas coder en dur le nom du serveur ASE et le mot de passe du compte sa dans le fichier sqshrc :
sqshrc
\set DSQUERY=$DSQUERY
\set username=sa
\set password=`cat $CFG/script/mdp/mdp_sa`
Pour simplifier l’appel de sqsh
avec son fichier de configuration, un alias,
i par exemple, peut être créé dans le script $HOME/.kshrc
ou le script
$HOME/.profile
:
$HOME/.kshrc
alias i="/Software/tools/sqsh/bin/sqsh -r /Software/tools/sqsh/etc/sqshrc -b -w 1000"
Exemple d’appel :
% i
[11] DEV_D2_ASE.master.1>
Fonctionnalités très pratiques : fonctions et combinaison de sqsh avec bcp
Un tour d’horizon de toutes les fonctionnalités de sqsh
n’est pas l’objectif
de cet article, la documentation officielle de sqsh
est très complète,
toutefois 2 fonctionnalités très pratiques à noter : les fonctions et la
combinaison sqsh
avec bcp
.
Les fonctions
Les dernières versions de sqsh
offrent les fonctions. La fonction stats
pour
activer/désactiver les traces par exemple (showplan, statistics io, statistics
time
…) peut être définie dans le fichier sqshrc
:
\func stats
set showplan ${1}
set statistics io ${1}
set statistics time ${1}
go
\done
La fonction stats
est appelée dans sqsh
avec la commande \call
:
[14] DEV_D2_ASE.master.1> \call stats on
Interactions de sqsh avec bcp
sqsh
supporte le transfert d’un jeu de résultats vers un serveur ASE via le
protocole bcp
avec la commande \bcp
. Fonctionnalité intéressante lorsqu’il
s’agit d’un jeu de résultats retourné par une procédure stockée T-SQL.
[29] DEV_D2_ASE.mir.1> select PROD_TID, [29] DEV_D2_ASE.mir.2> LAST_FPP_UPDATE from PRODUCT_FPP [29] DEV_D2_ASE.mir.3> \bcp -STST_T2_ASE mir.dbo.SPA
Starting copy... Batch successfully bulk-copied to SQL Server 5875 rows copied. Clock Time (sec.): Total = 0.3430 Avg = 0.0001 (17125.98 rows per sec.)