X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/5a2e60f0e504ec59f3e8b9acbaaf20fc0b9907a3..35c84de4b6d96cf3505ad2c075ff3998be04441b:/emufs/tipo1.c diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 73ea3e2..55c9841 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -99,13 +99,14 @@ int emufs_tipo1_inicializar(EMUFS* efs) return EMUFS_OK; } -void* emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, +void* emufs_tipo1_leer_registro(EMUFS* efs, CLAVE clave, EMUFS_REG_SIZE* reg_size, int *err) { char* block; /* bloque leido (en donde está el registro a leer) */ char* registro; /* registro a leer */ EMUFS_BLOCK_ID block_id; /* id del bloque en donde esta el registro a leer */ EMUFS_BLOCK_SIZE offset; /* offset del bloque leído */ + EMUFS_REG_ID reg_id; EMUFS_TIPO1_REG_HEADER curr_reg_header; /* cabecera del registro a leer */ block_id = emufs_idx_buscar_registro(efs, reg_id); @@ -240,10 +241,12 @@ void* emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, int* err) if (block == NULL) { PERR("No hay memoria"); *err = EMUFS_ERROR_OUT_OF_MEMORY; + fclose(file); return NULL; } if (fread(block, efs->tam_bloque, 1, file) != 1) { free(block); + fclose(file); PERR("Error al leer bloque"); *err = EMUFS_ERROR_FILE_READ; return NULL; @@ -313,7 +316,9 @@ EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* efs, void* reg, emufs_tipo1_escribir_reg_chunk_en_memoria(block + efs->tam_bloque - fs, header, chunk_ptr, chunk_size); /* rellena el espacio libre con ceros para la GUI */ - if (fs) memset(block + efs->tam_bloque - fs, 0, fs); + memset(block + efs->tam_bloque - fs + chunk_size + + sizeof(EMUFS_TIPO1_REG_HEADER), 0, + fs - chunk_size - sizeof(EMUFS_TIPO1_REG_HEADER)); /* graba el bloque en el archivo */ new_block_id = emufs_tipo1_grabar_bloque_fsc(efs, block, curr_block_id, fs - sizeof(EMUFS_TIPO1_REG_HEADER) - chunk_size, err); @@ -377,12 +382,14 @@ int emufs_tipo1_borrar_registro(EMUFS* efs, EMUFS_REG_ID reg_id) /* tamaño máximo ultilizable para datos en un bloque */ EMUFS_BLOCK_SIZE block_space = efs->tam_bloque - sizeof(EMUFS_TIPO1_REG_HEADER); - EMUFS_FREE fs; /* cantidad de espacio libre en el bloque */ + /* cantidad de espacio libre original del ultimo bloque */ + EMUFS_FREE orig_fs; while (1) { + EMUFS_FREE fs; /* cantidad de espacio libre en el bloque */ + orig_fs = emufs_fsc_get_fs(efs, curr_block_id); /* actualizo archivo de espacio libre por bloque */ - fs = emufs_fsc_get_fs(efs, curr_block_id) - + MIN(curr_reg_header.size, block_space) + fs = orig_fs + MIN(curr_reg_header.size, block_space) + sizeof(EMUFS_TIPO1_REG_HEADER); if ((err = emufs_fsc_actualizar(efs, curr_block_id, fs))) { PERR("no se pudo actualizar .fsc"); @@ -426,11 +433,14 @@ int emufs_tipo1_borrar_registro(EMUFS* efs, EMUFS_REG_ID reg_id) /* si es necesario desplazar */ if (offset < offset_reg_end) { /* muevo la porción de bloque a izquierda */ + /* XXX Este memcpy() puede copiar regiones de memoria que + * se superponen, si copia de principio a fin y byte a byte + * no debería haber problema */ memcpy(block + offset, block + offset_reg_end, efs->tam_bloque - offset_reg_end); /* rellena el espacio libre con ceros para la GUI */ - if (fs) memset(block + offset_reg_end, 0, - efs->tam_bloque - offset_reg_end); + memset(block + efs->tam_bloque - offset_reg_end - orig_fs + offset, + 0, offset_reg_end + orig_fs - offset); } } /* guardo el bloque en disco (actualizando espacio libre) */ @@ -508,6 +518,7 @@ EMUFS_Estadisticas emufs_tipo1_leer_estadisticas(EMUFS* efs) void emufs_tipo1_compactar(EMUFS* efs) { +#ifdef ARREGLAR EMUFS_BLOCK_SIZE block_space /* tamaño para datos de un bloque */ = efs->tam_bloque - sizeof(EMUFS_TIPO1_REG_HEADER); EMUFS_REG_ID total_ids; /* cantidad total de registros en el array */ @@ -571,6 +582,7 @@ void emufs_tipo1_compactar(EMUFS* efs) emufs_fsc_truncate(efs, block_id); } } +#endif } EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block,