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

Samir Cury eu at samircury.eng.br
Sat Mar 13 09:42:22 PST 2010


Dica maneira pra resolver problema de boas práticas na aparência do código :

perl-tidy :

http://samircury.eng.br/blog/?p=9

Abraços,
Samir

2010/3/13 jefferson alexandre <jefferson.alexandre at gmail.com>:
>
>
> 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,
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm at pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>


More information about the SaoPaulo-pm mailing list