tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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.