#include <stdlib.h>
#include <stdio.h>
+#include <limits.h>
#ifdef DEBUG
/** Imprime un mensaje de debug por pantalla. */
/** 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.
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;
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;
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(®, sizeof(EMUFS_FSC), 1, f_fsc);
+ total_fs += reg.freespace;
+ ++gap_count;
+ }
+
+ fclose(f_fsc);
+ return total_fs/gap_count;
+}
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);
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 */
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;
}
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);
+}
/** 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_ */
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");
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,®_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;