IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mon programme Discussion :

[C++] QxOrm - Persistance (ORM), Serialization, Reflection (Introspection)


Sujet :

Mon programme

  1. #1
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut [C++] QxOrm - Persistance (ORM), Serialization, Reflection (Introspection)
    Bonjour,

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

    A partir d'une simple fonction de paramétrage (que l'on peut comparer 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 (ou introspection) 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 et 2010, MinGW 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 plus bas.

    Un tutoriel plus complet montrant des fonctionnalités plus avancées de la librairie est également disponible à cette adresse : http://marty-lionel.developpez.com/t...toriel-qxblog/.

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

    ________________________________


    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
    * -----------------------------------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #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()
    * ----------------------------------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #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
    * -----------------------------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #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
    * -------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [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
    * ------------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <std.vector-boost.shared_ptr-drug-- class_id="0" tracking_level="0" version="0">
    	<count>3</count>
    	<item_version>1</item_version>
    	<item class_id="1" tracking_level="0" version="1">
    		<px class_id="2" tracking_level="1" version="1" object_id="_0">
    			<id>1</id>
    			<name class_id="3" tracking_level="0" version="0">name1</name>
    			<desc>desc1</desc>
    		</px>
    	</item>
    	<item>
    		<px class_id_reference="2" object_id="_1">
    			<id>2</id>
    			<name>name2 modified</name>
    			<desc>desc2 modified</desc>
    		</px>
    	</item>
    	<item>
    		<px class_id_reference="2" object_id="_2">
    			<id>3</id>
    			<name>name3</name>
    			<desc>desc3</desc>
    		</px>
    	</item>
    </std.vector-boost.shared_ptr-drug-->
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    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/ambass...0000006Kq9LEAS
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

Discussions similaires

  1. Les frameworks de persistance (ORM) sont-ils dangereux pour les performances ?
    Par SQLpro dans le forum Débats sur le développement - Le Best Of
    Réponses: 205
    Dernier message: 04/02/2017, 16h43
  2. [Data] [ORM] execute VS find/persist !
    Par n!co dans le forum Spring
    Réponses: 1
    Dernier message: 26/12/2006, 21h05
  3. [Reflection] Problème Introspection
    Par korus dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 29/09/2005, 09h59
  4. [débutant(e)][Reflection] Introspection et creation de tableau
    Par Fladnag dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 04/07/2005, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo