File:  [local] / rpl / src / sql.c
Revision 1.22: download - view: text, annotated - select for diffs - revision graph
Tue Jun 21 07:45:29 2011 UTC (12 years, 10 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Merge de la branche 4_0 sur HEAD.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.0.prerelease.1
    4:   Copyright (C) 1989-2011 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction de récupération des paramètres de connexion à une base SQL
   29: ================================================================================
   30:   Entrées : objet de type liste
   31: --------------------------------------------------------------------------------
   32:   Sorties : pointeur sur un struct_connecteur_swl
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: struct_objet *
   39: parametres_sql(struct_processus *s_etat_processus, struct_objet *s_parametres)
   40: {
   41:     struct_liste_chainee            *l_element_courant;
   42: 
   43:     struct_objet                    *s_connecteur;
   44: 
   45:     unsigned char                   *base;
   46:     unsigned char                   *locale;
   47:     unsigned char                   *mot_de_passe;
   48:     unsigned char                   *serveur;
   49:     unsigned char                   *sport;
   50:     unsigned char                   *type_base;
   51:     unsigned char                   *utilisateur;
   52: 
   53:     unsigned int                    port;
   54: 
   55:     if ((*s_parametres).type != LST)
   56:     {
   57:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
   58:         return(NULL);
   59:     }
   60: 
   61:     l_element_courant = (struct_liste_chainee *) (*s_parametres).objet;
   62: 
   63:     if (l_element_courant == NULL)
   64:     {
   65:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
   66:         return(NULL);
   67:     }
   68: 
   69:     if ((*(*l_element_courant).donnee).type != CHN)
   70:     {
   71:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
   72:         return(NULL);
   73:     }
   74: 
   75:     if ((type_base = conversion_majuscule((unsigned char *)
   76:             (*(*l_element_courant).donnee).objet)) == NULL)
   77:     {
   78:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
   79:         return(NULL);
   80:     }
   81: 
   82:     locale = index(type_base, ':');
   83: 
   84:     if (locale != NULL)
   85:     {
   86:         (*locale) = d_code_fin_chaine;
   87:         locale++;
   88:     }
   89: 
   90:     /*
   91:      * Vérifications des types de base de données
   92:      */
   93: 
   94:     if ((strcmp(type_base, "MYSQL") != 0) &&
   95:             (strcmp(type_base, "POSTGRESQL") != 0))
   96:     {
   97:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
   98:         return(NULL);
   99:     }
  100: 
  101:     if ((s_connecteur = allocation(s_etat_processus, SQL)) == NULL)
  102:     {
  103:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  104:         return(NULL);
  105:     }
  106: 
  107:     (*((struct_connecteur_sql *) (*s_connecteur).objet)).type = type_base;
  108: 
  109:     if (locale != NULL)
  110:     {
  111:         if (((*((struct_connecteur_sql *) (*s_connecteur).objet)).locale
  112:                 = malloc((strlen(locale) + 1) * sizeof(unsigned char))) == NULL)
  113:         {
  114:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  115:             return(NULL);
  116:         }
  117: 
  118:         strcpy((*((struct_connecteur_sql *) (*s_connecteur).objet)).locale,
  119:                 locale);
  120: 
  121:         if (((*((struct_connecteur_sql *) (*s_connecteur).objet)).type
  122:                 = realloc((*((struct_connecteur_sql *) (*s_connecteur).objet))
  123:                 .type, (strlen((*((struct_connecteur_sql *) (*s_connecteur)
  124:                 .objet)).type) + 1) * sizeof(unsigned char))) == NULL)
  125:         {
  126:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  127:             return(NULL);
  128:         }
  129:     }
  130:     else
  131:     {
  132:         (*((struct_connecteur_sql *) (*s_connecteur).objet)).locale = NULL;
  133:     }
  134: 
  135:     (*((struct_connecteur_sql *) (*s_connecteur).objet)).pid = getpid();
  136:     (*((struct_connecteur_sql *) (*s_connecteur).objet)).tid = pthread_self();
  137: 
  138:     // Recherche du nom ou de l'adresse du serveur
  139: 
  140:     l_element_courant = (*l_element_courant).suivant;
  141: 
  142:     if (l_element_courant == NULL)
  143:     {
  144:         liberation(s_etat_processus, s_connecteur);
  145:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  146:         return(NULL);
  147:     }
  148: 
  149:     if ((*(*l_element_courant).donnee).type != CHN)
  150:     {
  151:         liberation(s_etat_processus, s_connecteur);
  152:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  153:         return(NULL);
  154:     }
  155: 
  156:     serveur = (unsigned char *) (*(*l_element_courant).donnee).objet;
  157: 
  158:     // Recherche du nom de la base de données
  159: 
  160:     l_element_courant = (*l_element_courant).suivant;
  161: 
  162:     if (l_element_courant == NULL)
  163:     {
  164:         liberation(s_etat_processus, s_connecteur);
  165:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  166:         return(NULL);
  167:     }
  168: 
  169:     if ((*(*l_element_courant).donnee).type != CHN)
  170:     {
  171:         liberation(s_etat_processus, s_connecteur);
  172:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  173:         return(NULL);
  174:     }
  175: 
  176:     base = (unsigned char *) (*(*l_element_courant).donnee).objet;
  177: 
  178:     // Recherche de l'utilisateur
  179: 
  180:     l_element_courant = (*l_element_courant).suivant;
  181: 
  182:     if (l_element_courant == NULL)
  183:     {
  184:         liberation(s_etat_processus, s_connecteur);
  185:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  186:         return(NULL);
  187:     }
  188: 
  189:     if ((*(*l_element_courant).donnee).type != CHN)
  190:     {
  191:         liberation(s_etat_processus, s_connecteur);
  192:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  193:         return(NULL);
  194:     }
  195: 
  196:     utilisateur = (unsigned char *) (*(*l_element_courant).donnee).objet;
  197: 
  198:     // Recherche du mot de passe
  199: 
  200:     l_element_courant = (*l_element_courant).suivant;
  201: 
  202:     if (l_element_courant == NULL)
  203:     {
  204:         liberation(s_etat_processus, s_connecteur);
  205:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  206:         return(NULL);
  207:     }
  208: 
  209:     if ((*(*l_element_courant).donnee).type != CHN)
  210:     {
  211:         liberation(s_etat_processus, s_connecteur);
  212:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  213:         return(NULL);
  214:     }
  215: 
  216:     mot_de_passe = (unsigned char *) (*(*l_element_courant).donnee).objet;
  217: 
  218:     // Recherche du port le cas échéant
  219: 
  220:     l_element_courant = (*l_element_courant).suivant;
  221: 
  222:     if (l_element_courant != NULL)
  223:     {
  224:         if ((*(*l_element_courant).donnee).type != INT)
  225:         {
  226:             liberation(s_etat_processus, s_connecteur);
  227:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  228:             return(NULL);
  229:         }
  230: 
  231:         if (((*((integer8 *) (*(*l_element_courant).donnee).objet)) < 0)
  232:                 || ((*((integer8 *) (*(*l_element_courant).donnee)
  233:                 .objet)) > 65535))
  234:         {
  235:             liberation(s_etat_processus, s_connecteur);
  236:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  237:             return(NULL);
  238:         }
  239: 
  240:         port = (unsigned int) (*((integer8 *)
  241:                 (*(*l_element_courant).donnee).objet));
  242: 
  243:         if ((*l_element_courant).suivant != NULL)
  244:         {
  245:             liberation(s_etat_processus, s_connecteur);
  246:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  247:             return(NULL);
  248:         }
  249:     }
  250:     else
  251:     {
  252:         port = 0;
  253:     }
  254: 
  255:     if (strcmp((*((struct_connecteur_sql *) (*s_connecteur).objet)).type,
  256:                 "MYSQL") == 0)
  257:     {
  258: #       ifdef MYSQL_SUPPORT
  259:         (*((struct_connecteur_sql *) (*s_connecteur).objet))
  260:                 .descripteur.mysql = NULL;
  261: 
  262:         if (((*((struct_connecteur_sql *) (*s_connecteur).objet))
  263:                 .descripteur.mysql = mysql_init(NULL)) == NULL)
  264:         {
  265:             liberation(s_etat_processus, s_connecteur);
  266:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  267:             return(NULL);
  268:         }
  269: 
  270:         if (mysql_real_connect((*((struct_connecteur_sql *) (*s_connecteur)
  271:                 .objet)).descripteur.mysql, serveur, utilisateur, mot_de_passe,
  272:                 base, port, NULL, 0) == NULL)
  273:         {
  274:             mysql_close((*((struct_connecteur_sql *) (*s_connecteur).objet))
  275:                     .descripteur.mysql);
  276: 
  277:             liberation(s_etat_processus, s_connecteur);
  278:             (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
  279:             return(NULL);
  280:         }
  281: #       else
  282:         if ((*s_etat_processus).langue == 'F')
  283:         {
  284:             printf("+++Attention : Support de MySQL non compilé !\n");
  285:         }
  286:         else
  287:         {
  288:             printf("+++Warning : MySQL support not available !\n");
  289:         }
  290: 
  291:         fflush(stdout);
  292: #       endif
  293:     }
  294:     else if (strcmp((*((struct_connecteur_sql *) (*s_connecteur).objet)).type,
  295:                 "POSTGRESQL") == 0)
  296:     {
  297: #       ifdef POSTGRESQL_SUPPORT
  298:         if (port == 0)
  299:         {
  300:             sport = NULL;
  301:         }
  302:         else
  303:         {
  304:             if ((sport = malloc(32 * sizeof(unsigned char))) == NULL)
  305:             {
  306:                 liberation(s_etat_processus, s_connecteur);
  307:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  308:                 return(NULL);
  309:             }
  310: 
  311:             sprintf(sport, "%u", port);
  312:         }
  313: 
  314:         (*((struct_connecteur_sql *) (*s_connecteur).objet)).descripteur
  315:                 .postgresql = PQsetdbLogin(serveur, sport, NULL, NULL,
  316:                 base, utilisateur, mot_de_passe);
  317: 
  318:         free(sport);
  319: 
  320:         if (PQstatus((*((struct_connecteur_sql *) (*s_connecteur).objet))
  321:                 .descripteur.postgresql) != CONNECTION_OK)
  322:         {
  323:             PQfinish((*((struct_connecteur_sql *) (*s_connecteur).objet))
  324:                     .descripteur.postgresql);
  325: 
  326:             liberation(s_etat_processus, s_connecteur);
  327:             (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
  328:             return(NULL);
  329:         }
  330: #       else
  331:         if ((*s_etat_processus).langue == 'F')
  332:         {
  333:             printf("+++Attention : Support de PostgreSQL non compilé !\n");
  334:         }
  335:         else
  336:         {
  337:             printf("+++Warning : PostgreSQL support not available !\n");
  338:         }
  339: 
  340:         fflush(stdout);
  341: #       endif
  342:     }
  343:     else
  344:     {
  345:         liberation(s_etat_processus, s_connecteur);
  346:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  347:         return(NULL);
  348:     }
  349: 
  350:     return(s_connecteur);
  351: }
  352: 
  353: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>