QxOrm Windows Linux Macintosh C++

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

QxOrm >> Manuel d'utilisation de l'application QxEntityEditor
Version courante :  QxOrm 1.5.0 - documentation en ligne de la biblioth�que QxOrm - GitHub
QxEntityEditor 1.2.8
Version fran�aise du site Web site english version
S�lection du manuel : Manuel QxOrm Manuel QxEntityEditor


Manuel d'utilisation de l'application QxEntityEditor - Table des mati�res

  1. Introduction
    1. QxEntityEditor : �diteur graphique pour la biblioth�que QxOrm
    2. T�l�chargement et installation
    3. Vid�os de pr�sentation de l'application QxEntityEditor
  2. Pr�sentation g�n�rale
    1. Vues de l'�cran principal de QxEntityEditor
      1. Zoomer/d�zoomer le diagramme d'entit�s
      2. Affichage en mode "splitter"
    2. Param�trage de l'application QxEntityEditor
    3. Enregistrer un code licence
    4. Cr�er/ouvrir un projet *.qxee
      1. Architecture d'un fichier projet *.qxee (base de donn�es SQLite)
    5. Param�trage d'un projet *.qxee
    6. Gestion des entit�s
      1. Cr�er une entit�
      2. Modifier une entit�
      3. Supprimer une entit�
      4. Cloner une entit�
      5. Param�tres d'une entit�
      6. Couleur associ�e � une entit�
    7. Gestion des propri�t�s associ�es � une entit�
      1. Ajouter/modifier/supprimer une propri�t�
      2. Param�trage d�taill� d'une propri�t�
    8. Gestion des relations entre entit�s
      1. Ajouter/modifier/supprimer une relation
      2. Param�trage d�taill� d'une relation
    9. Gestion des �num�rations
      1. Ajouter/modifier/supprimer/cloner une �num�ration
      2. Param�tres d'une �num�ration
      3. Couleur associ�e � une �num�ration
    10. Gestion des espaces de nom (namespace)
      1. Renommer un espace de nom
      2. Gestion des couleurs d'un espace de nom
    11. Gestion des notes (ou post-it)
      1. Ajouter/modifier/supprimer/cloner une note
      2. Couleur associ�e � une note
    12. Organisation automatique du diagramme d'entit�s
    13. Historique d'un projet *.qxee
    14. Aper�u du code C++ d'une entit�/�num�ration
    15. Convention de nommage (snake_case, camelCase)
    16. Liste des plugins disponibles
  3. Plugins d'import
    1. Importer un projet � partir d'un r�pertoire associ� � un gestionnaire de code source (Git, Perforce, CVS, etc.)
    2. Importer un projet � partir d'un fichier texte au format JSON
    3. Importer � partir d'une base de donn�es MySQL ou MariaDB
    4. Importer � partir d'une base de donn�es PostgreSQL
    5. Importer � partir d'une base de donn�es SQLite
    6. Importer � partir d'une base de donn�es en utilisant un driver ODBC (Oracle, MS SQL Server, etc.)
  4. Plugins d'export
    1. Exporter en projet C++
      1. Param�tres de l'export C++
      2. Pr�sentation du projet C++ g�n�r�
      3. Compilation du projet C++ g�n�r� (par qmake ou cmake)
      4. Exemple d'utilisation
    2. Exporter en projet C++ de type model/view
      1. Param�tres de l'export
      2. Pr�sentation du projet g�n�r�
    3. Exporter en projet C++ de type services
      1. Param�tres de l'export
      2. Pr�sentation du projet g�n�r�
      3. Serveur d'applications g�n�rique
    4. Exporter le sch�ma de base de donn�es SQL DDL
    5. Imprimer le diagramme d'entit�s
    6. Exporter le projet dans un r�pertoire associ� � un gestionnaire de code source (Git, Perforce, CVS, etc.)
    7. Exporter le projet sous format XML ou JSON
  5. Moteur Javascript pour personnaliser les exports
    1. Architecture et fonctionnement du moteur de personnalisation Javascript
      1. Liste des param�tres d'appel du moteur Javascript
    2. Fonctions disponibles par Javascript
      1. Obtenir les informations associ�es � une entit�
      2. Parcourir la liste des propri�t�s d'une entit�
      3. Obtenir les informations associ�es � une propri�t�
      4. Obtenir les informations associ�es � une �num�ration
      5. Acc�s aux m�ta-donn�es d'une entit�/propri�t�/�num�ration
      6. Acc�der aux variables d'environnement
      7. Gestion des fichiers : lecture et �criture
      8. Obtenir la liste des toutes les entit�s/�num�rations d'un projet
      9. R�cup�rer le param�trage de l'application (niveau global, projet et plugin)
    3. Ajout d'une action (placeholder) personnalis�e dans le template d'export C++
    4. Exemple de script : ajout automatique de la d�finition Q_PROPERTY sur les propri�t�s C++ g�n�r�es
    5. Activation du d�bogueur Javascript int�gr�
  6. Ex�cution de scripts personnalis�s avant/apr�s ex�cution d'un plugin
  7. Ex�cuter QxEntityEditor en ligne de commande
qt_ambassador
QxOrm library has been accepted into the Qt Ambassador Program


Introduction

L'objectif de ce manuel utilisateur est de pr�senter de mani�re structur�e l'ensemble des fonctionnalit�s propos�es par l'application QxEntityEditor (�diteur graphique de la biblioth�que QxOrm). Ce manuel est destin� aux d�veloppeurs et architectes logiciel qui souhaitent g�rer une couche de donn�es persistante en C++/Qt. Des comp�tences techniques en C++ et base de donn�es sont requises pour la bonne compr�hension de ce document.

Remarque : un manuel utilisateur d�di� � la biblioth�que QxOrm est �galement disponible.

QxEntityEditor : �diteur graphique pour la biblioth�que QxOrm

QxEntityEditor est un �diteur graphique pour la biblioth�que QxOrm : QxEntityEditor permet de g�rer graphiquement le mod�le d'entit�s.
QxEntityEditor est multi-plateforme (disponible pour Windows, Linux et Mac OS X) et g�n�re du code natif pour tous les environnements : bureau (Windows, Linux, Mac OS X), embarqu� et mobile (Android, iOS, Windows Phone, Raspberry Pi, etc.).

QxEntityEditor est bas� sur un syst�me de plugins et propose diverses fonctionnalit�s pour importer/exporter le mod�le de donn�es :
QxEntityEditor on Windows QxEntityEditor on Linux QxEntityEditor on Mac OS X
QxEntityEditor on Windows QxEntityEditor on Linux QxEntityEditor on Mac OS X


QxEntityEditor est d�velopp� XDL Teamarty, Ing�nieur en d�veloppement logiciel depuis 2003.


T�l�chargement et installation

L'application QxEntityEditor peut �tre t�l�charg�e sur la page de t�l�chargement du site QxOrm. Plusieurs versions sont disponibles :
  • Windows (de Windows XP � Windows 10) en mode 32bits et 64bits ;
  • Linux (les distributions les plus populaires sont support�es, Ubuntu, Fedora, etc...) en mode 32bits et 64bits ;
  • Mac OS X (64bits uniquement).
Pour Windows, QxEntityEditor est disponible avec un setup d'installation ou bien un fichier ZIP portable.
Pour Linux et Mac OS X, QxEntityEditor est disponible uniquement en fichier ZIP portable.
Aucune d�pendance suppl�mentaire n'est requise, l'installation est tr�s simple : il suffit de d�zipper le fichier t�l�charg� et de lancer l'ex�cutable QxEntityEditor.

Vid�os de pr�sentation de l'application QxEntityEditor

Voici une vid�o de pr�sentation de l'application QxEntityEditor :



Cette vid�o pr�sente les �tapes suivantes :
  • T�l�charger et installer la biblioth�que QxOrm (10s) ;
  • T�l�charger et installer l'application QxEntityEditor (56s) ;
  • Cr�er un projet QxEntityEditor (1m 46s) ;
  • Exporter les entit�s vers un projet C++/Qt (8m 26s) ;
  • Exporter les entit�s vers un script DDL SQL de base de donn�es (10m 22s) ;
  • Cr�er une application client/serveur pour transf�rer son mod�le de donn�es sur le r�seau (12m 31s) ;
  • Exporter un projet QxEntityEditor vers un fichier XML ou JSON (17m 13s) ;
  • Ex�cuter QxEntityEditor en ligne de commande (sans IHM) (18m 07s).



Voici une autre vid�o de l'application QxEntityEditor pour montrer comment importer une structure de base de donn�es existante (projet MySQL Workbench) :



Cette vid�o pr�sente les �tapes suivantes :
  • Projet MySQL Workbench - exemple de base de donn�es Sakila (10s) ;
  • Cr�ation d'un DSN pour se connecter � MySQL par ODBC (46s) ;
  • Import de la structure de base de donn�es dans un projet QxEntityEditor (1m 15s) ;
  • Export du projet QxEntityEditor vers un projet C++ Qt (3m 10s) ;
  • Compilation des classes g�n�r�es du projet C++ Qt (4m 22s).

Pr�sentation g�n�rale

QxEntityEditor est un �diteur graphique permettant de g�rer : entit�s, propri�t�s, relations entre entit�s, �num�rations, espaces de nom (namespace). Pour faire le lien entre la base de donn�es et le code C++ :
  • une entit� correspond � une table c�t� base de donn�es, et � une classe c�t� code C++ ;
  • une propri�t� correspond � une colonne d'une table c�t� base de donn�es, et � une donn�e membre d'une classe c�t� code C++ ;
  • une relation (1-n, n-1, 1-1 ou n-n) correspond � une liaison entre 2 tables de la base de donn�es (cl� �trang�re), et � une liaison entre 2 classes C++ ;
  • une �num�ration correspond � une liste de valeurs disponibles c�t� code C++ (pour le moment pas de notion c�t� base de donn�es : converti en valeur num�rique) ;
  • un espace de nom (namespace) correspond � un sch�ma de base de donn�es, et un namespace o� se trouve une classe c�t� code C++.

Vues de l'�cran principal de QxEntityEditor

Voici une copie �cran pr�sentant les diff�rentes zones d'affichage de l'application QxEntityEditor :

All views

  • Zone 1 : menu principal et barre d'outils de l'application QxEntityEditor ==> toutes les actions sont accessibles par ces boutons ;
  • Zone 2 : liste d�roulante permettant d'acc�der rapidement aux projets charg�s r�cemment ;
  • Zone 3 : liste sous forme d'arbre (tree view) pr�sentant les �l�ments du projet charg�s (entit�s, propri�t�s, relations, �num�rations, espaces de nom) ;
  • Zone 4 : vue "Navigator" permettant de se d�placer rapidement dans le diagramme d'entit�s (particuli�rement utile pour des projets volumineux) ;
  • Zone 5 : diagramme d'entit�s affichant tous les �l�ments du projet dans un vue graphique ;
  • Zone 6 : �cran de param�trage (sous forme d'onglets) des entit�s, propri�t�s, relations, �num�rations + pr�visualisation du code C++ ;
  • Zone 7 : zoom sur le diagramme d'entit�s.

Zoomer/d�zoomer le diagramme d'entit�s

Il est possible de zoomer/d�zoomer le diagramme d'entit�s :
  • par le menu principal : View >> Zoom view to XX% ;
  • par la petite fen�tre (slider) tout en bas � droite de l'�cran ;
  • par menu contextuel suite � un clic-droit sur le diagramme d'entit�s, sous menu : View >> Zoom view to XX% ;
  • en maintenant clic-gauche + molette de la souris sur le diagramme d'entit�s.

Zoom

Affichage en mode "splitter"

Le menu View >> Show/hide splitter mode permet de basculer l'affichage des onglets des param�tres des entit�s, propri�t�s, relations, �num�rations + pr�visualisation du code C++ :
  • sur la partie droite de l'�cran permettant d'avoir un acc�s rapide � la fois sur le diagramme d'entit�s et le d�tails des param�tres de l'�l�ment s�lectionn� ;
  • masqu� sous forme d'oglets permettant d'afficher le diagramme d'entit�s en mode plein �cran (valeur par d�faut).

Splitter mode

Param�trage de l'application QxEntityEditor

L'acc�s au param�trage global (pour tous les projets) de l'application QxEntityEditor se fait par le menu principal Tools >> Global settings :

Global settings
  • Champ � QxOrm library path � : chemin d'acc�s au r�pertoire de la biblioth�que QxOrm. Ce param�tre est requis pour d�marrer un export C++ afin de trouver le fichier de configuration QxOrm.pri (ou QxOrm.cmake). Il est possible de renseigner un chemin absolu, ou bien d'indiquer une variable d'environnement, par exemple : $$(QXORM_DIR) ;
  • Champ � Auto load last opened project at startup � : d�marre QxEntityEditor en chargeant automatiquement le dernier projet ouvert ;
  • Champ � Display property type in entities viewer � : affiche sur le diagramme d'entit�s le type des propri�t�s ;
  • Champ � Use old style to draw relationships � : simplifie l'affichage des relations (1-n, n-1, 1-1 ou n-n) ;
  • Champ � Disable undo/redo feature � : d�sactive la fonctionnalit� undo/redo, peut �tre utile pour optimiser les performances sur des projets volumineux ;
  • Champs � Entity/Enum/Comment width � : permet de r�gler la largeur par d�faut des �l�ments graphiques.

Enregistrer un code licence

Sans cl� de licence valide, un projet QxEntityEditor est limit� � 5 entit�s par projet. Afin de supprimer cette limitation, l'acc�s � l'enregistrement d'un code licence se fait par le menu principal Help >> License information :

License

Il suffit d'entrer la cl� de license fournie dans le champ License key, puis d'appuyer sur le bouton Save. Un acc�s � internet est requis pour l'enregistrement d'une cl� de licence. Si aucune erreur n'apparait, la cl� de licence est enregistr�e et l'application QxEntityEditor peut alors �tre utilis�e sans aucune limitation jusqu'� la date indiqu�e dans le champ Expiration date.

Remarque : si une erreur de connexion internet apparait au moment de l'enregistrement, vous pouvez essayer de cocher la case If you are behind a proxy....

Autre remarque : pour acqu�rir une cl� de licence valide, vous pouvez nous contacter � l'adresse suivante : ic-east.com

Cr�er/ouvrir un projet *.qxee

La cr�ation d'un nouveau projet QxEntityEditor se fait par le menu principal File >> New project :

Project new
  • Champ � Project name � : nom du projet QxEntityEditor. Le fichier du nouveau projet portera le m�me nom avec l'extension *.qxee ;
  • Champ � Project location � : chemin d'acc�s au fichier associ� au projet QxEntityEditor. Il est possible d'utiliser le bouton "..." afin de s�lectionner le r�pertoire de destination.

L'ouverture d'un projet QxEntityEditor se fait par le menu principal File >> Open project : il suffit de s�lectionner un fichier projet avec l'extension *.qxee. Sous la barre d'outils du menu principal, une liste des projets r�cents est disponible et permet de basculer rapidement d'un projet � un autre :

Project list

Architecture d'un fichier projet *.qxee (base de donn�es SQLite)

Un fichier projet *.qxee de l'application QxEntityEditor est une base de donn�es SQLite.
Un m�me projet peut �tre partag� sur tous les environnements support�s par QxEntityEditor : Windows, Linux et Mac OS X.
Un fichier projet *.qxee peut �tre ouvert par un outil de gestion de base de donn�es SQLite : par exemple, le plugin gratuit de Firefox SQLite Manager :

Project database

Remarque : en utilisant la fonctionnalit� Ex�cution de scripts personnalis�s avant/apr�s ex�cution d'un plugin, il est possible par exemple d'appliquer un script (.bat ou .sh) modifiant certaines donn�es du projet SQLite *.qxee apr�s un import de base de donn�es par exemple.

Param�trage d'un projet *.qxee

Le param�trage d'un projet QxEntityEditor *.qxee se fait par le menu principal Tools >> Project settings :

Project settings tab 1

  • Champ � Default entity namespace � : espace de nom par d�faut des entit�s � leur cr�ation (il est possible de d�finir un autre espace de nom dans l'�cran de param�trage d'une entit�) ;
  • Champ � Table name prefix � : pr�fixe � appliquer sur la table associ�e � une entit� ;
  • Champ � Table name suffix � : suffixe � appliquer sur la table associ�e � une entit� ;
  • Champ � Primary key prefix � : pr�fixe par d�faut de la cl� primaire d'une entit� ;
  • Champ � Primary key suffix � : suffixe par d�faut de la cl� primaire d'une entit� ;
  • Champ � Default primary key type � : type C++ par d�faut pour les cl�s primaires ;
  • Champ � Default property type � : type C++ par d�faut pour les propri�t�s des entit�s.

Le 2�me onglet de l'�cran de param�trage d'un projet permet de g�rer les couleurs des diff�rents �l�ments du diagramme d'entit�s au niveau projet :

Project settings tab 2

Remarque : les couleurs des �l�ments du diagramme d'entit�s peuvent �tre g�r�es � plusieurs niveaux (du niveau le plus global au plus sp�cifique) :

Gestion des entit�s

Une entit� dans l'application QxEntityEditor correspond � une table de la base de donn�es, et correspond �galement � une classe (persistante et enregistr�e dans le contexte QxOrm) dans le code C++. L'application QxEntityEditor permet de cr�er, modifier, supprimer et cloner une entit�.

Cr�er une entit�

La cr�ation d'une nouvelle entit� se fait par :
  • Le menu principal : Actions >> New entity ;
  • Un menu contextuel sur clic-droit dans le diagramme d'entit�s : Entity >> New entity ;
  • Le bouton Create a new entity sur l'�cran de param�trage d'une entit� lorsque aucune entit� n'est s�lectionn�e.

Entity new

Remarque : ces actions ouvrent l'�cran de param�trage d'une entit� en mode cr�ation. L'entit� sera r�ellement cr��e et ajout�e au projet *.qxee au moment de l'enregistrement de l'�cran de param�trage.

Modifier une entit�

La modification d'une entit� se fait par :
  • Le menu principal : Actions >> Modify entity ;
  • Un menu contextuel sur clic-droit dans le diagramme d'entit�s : Entity >> Modify entity ;
  • Le double-clic sur le nom d'une entit� dans le diagramme.

Entity modify

Remarque : ces actions ouvrent l'�cran de param�trage d'une entit� en mode modification. Les modifications de l'entit� seront r�ellement appliqu�es au projet *.qxee au moment de l'enregistrement de l'�cran de param�trage.

Supprimer une entit�

La suppression d'une (ou plusieurs) entit� se fait par :
  • Le menu principal : Actions >> Delete entity ;
  • Un menu contextuel sur clic-droit dans le diagramme d'entit�s : Entity >> Delete entity ;
  • La touche "Suppr" du clavier lorsqu'une (ou plusieurs) entit� est s�lectionn�e.

Entity delete

Cloner une entit�

Le clonage d'une entit� se fait par :
  • Le menu principal : Actions >> Clone entity ;
  • Un menu contextuel sur clic-droit dans le diagramme d'entit�s : Entity >> Clone entity ;

Entity clone

Remarque : une entit� clon�e dispose de toutes les propri�t�s de l'entit� source. Les relations ne sont pas clon�es.

Param�tres d'une entit�

Les param�tres de l'entit� s�lectionn�e sont accessibles dans l'onglet de param�trage Entity :

Entity settings

Cet �cran de param�trage est divis� en plusieurs sections :

-- Section Entity information (version XX) : la version de l'entit� est incr�ment�e � chaque historique de projet cr��.
  • Champ � Name � : nom de l'entit� et de la classe C++ g�n�r�e ;
  • Champ � Table name � : nom de la table en base de donn�es associ�e � l'entit� (utilise le pr�fixe/suffixe par d�faut d�fini dans les param�tres du projet) ;
  • Champ � Namespace � : espace de nom de l'entit� et de la classe C++ associ�e, chaque sous-namespace doit �tre s�par� par ::, par exemple : ns1::ns2::ns3 ;
  • Champ � Description � : description de l'entit� (apparait dans le code C++ g�n�r�) ;
  • Champ � Inherit from � : entit� parente (ou classe C++ de base) : l'entit� fille r�cup�re automatiquement la cl� primaire et la liste des propri�t�s d�finies dans l'entit� parente ;
  • Champ � Read only � : si coch�, alors entit� en lecture seule : la biblioth�que QxOrm autorise uniquement des requ�tes SQL de type SELECT sur l'entit� (fonctions de r�cup�ration/fetch du namespace qx::dao de QxOrm). Si coch�, alors les requ�tes SQL de type INSERT, UPDATE et DELETE ne sont pas disponibles. Ce param�tre peut par exemple �tre utilis� pour mapper une entit� � une vue (lecture seule) de la base de donn�es ;
  • Champ � Abstract � : une entit� abstraite n'a pas de table associ�e dans la base de donn�es, et la classe C++ g�n�r�e ne peut pas �tre instanti�e (classe abstraite) : ce param�tre peut �tre utile par exemple pour cr�er des entit�s parentes contenant une liste de propri�t�s communes � toutes les autres entit�s ;
  • Champ � Soft delete column � : si vide, une suppression de l'entit� en base de donn�es correspond � une suppression physique. Si non vide, ce champ correspond � la colonne en base de donn�es utilis�e pour effectuer une suppression logique (conserve les informations de suppression et l'entit� reste en base de donn�es).
  • Champ � Validator method name � : nom de la m�thode de validation (par exemple IsValid) utilis�e pour valider une entit� avant insertion et modification en base de donn�es. L'impl�mentation de la m�thode de validation est � la charge du d�veloppeur dans son propre fichier source *.cpp : voir le module QxValidator de la biblioth�que QxOrm pour plus de d�tails.

