2008/8/19 Yoshio <[EMAIL PROTECTED]>:

> Na aplicação eu não consigo pegar os error codes do postgre para
> definir qual foi o erro, tenho que procuram na string do erro
> retornado algumas palavras-chaves como " violates unique constraint"
> para definir o tipo de erro e exibir a tradução certa como "Não foi
> possível realizar o cadastro pois estes dados já foram cadastrados".

O ideal nao e' procurar na string do erro, mas sim no codigo do erro.
Muito mais facil, e muito menos passivel de ser mudado numa versao
futura do PostgreSQL, ao passo que o texto da mensagem pode mudar,
invalidando sua busa na string.

Outro problema e' que tu estas recebendo as mensagens em ingles,
quando me parece que tu queres as mensagens em portugues. Isso e'
controlado pelo parametro de configuracao lc_messages [1].

Esse parametro pode ser modificado no arquivo de configuracao ou em
tempo de execucao ("runtime") pela sua aplicacao cliente.

homeprofile=# show lc_messages;
 lc_messages
-------------
 en_US.UTF-8

homeprofile=# insert into building_company(foo) values ('bar');
ERROR:  column "foo" of relation "building_company" does not exist
LINE 1: insert into building_company(foo) values ('bar');

homeprofile=# set session lc_messages to 'pt_BR.UTF-8';
SET

homeprofile=# insert into building_company(foo) values ('bar');
ERRO:  coluna "foo" da relação "building_company" não existe
LINE 1: insert into building_company(foo) values ('bar');

Note que a locale da linguagem tem que ter sido criada previamente,
antes do postmaster (daemon do PG) ter sido iniciado.

> Na procedure do db (PL) eu passo por parâmetro o idioma escolhido e
> dentro tem 2 ifs para cada mensagens das exceções, diferente da
> aplicação onde a tradução vem de um arquivo externo e o gettext faz a
> alteração automática das strings.

Nossa, me parece um bocado de trabalho. Nao bastaria pegar o codigo do
erro retornado (talvez com um RAISE EXCEPTION), como numa consulta
comum, e deixar a aplicacao cliente lidar com isso?

> Gostaria de saber se há uma maneira correta de fazer essas traduções,
> se é no DB mesmo ou na aplicação e como fazer?

Dependendo do driver que voce esta' usando, ele deveria retornar o
SQLSTATE, conforme descrito no padrao SQL, na forma de codigos de erro
que o PostgreSQL retorna atraves do driver[2].

A documentacao esclarece esses detalhes[3], e tu precisas le-la para
entender como lidar com esse problema.

[1] 
http://www.postgresql.org/docs/8.3/static/runtime-config-client.html#RUNTIME-CONFIG-CLIENT-FORMAT
[2] http://www.postgresql.org/docs/8.3/static/errcodes-appendix.html
[3] http://www.postgresql.org/docs/8.3/static/locale.html

Roberto

-- 
http://blog.divisiblebyfour.org/
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a