int cant_bloques = 0, resto, i, copiado=0;
cant_bloques = (emu->tam_reg / (emu->tam_bloque-sizeof(EMUFS_REG_ID))) + 1;
+ if ( emu->tam_reg+sizeof(EMUFS_REG_ID) == emu->tam_bloque )
+ cant_bloques = 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*/
strcat(name_f,".dat");
cant_bloques = (emu->tam_reg / (emu->tam_bloque-sizeof(EMUFS_REG_ID))) + 1;
+ if ( emu->tam_reg+sizeof(EMUFS_REG_ID) == emu->tam_bloque )
+ cant_bloques = 1;
+
resto = emu->tam_bloque - sizeof(EMUFS_REG_ID);
- lugar = emu->tam_reg + sizeof(EMUFS_REG_ID);
- if ( emu->tam_bloque < emu->tam_reg - sizeof(EMUFS_REG_ID) )
- lugar = emu->tam_bloque;
- /* me devuelve el ID del bloque donde quepa un registro y el espacio libre en "fs"*/
- num_bloque = emufs_fsc_buscar_lugar(emu, lugar, &fs);
+
+
+
+ if ( cant_bloques == 1 )
+ /* 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);
+ else
+ /* me devuelve el ID del bloque donde quepan n registros y el espacio libre en "fs"*/
+ num_bloque = emufs_fsc_buscar_n_lugares(emu, cant_bloques, emu->tam_bloque, &fs, err);
+
/*si no hay bloques con suficiente espacio creo un bloque nuevo */
- if (num_bloque == -1) {
+ if (num_bloque == EMUFS_NOT_FOUND) {
if ( (file = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/
/*tengo que buscar un ID valido para el nuevo registro*/
ID_aux = emufs_idx_get_new_id(emu, err);
return -1;
}
}
-
+
/* grabo el nuevo registro en el archivo de espacios libres */
- 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 ( emu->tam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg )
+ new_fs = emu->tam_bloque - sizeof(EMUFS_REG_ID) - resto ;
+ else new_fs = emu->tam_bloque - sizeof(EMUFS_REG_ID) - emu->tam_reg ;
if ( emufs_fsc_agregar(emu, num_bloque+i, new_fs) ) {
fclose(file);
free(bloque);
/*tengo que buscar un ID valido para el nuevo registro*/
ID_aux = emufs_idx_get_new_id(emu, err);
for (i=0; i<cant_bloques; i++){
+ resto = emu->tam_bloque-sizeof(EMUFS_REG_ID);
/*cargo el bloque en "bloque"*/
if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque+i, err))) {
/* TODO Manejo de errores */
}
/*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 ) {
+ if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg ){
+ /*Si el registro ocupa mas de un bloque (original) resto = emu->tam_bloque-sizeof(EMUFS_REG_ID)*/
+ resto += sizeof(EMUFS_REG_ID);
+ /*resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID)) + sizeof(EMUFS_REG_ID);*/
+ if ( cant_bloques-1 == i )
+ resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID))+sizeof(EMUFS_REG_ID);
+ /*printf("fs-resto = %d\n", fs-resto);*/
+ if ( emufs_fsc_agregar(emu, num_bloque+i, fs-resto) !=0 ){
fclose(file);
if (bloque) free(bloque);
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))+sizeof(EMUFS_REG_ID);
- if ( emufs_fsc_agregar(emu, num_bloque+i, fs-resto) !=0 ){
+ /* si ocupa menos de un bloque*/
+ resto = emu->tam_reg;
+ if ( emufs_fsc_agregar(emu, num_bloque, fs - resto - sizeof(EMUFS_REG_ID) ) != 0 ) {
fclose(file);
if (bloque) free(bloque);
return -1;
/*cantidad de bloques que ocupa un registro*/
cant_bloques = emu->tam_reg/(emu->tam_bloque-sizeof(EMUFS_REG_ID))+1;
+ if ( emu->tam_reg+sizeof(EMUFS_REG_ID) == emu->tam_bloque )
+ cant_bloques = 1;
num_bloque = emufs_idx_buscar_registro(emu, ID);
if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque, &err))) {
}
/*grabo el bloque en el archivo*/
- if ( emu->tam_bloque < emu->tam_reg )
+ if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg )
memset(bloque, 0, emu->tam_bloque);
if ( emufs_tipo3_grabar_bloque(emu, bloque, num_bloque) == -1 ){
free(bloque);
ID_aux = emufs_tipo3_grabar_registro(emu, reg, emu->tam_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)
PERR("NO TRUNQUE NADA");
/*hay que truncar el fsc!!!*/
- if(emu->tam_bloque<emu->tam_reg-sizeof(EMUFS_REG_ID)) block_id = block_id/2;
+ if(emu->tam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg) block_id = block_id/2;
if (emufs_fsc_truncate(emu, block_id)!= 0)
PERR("NO TURNQUE EL FSC");
}