Diff for /rpl/src/instructions_d4.c between versions 1.4 and 1.19

version 1.4, 2010/03/04 10:17:50 version 1.19, 2011/04/11 12:10:07
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.12    RPL/2 (R) version 4.1.0.prerelease.0
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2011 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 20 Line 20
 */  */
   
   
 #include "rpl.conv.h"  #include "rpl-conv.h"
   
   
 /*  /*
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               *utf8;
   
     unsigned long               unite;      unsigned long               unite;
   
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
Line 60  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 79  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 94  instruction_delete(struct_processus *s_e Line 125  instruction_delete(struct_processus *s_e
   
     if ((*s_objet_argument).type == CHN)      if ((*s_objet_argument).type == CHN)
     {      {
         if (stat((unsigned char *) (*s_objet_argument).objet,          if ((nom = transliteration(s_etat_processus,
                 &requete) != 0)                  (unsigned char *) (*s_objet_argument).objet,
                   d_locale, "UTF-8")) == NULL)
           {
               liberation(s_etat_processus, s_objet_argument);
               return;
           }
   
           if (stat(nom, &requete) != 0)
         {          {
             liberation(s_etat_processus, s_objet_argument);              liberation(s_etat_processus, s_objet_argument);
               free(nom);
   
             (*s_etat_processus).erreur_execution =              (*s_etat_processus).erreur_execution =
                     d_ex_erreur_acces_fichier;                      d_ex_erreur_acces_fichier;
Line 106  instruction_delete(struct_processus *s_e Line 145  instruction_delete(struct_processus *s_e
   
         if (S_ISREG(requete.st_mode)) // Fichier régulier          if (S_ISREG(requete.st_mode)) // Fichier régulier
         {          {
             if ((fichier = fopen((unsigned char *)              if ((fichier = fopen(nom, "r+")) == NULL)
                     (*s_objet_argument).objet, "r+")) == NULL)  
             {              {
                 liberation(s_etat_processus, s_objet_argument);                  liberation(s_etat_processus, s_objet_argument);
                   free(nom);
   
                 (*s_etat_processus).erreur_execution =                  (*s_etat_processus).erreur_execution =
                         d_ex_erreur_acces_fichier;                          d_ex_erreur_acces_fichier;
Line 124  instruction_delete(struct_processus *s_e Line 163  instruction_delete(struct_processus *s_e
   
             if (fcntl(fileno(fichier), F_GETLK, &lock) == -1)              if (fcntl(fileno(fichier), F_GETLK, &lock) == -1)
             {              {
                   free(nom);
   
                 if (fclose(fichier) != 0)                  if (fclose(fichier) != 0)
                 {                  {
                     liberation(s_etat_processus, s_objet_argument);                      liberation(s_etat_processus, s_objet_argument);
Line 143  instruction_delete(struct_processus *s_e Line 184  instruction_delete(struct_processus *s_e
             if (lock.l_type != F_UNLCK)              if (lock.l_type != F_UNLCK)
             {              {
                 liberation(s_etat_processus, s_objet_argument);                  liberation(s_etat_processus, s_objet_argument);
                   free(nom);
   
                 (*s_etat_processus).erreur_execution =                  (*s_etat_processus).erreur_execution =
                         d_ex_erreur_acces_fichier;                          d_ex_erreur_acces_fichier;
                 return;                  return;
             }              }
   
             erreur = caracteristiques_fichier(s_etat_processus,              erreur = caracteristiques_fichier(s_etat_processus, nom,
                     (unsigned char *) (*s_objet_argument).objet,  
                     &existence, &ouverture, &unite);                      &existence, &ouverture, &unite);
   
             if ((erreur != d_absence_erreur) || (ouverture == d_vrai))              if ((erreur != d_absence_erreur) || (ouverture == d_vrai))
             {              {
                 liberation(s_etat_processus, s_objet_argument);                  liberation(s_etat_processus, s_objet_argument);
                   free(nom);
   
                 (*s_etat_processus).erreur_execution =                  (*s_etat_processus).erreur_execution =
                         d_ex_erreur_acces_fichier;                          d_ex_erreur_acces_fichier;
                 return;                  return;
             }              }
   
             if (destruction_fichier((unsigned char *)              if (destruction_fichier(nom) == d_erreur)
                     (*s_objet_argument).objet) == d_erreur)  
             {              {
                 liberation(s_etat_processus, s_objet_argument);                  liberation(s_etat_processus, s_objet_argument);
                   free(nom);
   
                 (*s_etat_processus).erreur_execution =                  (*s_etat_processus).erreur_execution =
                         d_ex_erreur_acces_fichier;                          d_ex_erreur_acces_fichier;
Line 174  instruction_delete(struct_processus *s_e Line 216  instruction_delete(struct_processus *s_e
         }          }
         else // Socket          else // Socket
         {          {
             if (unlink((unsigned char *) (*s_objet_argument).objet) != 0)              if (unlink(nom) != 0)
             {              {
                 liberation(s_etat_processus, s_objet_argument);                  liberation(s_etat_processus, s_objet_argument);
                   free(nom);
   
                 (*s_etat_processus).erreur_execution =                  (*s_etat_processus).erreur_execution =
                         d_ex_erreur_acces_fichier;                          d_ex_erreur_acces_fichier;
                 return;                  return;
             }              }
         }          }
   
           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
     {      {

Removed from v.1.4  
changed lines
  Added in v.1.19


CVSweb interface <joel.bertrand@systella.fr>