Annotation of rpl/src/sql.c, revision 1.41

1.1       bertrand    1: /*
                      2: ================================================================================
1.41    ! bertrand    3:   RPL/2 (R) version 4.1.12
1.33      bertrand    4:   Copyright (C) 1989-2012 Dr. BERTRAND Joël
1.1       bertrand    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: 
1.12      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   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: {
1.31      bertrand   41: #if defined(MYSQL_SUPPORT) || defined(POSTGRESQL_SUPPORT)
1.1       bertrand   42:    struct_liste_chainee            *l_element_courant;
                     43: 
                     44:    struct_objet                    *s_connecteur;
                     45: 
1.31      bertrand   46:    unsigned char                   *locale;
                     47:    unsigned char                   *type_base;
                     48:    unsigned char                   *serveur;
1.1       bertrand   49:    unsigned char                   *base;
1.31      bertrand   50:    unsigned char                   *utilisateur;
1.1       bertrand   51:    unsigned char                   *mot_de_passe;
1.31      bertrand   52: #  ifdef POSTGRESQL_SUPPORT
1.1       bertrand   53:    unsigned char                   *sport;
1.31      bertrand   54: #  endif
1.1       bertrand   55: 
                     56:    unsigned int                    port;
                     57: 
                     58:    if ((*s_parametres).type != LST)
                     59:    {
                     60:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                     61:        return(NULL);
                     62:    }
                     63: 
                     64:    l_element_courant = (struct_liste_chainee *) (*s_parametres).objet;
                     65: 
                     66:    if (l_element_courant == NULL)
                     67:    {
                     68:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                     69:        return(NULL);
                     70:    }
                     71: 
                     72:    if ((*(*l_element_courant).donnee).type != CHN)
                     73:    {
                     74:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                     75:        return(NULL);
                     76:    }
                     77: 
                     78:    if ((type_base = conversion_majuscule((unsigned char *)
                     79:            (*(*l_element_courant).donnee).objet)) == NULL)
                     80:    {
                     81:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                     82:        return(NULL);
                     83:    }
                     84: 
                     85:    locale = index(type_base, ':');
                     86: 
                     87:    if (locale != NULL)
                     88:    {
                     89:        (*locale) = d_code_fin_chaine;
                     90:        locale++;
                     91:    }
                     92: 
                     93:    /*
                     94:     * Vérifications des types de base de données
                     95:     */
                     96: 
                     97:    if ((strcmp(type_base, "MYSQL") != 0) &&
                     98:            (strcmp(type_base, "POSTGRESQL") != 0))
                     99:    {
                    100:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    101:        return(NULL);
                    102:    }
                    103: 
                    104:    if ((s_connecteur = allocation(s_etat_processus, SQL)) == NULL)
                    105:    {
                    106:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    107:        return(NULL);
                    108:    }
                    109: 
                    110:    (*((struct_connecteur_sql *) (*s_connecteur).objet)).type = type_base;
                    111: 
                    112:    if (locale != NULL)
                    113:    {
                    114:        if (((*((struct_connecteur_sql *) (*s_connecteur).objet)).locale
                    115:                = malloc((strlen(locale) + 1) * sizeof(unsigned char))) == NULL)
                    116:        {
                    117:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    118:            return(NULL);
                    119:        }
                    120: 
                    121:        strcpy((*((struct_connecteur_sql *) (*s_connecteur).objet)).locale,
                    122:                locale);
                    123: 
                    124:        if (((*((struct_connecteur_sql *) (*s_connecteur).objet)).type
                    125:                = realloc((*((struct_connecteur_sql *) (*s_connecteur).objet))
                    126:                .type, (strlen((*((struct_connecteur_sql *) (*s_connecteur)
                    127:                .objet)).type) + 1) * sizeof(unsigned char))) == NULL)
                    128:        {
                    129:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    130:            return(NULL);
                    131:        }
                    132:    }
                    133:    else
                    134:    {
                    135:        (*((struct_connecteur_sql *) (*s_connecteur).objet)).locale = NULL;
                    136:    }
                    137: 
                    138:    (*((struct_connecteur_sql *) (*s_connecteur).objet)).pid = getpid();
                    139:    (*((struct_connecteur_sql *) (*s_connecteur).objet)).tid = pthread_self();
                    140: 
                    141:    // Recherche du nom ou de l'adresse du serveur
                    142: 
                    143:    l_element_courant = (*l_element_courant).suivant;
                    144: 
                    145:    if (l_element_courant == NULL)
                    146:    {
                    147:        liberation(s_etat_processus, s_connecteur);
                    148:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    149:        return(NULL);
                    150:    }
                    151: 
                    152:    if ((*(*l_element_courant).donnee).type != CHN)
                    153:    {
                    154:        liberation(s_etat_processus, s_connecteur);
                    155:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    156:        return(NULL);
                    157:    }
                    158: 
                    159:    serveur = (unsigned char *) (*(*l_element_courant).donnee).objet;
                    160: 
                    161:    // Recherche du nom de la base de données
                    162: 
                    163:    l_element_courant = (*l_element_courant).suivant;
                    164: 
                    165:    if (l_element_courant == NULL)
                    166:    {
                    167:        liberation(s_etat_processus, s_connecteur);
                    168:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    169:        return(NULL);
                    170:    }
                    171: 
                    172:    if ((*(*l_element_courant).donnee).type != CHN)
                    173:    {
                    174:        liberation(s_etat_processus, s_connecteur);
                    175:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    176:        return(NULL);
                    177:    }
                    178: 
                    179:    base = (unsigned char *) (*(*l_element_courant).donnee).objet;
                    180: 
                    181:    // Recherche de l'utilisateur
                    182: 
                    183:    l_element_courant = (*l_element_courant).suivant;
                    184: 
                    185:    if (l_element_courant == NULL)
                    186:    {
                    187:        liberation(s_etat_processus, s_connecteur);
                    188:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    189:        return(NULL);
                    190:    }
                    191: 
                    192:    if ((*(*l_element_courant).donnee).type != CHN)
                    193:    {
                    194:        liberation(s_etat_processus, s_connecteur);
                    195:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    196:        return(NULL);
                    197:    }
                    198: 
                    199:    utilisateur = (unsigned char *) (*(*l_element_courant).donnee).objet;
                    200: 
                    201:    // Recherche du mot de passe
                    202: 
                    203:    l_element_courant = (*l_element_courant).suivant;
                    204: 
                    205:    if (l_element_courant == NULL)
                    206:    {
                    207:        liberation(s_etat_processus, s_connecteur);
                    208:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    209:        return(NULL);
                    210:    }
                    211: 
                    212:    if ((*(*l_element_courant).donnee).type != CHN)
                    213:    {
                    214:        liberation(s_etat_processus, s_connecteur);
                    215:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    216:        return(NULL);
                    217:    }
                    218: 
                    219:    mot_de_passe = (unsigned char *) (*(*l_element_courant).donnee).objet;
                    220: 
                    221:    // Recherche du port le cas échéant
                    222: 
                    223:    l_element_courant = (*l_element_courant).suivant;
                    224: 
                    225:    if (l_element_courant != NULL)
                    226:    {
                    227:        if ((*(*l_element_courant).donnee).type != INT)
                    228:        {
                    229:            liberation(s_etat_processus, s_connecteur);
                    230:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    231:            return(NULL);
                    232:        }
                    233: 
                    234:        if (((*((integer8 *) (*(*l_element_courant).donnee).objet)) < 0)
                    235:                || ((*((integer8 *) (*(*l_element_courant).donnee)
                    236:                .objet)) > 65535))
                    237:        {
                    238:            liberation(s_etat_processus, s_connecteur);
                    239:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    240:            return(NULL);
                    241:        }
                    242: 
                    243:        port = (unsigned int) (*((integer8 *)
                    244:                (*(*l_element_courant).donnee).objet));
                    245: 
                    246:        if ((*l_element_courant).suivant != NULL)
                    247:        {
                    248:            liberation(s_etat_processus, s_connecteur);
                    249:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    250:            return(NULL);
                    251:        }
                    252:    }
                    253:    else
                    254:    {
                    255:        port = 0;
                    256:    }
                    257: 
                    258:    if (strcmp((*((struct_connecteur_sql *) (*s_connecteur).objet)).type,
                    259:                "MYSQL") == 0)
                    260:    {
                    261: #      ifdef MYSQL_SUPPORT
                    262:        (*((struct_connecteur_sql *) (*s_connecteur).objet))
                    263:                .descripteur.mysql = NULL;
                    264: 
                    265:        if (((*((struct_connecteur_sql *) (*s_connecteur).objet))
                    266:                .descripteur.mysql = mysql_init(NULL)) == NULL)
                    267:        {
                    268:            liberation(s_etat_processus, s_connecteur);
                    269:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    270:            return(NULL);
                    271:        }
                    272: 
                    273:        if (mysql_real_connect((*((struct_connecteur_sql *) (*s_connecteur)
                    274:                .objet)).descripteur.mysql, serveur, utilisateur, mot_de_passe,
                    275:                base, port, NULL, 0) == NULL)
                    276:        {
                    277:            mysql_close((*((struct_connecteur_sql *) (*s_connecteur).objet))
                    278:                    .descripteur.mysql);
                    279: 
                    280:            liberation(s_etat_processus, s_connecteur);
                    281:            (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
                    282:            return(NULL);
                    283:        }
                    284: #      else
                    285:        if ((*s_etat_processus).langue == 'F')
                    286:        {
                    287:            printf("+++Attention : Support de MySQL non compilé !\n");
                    288:        }
                    289:        else
                    290:        {
                    291:            printf("+++Warning : MySQL support not available !\n");
                    292:        }
                    293: 
                    294:        fflush(stdout);
1.36      bertrand  295: 
                    296:        (*s_etat_processus).erreur_execution = d_ex_instruction_indisponible;
1.1       bertrand  297: #      endif
                    298:    }
                    299:    else if (strcmp((*((struct_connecteur_sql *) (*s_connecteur).objet)).type,
                    300:                "POSTGRESQL") == 0)
                    301:    {
                    302: #      ifdef POSTGRESQL_SUPPORT
                    303:        if (port == 0)
                    304:        {
                    305:            sport = NULL;
                    306:        }
                    307:        else
                    308:        {
                    309:            if ((sport = malloc(32 * sizeof(unsigned char))) == NULL)
                    310:            {
                    311:                liberation(s_etat_processus, s_connecteur);
                    312:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    313:                return(NULL);
                    314:            }
                    315: 
                    316:            sprintf(sport, "%u", port);
                    317:        }
                    318: 
                    319:        (*((struct_connecteur_sql *) (*s_connecteur).objet)).descripteur
                    320:                .postgresql = PQsetdbLogin(serveur, sport, NULL, NULL,
                    321:                base, utilisateur, mot_de_passe);
                    322: 
                    323:        free(sport);
                    324: 
                    325:        if (PQstatus((*((struct_connecteur_sql *) (*s_connecteur).objet))
                    326:                .descripteur.postgresql) != CONNECTION_OK)
                    327:        {
                    328:            PQfinish((*((struct_connecteur_sql *) (*s_connecteur).objet))
                    329:                    .descripteur.postgresql);
                    330: 
                    331:            liberation(s_etat_processus, s_connecteur);
                    332:            (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
                    333:            return(NULL);
                    334:        }
                    335: #      else
                    336:        if ((*s_etat_processus).langue == 'F')
                    337:        {
                    338:            printf("+++Attention : Support de PostgreSQL non compilé !\n");
                    339:        }
                    340:        else
                    341:        {
                    342:            printf("+++Warning : PostgreSQL support not available !\n");
                    343:        }
                    344: 
                    345:        fflush(stdout);
1.36      bertrand  346: 
                    347:        (*s_etat_processus).erreur_execution = d_ex_instruction_indisponible;
1.1       bertrand  348: #      endif
                    349:    }
                    350:    else
                    351:    {
                    352:        liberation(s_etat_processus, s_connecteur);
                    353:        (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    354:        return(NULL);
                    355:    }
                    356: 
                    357:    return(s_connecteur);
1.31      bertrand  358: #else
                    359:    return(NULL);
                    360: #endif
1.1       bertrand  361: }
                    362: 
                    363: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>