--- rpl/src/instructions_d4.c 2012/12/19 09:58:24 1.45 +++ rpl/src/instructions_d4.c 2012/12/21 12:09:50 1.46 @@ -42,6 +42,8 @@ instruction_delete(struct_processus *s_e file *fichier; + int ios; + integer8 lecture_i64; logical1 erreur; @@ -59,6 +61,8 @@ instruction_delete(struct_processus *s_e struct stat requete; + struct timespec attente; + unsigned char *commande; unsigned char *nom; unsigned char *utf8; @@ -323,11 +327,29 @@ instruction_delete(struct_processus *s_e return; } - if (sqlite3_step(ppStmt) != SQLITE_ROW) + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + do { - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; - return; - } + ios = sqlite3_step(ppStmt); + + if (ios == SQLITE_ROW) + { + break; + } + else if ((ios == SQLITE_BUSY) || (ios == SQLITE_LOCKED)) + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + } + else + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + } while(ios != SQLITE_ROW); lecture_i64 = sqlite3_column_int64(ppStmt, 0); @@ -437,41 +459,57 @@ instruction_delete(struct_processus *s_e return; } - switch(sqlite3_step(ppStmt)) + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + do { - case SQLITE_ROW: - { - // Correspondance - break; - } + ios = sqlite3_step(ppStmt); - case SQLITE_DONE: + switch(ios) { - // Aucune correspondance - if (sqlite3_finalize(ppStmt) != SQLITE_OK) + case SQLITE_ROW: { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; + // Correspondance + break; } - free(commande); + case SQLITE_DONE: + { + // Aucune correspondance + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } - liberation(s_etat_processus, s_objet_argument); - liberation(s_etat_processus, s_objet_indice); + free(commande); - (*s_etat_processus).erreur_execution = - d_ex_enregistrement_inexistant; - return; - } + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_indice); - default: - { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; + (*s_etat_processus).erreur_execution = + d_ex_enregistrement_inexistant; + return; + } + + case SQLITE_LOCKED: + case SQLITE_BUSY: + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + break; + } + + default: + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } } - } + } while(ios != SQLITE_ROW); if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER) {