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 :

Spécialisation de qx::trait::detail::get_sql_type<QUuid>


Sujet :

QxOrm

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Spécialisation de qx::trait::detail::get_sql_type<QUuid>
    Bonjour,

    Utilisant une base de donnée Postgres, je souhaite "overrider" certaines spécialisation de get_sql_type afin de retourner le bon type (uuid dans mon cas au lieu de TEXT).

    Je voudrais le faire de cette façon plutôt que de définir tData->setSqlType("uuid")...

    Est-ce possible ?

    Merci.

    EDIT -------

    Je m'en suis sorti de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        qx::QxClassX::getAllSqlTypeByClassName()->clear();
        qx::QxClassX::getAllSqlTypeByClassName()->insert("bool", "bool");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("qx_bool", "bool");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QUuid", "uuid");
    // tous les autres types normalement définis dans void QxClassX::initSqlTypeByClassName()....
    // mes types persos
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsPoint", "geometry");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsLinestring", "geometry");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsPolygon", "geometry");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsMultiPointPoint", "geometry");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsMultiLinestring", "geometry");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsMultiPolygon", "geometry");
    et pour mes types géométriques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    namespace qx {
        namespace trait {
        namespace detail {
        template<>
        struct get_sql_type< QsPoint > // QsLinestring, etc...
        {
            static inline const char * get() {
                return "geometry";
            }
        };
        } // namespace detail
        } // namespace trait
    } // namespace qx

    Ca fonctionne, mais je voudrais juste avoir un retour de QxOrm si cela ne "casse" pas quelque chose dans la bibliothèque QxOrm.


  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


    Il me semble que la fonction qx::trait::get_sql_type() est utilisée uniquement pour créer les tables (qx::dao::create_table<T>()).
    Pour un logiciel de production, je ne conseille pas d'utiliser qx::dao::create_table<T>() et recommande plutôt de designer la BDD avec des outils spécifiques à chaque BDD (dans ton cas, pgAdmin pour PostGres par exemple).
    Par contre, pour créer des prototypes, c'est vrai que ça peut être utile.

    Voilà c'était juste pour rappeler cette info sur qx::dao::create_table<T>().
    Remarque : à partir de QxOrm 1.1.9, on peut créer son propre script SQL grâce au moteur d'introspection en s'appuyant sur la fonction qx::QxClassX::dumpSqlSchema()).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        qx::QxClassX::getAllSqlTypeByClassName()->clear();
        qx::QxClassX::getAllSqlTypeByClassName()->insert("bool", "bool");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("qx_bool", "bool");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QUuid", "uuid");
    // tous les autres types normalement définis dans void QxClassX::initSqlTypeByClassName()....
    // mes types persos
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsPoint", "geometry");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsLinestring", "geometry");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsPolygon", "geometry");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsMultiPointPoint", "geometry");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsMultiLinestring", "geometry");
        qx::QxClassX::getAllSqlTypeByClassName()->insert("QsMultiPolygon", "geometry");
    Ce code est tout à fait correct et c'est exactement à ça que sert la fonction qx::QxClassX::getAllSqlTypeByClassName() : on récupère la collection qui associe à un nom de classe un type SQL. La bibliothèque QxOrm initialise cette collection d'une certaine façon (en l’occurrence c'est pour une BDD SQLite), mais tu peux accéder à la collection dans ton code et en faire ce que tu veux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    namespace qx {
        namespace trait {
        namespace detail {
        template<>
        struct get_sql_type< QsPoint > // QsLinestring, etc...
        {
            static inline const char * get() {
                return "geometry";
            }
        };
        } // namespace detail
        } // namespace trait
    } // namespace qx
    Pour ce code, il y a beaucoup plus simple, tu peux utiliser la macro suivante pour enregistrer chaque nouveau type : QX_REGISTER_TRAIT_GET_SQL_TYPE.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QX_REGISTER_TRAIT_GET_SQL_TYPE(QsPoint, "geometry")
    QX_REGISTER_TRAIT_GET_SQL_TYPE(QsLinestring, "geometry")
    etc...
    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 à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Impeccable !

    Je suis justement en train d'écrire ma propre fonction dumpSqlSchema() qui va créer et maintenir les tables tout au long des évolutions de l'appli.

    Pour ce code, il y a beaucoup plus simple, tu peux utiliser la macro suivante pour enregistrer chaque nouveau type : QX_REGISTER_TRAIT_GET_SQL_TYPE.
    J'ai des erreurs de compilations en utilisant cette macro, c'est pourquoi j'écris le code complet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    error C2143: erreur de syntaxeÿ: absence de ';' avant '<'
    error C2913: sp‚cialisation expliciteÿ; 'qx::cvt::qx::trait::detail::get_sql_type' n'est pas une sp‚cialisation d'un modŠle de classe
    erreur de syntaxeÿ: '<'
    erreur de syntaxeÿ: absence de ';' avant '{'
    error C2447: '{'ÿ: en-tˆte de fonction manquant (liste formelle … l'ancien formatÿ?)
    Mais c'est pas bien grave.


  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
    Attention à utiliser les macro en dehors de tous namespace !

    Tu dois avoir un namespace qui traine au moment où tu écris la macro.
    Normalement elle doit fonctionner...
    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
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Effectivement, problème de namespace.
    J'ai vérifié et ça fonctionne.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/04/2013, 12h07
  2. [Ferme] DBLookup fiche detail (relation maitre detail)
    Par boyerf dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/02/2004, 20h12
  3. [CR9] Plusieurs champs dans details
    Par maxxou dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 28/01/2004, 13h35
  4. Trait pas beau
    Par Steph82 dans le forum OpenGL
    Réponses: 12
    Dernier message: 07/12/2003, 00h26
  5. Distribution spécialisée apache ?
    Par FRANCKYIV dans le forum Développement
    Réponses: 5
    Dernier message: 23/10/2003, 15h46

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