]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
emufs.h comente los campos de stats en doxy, fsc.h/c agregue la funcion para obtener...
authorAlan Kennedy <kennedya@3dgames.com.ar>
Thu, 15 Apr 2004 05:37:43 +0000 (05:37 +0000)
committerAlan Kennedy <kennedya@3dgames.com.ar>
Thu, 15 Apr 2004 05:37:43 +0000 (05:37 +0000)
emufs/emufs.h
emufs/fsc.c
emufs/fsc.h
emufs/tipo2.c
emufs/tipo2.h
emufs/tipo2_main.c

index 6ba63b38aa97caaa3de41fa339aa6f600d1c5eac..9d8b17c56c2b4f73a7af7c184b719e5b735c8072 100644 (file)
@@ -42,6 +42,7 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <limits.h>
 
 #ifdef DEBUG
        /** Imprime un mensaje de debug por pantalla. */
@@ -83,14 +84,14 @@ typedef unsigned long EMUFS_OFFSET;
 
 /** Estadisticas de archivo */
 typedef struct _emufs_est_t {
-       unsigned long tam_archivo;
-       unsigned long tam_archivo_bytes;
-       unsigned long info_control;
-       EMUFS_FREE media_fs;
-       EMUFS_FREE total_fs;
-       EMUFS_FREE max_fs;
-       EMUFS_FREE min_fs;
-       int cant_bloques;
+       unsigned long tam_archivo; /**< Cantidad de Registros en el archivo */
+       unsigned long tam_archivo_bytes;/**< Size del archivo en bytes */
+       unsigned long info_control;/**< Cantidad de bytes en info de control */
+       unsigned long media_fs;/**< Media del espacio libre en el archivo de datos */
+       unsigned long total_fs;/**< Cantidad total de espacio libre en el archivo de datos */
+       unsigned long max_fs;/**< Cantidad de maxima libre (gap o fs en bloque) en el archivo de datos */
+       unsigned long min_fs;/**< Cantidad de minima libre (gap o fs en bloque) en el archivo de datos */
+       unsigned long cant_bloques; /**< Cantidad de bloques en el archivo de datos */
 } EMUFS_Estadisticas;
 
 /** Tipo Abstracto para menajo de archivos.
index 17a7244215fc1b792b9e3dc7e328e5d2631f8633..a3aad0e6cf0058b31343e3040dabc74518ff0d06 100644 (file)
@@ -342,8 +342,8 @@ EMUFS_FREE emufs_fsc_get_total_fs(EMUFS *emu)
        fclose(f_fsc);
        return total;
 }
-/*
-EMUFS_FREE emufs_fsc_get_max_min_fs(EMUFS *emu, int *min, int *max)
+
+int emufs_fsc_get_max_min_fs(EMUFS *emu, EMUFS_FREE *min, EMUFS_FREE *max)
 {
        FILE *f_fsc;
        EMUFS_FSC reg;
@@ -352,7 +352,7 @@ EMUFS_FREE emufs_fsc_get_max_min_fs(EMUFS *emu, int *min, int *max)
        strcpy(name_f_fsc,emu->nombre);
        strcat(name_f_fsc, EMUFS_FSC_EXT);
 
-       *min = emu->tam_bloque;
+       *min = ULONG_MAX;
        *max = 0;
        if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
        
@@ -367,4 +367,26 @@ EMUFS_FREE emufs_fsc_get_max_min_fs(EMUFS *emu, int *min, int *max)
        fclose(f_fsc);
        return 0;
 }
-*/
+
+EMUFS_FREE emufs_fsc_get_media_fs(EMUFS *emu)
+{
+       FILE *f_fsc;
+       EMUFS_FSC reg;
+       char name_f_fsc[255];
+       EMUFS_FREE total_fs = 0;
+       EMUFS_REG_ID gap_count = 0;
+       
+       strcpy(name_f_fsc,emu->nombre);
+       strcat(name_f_fsc, EMUFS_FSC_EXT);
+
+       if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
+       
+       while ( !feof(f_fsc) ){
+               fread(&reg, sizeof(EMUFS_FSC), 1, f_fsc);
+               total_fs += reg.freespace;
+               ++gap_count;
+       }
+
+       fclose(f_fsc);
+       return total_fs/gap_count;
+}
index e331b1808f59bff87eaeab7ed21646528995bd33..27ee1cc7fce201a508a59aaf467a5a4e91c58c5e 100644 (file)
@@ -45,7 +45,7 @@
 typedef struct emufs_fsc_t {
        unsigned long int marker;
        unsigned long int freespace;
-}EMUFS_FSC;
+} EMUFS_FSC;
 
 int emufs_fsc_crear(EMUFS*);
 int emufs_fsc_agregar(EMUFS *, EMUFS_BLOCK_ID, EMUFS_FREE);
@@ -55,8 +55,8 @@ int emufs_fsc_actualizar_gap(EMUFS *, EMUFS_OFFSET, EMUFS_FREE);
 int emufs_fsc_actualizar(EMUFS *, EMUFS_BLOCK_ID, EMUFS_FREE);
 EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *, EMUFS_FREE, EMUFS_FREE *);
 EMUFS_FREE emufs_fsc_get_fs(EMUFS *, EMUFS_BLOCK_ID);
-/*Devuelve el total de espacio libre que queda en el .dat*/
 EMUFS_FREE emufs_fsc_get_total_fs(EMUFS *);
-/*EMUFS_FREE emufs_fsc_get_max_min_fs(EMUFS *, int *, int *);*/
+EMUFS_FREE emufs_fsc_get_media_fs(EMUFS *);
+int emufs_fsc_get_max_min_fs(EMUFS *, EMUFS_FREE *, EMUFS_FREE *);
 
 #endif /* _EMUFS_FSC_H */
