Oznámení
Podrobné chybové hlášky pro PostgreSQL
před 8 lety
- Honza Kuchař
- Backer | 1649
Pokud byste někdo rádi podrobné, ale opravdu podrobné chybové zprávy pro PostgreSQL, stačí použít tento patch:
Patch je pro dibi:
const VERSION = '1.2';
const REVISION = '3b2ca19 released on 2009-09-18';
(ale nepředpokládám, že se od té doby v driveru postgresu něco změnilo)
http://pastie.org/…0ceuwvzz8giw – celý soubor
http://pastie.org/…r2emwqtl2kaa – patch
před 8 lety
- Milo
- Nette Core | 1119
Konečně jsem se dokopal a zkusil… výborný :)
před 8 lety
- Honza Kuchař
- Backer | 1649
Implementace není zdaleka ideální, ale lepší zatím nevím. :) Jak to pak řešíš v GUI?

Já to zkusil takto, akorát nevím, jak poznat, která chyba je jaksi fatální a má se logovat a která je jaksi uživatelsky vyvolaná a logovat se nemá. Máš to nějak pořešeno?
před 8 lety
- Milo
- Nette Core | 1119
Tvoji fičurku s rozšířeným error reportingem využiju jen v administračních toolech kde poznám, co je user chyba a co systémová. Ale s touhle dualitou chyb jsem se už také potýkal.
Dospěl jsem nakonec k tomu, že celou vrstvu vkládání, úprav a mazání
mívám v databázi pomocí uložených procedur v jazyku
Pl/PgSql
. Např:
CREATE OR REPLACE FUNCTION "AddUser" ( pLogin varchar, pHeslo varchar ) RETURNS integer AS $body$
DECLARE
idUser INTEGER;
BEGIN
PERFORM 1 FROM user WHERE login = pLogin;
IF FOUND THEN
RAISE EXCEPTION 'Uživatel s loginem % již existuje.', pLogin;
END IF;
IF length(pHeslo) < 6 THEN
RAISE EXCEPTION 'Heslo musí být dlouhé alespoň 6 znaků.';
END IF;
INSERT INTO user (login, password) VALUES (pLogin, pHeslo) RETURNING id INTO idUser;
RAISE NOTICE 'Uživatel s loginem % založen jako UID(%).', pLogin, idUser;
RETURN idUser;
END
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
Pro RAISE ....
mám ještě proceduru, která zprávu formátuje
jako USER_ERROR:Uživatel má duplicitní login...
a to se
v aplikaci už dobře odchytává.
V aplikaci pak volám jednoduše:
dibi::query( 'SELECT [AddUser]( %s, %s )', $login, $heslo );
Výhodou je, že při verzování zůstává vše pohoromadě. Každá procedura běží ve vlastní transakci takže zápis do více tabulek se dá dobře stornovat. A skvěle se dají hlídat hodnoty zapisované do databáze.
Nevýhod je také spousta, jako třeba sehnat hosting. Já mám vlastní servery, takže třeba tohle neřešim. Nebo migrace na jinou db je nemožná. Anebo jakákoliv změna počtu parametrů funkce většinou znamená změnu v databázi. Možná i nevýhody převažují, ale na tenhle typ práce s DB jsem si už hodně navyknul.