You are on page 1of 41

Curso de Lua 3.

2
CGILua 3.2
ndice
Introduo......................................................................................................5
O que CGILua?..........................................................................................5
Execuo ....................................................................................................5

Scripts Lua e Templates HTML.........................................................................6


Scripts Lua ..................................................................................................6
Templates HTML .........................................................................................6

Templates HTML: Marcadores Especiais ...........................................................7


Campos de Expresso ..................................................................................7
Campos de Cdigo .......................................................................................7
Diretiva de Lao ..........................................................................................7
Diretiva Condicional ....................................................................................8

Exerccios de Fixao I ....................................................................................9

Formulrios .................................................................................................. 10

Exerccios de Fixao II ................................................................................. 11

Envio de Arquivos......................................................................................... 12
Introduo ................................................................................................ 12
Destino dos Arquivos ................................................................................. 12
Log de Envios............................................................................................ 13

Exerccios de Fixao III ................................................................................ 14

Construindo URLs ......................................................................................... 15


cgilua.mkurl( script, table ) ........................................................................ 15
cgilua.relativeurl( script ) ........................................................................... 15
cgilua.encodecgi( )..................................................................................... 15
cgilua.encodetable( table ).......................................................................... 16

Exerccios de Fixao IV ................................................................................ 17

Incluindo Arquivos........................................................................................ 18
cgilua.includehtml ( filename) .................................................................... 18
cgilua.preprocess( filename) ....................................................................... 18
cgilua.splitpath( path ) ............................................................................... 18
cgilua.escape( str )..................................................................................... 18
cgilua.unescape( str )................................................................................. 19

Cabealhos HTTP.......................................................................................... 20

2
cgilua.redirect( url, args ) ........................................................................... 20
cgilua.htmlheader( ) .................................................................................. 20
cgilua.httpheader( header ) ........................................................................ 20

Carregando Bibliotecas .................................................................................. 21


cgilua.loadlibrary(basename, initfunc) ........................................................ 21
cgilua.dofile( file ) ..................................................................................... 21
cgilua.tostring( varname ) .......................................................................... 21
cgilua.persistvar( varname ) ....................................................................... 22
cgilua.savestate( var1, var2, ... ) ................................................................. 22

Variveis Pr-Definidas.................................................................................. 24
cgi ............................................................................................................ 24
cgilua.version ............................................................................................ 24
cgilua.script_pdir ....................................................................................... 24
cgilua.script_vdir ....................................................................................... 24
cgilua.script_path ...................................................................................... 24
cgilua.cgilua_url ........................................................................................ 25

Biblioteca: Sistema ........................................................................................ 26


mkdir( path )............................................................................................. 26
chdir( path ).............................................................................................. 26
getcwd( ) .................................................................................................. 26
cp( source, target ) .................................................................................... 26
filetype( file ) ............................................................................................ 26
filetime( fmt, file ) ..................................................................................... 27
date2sec( date, fmt ) .................................................................................. 27
sec2date( nsec, fmt ).................................................................................. 27
lock( fhandle, mode )................................................................................. 28
sleep( msec )............................................................................................. 28

Biblioteca: DBLua ......................................................................................... 29


DBOpen( dbdescr ) .................................................................................... 29
DBExec( sqlcommand ).............................................................................. 29
DBRow( ).................................................................................................. 30
DBClose( ) ................................................................................................ 30

Exerccios de Fixao V ................................................................................. 31

Biblioteca: Crypt ........................................................................................... 32


crypt( str, key ) ......................................................................................... 32
decrypt( cryptbuf, key ) ............................................................................. 32
md5( str ).................................................................................................. 32
exor( buff1, buff2 ) .................................................................................... 32
encode( strbuff )........................................................................................ 33
decode( codedbuff ) ................................................................................... 33

3
Biblioteca: Cookies........................................................................................ 34
getcookie( name ) ...................................................................................... 34
setcookie( name, value, expires, path, domain, secure ) ............................... 34
setcookiehtml( name, value, expires, path, domain, secure ) ........................ 35
deletecookie( name ).................................................................................. 35

Biblioteca: Loadlib ........................................................................................ 36


loadlib( libname, dir ) ................................................................................ 36
unloadlib( libhandle ) ................................................................................ 36
callfromlib( libhandle, funcname ) .............................................................. 36

Biblioteca: Mail ............................................................................................. 38


mail{ to=tolist, from=frm, subject=sbj, message=msg, cc=cclist,
bcc=bcclist } ............................................................................................ 38

Respostas dos Exerccios................................................................................ 39

Bibliografia................................................................................................... 41

4
Introduo

O que CGILua?

Ferramenta para gerao de pginas HTML dinmicas via servidor HTTP.


Programa CGI que roda no servidor.
Utiliza um interpretador Lua para codificar os comandos que geraro as pginas HTML.
uma linguagem interpretada no necessria compilao.
Recebe arquivos a serem interpretados, os processa oferecendo acesso a banco de dados, E/S,
criptografia etc, e gera HTML de sada.
Manipula dados de formulrio HTML.
Pode-se utilizar tanto cdigo embutido em HTML (templates) quanto mdulos Lua separados
(scripts).
No possui estado (valores de variveis no so guardados no servidor).

Execuo
Para executar um script CGILua, deve-se utilizar a URL no formato: http:://<web-
server>/<path-cgilua>/<path-script>

, onde:

path-cgilua: caminho virtual relativo ao servidor web onde o CGILua est instalado.

path-script: caminho fsico (relativo ao diretrio-base do diretrio virtual) do script a ser


executado. Ex: http:://www.abc.com/cgi/cgilua.exe/scripts/teste.lua

5
Scripts Lua e Templates HTML
Scripts Lua

Arquivos com extenso .lua totalmente escritos em Lua.


