]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/tipo1.c
GUI vuelve a compilar. Ahora las estadisticas respetan el enunciado pero se ven
[z.facultad/75.06/emufs.git] / emufs / tipo1.c
index 27b0dc999469f85cc497a19dc8f9afe733bb7f83..0e981af7458c361f547e647fc1fc0b71783619f4 100644 (file)
@@ -39,9 +39,9 @@
 #include "idx.h"
 #include "fsc.h"
 #include "did.h"
+#include "common.h"
 #include "error.h"
 #include <unistd.h>
-#include <sys/types.h>
 #include <stdio.h>
 #include <math.h>
 #include <stdlib.h>
@@ -75,9 +75,6 @@ static void* emufs_tipo1_leer_bloque(EMUFS*, EMUFS_BLOCK_ID, int*);
 static EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS*, void*,
                EMUFS_BLOCK_ID, EMUFS_FREE, int*);
 
-/** Obtiene el tamaño del archivo. */
-static long emufs_tipo1_get_file_size(EMUFS*, int*);
-
 /*------------------ Funciones públicas ----------------------*/
 
 int emufs_tipo1_inicializar(EMUFS* efs)
@@ -98,6 +95,7 @@ int emufs_tipo1_inicializar(EMUFS* efs)
        efs->leer_registro_raw = emufs_tipo1_leer_registro_raw;
        efs->leer_estadisticas = emufs_tipo1_leer_estadisticas;
        efs->compactar         = emufs_tipo1_compactar;
+       efs->tam_reg = 0;
        return EMUFS_OK;
 }
 
@@ -479,35 +477,48 @@ int emufs_tipo1_borrar_registro(EMUFS* efs, EMUFS_REG_ID reg_id)
 
 EMUFS_Estadisticas emufs_tipo1_leer_estadisticas(EMUFS* efs)
 {
-       int err = 0;
+       int err = 0,err1 = 0, err2 = 0, err3 = 0;
        EMUFS_Estadisticas stats;
        memset(&stats, 0, sizeof(EMUFS_Estadisticas));
 
-       stats.tam_archivo_bytes = emufs_tipo1_get_file_size(efs, &err);
-       if (err) {
-               PERR("no se pudo obtener el tamaño del archivo");
-               return stats;
+       { /* obtengo tamaño del archivo en bytes */
+               char name_f[255];
+               strcpy(name_f, efs->nombre);
+               strcat(name_f, ".dat");
+               stats.tam_archivo = emufs_common_get_file_size(name_f, &err);
+               if (err) {
+                       PERR("no se pudo obtener el tamaño del archivo");
+                       return stats;
+               }
        }
 
-       /* obtengo cantidad de bloques */
-       stats.cant_bloques = (stats.tam_archivo_bytes - emufs_tipo1_header_size())
+       /* obtengo cantidad de bloques en el archivo */
+       stats.cant_bloques = (stats.tam_archivo - emufs_tipo1_header_size())
                        / efs->tam_bloque;
 
        /* obtengo la cantidad de registros en el archivo */
        {
-               EMUFS_REG_ID *tmp = emufs_idx_get(efs, &stats.tam_archivo);
+               EMUFS_REG_ID *tmp = emufs_idx_get(efs, &stats.cant_registros);
                if (tmp) free(tmp); /* libera memoria innecesaria */
        }
 
-       /* obtengo total de información de control que guarda el archivo */
-       stats.info_control = emufs_tipo1_header_size() /* cabecera del archivo */
+       /* obtengo información de control que guarda el archivo .dat */
+       stats.tam_info_control_dat = emufs_tipo1_header_size() /* cabecera del archivo */
                        /* mas las cabeceras de todos los registros */
-                       + stats.tam_archivo * sizeof(EMUFS_TIPO1_REG_HEADER);
+                       + stats.cant_registros * sizeof(EMUFS_TIPO1_REG_HEADER);
 
        /* obtengo las estadísticas del archivo de espacio libre por bloque */
        stats.total_fs = emufs_fsc_get_total_fs(efs);
        stats.media_fs = emufs_fsc_get_media_fs(efs);
        emufs_fsc_get_max_min_fs(efs, &stats.min_fs, &stats.max_fs);
+       
+       /* obtengo informacion de control guardada por los archivos auxiliares */
+       stats.tam_archivos_aux = emufs_idx_get_file_size(efs,&err1) + emufs_fsc_get_file_size(efs,&err2)
+                                                       + emufs_did_get_file_size(efs,&err3);
+       if (err1 || err2 || err3) {
+               PERR("Hubo problemas en lectura de filesize archivos auxiliares");
+               return stats;
+       }       
 
        return stats;   
 }
@@ -584,10 +595,20 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block,
 {
        FILE* file;
        char name_f[255];
+       EMUFS_BLOCK_SIZE num_blocks;
+
+       /* obtengo nombre del archivo */
+       strcpy(name_f, efs->nombre);
+       strcat(name_f,".dat");
+
        /* obtengo cantidad de bloques */
-       EMUFS_BLOCK_SIZE num_blocks =
-               (emufs_tipo1_get_file_size(efs, err) - emufs_tipo1_header_size())
+       num_blocks =
+               (emufs_common_get_file_size(name_f, err) - emufs_tipo1_header_size())
                / efs->tam_bloque;
+       if (*err) {
+               PERR("Error al obtener tamaño del archivo.");
+               return EMUFS_NOT_FOUND;
+       }
 
        /* abre archivo */
        strcpy(name_f,efs->nombre);
@@ -694,24 +715,6 @@ void emufs_tipo1_escribir_reg_chunk_en_memoria(char* dst,
        memcpy(dst, reg, reg_size);
 }
 
-long emufs_tipo1_get_file_size(EMUFS* efs, int* err)
-{
-       long  file_size;
-       FILE* file;
-       char  name_f[255];
-
-       strcpy(name_f, efs->nombre);
-       strcat(name_f, ".dat");
-       if ((file = fopen(name_f, "ab")) == NULL) {
-               PERR("Error al abrir archivo");
-               *err = EMUFS_ERROR_CANT_OPEN_FILE;
-               return 0;
-       }
-       file_size = ftell(file);
-       fclose(file);
-       return file_size;
-}
-
 void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, char **anterior, char **siguiente, EMUFS_BLOCK_SIZE *size1, EMUFS_BLOCK_SIZE *size2, EMUFS_BLOCK_SIZE *size3)
 {
        int err = 0;
@@ -720,4 +723,3 @@ void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, c
        (*siguiente) = emufs_tipo1_leer_bloque(efs, id+1, &err);
        (*size1) = (*size2) = (*size3) = efs->tam_bloque;
 }
-