Dans ce chapitre, nous allons traiter un exemple
rapide d'utilisation qui pr�sente les fonctionnalit�s de base de la
biblioth�que QxOrm.
Remarque : la biblioth�que QxOrm utilise les conventions d'�criture de code C++
suivantes :
- toutes les classes, fonctions, variables, etc... sont d�finies sous le namespace qx
- les macro de QxOrm sont �crites sous la forme QX_...
- les classes abstraites (ou interfaces) sont pr�fix�es par Ix (par exemple
IxFactory est une interface pour la cr�ation d'instances)
- les autres classes sont pr�fix�es par Qx (par exemple QxDataMember)
- les collections d'objets ont pour suffixe X (par exemple QxDataMemberX est une
collection de QxDataMember)
- les fonctions pour communiquer avec les bases de donn�es se trouvent sous le namespace qx::dao (par exemple
qx::dao::fetch_by_id())
- les fonctions pour la serialization des donn�es se trouvent sous le namespace qx::serialization
(par exemple qx::serialization::xml::to_file())
- le moteur de reflection est accessible depuis la classe qx::QxClassX (par
exemple qx::QxClassX::invoke() pour invoquer une m�thode de classe)
- les classes de traits se trouvent sous le namespace qx::trait (par exemple
qx::trait::is_smart_ptr<T>)
|

QxOrm library has been accepted into the Qt Ambassador
Program
|
Autre Remarque : un exemple plus complet (avec notion d'h�ritage, de
relations entre tables, de collections, de libraries partag�es, de
memory leak, etc...) est pr�sent dans le dossier ./test/qxDllSample/ de la
distribution de QxOrm. Ce dossier ./test/qxDllSample/ contient 2 projets de
type dll et 1 projet de type ex�cutable : ./dll1/,
./dll2/ et ./exe/. La solution compl�te peut �tre
compil�e avec Visual C++ 2008, 2010 ou 2012 sous Windows (ouvrir le fichier
./test/qxDllSample/test.sln).
Elle peut �tre �galement compil�e avec GCC sous Linux et MinGW sous Windows en utilisant la
commande qmake.
L'exemple qui suit pr�sente diff�rentes �tapes :
*
-----------------------------------------------------------------------------------------------------
* 1- fichier drug.h : d�finition d'une classe drug avec 3
attributs : id, name et description
*
-----------------------------------------------------------------------------------------------------
#ifndef _CLASS_DRUG_H_
#define _CLASS_DRUG_H_
class drug
{
public:
long id;
QString name;
QString description;
drug() : id(0) { ; }
virtual ~drug() { ; }
};
QX_REGISTER_HPP_MY_TEST_EXE(drug, qx::trait::no_base_class_defined, 1)
#endif
|
*
----------------------------------------------------------------------------------------------------
* 2- fichier drug.cpp : impl�mentation de la 'fonction de
param�trage' : void qx::register_class()
*
----------------------------------------------------------------------------------------------------
#include "precompiled.h"
#include "drug.h"
#include <QxOrm_Impl.h>
QX_REGISTER_CPP_MY_TEST_EXE(drug)
namespace qx {
template <> void register_class(QxClass<drug> & t)
{
t.id(& drug::id, "id"); t.data(& drug::name, "name", 1); t.data(& drug::description, "desc");}}
|
*
-----------------------------------------------------------------------------------------------
* 3- fichier main.cpp : pr�sentation des fonctionnalit�s de base
de QxOrm avec la classe drug
*
-----------------------------------------------------------------------------------------------
#include "precompiled.h"
#include "drug.h"
#include <QxOrm_Impl.h>
int main(int argc, char * argv[])
{
QApplication app(argc, argv); typedef std::shared_ptr<drug> drug_ptr;
drug_ptr d1; d1.reset(new drug()); d1->name = "name1"; d1->description = "desc1";
drug_ptr d2; d2.reset(new drug()); d2->name = "name2"; d2->description = "desc2";
drug_ptr d3; d3.reset(new drug()); d3->name = "name3"; d3->description = "desc3"; typedef std::vector<drug_ptr> type_lst_drug;
type_lst_drug lst_drug;
lst_drug.push_back(d1);
lst_drug.push_back(d2);
lst_drug.push_back(d3); qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
qx::QxSqlDatabase::getSingleton()->setDatabaseName("./test_qxorm.db");
qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
qx::QxSqlDatabase::getSingleton()->setUserName("root");
qx::QxSqlDatabase::getSingleton()->setPassword(""); QSqlError daoError = qx::dao::create_table<drug>(); daoError = qx::dao::insert(lst_drug); d2->name = "name2 modified";
d2->description = "desc2 modified";
daoError = qx::dao::update(d2); daoError = qx::dao::delete_by_id(d1); long lDrugCount = qx::dao::count<drug>(); drug_ptr d_tmp; d_tmp.reset(new drug());
d_tmp->id = 3;
daoError = qx::dao::fetch_by_id(d_tmp); qx::serialization::xml::to_file(lst_drug, "./export_drugs.xml"); type_lst_drug lst_drug_tmp;
qx::serialization::xml::from_file(lst_drug_tmp, "./export_drugs.xml"); drug_ptr d_clone = qx::clone(* d1); qx::any d_any = qx::create("drug"); qx::cache::set("drugs", lst_drug); qx::cache::clear(); drug * pDummy = new drug();
return 0;
}
|
*
-------------------------------------------------------------------------
* 4- ex�cution du programme de test et affichage des traces g�n�r�es
*
-------------------------------------------------------------------------
[QxOrm] qx::QxSqlDatabase : create new database
connection in thread '3616' with key
'{d315250c-b5c9-46e0-9402-f800368a6673}'
[QxOrm] sql query (78 ms) : CREATE TABLE drug (id INTEGER NOT NULL
PRIMARY KEY AUTOINCREMENT, name TEXT, desc TEXT)
[QxOrm] sql query (63 ms) : INSERT INTO drug (name, desc) VALUES
(:name, :desc)
[QxOrm] sql query (62 ms) : UPDATE drug SET id = :id, name = :name,
desc = :desc WHERE id = :id_bis
[QxOrm] sql query (63 ms) : DELETE FROM drug WHERE id = :id
[QxOrm] sql query (0 ms) : SELECT COUNT(*) FROM drug
[QxOrm] sql query (0 ms) : SELECT drug.id AS drug_id_0, drug.name AS
drug_name_0, drug.desc AS drug_desc_0 FROM drug WHERE drug_id_0 =
:id
[QxOrm] Leaked object at 0xf52ad8 (size 16, src\main.cpp:74)
[QxOrm] **** 1 memory leaks found ****
*
------------------------------------------------------------------------------
* 5- contenu du fichier ./export_drugs.xml cr�� par le programme
de test
*
------------------------------------------------------------------------------
|