Překlad vyjímekv Nette\Database

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
marau
Člen | 50
+
+7
-

Zdravím forum,

napdl mě jeden takový zlepšovák do Nette/Database. U každého projektu si nad db stavím překladač výjímek, které vyhazuje PDO. Například pro chybu 23000 si vždy píšu svou vlastní DupValOnIndexException, které pak předávám podrobnější informace o chybě.

Místo:

try {
   $pdo->query('...');
}
catch (\PDOException $e) {
  if ($e->getCode() == 23000) {
    //code
  }
}

Píšu:

try {
   $pdo->query('...');
}
catch (DupValOnIndexException $e) {
  dump($e->getIndex()); //url
  dump($e->getIndex()); //[url, is_visible] - pokud je index na více sloupcích
  dum($e->getPrimary()); //7 - hodnta primárního klíče
  //code
}
catch (\PDOException $e) {
  //code
}

Mám tak ihned informaci o názvu indexu, který neprošel (výhodné pokud je v tabulce více unkátních indexů), hodnotě primárního klíče na záznamu atd … . Otevírám proto diskuzi o této vyjímce, případně o dalších kódech, které by bylo dobré překládat na separátní výjímky.

Editoval marau (29. 9. 2014 19:41)

David Grudl
Nette Core | 8228
+
+3
-

+1

Jan Tvrdík
Nette guru | 2595
+
0
-

Prosím prosím, pošleš pull request? Taky už mě nebaví to na každém projektu psát znova.

Filip Procházka
Moderator | 4668
+
0
-

V doctrine/dbal už je mají pěkně rozepsané, takže bych doporučil inspirovat se tady

marau
Člen | 50
+
0
-

Já se to tam klidně pokusím doplnit, jen mi dejte trochu čas, s novým nette a nette/database se zatím seznamuju a chci to zkusit využít na menší projekty, na kterých mi zase až tak nejde o čistotu ale spíš o rychlost vývoje.

Jinak jaké jsou konkrétně nápady na implementaci do Nette/database? Na kolika místech se vyhazují PDO Exceptiony, pár míst jsem našel ale nejsem si jist, zda je to vše. V nette/database asi neexistuje žádné jedno místo, přes které by proudily všechny sql dotazy, nebo ano? Našel jsem query v Connection ale to je označeno jako @deprecated, tak nevím. Jak jsem říkal, dejte mi chvilku na seznámení :)

Jaké výjímky tedy budeme implementovat? Vememe stejný způsob jako má doctrine? O vyhazování konkrétních vyjímek by se měl asi postarat driver.

Jan Tvrdík
Nette guru | 2595
+
0
-

Tady tu obecnou PDOException zachytíš a pak $this->connection->getSupplementalDriver() požádáš, aby ji pokud možné překonvertoval na nějakou specifickou.

David Grudl
Nette Core | 8228
+
0
-

Nestačí vycházet z obecného SQLSTATE?