/* ================================================================================ RPL/2 (R) version 4.1.29 Copyright (C) 1989-2018 Dr. BERTRAND Joël This file is part of RPL/2. RPL/2 is free software; you can redistribute it and/or modify it under the terms of the CeCILL V2 License as published by the french CEA, CNRS and INRIA. RPL/2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License for more details. You should have received a copy of the CeCILL License along with RPL/2. If not, write to info@cecill.info. ================================================================================ */ #include "rpl-conv.h" /* ================================================================================ Fonction 'splash' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_splash(struct_processus *s_etat_processus) { real8 attente; struct_objet *s_objet; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n SPLASH "); if ((*s_etat_processus).langue == 'F') { printf("(écran RPL/2)\n\n"); } else { printf("(RPL/2 splash screen)\n\n"); } printf(" 1: %s, %s\n", d_INT, d_REL); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (((*s_objet).type == INT) || ((*s_objet).type == REL)) { if ((*s_objet).type == INT) { attente = (real8) (*((integer8 *) (*s_objet).objet)); } else { attente = (*((real8 *) (*s_objet).objet)); } if (attente < 0) { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } encart(s_etat_processus, (integer8) (attente * 1E6)); } else { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet); return; } /* ================================================================================ Fonction 'send' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_send(struct_processus *s_etat_processus) { sig_atomic_t registre; ssize_t longueur_ecriture; struct_objet *s_objet; struct timespec attente; unsigned char caractere; unsigned char tampon; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n SEND "); if ((*s_etat_processus).langue == 'F') { printf("(envoi de données au processus père)\n\n"); } else { printf("(send data to parent process)\n\n"); } printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_TAB); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_etat_processus).presence_pipes == d_faux) { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere; return; } if (((*s_objet).type != INT) && ((*s_objet).type != REL) && ((*s_objet).type != CPL) && ((*s_objet).type != VIN) && ((*s_objet).type != VRL) && ((*s_objet).type != VCX) && ((*s_objet).type != MIN) && ((*s_objet).type != MRL) && ((*s_objet).type != MCX) && ((*s_objet).type != BIN) && ((*s_objet).type != NOM) && ((*s_objet).type != CHN) && ((*s_objet).type != LST) && ((*s_objet).type != ALG) && ((*s_objet).type != RPN) && ((*s_objet).type != TBL)) { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } /* * On signale au processus père qu'il y a un objet de plus * dans le pipe de données. */ registre = (*s_etat_processus).var_volatile_traitement_retarde_stop; (*s_etat_processus).var_volatile_traitement_retarde_stop = 1; if ((*s_etat_processus).processus_detache == d_vrai) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, "Interprocess communications (SEND)"); if ((*s_etat_processus).erreur_systeme != d_es) { return; } } # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; } caractere = 1; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; while((longueur_ecriture = write_atomic(s_etat_processus, (*s_etat_processus).pipe_nombre_elements_attente, &caractere, sizeof(caractere))) != sizeof(caractere)) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if (longueur_ecriture == -1) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus).erreur_systeme = d_es_processus; return; } nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; } scrutation_interruptions(s_etat_processus); } # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } else { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, "Interthread communications (SEND)"); if ((*s_etat_processus).erreur_systeme != d_es) { return; } } attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; } caractere = 1; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; while((longueur_ecriture = write_atomic(s_etat_processus, (*s_etat_processus).pipe_nombre_elements_attente, &caractere, sizeof(caractere))) != sizeof(caractere)) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if (longueur_ecriture == -1) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus).erreur_systeme = d_es_processus; return; } nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; } scrutation_interruptions(s_etat_processus); } # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).nombre_objets_envoyes_non_lus++; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; } while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement, &tampon, sizeof(unsigned char)) != sizeof(unsigned char)) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; } scrutation_interruptions(s_etat_processus); } # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } // ecriture_pipe() ne peut être interrompu par un signal. # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (ecriture_pipe(s_etat_processus, (*s_etat_processus).pipe_donnees, s_objet) == d_erreur) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } liberation(s_etat_processus, s_objet); return; } # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } if (registre == 0) { if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1) { (*s_etat_processus).var_volatile_requete_arret = -1; } (*s_etat_processus).var_volatile_traitement_retarde_stop = registre; } liberation(s_etat_processus, s_objet); return; } /* ================================================================================ Fonction 'sqlquery' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_sqlquery(struct_processus *s_etat_processus) { logical1 connexion_permanente; struct_objet *s_copie_1; struct_objet *s_objet_1; struct_objet *s_copie_2; struct_objet *s_objet_2; unsigned char *tampon; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n SQLQUERY "); if ((*s_etat_processus).langue == 'F') { printf("(requête SQL)\n\n"); } else { printf("(SQL query)\n\n"); } printf(" 2: %s\n", d_CHN); printf(" 1: %s\n", d_LST); printf("-> 1: %s\n\n", d_LST); printf(" 2: %s\n", d_CHN); printf(" 1: %s\n", d_SQL); printf("-> 1: %s\n\n", d_LST); if ((*s_etat_processus).langue == 'F') { printf(" Utilisation :\n\n"); } else { printf(" Usage:\n\n"); } printf(" \"select * from table\"\n"); printf(" { \"mysql\" \"server\" \"database\" " "\"user\" \"password\" } SQLQUERY\n"); printf(" \"select field from table\"\n"); printf(" { \"postgresql:iso-8859-1\" \"server\" " "\"database\" \"user\" \"password\" port }\n"); printf(" SQLQUERY\n"); printf(" \"select * from table\"\n"); printf(" { \"sqlite\" \"file\" } SQLQUERY\n"); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_2) == d_erreur) { liberation(s_etat_processus, s_objet_1); (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet_1).type == LST) { connexion_permanente = d_faux; s_copie_1 = s_objet_1; if ((s_objet_1 = parametres_sql(s_etat_processus, s_copie_1)) == NULL) { liberation(s_etat_processus, s_copie_1); liberation(s_etat_processus, s_objet_2); return; } if ((*s_etat_processus).erreur_execution == d_ex_instruction_indisponible) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); liberation(s_etat_processus, s_copie_1); return; } liberation(s_etat_processus, s_copie_1); } else { if ((*s_objet_1).type == SQL) { if (((*((struct_connecteur_sql *) (*s_objet_1).objet)).pid != getpid()) || (pthread_equal((*((struct_connecteur_sql *) (*s_objet_1).objet)).tid, pthread_self()) == 0)) { (*s_etat_processus).erreur_execution = d_ex_fichier_hors_contexte; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } } connexion_permanente = d_vrai; } if (((*s_objet_1).type == SQL) && ((*s_objet_2).type == CHN)) { if ((*((struct_connecteur_sql *) (*s_objet_1).objet)).locale != NULL) { /* * Transcodage de la commande SQL */ if ((s_copie_2 = copie_objet(s_etat_processus, s_objet_2, 'O')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } liberation(s_etat_processus, s_objet_2); s_objet_2 = s_copie_2; tampon = (*s_objet_2).objet; if (((*s_objet_2).objet = transliteration(s_etat_processus, tampon, (*((struct_connecteur_sql *) (*s_objet_1).objet)).locale, d_locale)) == NULL) { return; } free(tampon); } /* * Pilote MySQL */ if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type, "MYSQL") == 0) { # ifdef MYSQL_SUPPORT unsigned int i; unsigned int nombre_colonnes; logical1 presence_resultat; MYSQL_RES *resultat_mysql; MYSQL_ROW ligne; struct_objet *s_objet_resultat; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_courant_ligne; if (mysql_real_query((*((struct_connecteur_sql *) (*s_objet_1) .objet)).descripteur.mysql, (unsigned char *) (*s_objet_2) .objet, strlen((unsigned char *) (*s_objet_2).objet)) != 0) { if (connexion_permanente == d_faux) { mysql_close((*((struct_connecteur_sql *) (*s_objet_1) .objet)).descripteur.mysql); } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_sql; return; } if ((resultat_mysql = mysql_store_result( (*((struct_connecteur_sql *) (*s_objet_1).objet)) .descripteur.mysql)) == NULL) { // La requête ne renvoie rien (exemple : INSERT) presence_resultat = d_faux; nombre_colonnes = 0; } else { // La requête renvoie une ou plusieurs valeurs. presence_resultat = d_vrai; nombre_colonnes = mysql_field_count((*((struct_connecteur_sql *) (*s_objet_1).objet)).descripteur.mysql); } if ((s_objet_resultat = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*s_objet_resultat).objet = NULL; l_element_courant = (*s_objet_resultat).objet; while(((presence_resultat == d_vrai) ? (ligne = mysql_fetch_row(resultat_mysql)) : NULL) != NULL) { unsigned long *longueurs; longueurs = mysql_fetch_lengths(resultat_mysql); if (l_element_courant == NULL) { if (((*s_objet_resultat).objet = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (struct_liste_chainee *) (*s_objet_resultat).objet; } else { if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*l_element_courant).suivant; } (*l_element_courant).suivant = NULL; if (((*l_element_courant).donnee = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*(*l_element_courant).donnee).objet = NULL; l_element_courant_ligne = NULL; for(i = 0; i < nombre_colonnes; i++) { if (l_element_courant_ligne == NULL) { if (((*(*l_element_courant).donnee).objet = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant_ligne = (struct_liste_chainee *) (*(*l_element_courant).donnee).objet; } else { if (((*l_element_courant_ligne).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant_ligne = (*l_element_courant_ligne).suivant; } (*l_element_courant_ligne).suivant = NULL; if (((*l_element_courant_ligne).donnee = allocation(s_etat_processus, CHN)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (ligne[i] == NULL) { if (((*(*l_element_courant_ligne).donnee).objet = malloc(5 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((unsigned char *) (*(*l_element_courant_ligne) .donnee).objet, "NULL"); } else { if (((*(*l_element_courant_ligne).donnee).objet = malloc((longueurs[i] + 1) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((unsigned char *) (*(*l_element_courant_ligne) .donnee).objet, ligne[i]); } } } mysql_free_result(resultat_mysql); if (connexion_permanente == d_faux) { mysql_close((*((struct_connecteur_sql *) (*s_objet_1).objet)) .descripteur.mysql); } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) { return; } # else if ((*s_etat_processus).langue == 'F') { printf("+++Attention : Support de MySQL non compilé !\n"); } else { printf("+++Warning : MySQL support not available !\n"); } fflush(stdout); # endif } /* * Pilote PostgreSQL */ else if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type, "POSTGRESQL") == 0) { # ifdef POSTGRESQL_SUPPORT int i; int j; int nombre_colonnes; int nombre_lignes; logical1 presence_resultat; PGresult *resultat_postgresql; struct_objet *s_objet_resultat; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_courant_ligne; if (PQstatus((*((struct_connecteur_sql *) (*s_objet_1).objet)) .descripteur.postgresql) != CONNECTION_OK) { if (connexion_permanente == d_faux) { PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet)) .descripteur.postgresql); } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_sql; return; } resultat_postgresql = PQexec((*((struct_connecteur_sql *) (*s_objet_1).objet)).descripteur.postgresql, (unsigned char *) (*s_objet_2).objet); presence_resultat = d_faux; switch(PQresultStatus(resultat_postgresql)) { case PGRES_COMMAND_OK : { // Commande qui ne renvoit rien if ((s_objet_resultat = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*s_objet_resultat).objet = NULL; l_element_courant = (*s_objet_resultat).objet; presence_resultat = d_vrai; break; } case PGRES_TUPLES_OK : { // Commande renvoyant des données if ((s_objet_resultat = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*s_objet_resultat).objet = NULL; l_element_courant = (*s_objet_resultat).objet; presence_resultat = d_vrai; nombre_colonnes = PQnfields(resultat_postgresql); nombre_lignes = PQntuples(resultat_postgresql); for(i = 0; i < nombre_lignes; i++) { // Chaînage d'un nouveau maillon de la liste résultat if (l_element_courant == NULL) { if (((*s_objet_resultat).objet = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (struct_liste_chainee *) (*s_objet_resultat).objet; } else { if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*l_element_courant).suivant; } (*l_element_courant).suivant = NULL; // Création de la liste fille if (((*l_element_courant).donnee = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*(*l_element_courant).donnee).objet = NULL; l_element_courant_ligne = NULL; for(j = 0; j < nombre_colonnes; j++) { if (l_element_courant_ligne == NULL) { if (((*(*l_element_courant).donnee).objet = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant_ligne = (struct_liste_chainee *) (*(*l_element_courant).donnee).objet; } else { if (((*l_element_courant_ligne).suivant = allocation_maillon(s_etat_processus)) == NULL) { l_element_courant_ligne = (*l_element_courant_ligne).suivant; } l_element_courant_ligne = (*l_element_courant_ligne).suivant; } (*l_element_courant_ligne).suivant = NULL; if (((*l_element_courant_ligne).donnee = allocation(s_etat_processus, CHN)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (PQgetisnull(resultat_postgresql, i, j) != 0) { if (((*(*l_element_courant_ligne).donnee).objet = malloc(5 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((unsigned char *) (*(*l_element_courant_ligne).donnee) .objet, "NULL"); } else { if (((*(*l_element_courant_ligne).donnee).objet = malloc(((size_t) (PQgetlength( resultat_postgresql, i, j) + 1)) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((unsigned char *) (*(*l_element_courant_ligne).donnee) .objet, PQgetvalue(resultat_postgresql, i, j)); } } } break; } case PGRES_EMPTY_QUERY : case PGRES_COPY_OUT : case PGRES_COPY_IN : case PGRES_BAD_RESPONSE : case PGRES_NONFATAL_ERROR : case PGRES_FATAL_ERROR : default : { printf("%s\n", PQresultErrorMessage(resultat_postgresql)); PQclear(resultat_postgresql); if (connexion_permanente == d_faux) { PQfinish((*((struct_connecteur_sql *) (*s_objet_1) .objet)).descripteur.postgresql); } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_sql; return; break; } } PQclear(resultat_postgresql); if (connexion_permanente == d_faux) { PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet)) .descripteur.postgresql); } if (presence_resultat == d_vrai) { if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_resultat) == d_erreur) { return; } } # else if ((*s_etat_processus).langue == 'F') { printf("+++Attention : Support de PostgreSQL non compilé !\n"); } else { printf("+++Warning : PostgreSQL support not available !\n"); } fflush(stdout); # endif } else if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type, "SQLITE") == 0) { const char *queue; const unsigned char *resultat; int i; int ios; int nombre_colonnes; sqlite3_stmt *ppStmt; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_courant_ligne; struct_objet *s_objet_resultat; struct timespec attente; if (sqlite3_prepare_v2((*((struct_connecteur_sql *) (*s_objet_1).objet)).descripteur.sqlite, (unsigned char *) (*s_objet_2).objet, (int) strlen((unsigned char *) (*s_objet_2).objet), &ppStmt, &queue) != SQLITE_OK) { if (connexion_permanente == d_faux) { sqlite3_close((*((struct_connecteur_sql *) (*s_objet_1).objet)).descripteur.sqlite); } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_sql; return; } s_objet_resultat = NULL; l_element_courant = NULL; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; if ((s_objet_resultat = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } // Création d'une liste vide (*s_objet_resultat).objet = NULL; l_element_courant = (*s_objet_resultat).objet; do { switch(ios = sqlite3_step(ppStmt)) { case SQLITE_ROW: { // Ajout d'une liste au bout de la liste // contenant les lignes if (l_element_courant == NULL) { if (((*s_objet_resultat).objet = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; } l_element_courant = (struct_liste_chainee *) (*s_objet_resultat).objet; } else { if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*l_element_courant).suivant; } (*l_element_courant).suivant = NULL; // Création de la liste fille if (((*l_element_courant).donnee = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*(*l_element_courant).donnee).objet = NULL; // Lecture de la ligne nombre_colonnes = sqlite3_data_count(ppStmt); l_element_courant_ligne = NULL; for(i = 0; i < nombre_colonnes; i++) { if (l_element_courant_ligne == NULL) { if (((*(*l_element_courant).donnee).objet = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant_ligne = (struct_liste_chainee *) (*(*l_element_courant).donnee).objet; } else { if (((*l_element_courant_ligne).suivant = allocation_maillon(s_etat_processus)) == NULL) { l_element_courant_ligne = (*l_element_courant_ligne).suivant; } l_element_courant_ligne = (*l_element_courant_ligne).suivant; } (*l_element_courant_ligne).suivant = NULL; if (((*l_element_courant_ligne).donnee = allocation(s_etat_processus, CHN)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (sqlite3_column_type(ppStmt, i) == SQLITE_NULL) { if (((*(*l_element_courant_ligne).donnee).objet = malloc(5 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((unsigned char *) (*(*l_element_courant_ligne).donnee) .objet, "NULL"); } else { if ((resultat = sqlite3_column_text(ppStmt, i)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*(*l_element_courant_ligne).donnee).objet = malloc((strlen(resultat) + 1 ) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((unsigned char *) (*(*l_element_courant_ligne).donnee) .objet, resultat); } } break; } case SQLITE_DONE: { // Fin de la lecture des données break; } case SQLITE_BUSY: case SQLITE_LOCKED: { nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); break; } default: { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } } while(ios != SQLITE_DONE); if (sqlite3_finalize(ppStmt) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (connexion_permanente == d_faux) { sqlite3_close((*((struct_connecteur_sql *) (*s_objet_1).objet)) .descripteur.sqlite); } if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_resultat) == d_erreur) { return; } } else { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_sql; return; } } else { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } /* ================================================================================ Fonction 'stop' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_stop(struct_processus *s_etat_processus) { struct_liste_chainee *l_element_courant; struct_objet *s_objet; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n STOP "); if ((*s_etat_processus).langue == 'F') { printf("(arrêt d'un processus)\n\n"); } else { printf("(kill process)\n\n"); } printf(" 1: %s\n", d_PRC); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet).type == PRC) { if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread) .processus_detache == d_vrai) { envoi_signal_processus((*(*((struct_processus_fils *) (*s_objet).objet)).thread).pid, rpl_sigstop, d_faux); } else { if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } l_element_courant = (struct_liste_chainee *) (*s_etat_processus).l_base_pile_processus; while(l_element_courant != NULL) { if ((*(*((struct_processus_fils *) (*(*l_element_courant) .donnee).objet)).thread).processus_detache == d_faux) { if ((pthread_equal((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread).tid, (*(*((struct_processus_fils *) (*s_objet).objet)).thread).tid) != 0) && ((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread).pid == (*(*((struct_processus_fils *) (*s_objet).objet)).thread).pid)) { break; } } l_element_courant = (*l_element_courant).suivant; } if (l_element_courant != NULL) { // Le champ thread_actif est un pointeur sur un champ de la // structure s_argument_thread libéré par la fonction // retrait_thread_surveillance(). if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread).thread_actif == d_vrai) { if (pthread_mutex_lock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex)) != 0) { if (pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_processus; return; } if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread).thread_actif == d_vrai) { envoi_signal_thread((*(*((struct_processus_fils *) (*s_objet).objet)).thread).tid, rpl_sigstop); } if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex)) != 0) { if (pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } if (pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } else { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet); return; } // vim: ts=4