-- Section Entity triggers :
  • Cases � cocher � Before fetch, After fetch, Before insert, etc... � : si coch�(s), ajoute les d�finitions dans le code C++ des m�thodes onBeforeFetch(), onAfterFetch(), onBeforeInsert(), etc... L'impl�mentation des m�thodes de trigger est � la charge du d�veloppeur dans son propre fichier source *.cpp : voir le manuel utilisateur de la biblioth�que QxOrm pour plus de d�tails.

-- Section Primary key property : d�finition rapide de la cl� primaire (un param�trage d�taill� de la cl� primaire de l'entit� est disponible).
-- Section List of properties : d�finition rapide de la liste des propri�t�s (un param�trage d�taill� des propri�t�s de l'entit� est disponible). Cette liste peut �tre ordonn�e par les 2 boutons fl�che haut et fl�che bas.
  • Colonne � Name � : nom de la propri�t� de l'entit�, et nom de la donn�e membre associ�e dans le code C++ ;
  • Colonne � Type � : type C++ de la propri�t� (le type par d�faut peut �tre d�fini dans les param�tres du projet) ;
  • Colonne � Decoration � : ajoute une d�coration au type C++ (par exemple boost::optional pour g�rer les valeurs NULL) ;
  • Colonne � Collection � : si la propri�t� est une liste, alors d�fini le type de liste C++ ;
  • Colonne � Default value � : valeur par d�faut de la propri�t� ;
  • Colonne � Index � : optimisation des requ�tes SQL de type SELECT pour les recherches en base de donn�es ;
  • Colonne � Transient � : si coch�, alors la donn�e membre C++ n'est pas mapp�e � une colonne de la base de donn�es (la propri�t� est enregistr�e dans le contexte QxOrm mais n'est pas persistante) ;
  • Bouton � Delete � : supprime la propri�t� de la liste.

-- Section List of relationships : d�finition rapide de la liste des relations (un param�trage d�taill� des relations de l'entit� est disponible). Cette liste peut �tre ordonn�e par les 2 boutons fl�che haut et fl�che bas.
  • Colonne � Name � : nom de la relation, et nom de la donn�e membre associ�e dans le code C++ ;
  • Colonne � Target � : entit� cible ;
  • Colonne � n-1 � : type de relation many-to-one ;
  • Colonne � 1-n � : type de relation one-to-many ;
  • Colonne � n-n � : type de relation many-to-many ;
  • Colonne � 1-1 � : type de relation one-to-one ;
  • Colonne � Decoration � : ajoute une d�coration au type C++ (pour les relations, la biblioth�que QxOrm recommande l'utilisation de pointeurs intelligents : boost::shared_ptr, std::shared_ptr ou QSharedPointer) ;
  • Colonne � Collection � : si le type de relation n�cessite une liste (1-n et n-n), alors d�fini le type de liste C++ ;
  • Colonne � Foreign key � : cl� �trang�re de la relation : nom d'une propri�t� de l'entit� cible ;
  • Bouton � Delete � : supprime la relation de la liste.

-- Section List of meta-data : les m�ta-donn�es permettent d'ajouter des param�tres suppl�mentaires et sont accessibles dans le code C++ (moteur d'introspection de QxOrm) et le moteur Javascript de personnalisation des exports de QxEntityEditor.
  • Colonne � Key � : cl� de la m�ta-donn�e ;
  • Colonne � Value � : valeur de la m�ta-donn�e ;
  • Bouton � Delete � : supprime la m�ta-donn�e de la liste.

Couleur associ�e � une entit�

Les couleurs d'une entit� peuvent �tre modifi�es par le menu contextuel sur un clic-droit sur une entit� Define entity colors :

Entity colors

Remarque : les couleurs des �l�ments du diagramme d'entit�s peuvent �tre g�r�es � plusieurs niveaux (du niveau le plus global au plus sp�cifique) :

Gestion des propri�t�s associ�es � une entit�

Une propri�t� dans l'application QxEntityEditor correspond � une colonne d'une table de la base de donn�es, et correspond �galement � une donn�e membre d'une classe C++ (enregistr�e dans le contexte QxOrm). L'application QxEntityEditor permet de cr�er, modifier, supprimer et ordonner les propri�t�s d'une entit�.

Ajouter/modifier/supprimer une propri�t�

L'ajout et la suppression d'une propri�t� se fait depuis l'�cran de param�trage d'une entit� : la section List of properties de cet �cran de param�trage permet d'ajouter et supprimer des propri�t�s. Il est �galement possible d'ordonner cette liste pour positionner les propri�t�s dans l'ordre voulu.

La modification d'une propri�t� est accessible par un bouton qui s'affiche sur le diagramme d'entit�s lorsque la souris est positionn�e sur une propri�t� :

Property settings access

Param�trage d�taill� d'une propri�t�

Les param�tres d�taill�s d'une propri�t� s�lectionn�e sont accessibles dans l'onglet de param�trage Property :

Property settings

Cet �cran de param�trage est divis� en plusieurs sections :

-- Section Property information (version XX) : la version de la propri�t� d�pend du niveau d'historique du projet.
  • Champ � Name � : nom de la propri�t� de l'entit�, et nom de la donn�e membre associ�e dans le code C++ ;
  • Champ � Column name � : nom de la colonne dans la base de donn�es (si vide, alors Column name == Name) ;
  • Champ � Description � : description de la propri�t� (apparait dans le code C++ g�n�r�) ;
  • Champ � Index � : optimisation des requ�tes SQL de type SELECT pour les recherches en base de donn�es ;
  • Champ � Transient � : si coch�, alors la donn�e membre C++ n'est pas mapp�e � une colonne de la base de donn�es (la propri�t� est enregistr�e dans le contexte QxOrm mais n'est pas persistante) ;
  • Champ � Serializable � : si coch�, la propri�t� est prise en compte par le moteur de s�rialisation de la biblioth�que QxOrm ;
  • Champ � Obsolete � : cocher cette option pour supprimer une propri�t� sans casser la compatibilit� ascendante du moteur de s�rialisation de la biblioth�que QxOrm : la propri�t� devient priv�e sans accesseur Get/Set.

-- Section Property type :
  • Champ � Type � : type C++ de la propri�t� (le type par d�faut peut �tre d�fini dans les param�tres du projet) ;
  • Champ � Decoration � : ajoute une d�coration au type C++ (par exemple boost::optional pour g�rer les valeurs NULL) ;
  • Champ � Default value � : valeur par d�faut de la propri�t� ;
  • Champ � Collection � : si la propri�t� est une liste, alors d�fini le type de liste C++.

-- Section Property validation : validation d'une propri�t� avant insertion/modification en base de donn�es par le module QxValidator de la biblioth�que QxOrm.
  • Champ � Min value � : valeur minimale autoris�e pour une propri�t� de type num�rique ;
  • Champ � Max value � : valeur maximale autoris�e pour une propri�t� de type num�rique ;
  • Champ � Min length � : longueur minimale autoris�e pour une propri�t� de type chaine de caract�res ;
  • Champ � Max length � : longueur maximale autoris�e pour une propri�t� de type chaine de caract�res ;
  • Champ � Regular expression � : expression r�guli�re utilis�e pour valider la valeur d'une propri�t� ;
  • Champ � Not NULL � : v�rifie que la valeur de la propri�t� n'est pas NULL ;
  • Champ � Unique � : valeur unique en base de donn�es : 2 lignes dans la table ne peuvent avoir la m�me valeur sur la colonne associ�e � cette propri�t�.

-- Section Advanced :
  • Champ � Accessibility �, valeurs � public, protected ou private � : une propri�t� public est accessible sans accesseur Get/Set, une propri�t� protected est accessible uniquement par les classes d�riv�es, une propri�t� private est accessible uniquement par les accesseurs Get/Set ;
  • Champ � SQL type � : la biblioth�que QxOrm associe automatiquement un type SQL en fonction du type C++ de la propri�t�, il est possible de surcharger le type SQL par d�faut avec ce param�tre ;
  • Champ � SQL alias � : force un alias sur cette colonne utilis� par la biblioth�que QxOrm lors de la construction des requ�tes SQL ;
  • Champ � Format � : d�fini le format (syntaxe printf) de la propri�t� pour le stockage en base de donn�es (peut �tre utile pour g�rer les dates et heures par exemple) ;
  • Champ � Get/Set accessors � : si coch�, des accesseurs Get/Set seront disponibles dans la classe C++ pour acc�der/modifier la valeur de la propri�t� ;
  • Champ � Read only � : si coch�, un seul accesseur Get est disponible dans la classe C++, ce qui rend la propri�t� en lecture seule ;
  • Champ � Get method implementation � : permet de surcharger l'impl�mentation par d�faut de la m�thode Get dans la classe C++ pour acc�der � la valeur de la propri�t� ;
  • Champ � Set method implementation � : permet de surcharger l'impl�mentation par d�faut de la m�thode Set dans la classe C++ pour modifier la valeur de la propri�t�.

-- Section List of meta-data : les m�ta-donn�es permettent d'ajouter des param�tres suppl�mentaires et sont accessibles dans le code C++ (moteur d'introspection de QxOrm) et le moteur Javascript de personnalisation des exports de QxEntityEditor.
  • Colonne � Key � : cl� de la m�ta-donn�e ;
  • Colonne � Value � : valeur de la m�ta-donn�e ;
  • Bouton � Delete � : supprime la m�ta-donn�e de la liste.

Gestion des relations entre entit�s

Une relation entre 2 entit�s (1-n, n-1, 1-1 ou n-n) dans l'application QxEntityEditor permet de lier 2 tables dans la base de donn�es, et 2 classes dans le code C++. L'application QxEntityEditor permet de cr�er, modifier, supprimer et ordonner les relations d'une entit�.

Ajouter/modifier/supprimer une relation

L'ajout et la suppression d'une relation se fait depuis l'�cran de param�trage d'une entit� : la section List of relationships de cet �cran de param�trage permet d'ajouter et supprimer des relations. Il est �galement possible d'ordonner cette liste pour positionner les relations dans l'ordre voulu.

La modification d'une relation est accessible par un bouton qui s'affiche sur le diagramme d'entit�s lorsque la souris est positionn�e sur une relation :

Relation settings access

Param�trage d�taill� d'une relation

Les param�tres d�taill�s d'une relation s�lectionn�e sont accessibles dans l'onglet de param�trage Relationship :

Relation settings

Cet �cran de param�trage est divis� en plusieurs sections :

-- Section Relationship information (version XX) : la version de la relation d�pend du niveau d'historique du projet.
  • Champ � Name � : nom de la relation, et nom de la donn�e membre associ�e dans le code C++ ;
  • Champ � Target � : entit� cible ;
  • Champ � Description � : description de la relation (apparait dans le code C++ g�n�r�) ;
  • Champs � 1-n, n-1, 1-1 ou n-n � : type de relation, suivant le type s�lectionn� certains param�tres sont actifs ou inactifs ;
  • Champ � Column name � : actif uniquement pour les relations de type n-1, nom de la colonne dans la base de donn�es (si vide, alors Column name == Name) ;
  • Champ � Decoration � : ajoute une d�coration au type C++ (pour les relations, la biblioth�que QxOrm recommande l'utilisation de pointeurs intelligents : boost::shared_ptr, std::shared_ptr ou QSharedPointer) ;
  • Champ � Collection � : si le type de relation n�cessite une liste (1-n et n-n), alors d�fini le type de liste C++ ;
  • Champ � Foreign key � : cl� �trang�re de la relation : nom d'une propri�t� de l'entit� cible ;
  • Champ � FK owner � : utilis� uniquement pour les relations de type n-n ;
  • Champ � Extra-table � : utilis� uniquement pour les relations de type n-n, correspond au nom de la table qui lie les 2 entit�s ;
  • Champ � Index � : optimisation des requ�tes SQL de type SELECT pour les recherches en base de donn�es ;
  • Champ � Serializable � : si coch�, la relation est prise en compte par le moteur de s�rialisation de la biblioth�que QxOrm ;
  • Champ � Obsolete � : cocher cette option pour supprimer une relation sans casser la compatibilit� ascendante du moteur de s�rialisation de la biblioth�que QxOrm : la relation devient priv�e sans accesseur Get/Set.

-- Section Advanced :
  • Champ � Accessibility �, valeurs � public, protected ou private � : une relation public est accessible sans accesseur Get/Set, une relation protected est accessible uniquement par les classes d�riv�es, une relation private est accessible uniquement par les accesseurs Get/Set ;
  • Champ � Get/Set accessors � : si coch�, des accesseurs Get/Set seront disponibles dans la classe C++ pour acc�der/modifier la valeur de la relation ;
  • Champ � Read only � : si coch�, un seul accesseur Get est disponible dans la classe C++, ce qui rend la relation en lecture seule ;
  • Champ � Get method implementation � : permet de surcharger l'impl�mentation par d�faut de la m�thode Get dans la classe C++ pour acc�der � la valeur de la relation ;
  • Champ � Set method implementation � : permet de surcharger l'impl�mentation par d�faut de la m�thode Set dans la classe C++ pour modifier la valeur de la relation.

-- Section List of meta-data : les m�ta-donn�es permettent d'ajouter des param�tres suppl�mentaires et sont accessibles dans le code C++ (moteur d'introspection de QxOrm) et le moteur Javascript de personnalisation des exports de QxEntityEditor.
  • Colonne � Key � : cl� de la m�ta-donn�e ;
  • Colonne � Value � : valeur de la m�ta-donn�e ;
  • Bouton � Delete � : supprime la m�ta-donn�e de la liste.

Gestion des �num�rations

Une �num�ration dans l'application QxEntityEditor correspond � une liste de valeurs disponibles c�t� code C++ (pour le moment pas de notion c�t� base de donn�es : converti en valeur num�rique). L'application QxEntityEditor permet de cr�er, modifier, supprimer et cloner une �num�ration.

Ajouter/modifier/supprimer/cloner une �num�ration

L'ajout, la modification, la suppression et le clonage d'une �num�ration se fait de la m�me fa�on que pour une entit�.
Une �num�ration dispose des m�mes menus qu'une entit�.

Param�tres d'une �num�ration

Les param�tres de l'�num�ration s�lectionn�e sont accessibles dans l'onglet de param�trage Enumeration :

Enumeration settings

Cet �cran de param�trage est divis� en plusieurs sections :

-- Section Enumeration information (version XX) : la version de l'�num�ration est incr�ment�e � chaque historique de projet cr��.
  • Champ � Name � : nom de l'�num�ration et de la classe C++ g�n�r�e ;
  • Champ � Description � : description de l'�num�ration (apparait dans le code C++ g�n�r�) ;
  • Champ � Namespace � : espace de nom de l'�num�ration et de la classe C++ associ�e, chaque sous-namespace doit �tre s�par� par ::, par exemple : ns1::ns2::ns3 ;
  • Champ � Use Qt macro Q_ENUM � : utilise la macro Q_ENUM fournie par Qt pour d�finir une �num�ration compatible avec le moteur d'introspection de Qt ;

-- Section List of values : liste des valeurs de l'�num�ration.
  • Colonne � Key � : cl� associ� � la valeur ;
  • Colonne � Value � : valeur ;
  • Bouton � Delete � : supprime la valeur de la liste.

-- Section List of meta-data : les m�ta-donn�es permettent d'ajouter des param�tres suppl�mentaires et sont accessibles dans le code C++ (moteur d'introspection de QxOrm) et le moteur Javascript de personnalisation des exports de QxEntityEditor.
  • Colonne � Key � : cl� de la m�ta-donn�e ;
  • Colonne � Value � : valeur de la m�ta-donn�e ;
  • Bouton � Delete � : supprime la m�ta-donn�e de la liste.

Couleur associ�e � une �num�ration

Les couleurs d'une �num�ration peuvent �tre modifi�es par le menu contextuel sur un clic-droit sur une �num�ration Define enumeration colors :

Enumeration colors

Remarque : les couleurs des �l�ments du diagramme d'entit�s peuvent �tre g�r�es � plusieurs niveaux (du niveau le plus global au plus sp�cifique) :

Gestion des espaces de nom (namespace)

Un espace de nom (ou namespace) dans l'application QxEntityEditor permet de regrouper plusieurs entit�s et �num�rations dans une m�me zone. C�t� base de donn�es, un espace de nom repr�sente g�n�ralement un sch�ma. C�t� code C++, un espace de nom regroupe plusieurs classes ou fonctions C++ dans une m�me zone.

La notion d'espace de nom est utilis�e par la fonction : Organisation automatique du diagramme d'entit�s (permet un regroupement automatique).

La gestion des espaces de nom dans QxEntityEditor se fait depuis l'arborescence du projet :

Namespace menu

Renommer un espace de nom

Pour renommer un espace de nom, il faut faire un clic-droit sur l'arborescence du projet, puis menu contextuel Move entities to another namespace :

Namespace rename

Gestion des couleurs d'un espace de nom

Pour d�finir les couleurs des �l�ments d'un espace de nom, il faut faire un clic-droit sur l'arborescence du projet, puis menu contextuel Define colors by namespace :

Namespace colors

La partie gauche de l'�cran liste tous les espaces de nom disponibles et d�finis dans le projet.
La partie droite permet de d�finir les couleurs des �l�ments faisant partie de l'espace de nom. Il est �galement possible de d�finir une couleur de fond (de pr�f�rence, une couleur claire), permettant de regrouper visuellement les �l�ments dans le diagramme d'entit�s.

Remarque : les couleurs des �l�ments du diagramme d'entit�s peuvent �tre g�r�es � plusieurs niveaux (du niveau le plus global au plus sp�cifique) :

Gestion des notes (ou post-it)

Une note (ou post-it) dans l'application QxEntityEditor permet de coller une �tiquette dans le diagramme d'entit�s pour fournir des informations sur le mod�le de donn�es ou le projet en cours. Cette note peut �tre positionn�e n'importe o� dans le diagramme d'entit�s. Une note dispose d'un titre et d'un texte libre. Il est possible d'�crire du texte au format HTML pour ajouter des couleurs, mettre en gras, en italique, etc...

L'application QxEntityEditor permet de cr�er, modifier, supprimer et cloner une note.

Post-it / comments

Ajouter/modifier/supprimer/cloner une note

L'ajout, la modification, la suppression et le clonage d'une note se fait de la m�me fa�on que pour une entit�.
Une note dispose des m�mes menus qu'une entit� (il suffit de remplacer le terme entity par comment dans les menus).

Couleur associ�e � une note

Les couleurs d'une note peuvent �tre modifi�es par le menu contextuel sur un clic-droit sur une note Define comment colors :

Post-it colors

Remarque : les couleurs des �l�ments du diagramme d'entit�s peuvent �tre g�r�es � plusieurs niveaux (du niveau le plus global au plus sp�cifique) :

Organisation automatique du diagramme d'entit�s

Une fonction permet de regrouper automatiquement les �l�ments du diagramme d'entit�s en fonction des espaces de nom, et en fonction des relations entre entit�s : menu principal View >> Organize diagram layout. Cette fonction est particuli�rement utile pour organiser le diagramme d'entit�s apr�s un processus d'import par exemple.

Organize diagram layout

Historique d'un projet *.qxee

Un projet QxEntityEditor peut �tre historis� : menu principal Actions >> Tag project state.

Chaque historique de projet fait �voluer les n� de version des diff�rents �l�ments du projet (entit�s, propri�t�s, relations, etc...). Ces n� de version sont utiles pour assurer une compatibilit� ascendante avec le moteur de s�rialisation de la biblioth�que QxOrm. L'historique de projet est �galement utilis� par l'export DDL de sch�ma de base de donn�es : permet de suivre l'�volution du sch�ma de base de donn�es (ajout d'une table, suppression d'une colonne, ajout d'un index, etc...).

Tag project state tab 1

Le 1er onglet de l'�cran d'historique permet de poser une �tiquette (par exemple : date/heure, num�ro de version du projet, etc...) et un commentaire en texte libre.

Tag project state tab 2

Le 2�me onglet de l'�cran d'historique liste tous les historiques du projet, et permet de r�cup�rer l'�tat d'un projet � un instant donn� sous plusieurs formats (XML, JSON ou bien fichier projet *.qxee).

Aper�u du code C++ d'une entit�/�num�ration

