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

version 1.5, 2010/03/04 10:17:48 version 1.6, 2010/03/06 18:29:06
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 292  recherche_chemin_fichiers_temporaires(st Line 292  recherche_chemin_fichiers_temporaires(st
   
   
 /*  /*
 ================================================================================   * 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 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 363  caracteristiques_fichier(struct_processu Line 363  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,
           logical1 fichier_indexe)
   {
       const char              commande1[] =
               "create table control(id integer primary key asc, lock text)";
       const char              commande2[] =
               "insert into control (id, lock) values (2, '0')";
       const char              *queue;
   
       sqlite3_stmt            *ppStmt;
   
       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 (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);
           }
       }
   
       return(d_absence_erreur);
   }
   
   logical1
   initialisation_fichier_acces_indexe(struct_processus *s_etat_processus,
           sqlite3 *sqlite, logical1 binaire)
   {
       const char              commande1[] =
               "create table data(id integer primary key asc, key_id integer, "
               "lock text)";
       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, "
               "lock blob)";
       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, 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, lock text)";
       const char              commande2[] =
               "create table data(id integer primary key asc, lock blob)";
       const char              commande3[] =
               "create index data_idx on data(id)";
       const char              *queue;
   
       sqlite3_stmt            *ppStmt;
   
       if (initialisation_controle(s_etat_processus, sqlite, 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);
   }
   
   unsigned char *
   verrouillage_fichier_sqlite(struct_processus *s_etat_processus,
           sqlite3 *sqlite, unsigned char *operation)
   {
       const char              commande1[] =
               "select lock from control where id = 1";
       const char              commande2[] =
               "update control set lock = '%s'";
       const char              *queue;
   
       const unsigned char     *resultat;
   
       sqlite3_stmt            *ppStmt;
   
       unsigned char           *verrou;
   
       resultat = NULL;
   
       if (operation == NULL)
       {
           // Lecture du verrou
   
           if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt,
                   &queue) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(NULL);
           }
   
           if (sqlite3_step(ppStmt) != SQLITE_ROW)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(NULL);
           }
   
           if (sqlite3_column_type(ppStmt, 0) != SQLITE_TEXT)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(NULL);
           }
   
           resultat = sqlite3_column_text(ppStmt, 0);
   
           if ((verrou = malloc((strlen(resultat) + 1) * sizeof(unsigned char)))
                   == NULL)
           {
               return(NULL);
           }
   
           strcpy(verrou, resultat);
   
           if (sqlite3_finalize(ppStmt) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(NULL);
           }
       }
       else
       {
           // Positionnement d'un verrou
   
           if (alsprintf(&verrou, commande2, operation) < 0)
           {
               (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return(NULL);
           }
   
           if (sqlite3_prepare_v2(sqlite, verrou, strlen(verrou), &ppStmt,
                   &queue) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(NULL);
           }
   
           if (sqlite3_step(ppStmt) != SQLITE_DONE)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(NULL);
           }
   
           if (sqlite3_finalize(ppStmt) != SQLITE_OK)
           {
               (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
               return(NULL);
           }
   
           free(verrou);
           verrou = NULL;
       }
   
       return(verrou);
   }
   
 // vim: ts=4  // vim: ts=4

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


CVSweb interface <joel.bertrand@systella.fr>