X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/e12f7e6ef14af28c89e08f570e24c61493558731..63f9cc2172df9d346457685096b4de200c084e9e:/emufs/emufs.c diff --git a/emufs/emufs.c b/emufs/emufs.c index 35c9cb3..ad14955 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -39,6 +39,7 @@ */ #include "emufs.h" +#include "common.h" #include "tipo1.h" #include "tipo2.h" #include "tipo3.h" @@ -100,6 +101,7 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b efs->tam_bloque = tam_bloque; efs->tam_reg = tam_reg; efs->nombre = str_dup(filename); + efs->indices = NULL; /* Abre archivo de datos. */ strcpy(name, filename); @@ -118,6 +120,7 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b /* Crea archivo de índice. */ if (emufs_idx_crear(efs)) { /* TODO ERROR */ + fclose(fp); free(efs->nombre); free(efs); return NULL; @@ -126,6 +129,7 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b /* Crea archivo de control de espacio libre. */ if (emufs_fsc_crear(efs)) { /* TODO ERROR */ + fclose(fp); free(efs->nombre); free(efs); return NULL; @@ -134,6 +138,7 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b /* Crea archivo de identificadores borrados (recuperables). */ if (emufs_did_crear(efs)) { /* TODO ERROR */ + fclose(fp); free(efs->nombre); free(efs); return NULL; @@ -147,6 +152,7 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b if ((err = emufs_tipo1_inicializar(efs))) { /* TODO ERROR */ PERR("No se pudo inicializar el EMUFS de tipo1"); + fclose(fp); free(efs->nombre); free(efs); return NULL; @@ -307,3 +313,96 @@ int ver_archivo_FS(EMUFS *emu) return 0; } + +int debug_ver_estadisticas(EMUFS* efs) +{ + EMUFS_Estadisticas s = efs->leer_estadisticas(efs); + + printf("ESTADISTICAS:\n"); + printf("=============\n"); + printf("Tamaño del archivo: %lu bytes\n", s.tam_archivo); + printf("Tamaño de datos (incluye espacio libre): %lu bytes (%.2f %%)\n", + s.tam_archivo - s.tam_info_control_dat, + (s.tam_archivo - s.tam_info_control_dat) * 100.0 + / (float) s.tam_archivo); + printf("Tamaño de info de control total: %lu bytes (%.2f %%)\n", + s.tam_info_control_dat + s.tam_archivos_aux, + (s.tam_info_control_dat + s.tam_archivos_aux) * 100.0 + / (float) s.tam_archivo); + printf("Tamaño de los archivos auxiliares: %lu bytes\n", + s.tam_archivos_aux); + printf("Tamaño de la información de control en el .dat: %lu bytes\n", + s.tam_info_control_dat); + printf("Total de espacio libre: %lu bytes\n", s.total_fs); + printf("Máximo espacio libre en bloque: %lu bytes\n", s.max_fs); + printf("Mínimo espacio libre en bloque: %lu bytes\n", s.min_fs); + printf("Media del espacio libre por bloque: %lu bytes\n", s.media_fs); + printf("Cantidad de registros: %lu\n", s.cant_registros); + printf("Cantidad de bloques: %lu\n", s.cant_bloques); + return 0; +} + +int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque) +{ + INDICE *tmp; + int error=0; + + /* Verifico que no existe un indice con el mismo nombre */ + /* y que no exista un indice primario */ + tmp = emu->indices; + while (tmp) { + if (strcmp(tmp->nombre, nombre)==0) { + error = 1; + break; + } + if ((funcion == IND_PRIMARIO) && (tmp->funcion == funcion)) { + error = 2; + break; + } + } + + if (tmp != NULL) { + switch (error) { + case 1: + PERR("Ya existe un indice con el mismo nombre!"); + break; + case 2: + PERR("EMUFS ya tiene indice primario!!"); + break; + default: + PERR("Error no esperado!!"); + } + return 0; + } + + /* Creo el nuevo indice */ + tmp = emufs_indice_crear(emu, nombre, funcion, tipo, tipo_dato, offset, tam_bloque); + + if (tmp == NULL) return 0; + + if (emu->indices==NULL) + emu->indices = tmp; + else { + tmp->sig = emu->indices; + emu->indices = tmp; + } + return 1; +} + +INDICE_DATO *emufs_buscar_registros(EMUFS *emu, char *indice, CLAVE clave, int *cant) +{ + INDICE *tmp; + tmp = emu->indices; + while (tmp) { + if (strcmp(tmp->nombre, indice) == 0) break; + } + + if (tmp == NULL) { + PERR("NO EXISTE EL INDICE"); + cant = 0; + return NULL; + } + + return tmp->buscar_entradas(tmp, clave, cant); +} +