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

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

QxOrm Discussion :

Probable bogue sur un fetch d'une relation nulle


Sujet :

QxOrm

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 151
    Points : 49
    Points
    49
    Par défaut Probable bogue sur un fetch d'une relation nulle
    Hello !

    Je viens de réinstaller mon système, et j'ai donc téléchargé la dernière version de QxOrm 1.2.4. Hélas, je constate un bug que je n'avais pas avant.

    Je m'explique: j'ai une classe Person qui a une relation déclarée comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t.relationManyToOne( &Person::defaultNomenclature, "default_nomenclature_id" );
    Il faut savoir que defaultNomenclature peut être à null, dans le cas ou la personne n'aurait pas de nomenclature par défaut.

    La classe Nomenclature comporte une relation vers une spécialité.

    Du coup, voici ce que je fais quand un fetch sur une personne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QSqlError daoError = 
            qx::dao::fetch_by_query_with_relation( QStringList() << "default_nomenclature_id->specialty_name", query, alreadyExistingUsers );
    Le souci, le fait d'ajouter "default_nomenclature_id->specialty_name" comme relation semble corrompre l'exécution du programme (alors que ça marchait bien avant).
    On dirait qu'il récupère un pointeur null et qu'il essaie de fetcher specialty_name sur ce pointeur... Très étrange.

    Je n'ai vraiment pas le temps de faire un exemple, mais je te soumets quand même ceci dans le cas où tu aurais une idée... Toutefois, je pense que mon explication est assez claire.

    Bon courage !

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    je constate un bug que je n'avais pas avant
    ...
    alors que ça marchait bien avant
    Vraiment bizarre, le fetch sur relations multiples est une nouveauté de QxOrm 1.2.4 : comment ça pouvait marcher avant et plus maintenant ?

    Je n'ai vraiment pas le temps de faire un exemple, mais je te soumets quand même ceci dans le cas où tu aurais une idée...
    De mon côté, pas trop le temps non plus pour le moment, désolé !
    Je pense qu'avec le projet de test qxBlog, en ajoutant 4 ou 5 lignes de code dans le main, on doit pouvoir reproduire facilement si y a vraiment un bug ou non...
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

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

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Pas de souci, j'ai réussi à éviter le bug.

    En fait, je pense que ce n'est pas un bogue qui est apparu avec une nouvelle version, c'est simplement que je n'avais pas testé ce cas.

    En fait, c'est probablement ce à quoi je pense: vu que le champ "nomenclature" est à null pour l'utilisateur en question, qxorm essaie probablement de fetcher des relations sur un objet null.

    Je te ferais un exemple si je trouve le temps.

    Bon courage pour le reste !

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Désolé mais je ne pense pas que le bug vienne de la bibliothèque QxOrm !

    J'ai essayé de reproduire ton cas avec le projet qxBlog, en ajoutant les lignes suivantes dans le main de qxBlog (fichier ./test/qxBlog/src/main.cpp), à la ligne 134 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       QList<comment_ptr> list_of_comments;
       comment_ptr comment_3; comment_3.reset(new comment());
       comment_3->m_text = "comment_3 text";
       comment_3->m_dt_create = QDateTime::currentDateTime();
       daoError = qx::dao::insert(comment_3); qAssert(! daoError.isValid());
       qx::QxSqlQuery query_comment("WHERE comment.comment_id = :comment_id");
       query_comment.bind(":comment_id", comment_3->m_id);
       daoError = qx::dao::fetch_by_query_with_relation(QStringList() << "blog_id->author_id", query_comment, list_of_comments); qAssert(! daoError.isValid());
       qx::dump(list_of_comments);
    Comme tu peux le voir, j'ajoute un commentaire qui n'a pas de blog associé, puis je fais une requête avec "blog_id->author_id". Donc je pense que je suis exactement dans le même cas que toi.
    Voici ce qu'on obtient avec le dump :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [QxOrm] start dump 'QList<boost::shared_ptr<comment>>'
    <QList-boost.shared_ptr-comment-- class_id="0" tracking_level="0" version="0">
    	<count>1</count>
    	<item class_id="1" tracking_level="0" version="1">
    		<px class_id="2" tracking_level="1" version="0" object_id="_0">
    			<comment_id>3</comment_id>
    			<comment_text class_id="3" tracking_level="0" version="0">comment_3 text</comment_text>
    			<date_creation class_id="4" tracking_level="0" version="0">20130227163435000</date_creation>
    			<blog_id class_id="5" tracking_level="0" version="1">
    				<px class_id="-1"></px>
    			</blog_id>
    		</px>
    	</item>
    </QList-boost.shared_ptr-comment-->
     
    [QxOrm] end dump 'QList<boost::shared_ptr<comment>>'
    Donc on récupère correctement le commentaire sans blog associé.

    Si j'exécute la requête avec un commentaire qui a un blog associé, j'obtiens le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    [QxOrm] start dump 'QList<boost::shared_ptr<comment>>'
    <QList-boost.shared_ptr-comment-- class_id="0" tracking_level="0" version="0">
    	<count>1</count>
    	<item class_id="1" tracking_level="0" version="1">
    		<px class_id="2" tracking_level="1" version="0" object_id="_0">
    			<comment_id>2</comment_id>
    			<comment_text class_id="3" tracking_level="0" version="0">comment_2 text</comment_text>
    			<date_creation class_id="4" tracking_level="0" version="0">20130227163611000</date_creation>
    			<blog_id class_id="5" tracking_level="0" version="1">
    				<px class_id="6" tracking_level="1" version="0" object_id="_1">
    					<blog_id>1</blog_id>
    					<blog_text>update blog_text_1</blog_text>
    					<date_creation>20130227163611000</date_creation>
    					<author_id class_id="7" tracking_level="0" version="1">
    						<px class_id="8" tracking_level="1" version="0" object_id="_2">
    							<author_id>author_id_2</author_id>
    							<name>author_2</name>
    							<birthdate class_id="9" tracking_level="0" version="0">20130227</birthdate>
    							<sex>1</sex>
    							<list_blog class_id="10" tracking_level="0" version="0">
    								<count>0</count>
    								<item_version>1</item_version>
    							</list_blog>
    						</px>
    					</author_id>
    					<list_comment>
    						<count>0</count>
    					</list_comment>
    					<list_category class_id="11" tracking_level="0" version="0">
    						<count>0</count>
    					</list_category>
    				</px>
    			</blog_id>
    		</px>
    	</item>
    </QList-boost.shared_ptr-comment-->
     
    [QxOrm] end dump 'QList<boost::shared_ptr<comment>>'
    On voit bien que dans ce cas, je récupère bien le commentaire, le blog associé et l'auteur du blog.

    Donc pour moi il n'y a pas de bug dans la bibliothèque QxOrm.
    Est-ce que tu n'aurais pas un bug dans le constructeur de ta classe (un pointeur qui ne serait pas mis à NULL dans le constructeur par exemple, le coup classique) ?

    EDIT : si je pousse le test un peu plus loin : je crée un commentaire qui a un blog associé, mais ce blog n'a pas d'auteur, puis j’exécute le même code, j'obtiens le dump suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    [QxOrm] start dump 'QList<boost::shared_ptr<comment>>'
    <QList-boost.shared_ptr-comment-- class_id="0" tracking_level="0" version="0">
    	<count>1</count>
    	<item class_id="1" tracking_level="0" version="1">
    		<px class_id="2" tracking_level="1" version="0" object_id="_0">
    			<comment_id>2</comment_id>
    			<comment_text class_id="3" tracking_level="0" version="0">comment_2 text</comment_text>
    			<date_creation class_id="4" tracking_level="0" version="0">20130227165655000</date_creation>
    			<blog_id class_id="5" tracking_level="0" version="1">
    				<px class_id="6" tracking_level="1" version="0" object_id="_1">
    					<blog_id>1</blog_id>
    					<blog_text>update blog_text_1</blog_text>
    					<date_creation>20130227165655000</date_creation>
    					<author_id class_id="7" tracking_level="0" version="1">
    						<px class_id="-1"></px>
    					</author_id>
    					<list_comment>
    						<count>0</count>
    					</list_comment>
    					<list_category class_id="9" tracking_level="0" version="0">
    						<count>0</count>
    					</list_category>
    				</px>
    			</blog_id>
    		</px>
    	</item>
    </QList-boost.shared_ptr-comment-->
     
    [QxOrm] end dump 'QList<boost::shared_ptr<comment>>'
    On voit bien que je récupère le commentaire, son blog associé. Par contre, le blog n'a pas d'auteur => ça fonctionne bien

    EDIT 2 : j'ai peut-être détecté un bug au niveau des relations. Je vais le corriger et je mettrai un lien vers une version BETA pour que tu puisses tester et voir si ça résout ton problème...
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

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

  5. #5
    Expert confirmé

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    J'ai effectivement corrigé un problème avec les relations multiples quand un pointeur est à NULL.
    La correction est disponible dans cette version :
    http://www.qxorm.com/version/QxOrm_1.2.5_BETA_10.zip

    Tiens moi au courant stp pour voir si ça corrige ou non ton soucis...
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

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

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Pardonne moi, j'ai eu pas mal de travail, je vais essayer de tester ça ce week end ! Merci pour l'investigation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 30
    Dernier message: 17/05/2011, 12h25
  2. Réponses: 5
    Dernier message: 08/04/2009, 17h39
  3. souci sur une relation
    Par Eh_manu dans le forum Access
    Réponses: 22
    Dernier message: 05/06/2006, 10h06
  4. [ADO.NET]Comment réaliser une relation sur plusieurs champs?
    Par kleomas dans le forum Accès aux données
    Réponses: 3
    Dernier message: 13/03/2006, 12h40
  5. Question sur une relation ternaire dans un MCD
    Par sylsau dans le forum Schéma
    Réponses: 5
    Dernier message: 05/03/2006, 20h00

Partager

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