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

SL & STL C++ Discussion :

imiter une requête SQL à l'aide de la STL


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut imiter une requête SQL à l'aide de la STL
    Bonjour, est-ce qu'il possible d'imiter une requête SQL du genre SELECT FROM WHERE sur une std::map à l'aide des fonctions de la STL.

    La std::map ayant une forme à peu près comme celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef std::map<std::string, ObjectPtr> TBDD;
    TBDD objects;
    avec le string en tant que clé (unique), et l'ObjectPtr un shared_ptr vers un Objet initilisé dynamiquent.

    Ma question serait donc, comment effectuer une requête SQL du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM objects o WHERE key = 'abc' AND o.member = 'foo'
    sur la map en utilisant la STL pour recevoir un ObjectPtr en retour.

    Merci d'avance pour toute idée, suggestion ou piste de recherche éventuelle.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Si tu veux de l'SQL pourquoi n'utilises-tu pas carrément un SGBD ?

    Sinon on fait comme la clé est unique, il suffit de faire : (je pars du principe que ObjectPtr est un pointeur, chose assez étrange d'ailleurs pour une base de données)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::map<std::string, ObjectPtr>::iterator it = objects.find("abc");
    if(it != objects.end() && it->second->member = "foo")
        // ton truc est trouvé

  3. #3
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    Citation Envoyé par loufoque
    Si tu veux de l'SQL pourquoi n'utilises-tu pas carrément un SGBD ?
    Parce qu'un SGBD, même TinySQL, serait déjà trop pour la petite lib que je suis en train d'écrire.

    Pour les pointeurs, cela s'explique par le fait que les objets sont créés dynamiquement en parsant de l'XML (via un parseur SAX), et que la map est contenue dans un singleton.


    Merci déjà pour cette réponse. Maintenant, si quelqu'un aurait une idée comment faire un MAX() ou MIN() pour membre member de type numérique... parce que c'est là-dessus que je bloque.

    EDIT: je précise MAX() et MIN() d'SQL, pour une requête du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM objects o WHERE key == 'abc' AND MIN(o.nummember)

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu devrais jeter un oeil à miniDB, ça pourrait t'intéresser.
    http://freshmeat.net/projects/minidb/
    http://www.garret.ru/~knizhnik/ (page de l'auteur)

    J'ai découvert ça cette semaine : ce que ce gars fait a l'air énorme. Avec miniDB tu aurais notamment, si j'ai bien compris, un SGBD très facilement embarquable pour des petites applications, avec un support de SQL (limité mais largement suffisant si tu ne pousses pas trop), et ne nécessitant pas forcément un client et un serveur pour fonctionner. De plus l'interface C++ semble plutôt bien foutue.
    Et toujours si j'ai bien compris, aucune prise de tête pour l'utilisation : tu inclues les sources dans ton projet, tu compiles, ça marche.
    Encore un truc chouette : ta base de données c'est un fichier ; le jour où tu veux la bouger / copier, un clic suffit. Enorme.

    A voir donc.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    oui enfin autant prendre sqlite

  6. #6
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    oui, enfin, stocker les données n'est pas le problème, elles le sont dans un fichier XML. Mon objet pointé par l'ObjectPtr contient aussi des variables créés lors de l'execution (des GLuint referencant vers des shaders, pour être exact), et ce n'est pas le type de données que je peux stocker dans une BDD (enfin, il vaut mieux pas).

    Parce que dans ce cas, j'aurais pu prendre aussi une implementation un tant soit peu complète de la DOM, et me servir de XPath, XQuery (?) ou autre (DOM) pour les accéder. Or bien conscient des ressources que ca consomme et du côté peu pratique de la chose (je veux séparer la compilation desdits shaders de leur execution), j'ai justement choisi de ne pas le faire.

    Donc, pour ce qui de mon problème, ca n'est pas possible avec la STL?

    EDIT: en analysant mon problème, j'ai remarqué que je peux me passer des pointeurs pour la partie BDD. En fait, je n'ai que 5 champs entrant en compte.
    {classe, moduleID, degree, lodHW, lodVendor}
    (les champs en italique sont clés de la base, et le champ souligné et clé unique d'une entrée. Le champ degree est la seule variable numérique, tous les autres champs sont des strings).

    Pour ainsi dire, il me semble qu'il n'y a aucun élément de la STL pouvant organiser ces données, si?
    Il me faudrait donc un SGBD, mais il m'en faudrait un qui n'existe qu'en RAM uniquement, sans éventuels fichiers, et rapide. Des idées?

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Merci déjà pour cette réponse. Maintenant, si quelqu'un aurait une idée comment faire un MAX() ou MIN() pour membre member de type numérique... parce que c'est là-dessus que je bloque.

    EDIT: je précise MAX() et MIN() d'SQL, pour une requête du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM objects o WHERE key == 'abc' AND MIN(o.nummember)
    Il semblerait que tu n'aies toujours pas compris que ta clé est unique.
    Cela n'a donc pas de sens de chercher le minimum en plus de la clé....

  8. #8
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    oui, bon, l'exemple était mal choisi (ou plutôt mal écrit).
    La facon correcte serait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT key FROM objects WHERE MIN(nummember)
    Je ne suis pas du tout contre l'emploi de boost, vu que je m'en sers ailleurs.
    Je suis d'ailleurs en train de regarder boost::multi_index et boost::property_map.

    Laurent>je posterais un lien une fois ce projet (ma thèse de mastère en informatique) terminé (ou du moins en version beta).

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    std::min_element(objects.begin(), objects.end())

    En définissant correctement operator< pour ton type (ou alors en utilisant un prédicat)

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

Discussions similaires

  1. aide sur une requête sql
    Par sanach dans le forum Développement
    Réponses: 9
    Dernier message: 17/10/2007, 20h42
  2. Aide pour construire une requête SQL
    Par squalito dans le forum Oracle
    Réponses: 1
    Dernier message: 09/03/2007, 15h04
  3. Aide pour construire une requête SQL
    Par squalito dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/03/2007, 14h08
  4. Besoin d'aide pour une requête SQL
    Par Borami dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2005, 10h33
  5. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56

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