QxOrm Windows Linux Macintosh C++

Accueil Téléchargement Exemple rapide Tutoriel (4)
Manuel (2)
Forum Nos clients

QxOrm >> Exemple rapide
Version courante :  QxOrm 1.4.5 - documentation en ligne de la bibliothèque QxOrm - GitHub
QxEntityEditor 1.2.3
Version française du site Web site english version
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>)
qt_ambassador
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)

/* This macro is necessary to register 'drug' class in QxOrm context */
/* param 1 : the current class to register => 'drug' */
/* param 2 : the base class, if no base class, use the qx trait => 'qx::trait::no_base_class_defined' */
/* param 3 : the class version used by serialization to provide 'ascendant compatibility' */

#endif // _CLASS_DRUG_H_


* ----------------------------------------------------------------------------------------------------
* 2- fichier drug.cpp : implémentation de la 'fonction de paramétrage' : void qx::register_class()
* ----------------------------------------------------------------------------------------------------


#include "precompiled.h"   // Precompiled-header with '#include <QxOrm.h>' and '#include "export.h"'
#include "drug.h"          // Class definition 'drug'
#include <QxOrm_Impl.h>     // Automatic memory leak detection and boost serialization export macro

QX_REGISTER_CPP_MY_TEST_EXE(drug)   // This macro is necessary to register 'drug' class in QxOrm context

namespace qx {
template <> void register_class(QxClass<drug> & t)
{
  t.id(& drug::id, "id");               // Register 'drug::id' <=> primary key in your database
  t.data(& drug::name, "name", 1);      // Register 'drug::name' property with key 'name' and version '1'
  t.data(& drug::description, "desc");  // Register 'drug::description' property with key '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); // Qt application

   // Create 3 new drugs
   // It is possible to use 'std' and 'Qt' smart pointer : 'std::shared_ptr', 'QSharedPointer', etc...
   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";

   // Insert drugs into container
   // It is possible to use a lot of containers from 'std', 'boost', 'Qt' and 'qx::QxCollection<Key, Value>'
   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);

   // Init parameters to communicate with a database
   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("");

   // Create table 'drug' into database to store drugs
   QSqlError daoError = qx::dao::create_table<drug>();

   // Insert drugs from container to database
   // 'id' property of 'd1', 'd2' and 'd3' are auto-updated
   daoError = qx::dao::insert(lst_drug);

   // Modify and update the second drug into database
   d2->name = "name2 modified";
   d2->description = "desc2 modified";
   daoError = qx::dao::update(d2);

   // Delete the first drug from database
   daoError = qx::dao::delete_by_id(d1);

   // Count drugs into database
   long lDrugCount = qx::dao::count<drug>();

   // Fetch drug with id '3' into a new variable
   drug_ptr d_tmp; d_tmp.reset(new drug());
   d_tmp->id = 3;
   daoError = qx::dao::fetch_by_id(d_tmp);

   // Export drugs from container to a file under xml format (serialization)
   qx::serialization::xml::to_file(lst_drug, "./export_drugs.xml");

   // Import drugs from xml file into a new container
   type_lst_drug lst_drug_tmp;
   qx::serialization::xml::from_file(lst_drug_tmp, "./export_drugs.xml");

   // Clone a drug
   drug_ptr d_clone = qx::clone(* d1);

   // Create a new drug by class name (factory)
   qx::any d_any = qx::create("drug");

   // Insert drugs container into 'qx::cache'
   qx::cache::set("drugs", lst_drug);

   // Remove all elements from 'qx::cache'
   qx::cache::clear();

   // Create a dummy memory leak
   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
* ------------------------------------------------------------------------------


quick_sample.export_drugs.xml


QxOrm © 2018 Lionel Marty - contact@qxorm.com