X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/ecc9d27042d38e53309151e07c1c23cc6331efea..681f9d807b6f486e251e49401abe40c09b7855c1:/emufs/tipo3.c diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 596e2a2..30f63f4 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -48,7 +48,7 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_BLOCK_SIZE iterador = 0; int cant_bloques = 0, resto, i, copiado=0; - cant_bloques = emu->tam_reg / emu->tam_bloque + 1; + cant_bloques = (emu->tam_reg / (emu->tam_bloque-sizeof(EMUFS_REG_ID))) + 1; /*si existe, lo busco en el archivo de bloques*/ block = emufs_idx_buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/ @@ -80,7 +80,7 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID)); iterador += sizeof(EMUFS_REG_ID); if ( ID_aux == ID ){ - if ( cant_bloques == 0 ) + if ( cant_bloques == 1 ) memcpy(registro,bloque+iterador,emu->tam_reg); else { if ( cant_bloques-1 == i ) @@ -90,7 +90,6 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, break; } *reg_size = emu->tam_reg; - fprintf(stderr, "ACA VALE %d\n", emu->tam_reg); } iterador += emu->tam_reg; } @@ -145,12 +144,12 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t FILE *file; char name_f[255]; char* bloque; - int cant_bloques, resto, i; + int cant_bloques, resto, i=0; strcpy(name_f,emu->nombre); strcat(name_f,".dat"); - cant_bloques = emu->tam_reg / emu->tam_bloque + 1; + cant_bloques = (emu->tam_reg / (emu->tam_bloque-sizeof(EMUFS_REG_ID))) + 1; resto = emu->tam_bloque - sizeof(EMUFS_REG_ID); /* me devuelve el ID del bloque donde quepa un registro y el espacio libre en "fs"*/ num_bloque = emufs_fsc_buscar_lugar(emu, emu->tam_reg+sizeof(EMUFS_REG_ID), &fs); @@ -188,54 +187,80 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t if (i == 0) { /* Tengo que agregar el primer bloque en IDX */ - if ( emufs_idx_existe_id(emu,ID_aux) != 0){ /* deberia ser == 0 pero no funca*/ - emufs_idx_actualizar(emu, ID_aux, num_bloque); - } else { - if ( emufs_idx_agregar(emu, ID_aux, num_bloque) != 0 ){ - free(bloque); - return -1; - } + if ( emufs_idx_agregar(emu, ID_aux, num_bloque) != 0 ){ + free(bloque); + return -1; } } + /* 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, emu->tam_bloque - resto - sizeof(EMUFS_REG_ID)) != 0 ) { + if ( emufs_fsc_agregar(emu, num_bloque+i, emu->tam_bloque - resto - sizeof(EMUFS_REG_ID)) != 0 ) { fclose(file); free(bloque); return -1; } + } fclose(file); } else { - /*cargo el bloque en "bloque"*/ - if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque, err))) { - /* TODO Manejo de errores */ - PERR("no se pudo leer el bloque"); - return -1; - } - /*El error puede haberse producido porque la funcion leer_bloque devolvio -1, el cual es un bloque invalido*/ - /*insertar el registro en el bloque*/ /*tengo que buscar un ID valido para el nuevo registro*/ ID_aux = emufs_idx_get_new_id(emu, err); - /*grabo el id en el bloque*/ - memcpy(bloque+emu->tam_bloque-fs,&ID_aux,sizeof(EMUFS_REG_ID)); - /*grabo el registro en el bloque*/ - memcpy(bloque+emu->tam_bloque-fs+sizeof(EMUFS_REG_ID),ptr,emu->tam_reg); - if ( emufs_tipo3_grabar_bloque(emu, bloque, num_bloque) != 0) { - PERR("error al grabar bloque"); - return -1; /* se produjo un error */ - } - /*actualizo el archivo de espacios libres*/ - if ( emufs_fsc_actualizar(emu, num_bloque, fs - emu->tam_reg - sizeof(EMUFS_REG_ID)) != 0 ){ - free(bloque); - return -1; - } - /*actualizo el archivo de bloques y registros*/ - if ( emufs_idx_agregar(emu, ID_aux, num_bloque) != 0 ){ - free(bloque); - return -1; + for (i=0; itam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg) + memcpy(bloque,&ID_aux,sizeof(EMUFS_REG_ID)); + else + memcpy(bloque+emu->tam_bloque-fs,&ID_aux,sizeof(EMUFS_REG_ID)); + /*grabo el registro en el bloque*/ + if ( cant_bloques == 1 ){ + memcpy(bloque+emu->tam_bloque-fs+sizeof(EMUFS_REG_ID),ptr,emu->tam_reg); + } else { + if ( cant_bloques-1 == i ) + resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID)); + memcpy(bloque+sizeof(EMUFS_REG_ID),((char*)ptr)+i*(emu->tam_bloque-sizeof(EMUFS_REG_ID)),resto); + } + + /*grabo el bloque en el archivo*/ + if ( emufs_tipo3_grabar_bloque(emu, bloque, num_bloque+i) != 0) { + PERR("error al grabar bloque"); + return -1; /* se produjo un error */ + } + + /*actualizo el archivo de espacios libres*/ + if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) > emu->tam_reg ){ + resto = emu->tam_reg; + if ( emufs_fsc_agregar(emu, num_bloque, fs - resto - sizeof(EMUFS_REG_ID) ) != 0 ) { + fclose(file); + if (bloque != NULL) free(bloque); + return -1; + } + } else { + if ( cant_bloques-1 == i ) + resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID)); + if ( emufs_fsc_agregar(emu, num_bloque+i, fs-resto) !=0 ){ + fclose(file); + if (bloque != NULL) free(bloque); + return -1; + } + } + if ( i == 0 ){ + if ( emufs_idx_agregar(emu, ID_aux, num_bloque) != 0 ){ + if (bloque != NULL) free(bloque); + return -1; + } + } } - } free(bloque); return ID_aux; @@ -269,7 +294,7 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID) EMUFS_REG_ID ID_aux; EMUFS_FREE fs; char *bloque; - int err = 0; + int err = 0, i; num_bloque = emufs_idx_buscar_registro(emu, ID); if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque, &err))) { @@ -309,10 +334,11 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID) /*actualizo archivo .fsc*/ if ( emu->tam_bloque < emu->tam_reg ) { - if ( emufs_fsc_actualizar(emu, num_bloque, emu->tam_bloque) != 0 ) return -1; + for (i=0; itam_reg/(emu->tam_bloque-sizeof(EMUFS_REG_ID))+1; i++) + if ( emufs_fsc_agregar(emu, num_bloque+i, emu->tam_bloque) != 0 ) return -1; } else { fs = emufs_fsc_get_fs(emu, num_bloque); - if ( emufs_fsc_actualizar(emu, num_bloque, fs + emu->tam_reg + sizeof(EMUFS_REG_ID)) != 0 ) return -1; + if ( emufs_fsc_agregar(emu, num_bloque, fs + emu->tam_reg + sizeof(EMUFS_REG_ID)) != 0 ) return -1; } /*actualizo archivo .did*/ if ( emufs_did_agregar(emu, ID) != 0 ) return -1;