Perl, Oracle 11g, Apache et Ubuntu…

Perl ! un autre de ces langages qui vont tellement bien avec Oracle… C’est John Scoles de The Pythian Group qui s’occupe du module DBD::Oracle. Il faut dire que c’est le langage de prédilection des DBA qui utilisent Unix et Windows (A mon corps défendant en ce qui me concerne mais quand même !). Si vous cherchez à savoir si vous pouvez utiliser Perl avec Oracle 11.1, la réponse est en détail dans cet échange et en substance oui.

Pour les besoins d’un proof of concept, j’ai développé quelques écrans web en Perl et ce premier Post synthétise comment installer Perl, DBD::Oracle avec Oracle 11g avant de l’utiliser avec Apache sur Ubuntu. Un prochain post (C’est l’intention qui compte, non ?) devrait aborder la question de l’utilisation des LOB avec Perl.

Installer Perl, DBI et DBD::Oracle avec Oracle 11g sur Ubuntu

Ça prend 15 minutes mais, comme dit un de mes amis, ça va mieux en le disant. Pour installer Perl sur Ubuntu (Si ce n’est pas déjà fait), il suffit de lancer la commande ci-dessous :

sudo apt-get install perl

Pour installer Oracle 11g sur Ubuntu, regardez ce post de Augusto. Le client suffit si vous ne voulez pas installer Oracle Server.

Une fois Perl et Oracle installés, vous pouvez installer DBI et DBD::Oracle. Pour cela vous pouvez directement installer les modules depuis CPAN.org comme décrit ici. Je ne sais pas si c’est possible d’installer DBD::Oracle avec 11g de cette manière (sûrement !). La méthode que j’utilise pour ma part, fonctionne même quand votre client n’a pas d’accès à Internet, consiste à :

http://search.cpan.org/~pythian/DBD-Oracle/Oracle.pm
est l'URL ou vous trouverez le fichier DBD-Oracle-x.xx.tar.gz;
vous pouvez le téléchargez avec wget
  • Mettre le fichier sur la machine cible et le décompresser :
tar -zxvf DBD-Oracle*.tar.gz
cd DBD-Oracle*
  • Positionnez la variable ORACLE_HOME
export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1 
  • Créez le fichier Makefile avec Perl (C’est la qu’est l’astuce le -l permet de compiler sans que les makefile de client d’Oracle soient disponibles. Il se trouve qu’en 11g ces fichiers sont sur le CD client et plus avec le serveur comme c’était le cas avec 10g).
perl Makefile.PL -l 
  • Compilez le module
make
  • Installez DBD::Oracle
sudo make install
  • Supprimez la distribution
cd ..
rm -rf DBD-Oracle*
  • Testez que le module est dans les modules reconnus par Perl
cat >test.pl <<EOF
use DBI;
use DBD::Oracle;
EOF
perl test.pl

