--- rpl/src/instructions_s8.c 2012/12/19 09:58:27 1.52 +++ rpl/src/instructions_s8.c 2012/12/20 15:32:52 1.53 @@ -785,11 +785,7 @@ instruction_send(struct_processus *s_eta void instruction_sqlquery(struct_processus *s_etat_processus) { -# define d_LONGUEUR 1024 - -# if defined(MYSQL_SUPPORT) || defined(POSTGRESQL_SUPPORT) logical1 connexion_permanente; -# endif struct_objet *s_copie_1; struct_objet *s_objet_1; @@ -837,6 +833,8 @@ instruction_sqlquery(struct_processus *s 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; } @@ -872,9 +870,7 @@ instruction_sqlquery(struct_processus *s if ((*s_objet_1).type == LST) { -# if defined(MYSQL_SUPPORT) || defined(POSTGRESQL_SUPPORT) connexion_permanente = d_faux; -# endif s_copie_1 = s_objet_1; @@ -914,9 +910,7 @@ instruction_sqlquery(struct_processus *s } } -# if defined(MYSQL_SUPPORT) || defined(POSTGRESQL_SUPPORT) connexion_permanente = d_vrai; -# endif } if (((*s_objet_1).type == SQL) && ((*s_objet_2).type == CHN)) @@ -1427,6 +1421,243 @@ instruction_sqlquery(struct_processus *s fflush(stdout); # endif } + else if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type, + "SQLITE") == 0) + { + const char *queue; + const unsigned char *resultat; + + int ios; + + logical1 presence_resultat; + + sqlite3_stmt *ppStmt; + + struct_liste_chainee *l_element_courant; + struct_liste_chainee *l_element_courant_ligne; + + struct_objet *s_objet_resultat; + + unsigned int i; + unsigned int nombre_colonnes; + + if (sqlite3_prepare_v2((*((struct_connecteur_sql *) + (*s_objet_1).objet)).descripteur.sqlite, + (unsigned char *) (*s_objet_2).objet, + 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; + } + + presence_resultat = d_faux; + s_objet_resultat = NULL; + l_element_courant = NULL; + + do + { + switch(ios = sqlite3_step(ppStmt)) + { + case SQLITE_ROW: + { + if (s_objet_resultat == NULL) + { + if ((s_objet_resultat = + allocation(s_etat_processus, LST)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + presence_resultat = d_vrai; + + // Création d'une liste vide + + (*s_objet_resultat).objet = NULL; + l_element_courant = (*s_objet_resultat).objet; + } + + // 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; + } + + 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 (presence_resultat == d_vrai) + { + 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);