Il est possible de pr�visualiser � tout moment le code C++ (fichier header *.h et fichier source *.cpp) associ� � une entit� et une �num�ration (ce code C++ peut �tre g�n�r� par le processus d'export C++). Cette pr�visualisation est accessible en s�lectionnant un �l�ment dans le diagramme d'entit�s, puis aller dans l'onglet C++ preview :

C++ preview

Convention de nommage (snake_case, camelCase)

L'application QxEntityEditor fournit une fonction permettant d'appliquer rapidement une convention de nommage sur tous les �l�ments du projet (entit�s, propri�t�s, relations, etc...). Cette fonction conserve (ne casse pas) le mapping vers la base de donn�es. L'acc�s � cette fonction se fait par le menu principal : Naming convention. 3 styles de convention de nommage sont propos�s : snake_case, camelCase et PascalCase.

Naming convention

Remarque : cette fonction peut �tre utile suite � un processus d'import pour harmoniser le code C++ g�n�r�.

Liste des plugins disponibles

L'application QxEntityEditor est bas�e sur un syst�me de plugins pour g�rer les processus d'import/export. Une liste des plugins disponibles avec les n� de version et une description de chaque plugin est accessible depuis le menu principal : Help >> About plugins.

List of plugins

Plugins d'import

Tous les processus d'import de l'application QxEntityEditor sont accessibles depuis le menu principal Import :

Import plugins

Importer un projet � partir d'un r�pertoire associ� � un gestionnaire de code source (Git, Perforce, CVS, etc.)

Un projet QxEntityEditor (fichier *.qxee) peut �tre g�r� par une �quipe de d�veloppeurs : le code source d'un projet QxEntityEditor peut �tre export�/import� (manuellement ou en ligne de commande) avec les plugins QxEESourceControlExport et QxEESourceControlImport.

Associ� � un gestionnaire de code source (Git, Perforce, CVS, etc.), ces 2 plugins permettent ainsi :
  • plusieurs personnes peuvent travailler simultan�ment sur un m�me projet ;
  • un projet peut facilement �tre versionn� dans le gestionnaire de code source ;
  • chaque �l�ment d'un projet peut �tre compar� (diff�rence entre 2 versions d'une m�me entit� par exemple).
Voici un exemple d'utilisation des plugins QxEESourceControlExport et QxEESourceControlImport, avec 2 d�veloppeurs nomm�s 'dev A' et 'dev B' (l'exemple pouvant �tre �tendu � X d�veloppeurs) :
  • dev A et dev B travaillent sur un m�me projet QxEntityEditor (fichier *.qxee) ;
  • dev A cr��/modifie/supprime certaines entit�s dans l'application QxEntityEditor ;
  • dev B cr��/modifie/supprime d'autres entit�s dans l'application QxEntityEditor ;
  • dev A et dev B exportent le projet *.qxee en utilisant le plugin QxEESourceControlExport (manuellement ou en ligne de commande) ;
  • une fois le projet export� dans un r�pertoire, dev A et dev B enregistrent (check-in ou submit) les fichiers JSON g�n�r�s dans le gestionnaire de code source (Git, Perforce, CVS, etc.) sur leur propre branche de travail ;
  • depuis le gestionnaire de code source, dev A et dev B int�grent (merge ou integrate) leur branche de travail sur la branche de d�veloppement DEV (ou MAIN ou MASTER ou LATEST); Remarque : m�me si il y a des conflits � r�soudre, ils seront simples � corriger car le format JSON est lisible facilement ;
  • dev A et dev B peuvent � pr�sent obtenir la derni�re version des fichiers JSON (get latest depuis le gestionnaire de code source) � partir de la branche DEV (ou MAIN ou MASTER ou LATEST) : les fichiers JSON obtenus contiennent � la fois les modifications de dev A et dev B ;
  • dev A et dev B peuvent importer ces fichiers JSON dans l'application QxEntityEditor en utilisant le plugin d'import QxEESourceControlImport (manuellement ou en ligne de commande).
Les param�tres du plugin d'import sont accessibles depuis le menu principal Import >> Import from Source Control repository (Git, Perforce, CVS, etc.) :

Source Control import plugin

Le param�tre � renseigner correspond au fichier JSON pr�sent � la racine du r�pertoire o� a �t� export� le projet *.qxee.
Ce fichier est nomm� <nom_du_projet>.qxee.export.json, par exemple pour le projet de test qxBlog : qxBlog.qxee.export.json.

Source Control output directory

Attention : un import efface tous les �l�ments du projet courant (entit�s, propri�t�s, relations, etc...).

Remarque : il est possible de d�marrer QxEntityEditor en ligne de commande pour charger automatiquement un r�pertoire associ� � un gestionnaire de code source au d�marrage de l'application.

Exemple de ligne de commande :
QxEntityEditor --project="<path_to_your_qxee_project_file>" --plugin=QxEESourceControlImport --QxEESourceControlImport_path="<path_to_the_root_source_control_json_file>"


Importer un projet � partir d'un fichier texte au format JSON

Remarque : pour travailler avec un gestionnaire de code source (Git, Perforce, CVS, etc.), il est conseill� d'utiliser les plugins QxEESourceControlExport et QxEESourceControlImport (au lieu de cr�er un fichier unique).

Il est possible de g�rer un projet QxEntityEditor avec un fichier texte au format JSON : menu principal Import >> Import from JSON file.
Pour connaitre la structure du fichier JSON � respecter, il est conseill� au pr�alable d'effectuer un 1er export de projet au format JSON.

Import JSON

L'�cran d'import dispose d'un seul champ � renseigner : le fichier JSON � importer.

Attention : un import JSON efface tous les �l�ments du projet courant (entit�s, propri�t�s, relations, etc...).

Remarque : il est possible de d�marrer QxEntityEditor en ligne de commande pour charger automatiquement un fichier JSON au d�marrage de l'application.

Exemple de ligne de commande :
QxEntityEditor --project="<path_to_your_qxee_project_file>" --plugin=QxEEJsonImport --QxEEJsonImport_file="<path_to_your_json_file>"

