--- rpl/src/instructions_r4.c 2010/03/08 08:34:15 1.7 +++ rpl/src/instructions_r4.c 2010/03/08 16:44:10 1.8 @@ -848,6 +848,12 @@ instruction_read(struct_processus *s_eta { const char *queue; + int ios; + + integer8 element; + integer8 id; + integer8 position_clef; + logical1 indicateur_48; logical1 presence_chaine; logical1 presence_indicateur; @@ -874,6 +880,9 @@ instruction_read(struct_processus *s_eta struct_descripteur_fichier *descripteur; + struct_liste_chainee *l_element_courant; + struct_liste_chainee *l_element_inclus; + struct_objet *s_objet_adresse; struct_objet *s_objet_argument_1; struct_objet *s_objet_argument_2; @@ -881,9 +890,11 @@ instruction_read(struct_processus *s_eta struct_objet *s_objet_type; unsigned char caractere; + unsigned char *clef_utf8; unsigned char *commande; unsigned char *tampon_lecture; unsigned char *tampon; + unsigned char *tampon2; unsigned long i; @@ -907,7 +918,7 @@ instruction_read(struct_processus *s_eta printf(" 1: %s, %s\n\n", d_FCH, d_SCK); - printf(" 1: %s, %s\n", d_INT, d_CHN); + printf(" 2: %s, %s\n", d_INT, d_CHN); printf(" 1: %s\n", d_FCH); return; } @@ -1371,13 +1382,13 @@ instruction_read(struct_processus *s_eta cf(s_etat_processus, 48); } - (*s_etat_processus).instruction_courante = tampon; - liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); free((*s_etat_processus).instruction_courante); free(commande); + + (*s_etat_processus).instruction_courante = tampon; return; } @@ -1410,6 +1421,434 @@ instruction_read(struct_processus *s_eta } else { + BUG(((*descripteur).type != 'S'), uprintf("Bad filtype !\n")); + + if (depilement(s_etat_processus, &((*s_etat_processus) + .l_base_pile), &s_objet_argument_2) == d_erreur) + { + (*s_etat_processus).erreur_execution = d_ex_manque_argument; + return; + } + + if ((*s_objet_argument_2).type != CHN) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_type_argument; + return; + } + + // Récupération de la position de la clef + + if (alsprintf(&commande, "select key from control " + "where id = 1") < 0) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + if (sqlite3_step(ppStmt) != SQLITE_ROW) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + position_clef = sqlite3_column_int64(ppStmt, 0); + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + free(commande); + + if ((clef_utf8 = transliteration(s_etat_processus, + (unsigned char *) (*s_objet_argument_2).objet, + d_locale, "UTF-8")) == NULL) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + return; + } + + // Récupération de l'identifiant de la clef + + if (alsprintf(&commande, "select id from key where key = " + "'{ \"%s\" }'", clef_utf8) < 0) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + switch(sqlite3_step(ppStmt)) + { + case SQLITE_ROW: + { + // Résultat attendu : une clef correspond. + break; + } + + case SQLITE_DONE: + { + // Aucun enregistrement + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + free(clef_utf8); + free(commande); + + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + (*s_etat_processus).erreur_execution = + d_ex_enregistrement_inexistant; + return; + } + + default: + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + } + + if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + id = sqlite3_column_int64(ppStmt, 0); + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + free(commande); + + if (alsprintf(&commande, "select data from data where " + "key_id = %lld order by sequence asc", id) < 0) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + element = 1; + + do + { + switch(ios = sqlite3_step(ppStmt)) + { + case SQLITE_ROW: + { + // Donnée supplémentaire + + if (sqlite3_column_type(ppStmt, 0) != SQLITE_TEXT) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + tampon = (*s_etat_processus).instruction_courante; + + if ((tampon_lecture = (unsigned char *) + sqlite3_column_text(ppStmt, 0)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (((*s_etat_processus).instruction_courante = + transliteration(s_etat_processus, + tampon_lecture, + "UTF-8", d_locale)) == NULL) + { + (*s_etat_processus).instruction_courante = + tampon; + + liberation(s_etat_processus, + s_objet_argument_1); + liberation(s_etat_processus, + s_objet_argument_2); + + free(commande); + free(clef_utf8); + return; + } + + indicateur_48 = test_cfsf(s_etat_processus, 48); + cf(s_etat_processus, 48); + + recherche_type(s_etat_processus); + + if ((*s_etat_processus).erreur_execution != d_ex) + { + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } + + liberation(s_etat_processus, + s_objet_argument_1); + liberation(s_etat_processus, + s_objet_argument_2); + + free((*s_etat_processus).instruction_courante); + free(commande); + free(clef_utf8); + + (*s_etat_processus).instruction_courante = + tampon; + return; + } + + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } + + free((*s_etat_processus).instruction_courante); + (*s_etat_processus).instruction_courante = tampon; + + element++; + + // Inscription de la clef + + if (element == position_clef) + { + if (((*s_etat_processus).instruction_courante = + transliteration(s_etat_processus, + clef_utf8, "UTF-8", d_locale)) == NULL) + { + (*s_etat_processus).instruction_courante = + tampon; + + liberation(s_etat_processus, + s_objet_argument_1); + liberation(s_etat_processus, + s_objet_argument_2); + + free(commande); + free(clef_utf8); + return; + } + + if (alsprintf(&tampon2, "{ \"%s\" }", + (*s_etat_processus) + .instruction_courante) < 0) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + free((*s_etat_processus).instruction_courante); + (*s_etat_processus).instruction_courante + = tampon2; + + indicateur_48 = test_cfsf(s_etat_processus, 48); + cf(s_etat_processus, 48); + + recherche_type(s_etat_processus); + + if ((*s_etat_processus).erreur_execution + != d_ex) + { + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } + + liberation(s_etat_processus, + s_objet_argument_1); + liberation(s_etat_processus, + s_objet_argument_2); + + free((*s_etat_processus) + .instruction_courante); + free(commande); + free(clef_utf8); + + (*s_etat_processus).instruction_courante = + tampon; + return; + } + + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } + + free((*s_etat_processus).instruction_courante); + (*s_etat_processus).instruction_courante = + tampon; + + element++; + } + + break; + } + + case SQLITE_DONE: + { + // Fin de la liste + 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; + } + + free(commande); + free(clef_utf8); + + liberation(s_etat_processus, s_objet_argument_2); + + if ((s_objet_resultat = allocation(s_etat_processus, LST)) + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + l_element_courant = NULL; + + for(element--; element > 0; element--) + { + if (depilement(s_etat_processus, &((*s_etat_processus) + .l_base_pile), &s_objet_argument_2) == d_erreur) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if ((*s_objet_argument_2).type != LST) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + l_element_inclus = (*s_objet_argument_2).objet; + + if (l_element_inclus != NULL) + { + while(l_element_inclus != NULL) + { + if ((*l_element_inclus).suivant == NULL) + { + (*l_element_inclus).suivant = l_element_courant; + break; + } + + l_element_inclus = (*l_element_inclus).suivant; + } + + l_element_courant = (*s_objet_argument_2).objet; + (*s_objet_argument_2).objet = NULL; + } + + liberation(s_etat_processus, s_objet_argument_2); + } + + (*s_objet_resultat).objet = l_element_inclus; + + if (empilement(s_etat_processus, + &((*s_etat_processus).l_base_pile), + s_objet_resultat) == d_erreur) + { + return; + } } } else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire