Ensaio acerca de bibliotecas de código aberto para abstração de acesso a banco de dados em linguagem C++

Este estudo é um ensaio acerca das ferramentas de programação em linguagem C++ destinadas a fornecer uma camada de abstração para operar indistintamente bibliotecas clientes nativas de servidores de banco de dados.

[ Hits: 19.886 ]

Por: Renato Merli em 20/10/2011


SOCI



1. Introdução

SOCI [2] é um acrônimo para "Simple Oracle Call Interface" e foi criada inicialmente para fornecer uma camada de abstração facilitadora para acesso ao banco de dados Oracle. Com o passar do tempo, novos backends foram adicionados e, em sua versão atual, os bancos de dados suportados são Oracle, MySQL, PostgreSQL, SQLite3, Firebird e ODBC, operando sobre as plataformas Linux e Windows.

Conforme citado no site oficial da biblioteca [2], "SOCI cria a ilusão de embarcar consultas SQL em código C++ comum, permanecendo inteiramente compatível com STL", "A ideia é prover aos programadores em C++ uma maneira de acessar bancos de dados SQL da maneira mais natural e intuitiva".

De fato, o que chama a atenção em SOCI são suas criativas e redundantes maneiras para especificar instruções SQL e acessar os dados resultantes dessas consultas.. Podemos usar estruturas, tipos primitivos, utilizar tipos tuple [11] (de BOOST) ou receber os dados em objetos através de um método de mapeamento objeto-relacional.

Um dos métodos possíveis, baseado em streams, bastante criativo e funcional, serviu de inspiração para o método de acesso utilizado em DBIxx, outra biblioteca de abstração incluída neste ensaio.

SOCI esta na versão 3.1, que foi disponibilizada em 2011, e vem sendo ativamente desenvolvida desde 2004.

2. Principais componentes

soci::session Estabelece uma conexão com o servidor de banco de dados e fornece diferentes métodos para realização de operações em linguagem SQL. Um dos métodos é a especificação de strings de instruções SQL baseado na sintaxe de streams, utilizando o operador de intração "<<" e dois métodos para associação de dados:
  • soci::into() especifica o destino dos dados resultantes de uma operação no banco
  • soci::use() Usado para fácil associação de uma variável local a string SQL.

O objeto de conexão pode receber argumentos de conexão de varias formas, uma delas usando uma sintaxe parecida com objetos de conexão de outras bibliotecas:

<objeto-de-conexao> nome_objeto ("nome do backend", "argumentos");

... o que resulta em:
soci::session sql ( "mysql", "db=teste user=root password='senha' " );

O objeto session criado com soci::session é então usado para operações no banco, de várias maneiras, entre elas, são válidas operações como:

sql << "drop table persons";
sql << "delete from person where id = " << 100;

Podemos compor uma string de operação SQL de maneiras diferentes utilizando soci::use para associar dados de variáveis locais a string resultante, como no exemplo seguinte:

string firstName = "John", lastName = "Smith";
int personId = 7;
sql << "insert into person(id, firstname, lastname) values(:id, :fn, :ln)",
use(firstName, "fn"), use(lastName, "ln"), use(personId, "id");

Também podemos recuperar os dados resultantes de consultas de maneiras distintas. Operações que retornam apenas um valor podem ser especificadas assim:

std::string name;
sql << "select name from numbers where id=10 ", into(name);

Para recuperação de múltiplos registros podemos recuperar registros sequencialmente utilizando a classe soci::statement e seus métodos execute() e fetch(), como o código seguinte:

std::string name;
statement st = (sql.prepare << "select name from consumers", into(name));
st.execute();

while (st.fetch())
{
   std::cout << name << '\n';
}

Outro método para recuperação de dados de múltiplos registros utiliza-se do objeto soci::row, que funciona de maneira parecida a um vetor STL, operando com iterador. Seu funcionamento segue um padrão parecido ao presente em outras ferramentas, por isso não trataremos desse método aqui.

Há também um método que consideramos muito simples e prático baseado na classe tuple da biblioteca BOOST [11], consulte a página oficial de SOCI para informações sobre o uso desse método [2].

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. GDAmm
   3. SOCI
   4. DBIxx
   5. Outras ferramentas e referências
Outros artigos deste autor

Introdução à plataforma GNU de desenvolvimento

Leitura recomendada

Acessando PostgreSQL com C

Embutindo um banco de dados SQLite em sua aplicação C++

Usando MySQL na linguagem C

Acessando PostgreSQL com C - Cursores

PostgreSQL - Embutindo comandos SQL no seu código C

  
Comentários
[1] Comentário enviado por julio_hoffimann em 20/10/2011 - 22:57h

Oi Renato,

Ótima coletânea!

Abraço!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts