]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
-No quiere truncar... como puedo saber que le impide truncar?
authorNicolás Dimov <ndimov@gmail.com>
Sat, 17 Apr 2004 17:56:44 +0000 (17:56 +0000)
committerNicolás Dimov <ndimov@gmail.com>
Sat, 17 Apr 2004 17:56:44 +0000 (17:56 +0000)
emufs/tipo3.c
emufs/tipo3_main.c

index 56954ff23fb7fc6eb964f3098d0359756a956f47..b96482399e55ae50cfa6d4266558fdeb28148f5f 100644 (file)
@@ -101,7 +101,7 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID,
 }
 
 /*leo el bloque "ID" del archivo que viene en "emu->nombre", y lo almaceno en "ptr"*/
-void* emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_REG_ID ID, int* err)
+void* emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID ID, int* err)
 {
        FILE* file;
        char* block; /* bloque leido (en donde está el registro a leer) */
@@ -111,12 +111,18 @@ void* emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_REG_ID ID, int* err)
        strcat(name_f,".dat");
        
        if ((file = fopen(name_f, "r")) == NULL) {
+               PERR("No se pudo abrir el archivo de datos");
                *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
                return NULL; /* FIXME ERROR */
        }
        fseek(file,sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE),SEEK_SET);
        /*FIXME: verificar que no se pase de fin de archivo*/
-       fseek(file,ID*emu->tam_bloque,SEEK_CUR);
+       if (fseek(file,ID*emu->tam_bloque,SEEK_CUR) != 0){
+               PERR("Fallo la busqueda del bloque");
+               *err=3;
+               return NULL;
+       }
+       
        block = (char*) malloc(emu->tam_bloque);
        if (block == NULL) {
                /* TODO Manejo de errores */
@@ -152,11 +158,12 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t
        
        cant_bloques = (emu->tam_reg / (emu->tam_bloque-sizeof(EMUFS_REG_ID))) + 1;
        resto = emu->tam_bloque - sizeof(EMUFS_REG_ID);
-       lugar = emu->tam_reg - 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);
+       printf("lugar encontrado en %d\n", num_bloque);
        /*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*/
@@ -215,6 +222,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t
                        if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque+i, err))) {
                                /* TODO Manejo de errores */
                                PERR("no se pudo leer el bloque");
+                               printf("bloque: %d  i= %d\n", num_bloque, i);
                                return -1;
                        }
                        /*El error puede haberse producido porque la funcion leer_bloque devolvio -1, el cual es un bloque invalido*/