Quelques remarques :

  • Vous devez installer DBI avant DBD::Oracle si ce n’est pas déjà fait. La procédure est essentiellement la même au nom de fichier prêt et au flag « -l » que vous n’avez pas besoin d’utiliser dans le cas de DBI
  • Si vous n’avez pas la possibilité de vous connecter root ou d’exécuter le make install avec la commande sudo, il faudra installer DBI et DBD::Oracle dans un répertoire local à votre utilisateur ; pour ce faire :
    • Changez le chemin d’installation de votre module en ajoutant la variable PREFIX=/home/username/pm lorsque vous construisez le fichier Makefile. Voici un exemple d’une telle commande :
      perl Makefile.PL PREFIX=/home/username/pm
    • Positionnez la variable d’environnement PERL5LIB avant de lancer perl pour vous assurer que le module est bien dans le chemin de recherche de Perl. (Il s’agit de pointer sur le répertoire qui contient le .pm du module Perl :
      export PERL5LIB=/home/username/pm/lib/perl5/site_perl/5.8.5:$PERL5LIB
  • Enfin, si Perl n’est pas installé et que vous ne pouvez pas vous connecter root ou exécuter apt-get avec sudo ou si Perl est déjà installé dans une version différente de celle que vous voulez utiliser, il est très simple de l’installer à partir des sources :
    • Récupérez la version de Perl qui vous intéresse sur la page source du site CPAN
    • Faire l’extraction du fichier TARBALL et naviguez dans le répertoire correspondant
    • Lancez l’installation de Perl à l’aide de la commande suivante. Le « prefix » l’installation vous sera demandé ; Précisez un directory que vous avez créé pour l’occasion et pour lequel vous avez les droits en lecture et écriture :
      ./Configure
    • « perl » est normalement accessible depuis ~/bin et le prefix sera ajouté automatiquement lors de l’installation des modules DBI et DBD

Testez DBD::Oracle

On ne peut vraiment pas comparer JavaEE et Perl quand on parle de développer des application web et pourtant, il y a vraiment un truc génial avec Perl, c’est qu’un script qui génère une page HTML est exactement comme un script quelconque, hormis que vous voudrez imprimer du HTML plutôt que du texte simple. Pour tester Perl et Oracle, écrivez un script comme celui ci-dessous (par exemple dans un fichier example1.pl) :

#!/usr/bin/perl -w
use strict;
use DBI;

print "Content-type: text/htmlrnrn";
print "n";

$ENV{ORACLE_HOME}='/u01/app/oracle/product/11.1.0/db_1';

my $dbh = DBI->connect( 'dbi:Oracle:ORCL', 'scott', 'tiger',
{ RaiseError => 1, AutoCommit => 0 }
) || die "Can't connect to the database : $DBI::errstr";

my $sql = qq{ select dummy from dual };
my $sth = $dbh->prepare( $sql );
$sth->execute();

my( $dummy );
$sth->bind_columns( undef, $dummy );

while( $sth->fetch() ) {
print "dummy : $dummy
n";
}

$dbh->disconnect();
print "n";

N’oubliez pas :

  • de remplacer ORACLE_HOME par le ORACLE_HOME de votre client
  • de remplacer ORCL par l’alias TNS décrivant la connexion à la base de données
  • de remplacer « scott » et « tiger » par un nom d’utilisateur et un mot de passe pour vos connecter à votre base de données

Pour exécuter, votre « page web », lancer la commande ci-dessous :

perl example1.pl

Le résultat, ci ce fonctionne, ressemble a ceci :

Content-type: text/html


Database connection
dummy : X


Installer Apache et mod_perl.
Je ne rentrerai pas ici dans le détail de comment installer Apache manuellement ou de le configurer. La magie d’Ubuntu est toujours la même, si vous utilisez aptitude, ça prend 5 minutes ; Vous trouverez des détails sur ce post. En substance, lancez les 2 commandes qui suivent :

sudo apt-get install apache2
sudo apt-get install libapache2-mod-perl2

C’est fait !

La manière dont les fichiers de configuration et le répertoire racine sont disposés sur Ubuntu est vraiment simple de lecture et d’utilisation. Pour une première app
roche, créez un répertoire cgi-bin sous /var/www :

sudo mkdir /var/www/cgi-bin

L’ensemble des fichiers de configurations sont dans /etc/apache2. Editez le fichier qui contient le paramétrage du site par défaut

sudo vi /etc/apache2/sites-available/default

Remplacez les références à /usr/lib/cgi-bin par des references à /var/www/cgi-bin comme ci-dessous :

ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

Redémarrez Apache

sudo /etc/init.d/apache2 restart

Pour vérifier que tout fonctionne

Copiez le fichier example1.pl créé précédemment dans /var/www/cgi-bin et positionnez les droit d’exécutions pour Apache comme ci-dessous :

sudo cp ~/example1.pl /var/www/cgi-bin/.
sudo chmod a+x /var/www/cgi-bin/example1.pl

En supposant que Apache fonctionne sur le port 80, vous pouvez simplement utiliser wget pour tester votre example comme ci-dessous :

wget http://localhost/cgi-bin/example1.pl -O -

Le résultat, ressemble a ce qui suit :

--16:39:18--  http://localhost/cgi-bin/example1.pl
=> `-'
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]

[<=> ] 0 --.--K/s
Database connection
dummy : X

[ <=> ] 63 --.--K/s

16:39:19 (7.49 MB/s) - `-' saved [63]

Voila c’est aussi simple que ça. Rendez-vous est pris pour discuter de comment manipuler des LOB avec Perl mais c’est déjà une autre histoire.