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*/
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; i<cant_bloques; i++){
+ if ((bloque = emufs_tipo3_leer_bloque(emu, block+i, 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*/
+ }
+ 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 ){
+ 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;
}
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; i<cant_bloques; i++) {
+ /*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 */
+ /*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;
}
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;
}
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);
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
*/
return bloque;
}
-
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");
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);
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);
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;