Diff for /rpl/src/gestion_fichiers.c between versions 1.1.1.1 and 1.46

version 1.1.1.1, 2010/01/26 15:22:44 version 1.46, 2012/12/18 13:19:35
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.9    RPL/2 (R) version 4.1.12
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2012 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 77  creation_nom_fichier(struct_processus *s Line 77  creation_nom_fichier(struct_processus *s
   
     do      do
     {      {
         sprintf(tampon, "RPL2-%lu-%lu-%lu", (unsigned long) getpid(),          sprintf(tampon, "RPL-%lu-%lu-%lu", (unsigned long) getpid(),
                 (unsigned long) pthread_self(), ordre);                  (unsigned long) pthread_self(), ordre);
   
         if (chemin == NULL)          if (chemin == NULL)
Line 153  destruction_fichier(unsigned char *nom_f Line 153  destruction_fichier(unsigned char *nom_f
  * Renvoie le descripteur en fonction de la structure de contrôle du fichier   * Renvoie le descripteur en fonction de la structure de contrôle du fichier
  */   */
   
 file *  struct_descripteur_fichier *
 descripteur_fichier(struct_processus *s_etat_processus,  descripteur_fichier(struct_processus *s_etat_processus,
         struct_fichier *s_fichier)          struct_fichier *s_fichier)
 {  {
Line 174  descripteur_fichier(struct_processus *s_ Line 174  descripteur_fichier(struct_processus *s_
                     (*((struct_descripteur_fichier *) (*l_element_courant)                      (*((struct_descripteur_fichier *) (*l_element_courant)
                     .donnee)).tid, pthread_self()) != 0))                      .donnee)).tid, pthread_self()) != 0))
             {              {
                 return((*((struct_descripteur_fichier *)                  return((struct_descripteur_fichier *)
                         (*l_element_courant).donnee)).descripteur);                          (*l_element_courant).donnee);
             }              }
             else              else
             {              {
Line 222  recherche_chemin_fichiers_temporaires(st Line 222  recherche_chemin_fichiers_temporaires(st
     {      {
         if (chemins[i][0] == '$')          if (chemins[i][0] == '$')
         {          {
             candidat = getenv("RPL_TMP_PATH");              candidat = getenv(chemins[i] + 1);
   
             if (candidat != NULL)              if (candidat != NULL)
             {              {
                 if ((nom_candidat = creation_nom_fichier(s_etat_processus,                  if ((nom_candidat = creation_nom_fichier(s_etat_processus,
                         candidat)) == NULL)                          candidat)) == NULL)
                 {                  {
                     return NULL;                      return(NULL);
                 }                  }
   
                 if ((fichier = fopen(nom_candidat, "w+")) != NULL)                  if ((fichier = fopen(nom_candidat, "w+")) != NULL)
Line 245  recherche_chemin_fichiers_temporaires(st Line 245  recherche_chemin_fichiers_temporaires(st
                     }                      }
                     else                      else
                     {                      {
                         return NULL;                          return(NULL);
                     }                      }
                 }                  }
                 else                  else
Line 259  recherche_chemin_fichiers_temporaires(st Line 259  recherche_chemin_fichiers_temporaires(st
             if ((nom_candidat = creation_nom_fichier(s_etat_processus,              if ((nom_candidat = creation_nom_fichier(s_etat_processus,
                     chemins[i])) == NULL)                      chemins[i])) == NULL)
             {              {
                 return NULL;                  return(NULL);
             }              }
   
             if ((fichier = fopen(nom_candidat, "w+")) != NULL)              if ((fichier = fopen(nom_candidat, "w+")) != NULL)
Line 275  recherche_chemin_fichiers_temporaires(st Line 275  recherche_chemin_fichiers_temporaires(st
                 }                  }
                 else                  else
                 {                  {
                     return NULL;                      return(NULL);
                 }                  }
             }              }
             else              else
Line 287  recherche_chemin_fichiers_temporaires(st Line 287  recherche_chemin_fichiers_temporaires(st
         i++;          i++;
     }      }
   
     return chemin;      return(chemin);
 }  }
   
   
 /*  /*
 ================================================================================   * Fonction d'interrogation du fichier
   Fonction d'interrogation du fichier   */
 ================================================================================  
 */  
   
 logical1  logical1
 caracteristiques_fichier(struct_processus *s_etat_processus,  caracteristiques_fichier(struct_processus *s_etat_processus,
Line 312  caracteristiques_fichier(struct_processu Line 310  caracteristiques_fichier(struct_processu
     (*ouverture) = d_faux;      (*ouverture) = d_faux;
     (*existence) = d_faux;      (*existence) = d_faux;
   
     if ((descripteur = open(nom, O_CREAT | O_EXCL)) == -1)      if ((descripteur = open(nom, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1)
     {      {
         if (errno == EEXIST)          if (errno == EEXIST)
         {          {
Line 338  caracteristiques_fichier(struct_processu Line 336  caracteristiques_fichier(struct_processu
                             != 0))                              != 0))
                     {                      {
                         (*ouverture) = d_vrai;                          (*ouverture) = d_vrai;
   
                         (*unite) = (unsigned long)                          (*unite) = (unsigned long)
                                 fileno((*((struct_descripteur_fichier *)                                  fileno((*((struct_descripteur_fichier *)
                                 (*l_element_courant).donnee)).descripteur);                                  (*l_element_courant).donnee))
                                   .descripteur_c);
                         break;                          break;
                     }                      }
                 }                  }
Line 348  caracteristiques_fichier(struct_processu Line 348  caracteristiques_fichier(struct_processu
                 l_element_courant = (*l_element_courant).suivant;                  l_element_courant = (*l_element_courant).suivant;
             }              }
         }          }
           else if (errno == EACCES)
           {
               // Le répertoire n'est pas accessible en écriture. On tente
               // l'ouverture du fichier.
   
               if ((descripteur = open(nom, O_RDONLY, S_IRUSR | S_IWUSR)) == -1)
               {
                   // Le fichier n'existe pas.
                   close(descripteur);
                   erreur = d_absence_erreur;
               }
               else
               {
                   erreur = d_absence_erreur;
                   (*existence) = d_vrai;
   
                   // On chercher à savoir si le fichier est ouvert.
                   // S'il est ouvert, on renvoie son unité de rattachement.
   
                   l_element_courant = (*s_etat_processus).s_fichiers;
   
                   while(l_element_courant != NULL)
                   {
                       if (strcmp((*((struct_descripteur_fichier *)
                               (*l_element_courant).donnee)).nom, nom) == 0)
                       {
                           if (((*((struct_descripteur_fichier *)
                                   (*l_element_courant).donnee)).pid == getpid())
                                   && (pthread_equal(
                                   (*((struct_descripteur_fichier *)
                                   (*l_element_courant).donnee)).tid,
                                   pthread_self()) != 0))
                           {
                               (*ouverture) = d_vrai;
   
                               (*unite) = (unsigned long)
                                       fileno((*((struct_descripteur_fichier *)
                                       (*l_element_courant).donnee))
                                       .descripteur_c);
                               break;
                           }
                       }
   
                       l_element_courant = (*l_element_courant).suivant;
                   }
               }
           }
         else          else
         {          {
             erreur = d_erreur;              erreur = d_erreur;
Line 363  caracteristiques_fichier(struct_processu Line 410  caracteristiques_fichier(struct_processu
     return(erreur);      return(erreur);
 }  }
   
   
   /*
   ================================================================================
     Routines d'initialisation des fichiers à accès direct et indexé
   ================================================================================
     Entrées : pointeur sur le fichier SQLITE
   --------------------------------------------------------------------------------
     Sorties : drapeau d'erreur
   --------------------------------------------------------------------------------
     Effets de bord : néant
   ================================================================================
   */
   
   /*
    * Un fichier à accès direct se compose d'une seule table :
    * 1: identifiant (entier sur 64 bits) -> enregistrement
    *
    * Un fichier à accès indexé comporte trois tables :
    * 1 : contrôle
    * 2 : clef (unique) -> identifiant (entier sur 64 bits)
    * 3 : identifiant -> collection d'enregistrements
    *
    * La table de contrôle contient
    * 1/ la position de la clef pour les fichiers à accès indexés
    */
   
   static logical1
   initialisation_controle(struct_processus *s_etat_processus, sqlite3 *sqlite,
           integer8 position_clef, logical1 fichier_indexe)
   {
       const char              commande1[] =
               "create table control(id integer primary key asc, key integer)";
       const char              commande2[] =
               "insert into control (id, key) values (1, %lld)";
       const char              *queue;
   
       sqlite3_stmt            *ppStmt;
   
       unsigned char           *commande;
   
       if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt,
               &queue) != SQLITE_OK)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       if (sqlite3_step(ppStmt) != SQLITE_DONE)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       if (sqlite3_finalize(ppStmt) != SQLITE_OK)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       if (fichier_indexe == d_vrai)
       {
           if (alsprintf(&commande, commande2, position_clef) < 0)
           {
               (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return(d_erreur);
           }
   
           if (sqlite3_prepare_v2(sqlite, commande, strlen(commande), &ppStmt,
                   &queue) != SQLITE_OK)
           {
               free(commande);
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_step(ppStmt) != SQLITE_DONE)
           {
               free(commande);
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_finalize(ppStmt) != SQLITE_OK)
           {
               free(commande);
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           free(commande);
       }
   
       return(d_absence_erreur);
   }
   
   logical1
   initialisation_fichier_acces_indexe(struct_processus *s_etat_processus,
           sqlite3 *sqlite, integer8 position_clef, logical1 binaire)
   {
       const char              commande1[] =
               "create table data(id integer primary key asc, key_id integer, "
               "data text, sequence integer)";
       const char              commande10[] =
               "create table key(id integer primary key asc, key text)";
       const char              commande2[] =
               "create table data(id integer primary key asc, key_id integer, "
               "data blob, sequence integer)";
       const char              commande20[] =
               "create table key(id integer primary key asc, key blob)";
       const char              commande3[] =
               "create index data_idx on data(key_id)";
       const char              commande4[] =
               "create index key_idx on key(key)";
       const char              *queue;
   
       sqlite3_stmt            *ppStmt;
   
       if (initialisation_controle(s_etat_processus, sqlite, position_clef, d_vrai)
               != d_absence_erreur)
       {
           return(d_erreur);
       }
   
       if (binaire == d_faux)
       {
           if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt,
                   &queue) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_step(ppStmt) != SQLITE_DONE)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_finalize(ppStmt) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_prepare_v2(sqlite, commande10, strlen(commande10), &ppStmt,
                   &queue) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_step(ppStmt) != SQLITE_DONE)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_finalize(ppStmt) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
       }
       else
       {
           if (sqlite3_prepare_v2(sqlite, commande2, strlen(commande2), &ppStmt,
                   &queue) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_step(ppStmt) != SQLITE_DONE)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_finalize(ppStmt) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_prepare_v2(sqlite, commande20, strlen(commande20), &ppStmt,
                   &queue) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_step(ppStmt) != SQLITE_DONE)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_finalize(ppStmt) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
       }
   
       if (sqlite3_prepare_v2(sqlite, commande3, strlen(commande3), &ppStmt,
               &queue) != SQLITE_OK)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       if (sqlite3_step(ppStmt) != SQLITE_DONE)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       if (sqlite3_finalize(ppStmt) != SQLITE_OK)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       if (sqlite3_prepare_v2(sqlite, commande4, strlen(commande4), &ppStmt,
               &queue) != SQLITE_OK)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       if (sqlite3_step(ppStmt) != SQLITE_DONE)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       if (sqlite3_finalize(ppStmt) != SQLITE_OK)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       return(d_absence_erreur);
   }
   
   logical1
   initialisation_fichier_acces_direct(struct_processus *s_etat_processus,
           sqlite3 *sqlite, logical1 binaire)
   {
       const char              commande1[] =
               "create table data(id integer primary key asc, data text)";
       const char              commande2[] =
               "create table data(id integer primary key asc, data blob)";
       const char              commande3[] =
               "create index data_idx on data(id)";
       const char              *queue;
   
       sqlite3_stmt            *ppStmt;
   
       if (initialisation_controle(s_etat_processus, sqlite, (integer8) 0, d_faux)
               != d_absence_erreur)
       {
           return(d_erreur);
       }
   
       if (binaire == d_faux)
       {
           if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt,
                   &queue) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_step(ppStmt) != SQLITE_DONE)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_finalize(ppStmt) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
       }
       else
       {
           if (sqlite3_prepare_v2(sqlite, commande2, strlen(commande2), &ppStmt,
                   &queue) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_step(ppStmt) != SQLITE_DONE)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
   
           if (sqlite3_finalize(ppStmt) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(d_erreur);
           }
       }
   
       if (sqlite3_prepare_v2(sqlite, commande3, strlen(commande3), &ppStmt,
               &queue) != SQLITE_OK)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       if (sqlite3_step(ppStmt) != SQLITE_DONE)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       if (sqlite3_finalize(ppStmt) != SQLITE_OK)
       {
           (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
           return(d_erreur);
       }
   
       return(d_absence_erreur);
   }
   
 // vim: ts=4  // vim: ts=4

Removed from v.1.1.1.1  
changed lines
  Added in v.1.46


CVSweb interface <joel.bertrand@systella.fr>