====== 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