]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
Soporte para bloques pequeños en leer y guardar, falta borrar pero como estoy quemado...
authorNicolás Dimov <ndimov@gmail.com>
Thu, 15 Apr 2004 05:08:44 +0000 (05:08 +0000)
committerNicolás Dimov <ndimov@gmail.com>
Thu, 15 Apr 2004 05:08:44 +0000 (05:08 +0000)
emufs/tipo3.c
emufs/tipo3_main.c

index 0e428e1e128305a6970ce7593ce9194052f5da16..3d4a2739a4d6a42a4eed6df44d5096d4811ebc06 100644 (file)
@@ -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; 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;
 }
 
@@ -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; 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;
                }
@@ -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;
 }
-
index ce6dfa85e6335cb4cf77de3e25f5a3d6db1763ff..1e20faa754568c2ac71e1caf668fcfaecbff785a 100644 (file)
@@ -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, &reg_size, &err);
+       
+       b_ptr = fp->leer_registro(fp, n4, &reg_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;