X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/7a1f4e670b7f52961de1c6c0b868aa836cceae04..18ff567719ef1e5437bef12b937fe95686c336b5:/emufs/tipo3.c diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 5cb9c2b..02c6495 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -148,7 +148,7 @@ void* emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID ID, int* err) EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE tam, int* err) { EMUFS_REG_ID ID_aux; - EMUFS_FREE fs; + EMUFS_FREE fs, new_fs; EMUFS_BLOCK_ID num_bloque; EMUFS_BLOCK_SIZE cant; FILE *file; @@ -206,8 +206,10 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t } /* grabo el nuevo registro en el archivo de espacios libres */ - if ( emu->tam_bloque > emu->tam_reg ) resto = emu->tam_reg; - if ( emufs_fsc_agregar(emu, num_bloque+i, emu->tam_bloque - resto - sizeof(EMUFS_REG_ID)) != 0 ) { + if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) >= emu->tam_reg ) + new_fs = emu->tam_bloque - emu->tam_reg - sizeof(EMUFS_REG_ID); + else new_fs = emu->tam_bloque - resto - sizeof(EMUFS_REG_ID); + if ( emufs_fsc_agregar(emu, num_bloque+i, new_fs) ) { fclose(file); free(bloque); return -1; @@ -258,8 +260,9 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t return -1; } } else { + resto += sizeof(EMUFS_REG_ID); if ( cant_bloques-1 == i ) - resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID)); + resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID))+sizeof(EMUFS_REG_ID); if ( emufs_fsc_agregar(emu, num_bloque+i, fs-resto) !=0 ){ fclose(file); if (bloque) free(bloque); @@ -304,10 +307,13 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID) EMUFS_BLOCK_SIZE ptr_elim; EMUFS_BLOCK_SIZE ptr_mov; EMUFS_REG_ID ID_aux; - EMUFS_FREE fs; + EMUFS_FREE fs, new_fs; char *bloque; - int err = 0, i; + int err = 0, i, cant_bloques; + /*cantidad de bloques que ocupa un registro*/ + cant_bloques = emu->tam_reg/(emu->tam_bloque-sizeof(EMUFS_REG_ID))+1; + num_bloque = emufs_idx_buscar_registro(emu, ID); if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque, &err))) { /* TODO Manejo de errores */ @@ -343,10 +349,10 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID) PERR("No se pudo grabar el bloque"); return -1; } - + /*actualizo archivo .fsc*/ - if ( emu->tam_bloque < emu->tam_reg ) { - for (i=0; itam_reg/(emu->tam_bloque-sizeof(EMUFS_REG_ID))+1; i++) + if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg ) { + for (i=0; itam_bloque)) { PERR("no se pudo agregar fsc"); free(bloque); @@ -415,7 +421,7 @@ EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu) emufs_fsc_get_max_min_fs(emu,&stats.min_fs,&stats.max_fs); /* obtengo informacion de control guardada por los archivos auxiliares */ - stats.tam_archivo_aux = emufs_idx_get_file_size(emu,&err1) + emufs_fsc_get_file_size(emu,&err2) + stats.tam_archivos_aux = emufs_idx_get_file_size(emu,&err1) + emufs_fsc_get_file_size(emu,&err2) + emufs_did_get_file_size(emu,&err3); if (err1 || err2 || err3) { PERR("Hubo problemas en lectura de filesize archivos auxiliares"); @@ -433,81 +439,38 @@ EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *d void* emufs_tipo3_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE *size, int *pos) { - char* bloque, *tmp, *cur; + char* bloque; EMUFS_BLOCK_ID block; EMUFS_REG_ID ID_aux; EMUFS_BLOCK_SIZE iterador = 0; - int err, cant_bloques, i; + int err; bloque = NULL; - if (emu->tam_reg < emu->tam_bloque) { - /* Aca estoy en el caso de que 1 registro entra en 1 solo bloque */ - block = emufs_idx_buscar_registro(emu,ID); - if ( block == EMUFS_NOT_FOUND ) { - return NULL; - } - if ((bloque = emufs_tipo3_leer_bloque(emu, block, &err)) == NULL) { - return NULL; - } - - ID_aux = -1; - iterador = 0; - - /* Busco el offset desde el comienzo desde donde arranca el registro - * buscado, para luego resaltarlo en al GUI - */ - while ( iterador < emu->tam_bloque ) { - memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID)); - if ( ID_aux == ID ){ - *pos = iterador; - *size = emu->tam_bloque; - break; - } - iterador += sizeof(EMUFS_REG_ID); - iterador += emu->tam_reg; - } - } else { - /* Junto todos los bloques que ocupa el registro y agrego un separador de bloques */ - /* Busco el primer bloque */ - block = emufs_idx_buscar_registro(emu,ID); - if ( block == EMUFS_NOT_FOUND ){ - return NULL; - } - cant_bloques = emu->tam_reg / (emu->tam_bloque - sizeof(EMUFS_REG_ID))+1; - *size = emu->tam_bloque*cant_bloques /*+ cant_bloques*2*/ - sizeof(EMUFS_REG_ID)*(cant_bloques-1); - bloque = (char *)malloc(*size); - cur = bloque; - *pos = 0; - - /* El bloque 0 va completo */ - err = 0; - if ((tmp = emufs_tipo3_leer_bloque(emu, block, &err)) == NULL) { - /* Oops! ... un bloque no existe, todo mal! */ - free(bloque); - return NULL; - } - memcpy(cur, tmp, emu->tam_bloque); - cur += emu->tam_bloque; -/* memcpy(cur, "<>", 2); - cur += 2;*/ - free(tmp); + /* Aca estoy en el caso de que 1 registro entra en 1 solo bloque */ + block = emufs_idx_buscar_registro(emu,ID); + if ( block == EMUFS_NOT_FOUND ) { + return NULL; + } + if ((bloque = emufs_tipo3_leer_bloque(emu, block, &err)) == NULL) { + return NULL; + } - /* En resto de los bloques no pongo el ID porque ya esta en el primero */ - for(i=1; itam_bloque-sizeof(EMUFS_REG_ID)); - cur += emu->tam_bloque - sizeof(EMUFS_REG_ID); -/* memcpy(cur, "<>", 2); - cur += 2;*/ - free(tmp); + ID_aux = -1; + iterador = 0; + + /* Busco el offset desde el comienzo desde donde arranca el registro + * buscado, para luego resaltarlo en al GUI + */ + while ( iterador < emu->tam_bloque ) { + memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID)); + if ( ID_aux == ID ){ + *pos = iterador; + *size = emu->tam_bloque; + break; } - (*cur) = '\0'; + iterador += sizeof(EMUFS_REG_ID); + iterador += emu->tam_reg; } return bloque; } @@ -527,21 +490,19 @@ void emufs_tipo3_compactar(EMUFS *emu) tmp = emufs_idx_get(emu, &max_id); if (tmp) free(tmp); - for( i=0; i<=max_id; i++){ + for( i=0; itam_reg, &err); free(reg); } - /*tengo que truncar el archivo*/ - /*bloques_vacios = emufs_fsc_get_cant_bloques_vacios(emu)-1; - */ + /*trunco el archivo sacando los bloques vacios*/ block_id = emufs_fsc_buscar_lugar(emu, emu->tam_bloque, &fs); size = sizeof(EMUFS_Tipo)+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_BLOCK_SIZE)+block_id*emu->tam_bloque; if (truncate(name, size)!=0)