index 7047e455f696d3d2c7b959c1c264f71ae5a58e02..e640cf69d89a1f88edffab104c74782593b8691b 100644 (file)
 int emufs_tipo2_inicializar(EMUFS* efs)
 {
        efs->grabar_registro = emufs_tipo2_grabar_registro;           
-  efs->borrar_registro = emufs_tipo2_borrar_registro;
+    efs->borrar_registro = emufs_tipo2_borrar_registro;
        efs->leer_registro = emufs_tipo2_leer_registro;
        efs->modificar_registro = emufs_tipo2_modificar_registro;
+       efs->leer_estadisticas = emufs_tipo2_leer_estadisticas;
        
        return 0;
 }
@@ -230,8 +231,45 @@ int emufs_tipo2_dummyfill(EMUFS *efs, EMUFS_OFFSET reg_pos, EMUFS_REG_SIZE amoun
        return (0);
 }
 
+/* Realiza la actualizacin de un registro ya existente */
 EMUFS_REG_ID emufs_tipo2_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *data, EMUFS_REG_SIZE size, int *error)
 {
        emufs_tipo2_borrar_registro(emu, id);
        return emufs_tipo2_grabar_registro(emu, data, size, error);
 }
+
+/* Recompila y devuelve ciertas estadisticas del archivo indicado */
+EMUFS_Estadisticas emufs_tipo2_leer_estadisticas(EMUFS *emu)
+{
+    EMUFS_Estadisticas stats; 
+       char name_f[255];
+       FILE *file;
+
+       strcpy(name_f,emu->nombre);
+       strcat(name_f,".dat");
+       
+       /* Inicializo las stats por si hay error somewhere */
+       stats.tam_archivo = 0;
+       stats.tam_archivo_bytes = 0;
+       stats.info_control = 0;
+       stats.media_fs = 0;
+       stats.total_fs = 0;
+       stats.max_fs = 0;
+       stats.min_fs = 0;
+       stats.cant_bloques = 0;
+       
+       /* Obtengo las stats de FSC */
+       stats.total_fs = emufs_fsc_get_total_fs(emu);
+       stats.media_fs = emufs_fsc_get_media_fs(emu);
+       emufs_fsc_get_max_min_fs(emu,&stats.min_fs,&stats.max_fs);
+       
+       /* Faltan stats pero como cambia el API Idx, espero... */
+       if ( (file = fopen(name_f,"ab")) == NULL){
+                       PERR("No se pudo abrir el archivo");
+                       return stats;   
+       }
+       stats.tam_archivo_bytes = ftell(file);
+       fclose(file);
+       
+       return(stats);  
+}
index f8885ec0b90b33b475035621c22f66f6826a8296..8e1857ac2b24e75a260009194fd3ea0b8649cdbb 100644 (file)
@@ -119,4 +119,11 @@ int emufs_tipo2_dummyfill(EMUFS *efs, EMUFS_OFFSET reg_pos, EMUFS_REG_SIZE amoun
 /** Método para modificar un registro */
 EMUFS_REG_ID emufs_tipo2_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *data, EMUFS_REG_SIZE size, int *error);
 
+/** Método para recolectar/obtener la estadisticas del archivo tipo 2
+ *
+ * \param efs Estructura que realiza el handling de archivos de cualquier tipo.
+ * \return \b EMUFS_Estadisticas Estructura que alberga las stats recolectadas.
+ */
+EMUFS_Estadisticas emufs_tipo2_leer_estadisticas(EMUFS *emu);
+
 #endif /* _EMUFS_TIPO2_H_ */
index 9778593f936f7edea92b65fe9c66c3b67a3a0c9d..77c22b0ad4b0b4b91464b6f7b91bd7e0e587cfb3 100644 (file)
@@ -49,7 +49,7 @@ int main(int argc, char *argv[])
        char h[63];
        char i[43];
        int err = 0;
-       EMUFS_FREE totalfsc = 0;
+       EMUFS_Estadisticas stats;
 
        strcpy(a, "1234567890");
        strcpy(b, "REGISTRO NUMERO 2. ESTE REGISTRO ES MUCHO MAS LARGO QUE EL UNO");
@@ -91,16 +91,20 @@ int main(int argc, char *argv[])
          
        n8 = efs->grabar_registro(efs, d, 8, &err);
        printf("tipo2_main.c >> Id recuperado: %lu\n",n8);
-       
-       totalfsc = emufs_fsc_get_total_fs(efs);
-       printf("tipo2_main.c >> Total de espacio libre en el .dat: %lu\n",totalfsc);
-       
+                       
+       /* Levanto un registro */
        registro = efs->leer_registro(efs,n2,&reg_size,&err);
        if (err == 0) {
                printf("tipo2_main.c >>Registro: %lu Size: %lu Content: %s\n\n",n2,reg_size,registro);
-               printf("Total de espacio libre en el .dat: %lu\n",totalfsc);
        }
        
+       /* Obtengo stats */
+       stats = efs->leer_estadisticas(efs);
+       printf("Size del Archivo de datos: %lu\n",stats.tam_archivo_bytes);
+       printf("Total de espacio libre en el .dat: %lu\n",stats.total_fs);
+       printf("Minimo espacio libre en bloque o gap: %lu\n",stats.min_fs);
+       printf("Maximo espacio libre en bloque o gap: %lu\n",stats.max_fs);     
+       
        emufs_destruir(efs);    
        
        return 0;