From: Nicolás Dimov Date: Thu, 15 Apr 2004 05:08:44 +0000 (+0000) Subject: Soporte para bloques pequeños en leer y guardar, falta borrar pero como estoy quemado... X-Git-Tag: svn_import_r684~482 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/6f3b2503934631cf86101ede3d356f5868cae46d Soporte para bloques pequeños en leer y guardar, falta borrar pero como estoy quemado lo dejo para mañana. Ademas mañana supongo que tendre que arreglar los cambios que se produzcan en idx y los demas, si es que hay. Por ahora no funciona con la gui el tema de los bloques chicos asi que no se molesten en probarlo, pero si en revisarlo. Adios --- diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 0e428e1..3d4a273 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -46,6 +46,9 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_BLOCK_ID block; EMUFS_REG_ID ID_aux; EMUFS_BLOCK_SIZE iterador = 0; + int cant_bloques = 0, resto, i, copiado=0; + + cant_bloques = emu->tam_reg / emu->tam_bloque + 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*/ @@ -53,35 +56,46 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, PERR("No se encontro el bloque"); return NULL; } - if ((bloque = emufs_tipo3_leer_bloque(emu, block, err)) == NULL) { - /* TODO Manejo de errores, queda en el codigo de error lo que devolvio - * emufs_tipo3_leer_bloque() */ - PERR("no se pudo leer el bloque"); - return NULL; /*No se pudo leer el bloque*/ + + registro = (char*) malloc(emu->tam_reg); + if (registro == NULL) { + /* TODO Manejo de errores */ + free(bloque); + PERR("No hay memoria"); + *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */ + return NULL; } - ID_aux = -1; - iterador = 0; - while ( iterador < emu->tam_bloque ) { - memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID)); - iterador += sizeof(EMUFS_REG_ID); - if ( ID_aux == ID ){ - registro = (char*) malloc(emu->tam_reg); - if (registro == NULL) { - /* TODO Manejo de errores */ - free(bloque); - PERR("No hay memoria"); - *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */ - return NULL; + resto = emu->tam_bloque - sizeof(EMUFS_REG_ID); + for (i=0; itam_bloque ) { + memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID)); + iterador += sizeof(EMUFS_REG_ID); + if ( ID_aux == ID ){ + if ( cant_bloques == 0 ) + memcpy(registro,bloque+iterador,emu->tam_reg); + else { + if ( cant_bloques-1 == i ) + resto = emu->tam_reg - copiado; + memcpy(registro+(emu->tam_bloque-sizeof(EMUFS_REG_ID))*i,bloque+iterador,resto); + copiado += resto; + break; + } + *reg_size = emu->tam_reg; } - memcpy(registro,bloque+iterador,emu->tam_reg); - *reg_size = emu->tam_reg; - break; + iterador += emu->tam_reg; } - iterador += emu->tam_reg; + free(bloque); } - free(bloque); return registro; } @@ -130,39 +144,55 @@ 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; strcpy(name_f,emu->nombre); strcat(name_f,".dat"); + cant_bloques = emu->tam_reg / emu->tam_bloque + 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); /*si no hay bloques con suficiente espacio creo un bloque nuevo */ if (num_bloque == -1) { if ( (file = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/ - /*crear un nuevo bloque en memoria */ - bloque = (char*)malloc(emu->tam_bloque); - memset(bloque, 0, emu->tam_bloque); - /* grabar el registro al principio del 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,&ID_aux,sizeof(EMUFS_REG_ID)); - /*grabo el registro en el bloque*/ - memcpy(bloque+sizeof(EMUFS_REG_ID),ptr,emu->tam_reg); - /* me paro al final del archivo */ - fseek(file, 0, SEEK_END); - /* grabo el bloque en el final del archivo */ - fwrite(bloque,emu->tam_bloque,1,file); - /*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, 0, SEEK_END); /* Me paro al final */ - cant = (ftell(file)-(sizeof(EMUFS_Tipo)+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_BLOCK_SIZE))) / emu->tam_bloque; - cant--; /* Resto uno porque el numero de bloque debe empezar en 0 */ + for (i=0; itam_bloque); + memset(bloque, 0, emu->tam_bloque); + /* grabar el registro al principio del bloque */ + /*grabo el id en el bloque*/ + memcpy(bloque,&ID_aux,sizeof(EMUFS_REG_ID)); + /*grabo el registro en el bloque*/ + if ( cant_bloques == 0 ){ + memcpy(bloque+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); + } + /* me paro al final del archivo */ + fseek(file, 0, SEEK_END); + /* grabo el bloque en el final del archivo */ + fwrite(bloque,emu->tam_bloque,1,file); + /*actualizo el archivo de espacios libres*/ + /*tengo que buscar la cantidad de bloques que existen*/ + fseek(file, 0, SEEK_END); /* Me paro al final */ + cant = (ftell(file)-(sizeof(EMUFS_Tipo)+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_BLOCK_SIZE))) / emu->tam_bloque; + cant--; /* Resto uno porque el numero de bloque debe empezar en 0 */ + num_bloque = cant; + /* grabo el nuevo registro en el archivo de espacios libres */ + if ( emufs_fsc_agregar(emu, num_bloque, emu->tam_bloque - resto - sizeof(EMUFS_REG_ID)) != 0 ) { + fclose(file); + free(bloque); + return -1; + } + } fclose(file); - num_bloque = cant; - /* grabo el nuevo registro en el archivo de espacios libres */ - if ( emufs_fsc_agregar(emu, num_bloque, emu->tam_bloque - emu->tam_reg - sizeof(EMUFS_REG_ID)) != 0 ) { + /*actualizo el archivo de bloques y registros*/ + if ( emufs_idx_agregar(emu, ID_aux, num_bloque) != 0 ){ free(bloque); return -1; } @@ -190,14 +220,13 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t 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; + } + } - - /*actualizo el archivo de bloques y registros*/ - if ( emufs_idx_agregar(emu, ID_aux, num_bloque) != 0 ){ - free(bloque); - return -1; - } - free(bloque); return ID_aux; } @@ -292,6 +321,7 @@ EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu) PERR("No se pudo abrir el archivo"); return stats; } + /* No hace falta el fseek ¿? */ fseek(f,0,SEEK_END); stats.tam_archivo_bytes = ftell(f); @@ -331,9 +361,16 @@ void* emufs_tipo3_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE PERR("no se pudo leer el bloque"); return NULL; /*No se pudo leer el bloque*/ } - + ID_aux = -1; iterador = 0; + + if ( emu->tam_bloque < emu->tam_reg ){ + *pos = sizeof(EMUFS_REG_ID); + *size = emu->tam_bloque; + return bloque; + } + /* Busco el offset desde el comienzo desde donde arranca el registro * buscado, para luego resaltarlo en al GUI */ @@ -350,4 +387,3 @@ void* emufs_tipo3_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE return bloque; } - diff --git a/emufs/tipo3_main.c b/emufs/tipo3_main.c index ce6dfa8..1e20faa 100644 --- a/emufs/tipo3_main.c +++ b/emufs/tipo3_main.c @@ -52,17 +52,18 @@ int main(int argc, char *argv[]) char i[100]; char* b_ptr; int err = 0, max, min; + EMUFS_Estadisticas s; if (argc != 2) { printf("Modo de uso : %s tam_bloque\n", argv[0]); return 1; } - +/* if (atoi(argv[1]) < 104) { printf("El tamaño de bloque debe ser mayor a 104\n"); return 1; } - +*/ strcpy(a, "1234567890"); strcpy(c, "REGISTRO NUMERO 2. ESTE REGISTRO ES MUCHO MAS LARGO QUE EL UNO"); strcpy(d, "ABCDEFGHIJKL"); @@ -74,7 +75,9 @@ int main(int argc, char *argv[]) fp = emufs_crear("articulos", T3, atoi(argv[1]), 100); + printf("pase0\n"); n1 = fp->grabar_registro(fp, a, 100, &err); + printf("pase1\n"); n2 = fp->grabar_registro(fp, c, 100, &err); n3 = fp->grabar_registro(fp, d, 100, &err); n4 = fp->grabar_registro(fp, e, 100, &err); @@ -83,8 +86,7 @@ int main(int argc, char *argv[]) n7 = fp->grabar_registro(fp, h, 100, &err); n8 = fp->grabar_registro(fp, i, 100, &err); - ver_archivo_FS(fp); - +/* fp->borrar_registro(fp, n1); fp->borrar_registro(fp, n2); fp->borrar_registro(fp, n3); @@ -94,17 +96,18 @@ int main(int argc, char *argv[]) if ( fp->borrar_registro(fp, n7) == -1) printf("la cague %d\n",n7); if ( fp->borrar_registro(fp, n8) == -1) printf("la cague %d\n",n8); */ - b_ptr = fp->leer_registro(fp, n7, ®_size, &err); + + b_ptr = fp->leer_registro(fp, n4, ®_size, &err); printf("Recuperado : %s\n", b_ptr); free(b_ptr); ver_archivo_FS(fp); - s = fp->leer_estadisticas(fp); + /*s = fp->leer_estadisticas(fp); printf("tam_archivo = %d\ntam_archivo_bytes = %d\ninfo_control = %d\n",s.tam_archivo,s.tam_archivo_bytes,s.info_control); printf("media_fs = %d\ntotal_fs = %d\ncant_bloques = %d\n",s.media_fs, s.total_fs,s.cant_bloques); - +*/ emufs_destruir(fp); return 0;