QxOrm : Persistance (ORM), Serialization, Reflection

QxOrm Messages postés 10 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 29 janvier 2012 - 5 mai 2010 à 12:12
QxOrm Messages postés 10 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 29 janvier 2012 - 29 janv. 2012 à 20:31
Bonjour,

QxOrm est une nouvelle librairie C++ open source de gestion de données : http://www.qxorm.com

A partir d'une simple fonction de paramétrage (que l'on peut comparer 'modestement' avec un fichier de mapping xml Hibernate), vous aurez accès aux fonctionnalités suivantes :

* Persistance (ORM) : communication avec de nombreuses bases de données (avec support des relations 1-1, 1-n, n-1 et n-n)
* Serialization des données (flux binaire et xml)
* Reflection pour accéder aux classes, attributs et invoquer des méthodes

QxOrm est dépendant des excellentes librairies boost (compatible à partir de la version 1.38) et Qt (compatible à partir de la version 4.5.0).

QxOrm a pour objectif de simplifier le code C++ tout en offrant un maximum de fonctionnalités.
Voici les principaux avantages de QxOrm :

* non intrusif : la fonction de paramétrage se trouve à l'extérieur des classes. La signature des classes n'est donc pas modifiée. QxOrm peut donc être utilisé dans des projets existants
* aucune nécessité d'appartenir à une hiérarchie de classes : les classes n'ont pas besoin de dériver d'un 'super objet'
* pas de génération automatique de code
* pas de mapping xml
* 1 seul fichier <QxOrm.h> à inclure dans l'en-tête précompilé (precompiled-header nécessaire pour optimiser les temps de compilation)
* aucune nécessité d'utiliser le pré-compilateur 'moc' fourni par Qt
* vérification des types à la compilation (utilisation intensive de méta-programmation)
* compatible avec Visual C++ 2008 ou 2010 sous Windows et GCC 4.4.1 sous Linux (d'autres environnements et plateformes seront testés prochainement : Mac, mobiles, etc...)

Un exemple rapide d'utilisation de QxOrm montrant les fonctionnalités de base de la librairie est disponible : http://www.qxorm.com/qxorm_fr/quick_sample.html.
Un tutoriel plus complet montrant des fonctionnalités plus avancées de la librairie est également disponible à cette adresse : http://www.qxorm.com/qxorm_fr/tutorial.html.

Merci d'avance pour vos impressions, critiques, bugs détectés, évolutions souhaitées, etc...

QxOrm

_____________________________________________


Voici un exemple rapide d'utilisation de la librairie QxOrm :

* 1- fichier drug.h : définition d'une classe drug avec 3 attributs : id, name et description
* 2- fichier drug.cpp : implémentation de la 'fonction de paramétrage' : void qx::register_class()
* 3- fichier main.cpp : présentation des fonctionnalités de base de QxOrm avec la classe drug
* 4- exécution du programme de test et affichage des traces générées
* 5- contenu du fichier ./export_drugs.xml créé par le programme de test


* -----------------------------------------------------------------------------------------------------
* 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 <QxMemLeak.h>     // Automatic memory leak detection

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 <QxMemLeak.h>

int main(int argc, char * argv[])
{
   QApplication app(argc, argv); // Qt application

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

<std.vector-boost.shared_ptr-drug-- class_id="0" tracking_level="0" version="0">
<count>3</count>
 1 


1
<name class_id ="3" tracking_level="0" version="0">name1</name>
<desc>desc1</desc>





2
<name>name2 modified</name>
<desc>desc2 modified</desc>





3
<name>name3</name>
<desc>desc3</desc>



</std.vector-boost.shared_ptr-drug-->

9 réponses

QxOrm Messages postés 10 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 29 janvier 2012
18 oct. 2010 à 20:48
Bonjour,

QxOrm 1.1.2 vient de sortir.

----

Changes in version 1.1.2:
- License LGPL
- Fix compilation problems on Linux and boost > 1.38
- Fix sql query with MySql database
- Disable assert when qx::dao functions return an error

----
0
QxOrm Messages postés 10 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 29 janvier 2012
16 janv. 2011 à 15:16
Bonjour,

QxOrm 1.1.4 vient de sortir :

----

Changes in version 1.1.4:
- New parameter in functions 'qx::dao::fetch_by_id', 'qx::dao::fetch_all', 'qx::dao::fetch_by_query' and 'qx::dao::update' to define a list of properties to fetch/update (by default, all properties are fetched/updated)
- Support multi-columns primary key (composite key) : see sample './test/qxBlog_composite_key/'
- Improve strategy of inheritance : QxOrm supports 'Concrete Table Inheritance' strategy ('Concrete Table Inheritance' becomes default strategy)
- New smart-pointer 'qx::dao::ptr<T>' based on Qt 'QSharedPointer<T>' to provide 2 new features : 'is dirty' and 'update optimized'
- 'qx::dao::ptr<T>' can be used with a simple object and with many containers (stl, boost, Qt and 'qx::QxCollection' containers)
- 'qx::dao::ptr<T>' keeps original values from database and provides a 'isDirty()' method to retrieve all properties changed
- 'qx::dao::update_optimized' must be used with 'qx::dao::ptr<T>' to save into database only properties changed

----
0
QxOrm Messages postés 10 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 29 janvier 2012
7 mars 2011 à 11:59
Je suis fier et très heureux de vous annoncer que la librairie QxOrm a été retenue pour faire partie du Qt Ambassador Program
http://qt.nokia.com/qt-in-use/ambassadors/qtambassador/

The Qt Ambassador Program is a membership-only program that honors Qt development projects. All developers around the world who create products and projects with Qt are eligible to apply. Membership to the Qt Ambassador Program is free and based on your outstanding and innovative Qt project.

Voici le lien vers la page QxOrm sur le site officiel de Qt Nokia :
http://qt.nokia.com/qt-in-use/ambassadors/project?id=a0F20000006Kq9LEAS
0
QxOrm Messages postés 10 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 29 janvier 2012
11 mars 2011 à 10:38
Bonjour,

QxOrm 1.1.5 vient de sortir :

----

Changes in version 1.1.5:
- New feature available : 'QxService' module to create C++ application server
- 'QxService' provides an easy and powerful way to create services and to transfer data over network
- New tutorial available to explain how 'QxService' module works
- New sample available at './test/qxClientServer' directory
- QxOrm can be built with 'CONFIG += no_keywords' flag in '*.pro' files
- Bug fix with 'qx::dao::create_table<>' function and relation 'many-to-many'
- QxOrm should now build fine with GCC <= 4.2

----
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
QxOrm Messages postés 10 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 29 janvier 2012
29 mai 2011 à 21:58
Bonjour,

QxOrm 1.1.6 vient de sortir.
Au programme de cette nouvelle version :

- Nouvelle documentation du code source de la bibliothèque QxOrm : http://www.qxorm.com/doxygen/index.html
- Possibilité de supprimer la dépendance au module QtGui du framework Qt : voir l'option de compilation '_QX_ENABLE_QT_GUI_DEPENDENCY' du fichier 'QxConfig.h'
- Possibilité de supprimer la dépendance au module QtNetwork du framework Qt (désactive également le module QxService de QxOrm) : voir l'option de compilation '_QX_ENABLE_QT_NETWORK_DEPENDENCY' du fichier 'QxConfig.h'
- Possibilité de déclarer une classe abstraite dans le contexte QxOrm en utilisant la macro : QX_REGISTER_ABSTRACT_CLASS()
0
QxOrm Messages postés 10 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 29 janvier 2012
26 juin 2011 à 20:16
Bonjour,

QxOrm 1.1.7 vient de sortir.

Nouveautés de la version 1.1.7 :
- Suppression logique (soft delete) : pour plus de détails sur cette nouvelle fonctionnalité, rendez-vous sur la FAQ de QxOrm (Comment utiliser le mécanisme de suppression logique ?)
- Ajout de fonctions dans le namespace 'qx::dao' pour mettre à jour un élément en prenant en compte une requête SQL : update_by_query, update_optimized_by_query, etc.
- Correction d'un bogue avec le type QVariant (utilisé en tant que propriété d'une classe persistante) : il est à présent possible d'insérer la valeur NULL dans la base de données
0
QxOrm Messages postés 10 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 29 janvier 2012
24 août 2011 à 09:49
Bonjour,

QxOrm 1.1.8 vient de sortir.
Voici les nouveautés de la version 1.1.8 :

- la bibliothèque QxOrm est maintenant compatible Mac (merci à Dominique Billet) : les scripts 'osx_build_all_debug.sh' et 'osx_build_all_release.sh' permettent de compiler QxOrm et tous les exemples du dossier './test/' ;
- nouvelle classe 'qx::QxSession' : permet de gérer automatiquement les transactions des bases de données (en utilisant le mécanisme RAII du C++), voir la FAQ pour plus de détails ;
- nouvelles classes 'qx::QxDateNeutral', 'qx::QxTimeNeutral' et 'qx::QxDateTimeNeutral' : enregistrement des dates et heures au format neutral (assure une compatibilité et facilite les migrations avec toutes les bases de données).

Pour plus d'informations sur la bibliothèque QxOrm : http://www.qxorm.com/
0
QxOrm Messages postés 10 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 29 janvier 2012
29 sept. 2011 à 10:34
Bonjour,

QxOrm 1.1.9 vient de sortir.
Voici les nouveautés de la version 1.1.9 :

* nouvelle méthode d'enregistrement des propriétés dans le contexte QxOrm pour les méta-propriétés de Qt (déclarées avec la macro Q_PROPERTY), l'écriture de la fonction de mapping void qx::register_class<T>() devient non nécessaire avec cette nouvelle méthode ;
* forte intégration avec le moteur d'introspection/moc de Qt : pour plus de détails sur cette nouvelle fonctionnalité : http://www.qxorm.com/qxorm_fr/faq.html#faq_200 ;
* amélioration du moteur d'introspection (ou réflexion) de la bibliothèque QxOrm : http://www.qxorm.com/qxorm_fr/faq.html#faq_190 ;
* possibilité d'étendre le moteur d'introspection en ajoutant des méta-données (avec la notion de property bag) : voir les classes qx::IxClass, qx::IxDataMember et qx::IxFunction pour plus de détails ;
* ajout de la fonction qx::QxClassX::dumpSqlSchema() pour servir de base pour l'écriture de scripts pour la génération des schémas SQL spécifiques à chaque base de données ;
* nouvelle classe qx::QxSimpleCrypt (merci beaucoup à Andre Somers) pour crypter/décrypter des données issues de la base de données sans utiliser de bibliothèque tierce ;
* module QxService : nouvelle fonctionnalité pour crypter les données transférées sur le réseau.


Pour plus d'informations, rendez-vous sur le site de la bibliothèque QxOrm : http://www.qxorm.com/
0
QxOrm Messages postés 10 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 29 janvier 2012
29 janv. 2012 à 20:31
Bonjour,

QxOrm 1.2.2 vient de sortir.
Voici les nouveautés de la version 1.2.2 :

* Nouveau module de validation automatique des données : module QxValidator ;
* Pour plus de détails sur le module QxValidator, rendez-vous sur la FAQ de QxOrm : 'Comment utiliser le module QxValidator pour valider automatiquement les données ?' ;
* Corrige la récupération des ID générés après une insertion avec la base de données PostgreSQL en utilisant le mot-clé 'RETURNING' (récupère l'ID à la place de l'OID) ;
* Améliore la génération des scripts SQL en proposant les types supportés par les bases de données ;
* Possibilité d'utiliser les mots-clés des bases de données en ajoutant les caractères '[', ']' ou '"'.

Pour plus d'informations, rendez-vous sur le site de la bibliothèque QxOrm.
0
Rejoignez-nous