Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před rokem

Honza Kuchař
Moderator
Registrovaný: 12. 8. 2007
Příspěvky: 1587

Podrobné chybové hlášky pro PostgreSQL

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

 

#2 před rokem

Milo
dibi guru
Registrovaný: 4. 5. 2010
Příspěvky: 298

Re: Podrobné chybové hlášky pro PostgreSQL

Konečně jsem se dokopal a zkusil… výborný :)

 

#3 před rokem

Honza Kuchař
Moderator
Registrovaný: 12. 8. 2007
Příspěvky: 1587

Re: Podrobné chybové hlášky pro PostgreSQL

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?

 

#4 před rokem

Milo
dibi guru
Registrovaný: 4. 5. 2010
Příspěvky: 298

Re: Podrobné chybové hlášky pro PostgreSQL

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.

 

Zápatí