Comunica-se com o servidor utilizando-se do dispositivo de sada padro write e print.
No incio do script, deve ser gerado um cabealho HTTP informando o tipo do documento
(Content-type).
EXEMPLO:
cgilua.htmlheader()
write('<html>')
if (cgi.language == 'english) then
greeting = 'Hello World!
elseif (cgi.language == 'portuguese) then
greeting = 'Ol Mundo!
else
greeting = '[unknown language]
end
write('<head><title>'..greeting..'</title></head>')
write('<body>')
write('<b>'..greeting..'</b>')
write('</body>')
write('</html>')

Templates HTML

Arquivos com extenso .html ou .htm, escritos em HTML mas com cdigo Lua e marcaes
especiais.
CGILua processa o cdigo Lua e marcaes especiais para gerar cdigo HTML dinmico.
Cdigo esttico: HTML; Cdigo dinmico: Lua/marcaes.

6
Templates HTML: Marcadores
Especiais

Campos de Expresso
Insere o resultado da expresso Lua no documento HTML.

FORMATO:
$| expressao-lua |$

ARGUMENTOS:
expressao-lua: qualquer expresso em Lua que retorne um valor, como por exemplo uma varivel
ou o retorno de uma funo. Caso retorne nil, nada inserido.

EXEMPLO:
Bom dia, <b>$|primeiroNome|$</b>!
(mostra em bold o contedo da varivel primeiroNome)
<a href=$|cgilua.mkurl(ajuda.html, cgi)|$>Ajuda</a>
(mostra dentro do href o retorno da funo cgilua.mkurl, compondo o link
para ajuda.html)

Campos de Cdigo
Executa o cdigo Lua entre os delimitadores.

FORMATO:
<!--$$ codigo-lua $$-->

ARGUMENTOS:
codigo-lua: qualquer cdigo lua

EXEMPLO:
<!--$$
function executaModulo (modulo)
return dofile(modulo)
end
executaModulo(teste.lua)
$$-->

Diretiva de Lao
Repete determinado trecho de cdigo enquanto uma expresso testada seja verdadeira.

FORMATO:
<!--$$ LOOP start='cod_ini', test='cond_exec', action='cod_ciclo' $$-->
[HTML code]
<!--$$ ENDLOOP $$-->

7
ARGUMENTOS:
start: condio inicial para o lao.
test: expresso testada. Ao retornar nil (falso), pra o lao.
action: ao executada em cada ciclo do lao.

EXEMPLO:
Table of numbers 1 to 9:<br>
<table border=1>
<tr>
<!--$$ LOOP start = 'i=1', test = 'i<10', action = i = i + 1' $$-->
<td>$| i |$</td>
<!--$$ ENDLOOP $$-->
</tr>
</table>

Diretiva Condicional
Testa uma expresso e Inclui determinado HTML caso a expresso seja verdadeira ou outro HTML
caso a expresso seja falsa.

FORMATO:
<!--$$ IF test='cond_exec' $$-->
[HTML code (true condition)]
(<!--$$ ELSE $$-->
[HTML code (false condition)])
<!--$$ ENDIF $$-->

ARGUMENTOS:
test: expresso testada. Se retornar no-nil (verdadeiro), inclui o primeiro trecho de cdigo HTML.
Se retornar nil (falso), inclui o segundo trecho de cdigo HTML, caso especificado.

EXEMPLO:
User name:
<!--$$ IF test='cgi.editmode' $$-->
<input type="text" name="user" value="$|cgi.user|$">
<!--$$ ELSE $$-->
$|cgi.user|$
<!--$$ ENDIF $$-->
</form>

8
Exerccios de Fixao I
1) Qual o correspondente script Lua correspondente ao template HTML abaixo?
<html>
<body>
<head><title>Pgina de Teste</title></head>
<body>
<b>Ol, mundo!</b>
</body>
</html>

2) Qual o correspondente template HTML correspondente ao script Lua abaixo?


cgilua.htmlheader()
write('<html>')
write('<head><title>Resultado</title></head>')
write('<body>')
if (cgi.resultado == "ok") then
write('<b>Funcionou!</b>')
else
write('<b>No funcionou!</b>')
end
write('</body>')
write('</html>')

3) Em um template HTML, quais os usos corretos da funo escrevePrimeiroNome definida


abaixo para imprimir o nome Joo:

function escrevePrimeiroNome()
write(Joo)
end

a) escrevePrimeiroNome()
b) $| escrevePrimeiroNome() |$
c) <!--$$ escrevePrimeiroNome $$-->
d) <!--$$ escrevePrimeiroNome() $$-->
e) $| write(escrevePrimeiroNome) |$

4) Em um template HTML, quais os usos corretos da funo retornaPrimeiroNome definida


abaixo para imprimir o nome Joo:

function escrevePrimeiroNome()
return Joo
end

a) escrevePrimeiroNome()
b) $| escrevePrimeiroNome() |$
c) <!--$$ escrevePrimeiroNome $$-->
d) <!--$$ write(escrevePrimeiroNome()) $$-->
e) $| escrevePrimeiroNome |$

9
Formulrios
CGILua processa dados vindos de formulrios HTML (FORM), automaticamente decodificando
os dados recebidos em uma tabela cgi.
CGILua trata da mesma forma e transparentemente o mtodo de envio de dados do FORM
(POST ou GET).
O script que ser executado para processar os dados (campo action do FORM) pode ser tanto
um template html quanto um script lua. Recomenda-se o uso da funo cgilua.mkurl para
gerar a URL deste script.
Os campos de dados recebidos do FORM so colocados como campos da tabela cgi, com o
nome original.
Ex: (formulrio)
<form method="POST" action=$|cgilua.mkurl( "processadados.html" )|$">
<input type="text" name="primeironome">
<input type="text" name="endereco">
<input type="submit" value="ok">
</form>
Ex: (arquivo que recebe os dados processadados.html)
<html>
<head><title>Dados Recebidos</title></head>
<body>
<p>O formulrio foi enviado com os seguintes dados:
<p>Nome: $|cgi.primeironome|$
<p>Endereo: $|cgi.endereco|$
</body> </html>

10
Exerccios de Fixao II
5) Implemente um formulrio em em um arquivo html (form.html) e um template HTML
(result.html) que imrpimir os valores (ambos esto em um mesmo diretrio). O formulrio
ter os campos nome, telefone e endereco.

11
Envio de Arquivos

Introduo
CGILua permite o envio de arquivos atravs do HTML (<input type=file>).
O arquivo enviado do navegador cliente a um diretrio do servidor.
Os seguintes atributos do FORM devem ser especificados: method=POST e
enctype=multipart/form-data.

Destino dos Arquivos


Para definir o destino dos arquivos enviados, deve-se especificar uma tabela de regras de envio
(no mesmo contexto que o HTML de envio)

rulestable = {
{ pattern="[pattern1]", target="[target_filename1]"},
{ pattern="[pattern2]", func=[func2]},
...
; root_dir = root_dir"
}

, onde:

pattern: expresso regular que deve casar com o arquivo sendo enviado
Deve-se utilizar ou a target ou a func:
target: expresso regular que define o nome de destino do arquivo. Pode-se usar capturas feitas
com parntesis no pattern atravs de %1, %2, %3 etc.
func: nome da funo que recebe o nome do arquivo de origemoriginal como parmetro e deve
retornar o nome de destino do arquivo
root_dir: diretrio destino dos arquivos enviados

Ex:
rulestable = {
{ pattern="(.*)%.doc", target="upload%.%1%.doc"},
{ pattern="(.*)%.bmp", target="upload%.%1%.bmp"},
; root_dir = "c:/temp/" }

Para definir as regras globais default, deve-se definir esta tabela com o nome cgilua.uploadrules

Para definir uma regra especfica, deve-se colocar um campo do tipo INPUT HIDDEN no
formulrio HTML imediatamente antes do INPUT FILE, com o campo VALUE contendo o nome da
varivel global contendo a tabela de regras, e com o campo NAME igual ao campo NAME do
INPUT FILE, mas com um prefixo rules_

Ex:
<input type="hidden" name="rules_upload_example
value=rulestable>
<input type="file" name="upload_example">

12
Log de Envios

cgilua.upload_transferlog uma varivel com um log de todas os envios de arquivos


efetuados por um script. Contm o nome do arquivo original, o nome com o qual foi salvo no
servidor e o diretrio de destino.
cgilua.uploadlog(filename) grava um relatrio no arquivo filename o contedo da varivel
cgilua.upload_transferlog, concatenando ao final do arquivo caso ele exista.

13
Exerccios de Fixao III
6) Implemente um script Lua que envie arquivos ao servidor no diretrio C:\files, trocando
suas letras para minsculas. O formulrio dever ser direcionado ao arquivo sendfile.htm.

14
Construindo URLs

cgilua.mkurl( script, table )


Gera uma URL para ser usada como um link HTML para o script CGILua, com a opo de passar
uma tabela de dados.

PARMETROS
script: String com o caminho virtual para o script.
Table (opcional): tabela com os parmetros a serem passados pela URL para o script.

RETORNO
Retorna uma string com a URL pronta para uso em um documento HTML. Um erro Lua gerado
caso o script no seja uma string, a tabela no seja uma table ou algum dos campos da tabela no
seja uma string.

Example
<a href="$|cgilua.mkurl("/~tecgraf/script.lua")|$">
<a href="$|cgilua.mkurl(main/script.lua",{ re=1.2, im=0.4 })|$">

produz o seguinte cdigo HTML (considerando que o CGILua est


instalado no diretrio virtual do servidor /cgilua):

<a href="/cgilua/cgilua.exe/~tecgraf/script.lua">
<a href="/cgilua/cgilua.exe/main/script.lua?im=0%2E4&re=1%2E2">

cgilua.relativeurl( script )
Retorna a URL que deve ser usada para se acessar um script dado por um caminho relativo ao
diretrio do script que est sendo executado. Esta funo permite independncia da localizao
das pginas do CGILua permitindo que pginas se refiram umas s outras usando caminhos
relativos, sem a necessidade de codificar as URLs do prprio CGILua e do diretrio que contm as
pginas.

PARMETROS
script: String com o caminho relativo do script a que se quer referir.

RETORNO
Retorna uma string com a URL pronta para uso em um documento HTML.

Exemplo
<a href=$|cgilua.relativeurl('script.html')|$>script</a>
ao ser processado, produz:
<a href=/scripts/cgilua-3.2/cgilua.exescript.html>script</a>

cgilua.encodecgi( )
Codifica a tabela cgi na forma de uma string de parmetros passados em uma URL.

15
RETORNO
Retorna uma string de parmetros codificados em formato de URL. Se cgi no for uma tabela ou
algum ndice ou valor da mesma no for uma string ou nmero, gera um erro Lua.

Exemplo
cgi = {}
cgi.software = 'CGILua 2.0'
cgi.club = 'Mengo'
<a href=script.lua?$| cgilua.encodecgi() |$>
produz o seguinte cdigo HTML:
<a href=script?software=CGILua+2%2E0&club=Meng%E3o>

cgilua.encodetable( table )
Codifica uma tabela dada na forma de uma string de parmetros passados em uma URL.

PARMETROS
table: uma tabela com os dados a serem codificados.

RETORNO
Retorna uma string de parmetros codificados em formato de URL. Se table no for uma tabela ou
algum ndice ou valor da mesma no for uma string ou nmero, gera um erro Lua.

Exemplo
<a href="script.lua?$|cgilua.encodetable{prod='CGILua 3.2'}|$">
produz o seguinte cdigo HTML:
<a href="/cgilua/cgilua.exe/script.lua?prod=CGILua+3%2E2">

