Indice
MultiDB - PDO
In questa sezione sono descritte le configurazioni necessarie per interfacciarsi con i diversi driver per la connessione con i DBMS.
MySQL
Attualmente non prevista la gestione.
PostgreSQL
La dll del driver è già presente in php. Nel file 'php.ini' occorre abilitare la seguente istruzione:
extension=php_pdo_pgsql.dll
Connection.ini Postgres
[CITYWARE] dbms=pgsql host=[host] database=[database] realname=cityware user=[user] pwd=[pwd] fieldskeycase=UPPER drivertype=PDO charset=LATIN9 stripspaces=true defaultString=blank searchSequenceField=naming
MS SQL Server (da 2008 in avanti)
Installazione driver
Scaricare il driver direttamente dal sito di Microsoft utilizzando questo link. Prendere SQLSRV32.EXE eseguirlo e copiare su '…\xampp\php\ext' solo i file php_pdo_sqlsrv_56_ts.dll e php_sqlsrv_56_ts.dll generati dall'exe.
ATTENZIONE! Dalla versione 3.1 in avanti, è necessario scaricare anche il driver ODBC per MS Sql Server, sempre dal sito di Microsoft, utilizzando questo link.
Configurazione php.ini
Dopo aver installato i driver, nel file 'php.ini' occorre aggiungere:
extension=php_sqlsrv_56_ts.dll extension=php_pdo_sqlsrv_56_ts.dll
Connection.ini mssqlServer
[CITYWARE] dbms=mssqlserver host=[host\istanza] oppure [host:port] database=[database] realname=cityware drivertype=PDO user=[user] pwd=[pwd] dateFormat=YMD stripspaces=true defaultString=blank searchSequenceField=naming
ATTENZIONE: Nel caso si utilizzi il driver pdo_sqlsrv per Windows il parametro host deve essere scritto nella seguente forma:
host=[host\istanza] oppure [host,porta] oppure [host] nel caso la porta sia quella di default 1433
Oracle
Installazione driver
Utilizzare Instant Client (a seconda della versione di Oracle)
Documentazione di riferimento
Guida all'installazione su CentOS
Configurazione php.ini
Dopo aver installato i driver, nel file 'php.ini' occorre abilitare la seguente istruzione:
extension=php_pdo_oci.dll
Connection.ini Oracle
[CITYWARE] dbms=oracle host=[nome tnsnames.ora] sid=[SID] database=[database] realname=cityware user=[user] pwd =[pwd] drivertype=PDO dateFormat=YYYY-MM-DD defaultString=blank searchSequenceField=naming
Connection.ini Oracle FAILOVER:ON
[CITYWARE] dbms=oracle host=X:1521 Y:1521 ;;host separate dello spazio hostProperties=FAILOVER:ON ;;proprietà separate dallo spazio: value (es: LOAD_BALANCE:ON FAILOVER:ON) servicename= CITYWARE_UNIONE realname=cityware user=cityware pwd=cityware drivertype=PDO dateFormat=YYYY-MM-DD stripspaces=1 defaultString=blank searchSequenceField=naming
Struttura delle classi in itaEngine
config.ini
Per abilitare PDO, modificare la seguente impostazione nel file config.ini:
[dbms] dbengine=DBPDO attivaTransazioni=1
lib/DBPDO
- ItaDB: Classe Proxy
- ItaDBFacade: Classe Facade per interfaccia “legacy” con i driver
- PDPFacade: Classe Facade per interfaccia PDO con i driver
- ItaDBError: Errori specifici DB
- PDODriver: Superclasse Driver DB
- PDOHelper: Helper funzioni PDO
- PDOTableDef: Classe che contiene la definizione della tabella
- PDOTableDefFactory: Factory per creazione TableDef
- PDOTableDefValidator: Classe per validazione tabella
- PDO<Driver specifico>: Classi specifiche per i driver (MS SQL Server, Oracle, Postgres…)
Cache TableDef
Le definizioni delle tabelle vengono messe in cache. Per attivare la cache, occorre modificare il file config.ini aggiungendo le seguenti righe: (Oltre alle definizioni delle colonne, la tableDef contiene anche le eventuali relazioni)
[cache] type=FILE root=C:/Works/PhpDev/dati/itaTest/cache
Validatori
Per la validazione, la logica è la seguente:
- Se esiste il validatore specifico per un model, questo viene utilizzato
- Se non esiste il validatore specifico per un model, viene effettuata la fallback sulla classe 'PDOTableDefValidator.class'
Per stabilire il validatore specifico, la regola è la seguente:
- Nome model = cwbBtaNazion.php
- Classe validator specifica = validators/cwbBtaNazionValidator.php
Può essere necessario escludere alcuni campi dalla validazione, implementando il metodo initExcludeFields, es:
public function initExcludeFields() { parent::initExcludeFields(); $this->addExcludeField("ISO3166_A2"); $this->addExcludeField("ISO3166_A3"); $this->addExcludeField("ISO3166_N3"); $this->addExcludeField("CODNAZICO"); $this->addExcludeField("CODNAZIMC"); $this->addExcludeField("CODGOVE"); $this->addExcludeField("LLPIVANAZ"); $this->addExcludeField("CODAGEO"); $this->addExcludeField("CODEST_770"); }
Gestione relazioni
E' possibile effettuare il salvataggio e cancellazione (in transazione) dei dati aggiuntivi rispetto al record principale. I tipi di relazione gestiti sono:
- One-To-One
- One-To-Many
- Many-To-One
Occorre effettuare l'override del metodo 'caricaDatiAggiuntivi'. Come esempio, vedere 'cwbBtaGrunaz_Rel'.
Transazioni
Per ogni connessione, esiste una sola transazione (non vengono annidate).
Abilitare sul Hook.ini il listner:
[connectionPerRequestPDOHook.php] active=1
Gestione delle connessione e della transazione
La connessione viene salvata come resources all'interno del App→$utente in modo da avere una connessione per request Punti fermi:
- Elenco numeratoAd ogni request la connessione al db muore
- Il nome della connessione deve essere univico ( ci saranno la connessione 'cityware', 'numeratori',ecc)
- le query e il service utilizzano sempre la stessa connessione per request presa dal App::$utente
Transazioni: Punti fermi:
- Esiste un unica transazione aperta per ogni connessione (logica multidb)
- Service: di default effettua begin_Transaction (se non la trova aperta ) e commit_transaction
- Service: è possibile non fare la commit\rollback se viene impostato l'attributo '$startedTransaction'(o in fase di builder o impostando un “set”)
- E' possibile gestire manualmente la transazione usando 'manual' in fase di addTransaction.
- Nel aprire manualmente una nuova sessione c'è il controllo delle transazioni aperte. In caso sia aperta lancia eccezione.
- Microsoft Mssql con driver installato su macchine linux non è permesso gestire le transazioni.
La chiusura (commit\rollback) deve essere fatta esplicitamente con l'attributo 'manual'. Qualsiasi altro salvataggio\cancellazione\inserimento lanciato con attivo lo stato manual non interferisce con la transazione.
Lettura e scrittura dei binari con il PDO
Per leggere e scrivere correttamente un “blob” effettuare le seguenti operazioni:
- Nella function che ritorna la stringa sql (esempio cwbLibDB_BGE function getSqlLeggiBgeAgidConfEfil) è obbligatorio specificare tutti i campi in maniera di selezione.
- Sempre nella stessa function per i campi binari usare questa sintassi per formattare il campo binario in selezione '$this→getCitywareDB()→adapterBlob(“NOMECAMPOBINARIO”)'.Questo risolve il problema del fetch null con oracle su piattaforma linux.
- Sulla leggi effettiva (esempio cwbLibDB_BGE function leggiBgeAgidConfEfil..) passare un array con oggetto e metodo. E'la callback chiamata per il database mssql per caricare il binario sull'array principale.
- Implementare questa callback seguendo l' esempio cwbLibDB_BGE leggiBgeAgidConfEfilBinary.
Gestione degli ordinamenti con il PDO in fase di paginazione
In fase paginazione è obbligatorio per i database Mssql\Oracle arrivare a paginare i dati con un ordinamento impostato. L'ordinamento può essere impostato:
- Sul generator
- Sulla “lib” che effettua la query controllando sempre il flag “ $excludeOrderBy” per gestire l'ordinamento dalla datatable (intestazione colonne)
- Nel caso che non venga passato nessun ordinamento di default viene utilizzare la chiave primaria del modello solo se 'noCrud' == false
4 visualizzazioni.