begin process at 2012 05 30 11:05:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Base de données

 > 

SQL

 > 

QxOrm : Persistance (ORM), Serialization, Reflection


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

QxOrm : Persistance (ORM), Serialization, Reflection

mercredi 5 mai 2010 à 12:12:26 | QxOrm : Persistance (ORM), Serialization, Reflection

QxOrm

Bonjour,

QxOrm est une nouvelle librairie C++ open source de gestion de données : [ Lien ]

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 : [ Lien ].
Un tutoriel plus complet montrant des fonctionnalités plus avancées de la librairie est également disponible à cette adresse : [ Lien ].

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
* -----------------------------------------------------------------------------------------------------

Code C/C++ :
#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 C/C++ :
#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 C/C++ :
#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 :
[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 XML :
<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-->

lundi 18 octobre 2010 à 20:48:57 | Re : QxOrm : Persistance (ORM), Serialization, Reflection

QxOrm

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

----
dimanche 16 janvier 2011 à 15:16:39 | Re : QxOrm : Persistance (ORM), Serialization, Reflection

QxOrm

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

----
lundi 7 mars 2011 à 11:59:49 | Re : QxOrm : Persistance (ORM), Serialization, Reflection

QxOrm

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
vendredi 11 mars 2011 à 10:38:10 | Re : QxOrm : Persistance (ORM), Serialization, Reflection

QxOrm

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

----
dimanche 29 mai 2011 à 21:58:18 | Re : QxOrm : Persistance (ORM), Serialization, Reflection

QxOrm

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()
dimanche 26 juin 2011 à 20:16:22 | Re : QxOrm : Persistance (ORM), Serialization, Reflection

QxOrm

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
mercredi 24 août 2011 à 09:49:36 | Re : QxOrm : Persistance (ORM), Serialization, Reflection

QxOrm

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/
jeudi 29 septembre 2011 à 10:34:07 | Re : QxOrm : Persistance (ORM), Serialization, Reflection

QxOrm

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/
dimanche 29 janvier 2012 à 20:31:46 | Re : QxOrm : Persistance (ORM), Serialization, Reflection

QxOrm

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.


Cette discussion est classée dans : id, name, drug, qxorm, qx


Répondre à ce message

Sujets en rapport avec ce message

Get Process Name From ID [ par zod331 ] Bonjour, Je cherche une fonction pour obtenir le nom d'un processus (sous cette forme name.exe) à partir de son ID Merci CWnd* SendMessage [ par thejrem ] bonjour j'ai mon SendMessage(id,WM_KEYDOWN,'N',0); qui fonctionne avec un HWND id maintenant j'aimerai passer mon SendMessage en CWnd* car mon id et sensors en C++ wrapper ? [ par panthere007 ] Hello Je voudrai me bricoller un petit sof en console pour y afficher des alertes a ma sauce ,osd ,tty, son etc etc... man libsensors fourni bien de pointer sur unsigned char [ par avg ] Bonjour à tous je veut appeler une méthode qui n'est pas la mienne mais j'ai sa documentation qui contient titre de méthode et ses paramètres. Mon pro j'arrive pas à compiler ce code !! [ par achourmeddeb ] bonsoir tout le monde , j'ai un projet à rendre mais je n'arrive pas à compiler ce code et je pense que le problème réside dans l'une des trois foncti C++ Name Mangling [ par Lutinore ] Salut, pour les fonctions j'arrive à éviter la décoration C++ du nom avec [b]extern "C"[/b] mais est-ce possible de l'éviter pour les méthodes d'une c aide [ par ghostmiki ] voila je demande votre aide pour m'explique comment faire une analyse lexical de sa: [code=cpp]R = { P ®Program id S_DCL Début S_INST Fin grammaire non contextuelle [ par nissaf ] svp vs pouvez m'aider à cômprendre cette grammaire: demandé: analyse lexical/syntaxique/sémantique G=(V,T,P,R) V= {P.S DCL. DCL.S INST.INST.Expb.Expr. Problème d'affichage d'image svp besoin d'aide [ par nico2910 ] Salut à tous,j'ai un petit problème avec mon programme en C(que je compile sous Visual C++Express 2008 sans erreur),je n'arrive pas à [b]charger et sa Délais execution Requete Oracle [ par aforpien ] bonjour à tous, Je programme une petite console SQL avec QT, et lors de ma connexion à une base de données, je récupère la liste des schémas présents


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,328 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales