Sybase Adaptive Server Enterprise 15.5 et sqsh 2.1.7 sur Sun Solaris 10 X86 64 bits

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.)