[SP-pm] [hipóteses...]

André Garcia Carneiro andre.garcia.carneir em terra.com.br
Terça Março 6 13:04:42 PST 2007


> Boa tarde Luis,
> 
> 	Obrigado pela resposta e pelo tempo despendido com isso.
> 
> 	Esta foi apenas uma questão hipotética e com certeza foi um tanto 
> quanto confusa minha colocação.
> 
> 	Na prática o que eu quero é automatizar algumas funções que, por vezes 
> tenho que utilizar. Isso inclui acessos à banco de dados ou protolos 
> específicos (as vezes utilizando módulos do cpan). Minha dúvida surgiu, 
> inicialmente, pela necessidade de tratar o retorno de alguma função do 
> módulo de forma diferente.
> 
> 	Exemplificando:
> Em um determinado programa eu preciso fazer uma conexão com um banco de 
> dados e, em caso de falha, pouco me importa o porque. Apenas saber que a 
> conexão falhou já me basta. E isso eu consigo facilmente utilizando 
> valores de retorno da função de conexão ao banco.
> Porém, em uma segunda hipótese eu preciso tratar o erro que me é 
> retornado. E, sem quebrar a estrutura inicial (utilizando valores 
> numéricos de retorno), eu precisaria saber o erro. Então pensei em 
> utilizar a mesma estrutura do módulo, algo como:
> 
> sub connect {
>   my $self = shift;
> 
>   if (!connect_to_db()) {
>      $self->{mensagem_de_erro} = 'Erro específico';
>      return 0;
>   }
>   return 1;
> }
> 
> 	Com isso eu resolveria os dois problemas. Teria o retorno e a mensagem 
> de erro, caso esta fosse necessária.
> 
> 	Lembre-se que esta é uma situação hipotética e simples. Mas, se eu 
> conseguir entender qual a melhor maneira de se fazer isso, terei 
> resolvido diversos outros problemas estruturais e poderei começar a 
> desenvolver meus módulos tranquilamente.
> 
> 	Na prática a dúvida é: se eu receber a hash como argumento da função e 
> alterá-la, essa alteração terá validade apenas dentro dessa função ou 
> dentro da função que a chamou também?
> 
> 	Ou ainda:
> sub connect {
> 	my $self = shift;
> 
> 	if (!connect_to_db()) {
> 		$self->{mensagem_de_erro} = 'Erro';
> 		return 0;
> 	}
> 	return 1;
> }
> 
> 	Teria o mesmo efeito que:
> sub connect {
> 	my $self = shift;
> 
> 	if (!connect_to_db()) {
> 		$self->{mensagem_de_erro} = 'Erro';
> 	}
> 	return $self;
> }
> 	?????
> 
> 	Espero ter sido um pouco mais claro agora.
> 	E, novamente, obrigado pelo tempo perdido com a resposta.
> 
> Luis Motta Campos wrote:
> 
> -- 
> Thomas Storino Britis
> TCNet Informatica e Telecomunicacoes LTDA
> 
> 

Bom se eu entendi, o que você quer pode estar mais ou menos por aqui:
<code>
use strict;
use warnings;
use DBI; #suponde que você está usando DBI


my $dbh = DBI->connect(<parametros>,{RaiseError=>1,AutoCommit=>0});
my $sth ;

eval{
            $dbh->prepare_cached(qq{codigo sql});
            $sth->execute;
       
      };
if($@ || $DBI::strerr)
{
     #opa... deu zica!
     $@ .= $DBI::strerr;
     $dbh->rollback;
}
else
{
     #executou ok
     $dbh->commit;
}

$sth->finish;
$dbh->disconnect;

</code>

Para mais detalhes, por favor consulte o CPAN...

Agora se não é isso o que você perguntou, me desculpe ...


--
André Garcia Carneiro
Developer(Perl/PHP)
Member of "São Paulo Perl Mongers" - http://sao-paulo.pm.org



Mais detalhes sobre a lista de discussão SaoPaulo-pm