[SP-pm] Ajuda com módulo DBI::mysql e funcoes.

jefferson alexandre jefferson.alexandre at gmail.com
Sat Mar 13 08:20:54 PST 2010


2010/3/13 Otávio Fernandes <otaviof at gmail.com>

> 2010/3/13 jefferson alexandre <jefferson.alexandre at gmail.com>:
> > Bom dia a todos.
> > Primeiramente, gostaria de parabenizar aos membros da lista pela educação
> e
> > respeito com os usuários, independente do nível de conhecimento.  É legal
> > ver que ainda existem listas nacionais que vale a pena frequentar, e esta
> é
> > uma delas. :D
> > Recentemente, consegui introduzir o perl no meu ambiente de trabalho,
> > criando algumas ferramentas para manutenção e administração de servidores
> > Asterisk. (PABX IP Open Source.)
> > Eu tenho pouca ou quase nenhuma experiência com programação. No máximo,
> > alguns scripts shell que estão sendo devidamente portados/reescritos em
> > Perl.
> > Eu criei uma rotina para o Asterisk para que, quando um usuário disparar
> uma
> > ligação, meu script ira consultar o numero digitado pelo usuário com uma
> > base de dados mysql, e então, mediante resultado, ira passar o controle
> de
> > volta para o asterisk, para que ele complete ou não a ligação. Essa
> solução
> > será instalada em Callcenters de São Paulo para cumprir esta
> > lei: http://www.procon.sp.gov.br/noticia.asp?id=934
> >
> > O meu problema é, que independente do numero passado pelo asterisk, meu
> > script sempre retorna 0 para a função &consulta_banco, e acaba bloqueando
> a
> > ligação.
> > Eu acredito que poderia resolver isso comparando o valor de $var em um
> if,
> > mas eu gostaria de entender como resolver isso apenas usando o retorno da
> > função, se este for o modo correto de fazer isso.
> > Abaixo, o código:
> > ++ Begin Code ++
> > #!/usr/bin/perl -w
> > use DBI();
> > use Asterisk::AGI;
> > $AGI = new Asterisk::AGI;
> > ($database, $host, $user, $pw) = qw( procon 127.0.0.1 usuario senha );
> > #Obter numero discado  via AGI. Deve retornar algo como (01112345678) ;
> > $EXTEN = $AGI->get_variable('EXTEN') ;
> >
> > if ( &consulta_banco($EXTEN) )  {
> > #Colocando o valor "1" na variavel FORBIDEN, que será tratada pelo
> asterisk,
> > e imprimindo na tela.
> >         $AGI->set_variable("FORBIDEN", "1");
> > $AGI->verbose("Numero consta na lista do Procon-SP") ;
> > }
> > else {
> > $AGI->set_variable("FORBIDEN", "0") ;
> > $AGI->verbose("Executando ligacao para $EXTEN") ;
> > }
> > #Consultando banco de dados.
> > sub consulta_banco {
> > $dbh = DBI->connect("DBI:mysql:database=$database;host=$host", $user, $pw
> )
> >  || die print $DBI::errstr;
> >          $dbh->{RaiseError} = 1;
> > $sth = $dbh->prepare(" SELECT numero FROM numeros WHERE numero LIKE
> > \"%$_[0]%\" ");
> >          $sth->execute() ;
> > }
> > ++ End Code ++
> > Obrigado,
> > _______________________________________________
> > SaoPaulo-pm mailing list
> > SaoPaulo-pm at pm.org
> > http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
> Jefferson,
>
> Em nome da lista eu lhe agradeço pelo elogio, é muito importante para
> nós termos este tipo de feedback. Muito obrigado!
>
> Pelo seu código, fica evidente que você te pouca experiência me
> desenvolvimento, mas este é um problema que nós podemos resolver aqui
> na lista, é apenas uma questão de tempo.
>
> Alguns pontos são bastante falhos no seu código, dentre eles:
>    * "use scrict";
>    * Uso do DBI diretamente;
>    * Cuidados com a indentação;
>    * Não ter testes automatizados (estou supondo isso);
>
> Segue um exemplo de como ele pode ser melhorado (acredito que ele já
> deve até funcionar corretamente agora):
>
> #!/usr/bin/env perl
>
> use strict;
> use warnings;
>
> use DBI();
> use Asterisk::AGI;
>
> #
> ---------------------------------------------------------------------------
> #                                Subroutines
> #
> ---------------------------------------------------------------------------
>
> sub consulta_banco {
>    my ($number) = @_;
>
>    my $dbh
>         = DBI->connect( "DBI:mysql:database=" . $database . ";host=" .
> $host,
>        $user, $pw )
>         or die $!;
>    $dbh->{RaiseError} = 1;
>
>    my $sth;
>    eval {
>         $sth
>            = $dbh->prepare( "
>        SELECT
>            numero
>        FROM
>            numeros
>        WHERE
>             numero LIKE \"%$number%\"
>        " );
>
>    };
>    die $@ if $@;
>
>    return 0 if ( !$sth );
>    return 0 if ( !$sth->execute() );
>
>    my $numeros = $sth->fetchrow_hashref;
>
>    $sth->finish();
>
>    return 1 if ( $numeros->{numero} );
>    return 0;
> }
>
> #
> ---------------------------------------------------------------------------
> #                                -- Main --
> #
> ---------------------------------------------------------------------------
>
> my $agi = new Asterisk::AGI;
>
> my ( $database, $host, $user, $pw ) = qw( procon 127.0.0.1 usuario senha );
>
> # obter numero discado  via AGI, deve retornar algo como (01112345678)
> my $exten = $agi->get_variable('EXTEN');
>
> if ( consulta_banco($exten) ) {
>    # colocando o valor "4" na variavel FORBIDEN, que será tratada pelo
>     # asterisk, e imprimindo na  tela.
>     $agi->set_variable( "FORBIDEN", "1" );
>    $agi->verbose("Numero consta na lista do Procon-SP");
> } else {
>    $agi->set_variable( "FORBIDEN", "0" );
>    $agi->verbose("Executando ligacao para $exten");
> }
>
> __END__
>
> O único problema que impedira do seu script funcionar corretamente,
> independente da qualidade, é o uso incorreto da DBI, na função
> "consulta_banco" eu coloquei a forma correta de como lidar com ele.
> Apenas um exemplo.
>
> Para melhorar os pontos citados acima, recomendo fortemente as leituras:
>
> http://perldoc.perl.org/strict.html
> http://perldoc.perl.org/warnings.html
> http://sao-paulo.pm.org/equinocio/2010/mar/11
> http://sao-paulo.pm.org/equinocio/2010/mar/12
> http://en.wikipedia.org/wiki/Test-driven_development
> http://www.agiledata.org/essays/tdd.html
> http://search.cpan.org/~mschwern/Test-Simple-0.94/lib/Test/More.pm
>
> Aproveitando o ensejo, segue dentre os links um artigo do Eden
> publicado no Equinócio de Março, o qual é muito completo e vai lhe
> ajudar muito.
>
> um abraço,
>
> --
> Otávio Fernandes <otaviof at gmail.com>
> http://blog.emresumo.com
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm at pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>

Jorge, Otávio, obrigado pelas respostas. O programa agora está faz o que ele
deve fazer :D

Otávio, realmente, eu não tenho experiência com desenvolvimento, apenas um
ou outro script para resolver problemas na area de Sysadmin.  O
relacionamento com Perl surgiu depois de eu perder a paciencia com programa
que estava sendo escrito em shell. :D

Vou ler os links com calma, e absorver este conhecimento, para poder
aplicá-lo nos meus programas.

Obrigado,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20100313/33ff9d54/attachment.html>


More information about the SaoPaulo-pm mailing list