====== 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:
- **Trasformazione** dei pacchetti **rpm** forniti da Oracle in pacchetti **deb**.
- Installazione di Oracle Instantclient e relativo SDK.
- Compilazione di **gdal** con supporto **oci** dai sorgenti Debian.
- Intallazione dei pacchetti compilati.
===== Installazione di Oracle Instantclient =====
Scaricare dalla pagina [[http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/linuxsoft.html|Oracle]] i seguenti archivi **rpm**:
* oracle-instantclient11.1-basiclite
* oracle-instantclient11.1-devel
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:
* **dpkg-dev**
* **build-essential**
* **fakeroot**
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:
* **gdal-bin**
* **libgdal1-1.5.0**
* **libgdal1-dev**
* **libgdal-doc**
* **libgdal-perl**
* **libgdal-ruby**
* **libgdal-ruby1.8**
* **python-gdal**
===== 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