![]() ![]() | ![]() |
Passage de la branche 4.1 en branche stable.
1: /* 2: ================================================================================ 3: RPL/2 (R) version 4.1.0 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