]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/tipo3.c
* BUGFIX : estaba mal el modo de apertura del archivo.
[z.facultad/75.06/emufs.git] / emufs / tipo3.c
index 56954ff23fb7fc6eb964f3098d0359756a956f47..c6fbd1fb1055e174d0661dcc3923d4a042cde357 100644 (file)
@@ -101,7 +101,7 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID,
 }
 
 /*leo el bloque "ID" del archivo que viene en "emu->nombre", y lo almaceno en "ptr"*/
-void* emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_REG_ID ID, int* err)
+void* emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID ID, int* err)
 {
        FILE* file;
        char* block; /* bloque leido (en donde está el registro a leer) */
@@ -111,12 +111,18 @@ void* emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_REG_ID ID, int* err)
        strcat(name_f,".dat");
        
        if ((file = fopen(name_f, "r")) == NULL) {
+               PERR("No se pudo abrir el archivo de datos");
                *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
                return NULL; /* FIXME ERROR */
        }
        fseek(file,sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE),SEEK_SET);
        /*FIXME: verificar que no se pase de fin de archivo*/
-       fseek(file,ID*emu->tam_bloque,SEEK_CUR);
+       if (fseek(file,ID*emu->tam_bloque,SEEK_CUR) != 0){
+               PERR("Fallo la busqueda del bloque");
+               *err=3;
+               return NULL;
+       }
+       
        block = (char*) malloc(emu->tam_bloque);
        if (block == NULL) {
                /* TODO Manejo de errores */
@@ -152,7 +158,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t
        
        cant_bloques = (emu->tam_reg / (emu->tam_bloque-sizeof(EMUFS_REG_ID))) + 1;
        resto = emu->tam_bloque - sizeof(EMUFS_REG_ID);
-       lugar = emu->tam_reg - sizeof(EMUFS_REG_ID);
+       lugar = emu->tam_reg + sizeof(EMUFS_REG_ID);
        if ( emu->tam_bloque < emu->tam_reg - sizeof(EMUFS_REG_ID) )
                lugar = emu->tam_bloque;
        /* me devuelve el ID del bloque donde quepa un registro y el espacio libre en "fs"*/
@@ -475,41 +481,28 @@ void* emufs_tipo3_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE
 
 void emufs_tipo3_compactar(EMUFS *emu)
 {
-       FILE *f;
        EMUFS_REG_ID *tmp, max_id;
+       EMUFS_BLOCK_ID block_id;
        EMUFS_REG_SIZE size;
        EMUFS_Estadisticas s;
        char name[255];
        char *reg;
-       int err=0, ID_aux, cant_bloques, i, bloques_vacios=0;
+       int err=0, ID_aux, i,fs;
+       
+       strcpy(name, emu->nombre);
+       strcat(name, ".dat");
        
        /* si el bloque es mas chico que el registro no hace falta compactar */
        /*if( emu->tam_reg-sizeof(EMUFS_REG_ID) > emu->tam_bloque ) return;     */
-               
-       strcpy(name,emu->nombre);
-       strcat(name,".dat");
-
-       if ( (f=fopen(name,"r") == NULL) ){
-               PERR("No se pudo abrir el archivo");
-               return;
-       }
-       s = emufs_tipo3_leer_estadisticas(emu);
-       cant_bloques = s.cant_bloques;
 
-       /* si solo hay un bloque no hace falta compactar */
-       if ( cant_bloques == 0 ){
-               fclose(f);
-               return;
-       }
        tmp = emufs_idx_get(emu, &max_id);
        if (tmp) free(tmp);
        for( i=0; i<=max_id; i++){
                /* si el id no existe paso al siguiente*/
-               if ( emufs_idx_existe_id(emu, i) != 0 ) continue;
+               if ( emufs_idx_existe_id(emu, i) != 0 ) continue;
                reg = emufs_tipo3_leer_registro(emu, i, &size, &err);
                if (err){
                        PERR("No se pudo leer el registro");
-                       fclose(f);
                        return;
                }
                emufs_tipo3_borrar_registro(emu, i);
@@ -517,8 +510,15 @@ void emufs_tipo3_compactar(EMUFS *emu)
                i++;
        }
        /*tengo que truncar el archivo*/
-       bloques_vacios = emufs_fsc_get_cant_bloques_vacios(emu)-1;
-       truncate(name, sizeof(EMUFS_Tipo)+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_BLOCK_SIZE)+emu->tam_bloque*(cant_bloques-bloques_vacios));
-       /*fclose(f);  problemas con el fclose FIXME!!!*/
+       /*bloques_vacios = emufs_fsc_get_cant_bloques_vacios(emu)-1;
+       */
+       block_id = emufs_fsc_buscar_lugar(emu, emu->tam_bloque, &fs);
+       size = sizeof(EMUFS_Tipo)+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_BLOCK_SIZE)+block_id*emu->tam_bloque;
+       if (truncate(name, size)!=0)
+               PERR("NO TRUNQUE NADA");
+       /*hay que truncar el fsc!!!*/
+       if(emu->tam_bloque<emu->tam_reg-sizeof(EMUFS_REG_ID)) block_id = block_id/2;
+       if (emufs_fsc_truncate(emu, block_id)!= 0)
+               PERR("NO TURNQUE EL FSC");
        free(reg);
 }