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