Capitolo 78.   ODBC

ODBC, ovvero Open database connectivity è un metodo standardizzato per l'accesso ai DBMS. Si attua inserendo un servizio intermedio, tra i DBMS e le applicazioni che devono accedere ai dati: le applicazioni comunicano con il servizio ODBC, mentre il servizio ODBC comunica con i DBMS sottostanti, preoccupandosi di adattarsi alle loro particolarità. Ciò consente di scrivere applicazioni che, attraverso ODBC, sono in grado di utilizzare qualsiasi DBMS con cui il servizio ODBC sia in grado di interagire.

Generalmente, il sistema ODBC non fa tutto da solo, in quanto di solito si avvale di librerie aggiuntive (driver) per la gestione dei DBMS reali.

78.1   DSN

Un DSN, ovvero Data source name, è una base di dati virtuale, del sistema ODBC, individuata da un nome.

Generalmente, un DSN fa riferimento a una base di dati di un certo DBMS reale, con cui il sistema ODBC è in grado di interagire; tuttavia, teoricamente, potrebbe trattarsi di qualunque cosa in grado di comportarsi come una base di dati vera e propria.

78.2   unixODBC

Nei sistemi Unix è disponibile unixODBC,(1) che consente di interagire con un discreto numero di DBMS comuni, attraverso delle librerie aggiuntive per la gestione dei vari DBMS, alcune delle quali vengono elencate qui brevemente:

Una volta installato unixODBC e le librerie per la comunicazione con i DBMS di proprio interesse, occorre provvedere a configurare unixODBC in modo da poterle utilizzare. Per fare questo si interviene nel file /etc/odbcinst.ini; l'esempio seguente riguarda le librerie per comunicare con MySQL e PostgreSQL rispettivamente:

[MySQL]
Description     = MySQL driver
Driver          = /usr/lib/odbc/libmyodbc.so
Setup           = /usr/lib/odbc/libodbcmyS.so
CPTimeout       = 
CPReuse         = 
FileUsage       = 1

[PostgreSQL]
Description     = PostgreSQL ODBC driver
Driver          = /usr/lib/odbc/psqlodbc.so
Setup           = /usr/lib/odbc/libodbcpsqlS.so
Debug           = 0
CommLog         = 1
FileUsage       = 1

Come si può vedere e intuire, alcune direttive non sono comuni per tutti i tipi di DBMS; in pratica, l'inserimento di una sezione per l'accesso a un DBMS richiede un modello da copiare e adattare, per quel caso specifico.

Una volta configurate le librerie per l'accesso ai DBMS, è possibile definire dei DSN, con i quali fare riferimento a delle basi di dati reali presso tali DBMS. unixODBC offre tre modi per memorizzare le informazioni sui DSN, in base al campo di azione previsto per questi: il sistema nel suo insieme, una rete locale, il singolo utente.

Attraverso il file /etc/odbc.ini è possibile dichiarare dei DSN validi nell'ambito del sistema locale, per tutti gli utenti; attraverso dei file che corrispondono al modello /etc/ODBCDataSources/nome.dsn, è possibile dichiarare un DSN che, teoricamente, potrebbe essere condiviso da più elaboratori in una rete locale, con la stessa condivisione della directory /etc/ODBCDataSources/; attraverso i file ~/.odbc.ini, ogni utente può dichiarare i propri DSN personali.

Questi file di configurazione dei DSN, possono contenere direttive raggruppate in sezioni, corrispondenti al nome del DSN. Per esempio, l'estratto seguente dichiara l'accesso alla base di dati, presso l'elaboratore locale, denominata nanodb, accedendo con l'utenza pgnanouser (secondo il DBMS); il nome del DSN è mio:

[mio]
Description             = PostgreSQL
Driver                  = PostgreSQL
Trace                   = No
TraceFile               = 
Database                = nanodb
Servername              = localhost
Username                = pgnanouser
Password                = 
Port                    = 5432
Protocol                = 6.4
ReadOnly                = No
RowVersioning           = No
ShowSystemTables        = No
ShowOidColumn           = No
FakeOidIndex            = No
ConnSettings            = 

L'estratto seguente, invece, dichiara l'accesso alla base di dati, presso l'elaboratore locale, denominata nanodb, accedendo con l'utenza mynanouser (secondo il DBMS); il nome del DSN è mio2:

[mio2]
Description     = MySQL
Driver          = MySQL
Server          = localhost
Database        = nanodb
Username        = mynanouser
Port            = 
Socket          = 
Option          = 
Stmt            = 

78.3   ODBCConfig

Il programma ODBCConfig, che fa parte di unixODBC, consente di configurare i DSN in modo guidato, proponendo dei valori predefiniti appropriati al tipo di DBMS a cui questi vanno associati. Eventualmente, sarebbe possibile anche intervenire nella configurazione di /etc/odbcinst.ini, ma questo non è conveniente, perché in tal caso manca la guida necessaria. Il programma si avvia generalmente senza argomenti:

