giovedì 2 novembre 2017

Server Apache+PHP su ubuntu che accede ad iSeries


Dopo anni (post analogo su questo blog è del 2008) ho rifatto un server ubuntu con Apache e php che accede ad un database DB2 su iSeries.

1 - ho fatto una installazione standard di un ubuntu 17.10 con apache e php7.1

2 - ho installato alcuni pacchetti utili unixodbc, php7.1-odbc, odbcinst e dipendenze

3 - installato ibm-iaccess-1.1.0.7-1.0.amd64.deb scaricato da IBM (non facile trovarlo!)

4 - ho creato i link simbilici alle librerie introdotte da IBM con
sudo ln -s /opt/ibm/iSeriesAccess/lib64/libcwb* /usr/lib

5 - ho lanciato
odbcinst -j


6 - ho modificato il file /etc/odbcinst.ini:
[ODBC Drivers]
IBM i Access ODBC Driver
Description = IBM i Access for Linux ODBC Driver
Driver = /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
Setup = /opt/ibm/iSeriesAccess/lib/libcwbodbcs.so
Driver64 = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup64 = /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading = 0
DontDLClose = 1
UsageCount = 2

[IBM i Access ODBC Driver]
Description = IBM i Access for Linux 64-bit ODBC Driver
Driver = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup = /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading = 0
DontDLClose = 1
UsageCount = 2

7 - ho modificato il file /etc/odbc.ini:
[ODBC Data Sources]
DEV = DEV

[DEV]
Description = iSeries Access ODBC Driver
Driver = IBM i Access ODBC Driver
System = 10.1.0.4
UserID = qui il nome utente
Password = qui la password
Naming = 1
DefaultLibraries = QGPL
Database =
ConnectionType = 2
CommitMode = 2
ExtendedDynamic = 1
DefaultPkgLibrary =
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression = 1
LibraryView = 0
AllowUnsupportedChar = 1
ForceTranslation = 1
Trace = 0
il significato delle opzioni principali è:

[DEV] è il nome che si vuole assegnare alla Data Source

Description è una descrizione generica

System identifica il nome o l’indirizzo del sistema AS400. Esempio mioAS.miodomino.local o 192.168.xxx.xxx

UsedID e Password sono le credenziali per l’accesso al sistema. Vengono utilizzati solo se l’applicazione che utilizza la Data Source non ne specifica altri, altrimenti valgono quelli specificati nell’applicazione

Naming serve ad indicare la convenzione dei nomi per riferirsi a librerie e files.

  Naming=0 utilizza la convenzione classica ANSI SQL. Esempio select * from libreria.file.
  Naming=1 utilizza la convezione del sistema AS400: select * from librerie/file

DefaultLibreries permette di indicare la lista delle librerie di default. Come detto in precedenza, l’intera lista viene considerata solo se la convezione dei nomi utilizzata è 1 (Naming=1) altrimenti viene considerata solo la prima libreria. ATTENZIONE: ogni libreria dev’essere separata dalla virgola e l’intera lista deve iniziare con la virgola altrimenti considera solo la prima libreria ignorando le altre. Esempio: se indico lib1,lib2,lib3 in realtà viene vista solo lib1, viceversa se inizio la lista con la virgola, quindi ,lib1,lib2,lib3 viene considerata l’intera lista.

Un modo alternativo di far vedere una lista librerie è quello di NON indicare niente in questo parametro in modo tale che venga vista la lista librerie indicata nella job description (JOBD) abbinata all’utente che fa la connessione.

ConnectionType permette di specificare le azioni eseguibili sui dati (default=0):

  0 = lettura e scrittura. Sono permesse tutte le istruzioni SQL
  1 = lettura ed esecuzione. Sono permesse le istruzioni SELECT e CALL
  2 = solo lettura

CommitMode permette di specificare come gestire la transazioni (deafult=2):

  0 = Commit immediate (*NONE)
  1 = Read committed (*CS)
  2 = Read uncommitted (*CHG)
  3 = Reapetable read (*ALL)
  4 = Serializable (*RR)


8 - Verifico che linuxodbc stia funzionando con
isql -v DEV
e funziona

9 - Metto di seguito un estratto del php che fa una query:
$db = new PDO('odbc:DEV');
$sql = "SELECT * FROM LIB.TB FETCH FIRST 100000 ROWS ONLY";

foreach ($db->query($sql) as $row)
{
  print_r($row);
}

Nessun commento: