Annotation of rpl/src/sql.c, revision 1.1
1.1 ! bertrand 1: /*
! 2: ================================================================================
! 3: RPL/2 (R) version 4.0.9
! 4: Copyright (C) 1989-2010 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>