| Documentação do PostgreSQL 8.0.0 | ||||
|---|---|---|---|---|
| Anterior | Início | Capítulo 39. PL/Ruby - Linguagem procedural Ruby | Fim | Próxima | 
O Ruby-Postgres é uma biblioteca de extensão que permite acesso ao PostgreSQL a partir da linguagem Ruby.
O Ruby-Postgres é um projeto independente, que não faz parte da distribuição padrão do PostgreSQL, cujo mantenedor atual é Dave Lee <dave@cherryville.org> . O projeto está relacionado em RAA - Ruby Application Archive, na categoria Biblioteca/Banco de Dados, e descrito na página RAA - postgres. A página do projeto se encontra em Postgres(Ruby extension library). Para instalar o Ruby-Postgres, primeiro deve ser baixado o arquivo ruby-postgres-20051221.tar.gz, ou mais recente.
Os programas Ruby utilizando a biblioteca Ruby-Postgres para acessar o PostgreSQL podem ser desenvolvidos e testados utilizando o Eclipse, bastando para isso instalar o pugin Ruby Development Tool.
Antes de instalar o Ruby-Postgres 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/ruby-postgres/, com o arquivo ruby-postgres-20051221.tar.gz baixado no diretório /download, conforme mostrado a seguir:
cd /download/ wget http://ruby.scripting.ca/postgres/archive/ruby-postgres-20051221.tar.gz cd /usr/local/src/ tar xzvf /download/ruby-postgres-20051221.tar.gz cd ruby-postgres/ ruby extconf.rb make make install /usr/bin/install -c -m 0755 postgres.so /usr/lib/site_ruby/1.8/i386-linux
O arquivo README no diretório de instalação contém as instruções de instalação.
No comando ruby extconf.rb pode ser necessário especificar o nome do diretório dos arquivos de inclusão e a biblioteca -lpq utilizando:
--with-pgsql-include-dir=<diretório dos arquivos de inclusão> --with-pgsql-lib-dir=<diretório da biblioteca>
ou
--with-pgsql-dir=<diretório>
que é o mesmo que
--with-pgsql-include-dir=<diretório>/include, --with-pgsql-lib-dir=<diretório>/lib
Por exemplo:
ruby extconf.rb --with-pgsql-include-dir=/usr/local/pgsql/include \
                --with-pgsql-lib-dir=/usr/local/pgsql/lib
# ou
ruby extconf.rb --with-pgsql-dir=/usr/local/pgsql/
Esta seção tem por finalidade mostrar exemplos de utilização de programas escritos em Ruby acessando o PostgreSQL.
Exemplo 39-15. Programa Ruby listar as linhas da tabela
O programa deste exemplo se conecta ao banco de dados plruby, e lista as colunas de todas as linhas da tabela emp, usada no exemplo de gatilho, referenciando as colunas pelo nome e pela posição na linha, e utilizando o método inspect. Primeiro foi utilizado o comando
su - postgres
para tornar o postgres o usuário do sistema e seu diretório base o diretório corrente. Em seguida foi criado o arquivo emp.rb mostrado abaixo
require 'postgres'
conn = PGconn.open('dbname' => 'plruby')
res  = conn.exec('SELECT nome_emp, salario FROM emp')
warn "==================================="
res.each do |linha|
  puts "pelo nome:     #{linha['nome_emp']}\t#{linha['salario']}"
  puts "pela posição:  #{linha[0]}\t#{linha[1]}"
  puts "por inspeção:  #{linha.inspect}"
  warn "==================================="
end
res.clear
conn.close
cuja execução produziu o seguinte resultado:
$ ruby emp.rb =================================== pelo nome: José 1500 pela posição: José 1500 por inspeção: ["Jos\351", 1500] =================================== pelo nome: Maria 2500 pela posição: Maria 2500 por inspeção: ["Maria", 2500] ===================================
Exemplo 39-16. Programa Ruby semelhante ao programa testlibpq.c
Este programa é uma conversão para a linguagem Ruby do programa testlibpq.c escrito na linguagem C. A conversão foi feita por sven em 2006-01-08 20:38:25 +0100, e a página original se encontra em test1.rb. Existem outros programas Ruby em ruby-postgres, inclusive uma versão do psql escrita em Ruby. No programa test1.rb, mostrado abaixo, é feita a conexão com o banco de dados template1 usando o usuário teste, cuja senha também é teste:
#! /usr/bin/env ruby
#
# Arquivo original src/test/examples/testlibpq.c
# na distribuição do PostgreSQL
#
require 'postgres'
def main
    pghost    = nil
    pgport    = nil
    pgoptions = nil
    pgtty     = nil
    dbname    = "template1"
    login     = "teste"
    password  = "teste"
    begin
    conn = PGconn.connect(pghost,pgport,pgoptions,pgtty,dbname,login,password)
    if $DEBUG
      fd = open("/tmp/trace.out","w")
      conn.trace(fd)
    end
    res = conn.exec("BEGIN")
    res.clear
    res = conn.exec("DECLARE myportal CURSOR FOR select * from pg_database")
    res.clear
    res = conn.exec("FETCH ALL in myportal")
    if (res.status != PGresult::TUPLES_OK)
      raise PGerror,"O comando FETCH ALL não retornou as tuplas apropriadamente\n"
    end
    for fld in res.fields
      printf("%-15s",fld)
    end
    printf("\n\n")
    res.result.each do |tupl|
      tupl.each do |fld|
        printf("%-15s",fld)
      end
      printf("\n")
    end
    res = conn.exec("CLOSE myportal")
    res = conn.exec("END")
    res.clear
    conn.close
    if $DEBUG
      fl.close
    end
  rescue PGError
    if (conn.status == PGconn::CONNECTION_BAD)
      printf(STDERR, "Foi perdida a conexão com o servidor de banco de dados, ")
      printf(STDERR, "portanto é impossível continuar o processamento.  ")
      printf(STDERR, "Terminando.\n")
    else
      printf(STDERR, conn.error)
    end
    exit(1)
  end
end
main
O resultado da execução, com algumas linhas e colunas suprimidas, está mostrado abaixo:
$ ./test1.rb
datname        datdba         encoding       datistemplate  datallowconn  ... datacl
...
template0      1              8              true           false         ... {postgres=CT/postgres}
template1      1              8              true           true          ...
teste          161            8              false          true          ...
plruby         1              8              false          true          ...
...