MySQL e Perl, o casamento de conveniência

ArticleCategory:

Applications

AuthorImage:

Georges Tarbouriech

TranslationInfo:[Author and translation history]

original in en Georges Tarbouriech 

en to pt Bruno Sousa 

AboutTheAuthor

O Georges é um utilizador de Unix de há longa data. Gosta de produtos que contribuam para o aumento de soluções com software livre na área profissional.

Abstract:

O MySQL e o Perl têm estado presentes em todo o lado há já longos tempos. São ainda muito usados mesmo que a "moda" esteja a alterar. Este artigo fala destes dois produtos trabalhando juntos como um todo, quer na Internet quer na rede local. O exemplo fornecido é escrito para sistemas Unix, livres ou não, mesmo que possa ser adaptado para outros "sistemas" bastante usados.
O que é que este artigo é: uma breve revisão do que pode ser feito com este par, mostrando uma utilização fácil, velocidade, fiabilidade, segurança...
O que é que este artigo não é : não é nenhum tutorial acerca do MySQL nem do Perl; nem mesmo uma revisão do MySQL ou do Perl.
Consequentemente, veremos o MySQL a trabalhar em conjunto com o Perl, sem esquecer que "existe mais do que uma maneira de o fazer".

ArticleIllustration:

MySQL and Perl

ArticleBody:[The article body]

O que é que se pode dizer acerca deste par simpático ?

O MySQL é um sistema de administração de uma base de dados relacional (RDBMS) disponível em http://www.mysql.com. É apresentado sob a GPL da GNU, livremente dependendo do seu uso. Verifique as políticas da licença no site da MySQL. Trabalha quer como um servidor quer como um cliente em muitas plataformas. Existem alguns RDMS como software livre mas não tomaremos nenhumas comparações visto que a escolha do MySQL, para este artigo, foi arbitrária. Nem sequer compararemos com as grandes armas "comerciais" tais como Informix, Oracle, Sybase... Basta dizer que o MySQL é, provavelmente, uma das mais DBM utilizadas na Internet. Para este artigo utilizaremos a versão 3.23.36 (novamente, arbitrariamente). Na altura da redacção deste artigo, a versão actual e estável é a 3.23.46 e a experimental, já muita esperada, a versão 4.0. Podem ser obtidas com o código fonte para ser compilado ou como pacotes.
Para utilizar o MySQL em conjunto com o Perl, precisa de mais algumas coisas: os módulos DBI do Perl, pode obter os módulos DBI, os módulos Msql-Mysql, os módulos Data-Dumper e os módulos Data-ShowTable.
Não falaremos da sua instalação visto que é óbvia e os pacotes fornecem toda a informação que precisa.
O Perl significa Pratical Extraction and Report Language. No princípio, tinha o intuito da manipulação de documentos (análise, extracção...) mas rapidamente foi para além disto. Pode fazer quase tudo com o Perl. Desde tarefas administrativas a scripts cgi até aplicações verdadeiras e claro interfaces para base de dados.
O Perl faz parte de muitas (se não todas) distribuições Unix sejam livres ou não. A versão actual e estável é a 5.6.1 e a experimental é a 5.7.2 na altura de redacção deste artigo. Para este artigo utilizaremos a velha 5.005_03. No caso de não ter o Perl instalado na sua máquina (como é que isto é possível ?) pode obtê-lo a partir de http://www.perl.com. O Perl fornece-lhe toneladas de módulos para praticamente tudo. Pode obtê-los na secção CPAN deste site : uma mina de ouro!
Por último, mas não o menos importante, para trabalhar com ambos, surpresa : precisa de um webserver ! O Apache parece a escolha correcta visto que faz parte de muitas distribuições Unix, livres ou não, como é normal. No caso de não o ter (onde é que obteve a sua distribuição ?), está disponível a partir do site http://www.apache.org.

O exemplo que utilizaremos

