====== 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 [[https://www.microsoft.com/en-us/download/details.aspx?id=20098|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 [[http://www.microsoft.com/en-us/download/details.aspx?id=36434|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 ====
[[http://php.net/oci8|php.net]]
==== Guida all'installazione su CentOS ====
[[https://shiki.me/blog/installing-pdo_oci-and-oci8-php-extensions-on-centos-6-4-64bit|Oracle PDO e 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**: 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
{{counter}} visualizzazioni.