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 :

Assertion en mode de débogage avec QxSqlQuery::freeText() (jointure)


Sujet :

QxOrm

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 19
    Points
    19
    Par défaut Assertion en mode de débogage avec QxSqlQuery::freeText() (jointure)
    Bonjours à tous.

    J'utilise QxOrm de puis quelques temps maintenant se qui me facilite grandement la vie.

    J'utilise QxSqlQuery::freeText pour faire mais propre requete avec jointure. en mode release ça fonctionne à merveille mais en mode debug la requete doit probablement mal se former et lors de l'appele à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session.fetchByQuery(qSql, ...);
    il se produit cette assersion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ASSERT: "! exist(key)" in file d:/dev/archive/QxOrm_1.2.4/QxOrm/include/QxCollection/../../inl/QxCollection/QxCollection.inl, line 209
    Pour un peu plus de détail, j'ai une classe Categories qui possède des Documents.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void register_class(QxClass<Categorie>& t) {
            t.id(&Categorie::m_id, "categorie_id");
            t.data(&Categorie::m_name, "name");
            t.relationManyToOne(&Categorie::m_classeur, "classeur_id");
            t.relationOneToMany(&Categorie::m_documents, "list_document", "categorie_id");
        }
    J'ai recherché des Document via une requete avec critère et je veux récupérer la Catégorie de chacun de ces Documents.
    voilà donc comment je m'y prends:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    qx::QxSqlQuery qSql;
    qSql.freeText("JOIN Document ON Document.categorie_id=Categorie.categorie_id");
    qSql.where("Document.document_id").in(documentIDList);
    session.fetchByQuery(qSql, p->cachCategorie);
    Ce que je voudrai savoir c'est si l'erreur que je rencontre est un bug connue ou si ça viens de chez moi, comme une erreur que j'aurai fait lors de la compilation de boost ou de QxOrm. Car je doit l'avouer j'ai eu du mal à les compiler mais je pensais avoir résolue ce problème en ajoutant dans ma config :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CONFIG(release, debug|release) {
    DEFINES += NDEBUG
    ...
    }else{
    ...
    }
    win32-g++: QMAKE_LFLAGS += -export-all-symbols
    Merci de me renseigner, je voudrai pas recompiler mes librairies pour rien.

  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


    J'utilise QxOrm de puis quelques temps maintenant se qui me facilite grandement la vie.


    ASSERT: "! exist(key)" in file d:/dev/archive/QxOrm_1.2.4/QxOrm/include/QxCollection/../../inl/QxCollection/QxCollection.inl, line 209
    Le résultat de la requête doit contenir plusieurs fois une même catégorie (logique avec les jointures), et dans une liste de type qx::QxCollection, l'assert te prévient en mode debug que tu essayes d'insérer un élément dans la liste qui existe déjà.

    Donc rien à voir avec la compilation
    Ton problème est que tu n'utilises pas la bonne façon pour faire des jointures (il ne faut pas utiliser freeText() pour les jointures).
    Je t'invite à lire la FAQ ici : http://www.qxorm.com/qxorm_fr/faq.html#faq_270

    En gros ton code deviendrait quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    qx::QxSqlQuery qSql;
    qSql.where("Document.document_id").in(documentIDList);
    session.fetchByQuery(qSql, p->cachCategorie, QStringList(), "list_document");

  3. #3
    Membre à l'essai
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Merci pour t'as réactivité.

    Connaissant maintenant le motif de cette assertion j'ai corrigé ma requete en ajoutant distinct().freeText...

    Je connaissait la méthode que tu as presenté mais elle a l'inconvénient (dans ma situation) de rapatrier de la BdD les categories avec la list de document remplie de nouvelle instance de document, hors ces documents je l'ai ai déjà...

    Merci encore et toute mes félicitation pour cette librairie, c'est du super boulot


    PS: et en fait dans ton appele
    session.fetchByQuery(qSql, p->cachCategorie, QStringList(), "list_document");
    le dernier paramètre doit être une QStringList
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session.fetchByQuery(qSql, p->cachCategorie, QStringList(), QStringList("list_document"));

  4. #4
    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
    Je me permets de faire une remarque: je trouve un peu restrictif de mettre une assertion pour ce cas. J'ai parfois le même souci, et je trouve qu'un exception aurait était plus bénéfique qu'une assertion, qui à mon sens ne doivent être utilisées que pour vérifier des cas qui ne sont pas censés êtres possibles ou qui ne doivent pas arriver.

    Je comprends le besoin de rapidité, mais c'est un peu trop direct et un peu lourd à gérer (ie. il faut mettre un !contains avant chaque insertion). Je conçoit que ça oblige à mettre un try...catch, mais personnellement, j'ai beaucoup de parties qui sont encadrées par un try catch par bloc d'opérations.

  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
    Je pense qu'une exception serait trop "brutal" dans ce cas !

    qx::QxCollection est un conteneur qui ne peut pas stocker 2 éléments avec une même clé.
    L'assert est juste là pour te prévenir pendant tes tests : attention, il y a un problème dans ton code (ou mauvaise utilisation de la bibliothèque) ! Si tu l'oublies et que tu fournis ton appli à tes clients, ce n'est pas dramatique non plus, on ne va pas faire planter l'appli pour ça, donc en release ça passe inaperçu => tant pis pour toi, tu n'as pas assez testé ton application en debug (et tu ne pourras pas dire que c'est la faute à QxOrm si ton appli plante chez tes clients ) !

    Dans le cas de cgMorpheus82, ça lui a permis de corriger, et surtout d'optimiser son code (moins d'éléments à remonter de sa BDD).

    il faut mettre un !contains avant chaque insertion
    Même chose, si tu dois faire ça à chaque insertion, je pense qu'il y a un problème dans ton code.

  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
    Je suis retombé sur une assertion l'autre fois, j'ai mis pas mal de temps à trouver d'où ça venait.

    Je pense que tu devrais expliciter un peu plus ces dernières par ce biais (ce n'est que mon avis):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert( condition && "Your relation is invalid" );
    et surtout, ne mettre qu'une seule condition à la fois pour bien isoler le souci.

    De cette façon, le développeur sait exactement ce qui ne va pas au moment ou l'assertion est déclenchée.

  7. #7
    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'essaye de mettre un qDebug() avant de déclencher une assertion, mais c'est vrai que ce n'est pas systématique.
    La macro Q_ASSERT_X() me semble bien pour préciser ce qui ne va pas.
    J'essayerai d'améliorer ça pour les prochaines versions...

  8. #8
    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
    Aucun souci, je comprends, je me permets de mettre ceci comme une remarque à l'utilisation.

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

Discussions similaires

  1. Débogage avec Zend Studio Mac OS X + MAMP
    Par Bernard Senior dans le forum Zend Studio
    Réponses: 2
    Dernier message: 15/07/2007, 18h32
  2. [PHP-JS] script php en mode console et avec arguments
    Par danathane dans le forum Langage
    Réponses: 1
    Dernier message: 28/05/2007, 14h57
  3. Lister les modes de multisampling (avec SDL)
    Par RaphAstronome dans le forum OpenGL
    Réponses: 1
    Dernier message: 19/06/2006, 09h42
  4. Ouvrir le mode "création requête" avec un bouton.
    Par Goldenduck4000 dans le forum Access
    Réponses: 5
    Dernier message: 22/05/2006, 15h40
  5. Réponses: 8
    Dernier message: 20/01/2006, 13h46

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