39.5. Extensão para acesso ao PostgreSQL pela linguagem Ruby

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 . 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.

39.5.1. Instalação do Ruby-Postgres

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/

39.5.2. Utilização do Ruby-Postgres

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          ...
...
SourceForge.net Logo CSS válido!