]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
Limpio un poco el codigo, sigo debuggeando... cosa rara: inserta los registros orden...
authorNicolás Dimov <ndimov@gmail.com>
Sat, 29 May 2004 00:49:11 +0000 (00:49 +0000)
committerNicolás Dimov <ndimov@gmail.com>
Sat, 29 May 2004 00:49:11 +0000 (00:49 +0000)
emufs/common.c
emufs/emufs.c
emufs/tipo1.c
emufs/tipo1_bplus_main.c

index 3906e057b8eed03db48c42001b3de1cd7e4131f3..1182c2921deb4b098977886561eadaf46ae2c237 100644 (file)
@@ -46,7 +46,6 @@ long emufs_common_get_file_size(const char* filename, int* err)
                *err = EMUFS_ERROR_CANT_OPEN_FILE;
                return 0;
        }
-       fseek(file, 0, SEEK_END);
        file_size = ftell(file);
        fclose(file);
        if (file_size < 0) {
index cd59b39ada88430d14f69974a21536c0b8e0ad4e..3803cf5bcaf4792fd9e79a3c1410bd9a817df425 100644 (file)
@@ -496,7 +496,6 @@ EMUFS_BLOCK_ID emufs_create_new_block(EMUFS *emu)
        dummy = (char*)malloc(emu->tam_bloque);
        memset(dummy, 0, emu->tam_bloque);
        fwrite(dummy, emu->tam_bloque, 1, fp);
-       printf("new_block ftell = %d\n", ftell(fp));
        switch(emu->tipo){
                case T1: num = (ftell(fp)-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE))/emu->tam_bloque;
                        break;
@@ -504,7 +503,7 @@ EMUFS_BLOCK_ID emufs_create_new_block(EMUFS *emu)
        }
        fclose(fp);
        free(dummy);
-       return num-1;
+       return num;
 }
 
 /*devuelve un numero de bloque siguiente al ultimo*/
