Já cai em situações em que eu precisava identificar se a falha foi por
registro duplicado ou outro problema, consegui fazer isso facil com DBI
pra MySQL, claro que cada banco tem um retorno de erro diferente.
$dbh = DBI->connect($DSN, $self->user, $self->pass);
$dbh->{HandleError} = sub { $self->MySQLerror(@_) };
$dbh->{PrintError} = 0; $dbh->{RaiseError} = 0;
sub MySQLerror {
my $self = shift;
my $errno = $_[1]->err;
if ($errno == 1062) {
#http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html
$_[2] = 'ERR'; #[ ... ]; # supply alternative return value
$self->duplicated(1);
}
return 1;
}
Não sei se te ajuda.
Att,
Marcelo Milhomem
www.is4web.com
Em 14/09/2013 19:50, Solli Honorio escreveu:
Bom, descobri um motivo para não utilizar a abordagem que eu estava
imaginando.
O perl não possui um sistema de Exception decente, e o DBIx::Class
também não faz nada muito avançado neste sentido. Atualmente o
DBIx::Class gera um exception simplório através do
DBIx::Class::Exception, que não tem nenhuma maneira simples de
identificar o motivo do erro.
Na solução atual eu preciso parsear o mensagem de string, mas isto tem
um problema. Cada banco de dados pode gerar uma mensagem diferente
para o mesmo problema (neste caso colisão de índice único) e aí eu
preciso criar uma enorme estrutura de parser para atender todos os
bancos, ou pelo menos a maioria (ah, que inveja do Java !!!).
Ou seja, é melhor ser educado e fazer as perguntas corretas ao banco :D !!
Abraços,
Solli Honorio
Em 14 de setembro de 2013 15:22, Lucas Mateus
<[email protected]
<mailto:[email protected]>> escreveu:
Boa pergunta André. É um teste simples de fazer, que acha
de fazer em seu SGBD preferido e nos dizer ?
Em 14/09/2013, às 14:39, André Walker <[email protected]
<mailto:[email protected]>> escreveu:
> On Sat, Sep 14, 2013 at 12:44:35PM -0300, Lucas Mateus wrote:
>> Para tornar esse processo mais rápido eu crio um campo do tipo
binary 16
>> bytes e gravo o md5 (binario sem hexadecimal) do email e
utilizo ele para
>> consulta.
>> Algo assim: select id from users where email_md5 =
md5('fulano@bla') and email = 'fulano@bla';
>> Onde somente o campo email_md5 tem index e você tem certeza que
ele sempre
>> terá 16 bytes, se você tiver 1 milhão de usuários essa consulta
terá um
>> custo risório. A segunda comparação é somente para evitar
colisões de md5 e
>> o index é feito somente no campo email_md5.
>
> Será que isso é realmente necessário? Quer dizer... qual o
problema de ter um
> índice no campo email mesmo? De qualquer forma, você já vai ter
um custo
> computacional na função md5 (ainda que pequeno), e tenho a
impressão que
> índices em campos texto não são tão ruins assim. Talvez varie de
SGBD pra
> SGBD? Em PostgreSQL, por exemplo, seria relevante ter essa
coluna email_md5?
>
> Att.
> André
>
> =begin disclaimer
> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> SaoPaulo-pm mailing list: [email protected]
<mailto:[email protected]>
> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
=begin disclaimer
Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
SaoPaulo-pm mailing list: [email protected]
<mailto:[email protected]>
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer
--
"o animal satisfeito dorme". - Guimarães Rosa
=begin disclaimer
Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
SaoPaulo-pm mailing list: [email protected]
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer
=begin disclaimer
Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
SaoPaulo-pm mailing list: [email protected]
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer