--- rpl/src/instructions_w1.c 2010/03/06 18:29:07 1.5 +++ rpl/src/instructions_w1.c 2010/03/07 17:03:29 1.6 @@ -374,18 +374,23 @@ instruction_wireframe(struct_processus * void instruction_write(struct_processus *s_etat_processus) { + const char *queue; + int adresse[16]; int port; long longueur_effective; long recursivite; + sqlite3_stmt *ppStmt; + ssize_t ios; struct_descripteur_fichier *descripteur; - struct_objet *s_objet_argument_2; struct_objet *s_objet_argument_1; + struct_objet *s_objet_argument_2; + struct_objet *s_objet_argument_3; struct sigaction action; struct sigaction registre; @@ -400,6 +405,7 @@ instruction_write(struct_processus *s_et unsigned char *chaine; unsigned char *chaine_utf8; + unsigned char *commande; unsigned long i; @@ -419,8 +425,11 @@ instruction_write(struct_processus *s_et } printf(" 2: %s\n", d_LST); - printf(" 1: %s, %s\n", d_FCH, d_SCK); + printf(" 1: %s, %s\n\n", d_FCH, d_SCK); + printf(" 3: %s\n", d_LST); + printf(" 2: %s, %s\n", d_INT, d_CHN); + printf(" 1: %s\n", d_FCH); return; } else if ((*s_etat_processus).test_instruction == 'Y') @@ -431,10 +440,37 @@ instruction_write(struct_processus *s_et if (test_cfsf(s_etat_processus, 31) == d_vrai) { - if (empilement_pile_last(s_etat_processus, 2) == d_erreur) + if ((*s_etat_processus).l_base_pile == NULL) { + (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } + + if ((*(*(*s_etat_processus).l_base_pile).donnee).type == FCH) + { + if ((*((struct_fichier *) (*(*(*s_etat_processus).l_base_pile) + .donnee).objet)).acces == 'S') + { + if (empilement_pile_last(s_etat_processus, 2) == d_erreur) + { + return; + } + } + else + { + if (empilement_pile_last(s_etat_processus, 3) == d_erreur) + { + return; + } + } + } + else + { + if (empilement_pile_last(s_etat_processus, 2) == d_erreur) + { + return; + } + } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), @@ -453,8 +489,7 @@ instruction_write(struct_processus *s_et return; } - if (((*s_objet_argument_2).type == LST) && - ((*s_objet_argument_1).type == FCH)) + if ((*s_objet_argument_1).type == FCH) { if ((descripteur = descripteur_fichier(s_etat_processus, (struct_fichier *) (*s_objet_argument_1).objet)) == NULL) @@ -513,20 +548,30 @@ instruction_write(struct_processus *s_et * Fichiers formatés */ - if ((chaine = formateur_fichier(s_etat_processus, - s_objet_argument_2, (*((struct_fichier *) - (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'F', - &longueur_effective, &recursivite)) == NULL) - { - liberation(s_etat_processus, s_objet_argument_2); - liberation(s_etat_processus, s_objet_argument_1); - - return; - } - if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces == 'S') { + if ((*s_objet_argument_2).type != LST) + { + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_type_argument; + return; + } + + if ((chaine = formateur_fichier(s_etat_processus, + s_objet_argument_2, (*((struct_fichier *) + (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'F', + &longueur_effective, &recursivite)) == NULL) + { + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + BUG(((*descripteur).type != 'C'), uprintf("Bad filetype !\n")); if (fseek((*descripteur).descripteur_c, (long) 0, SEEK_END) @@ -542,12 +587,16 @@ instruction_write(struct_processus *s_et if ((chaine_utf8 = transliteration(s_etat_processus, chaine, d_locale, "UTF-8")) == NULL) { + free(chaine); + liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } + free(chaine); + if (fprintf((*descripteur).descripteur_c, "%s\n", chaine) < 0) { free(chaine_utf8); @@ -561,13 +610,123 @@ instruction_write(struct_processus *s_et else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces == 'D') { + BUG(((*descripteur).type != 'S'), uprintf("Bad filetype !\n")); + + if ((*s_objet_argument_2).type != INT) + { + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_type_argument; + return; + } + + if (depilement(s_etat_processus, &((*s_etat_processus) + .l_base_pile), &s_objet_argument_3) == d_erreur) + { + (*s_etat_processus).erreur_execution = d_ex_manque_argument; + return; + } + + if ((*s_objet_argument_3).type != LST) + { + liberation(s_etat_processus, s_objet_argument_3); + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_type_argument; + return; + } + + if ((*s_objet_argument_3).objet == NULL) + { + // Effacement d'un enregistrement + + if (alsprintf(&commande, "delete from data where " + "id = %lld", (*((integer8 *) + (*s_objet_argument_2).objet))) < 0) + { + liberation(s_etat_processus, s_objet_argument_3); + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + } + else + { + // Modification ou création d'un nouvel enregistrement + + if ((chaine = formateur_fichier(s_etat_processus, + s_objet_argument_3, (*((struct_fichier *) + (*s_objet_argument_1).objet)).format, 0, 0, ' ', + 'F', &longueur_effective, &recursivite)) == NULL) + { + liberation(s_etat_processus, s_objet_argument_3); + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + + if ((chaine_utf8 = transliteration(s_etat_processus, + chaine, d_locale, "UTF-8")) == NULL) + { + free(chaine); + + liberation(s_etat_processus, s_objet_argument_3); + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + + free(chaine); + + if (alsprintf(&commande, "insert or replace into data " + "(id, data) values (%lld, '%s')", (*((integer8 *) + (*s_objet_argument_2).objet)), chaine_utf8) < 0) + { + free(chaine_utf8); + liberation(s_etat_processus, s_objet_argument_3); + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + + free(chaine_utf8); + } + + 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_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; + } + + liberation(s_etat_processus, s_objet_argument_3); + free(commande); } else { /* Fichiers indexés : panique totale ! */ } - - free(chaine); } else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire == 'Y')