visto che ci siamo, parliamo un po' di codice, magari potete darmi qualche idea.
Io al momento ho una classe che mi astrae il mysql, il metodo query è questo (la classe è derivata da mysqli) :
codice:
function query($query)
{
$this->queriesCount++;
$this->queries[] = $query;
$result = parent::query($query);
if($this->error)
{
if(in_array($this->errno, $this->deadlockErrors))
{
if(!$this->openTransaction)
{
$repeatTransaction = DB_TRANSACTION_RETRY - 1;
while($repeatTransaction > 0 && $this->error)
{
$result = parent::query($query);
$repeatTransaction--;
}
if(!$this->error)
return $result;
}
throw new DeadlockException( 'error:E_DEADLOCK_GENERIC', $this, array($this->transactionOwner, $this->error, $this->errno));
}
throw new SQLException('error:E_QUERY', $this, array($this->errno, $this->error, $query));
}
else
return $result;
}
Fa quello che dicevo prima, intercetta gli errori dovuti a deadlock e, se la query non era in una transazione, la riesegue in maniera trasparente al chiamante (se era una transazione, va rieseguita tutta la transazione da parte del chiamante, che intercetterà l'apposita eccezione).
Ora, nell'ipotesi di scrivere quella classa basata su PDO di cui parlavo poc'anzi:
io posso anche fare l'overloading del metodo query(), ma questo nel PDO è un metodo generico. In teoria dovrei poter fare l'overloading del metodo query del driver PDO_Mysql, ma questo non è possibile perché il driver non è accessibile direttamente.
Se invece inserisco questo mio codice nell'overloading del metodo query() della PDO, lo sto snaturando, perché quella roba così com'è va bene solo per MySQL.
Quindi sono un po' bloccato su questa cosa...
Mi servirebbe una forma affinché la mia classe derivata del PDO mantenga la sua funzione di "interfaccia di tutti i driver specifici", ma allo stesso tempo voglio poter implementare quel tipo di logica perché nello specifico serve per la mia applicazione.
Consigli?
Pensavo a qualcosa del tipo:
- salvo il driver nel costruttore
- nella query(), se il driver è mysql faccio quella roba, altrimenti passo dritto.
Non lo so, non sono molto convinto... :master: