Table of Contents

GDAL/OGR con supporto ad Oracle su Debian GNU/Linux

Questa ricetta serve a compilare la libreria GDAL/OGR con il supporto ad Oracle su una Debian Lenny.

Il supporto viene chiamato OCI (Oracle Call Interface) e viene fornito dal software Oracle Instantclient. Per la compilazione di GDAL è necessario anche il relativo Oracle Instantclient SDK.

I passaggo sono i seguenti:

  1. Trasformazione dei pacchetti rpm forniti da Oracle in pacchetti deb.
  2. Installazione di Oracle Instantclient e relativo SDK.
  3. Compilazione di gdal con supporto oci dai sorgenti Debian.
  4. Intallazione dei pacchetti compilati.

Installazione di Oracle Instantclient

Scaricare dalla pagina Oracle i seguenti archivi rpm:

Si tratta della libreria OCI vera e propria e dei file header per compilare programmi contro questa libreria.

Con alien (pacchetto da installare) convertire i pacchetti .rpm in .deb, quindi installare i pacchetti .deb (per eseguire alien come utente non privilegiato è possibile utilizzare fakeroot):

alien oracle-instantclient11.1-basiclite-*.rpm
alien oracle-instantclient11.1-devel-*.rpm
dpkg -i oracle-instantclient11.1-*.deb

Con dpkg -L pacchetto si scopre il percorso di installazione di libreria e header.

Aggiungere il path della libreria Oracle alla configurazione di ldconfig e aggiornare la cache di ldconfig:

echo /usr/lib/oracle/11.1/client/lib > /etc/ld.so.conf.d/oci.conf
ldconfig

La conversione da rpm a deb non suggerisce le dipendenze, bisogna installare manualmente il pacchetto Debian libaio1:

apt-get install libaio1

Compilare GDAL/OGR come pacchetto Debian

Installare i pacchetti di sviluppo Debian, una selezione minima potrebbe essere:

Scaricare i sorgenti della libreria GDAL:

mkdir -p /usr/local/src/gdal
cd /usr/local/src/gdal
apt-get source gdal
cd gdal-1.5.2

Modificare il file debian/rules, in modo da includere nella fase di configure anche le librerie OCI, in pratica oltre ai vari --with-mysql, --with-pg, --with-sqlite si deve aggiungere due righe (attenzione a mettere anche il backslash a fine riga):

--with-oci-include=/usr/include/oracle/11.1/client \
--with-oci-lib=/usr/lib/oracle/11.1/client/lib \

Le Debian rules cercano la libreria Oracle nnz10 (almeno per gdal 1.5.2-3), mentre attualmente esiste la libreria nnz11; sistemare con un link simbolico:

ln -s libnnz11.so /usr/lib/oracle/11.1/client/lib/libnnz10.so

Infine lanciare la compilazione del pacchetto (l'opzione -rfakeroot è richiesta solo se non si è utente root):

dpkg-buildpackage -rfakeroot

La libreria GDAL richiede la presenza di molte librerie e per la sua compilazione sono richiesti i rispettivi header file. Per fortuna dpkg-buildpackage elenca tutti i pacchetti necessari (le build dependencies) non appena viene lanciato. Si deve provvedere ad installare tutti i pacchetti richiesti.

Al termine della compilazione, nella directory padre si trovano i pacchetti:

Installazione e verifica

Si installano almeno i pacchetti gdal-bin e libgdal1-1.5.0. Conviene metterli on-hold per evitare che vengano aggiornati:

echo "libgdal1-1.5.0 hold" | dpkg --set-selections 
echo "gdal-bin hold"       | dpkg --set-selections 

Per verificare che la libreria installata abbia il supporto Oracle:

ldd /usr/lib/libgdal1.5.0.so | grep oracle
ogrinfo --formats

Una layer OGR/Oracle su MapServer si ottiene con un mapfile del tipo:

  LAYER
    NAME "aree_strada"
    STATUS DEFAULT
    TYPE POLYGON
    CONNECTIONTYPE OGR
    CONNECTION "OCI:username/passwd@192.168.1.122"
    DATA "tablename"
    CLASS
      COLOR 212 164 96
    END
  END

La stringa di connessione è composta come segue:

OCI:username/passwd@host:port/service_name:tablename"

Il service_name viene detto anche istanza nella terminologia Oracle. Il server Oracle risponde sulla porta 1521 TCP.

Un esempio di interrogazione SQL con ogrinfo:

ogrinfo "OCI:username/passwd@host:port/service_name:tablename" \
    -sql 'SELECT TOPONIMO_STRADA FROM REPLICA_TOPONOMASTICA.TOP_CIVICI'

Charset encoding

Per determinare il charset utilizzato dalla libreria OCI si imposta la variabile d'ambiente NLS_LANG:

export NLS_LANG=italian_italy.UTF8

Tale configurazione è fondamentale ad esempio quando si importano dati da Oracle a PostgreSQL con ogr2ogr e il charset originale non coincide con quello desiderato.

Per vedere il charset utilizzato da Orcale:

SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
PARAMETER            VALUE
-------------------- -----------------
NLS_CHARACTERSET     WE8ISO8859P1

È probabile che sia necessario impostare anche la variabile NLS_NUMERIC_CHARACTERS che definisce il carattere separatore dei decimali e il carattere di raggruppamento delle migliaia (il punto decimale e la virgola per gli anglosassoni, la virgola decimale e il punto per l'Italia):

export NLS_NUMERIC_CHARACTERS=".,"

Per sapere quale convenzione utilizza Oracle è sufficiente fare il dump della tabella con ogrinfo e visualizzare il contenuto:

ogrinfo 'OCI:username/password@hostname:port/instance:tablename' geom_feature > tablename.dump