Diff for /rpl/src/instructions_d4.c between versions 1.5 and 1.6

version 1.5, 2010/03/06 18:29:07 version 1.6, 2010/03/09 09:19:49
Line 38 Line 38
 void  void
 instruction_delete(struct_processus *s_etat_processus)  instruction_delete(struct_processus *s_etat_processus)
 {  {
       const char                  *queue;
   
     file                        *fichier;      file                        *fichier;
   
       integer8                    lecture_i64;
   
     logical1                    erreur;      logical1                    erreur;
     logical1                    existence;      logical1                    existence;
     logical1                    ouverture;      logical1                    ouverture;
   
       sqlite3_stmt                *ppStmt;
   
       struct_descripteur_fichier  *descripteur;
   
     struct_objet                *s_objet_argument;      struct_objet                *s_objet_argument;
       struct_objet                *s_objet_indice;
   
     struct flock                lock;      struct flock                lock;
   
     struct stat                 requete;      struct stat                 requete;
   
       unsigned char               *commande;
     unsigned char               *nom;      unsigned char               *nom;
       unsigned char               *utf8;
   
     unsigned long               unite;      unsigned long               unite;
   
Line 62  instruction_delete(struct_processus *s_e Line 73  instruction_delete(struct_processus *s_e
   
         if ((*s_etat_processus).langue == 'F')          if ((*s_etat_processus).langue == 'F')
         {          {
             printf("(effacement d'un fichier)\n\n");              printf("(effacement d'un fichier ou d'un enregistrement)\n\n");
         }          }
         else          else
         {          {
             printf("(delete a file)\n\n");              printf("(delete file or record)\n\n");
         }          }
   
         printf("    1: %s\n", d_CHN);          printf("    1: %s\n\n", d_CHN);
   
           printf("    2: %s, %s\n", d_CHN, d_INT);
           printf("    1: %s\n", d_FCH);
         return;          return;
     }      }
     else if ((*s_etat_processus).test_instruction == 'Y')      else if ((*s_etat_processus).test_instruction == 'Y')
Line 81  instruction_delete(struct_processus *s_e Line 94  instruction_delete(struct_processus *s_e
   
     if (test_cfsf(s_etat_processus, 31) == d_vrai)      if (test_cfsf(s_etat_processus, 31) == d_vrai)
     {      {
         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)          if ((*s_etat_processus).l_base_pile == NULL)
         {          {
               (*s_etat_processus).erreur_execution = d_ex_manque_argument;
             return;              return;
         }          }
   
           if ((*(*(*s_etat_processus).l_base_pile).donnee).type == FCH)
           {
               if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
               {
                   return;
               }
           }
           else
           {
               if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
               {
                   return;
               }
           }
     }      }
   
     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),      if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
Line 200  instruction_delete(struct_processus *s_e Line 229  instruction_delete(struct_processus *s_e
   
         free(nom);          free(nom);
     }      }
       else if ((*s_objet_argument).type == FCH)
       {
           if ((descripteur = descripteur_fichier(s_etat_processus,
                   (struct_fichier *) (*s_objet_argument).objet)) == NULL)
           {
               return;
           }
   
           /*
            * Vérification des verrous
            */
   
           lock.l_type = F_RDLCK;
           lock.l_whence = SEEK_SET;
           lock.l_start = 0;
           lock.l_len = 0;
           lock.l_pid = getpid();
   
           if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock)
                   == -1)
           {
               liberation(s_etat_processus, s_objet_argument);
   
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return;
           }
   
           if (lock.l_type != F_UNLCK)
           {
               liberation(s_etat_processus, s_objet_argument);
   
               (*s_etat_processus).erreur_execution =
                       d_ex_fichier_verrouille;
               return;
           }
   
           if ((*((struct_fichier *) (*s_objet_argument).objet))
                   .protection == 'R')
           {
               liberation(s_etat_processus, s_objet_argument);
   
               (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
               return;
           }
   
           if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire == 'N')
           {
               if ((*((struct_fichier *) (*s_objet_argument).objet)).acces
                       == 'S')
               {
                   liberation(s_etat_processus, s_objet_argument);
   
                   (*s_etat_processus).erreur_execution = d_ex_erreur_type_fichier;
                   return;
               }
               else if ((*((struct_fichier *) (*s_objet_argument).objet)).acces
                       == 'D')
               {
                   BUG(((*descripteur).type == 'C'), uprintf("Bad filtype !\n"));
   
                   if (depilement(s_etat_processus, &((*s_etat_processus)
                           .l_base_pile), &s_objet_indice) == d_erreur)
                   {
                       (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                       return;
                   }
   
                   if ((*s_objet_indice).type != INT)
                   {
                       liberation(s_etat_processus, s_objet_argument);
                       liberation(s_etat_processus, s_objet_indice);
   
                       (*s_etat_processus).erreur_execution =
                               d_ex_erreur_type_argument;
                       return;
                   }
   
                   if (alsprintf(&commande, "select count(*) from data where "
                           "id = %lld", (*((integer8 *) (*s_objet_indice).objet)))
                           < 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;
                   }
   
                   lecture_i64 = 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 (lecture_i64 == 0)
                   {
                       liberation(s_etat_processus, s_objet_argument);
                       liberation(s_etat_processus, s_objet_indice);
   
                       (*s_etat_processus).erreur_execution =
                               d_ex_enregistrement_inexistant;
                       return;
                   }
   
                   if (alsprintf(&commande, "delete from data where id = %lld",
                           (*((integer8 *) (*s_objet_indice).objet))) < 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_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);
                   liberation(s_etat_processus, s_objet_indice);
               }
               else
               {
                   BUG(((*descripteur).type == 'C'), uprintf("Bad filtype !\n"));
   
                   if (depilement(s_etat_processus, &((*s_etat_processus)
                           .l_base_pile), &s_objet_indice) == d_erreur)
                   {
                       (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                       return;
                   }
   
                   if ((*s_objet_indice).type != CHN)
                   {
                       liberation(s_etat_processus, s_objet_argument);
                       liberation(s_etat_processus, s_objet_indice);
   
                       (*s_etat_processus).erreur_execution =
                               d_ex_erreur_type_argument;
                       return;
                   }
   
                   // Récupération de l'identifiant de la clef
   
                   if ((utf8 = transliteration(s_etat_processus,
                           (unsigned char *) (*s_objet_indice).objet, d_locale,
                           "UTF-8")) == NULL)
                   {
                       liberation(s_etat_processus, s_objet_argument);
                       liberation(s_etat_processus, s_objet_indice);
   
                       return;
                   }
   
                   if (alsprintf(&commande, "select id from key where key = "
                           "'{ \"%s\" }'", utf8) < 0)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   free(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;
                   }
   
                   switch(sqlite3_step(ppStmt))
                   {
                       case SQLITE_ROW:
                       {
                           // Correspondance
                           break;
                       }
   
                       case SQLITE_DONE:
                       {
                           // Aucune correspondance
                           if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                           {
                               (*s_etat_processus).erreur_systeme =
                                       d_es_erreur_fichier;
                               return;
                           }
   
                           free(commande);
   
                           liberation(s_etat_processus, s_objet_argument);
                           liberation(s_etat_processus, s_objet_indice);
   
                           (*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)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                       return;
                   }
   
                   lecture_i64 = 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, "delete from data where key_id = %lld",
                           lecture_i64) < 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_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, "delete from key where id = %lld",
                           lecture_i64) < 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_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);
                   liberation(s_etat_processus, s_objet_indice);
               }
           }
           else // Fichiers non formatés
           {
           }
       }
     else      else
     {      {
         liberation(s_etat_processus, s_objet_argument);          liberation(s_etat_processus, s_objet_argument);

Removed from v.1.5  
changed lines
  Added in v.1.6


CVSweb interface <joel.bertrand@systella.fr>