1. Introdução
DBIxx [3] , assim como GDAmm, também é um wrapper, que no caso, encapsula a biblioteca DBI [9] . Inspirada na sintaxe da biblioteca SOCI [3], DBIxx também oferece ferramentas de fácil utilização para criação de consultas SQL e tratamento de dados.
É uma difícil decisão de projeto escolher entre a adoção de DBIxx e SOCI, já que as mesmas têm API's extremamente semelhantes.
DBI (e conseqüentemente DBIxx) opera sobre Firebird, Interbase, MySQL, PostgreSQL, Sqlite3, alem de MS SQL e Sybase através da biblioteca FreeTDS [10].
2. Principais componentes
Parte considerável dos objetos de DBIxx tem correspondente na API de SOCI, às vezes utilizando o mesmo nome. Tendo SOCI como referencia, o exemplo abaixo é praticamente auto-explicativo.
using namespace dbixx;
using namespace std;
int main()
{
try {
session sql("sqlite3:dbname=test.db;sqlite3_dbdir=./");
sql<<"DROP TABLE IF EXISTS users";
sql.exec();
sql<<"CREATE TABLE users ( "
" id integer primary key not null, "
" name varchar(128) not null "
");";
sql.exec();
sql<<"INSERT INTO users(id,name) VALUES(?,?)",
1,"Moshe",exec();
sql<<"INSERT INTO users(id,name) VALUES(?,?)",
2,"Yossi",exec();
sql<<"SELECT name FROM users WHERE id=?",1;
row r;
if(sql.single(r)) {
string name;
r>>name;
cout<<name<<endl;
}
else {
cout<<"No user with id="<<1<<endl;
}
result res;
sql<<"SELECT id,name FROM users";
sql.fetch(res);
cout<<"There are "<<res.rows()<<" users\n";
while(res.next(r)) {
int id;
string name;
r>>id>>name;
cout<<id<<"\t"<<name<<endl;
}
}
catch(std::exception const &e) {
cerr<<e.what()<<endl;
return 1;
}
return 0;
}
Ao primeiro olhar percebemos uma sintaxe ligeiramente diferente para composição de strings de instruções SQL, alem necessidade de chamar o método exec() parar efetivamente realizar as operações, mas percebemos também a sintaxe básica de SOCI.
Para realizar a conexão com o banco, temos um objeto de mesmo nome, mas com passagem de parâmetros ligeiramente diferente:
session sql("sqlite3:dbname=test.db;sqlite3_dbdir=./");
O uso de intratores para especificar instruções SQL ao objeto de conexão:
sql<<"DROP TABLE IF EXISTS users";
E um mecanismo de recuperação de dados parecido com o utilizado através das classes soci::statement e statement.fech() de SOCI, utilizando o objeto dbixx::result juntamente com método result.next():
soci::result res;
sql<<"SELECT id,name FROM users";
sql.fetch(res);
while(res.next(r)) { (...) }