16
Exerccios de Fixao IV
7) Implemente um link (comand <A HREF) para um template html, que passe a outro
template html de nome teste.html no mesmo diretrio, todos os parmetros de formulrio
recebidos.

17
Incluindo Arquivos

cgilua.includehtml ( filename)
Insere um pedao de HTML no documento atual. O arquivo pr-processado e expandido no
ponto em que a funo chamada.

PARMETROS
Filename: string contendo o caminho do arquivo a ser processado.

RETORNO
No retorna valor. Se houver algum problema na incluso do arquivo, um erro Lua gerado.

Obs.: Para inserir documentos HTML completos gerando um cabealho HTTP, utilize a funo
cgilua.preprocess.

cgilua.preprocess( filename)
Pr-processa o template HTML, gerando um documento HTML com o cabealho HTTP (cotnent-
type) e o envia diretamente para o dispositivo de sada no momento da chamada da funo. J
que o cabealho HTTP gerado, somente faz sentido chamar esta funo em scripts Lua, pois
tamplates HTML completos geram este cabealho automaticamente. Em templates HTML, utilize a
funo cgilua.includehtml.

PARMETROS
Filename: String com o caminho do template HTML a ser processado.

RETORNO
No h retorno. Se houver algum problema em abrir o arquivo, um erro gerado.

EXEMPLO
if cgi.newuser then
cgilua.preprocess( "newuser.html" )
else
cgilua.preprocess( "main.html" )
end

cgilua.splitpath( path )
Separa o diretrio do nome de arquivo em um caminho, e retorna os dois.

PARMETROS
Path: o caminho a ser dividido.

RETORNO
Retorna o diretrio como primeiro argumento e o nome do arquivo como o segundo.

cgilua.escape( str )

18
Codifica a string de entrada, substituindo todas as ocorrncias de caracteres for a da faixa a-z, A-
Z, e 0-9 com uma string no formato %XX, onde XX a representao hexadecimal do nmero do
cdigo do caracter.

PARMETROS
Str: a string a ser codificada.

RETORNO
A string codificada resultante.

cgilua.unescape( str )
Decodifica a string de entrada, substituindo cada ocorrncia da substring %XX (onde XX um
nmero hexadecimal) com o caracter equivalente do cdigo decimal XX.

PARMETROS
Str: a string a ser decodificada.

RETURN
A string decodificada resultante.

19
Cabealhos HTTP

cgilua.redirect( url, args )


Gera um cabealho HTTP redirecionando o browser para outra URL. Corresponde ao cabealho
Location: HTTP.

PARMETROS
url: o nome do arquivo ou a URL completa a ser carregada.
args (opcional): tabela Lua com parmetros a serem passados na URL, devidamente codificados.

EXEMPLO
if cgi.name then
cgilua.redirect( "newuser.html", { newuser = cgi.name } )
else
cgilua.redirect( "http://www.home.com" )
end

Obs.: Esta funo somente se aplica a scripts Lua. Qualquer outra sada aps esse comando ser
ignorada, embora o script rode at o fim. Sadas escritas antes desta funo s fazem sentido se
forem outros cabealhos HTTP.

cgilua.htmlheader( )
Escreve na sada o cabealho HTTP indicador de pgina HTML (Content-type: text/html)

EXEMPLO
O seguinte cdigo em um .lua produz uma pgina vlida:
cgilua.htmlheader()
write( '<h1>Ol!</h1>' )

Obs.: Esta funo somente se aplica Scripts Lua.

cgilua.httpheader( header )
Adiciona um cabealho HTTP pgina sendo criada dinamicamente.

PARMETROS
header: o texto do cabealho HTTP a ser inserido.