@@ -475,41 +483,33 @@ void* emufs_tipo3_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE
 
 void emufs_tipo3_compactar(EMUFS *emu)
 {
-       FILE *f;
        EMUFS_REG_ID *tmp, max_id;
+       EMUFS_BLOCK_ID block_id;
        EMUFS_REG_SIZE size;
        EMUFS_Estadisticas s;
        char name[255];
        char *reg;
-       int err=0, ID_aux, cant_bloques, i, bloques_vacios=0;
+       int err=0, ID_aux, cant_bloques, i, bloques_vacios=0, fs;
        
        /* si el bloque es mas chico que el registro no hace falta compactar */
        /*if( emu->tam_reg-sizeof(EMUFS_REG_ID) > emu->tam_bloque ) return;     */
                
-       strcpy(name,emu->nombre);
-       strcat(name,".dat");
-
-       if ( (f=fopen(name,"r") == NULL) ){
-               PERR("No se pudo abrir el archivo");
-               return;
-       }
        s = emufs_tipo3_leer_estadisticas(emu);
        cant_bloques = s.cant_bloques;
 
        /* si solo hay un bloque no hace falta compactar */
        if ( cant_bloques == 0 ){
-               fclose(f);
                return;
        }
+       
        tmp = emufs_idx_get(emu, &max_id);
        if (tmp) free(tmp);
        for( i=0; i<=max_id; i++){
                /* si el id no existe paso al siguiente*/
-               if ( emufs_idx_existe_id(emu, i) != 0 ) continue;
+               if ( emufs_idx_existe_id(emu, i) != 0 ) continue;
                reg = emufs_tipo3_leer_registro(emu, i, &size, &err);
                if (err){
                        PERR("No se pudo leer el registro");
-                       fclose(f);
                        return;
                }
                emufs_tipo3_borrar_registro(emu, i);
@@ -517,8 +517,17 @@ void emufs_tipo3_compactar(EMUFS *emu)
                i++;
        }
        /*tengo que truncar el archivo*/
-       bloques_vacios = emufs_fsc_get_cant_bloques_vacios(emu)-1;
-       truncate(name, sizeof(EMUFS_Tipo)+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_BLOCK_SIZE)+emu->tam_bloque*(cant_bloques-bloques_vacios));
-       /*fclose(f);  problemas con el fclose FIXME!!!*/
+       /*bloques_vacios = emufs_fsc_get_cant_bloques_vacios(emu)-1;
+       */
+       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;
+       printf("cantidad de bloques: %d\nturnco hasta %d\n",cant_bloques, block_id);
+       printf("bytes a truncar: %d\n", size);
+       if (truncate(name, size)!=0)
+               PERR("NO TRUNQUE NADA");
+       /*hay que truncar el fsc!!!*/
+       printf("trunque el fsc hasta el bloque %d\n", block_id);
+       if (emufs_fsc_truncate(emu, block_id)!= 0)
+               PERR("NO TURNQUE EL FSC");
        free(reg);
 }
index 17a7b8691b82cf617e3fe9225f81af61b563330d..1b588d87c01f1333eac7e6f39afc6c7835c8b933 100644 (file)
@@ -101,9 +101,23 @@ int main(int argc, char *argv[])
                fp->borrar_registro(fp, v[j]);
                printf("borrado : %d\n", v[j]);
        }
-/*     printf("GRABANDO REGISTROS....\n");
+
+       for (j=1; j<8; j+=2){   
+               b_ptr = fp->leer_registro(fp, v[j], &reg_size, &err);
+               printf("Recuperado : %s\n", b_ptr);
+       }
+
+       printf("COMPACTANDO........\n");
+       fp->compactar(fp);
+
+       for (j=1; j<8; j+=2){   
+               b_ptr = fp->leer_registro(fp, v[j], &reg_size, &err);
+               printf("Recuperado : %s\n", b_ptr);
+       }
+/*
+       printf("GRABANDO REGISTROS....\n");
        v[0] = fp->grabar_registro(fp, a, 100, &err);
-       v[1] = fp->grabar_registro(fp, c, 100, &err);
+/*     v[1] = fp->grabar_registro(fp, c, 100, &err);
        v[2] = fp->grabar_registro(fp, d, 100, &err);
        v[3] = fp->grabar_registro(fp, e, 100, &err);
        v[4] = fp->grabar_registro(fp, f, 100, &err);
@@ -111,13 +125,10 @@ int main(int argc, char *argv[])
        v[6] = fp->grabar_registro(fp, h, 100, &err);
        v[7] = fp->grabar_registro(fp, i, 100, &err);
 */
-       for (j=1; j<8; j+=2){   
-               b_ptr = fp->leer_registro(fp, v[j], &reg_size, &err);
-               printf("Recuperado : %s\n", b_ptr);
-       }
+/*
        printf("COMPACTANDO........\n");
        fp->compactar(fp);
-       
+*/     
        /*s=fp->leer_estadisticas(fp);
        printf("tam archivo: %d\ntam arch bytes: %d\ninfo control: %d\nmedia fs: %d\ntotal fs:%d\nmax fs: %d\nmin fs: %d\ncant bloques: %d\n",
                        s.tam_archivo, s.tam_archivo_bytes, s.info_control, s.media_fs, s.total_fs, s.max_fs, s.min_fs, s.cant_bloques);