--- rpl/src/instructions_w1.c 2010/03/08 08:34:15 1.7 +++ rpl/src/instructions_w1.c 2010/03/08 14:28:20 1.8 @@ -379,6 +379,13 @@ instruction_write(struct_processus *s_et int adresse[16]; int port; + integer8 clef; + integer8 compteur; + integer8 id; + integer8 ordre; + + logical1 mise_a_jour; + long longueur_effective; long recursivite; @@ -388,6 +395,11 @@ instruction_write(struct_processus *s_et struct_descripteur_fichier *descripteur; + struct_liste_chainee *l_element_courant; + struct_liste_chainee *l_element_courant_format; + + struct_objet *s_format; + struct_objet *s_element; struct_objet *s_objet_argument_1; struct_objet *s_objet_argument_2; struct_objet *s_objet_argument_3; @@ -405,6 +417,7 @@ instruction_write(struct_processus *s_et unsigned char *chaine; unsigned char *chaine_utf8; + unsigned char *clef_utf8; unsigned char *commande; unsigned long i; @@ -428,7 +441,7 @@ instruction_write(struct_processus *s_et 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(" 2: %s\n", d_INT); printf(" 1: %s\n", d_FCH); return; } @@ -641,31 +654,573 @@ instruction_write(struct_processus *s_et return; } - if ((*s_objet_argument_3).objet == NULL) + // 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 + { + BUG(((*descripteur).type != 'S'), uprintf("Bad filetype !\n")); + + 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; + } + + // Récupération de la valeur de la clef + + if (alsprintf(&commande, "select key from control " + "where id = 1") < 0) + { + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + 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; + } + + 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); + + l_element_courant = (struct_liste_chainee *) + (*s_objet_argument_2).objet; + l_element_courant_format = (struct_liste_chainee *) + (*(*((struct_fichier *) (*s_objet_argument_1).objet)) + .format).objet; + compteur = 1; + + while((l_element_courant != NULL) && + (l_element_courant_format != NULL)) + { + if (compteur == clef) + { + break; + } + + l_element_courant = (*l_element_courant).suivant; + l_element_courant_format = (*l_element_courant_format) + .suivant; + compteur++; + } + + if ((l_element_courant == NULL) || + (l_element_courant_format == NULL)) + { + (*s_etat_processus).erreur_execution = + d_ex_clef_inexistante; + + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + + if ((s_element = allocation(s_etat_processus, LST)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (((*s_element).objet = allocation_maillon(s_etat_processus)) + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + (*((struct_liste_chainee *) (*s_element).objet)).suivant = NULL; + + if (((*((struct_liste_chainee *) (*s_element).objet)) + .donnee = copie_objet(s_etat_processus, + (*l_element_courant).donnee, 'N')) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if ((s_format = allocation(s_etat_processus, LST)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (((*s_format).objet = allocation_maillon(s_etat_processus)) + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + (*((struct_liste_chainee *) (*s_format).objet)).suivant = NULL; + + if (((*((struct_liste_chainee *) (*s_format).objet)) + .donnee = copie_objet(s_etat_processus, + (*l_element_courant_format).donnee, 'N')) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if ((chaine = formateur_fichier(s_etat_processus, + s_element, s_format, 0, 0, ' ', + 'F', &longueur_effective, &recursivite)) == NULL) + { + liberation(s_etat_processus, s_element); + liberation(s_etat_processus, s_format); + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + + liberation(s_etat_processus, s_element); + liberation(s_etat_processus, s_format); + + if ((clef_utf8 = transliteration(s_etat_processus, + chaine, d_locale, "UTF-8")) == NULL) + { + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + + free(chaine); + + // Récupération de l'identifiant de la clef + + if (alsprintf(&commande, "select id from key where key = " + "'%s'", clef_utf8) < 0) + { + free(clef_utf8); + + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + + if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + switch(sqlite3_step(ppStmt)) { - // Effacement d'un enregistrement + case SQLITE_ROW: + { + // Une clef existe. + + mise_a_jour = d_vrai; + break; + } - if (alsprintf(&commande, "delete from data where " - "id = %lld", (*((integer8 *) - (*s_objet_argument_2).objet))) < 0) + case SQLITE_DONE: { - liberation(s_etat_processus, s_objet_argument_3); + // Aucune clef n'existe. + + mise_a_jour = d_faux; + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + free(commande); + + if (alsprintf(&commande, "insert into key " + "(key) values ('%s')", clef_utf8) < 0) + { + free(clef_utf8); + + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + + if (sqlite3_prepare_v2((*descripteur) + .descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + free(commande); + + if (alsprintf(&commande, "select id from key " + "where key = '%s'", clef_utf8) < 0) + { + free(clef_utf8); + + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + + if (sqlite3_prepare_v2((*descripteur) + .descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (sqlite3_step(ppStmt) != SQLITE_ROW) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + break; + } + + default: + { + free(clef_utf8); + (*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; + } + + 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) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + free(commande); + + // Modification de la clef + + if (mise_a_jour == d_vrai) + { + if (alsprintf(&commande, "update key set key = '%s' where " + "id = %lld", clef_utf8, id) < 0) + { + free(clef_utf8); + liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } + + if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + free(commande); + } + + // Effacement de l'enregistrement existant + + if (alsprintf(&commande, "delete from data where " + "key_id = %lld", id) < 0) + { + free(clef_utf8); + + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; } - else + + if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) { - // Modification ou création d'un nouvel enregistrement + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + free(commande); + + // Modification ou création d'un nouvel enregistrement + + l_element_courant = (struct_liste_chainee *) + (*s_objet_argument_2).objet; + l_element_courant_format = (struct_liste_chainee *) + (*(*((struct_fichier *) (*s_objet_argument_1).objet)) + .format).objet; + compteur = 1; + ordre = 1; + + while((l_element_courant != NULL) && + (l_element_courant_format != NULL)) + { + if (compteur == clef) + { + l_element_courant = (*l_element_courant).suivant; + l_element_courant_format = (*l_element_courant_format) + .suivant; + compteur++; + continue; + } + + if ((s_element = allocation(s_etat_processus, LST)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (((*s_element).objet = + allocation_maillon(s_etat_processus)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + (*((struct_liste_chainee *) (*s_element).objet)).suivant + = NULL; + + if ((s_format = allocation(s_etat_processus, LST)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (((*s_format).objet = + allocation_maillon(s_etat_processus)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + (*((struct_liste_chainee *) (*s_format).objet)).suivant + = NULL; + + if (((*((struct_liste_chainee *) (*s_element).objet)) + .donnee = copie_objet(s_etat_processus, + (*l_element_courant).donnee, 'N')) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (((*((struct_liste_chainee *) (*s_format).objet)) + .donnee = copie_objet(s_etat_processus, + (*l_element_courant_format).donnee, 'N')) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } if ((chaine = formateur_fichier(s_etat_processus, - s_objet_argument_3, (*((struct_fichier *) - (*s_objet_argument_1).objet)).format, 0, 0, ' ', + s_element, s_format, 0, 0, ' ', 'F', &longueur_effective, &recursivite)) == NULL) { - liberation(s_etat_processus, s_objet_argument_3); + free(clef_utf8); + liberation(s_etat_processus, s_element); + liberation(s_etat_processus, s_format); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); @@ -675,9 +1230,9 @@ instruction_write(struct_processus *s_et if ((chaine_utf8 = transliteration(s_etat_processus, chaine, d_locale, "UTF-8")) == NULL) { + free(clef_utf8); 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); @@ -686,47 +1241,70 @@ instruction_write(struct_processus *s_et free(chaine); - if (alsprintf(&commande, "insert or replace into data " - "(id, data) values (%lld, '%s')", (*((integer8 *) - (*s_objet_argument_2).objet)), chaine_utf8) < 0) + if (alsprintf(&commande, "insert into data " + "(data, key_id, sequence) values " + "('%s', %lld, %lld)", chaine_utf8, id, ordre) < 0) { free(chaine_utf8); - liberation(s_etat_processus, s_objet_argument_3); + free(clef_utf8); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); return; } + if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + free(clef_utf8); + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + free(commande); 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; - } + liberation(s_etat_processus, s_element); + liberation(s_etat_processus, s_format); - if (sqlite3_step(ppStmt) != SQLITE_DONE) - { - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; - return; + l_element_courant = (*l_element_courant).suivant; + l_element_courant_format = (*l_element_courant_format) + .suivant; + + compteur++; + ordre++; } - if (sqlite3_finalize(ppStmt) != SQLITE_OK) + free(clef_utf8); + + if ((l_element_courant != NULL) || + (l_element_courant_format != NULL)) { - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_format_fichier; return; } - - liberation(s_etat_processus, s_objet_argument_3); - free(commande); - } - else - { - /* Fichiers indexés : panique totale ! */ } } else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire