From 015bf5db523d05c490afd35f94cb8a4df2002a56 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Fri, 16 Apr 2004 22:42:24 +0000 Subject: [PATCH] - Se agrega leer_estadisticas(). - Se agrega chequeo en emufs_crear() para que no se pueda crear un archivo con bloque mas chico que 2 * sizeof(cabecera de registro). --- emufs/emufs.c | 14 +++++++----- emufs/emufs.h | 7 +++++- emufs/tipo1.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++-- emufs/tipo1.h | 3 +++ 4 files changed, 75 insertions(+), 8 deletions(-) diff --git a/emufs/emufs.c b/emufs/emufs.c index 9f2a29d..9f60c37 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -142,12 +142,16 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b switch (tipo) { case T1: - /* Asigna punteros a funciones. */ - /* TODO verificar que el tamaño de bloque sea como mínimo del - * tamaño de la cabecera de un registro + N */ - emufs_tipo1_inicializar(efs); + /* Inicializa archivo (punteros a funciones, chequeos, etc). */ + if (emufs_tipo1_inicializar(efs)) { + /* TODO ERROR */ + free(efs->nombre); + free(efs); + return NULL; + } - /* Guarda cabeceras propias. */ + /* Guarda cabeceras propias. + * FIXME esto me gustaria que vaya a inicializar() */ fwrite(&tam_bloque, sizeof(EMUFS_BLOCK_SIZE), 1, fp); break; diff --git a/emufs/emufs.h b/emufs/emufs.h index c2dab18..bbf240d 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -82,7 +82,12 @@ typedef unsigned long EMUFS_OFFSET; */ #define EMUFS_NOT_FOUND -1ul -/** Estadisticas de archivo */ +/** Estadisticas de archivo + * @todo Cambiar nombres de: + * - tam_archivo a cant_registros + * - tam_archivo_bytes a tam_archivo + * - info_control a tam_info_control + */ typedef struct _emufs_est_t { unsigned long tam_archivo; /**< Cantidad de Registros en el archivo */ unsigned long tam_archivo_bytes;/**< Size del archivo en bytes */ diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 5d8dfff..337f195 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -79,13 +79,21 @@ static EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque(EMUFS*, void*, EMUFS_BLOCK_ID, int emufs_tipo1_inicializar(EMUFS* efs) { + /* como mínimo el tamaño de bloque debe ser 2 veces el tamaño de la cabecera + * (una relación 1/2 entre datos e info de control ya es lo suficientemente + * mala */ + if (efs->tam_bloque < (sizeof(EMUFS_TIPO1_REG_HEADER) * 2)) { + PERR("bloque demasiado chico"); + return 1000; /* EMUFS_ERROR_BLOCK_SIZE_TOO_SMALL */ + } /* Asigna punteros a funciones. */ efs->leer_bloque = emufs_tipo1_leer_bloque; efs->grabar_registro = emufs_tipo1_grabar_registro; efs->borrar_registro = emufs_tipo1_borrar_registro; efs->leer_registro = emufs_tipo1_leer_registro; efs->leer_registro_raw = emufs_tipo1_leer_registro_raw; - return 0; + efs->leer_estadisticas = emufs_tipo1_leer_estadisticas; + return 0; /* EMUFS_OK */ } void* emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, @@ -455,7 +463,54 @@ int emufs_tipo1_borrar_registro(EMUFS* efs, EMUFS_REG_ID reg_id) return 0; /* EMUFS_OK */ } -/** Graba un bloque en el archivo. */ +EMUFS_Estadisticas emufs_tipo1_leer_estadisticas(EMUFS* efs) +{ + EMUFS_Estadisticas stats; + memset(&stats, 0, sizeof(EMUFS_Estadisticas)); + + /* obtengo tamaño de archivo en bytes */ + { + FILE* file; + char name_f[255]; + + strcpy(name_f,efs->nombre); + strcat(name_f,".dat"); + if ((file = fopen(name_f, "ab")) == NULL) { + /* TODO Manejo de errores */ + PERR("Error al abrir archivo"); + /* *err = 4; / * EMUFS_ERROR_CANT_OPEN_FILE */ + return stats; + } + stats.tam_archivo_bytes = ftell(file); + fclose(file); + } + + /* obtengo cantidad de bloques */ + stats.cant_bloques = /* tamaño del archivo sin la cabecera */ + (stats.tam_archivo_bytes - sizeof(EMUFS_Tipo) - sizeof(EMUFS_BLOCK_SIZE)) + / efs->tam_bloque; /* dividido el tamaño de un bloque */ + + /* obtengo la cantidad de registros en el archivo */ + { + EMUFS_REG_ID *tmp = emufs_idx_get(efs, &stats.tam_archivo); + if (tmp) free(tmp); /* libera memoria innecesaria */ + } + + /* obtengo total de información de control que guarda el archivo */ + stats.info_control = + /* cabecera del archivo */ + sizeof(EMUFS_Tipo) + sizeof(EMUFS_BLOCK_SIZE) + /* cabeceras de registros */ + + stats.tam_archivo * 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); + + return stats; +} + EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque(EMUFS *efs, void *block, EMUFS_BLOCK_ID block_id, int* err) { diff --git a/emufs/tipo1.h b/emufs/tipo1.h index b51990f..29bec7a 100644 --- a/emufs/tipo1.h +++ b/emufs/tipo1.h @@ -58,4 +58,7 @@ EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, EMUFS_REG_ID, void*, EMU /** Método para leer un registro con todo su bloque asociado. */ void* emufs_tipo1_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID id, EMUFS_REG_SIZE *size, int *pos); +/** Obtiene estádisticas del archivo */ +EMUFS_Estadisticas emufs_tipo1_leer_estadisticas(EMUFS*); + #endif /* _EMUFS_TIPO1_H_ */ -- 2.43.0