EXEMPLO
cgilua.httpheader( 'Expires: Tue, 20 Aug 1996 14:25:27 GMT\n' )
cgilua.httpheader( 'Content-type: text/plain\n\n' )
write( Pgina de Teste' )

Obs.: Aplica-se somente a scripts Lua.

20
Carregando Bibliotecas
cgilua.loadlibrary(basename, initfunc)
Carrega uma biblioteca dinmica. Procura a bibilioteca no diretrio de configurao do cgilua
(normalmente cgilua.conf) e ento no caminho do sistema para bilbliotecas

PARMETROS
basename: o nome-base do arquivo a ser carregado. Em UNIX, adiciona automaticamente o
prefixo lib e o sufixo .so. Em Windows, adiciona o sufixo .dll.
initfunc: a funo exportada pela biblioteca a ser chamada aps a carga da biblioteca.
Normalmente, esta uma funo que registra outras funes C da biblioteca no ambiente Lua.

EXEMPLO
O seguinte cdigo carrega a biblioteca library libcrypt.so (ou crypt.dll no
Windows), e executa a funo exportada cryptlib_open:
cgilua.loadlibrary( 'crypt', 'cryptlib_open' )

Obs.: Se a biblioteca no puder ser carregada, a execuo do script abortada mostrando uma
mensagem de erro.

cgilua.dofile( file )
Executes um arquivo Lua no ambirente Lua atual. A diferena para o comando dofile de Lua
que os arquivos so pegos do diretrio de configurao do cgilua, normalmente cgilua.conf/.

PARMETROS
file: o arquivo Lua a ser executado.

EXEMPLO
cgilua.dofile( 'lib.lua' )

Obs.: Se a execuo falhar ou o arquivo no puder ser encontrado, a execuo abortada.

cgilua.tostring( varname )
Constri uma representao string da varivel passada. Strings so corretamente codificadas e
tabelas so convertidas para sua representao em string, com os construtuores de tabelas { e }.

PARMETROS
varname: o nome da varivel Lua.

RETORNO
A representao string da varivel passada.

EXEMPLO
item = { name="X", value=123, properties={ 2, 4, 7 } }
write( cgilua.tostring( item ) )

21
produz a seguinte sada:

{ ["value"] = 123, ["name"] = "X", ["properties"] = { [1] = 2, [2] = 4, [3] = 7, }, }

Obs.: Funo til para depurar scripts. No funciona para variveis do tipo "function" ou
"userdata". Tabelas Lua aninhadas so aceitas, exceto se tiverem referncias em lao.

cgilua.persistvar( varname )
Produz uma string de forma que a execuo da string no ambiente Lua (com dostring) recupera o
valor da varivel.

PARMETROS
varname: o nome da varivel a ser persistida em uma string.

RETORNO
A string a ser usada para se recuperar a varivel.

EXEMPLO
list = { "a", "b", "c" }
keeplist = cgilua.persistvar( list )
list = nil
dostring( keeplist )
foreach( list, function (i,v) write( v ) end )

produz o seguinte resultado:


abc
cgilua.savestate( var1, var2, ... )
Salva o estado de variveis string, number ou table para pass-las ao prximo script a ser
executado com a funo cgilua.mkurl.

PARMETROS
varx: Nome das variveis cujo estado deve ser salvo.

Exemplo
<html><body>
<!--$$
x = { "i", "ii", "iii" }
name = "roman"
cgilua.savestate( "x", "name" )
$$-->

<a href="$|cgilua.mkurl( 'next.lua' )|$">Link para o prximo


script</a>
</body></html>

No script chamado next.lua, correto escrever:

cgilua.htmlheader()
i=1;

22
while x[i] do
write( name, ":", x[i] )
i=i+1
end

Obs.:
Esta funo aceita um nmero varivel de argumentos. As variveis so formatadas para montar
uma querystring para serem passadas atravs da URL na prxima chamada do cgilua.mkurl.
Pode-se mudar este comportamento para pass-las atravs de um arquivo temporrio no servidor,
atravs da varivel cgilua.STATEMETHOD, localizada em cgilua.conf/state.lua.

23
Variveis Pr-Definidas
cgi
Contm os dados, j decodificados, enviados para o script, independentemente do mtodo. Os
dados podem vir de um submit a um formulrio HTML ou diretamente passados pela URL.

EXEMPLO
<form method="POST" action="$|cgilua.mkurl( 'a.lua' )|$">
Nome: <input type="text" name="name">
Email: <input type="text" name="email">
<input type="submit">
</form>

Ao dar um submit no formulrio, o a tabela cgi no script a.lua ter os campos name e email:
write( "Your name is " .. cgi.name .. ", and your e-mail " .. cgi.email )

Uma outra forma de enviar os mesmos campos seria atravs de um link:


<a href="$|cgilua.mkurl('b.lua',{nome="John",email="john@dom.com" }) |$">

cgilua.version
Verso do CGILua usada.

cgilua.script_pdir
Caminho fsico do script sendo executado pelo CGILua.

EXEMPLO
Se a URL:
http://www.cgilua.com/cgi-bin/cgilua/~user/script.lua
executa o script localizado em
/home/user/public_html/script.lua
esta varivel possui o valor
/home/user/public_html/

cgilua.script_vdir
Caminho virtual do script sendo executado pelo CGILua.

EXEMPLO
Usando a URL http://www.cgilua.com/cgi-bin/cgilua/~user/script.lua, esta
varivel possuir o valor "/~user/".

cgilua.script_path
Caminho virtual do script sendo executado pelo CGILua.

24
EXEMPLO
Se a URL:
http://www.cgilua.com/cgi-bin/cgilua/~user/script.lua
executa o script localizado em
/home/user/public_html/script.lua
esta varivel contm o valor
/home/user/public_html/script.lua

cgilua.cgilua_url
Parte da URL usada para referenciar o CGILua.

EXEMPLO
Usando a URL
http://www.cgilua.com/cgi-bin/cgilua/~user/script.lua
esta varivel contm o valor:
/cgi-bin/cgilua

25
Biblioteca: Sistema
Oferece algumas funes teis do sistema operacional, como datas e operaes de E/S

mkdir( path )
Cria um diretrio no sistema de arquivos local.

PARMETROS
path: caminho do diretrio a ser criado (ou simplesmente um nome se deve-se criar abaixo do
diretrio atual)

RETORNO
Retorna nil em caso de falha ou 1 em sucesso.

chdir( path )
Troca o diretrio de trabalho atual para o diretrio especificado.

PARMETROS
path: o caminho do novo diretrio de trabalho.

RETORNO
No h retorno. Em caso de falha, o script abortado e mostrada uma mensagem de erro.

getcwd( )
Retorna o diretrio de trabalho atual.

RETORNO
Uma string contendo o caminho completo do diretrio de trabalho atual.

cp( source, target )


Copia o arquivo do caminho de origem para o caminho de destino.

RETORNO
Retorna nil em caso de erro; nesse caso o segundo retorno uma string descrevendo o erro.

EXEMPLO
cp( "c:/test/ball.gif", "c:/www/ball.gif" )

filetype( file )
Retorna o tipo do arquivo.

PARMETROS
file: o arquivo de que quer saber o tipo.

26
RETORNO
Uma da strings: "file", "directory" ou "other" de acordo com otipo do arquivo, ou nil se o tipo do
arquivo no pode ser retornado.

filetime( fmt, file )


Retorna a hora da ltima modificao feita no arquivo.

PARMETROS
fmt: o formato da string de sada, similar ao da funo em C strftime.
file (opcional): o arquivo de que se quer saber a hora da ltima modificao. Caso no seja
especificado, utilizado o caminho do script atual.

RETORNO
Uma string com a hora da ltima modificao, formatada conforme especificado.

EXEMPLO
$|filetime("%d/%m/%Y")|$
produz a seguinte sada:
27/04/1999

date2sec( date, fmt )


Converte uma data para o nmero correspondente de segundos desde primeiro de janeiro de
1970.

PARMETROS
date: uma string contendo uma data.
fmt: o formato da data a ser lida, de acordo com um padro.

RETORNO
O nmero correspondente de segundos desde primeiro de janeiro de 1970.

EXEMPLO
$|date2sec("5/02/1997","%d/%m/%Y")|$
produz a seguinte sada:
855111600

sec2date( nsec, fmt )


Converte um nmero como o nmero de segundos desde primeiro de janeiro de 1970 para uma
data.

PARMETROS
nsec: nmero de segundos.
fmt: o formato da sada.

RETORNO:
A data correspondente ao nmero de segundos desde primeiro de janeiro de 1970 correspondente
ao parmetro dado.

27
EXEMPLO
$|sec2date( date2sec("5/02/1997","%d/%m/%Y"),"%d/%m/%Y")|$
produces the following output:
05/02/1997

lock( fhandle, mode )


Tranca ou destranca o acesso a um arquivo. Na realidade, o acesso ao arquivo no impedido, na
verdade somente permite que seja feito o controle guardando o estado.

PARMETRO
fhandle: handle de um arquivo aberto. Aps uma chamada bem sucedida a writeto, o handle
dado pela varivel de Lua _OUTPUT.
Mode: o tipo de operao desejada. Utilize o caracter l para trancar um arquivo e u para
destrancar.

RETORNO
Retorna nil em caso de falha e 1 em caso de sucesso.

EXEMPLO
writeto( "data.txt")
while not lock( _OUTPUT, "l") do sleep (50) end
write ( "ok" )
lock( _OUTPUT, "u")
writeto ()
--espera at que nenhum outro processo est com o arquivo trancado para
trancar para si

sleep( msec )
Faz com que o processo ou thread correntes fiquem suspensos por msec milissegundos.

PARMETROS
msec: o nmero de milissegundos para ficar suspenso.

28
Biblioteca: DBLua
Oferece acesso a bancos de dados.

DBOpen( dbdescr )
Abre uma conexo com um banco de dados.

PARMETROS
dbdescr: string de conexo com um banco de dados.

RETORNO
Retorna nil se a conexo foi bem-sucedida ou uma string descrevendo o erro.

EXEMPLO (ODBC)
errormsg = DBOpen("DSN=agenda;UID=cgilua;PASSWD=lua;")
if errormsg then
cgilua.redirect( 'dberror.html', { msg=errormsg })
end

EXEMPLO (Mini-SQL)
DBOpen('HOST=davinci;DATABASE=agenda;')

Obs.: Para portabilidade, as palavras DATABASE e DSN so equivalentes e HOST ignorado no


uso com ODBC. No entanto, uma string de conexo "HOST=davinci;DATABASE=agenda;" seria
vlida em ambos ODBC e Mini-SQL se "agenda" um DSN de ODBC.

DBExec( sqlcommand )
Executa um comando SQL na conexo com banco de dados atualmente aberta.

PARMETROS
sqlcommand: uma string com o comando SQL a ser executado.

EXEMPLO
DBExec( "create table tst (nome char(50), cpf char(15))" )
DBExec( "insert into tst values ('Luiza','001.234.567-89')" )
DBExec( "insert into tst values ('Fabiana','009.876.543-21')" )
DBExec( "delete from tst where nome = 'Luiza'")
DBExec( "update tst set cpf = '009.999.999-99' where name ='Fabiana'")

Para evitar confuso com os delimitadores de string de Lua, (" ou ') e delimitadores de string de
SQL ('), a funo format de Lua pode ser usada.
Ex:
sql = format( "insert into tabela_teste values ('%s','%s')", cgi.name, cgi.cpf )
DBExec( sql )

Obs.: Em caso de erro no comando SQL, um erro de execuo mostrado, abortando a execuo
do script. Para evitar este tipo de comportamento, execute comandos para testar situaes de erro
(ex. teste se um registro existe com um comando SELECT antes de tentar apag-lo).

29
DBRow( )
Retorna a prxima linha da tabela de resultados produzida pela ltimo comando SQL executado
(com DBExec).

RETORNO
Uma tabela Lua contendo os dados da linha, com todas as coludas da tabela de resultados
indexadas na mesma ordem que sua posio no resultado (ndices [1], [2], ... ) e tambm
indexadas pelol nome da coluna (ndices [nome_coluna1"], ["nome_coluna2"], ... ). Quando
chega no final da tabela, retorna nil.

Exemplo
Suponha que no banco de dados h a tabela Empregados, com o seguinte
formato: id (int), nome (char 100) e telefone (char 20)
Dados:
1 Maria 222-3333
2 Marcelo (NULL)
3 Pedro 555-3333
4 William 666-3333

Para retornar os dados da tabela:


DBOpen("DATABASE=company;")
DBExec("SELECT telephone, name FROM employees WHERE name LIKE
= 'M%'" )
row = DBRow()
while row do
write( "Name: ".. row.name .. "<br>" ) -- poderia fazer tambm
com "row[2]
row = DBRow()
end
DBClose()
O resultado ser::
Nome: Maria
Nome: Marcelo

Obs.: Valores nulos so traduzidos para valores nil em Lua.

DBClose( )
Fecha a conexo ativa com o banco de dados, aberta com o DBOpen

Exemplo
DBOpen( "DATABASE=example;" )
DBExec( "create table t (nome char(50), cpf char(15))" )
DBClose()

30
Exerccios de Fixao V
8) Dada uma tabela agenda com os campos nome, telefone e endereco de um banco de
dados em DSN=teste, escreva o cdigo em script Lua para imprimir todos os valores no
HTML.

9) Dada uma tabela agenda com os campos nome, telefone e endereco de um banco de
dados em DSN=teste, e uma tabela Lua agenda, indexada numericamente, sendo que
cada entrada desta tabela Lua contendo uma tabela com os mesmos campos nome,
telefone e endereco, escreva o cdigo em script Lua para inserir na tabela do banco de
dados todos os valores da tabela Lua.

31
Biblioteca: Crypt
Oferece algumas funcionalidades de criptografia.

crypt( str, key )


Executa uma encriptao DES de 56-bit, usado o algortimo "Fast DES".

PARMETROS
str: String a ser encriptada. Pode ser um buffer binrio genrico.
key (opcional): Uma string a ser utilizada na gerao da chave de encriptao. Somente os 8
primeiros caracteres so utilizados. Se no especificado, utiliza uma chave interna fixa.

RETORNO
Retorna uma string encriptada em um buffer de 8 bits.

decrypt( cryptbuf, key )


Decripta um buffer, usando o algortimo de criptografia DES.

PARAMETROS
cryptbuf: Buffer contendo o dado encriptado.

RETORNO
O dato original, decriptado.

md5( str )
Aplica o algortimo MD5 na string de entrada.

PARMETROS
str: string na qual o MD5 ser aplicado.

RETORNO
String de sada da aplicao do MD5 na string de entrada.

exor( buff1, buff2 )


Executa um XOR binrio nos buffers passados como parmetros. Pode ser til para construir
outras funes de criptografia em conjunto com a funo md5.

PARMETROS
buff1: Primeiro operando para o XOR.
buff2: Segundo operando para o XOR.

RETORNO
O buffer binrio resultante.

32
encode( strbuff )
Codifica buffers de 8 bit em uma string ASCII de 7 bits, conforme especificado na RFC 822.

PARMETROS
strbuff: o buffer binrio a ser codificada.

RETORNO
A string resultante codificada.

Exemplo
encbuff = encode( crypt( "123456789" )
write( encbuff )
Produz a seguinte sada:
uwzJJwuywCnAWQD+ynT+eQc=

decode( codedbuff )
Restaura um buffer codificado pela funo encode.

PARMETROS
codedbuff: o buffer a ser decodificado.

RETORNO
O buffer decodificado.

Exemplo
encbuff = encode( crypt( "123456789" )
buff = decode( encbuff )
write( decrypt( buff ) )
Produz a sada:
123456789

33
Biblioteca: Cookies
Um Cookie um mecanismo para armazenar informao no cliente de uma conexo HTTP

getcookie( name )
Faz o servidor informar o valor de um cookie armazenado sob o nome name, que foi fornecido
pelo browser cliente quando o script foi solicitado.

PARMETROS
name: nome do cookie a ser retornado.

RETORNO
O valor do cookie requisitado.

Exemplo
naccess = getcookie( "COUNTACCESS" )
if not naccess then
msg = Bem-vindo, novo usurio!"
else
msg = Bem-vindo de volta! Voc j visitou nosso site "..
naccess.." vezes."
end
write( msg )

setcookie( name, value, expires, path, domain,


secure )
Despacha um cabealho http necessrio para criar um cookie no browser cliente.

PARMETROS
name: o nome do cookie.
value: o valor do cookie.
expires (opcional): data de quando o cookie ir expirar, no formado dd/mm/yyyy. Se este
parmetro no for fornecido, o cookie ser apagado quando a sesso atual terminar (ex. o quando
o browser for fechado).
path (opcional): o caminho virtual no servidor apontado pelo domnio (veja abaixo) dos scripts
que podero ver o valor do cookie. O valor mais amplo que pode ser fornecido /, o que
significa que qualquer script no servidor ter acesso ao valor do cookie. O valor default o
mesmo caminho virtual do script que est criando o cookie.
domain (opcional): indica o domnio dos servidores que podero acessar o valor do cookie.
Domnios parciais so aceitos (ex: ".puc-rio.br). Se nenhum valor for fornecido, o default
restringir a visibilidade do cookie ao servidor que o criou.
secure (opcional) : se este parmetro for igual a "secure", o cookie s ser transmitido via um
canal seguro (HTTPS).

Exemplo
naccess = getcookie( "COUNTACCESS" )
if not naccess then
naccess = 1
else

34
naccess = naccess + 1
end
setcookie( "COUNTACCESS", naccess )
cgilua.htmlheader()

Obs: Esta funo deve ser parte do cabealho HTTP do script, ou seja, deve ser chamada antes do
corpo do HTML
Como esta funo deve ser chamada na construo de cabealhos HTTP, s faz sentido us-la em
scripts Lua.

setcookiehtml( name, value, expires, path,


domain, secure )
Idntica ao setcookie, mas deve ser utilizada em um template HTML. Gera o cabealho HTML Set-
Cookie.

PARMETROS
Idnticos ao setcookie.

RETORNO
O cdigo HTML para gerar o cookie no cabealho http.

Exemplo
<html>
<head>
<!--$$
naccess = getcookie( "COUNTACCESS" )
if not naccess then
naccess = 1
else
naccess = naccess + 1
end
setcookiehtml( "COUNTACCESS", naccess )
$$-->
</head>
<body>
...
Obs: Esta funo deve ser chamada entre as tags HTML <head> e </head>

deletecookie( name )
Remove o cookie com o nome determinado no browser-cliente.

PARMETROS
name: o nome do cookie a ser removido.

Exemplo
deletecookie( "COUNTACCESS" )

35
Biblioteca: Loadlib
Fornece suporte para a carga de bibliotecas dinmicas.

loadlib( libname, dir )


Carrega a biblioteca dinmica especificada.

PARMETROS
libname: o nome da biblioteca (sem extenso) ou o caminho completo para a biblioteca. Se for o
nome de uma biblioteca, dir pode ser utilizado para especificar o caminho.
dir (opcional): o diretrio onde a biblioteca est localizada.

RETORNO
A funo retorna um handle para ser usada pelas funes unloadlib e callfromlib. Se a biblioteca
no puder ser carregada, retorna nil como primeiro parmetro e uma string descrevendo o erro
como segundo parmetro.

Exemplo
-- procura por libposlua.so no unix ou poslua.dll in windows
loadlib( "/usr/lib/libX11.so" )
loadlib( "c:\\lua\\poslua.dll" )
-- usando o caminho de busca default do sistema
loadlib( "poslua" )
-- procura por /lua/libposlua.so em unix, /lua/poslib.dll em Windows
loadlib( "poslua", "/lua/" )

unloadlib( libhandle )
Descarrega a biblioteca especificada pelo handle.

PARMETROS
libhandle: handle da biblioteca a ser descarregada. Este handle fornecido pela funo loadlib.

Exemplo
testlib = loadlib( 'test' )
-- "test_open" registra a funo f() em lua
callfromlib( testlib, 'test_open' )
x = f()
unloadlib( testlib )
-- desregistra f()
f = nil

Obs.: As funes Lua eventualmente registradas pela biblioteca no so automaticamente


removidas.

callfromlib( libhandle, funcname )


Chama a funo determinada da biblioteca correspondente ao handle fornecido.

36
PARMETROS
libhandle: o handle da biblioteca.
funcname : o nome da funo exportada pela biblioteca a ser chamada.

Exemplo
datelib, errmsg = loadlib( 'date' )
if datelib then
callfromlib( datelib, 'date_open' )
else
error( errmsg )
end

Obs.: Tipicamente, usa-se a callfromlib somente uma fez, aps a loadlib, para abrir uma funo de
"open" que ir registrar as funes da biblioteca no ambiente Lua.

37
Biblioteca: Mail
Permite o envio de mensagens de e-mail via um servidor SMTP.

mail{ to=tolist, from=frm, subject=sbj,


message=msg, cc=cclist, bcc=bcclist }
Envia uma mensagem de e-mail atravs de um servidor SMTP.

PARMETROS
to: lista de recipientes da mensagem, separados por vrgula
From: o e-mail do remetente.
subject (opcional): o assunto da mensagem.
message (opcional): o corpo da mensagem.
cc (opcional): lista de recipientes cpia-carbono da mensagem, separados por vrgula
bcc (opcional): lista de recipientes cpia-carbono invisveis da mensagem, separados por vrgula
mailserver (em sistemas Windows). O IP do servidor SMTP a ser usado.

RETORNO
Retorna 1 se a mensagem foi enviada com sucesso ou nil em caso de falha, com uma string
descrevendo o erro como segundo argumento.

Exemplo
msg = Corpo da mensagem de teste
ok, errmsg = mail{ mailserver="127.0.0.1",
to=teste@servidor.com.br", from="user@hotmail.com", subject=Teste",
message=msg }
cgilua.htmlheader()
if not ok then
write( A mensagem no pde ser enviada. Motivo: ".. errmsg )
else
write( Mensagem enviada com sucesso!" )
end

Obs.: Em sistemas Windows, o campo "mailserver obrigatrio. possvel definir esse valor
globalmente para todos os scripts definindo-se a varivel global MAILSERVER. Em sistemas Unix,
verifique se o caminho para o executvel do sendmail est correto no arquivo
cgilua.conf/mail.lua.

38
Respostas dos Exerccios
1) cgilua.htmlheader()
write('<html>')
write('<head><title>Pgina de Teste</title></head>')
write('<body>')
write('<b>Ol, mundo!</b>')
write('</body>')
write('</html>')

2) <html>
<head><title>Resultado</title></head>
<body>
<!--$$ IF test='cgi.resultado == "ok"' $$-->
<b>Funcionou!</b>
<!--$$ ELSE $$-->
<b>No funcionou!</b>
<!--$$ ENDIF $$-->
</body>
</html>

3) letra d

4) letras b e d

5) form.html:
<html><body>
<form method="POST" action="result.htm">
Nome:<input type="text" name="nome"><br>
Telefone:<input type="text" name="telefone"><br>
Endereo:<input type="text" name="endereco"><br>
</form>
</body></html>

result.html:

<html><body>
Nome: $|cgi.nome|$<br>
Telefone: $|cgi.telefone|$<br>
Endereo:$|cgi.endereco|$<br>
</body></html>

6) cgilua.uploadrules = {
{ pattern="(.*)", func=strlower},
; root_dir = C:\files
}
cgilua.htmlheader()
write('<html>')
write('<body>')
write(<form action = "sendfile.html" )
write(method="POST" enctype="multipart/form-data">')

39
write('Arquivo: <input type="file">')
write('<input type="submit" value="Ok">')
write('</form>')
write('</body>')
write('</html>')

7) <a href="$|cgilua.mkurl("teste.html", cgi)|$">

8) local error = DBOpen( "DSN=teste;" )


if (error) then
write( "No foi possvel abrir conectar com o banco de dados!<br>" )
else
DBExec( "select * from agenda" )
row = DBRow()
while row do
write( "name: ".. row.nome .. "<br>" )
write( "telefone: ".. row.telefone .. "<br>" )
write( "endereco: ".. row. endereco .. "<br>" )
write("<br>" )
row = DBRow()
end
DBClose()
end

9) local error = DBOpen( "DSN=teste;" )


if (error) then
write( No foi possvel conectar com o banco de dados!<br>")
else
foreachi(agenda, function(i, v)
local sql = format(insert into agenda values ('%s', '%s', '%s')",
v.nome, v.telefone, v.endereco)
DBExec(sql)
end)
DBClose()
end

40
Bibliografia
1) Lua and the Web (PowerPoint) - Roberto Ierusalimschy

2) CGILua 3.2 Manual at http://www.tecgraf.puc-rio.br/cgilua

41

You might also like