From: Nicolás Dimov Date: Sun, 4 Apr 2004 20:25:23 +0000 (+0000) Subject: Se actualizan los archivos indice, falta implementar boorar_registro X-Git-Tag: svn_import_r684~651 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/4190aae338cc8b2bca47e403549060312bf31186?ds=sidebyside Se actualizan los archivos indice, falta implementar boorar_registro --- diff --git a/tipo3/param_cte.c b/tipo3/param_cte.c index 311cf40..70a1051 100644 --- a/tipo3/param_cte.c +++ b/tipo3/param_cte.c @@ -106,22 +106,32 @@ int leer_bloque(EMUFS *emu, int ID, void* ptr) int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) { - int ID_aux, fs, num_bloque; + int ID_aux, fs, num_bloque, cant; FILE *file; + FILE *f_id; + FILE *f_block_reg; + FILE *f_block_free; + BLOCK_FREE_T reg; + BLOCK_REG_T reg_b; char name_f[255]; + char name_f_block_reg[255]; + char name_f_id[255]; + char name_f_free[255]; char* bloque; strcpy(name_f,emu->nombre); strcat(name_f,".dat"); - if ( (file = fopen(name_f,"r"))==NULL ) return -1; /*ERROR*/ - /*FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!! - *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!! - *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!! - *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!! - *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!! - *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!! - *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!! - */ + strcpy(name_f_block_reg,emu->nombre); + strcat(name_f_block_reg,".id3"); + + strcpy(name_f_id,emu->nombre); + strcat(name_f_id,".idc"); + + strcpy(name_f_free,emu->nombre); + strcat(name_f_free,".fsc"); + + + if ( (file = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/ /* me devuelve el ID del bloque donde quepa un registro y el espacio libre en "fs"*/ num_bloque = buscar_lugar(emu, tam, &fs); /*si no hay bloques con suficiente espacio creo un bloque nuevo */ @@ -143,7 +153,7 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) /*cargo el bloque en "bloque"*/ bloque = (char*)malloc(emu->tam_bloque); if ( leer_bloque(emu,num_bloque,bloque)== -1) return -1; - /*El error puede haberse producido porque la funcion buscar_lugar devolvio -1, el cual es un bloque invalido*/ + /*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 = get_id(emu); @@ -154,6 +164,36 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) /*guardo el bloque en el archivo*/ if ( grabar_bloque(emu, bloque, num_bloque) != 0) return -1; /* se produjo un error */ } + + /*actualizo el archivo de id`s*/ + if ( (f_id = fopen(name_f_id,"a+"))==NULL ) return -1; /*ERROR*/ + fwrite(&ID_aux,sizeof(ID_aux),1,f_id); + fclose(f_id); + + /*actualizo el archivo de espacios libres*/ + /*tengo que buscar la cantidad de bloques que existen*/ + /*me paro al principio salteando el encabezado del archivo*/ + fseek(file,sizeof(int)+sizeof(char),SEEK_CUR); + while ( !feof(file) ){ + fread(bloque,emu->tam_bloque,1,file); + cant++; /*ya grabe el nuevo bloque !!!*/ + } + fclose(file); + /*cargo el registro*/ + reg.block = cant; /*no incremento cant, porque grabe el nuevo bloque antes y no lo conte!!*/ + reg.free_space = fs - tam; + /*lo guardo en el archivo al final "a+"*/ + if ( (f_block_free = fopen(name_f_free,"a+"))==NULL ) return -1; /*ERROR*/ + fwrite(®,sizeof(reg),1,f_block_free); + fclose(f_block_free); + + /*actualizo el archivo de bloques y registros*/ + if ( (f_block_reg = fopen(name_f_block_reg,"a+"))==NULL ) return -1; /*ERROR*/ + reg_b.block = reg.block; + reg_b.id_reg = ID_aux; + fwrite(®_b,sizeof(reg_b),1,f_block_reg); + fclose(f_block_reg); + free(bloque); return ID_aux; } @@ -192,7 +232,10 @@ int buscar_lugar(EMUFS *emu, unsigned long tam, int *fs) fread(®,sizeof(reg),1,f_block_free); if ( reg.free_space >= tam ) break; - else reg.block = -1; + else { + reg.block = -1; + *fs = emu->tam_bloque; + } } fclose(f_block_free);