Você, provavelmente já notou que a LinuxFocus é uma revista multilíngue. O que quer dizer, que se for um editor você precisa de administrar o estado dos novos artigos, a sua tradução. Por outras palavras, o que é que cada um está a fazer, quando... De momento. existem cerca de 200 artigos disponíveis, numa média de 5 línguas. O que faz cerca de 1000 artigos (que inteligente eu sou ?) e por aí adiante ! Tudo isto tem de ser arquivado, formatado, resumido... Como é que pensa que esta administração é feita ? Com o Perl, é claro.
O nosso editor chefe, Guido Socher, escreveu bastante programas Perl para tornar o nosso trabalho mais fácil. Escreveu também três partes de tutoriais de Perl e uma revisão de um livro de Perl. Verifique a secção de referências no fim deste artigo.
O Javi, o editor Espanhol, escreveu um programa para administrar o estado da tradução... em Perl.
O Atif, uma das nossas estrelas de autores, vem do reino do Perl, é por isto que a sua linguagem materna é o Perl. Eventualmente, também contribui para o MySQL, melhorando um utilitário de administração web. Verifique novamente a secção de referências.
Tudo isto para dizer que se anda à procura do paraíso do Perl... junte-se à LinuxFocus.
Visto que sou um dos editores Franceses... e como sou um pouco preguiçoso criei a minha própria base de dados da LinuxFocus utilizando, advinhe o quê : MySQL e Perl !

Criando a base de Dados

Isto assumo que o MySQL foi devidamente instalado, os utilizadores foram criados e protegidos com palavras-passe. A instalação não está na abrangência deste artigo e a excelente documentação fornecida com o MySQL dir-lhe-à tudo.
Inicie o servidor MySQL utilizando a scripts mysql.server, visto que invoca o demónio safe_mysqld e pode passar parâmetros a este demónio.
Ligue-se ao servidor utilizando

mysql -h host -u user -p

Se o servidor estiver a correr na sua máquina local então não precisa de -h host.
Após ter digitado a palavra-passe, está ligado ao servidor (bem, pelo menos devia !). E agora, pode criar a sua base de dados.
Na linha de comandos do MySQL, digite

CREATE DATABASE lf;

Este é o nosso exemplo (lf significa LinuxFocus) e obviamente que atribui o nome que deseja para a sua base de dados. De seguida, algumas permissões para os utilizadores autorizados, isto assume que tem o direito de fazer isto (ou seja se tem direito administrativo com o utilizador ligado). Se quiser que um utilizador seja capaz de administrar a base de dados pode-lhe dar os privilégios para o fazer, digitando

GRANT ALL ON lf.* TO username;

Seleccione a base de dados que acabou de criar digitando somente

USE lf

Crie uma tabela segundo as suas necessidades. No nosso exemplo, criamos uma tabela chamada trissue :

CREATE TABLE trissue (num INTEGER UNSIGNED, category VARCHAR(25), title VARCHAR(40), author VARCHAR(20), en VARCHAR(20), es VARCHAR(20), fr VARCHAR(20),de VARCHAR(20), nl VARCHAR(20), ru VARCHAR(20), tk VARCHAR(20), issue VARCHAR(20));

Verifiquemos, se foi criada como esperávamos com:

USE lf
SHOW TABLES;
DESCRIBE trissue;

E é tudo.
E agora, precisamos de alguns dados. Para carregar os dados para uma tabela vazia, o modo mais fácil é utilizar um ficheiro de texto com separadores de tabulação. Quando o seu texto estiver pronto, digite somente :

LOAD DATA LOCAL INFILE "maindb.txt" INTO TABLE trissue;

Se o seu ficheiro de texto estiver correcto a sua tabela está agora preenchida. Pode verificar isto com :

SELECT * FROM trissue;

Isto devia apresentar uma longa lista. Agora é capaz de obter qualquer tipo de dados utilizando consultas.
Até agora, tudo bem.
Até agora, só utilizámos o MySQL e fomos capazes de fazer tudo com ele. Então para que é que o Perl ?

O Perl no trabalho

O Perl ajudar-nos-á a automatizar as consultas, para apresentar os resultados num web browser, etc. Novamente isto implica que os módulos do Perl foram devidamente instalados para utilizar o MySQL em combinação com o Perl.
Utilizaremos agora as scripts de Perl como scripts cgi. Elas permitir-nos-ão misturar o Perl e o HTML para consultar a base de dados e formatar a saída.
Utilizaremos uma script simples como exemplo, permitindo-nos procurar por todos os artigos escritos pelo mesmo autor. Apresentaremos os números dos artigos, a categoria, o título, os nomes dos tradutores para as diferentes línguas (somente para os projectos totalmente funcionais) e a edição quando os artigos foram publicados.
Pode utilizar esta script como modelo para o seu próprio uso, mas tenha cuidado que este exemplo não é um programa muito seguro. Pode obter uma versão mais comentada em =>aqui<=.