index ffca1914cf923b2dc8b48a639a317039866fc43a..1bc3d2b63c2993370d665957933b072670ee433f 100644 (file)
@@ -747,7 +747,7 @@ void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, c
 
 int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, int *err)
 {
-       CLAVE clave;
+       CLAVE clave, menor_clave_bloque_nuevo;
        EMUFS_BLOCK_ID num_bloque; 
        EMUFS_TIPO1_REG_HEADER header;
        EMUFS_REG_SIZE tam_reg, move_size;
@@ -757,10 +757,8 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in
        int cant_reg, i, result, dif;
        
        /*le asigno un posible numero de bloque para el caso en que no encuentre donde meterlo*/
-       PERR("LEO EL NUMERO DE BLOQUE SIGUIENTE");
        num_bloque = emufs_get_new_block_number(emu);   
        query.num_bloque = num_bloque;
-       printf("BLOQUE NUMBER : %d\n", num_bloque);
        /*saco la clave del stream*/
        query.clave = emufs_indice_generar_clave(emu->indices, ptr);
        /*mando a buscar en el arbol el bloque correspondiente a esa clave*/
@@ -774,7 +772,6 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in
        1 = Error de lectura en algun nodo, abortar operacion en funcion invocante.
        */
        result = emufs_b_plus_get_bloque(emu->indices, &query, 0);
-       printf("tengo que guardar en bloque: %d\n", query.num_bloque);
        if (result == 1){
                PERR("SE PRODUJO UN ERROR EN EL ARBOL.. ABORTANDO");
                return -1;
@@ -834,11 +831,11 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in
                        /*en teoria el nuevo registro no debe cambiar el ancla, por lo cual no actualizo el arbol*/
                        free(bloque);
                        return 0;
-               /*aca va lo que saque*/
                } else { /* el registro no entra en el bloque, hay que crear uno nuevo y desparramar */
                        PERR(" COMO NO ENTRA DEBO DIVIDIR LOS REGISTROS EN 2 BLOQUES");
                        new_bloque = (char*)malloc(emu->tam_bloque);
                        move_size=0;
+                       aux = bloque;
                        for(i=0; i<cant_reg/2; i++){ /*copio mitad aca y mitad en el nuevo*/
                                /*avanzo*/
                                memcpy(&tam_reg, aux+sizeof(EMUFS_REG_ID), sizeof(EMUFS_REG_SIZE));
@@ -846,33 +843,45 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in
                                move_size += sizeof(EMUFS_TIPO1_REG_HEADER)+tam_reg;
                        }
                        PERR("ME MOVI LA MITAD DE LOS REGISTROS");
-                       /*copio el resto del bloque al nuevo bloque*/
-                       memcpy(new_bloque, aux, emu->tam_bloque-move_size);
+                       /*copio el resto del bloque al nuevo bloque*/      /*footer ¿?*/
+                       memcpy(new_bloque, aux, emu->tam_bloque-move_size/*-sizeof(int)*/);
                        /*borro lo que sobra en el bloque original, guardando el footer*/
                        memset(aux, 0, emu->tam_bloque - move_size - sizeof(int));
-                       /*actualizo la cant de registros (footer)*/
+                       /*actualizo la cant de registros del bloque original (footer)*/
+                       i++; /* 0 a n hay n+1 */
                        memcpy(bloque+emu->tam_bloque-sizeof(int), &i, sizeof(int));
-                       PERR("PASE");
-                       /*grabo el bloque original*/
-                       printf("voya a grabar en bloque: %d\n", num_bloque);
-                       emufs_tipo1_grabar_bloque_fsc(emu, bloque, num_bloque, EMUFS_NOT_FOUND, err);
-                       PERR("GRABE EL BLOQUE 1 de 2");
                        /*actualizo el footer del nuevo bloque*/
                        dif = cant_reg - i; /*por las dudas*/
-                       memcpy(new_bloque+emu->tam_bloque, &dif, sizeof(int));
-                       /*genero un nuevo espacio para un bloque en el archivo y lo cargo en query
-                         la clave ya estaba en query desde antes*/
-                       query.num_bloque = emufs_create_new_block(emu);
-                       /*inserto el nuevo registro en el nuevo bloque y obtengo la clave del menor*/
-                       clave = grabar_ordenado_en_bloque(emu,ptr,size,new_bloque,query.num_bloque, emu->tam_bloque-move_size,err);
+                       memcpy(new_bloque+emu->tam_bloque-sizeof(int), &dif, sizeof(int));
+                       menor_clave_bloque_nuevo = emufs_indice_generar_clave(emu->indices, new_bloque+sizeof(EMUFS_TIPO1_REG_HEADER));
+                       /* TENGO QUE VER EN CUAL DE LOS DOS BLOQUES METO EL REGISTRO NUEVO */
+                       if ( emufs_indice_es_menor(emu->indices, menor_clave_bloque_nuevo, clave) ){
+                               /*genero un nuevo espacio para un bloque en el archivo y lo cargo en queryla clave ya estaba en query desde antes*/
+                               query.num_bloque = emufs_create_new_block(emu);
+                               printf("numero de bloque nuevo: %d\n", query.num_bloque);
+                               /*inserto el nuevo registro en el nuevo bloque y obtengo la clave del menor*/
+                               clave = grabar_ordenado_en_bloque(emu,ptr,size,new_bloque,query.num_bloque, emu->tam_bloque-move_size,err);
+                               /*actualizo el arbol con la nueva clave*/
+                               query.clave = clave;
+                               emufs_b_plus_insertar(emu->indices, &query);
+                               /*grabo el bloque original*/
+                               printf("numero de bloque viejo: %d\n", num_bloque);
+                               emufs_tipo1_grabar_bloque_fsc(emu, bloque, num_bloque, EMUFS_NOT_FOUND, err);
+                       } else {
+                               /*grabo el bloque nuevo*/
+                               query.num_bloque = emufs_create_new_block(emu);
+                               printf("numero de bloque nuevo: %d\n", query.num_bloque);
+                               emufs_tipo1_grabar_bloque_fsc(emu, new_bloque, emufs_create_new_block(emu), EMUFS_NOT_FOUND, err);
+                               printf("numero de bloque viejo %d\n", num_bloque);
+                               grabar_ordenado_en_bloque(emu,ptr,size,bloque,query.num_bloque, fs-move_size,err);
+                               
+                       }
                        if(*err != 0){
                                PERR("NO SE PUDO GRABAR ORDENADO");
                                free(new_bloque);
                                free(bloque);
                                return -1;
                        }
-                       /*actualizo el arbol con la nueva clave*/
-                       emufs_b_plus_insertar(emu->indices, &query);
                        free(new_bloque);
                        free(bloque);
                        return 0;
index 11b6c3b7e5bd1e78e9cee075a4c26dbbab0f7abe..771b1a21caeff1af235e42d68b9bd57b8e600ebc 100644 (file)
@@ -41,10 +41,10 @@ int main (int argc,char* argv[])
        EMUFS_REG_SIZE len;
        int err=0;
        
-       texto="PARTE CONSTANTE, clave =";
-       
        emu = emufs_crear("test",T1,512,0);
        emufs_agregar_indice(emu,"claveidx",IND_PRIMARIO,IND_B_PLUS,IDX_INT,strlen(texto),tam_nodo);
+       
+       texto = "PARTE COSNSTANTE, clave =";
 /*REGISTRO 1*/ 
        clave.i_clave = 77;     
        texto2="termina el texto re bonito CLAVE = 77";
@@ -65,7 +65,7 @@ int main (int argc,char* argv[])
        PERR("REGISTRO 2 GRABADO");
        free(r);
 
-/*REGISTRO 3*/ 
+/*REGISTRO 3   
        texto2="Este es el fin del registro tres, puse tres en numero para que sea mas largo el texto CLAVE = 95";
        clave.i_clave = 95;     
        r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
@@ -75,7 +75,7 @@ int main (int argc,char* argv[])
        PERR("REGISTRO 3 GRABADO");
        free(r);
        
-/*REGISTRO 4*/ 
+/*REGISTRO 4   
        texto2="REGISTRO CUATRO CLAVE = 99";
        clave.i_clave = 99;     
        r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
@@ -85,7 +85,7 @@ int main (int argc,char* argv[])
        PERR("REGISTRO 4 GRABADO");
        free(r);
 
-/*REGISTRO 5*/ 
+/*REGISTRO 5   
        texto2="el quinto registro tiene un largo promedio como para entrar en el bloque CLAVE = 102";
        clave.i_clave = 102;    
        r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
@@ -96,7 +96,7 @@ int main (int argc,char* argv[])
        free(r);
 
 /*REGISTRO 6*/ 
-       texto2="El registro 6 no entra CLAVE = 106";
+/*     texto2="El registro 6 no entra CLAVE = 106";
        clave.i_clave = 106;    
        r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2));
        imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE));
@@ -105,7 +105,7 @@ int main (int argc,char* argv[])
        PERR("REGISTRO 6 GRABADO");
        free(r);
        emufs_destruir(emu);
-
+*/
        return 0;
        
 }