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

C Discussion :

interpreteur requêtes sql


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 11
    Points
    11
    Par défaut interpreteur requêtes sql
    Bonjour tout le monde,
    j'ai cherché partout, mais je n'arrive pas à trouver un programme qui interprète des requêtes sql en c. j'ai joins un fichier .c qui contient le code du programme que j'ai déjà écrit alors si vous voulez bien m'aider vous me sauverez.
    dans le programme que j'ai joins, j'ai intégré l'analyse lexical et l'analyse syntaxique(qui ne marche pas bien d'ailleurs), il me manque l'analyse sémantique.

    si vous pouvez d'ailleurs m'envoyer un programme accomplit ce ne sera pas de refus.
    Merci pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    si vous pouvez d'ailleurs m'envoyer un programme accomplit ce ne sera pas de refus.
    Un parasol avec ton cocktail ? Je plaisante.

    J'ai rapidement regarde ton code et le truc qui saute aux yeux c'est la maniere tres precise que tu utilises pour traiter des instructions specifiques (comme CREATE ou INSERT) alors que le but du code est de traiter 'Les requetes SQL' (d'apres ton topic).

    Le mieux pour organiser ton code serait de faire un tableau de pointeurs sur fonctions et de chaines de characteres. Les chaines pointeraient vers des instructions SQL qui sont generalement utilisees en debut de commande (`SELECT', `SHOW', `CREATE', ...) et les pointeurs vers une fonction chargee de parser la commande specialement en fonction du mot cle qui lui est associe (par exemple apres un `SELECT' tu sais que ce qui vient c'est un nom de table).

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    #include <string.h>
    #include <stdio.h>
     
    t_sql sql;//Une globale qui contient les donnees importantes de ton code
     
    int parse_select(char*);//Liste de parsers qui gerent les commandes
     
    typedef struct s_opt
    {
      char *s;//La commande
      int (*f)();//Le parser de la commande
    } t_opt;
     
    const t_opt opt[] = {
      {"SELECT", parse_select},//Initialisation
      {NULL, NULL}
    };
     
    int parse_select(char *buffer)
    {
      int i;
      char table[20];
     
      while (*buffer == 32 || *buffer == '\t')//On passe les espaces du debut
        ++buffer;
      //On sait qu'il y a un SELECT a *buffer
      for (i = 0; i < strlen("SELECT"); i++)
        ++buffer;
      //C'est parti pour les erreurs...
      while (*buffer == 32 || *buffer == '\t')//Encore des espaces
        ++buffer;
      memset(table, 0, 20);
      for (i = 0; i < 20 && buffer[i] && buffer[i] != 32 && buffer[i] != '\t'; i++)
        table[i] = buffer[i];//On recupere le nom de table;
     
      if (!is_in_db(table))//Est ce que la table existe ?
        return (0);
      else
        if (!select_table(sql.db, table))//La fonction qui execute reellement
          return (0);
     
      return (1);
    }
     
    int main()
    {
      int i;
      char buffer[512];
     
      if (fgets(buffer, 512, stdin))//Input
        for (i = 0; opt[i].s; i++)//Pour chaque option qu'on gere
          if (!strncmp(buffer, opt[i].s, strlen(opt[i].s)))//Si la commande match
    	if (!opt[i].f())//Si la commande est invalide
    	  return (1);
     
      return (0);
    }
    Le code est surement plein d'erreurs et ne compilera pas, mais c'est juste un exemple.

    EDIT: Si tu veux pousser le vice plus loin, tu peux faire un parser qui parse un nombre variable d'arguments et qui les redirige vers diverses fonctions (pointeurs avec des va_args).

    Bonne chance.

Discussions similaires

  1. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  4. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37
  5. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/02/2003, 16h44

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