#!/usr/bin/perl -Tw
# Primeiro, dizemos que isto é uma script de Perl "Tainted".
#
# Isto é um comentário
# consulta à BD
#
# Utilizamos o módulo do Perl DBI
use DBI;

# Bem como o cgi :
use CGI qw(param());

print <<END_of_start;

Content-type: text/html

<html>
<title>LFAuthors main db</title>

<center><TABLE>
<TR VALIGN=TOP>
<TD><form action="/cgi-bin/lf.cgi" method="get">

# Aqui vem o botão do título para apresentar a página
<input type="submit" value=" LFAuth ">
</form>
</TD>
</TR>
</TABLE>

Agora, dizemos à script para consultar a base de dados

<center><H2>Search by author</H2></center>

<form action=\"/cgi-bin/lf.cgi\" method=\"get\">Author name : <input
type=\"text\" size=\"30\" name=\"author\"><input type=\"submit\"
value=\"Search...\"></form></center>


END_of_start


if (param("author") ne '') {
$author = param("author");

$autsrch.='"';
$autsrch.=$author;
$autsrch.='"';

# Ligamo-nos à base de dados chamada lf como sendo o utilizador doe

$dbh = DBI->connect("DBI:mysql:lf","doe",'');

$sth = $dbh->prepare("
select *
from trissue
where
author = $autsrch
");

$sth->execute;

Agora pedimos à script para preparar e apresentar os resultados da consulta. Quer fizermos uma consulta ela apresentará todo o conteúdo da base de dados, ou se pedimos por um nome ela apresentará todos os artigos correspondentes ao nome desse autor. Se tiver milhares de registos na sua base de dados, eu não recomendo que apresente todos o conteúdo !

print <<END_suite;

<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
</tr>

END_suite

while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";

}
print "</TABLE>";
print "<BR>";
print "<BR>";
print "<br>";


} else {

# Ligação à Base de Dados (DB)

$dbh = DBI->connect("DBI:mysql:lf","doe",'');


# Search

$sth = $dbh->prepare("
select *
from trissue
");

$sth->execute;


# Apresenta o Resultado


print <<SUITE;

<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
</tr>

SUITE

while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";

}
print "</TABLE>";
print "<BR>";

}
print end_html;
$sth->finish;


# Desliga

$dbh->disconnect;

exit;

Eis aqui o resultado da consulta num web browser :

query


E é Isto !

O lado da segurança

