É aqui que a magia acontece, a classe "Database" será encarregada de:
- Abrir o banco de dados;
- Fazer consultas, inserções, alterações, etc;
- Fechar o banco de dados.
Segue o header da classe Database:
#ifndef DATABASE_H_
#define DATABASE_H_
#include <string.h>
#include <vector>
#include <sqlite3.h>
using namespace std;
#include "Cliente.h"
class Database
{
public:
Database();
virtual ~Database();
int insereCliente(Cliente *c);
vector<Cliente*> listaClientes();
private:
sqlite3 *db;
};
static int listaCliCallback(void *v, int argc, char **argv, char **colNames);
#endif /*DATABASE_H_*/
//////////////////////////////
//// Database.cpp
//// Faz o gerenciamento do banco de dados
///////////////////////////////
#include <sqlite3.h>
#include <vector>
#include "Database.h"
#include "Cliente.h"
using namespace std;
Database::Database() {
int result = sqlite3_open("/tmp/vivaolinux.db", &db);
if (result) {
printf("Não foi possível abrir o banco de dados. Erro:%s
", sqlite3_errmsg(db));
sqlite3_close(db);
}
char *erro=NULL;
sqlite3_exec(db, "CREATE TABLE CLIENTE (NOME VARCHAR(50), IDADE INT);", NULL, NULL, &erro);
if (erro!=NULL) {
// se a tabela já existe pode acontecer erro... ignorar
// printf(stderr, "Não foi possível criar");
delete erro;
}
}
Database::~Database() {
sqlite3_close(db);
}
int Database::insereCliente(Cliente *c) {
char sql[50];
sprintf(sql, "INSERT INTO CLIENTE (NOME, IDADE) VALUES ('%s', %d)", c->getNome().c_str(), c->getIdade() );
char *erro=NULL;
int result = sqlite3_exec(db, sql, NULL, NULL, &erro);
if (erro!=NULL) {
printf("Problema ao inserir o registro no banco de dados. Mensagem de erro:
%s
", erro);
}
return result;
}
vector<Cliente*> Database::listaClientes() {
vector<Cliente*> result;
char *erro=NULL;
sqlite3_exec(db, "SELECT * FROM CLIENTE", listaCliCallback, &result, &erro);
return result;
}
static int listaCliCallback(void *v, int argc, char **argv, char **colNames) {
vector<Cliente*>* result = (vector<Cliente*>*) v;
Cliente *c = new Cliente();
c->setNome(argv[0]);
c->setIdade(atoi(argv[1]));
result->push_back(c);
return 0;
}