Accès à une base Sybase en perl via DBD::Sybase

1. Installer FreeTDS


FreeTDS est un jeu de librairies permettant à un programme écrit en C de communiquer avec une base Sybase ou MS SQL Server. Il est téléchargeable à partir du site http://www.freetds.org/.

Voici les étapes nécéssaires pour installer FreeTDS :
$ tar xvfz freetds-0.53.tgz
$ cd freetds-0.53
$ configure

Par défaut, FreeTDS est installé dans /usr:local/lib. Pour installer FreeTDS sous /usr/lib, on tapera :
$ configure --prefix=/usr

On lance ensuite la compilation
$ make

Une série de tests peuvent être effectués de manière automatique, afin de voir si la connexion à une base Sybase peut s'établir correctement. Pour cela il faut commencer par créer un fichier .freetds.conf dans son répertoire $HOME. Ce fichier contient des informations concernant les serveurs auxquels FreeTDS peut se connecter. En voici un exemple :



# Global settings, any value here may be overridden by a database
# server specific section
[global]
        # TDS protocol version
 tds version = 4.2

 initial block size = 512

 swap broken dates = no

 swap broken money = no

 # Database server login method, if both server and domain
 # logins are enabled, domain login is tried first if a domain
 # is specified, and if that fails the server login will be used.
 try server login = yes
 try domain login = no

 # The default authentication domain, can be overridden by
 # specifying a username with a domain prefix, e.g. DOMAIN\username
; nt domain = WORKGROUP

 # If the server responds with different domain try that one?
 cross domain login = no

 # Whether to write a TDSDUMP file for diagnostic purposes
 # (setting this to /tmp is insecure on a multi-user system)
; dump file = /tmp/freetds.log
; debug level = 10

 # Command and connection timeouts
; timeout = 10;
; connect timeout = 10;

# This is a Sybase hosted database server, if you are directly on the
# net you can use it to test.
[JDBC]
 host = cephise.cines.fr
 port = 8514
 tds version = 5.0


On notera que ce fichier contient des infos concernant le serveur cephise.cines.fr. Ce serveur est réprésenté par la chaine "JDBC".

Le fichier PWD, présent dans le répertoire courant, doit contenir le serveur et les identifiants nécéssaires pour se connecter à une base Sybase. Il faut donc éditer le fichier PWD  de façon à ce qu'il ressemble à ceci :



UID=login
PWD=pass
SRV=JDBC
DB=tempdb


(remplacer login et pass par de véritables valeurs)
 

Pour lancer les tests :
$ make check
 

Pour installer FreeTDS sur votre système (en tant que root):
$ su -c 'make install'
 
 
 

2. Installer DBD::Sybase


Le module DBD::Sybase est une implémentation de l'API DBI pour Sybase, téléchargeable à l'adresse http://www.mbay.net/~mpeppler/. Pour de plus amples informations concernant DBI, se reporter à http://dbi.perl.org.

Pour installer DBD::Sybase :
$ tar xvzf DBD-Sybase-0.94.tar.gz
$ cd DBD-Sybase-0.94
$ perl Makefile.PL
$ make

De même que pour FreeTDS, il est possible à ce stade de lancer des test pour vérifier les possibilités de connexions. Pour cela, éditer le fichier PWD présent dans le répertoire courant, de façon à ce qu'il ressemble à :



PWD=pass
SRV=JDBC
UID=login

Ensuite, lancer les tests :
$ make test
 

Si tout s'est bien déroulé (pas de messages d'erreurs ou d'attentes interminables), on peut installer DBD::Sybase sur le système (en tant que root).
$ su
$ make install
 
 

3. Tester le module DBD::Sybase

Voici un petit script permettant de tester le serveur Sybase (il affiche la liste des noms de gènes dans IMGT)

#!/usr/bin/perl

use DBI();

$dbh = DBI->connect("dbi:Sybase:server=JDBC",
                    "login",
                    "pass");
 

@ary_data = queryAllRecords("select * from genelist");

foreach $seq (@ary_data) {
    print $seq->{genename} . "\n";

}
 

#
# recupere un tableau a partir d'une requete SQL
#
sub queryAllRecords {
        my ($lstr_SQLquery) = @_;

        my $sth = $dbh->prepare($lstr_SQLquery);
        $res = $sth->execute();
        @rows = ();
        while ($row = $sth->fetchrow_hashref) {
                push(@rows, $row);
        }
        return @rows;
}


Ce script affiche quelque chose comme ceci :
 



IGHA2
IGHE
IGHEP1
IGHG1
IGHG2
IGHG3
IGHG4
IGHGP
IGHM
IGHD1-1
IGHD1-7
IGHD1-14
IGHD1-20
IGHD1-26
IGHD2-2
IGHD2-8
IGHD2-15
IGHD2-21
IGHD3-3
.
.