Obviamente, se deseja fornecer um serviço de base de dados no seu site deve proteger tudo. Claro que não daremos um modo passo-a-passo de proteger o seu website ou o seu servidor de base de dados. Contudo, é importante insistir nas operações básicas.
Para reduzir, quando fornece serviços na web a primeira coisa que tem de proteger é o seu servidor web. Isto está para além da abrangência deste artigo, se quiser aprender mais acerca desta matéria, existe imensa documentação disponível. Um bom sítio para começar é o Projecto de Documentação do Linux (LDP).
O próximo passo diz respeito ao servidor de base de dados. Ao instalar um utilitário como o MySQL não se esqueça de ler a parte de segurança do manual. Novamente, o básico diz respeito às palavras-passe dos utilizadores : nunca deixe uma conta sem palavra-passe, especialmente a conta do root para a base de dados (a qual devia ser diferente da conta da máquina root). Um outro ponto importante é acerca das permissões : Não de total acesso a todo o mundo. Parece óbvio ... e é por isso que muita pessoa se esqueçe !
Indo um pouco mais além, porque não correr a base de dados sem ser o root ? Verifique o artigo do Mark "Chrooting em todos os serviços do Linux" nesta edição. Ele fala de uma base de dados diferente mas o que ele diz pode ser aplicado ao MySQL.
Uma outra medida de segurança diz respeito à circulação dos dados. Não é má ideia enviar e receber os dados através de um túnel. Pode verificar o artigo Através do túnel para mais informação.
Por último mas não menos importante, a programação segura é uma das chaves. O Perl é uma grande linguagem, mas é muito fácil fazer erros com ele. Um outro artigo da LinuxFocus ensinar-lhe-á o que deve fazer, especialmente com o Perl. Dê uma vista de olhos aqui. É o último artigo da série de programação segura e diz respeito, nomeadamente às scripts cgi. A "Ler sem Falta" !
Claro, que isto assume que você já protegeu o seu sistema das falhas de segurança mais conhecidas, com últimas actualizações e com muitos utilitários de segurança obrigatórios tais como o NIDS (Network Intrusion Detection System - Sistema de detecção de intrusos na rede) como o snort (disponível em http://www.snort.org), firewall, e scanners de segurança de portos nmap, nessus), etc.
Se tiver recursos, pode ter um servidor diferente para cada serviço prestado : um servidor web, outro um servidor de base de dados... e o seu próprio mirror para alta disponibilidade. E por aí além ! Nunca termina este processo, visto que a segurança nunca termina. Você somente tenta reduzir os riscos... e eles estão cada vez pior cada dia que passa. Foi Avisado !

E que mais?

Como há mais de uma maneira de o fazer, você pode escolher o seu próprio caminho. Existem imensas RDBMS e muitas linguagens para comunicar com elas. A ideia por detrás da escrita deste artigo era mostrar como o MySQL e o Perl trabalham bem em conjunto.
Claro, que a escolha foi muito subjectiva : Eu gosto do MySQL porque é bastante pequeno no tamanho, trabalha em muitos SOs, é rápido, fiável... Eu também aprecio o trabalho da equipa do MySQL, sem esquecer os numerosos contribuidores. E o que eu gosto mais: estas pessoas não tentaram reinventar a roda. Mantiveram as coisas simples.
Acerca do Perl, já tudo foi dito acerca dele : o que é que posso adicionar ? Eu acredito que não pode trabalhar sem ele, quer seja um administrador de rede, um programador, ou o quer que seja. A comunidade do Perl é uma das grandes fontes para partilhar conhecimento com todos. Uma revista está disponível, chamada o "Perl Journal", a qual é agora incluída na revista SysAdmin, todas as duas edições. Se quiser subscrever, vá até http://www.samag.com.
Visto que estamos a falar acerca de bom trabalho, aqui vem a secção normal fora de sentido. Os nosso leitores da LinuxFocus provavelmente não se deram conta do pequeno número de pessoas envolvidas na revista. Não obstante, pode lê-la em muitas línguas diferentes. Já alguma vez reparou que algumas equipas trabalham quase sempre só com uma ou duas pessoas fazendo todo o trabalho ? São webmasters, tradutores, etc. Verifique a equipa Russa, a equipa Turca : verá que a maior parte dos artigos são traduzidos pelo Kirill ou Erdal. Verifique os projectos sob desenvolvimento, tais como o Português ou o Árabe : o mesmo resultado ! Gostaria de os felicitar a todos eles pelo seu excelente trabalho que fazem. Obrigado a todos vós: a comunidade de software livre deve-vos imenso.
Desculpem a digressão, mas acredito que isto tinha de ser dito.
Voltando ao assunto, terminemos com algumas palavras acerca do software livre. As pessoas do MySQL e do Perl merecem muitos agradecimentos. Eles fornecem-lhe utilitários praticamente livres. Contudo estes utilitários são muitas vezes tão bons como os verdadeiros produtos comerciais ( se não melhores), são actualizados frequentemente, muito bem documentados e pode utilizá-los quase em todos os sistemas Unix. Consegue encontrar software equivalente, por aí ? Creio que não !
Este artigo provavelmente não o ajudará muito, contudo se tiver vontade de experimentar estes produtos não será desnecessário.
Não estamos a viver num tempo espectacular ?

Referências

Perl.org
cpan.org, o arquivo de perl

Os tutoriais de Perl do Guido :

Perl I
Perl II
Perl III

Revisão do Livro Professional Perl Programming :

Perl Programming

A contribuição do Atif para o MySQL.

Uma revisão do MySQL pela LinuxFocus : uma velho artigo mais ainda actualizado :

MySQL

Dois velhos tutoriais de SQL da LinuxFocus :

SQL Part I
SQL Part II