Exemple de fichier JSON (pr�sent dans le dossier ./samples/qxBlog.json du package QxEntityEditor) :
{
    "app_version": 0,
    "description": "",
    "dt_creation": "20131206221737",
    "dt_modification": "20131206221737",
    "id": 1,
    "list_all_entities": [
        {
            "app_version": 0,
            "description": "",
            "dt_creation": "20131206221810",
            "dt_modification": "20140617214144",
            "id": 1,
            "is_abstract": false,
            "is_read_only": false,
            "key": "",
            "list_functions": null,
            "list_functions_static": null,
            "list_meta_data": null,
            "list_properties": [
                {
                    "accessibility": "protected",
                    "allow_null": false,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206221810",
                    "dt_modification": "20140617214144",
                    "entity_id": {
                        "id": 1
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 1,
                    "is_index": true,
                    "is_obsolete": false,
                    "is_primary_key": true,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "author_id",
                    "order_level": 0,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206221810",
                        "dt_modification": "20140617214144",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 1,
                        "list_meta_data": null,
                        "primitive_type": "long",
                        "property_id": {
                            "id": 1
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206221810",
                    "dt_modification": "20140617214144",
                    "entity_id": {
                        "id": 1
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 2,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "firstname",
                    "order_level": 1,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206221810",
                        "dt_modification": "20140617214144",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 2,
                        "list_meta_data": null,
                        "primitive_type": "QString",
                        "property_id": {
                            "id": 2
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206221810",
                    "dt_modification": "20140617214144",
                    "entity_id": {
                        "id": 1
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 3,
                    "is_index": true,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "lastname",
                    "order_level": 2,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206221810",
                        "dt_modification": "20140617214144",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 3,
                        "list_meta_data": null,
                        "primitive_type": "QString",
                        "property_id": {
                            "id": 3
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206221810",
                    "dt_modification": "20140617214144",
                    "entity_id": {
                        "id": 1
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 4,
                    "is_index": true,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "birthdate",
                    "order_level": 3,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206221810",
                        "dt_modification": "20140617214144",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 4,
                        "list_meta_data": null,
                        "primitive_type": "QDateTime",
                        "property_id": {
                            "id": 4
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206221810",
                    "dt_modification": "20140617214144",
                    "entity_id": {
                        "id": 1
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 5,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "sex",
                    "order_level": 4,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206221810",
                        "dt_modification": "20140617214144",
                        "entity_id": null,
                        "enumeration_id": {
                            "id": 1
                        },
                        "id": 5,
                        "list_meta_data": null,
                        "primitive_type": "sex::enum_sex",
                        "property_id": {
                            "id": 5
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206222031",
                    "dt_modification": "20140617214144",
                    "entity_id": {
                        "id": 1
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 18,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "list_of_blog",
                    "order_level": 17,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "qx::QxCollection",
                        "decoration": "boost::shared_ptr",
                        "default_value": "",
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214144",
                        "entity_id": {
                            "id": 4
                        },
                        "enumeration_id": null,
                        "id": 18,
                        "list_meta_data": null,
                        "primitive_type": "",
                        "property_id": {
                            "id": 18
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": {
                        "app_version": 0,
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214144",
                        "extra_table": "",
                        "foreign_key": "author",
                        "foreign_key_owner": "",
                        "id": 2,
                        "inverse_property_id": {
                            "id": 15
                        },
                        "list_meta_data": null,
                        "property_id": {
                            "id": 18
                        },
                        "type_relation": "one-to-many",
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                }
            ],
            "name": "author",
            "namespace": "",
            "parent_id": null,
            "project_id": {
                "id": 1
            },
            "project_version": 0,
            "property_id": {
                "accessibility": "protected",
                "allow_null": false,
                "app_version": 0,
                "column_name": "",
                "description": "",
                "dt_creation": "20131206221810",
                "dt_modification": "20140617214144",
                "entity_id": {
                    "id": 1
                },
                "force_sql_alias": "",
                "force_sql_type": "",
                "format": "",
                "get_method": "",
                "id": 1,
                "is_index": true,
                "is_obsolete": false,
                "is_primary_key": true,
                "is_read_only": false,
                "is_serializable": true,
                "is_transient": false,
                "is_unique": false,
                "key": "",
                "list_meta_data": null,
                "max_length": "",
                "max_value": "",
                "min_length": "",
                "min_value": "",
                "name": "author_id",
                "order_level": 0,
                "project_version": 0,
                "property_type_id": {
                    "app_version": 0,
                    "collection": "",
                    "decoration": "",
                    "default_value": "",
                    "dt_creation": "20131206221810",
                    "dt_modification": "20140617214144",
                    "entity_id": null,
                    "enumeration_id": null,
                    "id": 1,
                    "list_meta_data": null,
                    "primitive_type": "long",
                    "property_id": {
                        "id": 1
                    },
                    "user_id_creation": 0,
                    "user_id_modification": 0
                },
                "qt_property": "",
                "reg_exp": "",
                "relation_id": null,
                "set_method": "",
                "user_id_creation": 0,
                "user_id_modification": 0,
                "version": 0,
                "write_accessors": true
            },
            "soft_delete_column": "",
            "table_name": "t_author",
            "trigger_after_delete": false,
            "trigger_after_fetch": false,
            "trigger_after_insert": false,
            "trigger_after_update": false,
            "trigger_before_delete": false,
            "trigger_before_fetch": false,
            "trigger_before_insert": false,
            "trigger_before_update": false,
            "user_id_creation": 0,
            "user_id_modification": 0,
            "validator_method": "",
            "version": 0
        },
        {
            "app_version": 0,
            "description": "",
            "dt_creation": "20131206222031",
            "dt_modification": "20140617214043",
            "id": 4,
            "is_abstract": false,
            "is_read_only": false,
            "key": "",
            "list_functions": null,
            "list_functions_static": null,
            "list_meta_data": null,
            "list_properties": [
                {
                    "accessibility": "protected",
                    "allow_null": false,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206222031",
                    "dt_modification": "20140617214043",
                    "entity_id": {
                        "id": 4
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 12,
                    "is_index": true,
                    "is_obsolete": false,
                    "is_primary_key": true,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "blog_id",
                    "order_level": 11,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214043",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 12,
                        "list_meta_data": null,
                        "primitive_type": "long",
                        "property_id": {
                            "id": 12
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": false,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206222031",
                    "dt_modification": "20140617214043",
                    "entity_id": {
                        "id": 4
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 13,
                    "is_index": true,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "title",
                    "order_level": 12,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214043",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 13,
                        "list_meta_data": null,
                        "primitive_type": "QString",
                        "property_id": {
                            "id": 13
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206222031",
                    "dt_modification": "20140617214043",
                    "entity_id": {
                        "id": 4
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 14,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "text",
                    "order_level": 13,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214043",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 14,
                        "list_meta_data": null,
                        "primitive_type": "QString",
                        "property_id": {
                            "id": 14
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206222031",
                    "dt_modification": "20140617214043",
                    "entity_id": {
                        "id": 4
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 15,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "author",
                    "order_level": 14,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "qx::QxCollection",
                        "decoration": "boost::shared_ptr",
                        "default_value": "",
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214043",
                        "entity_id": {
                            "id": 1
                        },
                        "enumeration_id": null,
                        "id": 15,
                        "list_meta_data": null,
                        "primitive_type": "",
                        "property_id": {
                            "id": 15
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": {
                        "app_version": 0,
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214043",
                        "extra_table": "",
                        "foreign_key": "",
                        "foreign_key_owner": "",
                        "id": 1,
                        "inverse_property_id": {
                            "id": 18
                        },
                        "list_meta_data": null,
                        "property_id": {
                            "id": 15
                        },
                        "type_relation": "many-to-one",
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206222031",
                    "dt_modification": "20140617214043",
                    "entity_id": {
                        "id": 4
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 16,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "list_of_comment",
                    "order_level": 15,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "qx::QxCollection",
                        "decoration": "boost::shared_ptr",
                        "default_value": "",
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214043",
                        "entity_id": {
                            "id": 3
                        },
                        "enumeration_id": null,
                        "id": 16,
                        "list_meta_data": null,
                        "primitive_type": "",
                        "property_id": {
                            "id": 16
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": {
                        "app_version": 0,
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214043",
                        "extra_table": "",
                        "foreign_key": "blog_id",
                        "foreign_key_owner": "",
                        "id": 3,
                        "inverse_property_id": {
                            "id": 19
                        },
                        "list_meta_data": null,
                        "property_id": {
                            "id": 16
                        },
                        "type_relation": "one-to-many",
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206222031",
                    "dt_modification": "20140617214043",
                    "entity_id": {
                        "id": 4
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 17,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "list_of_category",
                    "order_level": 16,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "qx::QxCollection",
                        "decoration": "boost::shared_ptr",
                        "default_value": "",
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214043",
                        "entity_id": {
                            "id": 2
                        },
                        "enumeration_id": null,
                        "id": 17,
                        "list_meta_data": null,
                        "primitive_type": "",
                        "property_id": {
                            "id": 17
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": {
                        "app_version": 0,
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214043",
                        "extra_table": "t_qxee_blog_category",
                        "foreign_key": "blog_id",
                        "foreign_key_owner": "category_id",
                        "id": 5,
                        "inverse_property_id": {
                            "id": 20
                        },
                        "list_meta_data": null,
                        "property_id": {
                            "id": 17
                        },
                        "type_relation": "many-to-many",
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                }
            ],
            "name": "blog",
            "namespace": "",
            "parent_id": null,
            "project_id": {
                "id": 1
            },
            "project_version": 0,
            "property_id": {
                "accessibility": "protected",
                "allow_null": false,
                "app_version": 0,
                "column_name": "",
                "description": "",
                "dt_creation": "20131206222031",
                "dt_modification": "20140617214043",
                "entity_id": {
                    "id": 4
                },
                "force_sql_alias": "",
                "force_sql_type": "",
                "format": "",
                "get_method": "",
                "id": 12,
                "is_index": true,
                "is_obsolete": false,
                "is_primary_key": true,
                "is_read_only": false,
                "is_serializable": true,
                "is_transient": false,
                "is_unique": false,
                "key": "",
                "list_meta_data": null,
                "max_length": "",
                "max_value": "",
                "min_length": "",
                "min_value": "",
                "name": "blog_id",
                "order_level": 11,
                "project_version": 0,
                "property_type_id": {
                    "app_version": 0,
                    "collection": "",
                    "decoration": "",
                    "default_value": "",
                    "dt_creation": "20131206222031",
                    "dt_modification": "20140617214043",
                    "entity_id": null,
                    "enumeration_id": null,
                    "id": 12,
                    "list_meta_data": null,
                    "primitive_type": "long",
                    "property_id": {
                        "id": 12
                    },
                    "user_id_creation": 0,
                    "user_id_modification": 0
                },
                "qt_property": "",
                "reg_exp": "",
                "relation_id": null,
                "set_method": "",
                "user_id_creation": 0,
                "user_id_modification": 0,
                "version": 0,
                "write_accessors": true
            },
            "soft_delete_column": "",
            "table_name": "t_blog",
            "trigger_after_delete": false,
            "trigger_after_fetch": false,
            "trigger_after_insert": false,
            "trigger_after_update": false,
            "trigger_before_delete": false,
            "trigger_before_fetch": false,
            "trigger_before_insert": false,
            "trigger_before_update": false,
            "user_id_creation": 0,
            "user_id_modification": 0,
            "validator_method": "",
            "version": 0
        },
        {
            "app_version": 0,
            "description": "",
            "dt_creation": "20131206221933",
            "dt_modification": "20140617214115",
            "id": 2,
            "is_abstract": false,
            "is_read_only": false,
            "key": "",
            "list_functions": null,
            "list_functions_static": null,
            "list_meta_data": null,
            "list_properties": [
                {
                    "accessibility": "protected",
                    "allow_null": false,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206221933",
                    "dt_modification": "20140617214115",
                    "entity_id": {
                        "id": 2
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 6,
                    "is_index": true,
                    "is_obsolete": false,
                    "is_primary_key": true,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "category_id",
                    "order_level": 5,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206221933",
                        "dt_modification": "20140617214115",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 6,
                        "list_meta_data": null,
                        "primitive_type": "QString",
                        "property_id": {
                            "id": 6
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206221933",
                    "dt_modification": "20140617214115",
                    "entity_id": {
                        "id": 2
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 7,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "name",
                    "order_level": 6,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206221933",
                        "dt_modification": "20140617214115",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 7,
                        "list_meta_data": null,
                        "primitive_type": "QString",
                        "property_id": {
                            "id": 7
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206221933",
                    "dt_modification": "20140617214115",
                    "entity_id": {
                        "id": 2
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 8,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "description",
                    "order_level": 7,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206221933",
                        "dt_modification": "20140617214115",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 8,
                        "list_meta_data": null,
                        "primitive_type": "QString",
                        "property_id": {
                            "id": 8
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206222031",
                    "dt_modification": "20140617214115",
                    "entity_id": {
                        "id": 2
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 20,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "list_of_blog",
                    "order_level": 19,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "qx::QxCollection",
                        "decoration": "boost::shared_ptr",
                        "default_value": "",
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214115",
                        "entity_id": {
                            "id": 4
                        },
                        "enumeration_id": null,
                        "id": 20,
                        "list_meta_data": null,
                        "primitive_type": "",
                        "property_id": {
                            "id": 20
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": {
                        "app_version": 0,
                        "dt_creation": "20131206222031",
                        "dt_modification": "20140617214115",
                        "extra_table": "t_qxee_blog_category",
                        "foreign_key": "category_id",
                        "foreign_key_owner": "blog_id",
                        "id": 6,
                        "inverse_property_id": {
                            "id": 17
                        },
                        "list_meta_data": null,
                        "property_id": {
                            "id": 20
                        },
                        "type_relation": "many-to-many",
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                }
            ],
            "name": "category",
            "namespace": "",
            "parent_id": null,
            "project_id": {
                "id": 1
            },
            "project_version": 0,
            "property_id": {
                "accessibility": "protected",
                "allow_null": false,
                "app_version": 0,
                "column_name": "",
                "description": "",
                "dt_creation": "20131206221933",
                "dt_modification": "20140617214115",
                "entity_id": {
                    "id": 2
                },
                "force_sql_alias": "",
                "force_sql_type": "",
                "format": "",
                "get_method": "",
                "id": 6,
                "is_index": true,
                "is_obsolete": false,
                "is_primary_key": true,
                "is_read_only": false,
                "is_serializable": true,
                "is_transient": false,
                "is_unique": false,
                "key": "",
                "list_meta_data": null,
                "max_length": "",
                "max_value": "",
                "min_length": "",
                "min_value": "",
                "name": "category_id",
                "order_level": 5,
                "project_version": 0,
                "property_type_id": {
                    "app_version": 0,
                    "collection": "",
                    "decoration": "",
                    "default_value": "",
                    "dt_creation": "20131206221933",
                    "dt_modification": "20140617214115",
                    "entity_id": null,
                    "enumeration_id": null,
                    "id": 6,
                    "list_meta_data": null,
                    "primitive_type": "QString",
                    "property_id": {
                        "id": 6
                    },
                    "user_id_creation": 0,
                    "user_id_modification": 0
                },
                "qt_property": "",
                "reg_exp": "",
                "relation_id": null,
                "set_method": "",
                "user_id_creation": 0,
                "user_id_modification": 0,
                "version": 0,
                "write_accessors": true
            },
            "soft_delete_column": "",
            "table_name": "t_category",
            "trigger_after_delete": false,
            "trigger_after_fetch": false,
            "trigger_after_insert": false,
            "trigger_after_update": false,
            "trigger_before_delete": false,
            "trigger_before_fetch": false,
            "trigger_before_insert": false,
            "trigger_before_update": false,
            "user_id_creation": 0,
            "user_id_modification": 0,
            "validator_method": "",
            "version": 0
        },
        {
            "app_version": 0,
            "description": "",
            "dt_creation": "20131206221951",
            "dt_modification": "20131206221951",
            "id": 3,
            "is_abstract": false,
            "is_read_only": false,
            "key": "",
            "list_functions": null,
            "list_functions_static": null,
            "list_meta_data": null,
            "list_properties": [
                {
                    "accessibility": "protected",
                    "allow_null": false,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206221951",
                    "dt_modification": "20131206221951",
                    "entity_id": {
                        "id": 3
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 9,
                    "is_index": true,
                    "is_obsolete": false,
                    "is_primary_key": true,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "comment_id",
                    "order_level": 8,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206221951",
                        "dt_modification": "20131206221951",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 9,
                        "list_meta_data": null,
                        "primitive_type": "long",
                        "property_id": {
                            "id": 9
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206221951",
                    "dt_modification": "20131206221951",
                    "entity_id": {
                        "id": 3
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 10,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "title",
                    "order_level": 9,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206221951",
                        "dt_modification": "20131206221951",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 10,
                        "list_meta_data": null,
                        "primitive_type": "QString",
                        "property_id": {
                            "id": 10
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206221951",
                    "dt_modification": "20131206221951",
                    "entity_id": {
                        "id": 3
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 11,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "text",
                    "order_level": 10,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "",
                        "decoration": "",
                        "default_value": "",
                        "dt_creation": "20131206221951",
                        "dt_modification": "20131206221951",
                        "entity_id": null,
                        "enumeration_id": null,
                        "id": 11,
                        "list_meta_data": null,
                        "primitive_type": "QString",
                        "property_id": {
                            "id": 11
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": null,
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                },
                {
                    "accessibility": "protected",
                    "allow_null": true,
                    "app_version": 0,
                    "column_name": "",
                    "description": "",
                    "dt_creation": "20131206222031",
                    "dt_modification": "20131206222031",
                    "entity_id": {
                        "id": 3
                    },
                    "force_sql_alias": "",
                    "force_sql_type": "",
                    "format": "",
                    "get_method": "",
                    "id": 19,
                    "is_index": false,
                    "is_obsolete": false,
                    "is_primary_key": false,
                    "is_read_only": false,
                    "is_serializable": true,
                    "is_transient": false,
                    "is_unique": false,
                    "key": "",
                    "list_meta_data": null,
                    "max_length": "",
                    "max_value": "",
                    "min_length": "",
                    "min_value": "",
                    "name": "blog_id",
                    "order_level": 18,
                    "project_version": 0,
                    "property_type_id": {
                        "app_version": 0,
                        "collection": "qx::QxCollection",
                        "decoration": "boost::shared_ptr",
                        "default_value": "",
                        "dt_creation": "20131206222031",
                        "dt_modification": "20131206222031",
                        "entity_id": {
                            "id": 4
                        },
                        "enumeration_id": null,
                        "id": 19,
                        "list_meta_data": null,
                        "primitive_type": "",
                        "property_id": {
                            "id": 19
                        },
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "qt_property": "",
                    "reg_exp": "",
                    "relation_id": {
                        "app_version": 0,
                        "dt_creation": "20131206222031",
                        "dt_modification": "20131206222031",
                        "extra_table": "",
                        "foreign_key": "",
                        "foreign_key_owner": "",
                        "id": 4,
                        "inverse_property_id": {
                            "id": 16
                        },
                        "list_meta_data": null,
                        "property_id": {
                            "id": 19
                        },
                        "type_relation": "many-to-one",
                        "user_id_creation": 0,
                        "user_id_modification": 0
                    },
                    "set_method": "",
                    "user_id_creation": 0,
                    "user_id_modification": 0,
                    "version": 0,
                    "write_accessors": true
                }
            ],
            "name": "comment",
            "namespace": "",
            "parent_id": null,
            "project_id": {
                "id": 1
            },
            "project_version": 0,
            "property_id": {
                "accessibility": "protected",
                "allow_null": false,
                "app_version": 0,
                "column_name": "",
                "description": "",
                "dt_creation": "20131206221951",
                "dt_modification": "20131206221951",
                "entity_id": {
                    "id": 3
                },
                "force_sql_alias": "",
                "force_sql_type": "",
                "format": "",
                "get_method": "",
                "id": 9,
                "is_index": true,
                "is_obsolete": false,
                "is_primary_key": true,
                "is_read_only": false,
                "is_serializable": true,
                "is_transient": false,
                "is_unique": false,
                "key": "",
                "list_meta_data": null,
                "max_length": "",
                "max_value": "",
                "min_length": "",
                "min_value": "",
                "name": "comment_id",
                "order_level": 8,
                "project_version": 0,
                "property_type_id": {
                    "app_version": 0,
                    "collection": "",
                    "decoration": "",
                    "default_value": "",
                    "dt_creation": "20131206221951",
                    "dt_modification": "20131206221951",
                    "entity_id": null,
                    "enumeration_id": null,
                    "id": 9,
                    "list_meta_data": null,
                    "primitive_type": "long",
                    "property_id": {
                        "id": 9
                    },
                    "user_id_creation": 0,
                    "user_id_modification": 0
                },
                "qt_property": "",
                "reg_exp": "",
                "relation_id": null,
                "set_method": "",
                "user_id_creation": 0,
                "user_id_modification": 0,
                "version": 0,
                "write_accessors": true
            },
            "soft_delete_column": "",
            "table_name": "t_comment",
            "trigger_after_delete": false,
            "trigger_after_fetch": false,
            "trigger_after_insert": false,
            "trigger_after_update": false,
            "trigger_before_delete": false,
            "trigger_before_fetch": false,
            "trigger_before_insert": false,
            "trigger_before_update": false,
            "user_id_creation": 0,
            "user_id_modification": 0,
            "validator_method": "",
            "version": 0
        }
    ],
    "list_comments": [
        {
            "app_version": 0,
            "comment_text": "- Design the entity model in few minutes\n\n- Generate C++ persistent classes automatically\n\n- Generate DDL SQL script automatically\n\n- Manage schema evolution for each project version\n\n- Compile C++ native code everywhere : Windows, Linux, MacOSX, Android, iOS, etc...\n\n- Transfer your data model over network and create quickly client/server applications",
            "comment_text_html": false,
            "comment_title": "qxBlog project",
            "dt_creation": "20131206222130",
            "dt_modification": "20140107093142",
            "id": 1,
            "list_meta_data": null,
            "user_id_creation": 0,
            "user_id_modification": 0
        }
    ],
    "list_enumerations": [
        {
            "app_version": 0,
            "description": "",
            "dt_creation": "20131206221840",
            "dt_modification": "20131210205552",
            "id": 1,
            "key": "",
            "list_meta_data": null,
            "list_of_key_value": {
                "female": 2,
                "male": 1,
                "unknown": 3
            },
            "name": "sex",
            "namespace": "",
            "project_id": {
                "id": 1
            },
            "project_version": 0,
            "qt_enum": false,
            "user_id_creation": 0,
            "user_id_modification": 0,
            "version": 0
        }
    ],
    "list_groups": null,
    "list_meta_data": null,
    "list_namespaces": null,
    "location": "C:/Temp/qxee",
    "name": "qxBlog",
    "project_guid": "{16335d56-73ac-48cf-8fcd-f74cc7d97201}",
    "project_parameters": {
        "app_version": 0,
        "default_entity_namespace": "",
        "default_primary_key_type": "long",
        "default_property_type": "QString",
        "dt_creation": "20131206221737",
        "dt_modification": "20131206221737",
        "id": 1,
        "list_meta_data": null,
        "lst_plugin_script": {
        },
        "primary_key_prefix": "",
        "primary_key_suffix": "_id",
        "project_id": {
            "id": 1
        },
        "table_name_prefix": "t_",
        "table_name_suffix": "",
        "user_id_creation": 0,
        "user_id_modification": 0
    },
    "user_id_creation": 0,
    "user_id_modification": 0,
    "version": 0
}


Importer � partir d'une base de donn�es MySQL ou MariaDB

L'import d'une base de donn�es MySQL (ou MariaDB) dans l'application QxEntityEditor se fait par le menu principal : Import >> Import from MySQL (or MariaDB) database :

Import MySQL or MariaDB

Cet �cran d'import est divis� en plusieurs sections :

-- Section MySQL (or MariaDB) database connection :
  • Champ � Database server address (IP) � : adresse IP ou nom du serveur MySQL ;
  • Champ � Database port � : n� de port pour se connecter � la base de donn�es MySQL ;
  • Champ � Database name � : nom de la base de donn�es qu'on souhaite importer ;
  • Champ � Database login � : nom d'utilisateur pour se connecter � la base de donn�es ;
  • Champ � Database password � : mot de passe pour se connecter � la base de donn�es ;
  • Bouton � Connect to database � : d�marre la connexion � la base de donn�es : si une erreur se produit, un message d'avertissement est affich�, sinon la liste des tables de la base de donn�es apparait dans la section � Database items to import to QxEntityEditor project �.

-- Section Import settings :
  • Champ � Namespace � : espace de nom utilis� pour regrouper les entit�s import�es ;
  • Champ � Delete all entities in the namespace before importing � : supprime les entit�s de l'espace de nom ci-dessus avant de d�marrer l'import des tables de la base de donn�es ;
  • Champ � Import tables/columns comment to entities/properties description � : importe les commentaires des tables et colonnes d�finis dans la base de donn�es ;
  • Champ � Add boost::optional<T> decoration if a column definition allows NULL value � : ajoute automatiquement la d�coration boost::optional pour g�rer la valeur NULL ;
  • Champ � Import columns default value � : importe les valeurs par d�faut d�finies au niveau des colonnes de la base de donn�es ;
  • Champ � Organize diagram layout after import process � : d�marre automatiquement une r�organisation du diagramme d'entit�s apr�s le processus d'import.

-- Section Relationship import settings :
  • Champ � Decoration � : d�coration par d�faut du type C++ (pour les relations, la biblioth�que QxOrm recommande l'utilisation de pointeurs intelligents : boost::shared_ptr, std::shared_ptr ou QSharedPointer) ;
  • Champ � Collection � : si le type de relation n�cessite une liste (1-n et n-n), alors d�fini le type de liste C++ par d�faut ;

-- Section Mapping database SQL type to C++ type : QxEntityEditor d�finit un mapping par d�faut pour associer un type SQL � un type C++. Il est possible d'utiliser cette liste pour surcharger le comportement par d�faut :
  • Colonne � SQL type � : type SQL � mapper. La recherche du type SQL n'est pas sensible � la casse, et s'effectue sur les 1er caract�res : par exemple, mettre varchar va mapper VARCHAR(255) ;
  • Colonne � C++ type � : type C++ correspondant au type SQL ;
  • Bouton � Supprimer � : supprime une association type SQL / type C++.

-- Section Database items to import to QxEntityEditor project : lorsque QxEntityEditor est connect� � la base de donn�es, la liste de tous les �l�ments (tables, colonnes, cl�s primaires, relations, vues, etc...) pouvant �tre import�s dans le projet QxEntityEditor sont affich�s dans cette section. Par d�faut, aucun �l�ment n'est s�lectionn�. Il est possible de tout s�lectionner en 1 clic en cochant l'�l�ment racine de l'arborescence. Il est �galement possible de s�lectionner uniquement les �l�ments appartenant � un sch�ma. Une fois les �l�ments s�lectionn�s, le bouton � Ok � devient actif pour d�marrer le processus d'import.


Remarque : tous les param�tres d'import (connexion � la base de donn�es, param�tres d'import et des relations, liste mapping type SQL / type C++, etc...) sont enregistr�s � la fermeture de cette fen�tre d'import. Tous les param�tres d'import sont automatiquement valoris�s � la r�-ouverture de la fen�tre d'import.

Autre remarque : une vid�o de QxEntityEditor est disponible pour montrer un exemple d'import de la base de donn�es de test MySQL : sakila.

Importer � partir d'une base de donn�es PostgreSQL

L'import d'une base de donn�es PostgreSQL dans l'application QxEntityEditor se fait par le menu principal : Import >> Import from PostgreSQL database :

Import PostgreSQL

Cet �cran d'import est divis� en plusieurs sections :

-- Section PostgreSQL database connection :
  • Champ � Database server address (IP) � : adresse IP ou nom du serveur PostgreSQL ;
  • Champ � Database port � : n� de port pour se connecter � la base de donn�es PostgreSQL ;
  • Champ � Database name � : nom de la base de donn�es qu'on souhaite importer ;
  • Champ � Database login � : nom d'utilisateur pour se connecter � la base de donn�es ;
  • Champ � Database password � : mot de passe pour se connecter � la base de donn�es ;
  • Bouton � Connect to database � : d�marre la connexion � la base de donn�es : si une erreur se produit, un message d'avertissement est affich�, sinon la liste des tables de la base de donn�es apparait dans la section � Database items to import to QxEntityEditor project �.

-- Section Import settings :
  • Champ � Namespace � : espace de nom utilis� pour regrouper les entit�s import�es ;
  • Champ � Delete all entities in the namespace before importing � : supprime les entit�s de l'espace de nom ci-dessus avant de d�marrer l'import des tables de la base de donn�es ;
  • Champ � Import tables/columns comment to entities/properties description � : importe les commentaires des tables et colonnes d�finis dans la base de donn�es ;
  • Champ � Add boost::optional<T> decoration if a column definition allows NULL value � : ajoute automatiquement la d�coration boost::optional pour g�rer la valeur NULL ;
  • Champ � Import columns default value � : importe les valeurs par d�faut d�finies au niveau des colonnes de la base de donn�es ;
  • Champ � Organize diagram layout after import process � : d�marre automatiquement une r�organisation du diagramme d'entit�s apr�s le processus d'import.

-- Section Relationship import settings :
  • Champ � Decoration � : d�coration par d�faut du type C++ (pour les relations, la biblioth�que QxOrm recommande l'utilisation de pointeurs intelligents : boost::shared_ptr, std::shared_ptr ou QSharedPointer) ;
  • Champ � Collection � : si le type de relation n�cessite une liste (1-n et n-n), alors d�fini le type de liste C++ par d�faut ;

-- Section Mapping database SQL type to C++ type : QxEntityEditor d�finit un mapping par d�faut pour associer un type SQL � un type C++. Il est possible d'utiliser cette liste pour surcharger le comportement par d�faut :
  • Colonne � SQL type � : type SQL � mapper. La recherche du type SQL n'est pas sensible � la casse, et s'effectue sur les 1er caract�res : par exemple, mettre varchar va mapper VARCHAR(255) ;
  • Colonne � C++ type � : type C++ correspondant au type SQL ;
  • Bouton � Supprimer � : supprime une association type SQL / type C++.

-- Section Database items to import to QxEntityEditor project : lorsque QxEntityEditor est connect� � la base de donn�es, la liste de tous les �l�ments (tables, colonnes, cl�s primaires, relations, vues, etc...) pouvant �tre import�s dans le projet QxEntityEditor sont affich�s dans cette section. Par d�faut, aucun �l�ment n'est s�lectionn�. Il est possible de tout s�lectionner en 1 clic en cochant l'�l�ment racine de l'arborescence. Il est �galement possible de s�lectionner uniquement les �l�ments appartenant � un sch�ma. Une fois les �l�ments s�lectionn�s, le bouton � Ok � devient actif pour d�marrer le processus d'import.


Remarque : tous les param�tres d'import (connexion � la base de donn�es, param�tres d'import et des relations, liste mapping type SQL / type C++, etc...) sont enregistr�s � la fermeture de cette fen�tre d'import. Tous les param�tres d'import sont automatiquement valoris�s � la r�-ouverture de la fen�tre d'import.

Autre remarque : une vid�o de QxEntityEditor est disponible pour montrer un exemple d'import de la base de donn�es de test MySQL : sakila.

Importer � partir d'une base de donn�es SQLite

L'import d'une base de donn�es SQLite dans l'application QxEntityEditor se fait par le menu principal : Import >> Import from SQLite database :

Import SQLite

Cet �cran d'import est divis� en plusieurs sections :

-- Section Database connection :
  • Champ � Database path � : chemin d'acc�s au fichier base de donn�es SQLite ;
  • Bouton � Connect to database � : d�marre la connexion � la base de donn�es : si une erreur se produit, un message d'avertissement est affich�, sinon la liste des tables de la base de donn�es apparait dans la section � Database items to import to QxEntityEditor project �.

-- Section Import settings :
  • Champ � Namespace � : espace de nom utilis� pour regrouper les entit�s import�es ;
  • Champ � Delete all entities in the namespace before importing � : supprime les entit�s de l'espace de nom ci-dessus avant de d�marrer l'import des tables de la base de donn�es ;
  • Champ � Import tables/columns comment to entities/properties description � : importe les commentaires des tables et colonnes d�finis dans la base de donn�es ;
  • Champ � Add boost::optional<T> decoration if a column definition allows NULL value � : ajoute automatiquement la d�coration boost::optional pour g�rer la valeur NULL ;
  • Champ � Import columns default value � : importe les valeurs par d�faut d�finies au niveau des colonnes de la base de donn�es ;
  • Champ � Organize diagram layout after import process � : d�marre automatiquement une r�organisation du diagramme d'entit�s apr�s le processus d'import.

-- Section Relationship import settings :
  • Champ � Decoration � : d�coration par d�faut du type C++ (pour les relations, la biblioth�que QxOrm recommande l'utilisation de pointeurs intelligents : boost::shared_ptr, std::shared_ptr ou QSharedPointer) ;
  • Champ � Collection � : si le type de relation n�cessite une liste (1-n et n-n), alors d�fini le type de liste C++ par d�faut ;

-- Section Mapping database SQL type to C++ type : QxEntityEditor d�finit un mapping par d�faut pour associer un type SQL � un type C++. Il est possible d'utiliser cette liste pour surcharger le comportement par d�faut :
  • Colonne � SQL type � : type SQL � mapper. La recherche du type SQL n'est pas sensible � la casse, et s'effectue sur les 1er caract�res : par exemple, mettre varchar va mapper VARCHAR(255) ;
  • Colonne � C++ type � : type C++ correspondant au type SQL ;
  • Bouton � Supprimer � : supprime une association type SQL / type C++.

-- Section Database items to import to QxEntityEditor project : lorsque QxEntityEditor est connect� � la base de donn�es, la liste de tous les �l�ments (tables, colonnes, cl�s primaires, relations, vues, etc...) pouvant �tre import�s dans le projet QxEntityEditor sont affich�s dans cette section. Par d�faut, aucun �l�ment n'est s�lectionn�. Il est possible de tout s�lectionner en 1 clic en cochant l'�l�ment racine de l'arborescence. Il est �galement possible de s�lectionner uniquement les �l�ments appartenant � un sch�ma. Une fois les �l�ments s�lectionn�s, le bouton � Ok � devient actif pour d�marrer le processus d'import.


Remarque : tous les param�tres d'import (connexion � la base de donn�es, param�tres d'import et des relations, liste mapping type SQL / type C++, etc...) sont enregistr�s � la fermeture de cette fen�tre d'import. Tous les param�tres d'import sont automatiquement valoris�s � la r�-ouverture de la fen�tre d'import.

Autre remarque : une vid�o de QxEntityEditor est disponible pour montrer un exemple d'import de la base de donn�es de test MySQL : sakila.

Importer � partir d'une base de donn�es en utilisant un driver ODBC (Oracle, MS SQL Server, etc.)

L'application QxEntityEditor fournit un import g�n�rique de base de donn�es par connexion ODBC : menu principal Import >> Import from database using ODBC driver. Ce type d'import n�cessite de d�fnir un DSN (Data Source Name) dans l'environnement. L'import par ODBC de l'application QxEntityEditor permet d'importer des bases de donn�es de type : Oracle, Microsoft SQL Server, SQLite, MySQL/MariaDB, PostgreSQL, etc...

Import ODBC

Cet �cran d'import est divis� en plusieurs sections :

-- Section Database connection :
  • Champ � DSN or connection string � : DSN (Data Source Name) d�fini dans l'environnement permettant de se connecter � la base de donn�es par ODBC ;
  • Champ � Login � : nom d'utilisateur pour se connecter � la base de donn�es (optionnel suivant les DSN) ;
  • Champ � Password � : mot de passe pour se connecter � la base de donn�es (optionnel suivant les DSN) ;
  • Champ � Database type � : type de base de donn�es : le type Generic permet de se connecter � tous types de bases mais avec certaines limitations (pas de relation, pas de cl� primaire sur plusieurs colonnes). Il est conseill� de s�lectionner le type r��l de base de donn�es avant de d�marrer la connexion � la base (Oracle, Microsoft SQL Server, SQLite, MySQL/MariaDB, PostgreSQL) ;
  • Bouton � Connect to database � : d�marre la connexion � la base de donn�es : si une erreur se produit, un message d'avertissement est affich�, sinon la liste des tables de la base de donn�es apparait dans la section � Database items to import to QxEntityEditor project �.

-- Section Import settings :
  • Champ � Namespace � : espace de nom utilis� pour regrouper les entit�s import�es ;
  • Champ � Delete all entities in the namespace before importing � : supprime les entit�s de l'espace de nom ci-dessus avant de d�marrer l'import des tables de la base de donn�es ;
  • Champ � Import tables/columns comment to entities/properties description � : importe les commentaires des tables et colonnes d�finis dans la base de donn�es ;
  • Champ � Add boost::optional<T> decoration if a column definition allows NULL value � : ajoute automatiquement la d�coration boost::optional pour g�rer la valeur NULL ;
  • Champ � Import columns default value � : importe les valeurs par d�faut d�finies au niveau des colonnes de la base de donn�es ;
  • Champ � Organize diagram layout after import process � : d�marre automatiquement une r�organisation du diagramme d'entit�s apr�s le processus d'import.

-- Section Relationship import settings :
  • Champ � Decoration � : d�coration par d�faut du type C++ (pour les relations, la biblioth�que QxOrm recommande l'utilisation de pointeurs intelligents : boost::shared_ptr, std::shared_ptr ou QSharedPointer) ;
  • Champ � Collection � : si le type de relation n�cessite une liste (1-n et n-n), alors d�fini le type de liste C++ par d�faut ;

-- Section Mapping database SQL type to C++ type : QxEntityEditor d�finit un mapping par d�faut pour associer un type SQL � un type C++. Il est possible d'utiliser cette liste pour surcharger le comportement par d�faut :
  • Colonne � SQL type � : type SQL � mapper. La recherche du type SQL n'est pas sensible � la casse, et s'effectue sur les 1er caract�res : par exemple, mettre varchar va mapper VARCHAR(255) ;
  • Colonne � C++ type � : type C++ correspondant au type SQL ;
  • Bouton � Supprimer � : supprime une association type SQL / type C++.

-- Section Database items to import to QxEntityEditor project : lorsque QxEntityEditor est connect� � la base de donn�es, la liste de tous les �l�ments (tables, colonnes, cl�s primaires, relations, vues, etc...) pouvant �tre import�s dans le projet QxEntityEditor sont affich�s dans cette section. Par d�faut, aucun �l�ment n'est s�lectionn�. Il est possible de tout s�lectionner en 1 clic en cochant l'�l�ment racine de l'arborescence. Il est �galement possible de s�lectionner uniquement les �l�ments appartenant � un sch�ma. Une fois les �l�ments s�lectionn�s, le bouton � Ok � devient actif pour d�marrer le processus d'import.


Remarque : tous les param�tres d'import (connexion � la base de donn�es, param�tres d'import et des relations, liste mapping type SQL / type C++, etc...) sont enregistr�s � la fermeture de cette fen�tre d'import. Tous les param�tres d'import sont automatiquement valoris�s � la r�-ouverture de la fen�tre d'import.

Autre remarque : une vid�o de QxEntityEditor est disponible pour montrer un exemple d'import de la base de donn�es de test MySQL : sakila.

Plugins d'export

Tous les processus d'export de l'application QxEntityEditor sont accessibles depuis le menu principal Export :

Export plugins

Exporter en projet C++

L'export C++ g�n�re un projet complet C++ pr�t � �tre compil� (par qmake et/ou cmake) et contenant toutes les entit�s/propri�t�s/relations/�num�rations enregistr�es dans le contexte de la biblioth�que QxOrm. Toutes les fonctionnalit�s de la biblioth�que QxOrm (persistance, s�rialisation, introspection, etc...) sont ainsi disponibles pour l'ensemble du projet C++ g�n�r�.

Param�tres de l'export C++

Les param�tres de l'export C++ sont accessibles par le menu principal : Tools >> Export to C++ project (settings). Cet �cran de param�trage apparait automatiquement au 1er export si aucun param�tre n'a �t� enregistr� au niveau du projet. Lorsqu'un export C++ a d�j� �t� r�alis�, alors cette fen�tre de param�trage est accessible uniquement par le menu principal : Tools >> Export to C++ project (settings) :

Export C++

Cet �cran d'export est divis� en plusieurs sections :

-- Section C++ export settings :
  • Champ � C++ project location � : r�pertoire de destination qui contiendra tous les fichiers du projet C++ g�n�r�. Il est possible de renseigner dans ce champ un chemin relatif par rapport au fichier projet *.qxee ;
  • Option � Relative path to QxOrm library � : si coch�, le projet C++ r�f�rence la biblioth�que QxOrm avec un chemin relatif, sinon la d�pendance � la biblioth�que QxOrm est d�finie avec un chemin absolu. Il est conseill� d'utiliser une variable d'environnement dans les param�tres de l'application QxEntityEditor (par exemple : $$(QXORM_DIR)) � la place de cette option ;
  • Option � Generate a custom directory with custom files for each entity � : si coch�, le projet C++ g�n�r� contient un fichier personnalis� par entit�. Par d�faut, ces fichiers custom sont vides et ne seront jamais �cras�s par un nouvel export C++. Ces fichiers custom peuvent �tre utilis�s par exemple pour impl�menter les m�thodes de validation, ou bien les m�thodes de trigger.
  • Option � Generate all persistent classes using the PIMPL (Private Implementation) idiom � : si coch�, toutes les classes C++ g�n�r�es et enregistr�es dans le contexte QxOrm seront cod�es en utilisant le pattern C++ PIMPL (ou d-pointer).

-- Section Custom script (Javascript file) to change the default behaviour of the export process : param�trage du moteur de personnalisation de l'export.
  • Champ � Custom script file � : chemin d'acc�s au fichier Javascript permettant de personnaliser l'export C++. Si vide, aucune personnalisation n'est appliqu�e (export par d�faut). Il est possible de renseigner dans ce champ un chemin relatif par rapport au fichier projet *.qxee, par exemple ./my_script.js si le fichier my_script.js se trouve dans le m�me r�pertoire que le fichier projet *.qxee ;
  • Bouton � Debug custom Javascript file � : si un fichier Javascript est d�fini, un clic sur ce bouton d�clenchera le mode d�bogage Javascript au prochain lancement d'export C++. Au lieu d'utiliser ce bouton, il est �galement possible d'activer le mode d�bogage Javascript en maintenant la touche SHIFT au moment de lancer un export C++.

-- Section C++ template files : cette section d�finit le code C++ des entit�s pour les fichiers Header *.h et Source *.cpp. Le moteur d'export utilise des mots-cl� (placeholder sous la forme @@ACTION@@) pour remplacer le code par la valeur correspondante. Cette notion de placeholder est la base du moteur de personnalisation Javascript. Il est possible de renseigner des placeholder personnalis�s en prefixant par @@CUSTOM_, par exemple : @@CUSTOM_MY_ACTION@@.
  • Option � No inheritance � : si coch� (option par d�faut), la classe C++ n'a pas d'h�ritage (aucune classe de base) ;
  • Option � qx::IxPersistable � : si coch�, chaque classe C++ g�n�r�e h�rite de l'interface qx::IxPersistable (fourni une interface commune pour les actions de persistance � la base de donn�es). Cette option rallonge les temps de compilation du projet C++ ;
  • Option � qx::IxPersistable + QObject � : si coch�, chaque classe C++ g�n�r�e h�rite de l'interface qx::IxPersistable et de la classe Qt QObject. Cette option rallonge les temps de compilation du projet C++ ;
  • Option � Custom � : si coch�, possibilit� de fournir son propre code C++ (il est cependant conseill� de commencer � copier/coller Header *.h et Source *.cpp d'une des 3 autres options pour r�cup�rer les placeholder � utiliser).

Pr�sentation du projet C++ g�n�r�

Le projet C++ g�n�r� dispose de l'arborescence suivante :

Export C++ output

  • le dossier � bin � est vide par d�faut, et contiendra le binaire compil� (*.dll sous Windows, *.so sous Linux, etc...) ;
  • le dossier � build � est vide par d�faut, il peut �tre utilis� pour produire les fichiers CMake ;
  • le dossier � custom � est aliment� si l'option � Generate a custom directory with custom files for each entity � est coch�. Ces fichiers custom peuvent �tre utilis�s par exemple pour impl�menter les m�thodes de validation, ou bien les m�thodes de trigger ;
  • le dossier � include � contient les d�finitions de toutes les classes entit�s et �num�rations du projet ;
  • le dossier � src � contient les impl�mentations de toutes les classes entit�s et �num�rations du projet ;
  • le fichier � CMakeLists.txt � peut �tre utilis� pour compiler le projet C++ avec CMake ;
  • les fichiers � *.gen.pri � et � *.gen.pro � peuvent �tre utilis�s pour compiler le projet C++ avec qmake ;

Compilation du projet C++ g�n�r� (par qmake ou cmake)

Le projet C++ g�n�r� peut �tre compil� avec CMake ou qmake.
La biblioth�que QxOrm dispose de certaines options de compilation document�es dans les fichiers QxOrm.pri et QxOrm.cmake (il est possible de conserver les options par d�faut).
Le manuel utilisateur de la biblioth�que QxOrm indique comment proc�der � la compilation du projet.
Un tutoriel est �galement disponible pour expliquer l'installation d'un environnement de d�veloppement sous Windows avec MSVC.
Une fois le projet C++ compil� avec succ�s, le binaire est disponible dans le dossier � bin � du projet export� (*.dll sous Windows, *.so sous Linux, etc...).

Exemple d'utilisation

Le dossier ./samples/ du package QxEntityEditor fournit un projet de test : qxBlog.qxee. Ce projet de test peut �tre ouvert m�me avec une version de QxEntityEditor sans cl� de licence active. Une fois export� en projet C++, il est possible de compiler le projet afin d'obtenir une biblioth�que partag�e qxBlog.dll (ou qxBlog.so sous Linux). Cette biblioth�que partag�e poss�de toutes les entit�s et �num�rations du projet enregistr�es dans le contexte QxOrm : toutes les fonctionnalit�s de la biblioth�que QxOrm sont ainsi disponibles.

Le dossier ./samples/ du package QxEntityEditor fournit �galement un projet d'exemple d'utilisation du binaire compil� : qxBlogExec.zip. Une fois d�zipp�, le fichier readme.txt � la racine contient les instructions d'installation et compilation de ce projet d'exemple :

--------------------------------------------
-- To build qxBlogExec project with qmake --
--------------------------------------------

1- Export the 'qxBlog.qxee' project as a C++ project with QxEntityEditor and build it
2- Open the 'qxBlogExec.pro' file
3- Replace '$$(QXORM_DIR)' by your QxOrm library installation path
4- Replace 'C:/Temp/qxee/cpp/' by the path where you have exported the 'qxBlog.qxee' project as a C++ project
5- run command line : qmake
6- run command line : make debug (or make release)


--------------------------------------------
-- To build qxBlogExec project with CMake --
--------------------------------------------

1- Export the 'qxBlog.qxee' project as a C++ project with QxEntityEditor and build it
2- Open the 'CMakeLists.txt' file
3- Replace '$ENV{QXORM_DIR}' by your QxOrm library installation path
4- Replace 'C:/Temp/qxee/cpp/' by the path where you have exported the 'qxBlog.qxee' project as a C++ project
5- run cmake or cmake-gui to configure and generate your make files


Voici le contenu comment� de la fonction main() qui montre un exemple d'utilisation (proche du tutoriel qxBlog) :

int main(int argc, char * argv[])
{
   // Qt application
   QCoreApplication app(argc, argv);
   QFile::remove("./qxBlog.sqlite");

   // Parameters to connect to database
   qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
   qx::QxSqlDatabase::getSingleton()->setDatabaseName("./qxBlog.sqlite");
   qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
   qx::QxSqlDatabase::getSingleton()->setUserName("root");
   qx::QxSqlDatabase::getSingleton()->setPassword("");

   // Only for debug purpose : assert if invalid offset detected fetching a relation
   qx::QxSqlDatabase::getSingleton()->setVerifyOffsetRelation(true);

   // !!! TO CREATE TABLES, PLEASE USE THE C++ DDL SQL EXPORT PLUGIN OF QXENTITYEDITOR !!!
   // Create all tables in database (you should not use 'qx::dao::create_table<T>()' function in a production software, use it just for prototypes or samples)
   QSqlError daoError = qx::dao::create_table<author>();
   daoError = qx::dao::create_table<comment>();
   daoError = qx::dao::create_table<category>();
   daoError = qx::dao::create_table<blog>();

   // Create a list of 3 author
   author_ptr author_1; author_1.reset(new author());
   author_ptr author_2; author_2.reset(new author());
   author_ptr author_3; author_3.reset(new author());

   author_1->setlastname("author_1");
   author_1->setsex(sex::male);
   author_1->setbirthdate(QDateTime::currentDateTime());
   author_2->setlastname("author_2");
   author_2->setsex(sex::female);
   author_2->setbirthdate(QDateTime::currentDateTime());
   author_3->setlastname("author_3");
   author_3->setsex(sex::female);
   author_3->setbirthdate(QDateTime::currentDateTime());

   list_of_author authorX;
   authorX.insert(1, author_1);
   authorX.insert(2, author_2);
   authorX.insert(3, author_3);

   // Insert list of 3 author into database
   daoError = qx::dao::insert(authorX);
   qAssert(qx::dao::count<author>() == 3);

   // Clone author n�2 : 'author_id_2'
   author_ptr author_clone = qx::clone(* author_2);
   qAssert(author_clone->getauthor_id() == author_2->getauthor_id());
   qAssert(author_clone->getsex() == sex::female);

   // Create a query to fetch only female author : 'author_id_2' and 'author_id_3'
   qx::QxSqlQuery query("WHERE t_author.sex = :sex");
   query.bind(":sex", sex::female);

   list_of_author list_of_female_author;
   daoError = qx::dao::fetch_by_query(query, list_of_female_author);
   qAssert(list_of_female_author.count() == 2);

   // Dump list of female author (xml serialization)
   qx::dump(list_of_female_author);

   // Create 3 categories
   category_ptr category_1 = category_ptr(new category("cat_1"));
   category_ptr category_2 = category_ptr(new category("cat_2"));
   category_ptr category_3 = category_ptr(new category("cat_3"));

   category_1->setname("category_1"); category_1->setdescription("desc_1");
   category_2->setname("category_2"); category_2->setdescription("desc_2");
   category_3->setname("category_3"); category_3->setdescription("desc_3");

   { // Create a scope to destroy temporary connexion to database

   // Open a transaction to database
   QSqlDatabase db = qx::QxSqlDatabase::getDatabase();
   bool bCommit = db.transaction();

   // Insert 3 categories into database, use 'db' parameter for the transaction
   daoError = qx::dao::insert(category_1, (& db));    bCommit = (bCommit && ! daoError.isValid());
   daoError = qx::dao::insert(category_2, (& db));    bCommit = (bCommit && ! daoError.isValid());
   daoError = qx::dao::insert(category_3, (& db));    bCommit = (bCommit && ! daoError.isValid());

   qAssert(bCommit);
   qAssert(category_1->getcategory_id() != "");
   qAssert(category_2->getcategory_id() != "");
   qAssert(category_3->getcategory_id() != "");

   // Terminate transaction => commit or rollback if there is error
   if (bCommit) { db.commit(); }
   else { db.rollback(); }

   } // End of scope : 'db' is destroyed

   // Create a blog with the class name (factory)
   boost::any blog_any = qx::create("blog");
   blog_ptr blog_1;
   try { blog_1 = boost::any_cast<blog_ptr>(blog_any); }
   catch (...) { blog_1.reset(new blog()); }
   blog_1->settext("blog_text_1");
   blog_1->settitle("blog_title_1");
   blog_1->setauthor(author_1);

   // Insert 'blog_1' into database with 'save()' method
   daoError = qx::dao::save(blog_1);

   // Modify 'blog_1' properties and save into database
   blog_1->settext("update blog_text_1");
   blog_1->setauthor(author_2);
   daoError = qx::dao::save(blog_1);

   // Add 2 comments to 'blog_1'
   comment_ptr comment_1; comment_1.reset(new comment());
   comment_ptr comment_2; comment_2.reset(new comment());

   comment_1->settext("comment_1 text");
   comment_1->setblog_id(blog_1);
   comment_2->settext("comment_2 text");
   comment_2->setblog_id(blog_1);

   daoError = qx::dao::insert(comment_1);
   daoError = qx::dao::insert(comment_2);
   qAssert(qx::dao::count<comment>() == 2);

   // Add 2 categories to 'blog_1' => must insert into extra-table 'category_blog'
   blog::type_list_of_category lst_category;
   lst_category.insert(category_1->getcategory_id(), category_1);
   lst_category.insert(category_3->getcategory_id(), category_3);
   blog_1->setlist_of_category(lst_category);
   daoError = qx::dao::save_with_relation("list_of_category", blog_1);

   // Fetch blog into a new variable with all relation : 'author', 'comment' and 'category'
   blog_ptr blog_tmp; blog_tmp.reset(new blog());
   blog_tmp->setblog_id(blog_1->getblog_id());
   daoError = qx::dao::fetch_by_id_with_all_relation(blog_tmp);

   qAssert(blog_tmp->list_of_comment().count() == 2);
   qAssert(blog_tmp->list_of_category().count() == 2);
   qAssert(blog_tmp->gettext() == "update blog_text_1");
   qAssert(blog_tmp->getauthor() && blog_tmp->getauthor()->getauthor_id() == author_2->getauthor_id());

   // Fetch blog into a new variable with many relations using "*->*->*->*" (4 levels of relationships)
   blog_tmp.reset(new blog());
   blog_tmp->setblog_id(blog_1->getblog_id());
   daoError = qx::dao::fetch_by_id_with_relation("*->*->*->*", blog_tmp);

   qAssert(blog_tmp->list_of_comment().count() == 2);
   qAssert(blog_tmp->list_of_category().count() == 2);
   qAssert(blog_tmp->gettext() == "update blog_text_1");
   qAssert(blog_tmp->getauthor() && blog_tmp->getauthor()->getauthor_id() == author_2->getauthor_id());

   // Dump 'blog_tmp' result from database (xml serialization)
   qx::dump(blog_tmp);

   // Check qx::dao::save_with_relation_recursive() function
   daoError = qx::dao::save_with_relation_recursive(blog_tmp);
   qAssert(! daoError.isValid());
   daoError = qx::dao::save_with_relation_recursive(blog_tmp, qx::dao::save_mode::e_update_only);
   qAssert(! daoError.isValid());

   // Call 'age()' method with class name and method name (reflexion)
   //qx_bool bInvokeOk = qx::QxClassX::invoke("author", "age", author_1);
   //qAssert(bInvokeOk);

   // Test 'isDirty()' method
   qx::dao::ptr<blog> blog_isdirty = qx::dao::ptr<blog>(new blog());
   blog_isdirty->setblog_id(blog_1->getblog_id());
   daoError = qx::dao::fetch_by_id(blog_isdirty);
   qAssert(! daoError.isValid() && ! blog_isdirty.isDirty());

   blog_isdirty->settext("blog property 'text' modified => blog is dirty !!!");
   QStringList lstDiff; bool bDirty = blog_isdirty.isDirty(lstDiff);
   qAssert(bDirty && (lstDiff.count() == 1) && (lstDiff.at(0) == "text"));
   if (bDirty) { qDebug("[QxOrm] test dirty 1 : blog is dirty => '%s'", qPrintable(lstDiff.join("|"))); }

   // Update only property 'm_text' of 'blog_isdirty'
   daoError = qx::dao::update_optimized(blog_isdirty);
   qAssert(! daoError.isValid() && ! blog_isdirty.isDirty());
   qx::dump(blog_isdirty);

   // Test 'isDirty()' method with a container
   typedef qx::dao::ptr< QList<author_ptr> > type_lst_author_test_is_dirty;
   type_lst_author_test_is_dirty container_isdirty = type_lst_author_test_is_dirty(new QList<author_ptr>());
   daoError = qx::dao::fetch_all(container_isdirty);
   qAssert(! daoError.isValid() && ! container_isdirty.isDirty() && (container_isdirty->count() == 3));

   author_ptr author_ptr_dirty = container_isdirty->at(1);
   author_ptr_dirty->setlastname("author name modified at index 1 => container is dirty !!!");
   bDirty = container_isdirty.isDirty(lstDiff);
   qAssert(bDirty && (lstDiff.count() == 1));
   if (bDirty) { qDebug("[QxOrm] test dirty 2 : container is dirty => '%s'", qPrintable(lstDiff.join("|"))); }

   author_ptr_dirty = container_isdirty->at(2);
   author_ptr_dirty->setfirstname("firstname changed");
   bDirty = container_isdirty.isDirty(lstDiff);
   qAssert(bDirty && (lstDiff.count() == 2));
   if (bDirty) { qDebug("[QxOrm] test dirty 3 : container is dirty => '%s'", qPrintable(lstDiff.join("|"))); }

   // Update only property 'm_name' at position 1, only property 'm_birthdate' at position 2 and nothing at position 0
   daoError = qx::dao::update_optimized(container_isdirty);
   qAssert(! daoError.isValid() && ! container_isdirty.isDirty());
   qx::dump(container_isdirty);

   // Fetch only property 'm_text' of blog
   QStringList lstColumns = QStringList() << "text";
   QList<blog_ptr> lst_blog_with_only_text;
   daoError = qx::dao::fetch_all(lst_blog_with_only_text, NULL, lstColumns);
   qAssert(! daoError.isValid() && (lst_blog_with_only_text.size() > 0));
   if ((lst_blog_with_only_text.size() > 0) && (lst_blog_with_only_text[0].get() != NULL))
   { qAssert(lst_blog_with_only_text[0]->gettitle().isEmpty()); }
   qx::dump(lst_blog_with_only_text);

   // Dump all registered classes into QxOrm context (introspection engine)
   qx::QxClassX::dumpAllClasses();

   // Call a custom SQL query or a stored procedure
   qx_query testStoredProc("SELECT * FROM t_author");
   daoError = qx::dao::call_query(testStoredProc);
   qAssert(! daoError.isValid());
   testStoredProc.dumpSqlResult();

   // Call a custom SQL query or a stored procedure and fetch automatically properties (with a collection of items)
   qx_query testStoredProcBis("SELECT * FROM t_author");
   authorX.clear();
   daoError = qx::dao::execute_query(testStoredProcBis, authorX);
   qAssert(! daoError.isValid()); qAssert(authorX.count() > 0);
   qx::dump(authorX);

   // Call a custom SQL query or a stored procedure and fetch automatically properties
   qx_query testStoredProcThird("SELECT name, category_id FROM t_category");
   category_ptr category_tmp = category_ptr(new category());
   daoError = qx::dao::execute_query(testStoredProcThird, category_tmp);
   qAssert(! daoError.isValid()); qAssert(category_tmp->getcategory_id() != "");
   qx::dump(category_tmp);

   return 0;
}


Exporter en projet C++ de type model/view

La biblioth�que QxOrm fournit le module QxModelView. Une documentation sur le module QxModelView est disponible dans le manuel utilisateur de la biblioth�que QxOrm. Le module QxModelView permet d'utiliser le moteur model/view de Qt avec toutes les classes enregistr�es dans le contexte QxOrm :
  • QML : toute propri�t� enregistr�e dans le contexte QxOrm est accessible en QML : le module QxModelView permet ainsi de faciliter l'int�raction entre QML et les bases de donn�es ;
  • Qt widgets : utilisation de QTableView ou QListView par exemple pour afficher/modifier le contenu d'une table de la base de donn�es.

L'application QxEntityEditor permet de g�n�rer un projet C++ de type model/view complet et pr�t � �tre compil� : ainsi toutes les entit�s et leurs relations sont accessibles dans des vues QML par exemple.

Param�tres de l'export

Les param�tres de l'export C++ de type model/view sont accessibles par le menu principal : Tools >> Export to C++ model/view project (settings). Cet �cran de param�trage apparait automatiquement au 1er export si aucun param�tre n'a �t� enregistr� au niveau du projet. Lorsqu'un export C++ model/view a d�j� �t� r�alis�, alors cette fen�tre de param�trage est accessible uniquement par le menu principal : Tools >> Export to C++ model/view project (settings) :

Export C++ model/view

Cet �cran d'export est divis� en plusieurs sections :

-- Section C++ model/view export settings :
  • Champ � C++ model/view project location � : r�pertoire de destination qui contiendra tous les fichiers du projet C++ model/view g�n�r�. Il est possible de renseigner dans ce champ un chemin relatif par rapport au fichier projet *.qxee ;
  • Champ � C++ entities project location � : lecture seule uniquement, indique le r�pertoire de destination du projet C++ g�n�r� (entit�s enregistr�es dans le contexte QxOrm) dont d�pend le projet C++ model/view ;
  • Champ � Namespace for model/view � : espace de nom utilis� pour les classes C++ g�n�r�es de type model/view (ces classes impl�mentent l'interface qx::IxModel) ;
  • Champ � Generate custom files � : si coch�, le projet C++ g�n�r� contient un fichier personnalis� par entit�. Par d�faut, ces fichiers custom sont vides et ne seront jamais �cras�s par un nouvel export C++.

-- Section Custom script (Javascript file) to change the default behaviour of the export process : param�trage du moteur de personnalisation de l'export.
  • Champ � Custom script file � : chemin d'acc�s au fichier Javascript permettant de personnaliser l'export C++. Si vide, aucune personnalisation n'est appliqu�e (export par d�faut). Il est possible de renseigner dans ce champ un chemin relatif par rapport au fichier projet *.qxee, par exemple ./my_script.js si le fichier my_script.js se trouve dans le m�me r�pertoire que le fichier projet *.qxee ;
  • Bouton � Debug custom Javascript file � : si un fichier Javascript est d�fini, un clic sur ce bouton d�clenchera le mode d�bogage Javascript au prochain lancement d'export C++. Au lieu d'utiliser ce bouton, il est �galement possible d'activer le mode d�bogage Javascript en maintenant la touche SHIFT au moment de lancer un export C++.

-- Section C++ model/view template files : cette section d�finit le code C++ model/view pour les fichiers Header *.h et Source *.cpp. Le moteur d'export utilise des mots-cl� (placeholder sous la forme @@ACTION@@) pour remplacer le code par la valeur correspondante. Cette notion de placeholder est la base du moteur de personnalisation Javascript. Il est possible de renseigner des placeholder personnalis�s en prefixant par @@CUSTOM_, par exemple : @@CUSTOM_MY_ACTION@@.

Pr�sentation du projet g�n�r�

Le projet C++ model/view g�n�r� dispose de l'arborescence suivante :

Export C++ model/view output

  • le dossier � bin � est vide par d�faut, et contiendra le binaire compil� (*.dll sous Windows, *.so sous Linux, etc...) ;
  • le dossier � build � est vide par d�faut, il peut �tre utilis� pour produire les fichiers CMake ;
  • le dossier � custom � est aliment� si l'option � Generate custom files � est coch�e ;
  • le dossier � include � contient les d�finitions de tous les mod�les du projet ;
  • le dossier � src � contient les impl�mentations de tous les mod�les du projet ;
  • le fichier � CMakeLists.txt � peut �tre utilis� pour compiler le projet C++ avec CMake ;
  • les fichiers � *.gen.pri � et � *.gen.pro � peuvent �tre utilis�s pour compiler le projet C++ avec qmake ;

Exporter en projet C++ de type services

La biblioth�que QxOrm fournit le module QxService. Une documentation sur le module QxService est disponible dans le manuel utilisateur de la biblioth�que QxOrm. Le module QxService de la biblioth�que QxOrm permet de cr�er rapidement un serveur d'applications C++ performant (notion de services avec demande du client et r�ponse du serveur). Un tutoriel est disponible sur le site QxOrm afin de pr�senter un exemple d'utilisation du module QxService.

L'application QxEntityEditor permet de g�n�rer un projet C++ de type services (un projet C++ pour g�rer la couche cliente et un projet C++ pour publier les services c�t� serveur) complet et pr�t � �tre compil� : ainsi toutes les entit�s et leurs relations peuvent �tre transf�r�es sur le r�seau pour une application de type client/serveur.

Param�tres de l'export

Les param�tres de l'export C++ de type services sont accessibles par le menu principal : Tools >> Export to C++ services project (settings). Cet �cran de param�trage apparait automatiquement au 1er export si aucun param�tre n'a �t� enregistr� au niveau du projet. Lorsqu'un export C++ de type services a d�j� �t� r�alis�, alors cette fen�tre de param�trage est accessible uniquement par le menu principal : Tools >> Export to C++ services project (settings) :

Export C++ services

Cet �cran d'export est divis� en plusieurs sections :

-- Section C++ services export settings :
  • Champ � C++ services project location � : r�pertoire de destination qui contiendra tous les fichiers du projet C++ de type services g�n�r�. Il est possible de renseigner dans ce champ un chemin relatif par rapport au fichier projet *.qxee ;
  • Champ � C++ entities project location � : lecture seule uniquement, indique le r�pertoire de destination du projet C++ g�n�r� (entit�s enregistr�es dans le contexte QxOrm) dont d�pend le projet C++ services ;
  • Champ � Namespace for services � : espace de nom utilis� pour les classes C++ g�n�r�es de type services (ces classes permettent de transf�rer les entit�s sur le r�seau, couche cliente et serveur) ;
  • Champ � Generate custom files � : si coch�, le projet C++ g�n�r� contient un fichier personnalis� par entit�. Par d�faut, ces fichiers custom sont vides et ne seront jamais �cras�s par un nouvel export C++. Ces fichiers custom peuvent par exemple �tre utilis�s pour impl�menter des nouveaux services ;
  • Champ � Generate server application � : si coch�, un projet C++ d'exemple de type serveur d'applications est g�n�r� et permet de charger et publier les services c�t� serveur avec un syst�me de plugins ;
  • Champ � Server application location � : si l'option � Generate server application � est coch�e, d�fini le r�pertoire de destination du projet d'exemple serveur d'applications.

-- Section Custom script (Javascript file) to change the default behaviour of the export process : param�trage du moteur de personnalisation de l'export.
  • Champ � Custom script file � : chemin d'acc�s au fichier Javascript permettant de personnaliser l'export C++. Si vide, aucune personnalisation n'est appliqu�e (export par d�faut). Il est possible de renseigner dans ce champ un chemin relatif par rapport au fichier projet *.qxee, par exemple ./my_script.js si le fichier my_script.js se trouve dans le m�me r�pertoire que le fichier projet *.qxee ;
  • Bouton � Debug custom Javascript file � : si un fichier Javascript est d�fini, un clic sur ce bouton d�clenchera le mode d�bogage Javascript au prochain lancement d'export C++. Au lieu d'utiliser ce bouton, il est �galement possible d'activer le mode d�bogage Javascript en maintenant la touche SHIFT au moment de lancer un export C++.

-- Section C++ services template files : cette section d�finit le code C++ des services pour les fichiers Header *.h et Source *.cpp (client et serveur). Le moteur d'export utilise des mots-cl� (placeholder sous la forme @@ACTION@@) pour remplacer le code par la valeur correspondante. Cette notion de placeholder est la base du moteur de personnalisation Javascript. Il est possible de renseigner des placeholder personnalis�s en prefixant par @@CUSTOM_, par exemple : @@CUSTOM_MY_ACTION@@.
  • Option � Default � : si coch� (option par d�faut), g�n�re les services (couche cliente et serveur) par d�faut : les entit�s peuvent �tre transf�r�es sur le r�seau et les actions CRUD sur la base de donn�es sont support�es ;
  • Option � Custom � : si coch�, possibilit� de fournir son propre code C++ pour g�n�rer les services (il est cependant conseill� de commencer � copier/coller Header *.h et Source *.cpp de l'option par d�faut pour r�cup�rer les placeholder � utiliser).

Pr�sentation du projet g�n�r�

Le projet C++ de type services (client et serveur) g�n�r� dispose de l'arborescence suivante :

Export C++ services output

  • le dossier � bin � est vide par d�faut, et contiendra les binaires compil�s (*.dll sous Windows, *.so sous Linux, etc...) pour la partie cliente et serveur ;
  • le dossier � build � est vide par d�faut, il peut �tre utilis� pour produire les fichiers CMake ;
  • le dossier � client � contient les fichiers qmake et CMake pour compiler la couche cliente du projet ;
  • le dossier � custom � est aliment� si l'option � Generate custom files � est coch�e ;
  • le dossier � include � contient les d�finitions de tous les services du projet ;
  • le dossier � server � contient les fichiers qmake et CMake pour compiler la couche serveur du projet ;
  • le dossier � src � contient les impl�mentations de tous les services du projet ;
  • le fichier � CMakeLists.txt � peut �tre utilis� pour compiler le projet C++ (client et serveur) avec CMake ;
  • les fichiers � *.gen.pri � et � *.gen.pro � peuvent �tre utilis�s pour compiler le projet C++ (client et serveur) avec qmake ;
  • le fichier � *.gen.json � est utilis� par la couche serveur pour g�n�rer un plugin pouvant �tre charg� dynamiquement par le serveur d'applications.

Serveur d'applications g�n�rique

Si l'option � Generate server application � est coch�e, l'export C++ de type services g�n�re �galement un exemple de serveur d'applications g�n�rique pouvant publier des services en chargeant des plugins. Tout comme les autres projets C++ g�n�r�s par QxEntityEditor, le serveur d'applications g�n�rique peut �tre compil� qmake et CMake. Ce projet d'exemple dispose de l'arborescence suivante :

Export C++ services server app output

Une fois compil�, l'ex�cutable se trouve dans le dossier � bin �. Le lancement du serveur d'applications g�n�rique ouvre la fen�tre suivante :

Export C++ services server app

Cet �cran est divis� en plusieurs sections :

-- Section Plugins services :
  • Champ � Plugins path � : il est n�cessaire de d�finir le r�pertoire contenant les plugins � charger. Ces plugins correspondent � la couche serveur du projet C++ de type services. Une fois charg�, les plugins publient des services pouvant �tre appel�s par les applications clientes. Si aucun plugin n'est charg� apr�s la s�lection du r�pertoire, il est possible de d�finir la variable d'environnement QT_DEBUG_PLUGINS afin d'avoir des logs sur l'erreur de chargement de plugin (en g�n�ral, une d�pendance du plugin non trouv�).

-- Section Database connection parameters :
  • Cette section contient tous les param�tres n�cessaires pour initialiser la connexion � la base de donn�es utilis�e par les services (utilisation de la classe qx::QxSqlDatabase).

-- Section Server parameters :
  • Champ � Port number � : d�fini le n� de port utilis� par le serveur d'applications pour publier les services. Les applications clientes devront se connecter sur ce port pour effectuer des requ�tes au serveur ;
  • Champ � Thread count � : nombre de threads utilis�s par le serveur pour traiter les requ�tes provenant des applications clientes ;
  • Champ � Serialization type � : type de s�rialisation utilis� pour renvoyer les r�ponses du serveur au client ;
  • Champ � Compress data � : si coch�, les donn�es renvoy�es au client sont compress�es ;
  • Champ � Encrypt data � : si coch�, les donn�es renvoy�es au client sont crypt�es (possibilit� de d�finir une cl� de cryptage) ;
  • Bouton � Start server � : bouton permettant de d�marrer et arr�ter le serveur.

-- Section Log last client-server reply-request transaction :
  • Affiche dans un flux XML ou JSON les d�tails de la derni�re transaction client-serveur trait�e par le serveur d'applications.

-- Section Log last server error :
  • Si une erreur se produit sur le serveur d'applications, elle est automatiquement loggu�e dans cette section.

Exporter le sch�ma de base de donn�es SQL DDL

L'application QxEntityEditor permet de g�n�rer le sch�ma de base de donn�es dans un format DDL SQL. L'application QxEntityEditor supporte les bases de donn�es les plus fr�quemment utilis�es : SQLite, MySQL, MariaDB, PostgreSQL, Oracle et Microsoft SQL Server. Le script DDL SQL g�n�r� par QxEntityEditor peut �tre import� par la base de donn�es pour cr�er automatiquement toutes les tables, colonnes, cl�s primaires, relations, index, etc... Les param�tres de l'export DDL SQL sont accessibles par le menu principal : Tools >> Export to DDL SQL script file (settings) :

Export SQL DDL

Cet �cran d'export est divis� en plusieurs sections :

-- Section DDL export settings :
  • Champ � File location � : r�pertoire de destination qui contiendra le script DDL SQL g�n�r� ;
  • Champ � Database type � : type de base de donn�es qui sera utilis� pour importer le sch�ma DDL SQL (SQLite, MySQL, MariaDB, PostgreSQL, Oracle ou Microsoft SQL Server) ;
  • Champ � Relationships � : si coch�, des cl�s �trang�res (foreign keys) sont cr��es pour g�rer les relations entre entit�s ;
  • Champ � Schema � : d�fini le type d'export DDL : 1 fichier contenant toute la structure du projet *.qxee, ou bien 1 fichier par version du projet *.qxee (gestion de l'�volution du sch�ma de base de donn�es).

-- Section Mapping C++ type to database SQL type :
  • Liste permettant d'associer un type C++ (renseign� au niveau des propri�t�s du projet *.qxee) � un type SQL.

-- Section Custom script (Javascript file) to change the default behaviour of the export process : param�trage du moteur de personnalisation de l'export.
  • Champ � Custom script file � : chemin d'acc�s au fichier Javascript permettant de personnaliser l'export DDL. Si vide, aucune personnalisation n'est appliqu�e (export par d�faut). Il est possible de renseigner dans ce champ un chemin relatif par rapport au fichier projet *.qxee, par exemple ./my_script.js si le fichier my_script.js se trouve dans le m�me r�pertoire que le fichier projet *.qxee ;
  • Bouton � Debug custom Javascript file � : si un fichier Javascript est d�fini, un clic sur ce bouton d�clenchera le mode d�bogage Javascript au prochain lancement d'export DDL. Au lieu d'utiliser ce bouton, il est �galement possible d'activer le mode d�bogage Javascript en maintenant la touche SHIFT au moment de lancer un export DDL.

Imprimer le diagramme d'entit�s

L'application QxEntityEditor permet d'imprimer le diagramme d'entit�s dans un format PNG et/ou PDF. Les param�tres d'impression sont accessibles par le menu principal : Tools >> Print the entities diagram (settings) :

Export print PNG/PDF

Exporter le projet dans un r�pertoire associ� � un gestionnaire de code source (Git, Perforce, CVS, etc.)

Un projet QxEntityEditor (fichier *.qxee) peut �tre g�r� par une �quipe de d�veloppeurs : le code source d'un projet QxEntityEditor peut �tre export�/import� (manuellement ou en ligne de commande) avec les plugins QxEESourceControlExport et QxEESourceControlImport.

Associ� � un gestionnaire de code source (Git, Perforce, CVS, etc.), ces 2 plugins permettent ainsi :
  • plusieurs personnes peuvent travailler simultan�ment sur un m�me projet ;
  • un projet peut facilement �tre versionn� dans le gestionnaire de code source ;
  • chaque �l�ment d'un projet peut �tre compar� (diff�rence entre 2 versions d'une m�me entit� par exemple).
Voici un exemple d'utilisation des plugins QxEESourceControlExport et QxEESourceControlImport, avec 2 d�veloppeurs nomm�s 'dev A' et 'dev B' (l'exemple pouvant �tre �tendu � X d�veloppeurs) :
  • dev A et dev B travaillent sur un m�me projet QxEntityEditor (fichier *.qxee) ;
  • dev A cr��/modifie/supprime certaines entit�s dans l'application QxEntityEditor ;
  • dev B cr��/modifie/supprime d'autres entit�s dans l'application QxEntityEditor ;
  • dev A et dev B exportent le projet *.qxee en utilisant le plugin QxEESourceControlExport (manuellement ou en ligne de commande) ;
  • une fois le projet export� dans un r�pertoire, dev A et dev B enregistrent (check-in ou submit) les fichiers JSON g�n�r�s dans le gestionnaire de code source (Git, Perforce, CVS, etc.) sur leur propre branche de travail ;
  • depuis le gestionnaire de code source, dev A et dev B int�grent (merge ou integrate) leur branche de travail sur la branche de d�veloppement DEV (ou MAIN ou MASTER ou LATEST); Remarque : m�me si il y a des conflits � r�soudre, ils seront simples � corriger car le format JSON est lisible facilement ;
  • dev A et dev B peuvent � pr�sent obtenir la derni�re version des fichiers JSON (get latest depuis le gestionnaire de code source) � partir de la branche DEV (ou MAIN ou MASTER ou LATEST) : les fichiers JSON obtenus contiennent � la fois les modifications de dev A et dev B ;
  • dev A et dev B peuvent importer ces fichiers JSON dans l'application QxEntityEditor en utilisant le plugin d'import QxEESourceControlImport (manuellement ou en ligne de commande).
Les param�tres du plugin d'export sont accessibles depuis le menu principal Tools >> Export to Source Control repository (Git, Perforce, CVS, etc.) as JSON files (settings) :

Source Control export plugin settings

Le param�tre � renseigner correspond au r�pertoire dans lequel seront g�n�r�s les fichiers JSON.
Chaque �l�ment du projet *.qxee (entit�s, propri�t�s, relations, commentaires, etc.) est export� dans un fichier JSON sp�cifique.
Le r�pertoire o� sont export�s les fichiers JSON a la structure suivante :

Source Control output directory

Remarque : il est possible d'exporter un projet en ligne de commande sans d�marrer l'interface utilisateur de l'application QxEntityEditor.
Exemple de ligne de commande :
QxEntityEditor --no_gui --project="<path_to_your_qxee_project_file>" --plugin=QxEESourceControlExport --QxEESourceControlExport_path="<path_to_your_export_output_directory>"


Exporter le projet sous format XML ou JSON

Remarque : pour travailler avec un gestionnaire de code source (Git, Perforce, CVS, etc.), il est conseill� d'utiliser les plugins QxEESourceControlExport et QxEESourceControlImport (au lieu de cr�er un fichier unique).

L'application QxEntityEditor permet d'exporter l'int�gralit� d'un projet *.qxee dans un format XML ou JSON. Les param�tres d'export XML/JSON sont accessibles par le menu principal : Tools >> Export to XML or JSON file (settings) :

Export XML/JSON

Remarque : un export XML ne peut pas �tre import� dans un projet *.qxee. Par contre, un fichier JSON peut �tre utilis� pour importer les donn�es dans un projet *.qxee en utilisant le plugin d'import : Importer un projet � partir d'un fichier texte au format JSON.

Moteur Javascript pour personnaliser les exports

L'application QxEntityEditor fournit un puissant moteur de personnalisation des exports. Ce moteur utilise le langage Javascript pour �crire des scripts pour personnaliser les exports. Ces scripts Javascript ont acc�s � l'ensemble des param�tres d'un projet *.qxee, et peuvent �tre d�bogu�s � l'aide d'un d�bogueur int�gr� � QxEntityEditor. Il est �galement possible d'�crire de nouveaux fichiers lors des exports.

Remarque : le dossier ./samples/ du package QxEntityEditor fournit 2 exemples de scripts document�s : custom_script.js et q_property.js.

Architecture et fonctionnement du moteur de personnalisation Javascript

Tous les plugins d'export de l'application QxEntityEditor dispose d'un param�trage nomm� : Custom script (Javascript file) to change the default behaviour of the export process. Il est ainsi possible de param�trer un script Javascript utilis� au moment de l'export. Le moteur d'export utilise des mots-cl� (placeholder sous la forme @@ACTION@@) pour remplacer le code par la valeur correspondante. Cette notion de placeholder est la base du moteur de personnalisation Javascript. Il est possible de renseigner des placeholder personnalis�s en prefixant par @@CUSTOM_, par exemple : @@CUSTOM_MY_ACTION@@. Lors d'un export, l'application QxEntityEditor parcourt la liste de toutes les entit�s d�finies dans le projet *.qxee. Chaque fois qu'un placeholder (sous la forme @@ACTION@@) est rencontr�, le script Javascript est appel� avec tous les param�tres n�cessaires pour effectuer ou non une personnalisation.

Voici un exemple de script Javascript minimal. Ce script ne fait rien, il permet de montrer uniquement la structure minimale d'un Javascript valide pour QxEntityEditor :
({

// Here is the entry point of the QxEntityEditor javascript engine
// This function is called for each placeholder defined in the C++ template section
customProcess : function(params)
{
   try
   {
      // quit with 'params[0]' means : doesn't change the default export behaviour
      return params[0];
   }
   catch (err)
   { return ("[CustomScriptError] an unexpected error occurred : " + err); }
}

});


Liste des param�tres d'appel du moteur Javascript

Le param�tre d'entr�e params de la fonction customProcess() est un tableau contenant une liste de valeurs (ce qui correspond au contexte d'appel du script). Voici un exemple de fonction qui peut �tre utilis�e dans vos scripts pour lister et donner une signification aux valeurs d'entr�e :

function printParams(params)
{
   var log = "";
   log = log + "\n - default_value = " + params[0];
   log = log + "\n - project_name = " + params[1];
   log = log + "\n - project_file = " + params[2];
   log = log + "\n - plugin_name = " + params[3];
   log = log + "\n - current_file = " + params[4];
   log = log + "\n - action (or placeholder) = " + params[5];
   log = log + "\n - entity_name = " + params[6];
   log = log + "\n - entity_table_name = " + params[7];
   log = log + "\n - property_name = " + params[8];
   log = log + "\n - property_type = " + params[9];
   log = log + "\n - property_column_name = " + params[10];
   log = log + "\n - property_is_primary_key = " + params[11];
   log = log + "\n - enumeration_name = " + params[12];
   log = log + "\n - entity_id = " + params[13];
   log = log + "\n - property_id = " + params[14];
   log = log + "\n - enumeration_id = " + params[15];
   log = log + "\n - output_location = " + params[16];

   print(log); // print value to the custom script debugger window
   helper.print(log); // print value to the standard output (for example, on Windows, use the 'DebugView' application to see all logs)
   return log;
}


Fonctions disponibles par Javascript

Le moteur de personnalisation des exports de QxEntityEditor supporte toutes les fonctionnalit�s du langage Javascript (ECMAScript 5). L'application QxEntityEditor fournit en plus une instance d'objet nomm�e helper qui peut �tre utilis�e pour acc�der � de nouvelles fonctionnalit�s. Nous allons lister dans ce chapitre les cas d'usage les plus couramment utilis�s pour personnaliser les exports.

Obtenir les informations associ�es � une entit�

Voici comment r�cup�rer le param�trage de l'entit� courante, helper.getEntityDetails(entity_id) :

var entity_id = params[13];
printEntityDetails(entity_id);

//...

function printEntityDetails(entity_id)
{
   var details = helper.getEntityDetails(entity_id);
   if (details.length == 0) { return details; }

   var log = "";
   log = log + "\n - entity_id = " + details[0];
   log = log + "\n - entity_key = " + details[1];
   log = log + "\n - entity_name = " + details[2];
   log = log + "\n - entity_namespace = " + details[3];
   log = log + "\n - entity_tablename = " + details[4];
   log = log + "\n - entity_description = " + details[5];
   log = log + "\n - entity_is_read_only = " + details[6];
   log = log + "\n - entity_is_abstract = " + details[7];
   log = log + "\n - entity_version = " + details[8];
   log = log + "\n - entity_primary_key_property_id = " + details[9];
   log = log + "\n - entity_list_of_properties_id = " + details[10];
   log = log + "\n - entity_has_triggers = " + details[11];
   log = log + "\n - entity_trigger_on_before_fetch = " + details[12];
   log = log + "\n - entity_trigger_on_after_fetch = " + details[13];
   log = log + "\n - entity_trigger_on_before_insert = " + details[14];
   log = log + "\n - entity_trigger_on_after_insert = " + details[15];
   log = log + "\n - entity_trigger_on_before_update = " + details[16];
   log = log + "\n - entity_trigger_on_after_update = " + details[17];
   log = log + "\n - entity_trigger_on_before_delete = " + details[18];
   log = log + "\n - entity_trigger_on_after_delete = " + details[19];
   log = log + "\n - entity_parent_id = " + details[20];
   log = log + "\n - entity_soft_delete_column = " + details[21];
   log = log + "\n - entity_validator_method = " + details[22];

   print(log); // print value to the custom script debugger window
   helper.print(log); // print value to the standard output (for example, on Windows, use the 'DebugView' application to see all logs)
   return details;
}


Parcourir la liste des propri�t�s d'une entit�

Voici comment parcourir la liste des propri�t�s de l'entit� courante :

var entity_id = params[13];
var entity_details = helper.getEntityDetails(entity_id);
var entity_list_of_properties_id = ((entity_details.length > 0) ? entity_details[10] : "");
var entity_list_of_properties_array = entity_list_of_properties_id.split("|");
for (var idx = 0; idx < entity_list_of_properties_array.length; idx++)
{
   var property_id = entity_list_of_properties_array[idx];
   var property_details = helper.getPropertyDetails(property_id);
   // ...
}


Obtenir les informations associ�es � une propri�t�

Voici comment r�cup�rer le param�trage d'une propri�t�, helper.getPropertyDetails(property_id) :

function printPropertyDetails(property_id)
{
   var details = helper.getPropertyDetails(property_id);
   if (details.length == 0) { return details; }

   var log = "";
   log = log + "\n - property_id = " + details[0];
   log = log + "\n - property_key = " + details[1];
   log = log + "\n - property_name = " + details[2];
   log = log + "\n - property_column_name = " + details[3];
   log = log + "\n - property_description = " + details[4];
   log = log + "\n - property_type = " + details[5];
   log = log + "\n - property_version = " + details[6];
   log = log + "\n - property_entity_id = " + details[7];
   log = log + "\n - property_is_read_only = " + details[8];
   log = log + "\n - property_is_primary_key = " + details[9];
   log = log + "\n - property_is_serializable = " + details[10];
   log = log + "\n - property_is_transient = " + details[11];
   log = log + "\n - property_is_obsolete = " + details[12];
   log = log + "\n - property_is_index = " + details[13];
   log = log + "\n - property_is_unique = " + details[14];
   log = log + "\n - property_allow_null = " + details[15];
   log = log + "\n - property_order_level = " + details[16];
   log = log + "\n - property_default_value = " + details[17];
   log = log + "\n - property_format = " + details[18];
   log = log + "\n - property_force_sql_type = " + details[19];
   log = log + "\n - property_force_sql_alias = " + details[20];
   log = log + "\n - property_min_value = " + details[21];
   log = log + "\n - property_max_value = " + details[22];
   log = log + "\n - property_min_length = " + details[23];
   log = log + "\n - property_max_length = " + details[24];
   log = log + "\n - property_reg_exp = " + details[25];
   log = log + "\n - property_accessibility = " + details[26];
   log = log + "\n - property_is_relationship = " + details[27];
   log = log + "\n - property_relation_type = " + details[28];
   log = log + "\n - property_relation_entity_target_id = " + details[29];
   log = log + "\n - property_relation_inverse_property_id = " + details[30];
   log = log + "\n - property_relation_foreign_key = " + details[31];
   log = log + "\n - property_relation_foreign_key_owner = " + details[32];
   log = log + "\n - property_relation_extra_table = " + details[33];
   log = log + "\n - property_relation_type_desc = " + details[34];

   print(log); // print value to the custom script debugger window
   helper.print(log); // print value to the standard output (for example, on Windows, use the 'DebugView' application to see all logs)
   return details;
}


Obtenir les informations associ�es � une �num�ration

Voici comment r�cup�rer le param�trage de l'�num�ration courante, helper.getEnumerationDetails(enumeration_id) :

var enumeration_id = params[15];
printEnumerationDetails(enumeration_id);

//...

function printEnumerationDetails(enumeration_id)
{
   var details = helper.getEnumerationDetails(enumeration_id);
   if (details.length == 0) { return details; }

   var log = "";
   log = log + "\n - enumeration_id = " + details[0];
   log = log + "\n - enumeration_key = " + details[1];
   log = log + "\n - enumeration_name = " + details[2];
   log = log + "\n - enumeration_namespace = " + details[3];
   log = log + "\n - enumeration_description = " + details[4];
   log = log + "\n - enumeration_version = " + details[5];
   log = log + "\n - enumeration_use_qt_enum_macro = " + details[6];
   log = log + "\n - enumeration_list_of_keys = " + details[7];
   log = log + "\n - enumeration_list_of_values = " + details[8];

   print(log); // print value to the custom script debugger window
   helper.print(log); // print value to the standard output (for example, on Windows, use the 'DebugView' application to see all logs)
   return details;
}


Acc�s aux m�ta-donn�es d'une entit�/propri�t�/�num�ration

L'application QxEntityEditor permet de d�finir des m�ta-donn�es li�es � une entit�, propri�t� ou �num�ration. Ces m�ta-donn�es peuvent �tre utilis�es par exemple pour d�finir du param�trage suppl�mentaire non fourni par d�faut par QxEntityEditor. Ces m�ta-donn�es sont accessibles dans le code C++ g�n�r� (moteur d'introspection de la biblioth�que QxOrm), et sont accessibles �galement dans le moteur Javascript de QxEntityEditor. Voici comment r�cup�rer des m�ta-donn�es en Javascript :

var entity_id = params[13];
var entity_meta_data = helper.getEntityMetaData(entity_id, "MY_ENTITY_META_DATA_KEY");

// ...

var property_meta_data = helper.getPropertyMetaData(property_id, "MY_PROPERTY_META_DATA_KEY");

// ...

var enumeration_id = params[15];
var enumeration_meta_data = helper.getEnumerationMetaData(enumeration_id, "MY_ENUM_META_DATA_KEY");


Acc�der aux variables d'environnement

Voici comment acc�der aux variables d'environnement, helper.getEnvironmentVariable() et helper.setEnvironmentVariable() :

var env_var = helper.getEnvironmentVariable("QT_DIR");
var set_env_var_ok = helper.setEnvironmentVariable("MY_ENV_VAR", "my_value");


Gestion des fichiers : lecture et �criture

Le moteur de personnalisation des exports Javascript de QxEntityEditor permet de lire des fichiers, et permet d'�crire dans des fichiers. Les classes Javascript file et dir permettent d'instancier des objets Javascript pour effectuer des traitements sur les fichiers.

La classe file propose la m�me d�finition que la classe Qt QFile :

/*
   --- 'file' class methods available by script (QFile wrapper : http://doc.qt.io/qt-5/qfile.html) ---

   bool copy(string fileName, string newName);
   bool exists(string fileName);
   bool link(string fileName, string linkName);
   bool remove(string fileName);
   bool rename(string oldName, string newName);
   string readAll(string fileName);

   void setFileName(string name);
   string fileName();
   bool open(int mode); // enum QIODevice::OpenMode, for example : 26 = (QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text) = (2 + 8 + 16)
   int error(); // enum QFile::FileError
   void close();
   bool atEnd();
   string readLine();
   void write(string text);
*/


La classe dir propose la m�me d�finition que la classe Qt QDir :

/*
   --- 'dir' class methods available by script (QDir wrapper : http://doc.qt.io/qt-5/qdir.html) ---

   void setPath(string path);
   string path();
   string appPath();
   string homePath();
   string rootPath();
   string tempPath();

   string fromNativeSeparators(string pathName);
   string toNativeSeparators(string pathName);

   string cleanPath(string path);
   bool isAbsolutePath(string path);
   bool isRelativePath(string path);
   bool match(string filter, string fileName);

   bool mkdir(string dirName);
   bool mkpath(string dirPath);
   bool rmdir(string dirName);
   bool rmpath(string dirPath);
   bool exists(string name);

   bool cdUp();
   bool cd(string dirName);
   string absoluteFilePath(string fileName);
   string absolutePath();
   string canonicalPath();
   string dirName();
   string filePath(string fileName);
   void refresh();
   string relativeFilePath(string fileName);

   bool isAbsolute();
   bool isReadable();
   bool isRelative();
   bool isRoot();
*/


Exemple : lire le contenu d'un fichier :

var f1 = new file();
var f1_content = f1.readAll("C:\\Temp\\my_file.txt");


Autre exemple : �crire dans un fichier :

var f2 = new file();
f2.setFileName("C:\\Temp\\file_generated_by_script.txt");
f2.open(26); // (QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text) = (2 + 8 + 16)
f2.write("aaa");
f2.write("bbb");
f2.close();


Obtenir la liste des toutes les entit�s/�num�rations d'un projet

Voici comment r�cup�rer la liste de toutes les entit�s et �num�rations d'un projet *.qxee :

var listOfAllEntities = helper.getListOfAllEntities(); // 'listOfAllEntities' variable is an array, each item of this array contains : <entity_id>|<entity_name>
var listOfAllEnums = helper.getListOfAllEnums(); // 'listOfAllEnums' variable is an array, each item of this array contains : <enum_id>|<enum_name>


R�cup�rer le param�trage de l'application (niveau global, projet et plugin)

Voici comment r�cup�rer tout le param�trage d�fini au niveau de l'application (au format JSON) :
var globalSettings = helper.getQxEEGlobalSettingsJson();    // the result is a string in JSON format ==> so just use JSON.parse() function to get a javascript object instance
var projectSettings = helper.getQxEEProjectSettingsJson();  // the result is a string in JSON format ==> so just use JSON.parse() function to get a javascript object instance
var pluginSettings = helper.getQxEEPluginSetingsJson();     // the result is a string in JSON format ==> so just use JSON.parse() function to get a javascript object instance

print(globalSettings); helper.print(globalSettings);
print(projectSettings); helper.print(projectSettings);
print(pluginSettings); helper.print(pluginSettings);

globalSettings = JSON.parse(globalSettings);    // Now 'globalSettings' is a javascript object instance
projectSettings = JSON.parse(projectSettings);  // Now 'projectSettings' is a javascript object instance
pluginSettings = JSON.parse(pluginSettings);    // Now 'pluginSettings' is a javascript object instance


Ajout d'une action (placeholder) personnalis�e dans le template d'export C++

Les plugins d'export C++ disposent d'un param�tre permettant de d�finir le code source des fichiers Header *.h et Source *.cpp. L'application QxEntityEditor propose plusieurs template par d�faut, et il est possible d'�crire son propre template (option � Custom). Cette d�finition des fichiers Header *.h et Source *.cpp utilisent des mots-cl� (placeholder sous la forme @@ACTION@@) pour remplacer le code par la valeur correspondante. Cette notion de placeholder est la base du moteur de personnalisation Javascript. Il est possible de renseigner des placeholder personnalis�s en prefixant par @@CUSTOM_, par exemple : @@CUSTOM_MY_ACTION@@.

Voici comment tester le code action courant (placeholder) dans le moteur Javascript :

/* you can define your own placeholder in the template, it must start with @@CUSTOM_, for example : @@CUSTOM_MY_ACTION@@ ==> then, in the custom script, check if you are processing your custom action with this code : */
var action = params[5];
if (action == "CUSTOM_MY_ACTION")
{
   return "quit with my custom code here";
}


Exemple de script : ajout automatique de la d�finition Q_PROPERTY sur les propri�t�s C++ g�n�r�es

Voici un exemple de script document� (fourni dans le dossier ./samples/q_property.js du package QxEntityEditor) pour montrer comment ajouter automatiquement la d�finition Q_PROPERTY pour chacune des propri�t�s du projet *.qxee :

({

/* ----------------------------------------------------------------------------------------
   ----------------------------------------------------------------------------------------
   'q_property.js' : custom javascript file to customize QxEntityEditor C++ export process.
   This script is an example to show how to use QxEntityEditor javascript engine to add a Q_PROPERTY definition for each property generated by QxEntityEditor.
   More details about Q_PROPERTY macro on Qt web site : http://doc.qt.io/qt-5/properties.html

   To use this javascript file :
      1- go to the main menu of QxEntityEditor 'Tools >> Export to C++ project (settings)' ;
      2- select the C++ template 'qx::IxPersistable + QObject' : now generated entities will inherit from QObject, which is required to use the Qt Q_PROPERTY macro ;
      3- in the field 'Custom script file' : put the location of this 'q_property.js' custom javascript file ;
      4- save the settings and start the C++ export process ;
      5- check generated files : Q_PROPERTY should be added automatically by the export process.
   ----------------------------------------------------------------------------------------
   ---------------------------------------------------------------------------------------- */

// Here is the entry point of the QxEntityEditor javascript engine
// This function is called for each placeholder defined in the C++ template section
customProcess : function(params)
{
   try
   {
      // We use here the @@MACRO_QX_PERSISTABLE_HPP@@ placeholder which is present in the default C++ template 'qx::IxPersistable + QObject'
      // You could also create your own custom C++ template (based on 'qx::IxPersistable + QObject' template), and create your own placeholder (which must be prefixed by @@CUSTOM_), for example : @@CUSTOM_Q_PROPERTY@@
      var action = params[5];
      if (action != "MACRO_QX_PERSISTABLE_HPP") { return params[0]; } // quit with 'params[0]' means : doesn't change the default export behaviour

      // Check if we have an entity
      var entity_id = params[13];
      if ((entity_id == "") || (entity_id == "0")) { return params[0]; } // quit with 'params[0]' means : doesn't change the default export behaviour

      // Get the list of properties
      var entity_details = helper.getEntityDetails(entity_id);
      var entity_list_of_properties_id = ((entity_details.length > 0) ? entity_details[10] : "");
      var entity_list_of_properties_array = entity_list_of_properties_id.split("|");
      if (entity_list_of_properties_array.length <= 0) { return params[0]; } // quit with 'params[0]' means : doesn't change the default export behaviour

      // Prepare output string
      var output = params[0] + "\n";

      // Iterate over each property
      for (var idx = 0; idx < entity_list_of_properties_array.length; idx++)
      {
         // Get property details
         var property_id = entity_list_of_properties_array[idx];
         var property_details = helper.getPropertyDetails(property_id);

         // Here you could also get property meta-data that you can define in QxEntityEditor, property parameters screen, section 'List of meta-data'
         // This is a way to manage your own property parameters which are not a part of QxEntityEditor
         // It could be useful for example to manage some Q_PROPERTY settings like : RESET, NOTIFY, REVISION, DESIGNABLE, SCRIPTABLE, FINAL, etc...
         // To get a property meta-data value, just write this code : var my_meta_data = helper.getPropertyMetaData(property_id, "MY_META_DATA_KEY");

         // Get property type and name
         var property_type = property_details[5];
         var property_name = property_details[2];

         // Check if property type can be used with Q_PROPERTY macro
         if (list_of_compatible_property_type.indexOf(property_type) == -1) { continue; }

         // Create Q_PROPERTY definition
         output += "\n   Q_PROPERTY(" + property_type + " " + property_name + " READ get" + property_name + " WRITE set" + property_name + ")";
      }

      return output;
   }
   catch (err)
   { return ("[CustomScriptError] an unexpected error occurred : " + err); }
}

});

// Here is a list of C++ types compatible with Qt Q_PROPERTY macro (C++ type can be converted to/from QVariant)
// You can of course register your own C++ types to be able to use them with Q_PROPERTY macro (using Qt Q_DECLARE_METATYPE() macro)
// So the following array is not fixed : you can add all C++ types you want...
var list_of_compatible_property_type = [ "QBitArray", "QBitmap", "bool", "QBrush", "QByteArray", "QChar", "QColor", "QDate", "QDateTime", "double", 
                                         "QUuid", "QFont", "QVariantHash", "QIcon", "QImage", "int", "QLine", "QLineF", "QVariantList", "qlonglong", 
                                         "QVariantMap", "QMatrix", "QMatrix4x4", "QPixmap", "QPoint", "QPointF", "QPolygon", "QPolygonF", "QRect", "QRectF", 
                                         "QRegExp", "QRegion", "QSize", "QSizeF", "QString", "QStringList", "QTime", "uint", "qulonglong", "QUrl", 
                                         "QVector2D", "QVector3D", "QVector4D" ];


Activation du d�bogueur Javascript int�gr�

Le moteur Javascript de personnalisation des exports de QxEntityEditor int�gre un d�bogueur. Cet environnement de d�bogage dispose de toutes les fonctionnalit�s n�cessaires pour vous aider � d�velopper et corriger vos scripts :
  • d�finition de points d'arr�t (breakpoints) ;
  • mode pas � pas pour passer d'une ligne de code � une autre pendant l'ex�cution du script ;
  • visualisation des variables et de leur valeur au fil de l'ex�cution ;
  • affichage d'une fen�tre de logs.

Par d�faut, le d�bogueur est d�sactiv� lors d'un export. Pour l'activer et afficher l'�cran suivant, vous devez :
  • aller dans les param�tres d'export, d�finir un script � utiliser, puis cliquer sur le bouton � Debug custom Javascript file � ;
  • ou bien maintenir la touche SHIFT au lancement d'un export.

JS debug

Ex�cution de scripts personnalis�s avant/apr�s ex�cution d'un plugin

L'application QxEntityEditor permet de d�finir des scripts de type *.bat (Windows), *.sh (Linux) ou m�me des ex�cutables � lancer avant ou apr�s ex�cution d'un plugin QxEntityEditor. Chaque script (ou processus) est appel� avec un param�tre d'entr�e : le chemin d'acc�s au fichier projet *.qxee. Cette fonctionnalit� peut �tre utilis�e par exemple pour :
  • int�grer les fichiers g�n�r�s par un export QxEntityEditor dans un gestionnaire de code source (Git, Perforce, CVS, etc...) ;
  • d�marrer la compilation d'un projet C++ g�n�r� par QxEntityEditor ;
  • ex�cuter des tests unitaires ou bien lancer une int�gration continue avec un serveur Jenkins par exemple ;
  • modifier des valeurs dans la base de donn�es SQLite d'un projet *.qxee suite � un import de base de donn�es.

Pour d�finir les scripts ou ex�cutables � lancer suite � un processus d'import ou d'export de QxEntityEditor, aller dans le menu principal : Tools >> Plugins scripts.

Plugin scripts

Remarque : pour d�finir un script � ex�cuter dans cette liste, il est possible de renseigner le chemin d'acc�s absolu au script, ou bien un chemin relatif par rapport au projet *.qxee. Par exemple, en mettant le chemin relatif ./my_script.sh, le fichier my_script.sh doit se trouver dans le m�me r�pertoire que le fichier projet *.qxee de QxEntityEditor.

Ex�cuter QxEntityEditor en ligne de commande

L'application QxEntityEditor peut �tre d�marr�e en ligne de commande. Nous allons d�tailler dans ce chapitre quelques exemples d'appels :


-- Exemple n�1 : d�marrer QxEntityEditor en sp�cifiant un projet *.qxee � charger (param�tre --project) :
QxEntityEditor --project="c:\test\qxBlog.qxee"


-- Exemple n�2 : d�marrer QxEntityEditor sans afficher l'interface graphique (param�tre --no_gui), en sp�cifiant un projet *.qxee � charger (param�tre --project) et en d�marrant automatiquement un processus d'export C++ (param�tre --plugin) :
QxEntityEditor --no_gui --project="c:\test\qxBlog.qxee" --plugin=QxEECppExport


-- Exemple n�3 : d�marrer QxEntityEditor en mode visionneuse (param�tre --viewer_mode), ce mode permet d'ouvrir QxEntityEditor en mode lecture seule et permet de charger des projets *.qxee sans cl� de licence :
QxEntityEditor --viewer_mode


-- Exemple n�4 : d�marrer QxEntityEditor avec affichage des logs SQL (param�tre --log_sql), ce param�tre permet de tracer toutes les requ�tes SQL effectu�es sur la base de donn�es SQLite du projet *.qxee :
QxEntityEditor --log_sql


-- Exemple n�5 : d�marrer QxEntityEditor en chargeant un projet *.qxee � partir d'un fichier JSON :
QxEntityEditor --project="<path_to_your_qxee_project_file>" --plugin=QxEEJsonImport --QxEEJsonImport_file="<path_to_your_json_file>"


-- Exemple n�6 : afficher la documentation de tous les param�tres en ligne de commande :
QxEntityEditor --?

Ce qui produit le r�sultat suivant :
*** QxEntityEditor 1.2.5 application global command line parameters ***

  --project="<full path to *.qxee project file>" : run QxEntityEditor defining a *.qxee project to load at startup
  --no_gui : run QxEntityEditor without displaying the user interface
  --viewer_mode : run QxEntityEditor in read-only mode, this parameter can be used to open large *.qxee projects without any registered license key
  --log_sql : run QxEntityEditor tracing all SQL logs, this parameter logs all SQL queries executed to *.qxee SQLite database
  --font : define application font (due to issues since macOS Catalina 10.15) with syntax <family>||<pointSize>||<weight>||<italic> (only <family> is required), for example : Courier New||14
  --style_sheet : define application style sheet (more details here : https://doc.qt.io/qt-5/stylesheet-reference.html), for example : QWidget { background-color: black }
  --plugin=<plugin name> : run QxEntityEditor and execute automatically a plugin process (see below for specific parameters per plugin)

*** Import plugin QxEEJsonImport ***

  --QxEEJsonImport_file="<full path to your json file>" : [Required] run QxEntityEditor loading a *.qxee project from a JSON file

*** Import plugin QxEEMySQLImport ***

  --QxEEMySQLImport_db_ip="<DB IP>" : [Required] Database server address (IP)
  --QxEEMySQLImport_db_port="<DB port>" : [Required] Port number to connect to database
  --QxEEMySQLImport_db_name="<DB name>" : [Required] Database name
  --QxEEMySQLImport_filter_regexp="<Regular Expression>" : [Optional] Filter to select tables from database to import
  --QxEEMySQLImport_login="<DB Login>" : [Optional] Login to connect to database
  --QxEEMySQLImport_pwd="<DB Password>" : [Optional] Password to connect to database
  --QxEEMySQLImport_namespace="<Namespace>" : [Optional] C++ namespace where imported classes will be located
  --QxEEMySQLImport_delete_namespace=0/1 : [Optional] Delete all entities in the namespace before importing
  --QxEEMySQLImport_import_comment=0/1 : [Optional] Import tables/columns comment to entities/properties description
  --QxEEMySQLImport_import_default_value=0/1 : [Optional] Import columns default value
  --QxEEMySQLImport_boost_optional=0/1 : [Optional] Add boost::optional<T> decoration if a column definition allows NULL value
  --QxEEMySQLImport_organize_diagram=0/1 : [Optional] Organize diagram layout after import process
  --QxEEMySQLImport_relation_decoration=<numeric value> : [Optional] Decoration used for relationships (0=no decoration, 1=boost::shared_ptr, 2=QSharedPointer, 5=std::shared_ptr)
  --QxEEMySQLImport_relation_collection=<numeric value> : [Optional] Collection used for relationships (1=qx::QxCollection, 2=std::vector, 3=std::list, 8=QHash, 10=QList)
  --QxEEMySQLImport_mapping_sql_to_cpp="sql1~cpp1;sql2~cpp2;etc..." : [Optional] List of mappings from SQL type to C++ type
  --QxEEMySQLImport_verbose=0/1 : [Optional] Display more details during the import process

*** Import plugin QxEEOdbcImport ***

  --QxEEOdbcImport_dsn="<ODBC DSN>" : [Required] ODBC DSN to connect to database
  --QxEEOdbcImport_db_type=<numeric value> : [Required] Database engine type (0=generic, 1=postgresql, 2=mysql, 3=oracle, 4=mssqlserver, 5=sqlite)
  --QxEEOdbcImport_filter_regexp="<Regular Expression>" : [Optional] Filter to select tables from database to import
  --QxEEOdbcImport_login="<DB Login>" : [Optional] Login to connect to database
  --QxEEOdbcImport_pwd="<DB Password>" : [Optional] Password to connect to database
  --QxEEOdbcImport_namespace="<Namespace>" : [Optional] C++ namespace where imported classes will be located
  --QxEEOdbcImport_delete_namespace=0/1 : [Optional] Delete all entities in the namespace before importing
  --QxEEOdbcImport_import_comment=0/1 : [Optional] Import tables/columns comment to entities/properties description
  --QxEEOdbcImport_import_default_value=0/1 : [Optional] Import columns default value
  --QxEEOdbcImport_boost_optional=0/1 : [Optional] Add boost::optional<T> decoration if a column definition allows NULL value
  --QxEEOdbcImport_organize_diagram=0/1 : [Optional] Organize diagram layout after import process
  --QxEEOdbcImport_relation_decoration=<numeric value> : [Optional] Decoration used for relationships (0=no decoration, 1=boost::shared_ptr, 2=QSharedPointer, 5=std::shared_ptr)
  --QxEEOdbcImport_relation_collection=<numeric value> : [Optional] Collection used for relationships (1=qx::QxCollection, 2=std::vector, 3=std::list, 8=QHash, 10=QList)
  --QxEEOdbcImport_mapping_sql_to_cpp="sql1~cpp1;sql2~cpp2;etc..." : [Optional] List of mappings from SQL type to C++ type
  --QxEEOdbcImport_verbose=0/1 : [Optional] Display more details during the import process

*** Import plugin QxEEPostgreSQLImport ***

  --QxEEPostgreSQLImport_db_ip="<DB IP>" : [Required] Database server address (IP)
  --QxEEPostgreSQLImport_db_port="<DB port>" : [Required] Port number to connect to database
  --QxEEPostgreSQLImport_db_name="<DB name>" : [Required] Database name
  --QxEEPostgreSQLImport_filter_regexp="<Regular Expression>" : [Optional] Filter to select tables from database to import
  --QxEEPostgreSQLImport_login="<DB Login>" : [Optional] Login to connect to database
  --QxEEPostgreSQLImport_pwd="<DB Password>" : [Optional] Password to connect to database
  --QxEEPostgreSQLImport_namespace="<Namespace>" : [Optional] C++ namespace where imported classes will be located
  --QxEEPostgreSQLImport_delete_namespace=0/1 : [Optional] Delete all entities in the namespace before importing
  --QxEEPostgreSQLImport_import_comment=0/1 : [Optional] Import tables/columns comment to entities/properties description
  --QxEEPostgreSQLImport_import_default_value=0/1 : [Optional] Import columns default value
  --QxEEPostgreSQLImport_boost_optional=0/1 : [Optional] Add boost::optional<T> decoration if a column definition allows NULL value
  --QxEEPostgreSQLImport_organize_diagram=0/1 : [Optional] Organize diagram layout after import process
  --QxEEPostgreSQLImport_relation_decoration=<numeric value> : [Optional] Decoration used for relationships (0=no decoration, 1=boost::shared_ptr, 2=QSharedPointer, 5=std::shared_ptr)
  --QxEEPostgreSQLImport_relation_collection=<numeric value> : [Optional] Collection used for relationships (1=qx::QxCollection, 2=std::vector, 3=std::list, 8=QHash, 10=QList)
  --QxEEPostgreSQLImport_mapping_sql_to_cpp="sql1~cpp1;sql2~cpp2;etc..." : [Optional] List of mappings from SQL type to C++ type
  --QxEEPostgreSQLImport_verbose=0/1 : [Optional] Display more details during the import process

*** Import plugin QxEESQLiteImport ***

  --QxEESQLiteImport_db_path="<DB File Path>" : [Required] SQLite database file path
  --QxEESQLiteImport_filter_regexp="<Regular Expression>" : [Optional] Filter to select tables from database to import
  --QxEESQLiteImport_namespace="<Namespace>" : [Optional] C++ namespace where imported classes will be located
  --QxEESQLiteImport_delete_namespace=0/1 : [Optional] Delete all entities in the namespace before importing
  --QxEESQLiteImport_import_comment=0/1 : [Optional] Import tables/columns comment to entities/properties description
  --QxEESQLiteImport_import_default_value=0/1 : [Optional] Import columns default value
  --QxEESQLiteImport_boost_optional=0/1 : [Optional] Add boost::optional<T> decoration if a column definition allows NULL value
  --QxEESQLiteImport_organize_diagram=0/1 : [Optional] Organize diagram layout after import process
  --QxEESQLiteImport_relation_decoration=<numeric value> : [Optional] Decoration used for relationships (0=no decoration, 1=boost::shared_ptr, 2=QSharedPointer, 5=std::shared_ptr)
  --QxEESQLiteImport_relation_collection=<numeric value> : [Optional] Collection used for relationships (1=qx::QxCollection, 2=std::vector, 3=std::list, 8=QHash, 10=QList)
  --QxEESQLiteImport_mapping_sql_to_cpp="sql1~cpp1;sql2~cpp2;etc..." : [Optional] List of mappings from SQL type to C++ type
  --QxEESQLiteImport_verbose=0/1 : [Optional] Display more details during the import process

*** Export plugin QxEECppExport ***

  !!! Note : this plugin loads automatically previous parameters values before starting the export process, but you can use following parameters to override them !!!
  --QxEECppExport_path="<Export Path>" : [Optional] C++ export path parameter
  --QxEECppExport_template_type=<numeric value> : [Optional] C++ template type selected to build C++ files (0=no_inheritance, 1=ix_persistable, 2=qx_persistable, 3=ix_persistable_and_q_object, 4=custom)
  --QxEECppExport_template_header="<Template Header>" : [Optional] Custom C++ template header file path (QxEECppExport_template_type parameter must be equal to 4, which means custom)
  --QxEECppExport_template_source="<Template Source>" : [Optional] Custom C++ template source file path (QxEECppExport_template_type parameter must be equal to 4, which means custom)
  --QxEECppExport_qxorm_relative_path=0/1 : [Optional] Relative path to QxOrm library
  --QxEECppExport_generate_custom_files=0/1 : [Optional] Generate a custom directory with custom files for each entity
  --QxEECppExport_custom_javacript="<Custom JS>" : [Optional] Custom script (javascript file) to change the default behaviour of the export process

*** Export plugin QxEECppModelViewExport ***

  !!! Note : this plugin loads automatically previous parameters values before starting the export process, but you can use following parameters to override them !!!
  --QxEECppModelViewExport_path="<Export Path>" : [Optional] C++ model/view export path parameter
  --QxEECppModelViewExport_namespace="<Namespace>" : [Optional] Namespace where to put all model/view classes
  --QxEECppModelViewExport_template_type=<numeric value> : [Optional] C++ model/view template type selected to build C++ files (0=default, 1=custom, 2=qx_model_service)
  --QxEECppModelViewExport_template_header="<Template Header>" : [Optional] Custom C++ template header file path (QxEECppModelViewExport_template_type parameter must be equal to 1, which means custom)
  --QxEECppModelViewExport_template_source="<Template Source>" : [Optional] Custom C++ template source file path (QxEECppModelViewExport_template_type parameter must be equal to 1, which means custom)
  --QxEECppModelViewExport_generate_custom_files=0/1 : [Optional] Generate a custom directory with custom files for each entity
  --QxEECppModelViewExport_custom_javacript="<Custom JS>" : [Optional] Custom script (javascript file) to change the default behaviour of the export process

*** Export plugin QxEECppServicesExport ***

  !!! Note : this plugin loads automatically previous parameters values before starting the export process, but you can use following parameters to override them !!!
  --QxEECppServicesExport_path="<Export Path>" : [Optional] C++ services export path parameter
  --QxEECppServicesExport_namespace="<Namespace>" : [Optional] Namespace where to put all services classes
  --QxEECppServicesExport_template_type=<numeric value> : [Optional] C++ services template type selected to build C++ files (0=default, 1=custom)
  --QxEECppServicesExport_template_header="<Template Header>" : [Optional] Custom C++ template header file path (QxEECppServicesExport_template_type parameter must be equal to 1, which means custom)
  --QxEECppServicesExport_template_source="<Template Source>" : [Optional] Custom C++ template source file path (QxEECppServicesExport_template_type parameter must be equal to 1, which means custom)
  --QxEECppServicesExport_generate_custom_files=0/1 : [Optional] Generate a custom directory with custom files for each entity
  --QxEECppServicesExport_custom_javacript="<Custom JS>" : [Optional] Custom script (javascript file) to change the default behaviour of the export process
  --QxEECppServicesExport_generate_server_app=0/1 : [Optional] Generate a sample server application
  --QxEECppServicesExport_server_app_path="<Server App Path>" : [Optional] Server application location

*** Export plugin QxEEGenericDDLExport ***

  !!! Note : this plugin loads automatically previous parameters values before starting the export process, but you can use following parameters to override them !!!
  --QxEEGenericDDLExport_path="<Export Path>" : [Optional] DDL export path parameter
  --QxEEGenericDDLExport_db_type=<numeric value> : [Optional] Database type (0=default, 1=sqlite, 2=mysql, 3=postgresql, 4=oracle, 5=mssqlserver)
  --QxEEGenericDDLExport_relation_as_fk=0/1 : [Optional] Export relationships as foreign keys in database
  --QxEEGenericDDLExport_schema_type=<numeric value> : [Optional] Way to export database schema (0=full, 1=evolution, 2=full_and_evolution)
  --QxEEGenericDDLExport_custom_javacript="<Custom JS>" : [Optional] Custom script (javascript file) to change the default behaviour of the export process

*** Export plugin QxEEPrinter ***

  !!! Note : this plugin loads automatically previous parameters values before starting the export process !!!

*** Export plugin QxEEXmlExport ***

  !!! Note : this plugin loads automatically previous parameters values before starting the export process, but you can use following parameters to override them !!!
  --QxEEXmlExport_path="<Export Path>" : [Optional] XML or JSON export path parameter
  --QxEEXmlExport_as_json=0/1 : [Optional] Export project as JSON format

Remarque : pour faire apparaitre les logs g�n�r�s par l'application QxEntityEditor :
  • Windows : utiliser un outil externe comme par exemple DebugView ;
  • Linux : d�marrer QxEntityEditor depuis un terminal ;
  • Mac OS X : d�marrer QxEntityEditor depuis un terminal en allant dans le sous-dossier QxEntityEditor.app, par exemple : cd QxEntityEditor.app/Content/MacOS/, puis : ./QxEntityEditor


-- Exemple n�7 : importer en ligne de commande un sch�ma de base de donn�es par ODBC (plugin QxEEOdbcImport) :
QxEntityEditor --no_gui --project="<project_path>" --plugin=QxEEOdbcImport --QxEEOdbcImport_db_type=1 --QxEEOdbcImport_dsn="<your_dsn>" --QxEEOdbcImport_login="<your_login>" --QxEEOdbcImport_pwd="<your_password>" --QxEEOdbcImport_delete_namespace=1


-- Exemple n�8 : importer en ligne de commande un sch�ma de base de donn�es PostgreSQL (plugin QxEEPostgreSQLImport) :
QxEntityEditor --no_gui --project="<project_path>" --plugin=QxEEPostgreSQLImport --QxEEPostgreSQLImport_db_ip="<ip>" --QxEEPostgreSQLImport_db_port=5432 --QxEEPostgreSQLImport_db_name="<dbname>" --QxEEPostgreSQLImport_login="<your_login>" --QxEEPostgreSQLImport_pwd="<your_password>" --QxEEPostgreSQLImport_delete_namespace=1


-- Exemple n�9 : exporter en ligne de commande un projet QxEntityEditor associ� � un gestionnaire de code source Git, Perforce, CVS, etc. (plugin QxEESourceControlExport) :
QxEntityEditor --no_gui --project="<path_to_your_qxee_project_file>" --plugin=QxEESourceControlExport --QxEESourceControlExport_path="<path_to_your_export_output_directory>"


-- Exemple n�10 : importer en ligne de commande un projet QxEntityEditor associ� � un gestionnaire de code source Git, Perforce, CVS, etc. (plugin QxEESourceControlImport) :
QxEntityEditor --project="<path_to_your_qxee_project_file>" --plugin=QxEESourceControlImport --QxEESourceControlImport_path="<path_to_the_root_source_control_json_file>"




QxOrm � 2011-202XDL Teamty - ic-east.com