Autor: Halley Pacheco de Oliveira (<halleypo@users.sourceforge.net> ). Iniciado em 2006-01-11.
O PL/Ruby é uma linguagem procedural carregável, que permite a criação de funções e gatilhos do PostgreSQL escritos na linguagem Ruby.
O PL/Ruby é um projeto independente, que não faz parte da distribuição padrão do PostgreSQL, cujo dono é Guy Decoux <ts@moulon.inra.fr> . O projeto está relacionado em RAA - Ruby Application Archive, na categoria Biblioteca/Banco de Dados, e descrito na página RAA - pl-ruby. A página do projeto se encontra em PL/Ruby. Para instalar o PL/Ruby, primeiro deve ser baixado o arquivo plruby.tar.gz.
O PL/Ruby pode ser instalado como um tratador de chamadas confiável (TRUSTED), ou não. No comando CREATE LANGUAGE, quando não é especificado TRUSTED ao criar a linguagem, somente os usuários do PostgreSQL com privilégio de superusuário podem usar a linguagem para criar novas funções. Neste capítulo só será visto o modo confiável. Para obter informações sobre o modo não confiável deve ser consultado o artigo Installing untrusted PL/Ruby for PostgreSQL.
Antes de instalar o PL/Ruby pode ser necessário instalar todos os cabeçalhos do PostgreSQL através do comando gmake install (consulte o Capítulo 14). A instalação foi feita no diretório /usr/local/src/plruby-0.4.6/, com o arquivo plruby.tar.gz baixado no diretório /download, conforme mostrado a seguir:
cd /download wget ftp://moulon.inra.fr/pub/ruby/plruby.tar.gz cd /usr/local/src/ tar xzvf /download/plruby.tar.gz cd plruby-0.4.6/ ruby extconf.rb make make install
O arquivo README.en no diretório de instalação contém as instruções de instalação.
No comando ruby extconf.rb pode ser necessário especificar as opções:
prefixo dos diretórios de inclusão e de biblioteca do PostgreSQL
diretório dos arquivos de inclusão do PostgreSQL
diretório dos arquivos de biblioteca do PostgreSQL
número da versão do PostgreSQL, como 73 ou 74, ou seja, número principal e secundário
por padrão o PL/Ruby tenta converter o tipo do PostgreSQL em uma classe do Ruby. Esta opção dá a possibilidade de desativar todas as conversões.
sufixo a ser adicionado
Exemplo:
ruby extconf.rb --with-pgsql-include=/usr/local/pgsql/include \ --with-pgsql-lib=/usr/local/pgsql/lib
Uma vez que o catálogo do sistema pg_language é privativo de cada banco de dados, a nova linguagem somente pode ser criada individualmente em cada um dos bancos de dados, ou no banco de dados template1 para que fique disponível automaticamente em todos os bancos de dados criados após a instalação, uma vez que sua entrada em template1 é copiada pelo comando CREATE DATABASE.
No exemplo abaixo é criado o banco de dados plruby e instalada a linguagem PL/Ruby. Este banco de dados é utilizado em todos os exemplos deste capítulo.
# su - postgres $ psql template1 Bem-vindo ao psql 8.0.0, o terminal interativo do PostgreSQL. Digite: \copyright para mostrar a licença da distribuição \h para ajuda nos comandos SQL \? para ajuda nos comandos do psql \g ou finalizar com ponto-e-vírgula para executar o comando \q para sair template1=# CREATE DATABASE plruby; CREATE DATABASE template1=# \c plruby Conectado ao banco de dados "plruby". plruby=# CREATE FUNCTION plruby_call_handler () RETURNS language_handler plruby-# AS '/usr/lib/site_ruby/1.8/i386-linux/plruby.so' plruby-# LANGUAGE 'C'; CREATE FUNCTION plruby=# CREATE TRUSTED LANGUAGE 'plruby' plruby-# HANDLER plruby_call_handler plruby-# LANCOMPILER 'PL/Ruby'; CREATE LANGUAGE plruby=# SELECT * FROM pg_language; lanname | lanispl | lanpltrusted | lanplcallfoid | lanvalidator | lanacl ----------+---------+--------------+---------------+--------------+--------------- internal | f | f | 0 | 2246 | c | f | f | 0 | 2247 | plruby | t | t | 1632033 | 0 | sql | f | t | 0 | 2248 | {=U/postgres} plpgsql | t | t | 1632662 | 1632663 | (5 linhas)
Pela consulta acima à tabela pg_language, pode ser visto que a linguagem plruby: é uma linguagem procedural, como a linguagem plpgsql (coluna lanispl); é uma linguagem confiável (TRUSTED), como as linguagens SQL e plpgsql (coluna lanpltrusted); não é uma linguagem interna, porque possui uma função tratadora de chamadas, como a linguagem plpgsql (coluna lanplcallfoid); não possui uma função validadora, responsável pela verificação da sintaxe e validação das novas funções criadas, como as demais linguagens possuem (coluna lanvalidator).