1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.13
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 'splash'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_splash(struct_processus *s_etat_processus)
40: {
41: real8 attente;
42:
43: struct_objet *s_objet;
44:
45: (*s_etat_processus).erreur_execution = d_ex;
46:
47: if ((*s_etat_processus).affichage_arguments == 'Y')
48: {
49: printf("\n SPLASH ");
50:
51: if ((*s_etat_processus).langue == 'F')
52: {
53: printf("(écran RPL/2)\n\n");
54: }
55: else
56: {
57: printf("(RPL/2 splash screen)\n\n");
58: }
59:
60: printf(" 1: %s, %s\n", d_INT, d_REL);
61:
62: return;
63: }
64: else if ((*s_etat_processus).test_instruction == 'Y')
65: {
66: (*s_etat_processus).nombre_arguments = -1;
67: return;
68: }
69:
70: if (test_cfsf(s_etat_processus, 31) == d_vrai)
71: {
72: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
73: {
74: return;
75: }
76: }
77:
78: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
79: &s_objet) == d_erreur)
80: {
81: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
82: return;
83: }
84:
85: if (((*s_objet).type == INT) ||
86: ((*s_objet).type == REL))
87: {
88: if ((*s_objet).type == INT)
89: {
90: attente = (real8) (*((integer8 *) (*s_objet).objet));
91: }
92: else
93: {
94: attente = (*((real8 *) (*s_objet).objet));
95: }
96:
97: if (attente < 0)
98: {
99: liberation(s_etat_processus, s_objet);
100:
101: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
102: return;
103: }
104:
105: encart(s_etat_processus, (unsigned long) (attente * 1E6));
106: }
107: else
108: {
109: liberation(s_etat_processus, s_objet);
110:
111: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
112: return;
113: }
114:
115: liberation(s_etat_processus, s_objet);
116:
117: return;
118: }
119:
120:
121: /*
122: ================================================================================
123: Fonction 'send'
124: ================================================================================
125: Entrées :
126: --------------------------------------------------------------------------------
127: Sorties :
128: --------------------------------------------------------------------------------
129: Effets de bord : néant
130: ================================================================================
131: */
132:
133: void
134: instruction_send(struct_processus *s_etat_processus)
135: {
136: pid_t pid;
137:
138: pthread_t tid;
139:
140: sig_atomic_t registre;
141:
142: ssize_t longueur_ecriture;
143:
144: struct_objet *s_objet;
145:
146: struct timespec attente;
147:
148: unsigned char tampon;
149:
150: (*s_etat_processus).erreur_execution = d_ex;
151:
152: if ((*s_etat_processus).affichage_arguments == 'Y')
153: {
154: printf("\n SEND ");
155:
156: if ((*s_etat_processus).langue == 'F')
157: {
158: printf("(envoi de données au processus père)\n\n");
159: }
160: else
161: {
162: printf("(send data to parent process)\n\n");
163: }
164:
165: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
166: " %s, %s, %s, %s, %s,\n"
167: " %s, %s, %s, %s, %s\n",
168: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
169: d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_TAB);
170:
171: return;
172: }
173: else if ((*s_etat_processus).test_instruction == 'Y')
174: {
175: (*s_etat_processus).nombre_arguments = -1;
176: return;
177: }
178:
179: if (test_cfsf(s_etat_processus, 31) == d_vrai)
180: {
181: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
182: {
183: return;
184: }
185: }
186:
187: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
188: &s_objet) == d_erreur)
189: {
190: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
191: return;
192: }
193:
194: if ((*s_etat_processus).presence_pipes == d_faux)
195: {
196: liberation(s_etat_processus, s_objet);
197:
198: (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere;
199: return;
200: }
201:
202: if (((*s_objet).type != INT) &&
203: ((*s_objet).type != REL) &&
204: ((*s_objet).type != CPL) &&
205: ((*s_objet).type != VIN) &&
206: ((*s_objet).type != VRL) &&
207: ((*s_objet).type != VCX) &&
208: ((*s_objet).type != MIN) &&
209: ((*s_objet).type != MRL) &&
210: ((*s_objet).type != MCX) &&
211: ((*s_objet).type != BIN) &&
212: ((*s_objet).type != NOM) &&
213: ((*s_objet).type != CHN) &&
214: ((*s_objet).type != LST) &&
215: ((*s_objet).type != ALG) &&
216: ((*s_objet).type != RPN) &&
217: ((*s_objet).type != TBL))
218: {
219: liberation(s_etat_processus, s_objet);
220:
221: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
222: return;
223: }
224:
225: /*
226: * On signale au processus père qu'il y a un objet de plus
227: * dans le pipe de données.
228: */
229:
230: registre = (*s_etat_processus).var_volatile_traitement_retarde_stop;
231: (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
232:
233: if ((*s_etat_processus).processus_detache == d_vrai)
234: {
235: if ((*s_etat_processus).profilage == d_vrai)
236: {
237: profilage(s_etat_processus, "Interprocess communications (SEND)");
238:
239: if ((*s_etat_processus).erreur_systeme != d_es)
240: {
241: return;
242: }
243: }
244:
245: pid = -3;
246:
247: attente.tv_sec = 0;
248: attente.tv_nsec = GRANULARITE_us * 1000;
249:
250: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
251: {
252: (*s_etat_processus).erreur_systeme = d_es_processus;
253: return;
254: }
255:
256: while((longueur_ecriture = write_atomic(s_etat_processus,
257: (*s_etat_processus).pipe_nombre_objets_attente,
258: &pid, sizeof(pid))) != sizeof(pid))
259: {
260: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
261: {
262: if (errno != EINTR)
263: {
264: (*s_etat_processus).erreur_systeme = d_es_processus;
265: return;
266: }
267: }
268:
269: if (longueur_ecriture == -1)
270: {
271: if ((*s_etat_processus).profilage == d_vrai)
272: {
273: profilage(s_etat_processus, NULL);
274: }
275:
276: (*s_etat_processus).erreur_systeme = d_es_processus;
277: return;
278: }
279:
280: nanosleep(&attente, NULL);
281: INCR_GRANULARITE(attente.tv_nsec);
282:
283: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
284: {
285: (*s_etat_processus).erreur_systeme = d_es_processus;
286: return;
287: }
288: }
289:
290: pid = getpid();
291:
292: attente.tv_sec = 0;
293: attente.tv_nsec = GRANULARITE_us * 1000;
294:
295: while((longueur_ecriture = write_atomic(s_etat_processus,
296: (*s_etat_processus).pipe_nombre_objets_attente,
297: &pid, sizeof(pid))) != sizeof(pid))
298: {
299: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
300: {
301: if (errno != EINTR)
302: {
303: (*s_etat_processus).erreur_systeme = d_es_processus;
304: return;
305: }
306: }
307:
308: if (longueur_ecriture == -1)
309: {
310: if ((*s_etat_processus).profilage == d_vrai)
311: {
312: profilage(s_etat_processus, NULL);
313: }
314:
315: (*s_etat_processus).erreur_systeme = d_es_processus;
316: return;
317: }
318:
319: nanosleep(&attente, NULL);
320: INCR_GRANULARITE(attente.tv_nsec);
321:
322: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
323: {
324: (*s_etat_processus).erreur_systeme = d_es_processus;
325: return;
326: }
327: }
328:
329: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
330: {
331: if (errno != EINTR)
332: {
333: (*s_etat_processus).erreur_systeme = d_es_processus;
334: return;
335: }
336: }
337: }
338: else
339: {
340: if ((*s_etat_processus).profilage == d_vrai)
341: {
342: profilage(s_etat_processus, "Interthread communications (SEND)");
343:
344: if ((*s_etat_processus).erreur_systeme != d_es)
345: {
346: return;
347: }
348: }
349:
350: tid = -3;
351:
352: attente.tv_sec = 0;
353: attente.tv_nsec = GRANULARITE_us * 1000;
354:
355: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
356: {
357: (*s_etat_processus).erreur_systeme = d_es_processus;
358: return;
359: }
360:
361: while((longueur_ecriture = write_atomic(s_etat_processus,
362: (*s_etat_processus).pipe_nombre_objets_attente,
363: &tid, sizeof(tid))) != sizeof(tid))
364: {
365: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
366: {
367: if (errno != EINTR)
368: {
369: (*s_etat_processus).erreur_systeme = d_es_processus;
370: return;
371: }
372: }
373:
374: if (longueur_ecriture == -1)
375: {
376: if ((*s_etat_processus).profilage == d_vrai)
377: {
378: profilage(s_etat_processus, NULL);
379: }
380:
381: (*s_etat_processus).erreur_systeme = d_es_processus;
382: return;
383: }
384:
385: nanosleep(&attente, NULL);
386: INCR_GRANULARITE(attente.tv_nsec);
387:
388: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
389: {
390: (*s_etat_processus).erreur_systeme = d_es_processus;
391: return;
392: }
393: }
394:
395: tid = pthread_self();
396:
397: attente.tv_sec = 0;
398: attente.tv_nsec = GRANULARITE_us * 1000;
399:
400: while((longueur_ecriture = write_atomic(s_etat_processus,
401: (*s_etat_processus).pipe_nombre_objets_attente,
402: &tid, sizeof(tid))) != sizeof(tid))
403: {
404: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
405: {
406: if (errno != EINTR)
407: {
408: (*s_etat_processus).erreur_systeme = d_es_processus;
409: return;
410: }
411: }
412:
413: if (longueur_ecriture == -1)
414: {
415: if ((*s_etat_processus).profilage == d_vrai)
416: {
417: profilage(s_etat_processus, NULL);
418: }
419:
420: (*s_etat_processus).erreur_systeme = d_es_processus;
421: return;
422: }
423:
424: nanosleep(&attente, NULL);
425: INCR_GRANULARITE(attente.tv_nsec);
426:
427: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
428: {
429: (*s_etat_processus).erreur_systeme = d_es_processus;
430: return;
431: }
432: }
433:
434: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
435: {
436: if (errno != EINTR)
437: {
438: (*s_etat_processus).erreur_systeme = d_es_processus;
439: return;
440: }
441: }
442: }
443:
444: (*s_etat_processus).nombre_objets_envoyes_non_lus++;
445:
446: attente.tv_sec = 0;
447: attente.tv_nsec = GRANULARITE_us * 1000;
448:
449: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
450: {
451: (*s_etat_processus).erreur_systeme = d_es_processus;
452: return;
453: }
454:
455: while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement,
456: &tampon, sizeof(unsigned char)) != sizeof(unsigned char))
457: {
458: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
459: {
460: if (errno != EINTR)
461: {
462: (*s_etat_processus).erreur_systeme = d_es_processus;
463: return;
464: }
465: }
466:
467: nanosleep(&attente, NULL);
468: INCR_GRANULARITE(attente.tv_nsec);
469:
470: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
471: {
472: (*s_etat_processus).erreur_systeme = d_es_processus;
473: return;
474: }
475: }
476:
477: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
478: {
479: if (errno != EINTR)
480: {
481: (*s_etat_processus).erreur_systeme = d_es_processus;
482: return;
483: }
484: }
485:
486: // Envoi d'un PID invalide (-1) pour ne pas bloquer le thread
487: // de surveillance.
488:
489: if ((*s_etat_processus).processus_detache == d_vrai)
490: {
491: pid = -1;
492:
493: attente.tv_sec = 0;
494: attente.tv_nsec = GRANULARITE_us * 1000;
495:
496: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
497: {
498: (*s_etat_processus).erreur_systeme = d_es_processus;
499: return;
500: }
501:
502: while((longueur_ecriture = write_atomic(s_etat_processus,
503: (*s_etat_processus).pipe_nombre_interruptions_attente,
504: &pid, sizeof(pid))) != sizeof(pid))
505: {
506: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
507: {
508: if (errno != EINTR)
509: {
510: (*s_etat_processus).erreur_systeme = d_es_processus;
511: return;
512: }
513: }
514:
515: if (longueur_ecriture == -1)
516: {
517: if ((*s_etat_processus).profilage == d_vrai)
518: {
519: profilage(s_etat_processus, NULL);
520: }
521:
522: (*s_etat_processus).erreur_systeme = d_es_processus;
523: return;
524: }
525:
526: nanosleep(&attente, NULL);
527: INCR_GRANULARITE(attente.tv_nsec);
528:
529: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
530: {
531: (*s_etat_processus).erreur_systeme = d_es_processus;
532: return;
533: }
534: }
535:
536: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
537: {
538: if (errno != EINTR)
539: {
540: (*s_etat_processus).erreur_systeme = d_es_processus;
541: return;
542: }
543: }
544: }
545: else
546: {
547: tid = -1;
548:
549: attente.tv_sec = 0;
550: attente.tv_nsec = GRANULARITE_us * 1000;
551:
552: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
553: {
554: (*s_etat_processus).erreur_systeme = d_es_processus;
555: return;
556: }
557:
558: while((longueur_ecriture = write_atomic(s_etat_processus,
559: (*s_etat_processus).pipe_nombre_interruptions_attente,
560: &tid, sizeof(tid))) != sizeof(tid))
561: {
562: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
563: {
564: if (errno != EINTR)
565: {
566: (*s_etat_processus).erreur_systeme = d_es_processus;
567: return;
568: }
569: }
570:
571: if (longueur_ecriture == -1)
572: {
573: if ((*s_etat_processus).profilage == d_vrai)
574: {
575: profilage(s_etat_processus, NULL);
576: }
577:
578: (*s_etat_processus).erreur_systeme = d_es_processus;
579: return;
580: }
581:
582: nanosleep(&attente, NULL);
583: INCR_GRANULARITE(attente.tv_nsec);
584:
585: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
586: {
587: (*s_etat_processus).erreur_systeme = d_es_processus;
588: return;
589: }
590: }
591:
592: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
593: {
594: if (errno != EINTR)
595: {
596: (*s_etat_processus).erreur_systeme = d_es_processus;
597: return;
598: }
599: }
600: }
601:
602: // ecriture_pipe() ne peut être interrompu par un signal.
603:
604: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
605: {
606: (*s_etat_processus).erreur_systeme = d_es_processus;
607: return;
608: }
609:
610: if (ecriture_pipe(s_etat_processus, (*s_etat_processus).pipe_donnees,
611: s_objet) == d_erreur)
612: {
613: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
614: {
615: if (errno != EINTR)
616: {
617: (*s_etat_processus).erreur_systeme = d_es_processus;
618: return;
619: }
620: }
621:
622: if ((*s_etat_processus).profilage == d_vrai)
623: {
624: profilage(s_etat_processus, NULL);
625: }
626:
627: liberation(s_etat_processus, s_objet);
628: return;
629: }
630:
631: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
632: {
633: if (errno != EINTR)
634: {
635: (*s_etat_processus).erreur_systeme = d_es_processus;
636: return;
637: }
638: }
639:
640: if ((*s_etat_processus).profilage == d_vrai)
641: {
642: profilage(s_etat_processus, NULL);
643: }
644:
645: if (registre == 0)
646: {
647: if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
648: {
649: (*s_etat_processus).var_volatile_requete_arret = -1;
650: }
651:
652: (*s_etat_processus).var_volatile_traitement_retarde_stop = registre;
653: }
654:
655: liberation(s_etat_processus, s_objet);
656: return;
657: }
658:
659:
660: /*
661: ================================================================================
662: Fonction 'sqlquery'
663: ================================================================================
664: Entrées :
665: --------------------------------------------------------------------------------
666: Sorties :
667: --------------------------------------------------------------------------------
668: Effets de bord : néant
669: ================================================================================
670: */
671:
672: void
673: instruction_sqlquery(struct_processus *s_etat_processus)
674: {
675: # define d_LONGUEUR 1024
676:
677: logical1 connexion_permanente;
678: logical1 presence_resultat;
679:
680: struct_objet *s_copie_1;
681: struct_objet *s_objet_1;
682: struct_objet *s_copie_2;
683: struct_objet *s_objet_2;
684: struct_objet *s_objet_resultat;
685:
686: struct_liste_chainee *l_element_courant;
687: struct_liste_chainee *l_element_courant_ligne;
688:
689: unsigned char *tampon;
690:
691: unsigned int i;
692: unsigned int j;
693: unsigned int nombre_colonnes;
694: unsigned int nombre_lignes;
695:
696: (*s_etat_processus).erreur_execution = d_ex;
697:
698: if ((*s_etat_processus).affichage_arguments == 'Y')
699: {
700: printf("\n SQLQUERY ");
701:
702: if ((*s_etat_processus).langue == 'F')
703: {
704: printf("(requête SQL)\n\n");
705: }
706: else
707: {
708: printf("(SQL query)\n\n");
709: }
710:
711: printf(" 2: %s\n", d_CHN);
712: printf(" 1: %s\n", d_LST);
713: printf("-> 1: %s\n\n", d_LST);
714:
715: printf(" 2: %s\n", d_CHN);
716: printf(" 1: %s\n", d_SQL);
717: printf("-> 1: %s\n\n", d_LST);
718:
719: if ((*s_etat_processus).langue == 'F')
720: {
721: printf(" Utilisation :\n\n");
722: }
723: else
724: {
725: printf(" Usage:\n\n");
726: }
727:
728: printf(" \"select * from table\"\n");
729: printf(" { \"mysql\" \"server\" \"database\" "
730: "\"user\" \"password\" } SQLQUERY\n");
731: printf(" \"select field from table\"\n");
732: printf(" { \"postgresql:iso-8859-1\" \"server\" "
733: "\"database\" \"user\" \"password\" port }\n");
734: printf(" SQLQUERY\n");
735:
736: return;
737: }
738: else if ((*s_etat_processus).test_instruction == 'Y')
739: {
740: (*s_etat_processus).nombre_arguments = -1;
741: return;
742: }
743:
744: if (test_cfsf(s_etat_processus, 31) == d_vrai)
745: {
746: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
747: {
748: return;
749: }
750: }
751:
752: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
753: &s_objet_1) == d_erreur)
754: {
755: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
756: return;
757: }
758:
759: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
760: &s_objet_2) == d_erreur)
761: {
762: liberation(s_etat_processus, s_objet_1);
763:
764: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
765: return;
766: }
767:
768: if ((*s_objet_1).type == LST)
769: {
770: connexion_permanente = d_faux;
771:
772: s_copie_1 = s_objet_1;
773:
774: if ((s_objet_1 = parametres_sql(s_etat_processus, s_copie_1)) == NULL)
775: {
776: liberation(s_etat_processus, s_copie_1);
777: liberation(s_etat_processus, s_objet_2);
778: return;
779: }
780:
781: liberation(s_etat_processus, s_copie_1);
782: }
783: else
784: {
785: if ((*s_objet_1).type == SQL)
786: {
787: if (((*((struct_connecteur_sql *) (*s_objet_1).objet)).pid !=
788: getpid()) || (pthread_equal((*((struct_connecteur_sql *)
789: (*s_objet_1).objet)).tid, pthread_self()) == 0))
790: {
791: (*s_etat_processus).erreur_execution =
792: d_ex_fichier_hors_contexte;
793:
794: liberation(s_etat_processus, s_objet_1);
795: liberation(s_etat_processus, s_objet_2);
796: return;
797: }
798: }
799:
800: connexion_permanente = d_vrai;
801: }
802:
803: if (((*s_objet_1).type == SQL) && ((*s_objet_2).type == CHN))
804: {
805: if ((*((struct_connecteur_sql *) (*s_objet_1).objet)).locale != NULL)
806: {
807: /*
808: * Transcodage de la commande SQL
809: */
810:
811: if ((s_copie_2 = copie_objet(s_etat_processus, s_objet_2, 'O'))
812: == NULL)
813: {
814: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
815: return;
816: }
817:
818: liberation(s_etat_processus, s_objet_2);
819: s_objet_2 = s_copie_2;
820:
821: tampon = (*s_objet_2).objet;
822:
823: if (((*s_objet_2).objet = transliteration(s_etat_processus, tampon,
824: (*((struct_connecteur_sql *) (*s_objet_1).objet)).locale,
825: d_locale)) == NULL)
826: {
827: return;
828: }
829:
830: free(tampon);
831: }
832:
833: /*
834: * Pilote MySQL
835: */
836:
837: if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
838: "MYSQL") == 0)
839: {
840: # ifdef MYSQL_SUPPORT
841:
842: MYSQL_RES *resultat_mysql;
843: MYSQL_ROW ligne;
844:
845: if (mysql_real_query((*((struct_connecteur_sql *) (*s_objet_1)
846: .objet)).descripteur.mysql, (unsigned char *) (*s_objet_2)
847: .objet, strlen((unsigned char *) (*s_objet_2).objet)) != 0)
848: {
849: if (connexion_permanente == d_faux)
850: {
851: mysql_close((*((struct_connecteur_sql *) (*s_objet_1)
852: .objet)).descripteur.mysql);
853: }
854:
855: liberation(s_etat_processus, s_objet_1);
856: liberation(s_etat_processus, s_objet_2);
857:
858: (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
859: return;
860: }
861:
862: if ((resultat_mysql = mysql_store_result(
863: (*((struct_connecteur_sql *) (*s_objet_1).objet))
864: .descripteur.mysql)) == NULL)
865: {
866: // La requête ne renvoie rien (exemple : INSERT)
867: presence_resultat = d_faux;
868: nombre_colonnes = 0;
869: }
870: else
871: {
872: // La requête renvoie une ou plusieurs valeurs.
873: presence_resultat = d_vrai;
874: nombre_colonnes = mysql_field_count((*((struct_connecteur_sql *)
875: (*s_objet_1).objet)).descripteur.mysql);
876: }
877:
878: if ((s_objet_resultat = allocation(s_etat_processus, LST))
879: == NULL)
880: {
881: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
882: return;
883: }
884:
885: (*s_objet_resultat).objet = NULL;
886: l_element_courant = (*s_objet_resultat).objet;
887:
888: while(((presence_resultat == d_vrai) ?
889: (ligne = mysql_fetch_row(resultat_mysql)) : NULL) != NULL)
890: {
891: unsigned long *longueurs;
892:
893: longueurs = mysql_fetch_lengths(resultat_mysql);
894:
895: if (l_element_courant == NULL)
896: {
897: if (((*s_objet_resultat).objet =
898: allocation_maillon(s_etat_processus)) == NULL)
899: {
900: (*s_etat_processus).erreur_systeme =
901: d_es_allocation_memoire;
902: return;
903: }
904:
905: l_element_courant = (struct_liste_chainee *)
906: (*s_objet_resultat).objet;
907: }
908: else
909: {
910: if (((*l_element_courant).suivant =
911: allocation_maillon(s_etat_processus)) == NULL)
912: {
913: (*s_etat_processus).erreur_systeme =
914: d_es_allocation_memoire;
915: return;
916: }
917:
918: l_element_courant = (*l_element_courant).suivant;
919: }
920:
921: (*l_element_courant).suivant = NULL;
922:
923: if (((*l_element_courant).donnee = allocation(s_etat_processus,
924: LST)) == NULL)
925: {
926: (*s_etat_processus).erreur_systeme =
927: d_es_allocation_memoire;
928: return;
929: }
930:
931: (*(*l_element_courant).donnee).objet = NULL;
932: l_element_courant_ligne = NULL;
933:
934: for(i = 0; i < nombre_colonnes; i++)
935: {
936: if (l_element_courant_ligne == NULL)
937: {
938: if (((*(*l_element_courant).donnee).objet =
939: allocation_maillon(s_etat_processus)) == NULL)
940: {
941: (*s_etat_processus).erreur_systeme =
942: d_es_allocation_memoire;
943: return;
944: }
945:
946: l_element_courant_ligne = (struct_liste_chainee *)
947: (*(*l_element_courant).donnee).objet;
948: }
949: else
950: {
951: if (((*l_element_courant_ligne).suivant =
952: allocation_maillon(s_etat_processus)) == NULL)
953: {
954: (*s_etat_processus).erreur_systeme =
955: d_es_allocation_memoire;
956: return;
957: }
958:
959: l_element_courant_ligne =
960: (*l_element_courant_ligne).suivant;
961: }
962:
963: (*l_element_courant_ligne).suivant = NULL;
964:
965: if (((*l_element_courant_ligne).donnee =
966: allocation(s_etat_processus, CHN)) == NULL)
967: {
968: (*s_etat_processus).erreur_systeme =
969: d_es_allocation_memoire;
970: return;
971: }
972:
973: if (ligne[i] == NULL)
974: {
975: if (((*(*l_element_courant_ligne).donnee).objet =
976: malloc(5 * sizeof(unsigned char))) == NULL)
977: {
978: (*s_etat_processus).erreur_systeme =
979: d_es_allocation_memoire;
980: return;
981: }
982:
983: strcpy((unsigned char *) (*(*l_element_courant_ligne)
984: .donnee).objet, "NULL");
985: }
986: else
987: {
988: if (((*(*l_element_courant_ligne).donnee).objet =
989: malloc((longueurs[i] + 1) *
990: sizeof(unsigned char))) == NULL)
991: {
992: (*s_etat_processus).erreur_systeme =
993: d_es_allocation_memoire;
994: return;
995: }
996:
997: strcpy((unsigned char *) (*(*l_element_courant_ligne)
998: .donnee).objet, ligne[i]);
999: }
1000: }
1001: }
1002:
1003: mysql_free_result(resultat_mysql);
1004:
1005: if (connexion_permanente == d_faux)
1006: {
1007: mysql_close((*((struct_connecteur_sql *) (*s_objet_1).objet))
1008: .descripteur.mysql);
1009: }
1010:
1011: if (presence_resultat == d_vrai)
1012: {
1013: if (empilement(s_etat_processus,
1014: &((*s_etat_processus).l_base_pile),
1015: s_objet_resultat) == d_erreur)
1016: {
1017: return;
1018: }
1019: }
1020:
1021: # else
1022:
1023: if ((*s_etat_processus).langue == 'F')
1024: {
1025: printf("+++Attention : Support de MySQL non compilé !\n");
1026: }
1027: else
1028: {
1029: printf("+++Warning : MySQL support not available !\n");
1030: }
1031:
1032: fflush(stdout);
1033: # endif
1034: }
1035:
1036: /*
1037: * Pilote PostgreSQL
1038: */
1039:
1040: else if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
1041: "POSTGRESQL") == 0)
1042: {
1043: # ifdef POSTGRESQL_SUPPORT
1044:
1045: PGresult *resultat_postgresql;
1046:
1047: if (PQstatus((*((struct_connecteur_sql *) (*s_objet_1).objet))
1048: .descripteur.postgresql) != CONNECTION_OK)
1049: {
1050: if (connexion_permanente == d_faux)
1051: {
1052: PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
1053: .descripteur.postgresql);
1054: }
1055:
1056: liberation(s_etat_processus, s_objet_1);
1057: liberation(s_etat_processus, s_objet_2);
1058:
1059: (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
1060: return;
1061: }
1062:
1063: resultat_postgresql = PQexec((*((struct_connecteur_sql *)
1064: (*s_objet_1).objet)).descripteur.postgresql,
1065: (unsigned char *) (*s_objet_2).objet);
1066: presence_resultat = d_faux;
1067:
1068: switch(PQresultStatus(resultat_postgresql))
1069: {
1070: case PGRES_COMMAND_OK :
1071: { // Commande qui ne renvoit rien
1072: if ((s_objet_resultat = allocation(s_etat_processus, LST))
1073: == NULL)
1074: {
1075: (*s_etat_processus).erreur_systeme =
1076: d_es_allocation_memoire;
1077: return;
1078: }
1079:
1080: (*s_objet_resultat).objet = NULL;
1081: l_element_courant = (*s_objet_resultat).objet;
1082: presence_resultat = d_vrai;
1083:
1084: break;
1085: }
1086:
1087: case PGRES_TUPLES_OK :
1088: { // Commande renvoyant des données
1089: if ((s_objet_resultat = allocation(s_etat_processus, LST))
1090: == NULL)
1091: {
1092: (*s_etat_processus).erreur_systeme =
1093: d_es_allocation_memoire;
1094: return;
1095: }
1096:
1097: (*s_objet_resultat).objet = NULL;
1098: l_element_courant = (*s_objet_resultat).objet;
1099: presence_resultat = d_vrai;
1100:
1101: nombre_colonnes = PQnfields(resultat_postgresql);
1102: nombre_lignes = PQntuples(resultat_postgresql);
1103:
1104: for(i = 0; i < nombre_lignes; i++)
1105: {
1106: // Chaînage d'un nouveau maillon de la liste résultat
1107:
1108: if (l_element_courant == NULL)
1109: {
1110: if (((*s_objet_resultat).objet =
1111: allocation_maillon(s_etat_processus))
1112: == NULL)
1113: {
1114: (*s_etat_processus).erreur_systeme =
1115: d_es_allocation_memoire;
1116: return;
1117: }
1118:
1119: l_element_courant = (struct_liste_chainee *)
1120: (*s_objet_resultat).objet;
1121: }
1122: else
1123: {
1124: if (((*l_element_courant).suivant =
1125: allocation_maillon(s_etat_processus))
1126: == NULL)
1127: {
1128: (*s_etat_processus).erreur_systeme =
1129: d_es_allocation_memoire;
1130: return;
1131: }
1132:
1133: l_element_courant = (*l_element_courant).suivant;
1134: }
1135:
1136: (*l_element_courant).suivant = NULL;
1137:
1138: // Création de la liste fille
1139:
1140: if (((*l_element_courant).donnee =
1141: allocation(s_etat_processus, LST)) == NULL)
1142: {
1143: (*s_etat_processus).erreur_systeme =
1144: d_es_allocation_memoire;
1145: return;
1146: }
1147:
1148: (*(*l_element_courant).donnee).objet = NULL;
1149: l_element_courant_ligne = NULL;
1150:
1151: for(j = 0; j < nombre_colonnes; j++)
1152: {
1153: if (l_element_courant_ligne == NULL)
1154: {
1155: if (((*(*l_element_courant).donnee).objet =
1156: allocation_maillon(s_etat_processus))
1157: == NULL)
1158: {
1159: (*s_etat_processus).erreur_systeme =
1160: d_es_allocation_memoire;
1161: return;
1162: }
1163:
1164: l_element_courant_ligne =
1165: (struct_liste_chainee *)
1166: (*(*l_element_courant).donnee).objet;
1167: }
1168: else
1169: {
1170: if (((*l_element_courant_ligne).suivant =
1171: allocation_maillon(s_etat_processus))
1172: == NULL)
1173: {
1174: l_element_courant_ligne =
1175: (*l_element_courant_ligne).suivant;
1176: }
1177:
1178: l_element_courant_ligne =
1179: (*l_element_courant_ligne).suivant;
1180: }
1181:
1182: (*l_element_courant_ligne).suivant = NULL;
1183:
1184: if (((*l_element_courant_ligne).donnee =
1185: allocation(s_etat_processus, CHN))
1186: == NULL)
1187: {
1188: (*s_etat_processus).erreur_systeme =
1189: d_es_allocation_memoire;
1190: return;
1191: }
1192:
1193: if (PQgetisnull(resultat_postgresql, i, j) != 0)
1194: {
1195: if (((*(*l_element_courant_ligne).donnee).objet
1196: = malloc(5 * sizeof(unsigned char)))
1197: == NULL)
1198: {
1199: (*s_etat_processus).erreur_systeme =
1200: d_es_allocation_memoire;
1201: return;
1202: }
1203:
1204: strcpy((unsigned char *)
1205: (*(*l_element_courant_ligne).donnee)
1206: .objet, "NULL");
1207: }
1208: else
1209: {
1210: if (((*(*l_element_courant_ligne).donnee).objet
1211: = malloc((PQgetlength(
1212: resultat_postgresql, i, j) + 1) *
1213: sizeof(unsigned char))) == NULL)
1214: {
1215: (*s_etat_processus).erreur_systeme =
1216: d_es_allocation_memoire;
1217: return;
1218: }
1219:
1220: strcpy((unsigned char *)
1221: (*(*l_element_courant_ligne).donnee)
1222: .objet, PQgetvalue(resultat_postgresql,
1223: i, j));
1224: }
1225: }
1226: }
1227:
1228: break;
1229: }
1230:
1231: case PGRES_EMPTY_QUERY :
1232: case PGRES_COPY_OUT :
1233: case PGRES_COPY_IN :
1234: case PGRES_BAD_RESPONSE :
1235: case PGRES_NONFATAL_ERROR :
1236: case PGRES_FATAL_ERROR :
1237: default :
1238: {
1239: printf("%s\n", PQresultErrorMessage(resultat_postgresql));
1240: PQclear(resultat_postgresql);
1241:
1242: if (connexion_permanente == d_faux)
1243: {
1244: PQfinish((*((struct_connecteur_sql *) (*s_objet_1)
1245: .objet)).descripteur.postgresql);
1246: }
1247:
1248: liberation(s_etat_processus, s_objet_1);
1249: liberation(s_etat_processus, s_objet_2);
1250:
1251: (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
1252:
1253: return;
1254: break;
1255: }
1256: }
1257:
1258: PQclear(resultat_postgresql);
1259:
1260: if (connexion_permanente == d_faux)
1261: {
1262: PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
1263: .descripteur.postgresql);
1264: }
1265:
1266: if (presence_resultat == d_vrai)
1267: {
1268: if (empilement(s_etat_processus, &((*s_etat_processus)
1269: .l_base_pile), s_objet_resultat) == d_erreur)
1270: {
1271: return;
1272: }
1273: }
1274:
1275: # else
1276:
1277: if ((*s_etat_processus).langue == 'F')
1278: {
1279: printf("+++Attention : Support de PostgreSQL non compilé !\n");
1280: }
1281: else
1282: {
1283: printf("+++Warning : PostgreSQL support not available !\n");
1284: }
1285:
1286: fflush(stdout);
1287: # endif
1288: }
1289: else
1290: {
1291: liberation(s_etat_processus, s_objet_1);
1292: liberation(s_etat_processus, s_objet_2);
1293:
1294: (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
1295: return;
1296: }
1297: }
1298: else
1299: {
1300: liberation(s_etat_processus, s_objet_1);
1301: liberation(s_etat_processus, s_objet_2);
1302:
1303: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1304: return;
1305: }
1306:
1307: liberation(s_etat_processus, s_objet_1);
1308: liberation(s_etat_processus, s_objet_2);
1309:
1310: return;
1311: }
1312:
1313:
1314: /*
1315: ================================================================================
1316: Fonction 'stop'
1317: ================================================================================
1318: Entrées :
1319: --------------------------------------------------------------------------------
1320: Sorties :
1321: --------------------------------------------------------------------------------
1322: Effets de bord : néant
1323: ================================================================================
1324: */
1325:
1326: void
1327: instruction_stop(struct_processus *s_etat_processus)
1328: {
1329: struct_liste_chainee *l_element_courant;
1330:
1331: struct_objet *s_objet;
1332:
1333: struct timespec attente;
1334:
1335: attente.tv_sec = 0;
1336: attente.tv_nsec = GRANULARITE_us * 1000;
1337:
1338: (*s_etat_processus).erreur_execution = d_ex;
1339:
1340: if ((*s_etat_processus).affichage_arguments == 'Y')
1341: {
1342: printf("\n STOP ");
1343:
1344: if ((*s_etat_processus).langue == 'F')
1345: {
1346: printf("(arrêt d'un processus)\n\n");
1347: }
1348: else
1349: {
1350: printf("(kill process)\n\n");
1351: }
1352:
1353: printf(" 1: %s\n", d_PRC);
1354:
1355: return;
1356: }
1357: else if ((*s_etat_processus).test_instruction == 'Y')
1358: {
1359: (*s_etat_processus).nombre_arguments = -1;
1360: return;
1361: }
1362:
1363: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1364: {
1365: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1366: {
1367: return;
1368: }
1369: }
1370:
1371: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1372: &s_objet) == d_erreur)
1373: {
1374: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1375: return;
1376: }
1377:
1378: if ((*s_objet).type == PRC)
1379: {
1380: if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1381: .processus_detache == d_vrai)
1382: {
1383: kill((*(*((struct_processus_fils *) (*s_objet).objet)).thread).pid,
1384: SIGFSTOP);
1385: }
1386: else
1387: {
1388: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
1389: {
1390: (*s_etat_processus).erreur_systeme = d_es_processus;
1391: return;
1392: }
1393:
1394: l_element_courant = (struct_liste_chainee *)
1395: (*s_etat_processus).l_base_pile_processus;
1396:
1397: while(l_element_courant != NULL)
1398: {
1399: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
1400: .donnee).objet)).thread).processus_detache == d_faux)
1401: {
1402: if ((pthread_equal((*(*((struct_processus_fils *)
1403: (*(*l_element_courant).donnee).objet)).thread).pid,
1404: (*(*((struct_processus_fils *)
1405: (*s_objet).objet)).thread).tid) != 0) &&
1406: ((*(*((struct_processus_fils *)
1407: (*(*l_element_courant).donnee).objet)).thread).pid
1408: == (*(*((struct_processus_fils *)
1409: (*s_objet).objet)).thread).pid))
1410: {
1411: break;
1412: }
1413: }
1414:
1415: l_element_courant = (*l_element_courant).suivant;
1416: }
1417:
1418: if (l_element_courant != NULL)
1419: {
1420: // Le champ thread_actif est un pointeur sur un champ de la
1421: // structure s_argument_thread libéré par la fonction
1422: // retrait_thread_surveillance().
1423:
1424: if ((*(*((struct_processus_fils *)
1425: (*s_objet).objet)).thread).thread_actif == d_vrai)
1426: {
1427: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
1428: (*s_objet).objet)).thread).mutex)) != 0)
1429: {
1430: if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
1431: != 0)
1432: {
1433: (*s_etat_processus).erreur_systeme = d_es_processus;
1434: return;
1435: }
1436:
1437: (*s_etat_processus).erreur_systeme = d_es_processus;
1438: return;
1439: }
1440:
1441: if ((*(*((struct_processus_fils *)
1442: (*s_objet).objet)).thread).thread_actif == d_vrai)
1443: {
1444: pthread_kill((*(*((struct_processus_fils *)
1445: (*s_objet).objet)).thread).tid, SIGFSTOP);
1446: }
1447:
1448: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
1449: (*s_objet).objet)).thread).mutex)) != 0)
1450: {
1451: if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
1452: != 0)
1453: {
1454: (*s_etat_processus).erreur_systeme = d_es_processus;
1455: return;
1456: }
1457:
1458: (*s_etat_processus).erreur_systeme = d_es_processus;
1459: return;
1460: }
1461: }
1462: }
1463:
1464: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
1465: {
1466: (*s_etat_processus).erreur_systeme = d_es_processus;
1467: return;
1468: }
1469: }
1470: }
1471: else
1472: {
1473: liberation(s_etat_processus, s_objet);
1474:
1475: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1476: return;
1477: }
1478:
1479: liberation(s_etat_processus, s_objet);
1480:
1481: return;
1482: }
1483:
1484: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>