ODBCConfig

Se il programma viene avviato con i privilegi necessari, può intervenire nella configurazione di /etc/odbc.ini o dei file contenuti nella directory /etc/ODBCDataSources/, altrimenti può operare esclusivamente nel file personale ~/.odbc.ini.

Figura 78.4. Aspetto di ODBCConfig all'avvio.

ODBCConfig

Osservando il programma in funzione, si vedono alcuni lembi posti sul lato superiore. I primi tre ({User DSN}, {System DSN}, {File DSN}) permettono di selezionare una scheda riferita, rispettivamente, alla configurazione dei DSN personali (~/.odbc.ini), di quelli di sistema (/etc/odbc.ini) e di quelli condivisibili (/etc/ODBCDataSources/). La configurazione con una qualsiasi di queste tre schede è uniforme alle altre; quello che cambia sono i privilegi necessari a modificare i file di configurazione rispettivi.

Avendo selezionato una delle tre schede che consentono di intervenire sui DSN, sul lato destro della finestra appaiono dei pulsanti grafici, con i quali è possibile creare, eliminare o modificare dei DSN. Volendo creare un DSN (pulsante <Add>), appare la richiesta di specificare il tipo di DBMS (driver).

Figura 78.5. La maschera con cui si specifica la libreria adatta a comunicare con il DBMS di proprio interesse. Una volta evidenziato, come si vede in questo caso a proposito di PostgreSQL, si deve selezionare il pulsante grafico <Ok>.

ODBCConfig

Successivamente viene proposta una maschera che riproduce, sostanzialmente, le direttive specifiche per quel tipo di libreria, da inserire nel file di configurazione. Fortunatamente, la maschera contiene già dei valori predefiniti appropriati per la maggior parte delle direttive.

Figura 78.6. La maschera con cui si definiscono le direttive per il DSN, nel caso della libreria per il collegamento a und DBMS PostgreSQL. In questo caso viene dichiarato il DSN denominato mio, abbinato alla base di dati nanodb, presso l'elaboratore locale, a cui si accede con l'utenza pgnanouser (la parola d'ordine, ammesso che sia necessaria per accedere, rimane da specificare al momento del collegamento.

ODBCConfig

Nella maschera di inserimento delle direttive, appare un menù di icone, di solito sul lato superiore sinistro. Con l'icona che mostra una «X», si annullano le modifiche, mentre con quella che assomiglia a una «V», si confermano gli inserimenti.

Figura 78.7. Aspetto di ODBCConfig dopo l'inserimento del DSN mio nella configurazione personale dell'utente.

ODBCConfig

Tra le altre schede del programma, è interessante osservare ciò che è contenuto in quella denominata {Advanced}. Lì dovrebbe essere visibile il percorso di un file usato per annotare l'esito delle interrogazioni avvenute con le basi di dati reali, per poter risalire alla causa di un problema, quando l'utilizzo di ODBC sembra fallire senza un motivo apparente. In ogni caso, questo file dovrebbe corrispondere a /tmp/sql.log.

78.4   Accesso a ODBC tramite «isql» o «iusql»

unixODBC include due programmi equivalenti, per accedere a un DSN attraverso istruzioni SQL impartite interattivamente. Attraverso questi programmi si può verificare in pratica il funzionamento di un certo DSN:

isql nome_dsn [nome_utente [parola_d'ordine]] [opzioni]
iusql nome_dsn [nome_utente [parola_d'ordine]] [opzioni]

La differenza tra i due programmi dovrebbe consistere nella migliore disposizione del secondo verso la codifica universale.

Dalla sintassi mostrata sull'uso dei due programmi, si può osservare che è obbligatorio l'inserimento del nome del DSN con cui ci si vuole connettere, mentre gli altri dati sono facoltativi, perché potrebbero essere memorizzati nella configurazione del DSN stesso, oppure, nel caso della parola d'ordine, potrebbe non essere richiesta dal DBMS per accedere. A titolo di esempio, si suppone di collegarsi al DSN mio, per il quale è già stato specificato il nominativo utente da usare e la parola d'ordine non è richiesta:

isql mio[Invio]

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

Come si vede, viene suggerito ciò che si può fare: inserire istruzioni SQL, usare il comando help o quit. A questo punto non c'è molto da spiegare; si comprende che possono essere impartite delle istruzioni SQL (secondo i canoni di ODBC) e che al termine si può concludere con il comando quit.

SQL> quit[Invio]

Il problema nell'uso di un programma come questo, semmai, sta nel fatto che, di fronte a un errore, la spiegazione che si ottiene è estremamente scarna e occorre leggere il file in cui i messaggi del DBMS reale vengono scaricati (di solito è /tmp/sql.log).

78.5   Riferimenti


1) unixODBC   GNU GPL e GNU LGPL

2) PostgreSQL ODBC   GNU GPL

3) MyODBC   GNU GPL

«a2» 2013.11.11 --- Copyright © Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net