]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
los registros ahora tienen id
authorNicolás Dimov <ndimov@gmail.com>
Mon, 31 May 2004 03:52:48 +0000 (03:52 +0000)
committerNicolás Dimov <ndimov@gmail.com>
Mon, 31 May 2004 03:52:48 +0000 (03:52 +0000)
emufs/tipo1.c
emufs/tipo1_bplus_main.c
emufs/tipo3.c

index 05e2f7170fe8c4340b38e4af4ac23d665ab256d6..ff437d01e8144d4695dd84805e20b0a763ec3029 100644 (file)
@@ -78,6 +78,8 @@ static EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS*, void*,
 static CLAVE grabar_ordenado_en_bloque(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, 
                void *bloque, int num_bloque, EMUFS_FREE fs, int *err);
 
+static void b_plus_actualizar_ids(EMUFS *emu, void *bloque, int num_bloque);
+
 /*------------------ Funciones públicas ----------------------*/
 
 int emufs_tipo1_inicializar(EMUFS* efs)
@@ -802,6 +804,8 @@ EMUFS_REG_ID emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
        1 = Error de lectura en algun nodo, abortar operacion en funcion invocante.
        */
        result = emufs_b_plus_get_bloque(emu->indices, &query, 0);
+       /*pido id nuevo*/
+       header.id = emufs_idx_get_new_id(emu, err);
        if (result == 1){
                PERR("SE PRODUJO UN ERROR EN EL ARBOL.. ABORTANDO");
                return -1;
@@ -814,7 +818,6 @@ EMUFS_REG_ID emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                        return -1;
                }
                memset(bloque, 0, emu->tam_bloque);
-               header.id = emufs_idx_get_new_id(emu, err);
                if (*err) {
                        PERR("NO SE PUDO OBTENER UN ID");
                        free(bloque);
@@ -840,6 +843,8 @@ EMUFS_REG_ID emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                emufs_tipo1_grabar_bloque_fsc(emu, bloque, query.num_bloque, EMUFS_NOT_FOUND, err);
                /*agrego la clave al arbol*/
                emufs_b_plus_insertar(emu->indices, &query);
+               /*agrego el id a idx*/
+               emufs_idx_agregar(emu, header.id, query.num_bloque);
                free(bloque);
                return header.id;
        } else { /*tengo que meter el registro en el bloque que me dijo el arbol*/
@@ -892,6 +897,8 @@ EMUFS_REG_ID emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                                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);
+                               /*actualizo los ids de idx*/
+                               b_plus_actualizar_ids(emu, new_bloque, query.num_bloque);
                                /*actualizo el arbol con la nueva clave*/
                                query.clave = clave;
                                emufs_b_plus_insertar(emu->indices, &query);
@@ -912,6 +919,8 @@ EMUFS_REG_ID emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                                query.num_bloque = emufs_create_new_block(emu);
                                /*grabo el bloque nuevo*/
                                emufs_tipo1_grabar_bloque_fsc(emu, new_bloque, query.num_bloque, EMUFS_NOT_FOUND, err);
+                               /*actualizo los ids de idx del bloque nuevo*/
+                               b_plus_actualizar_ids(emu, new_bloque, query.num_bloque);
                                /*grabo el registro en el bloque original*/
                                grabar_ordenado_en_bloque(emu,ptr,size,bloque,num_bloque,fs+move_size,err);
                                /*actualizo el arbol con la menor clave del bloque nuevo*/
@@ -992,6 +1001,8 @@ CLAVE grabar_ordenado_en_bloque(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, void
        memcpy(new_bloque+emu->tam_bloque-sizeof(int), &cant_reg, sizeof(int));
        emufs_tipo1_grabar_bloque_fsc(emu, new_bloque, num_bloque, EMUFS_NOT_FOUND, err);
        clave = emufs_indice_generar_clave(emu->indices, new_bloque+sizeof(EMUFS_TIPO1_REG_HEADER));
+       /*agrego el id a idx*/
+       emufs_idx_agregar(emu, header.id, num_bloque);
        free(new_bloque);
        return clave;
 }
@@ -1002,6 +1013,7 @@ int emufs_tipo1_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato)
        INDEX_DAT query;
        int result, iter, cant_reg;
        EMUFS_REG_SIZE tam_reg;
+       EMUFS_REG_ID id;
        CLAVE clave_ajena, ancla;
        int err = 0;
        
@@ -1036,6 +1048,8 @@ int emufs_tipo1_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato)
                clave_ajena = emufs_indice_generar_clave(emu->indices, aux+sizeof(EMUFS_TIPO1_REG_HEADER));
                if ( emufs_indice_es_igual(emu->indices, clave, clave_ajena) ){
                        /*tengo que borrar este registro*/
+                       /*leo el id*/
+                       memcpy(&id, aux, sizeof(EMUFS_REG_ID));
                        /*limpio el espacio que ocupaba*/
                        memset(aux, 0, tam_reg+sizeof(EMUFS_TIPO1_REG_HEADER));
                        /*hay que reacomodar todo*/
@@ -1067,6 +1081,7 @@ int emufs_tipo1_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato)
                        emufs_b_plus_reemplazar_clave(emu->indices, ancla, query, 0);
                }
        }
+       emufs_idx_borrar(emu, id);
        free(bloque);
        return 0;
 }
@@ -1171,3 +1186,25 @@ B_PLUS_KEYBUCKET *emufs_tipo1_obtener_claves_raw(EMUFS *emu, int num_bloque)
        free(aux);
        return keys;
 }
+
+void b_plus_actualizar_ids(EMUFS *emu, void *bloque, int num_bloque)
+{
+       EMUFS_REG_ID id;
+       int cant_reg,i;
+       EMUFS_REG_SIZE tam_reg;
+       char *aux;
+       /*leo la cantidad de registros*/
+       memcpy(&cant_reg, bloque+emu->tam_bloque-sizeof(int), sizeof(int));
+       /*reemplazo todos los ids*/
+       aux = bloque;
+       for(i=0; i<cant_reg; i++){
+               /*leo id a reemplazar*/
+               memcpy(&id, aux, sizeof(EMUFS_REG_ID));
+               /*leo el tamanio del registro*/
+               memcpy(&tam_reg, aux+sizeof(EMUFS_REG_ID), sizeof(EMUFS_REG_SIZE));
+               /*reemplazo el id*/
+               emufs_idx_agregar(emu, id, num_bloque);
+               /*me muevo para la sig iteracion*/
+               aux += tam_reg+sizeof(EMUFS_TIPO1_REG_HEADER);
+       }
+}
index 540d1581fea88ebb8f60daebd6baf5cba024c005..b5eea549d6c6134620472141b5572fcd5f40e5b8 100644 (file)
@@ -79,7 +79,7 @@ int main (int argc,char* argv[])
        CLAVE clave;
        char *texto, *texto2;
        char *r;
-       int tecla;
+       int tecla, j, cb;
        EMUFS *emu;
        int tam_nodo = SIZE_B_PLUS_HEADER + sizeof(CLAVE)*5 + sizeof(CLAVE)*6;
        EMUFS_REG_SIZE len, size;
@@ -170,22 +170,22 @@ int main (int argc,char* argv[])
        emufs_tipo1_insertar_ordenado(emu, r, len, &err);
        PERR("REGISTRO 7 GRABADO");
        free(r);
-/*
+
+
+
 clave.i_clave = 93;
-emufs_tipo1_eliminar_ordenado(emu, clave, &err);
+emufs_tipo1_eliminar_ordenado(emu, clave, dato);
 clave.i_clave = 99;
-emufs_tipo1_eliminar_ordenado(emu, clave, &err);
+emufs_tipo1_eliminar_ordenado(emu, clave, dato);
 clave.i_clave = 95;
-emufs_tipo1_eliminar_ordenado(emu, clave, &err);
-*/
-
-/*-
+emufs_tipo1_eliminar_ordenado(emu, clave, dato);
 clave.i_clave = 77;
 emufs_tipo1_eliminar_ordenado(emu, clave, dato);
-
-clave.i_clave = 95;
+clave.i_clave = 80;
 emufs_tipo1_eliminar_ordenado(emu, clave, dato);
+
 PERR("REGISTROS ELIMINADOS");
+
 /*
 PERR("LEYENDO REGISTRO");
 clave.i_clave = 80;
@@ -205,7 +205,7 @@ for ( i=0; i<100; i++){
        emufs_tipo1_insertar_ordenado(emu, r, len, &err);
        free(r);
 }
-
+/*
 prekey.clave = emu->indices->obtener_menor_clave(emu->indices);
 postkey.clave = emu->indices->obtener_mayor_clave(emu->indices);
 printf ("El mayor es %i\n",postkey.clave.i_clave);
@@ -216,19 +216,17 @@ while (emufs_indice_es_menor(emu->indices,query.clave,postkey.clave) && query.cl
        query.clave = emu->indices->obtener_sig_clave(emu->indices,query.clave);
        printf("Sig de %i es %i\n",q.clave.i_clave,query.clave.i_clave);
 }
-
-/*PERR("OBTENIENDO CLAVES");
-v = emufs_tipo1_obtener_claves_raw(emu, 3);
-printf("Las claves del bloque 3 son:\n");
-if (v==NULL) {
-       PERR("NO HAY VECTOR");
-       emufs_destruir(emu);
-}*/
-/*printf("Las claves del bloque 3 son:\n");*/
-/*for (i=0; i<v->cant_keys; i++)
-       printf("v[%d] = %d\n", i, v->claves[i]);*/
-
-ver_arbol(emu);
+*/
+PERR("OBTENIENDO CLAVES");
+cb = emufs_get_new_block_number(emu);
+printf("cantidad de bloques en el archivo: %d\n", cb-1);
+for (i=0; i<cb; i++){
+       v = emufs_tipo1_obtener_claves_raw(emu, i);
+       printf("claves del bloque %d\n", i);
+       for(j=0; j<v->cant_keys;j++)
+               printf("v[%d] = %d\n", j, v->claves[j]);
+       free(v);
+}
 
 /*printf("Buscar el POST de:\n");
 scanf("%d", &tecla);
index 7ef48a0f1774a7b5d8a863e3c1f3517cd56951f5..b42f11b21ce860822008a23b210b484044067865 100644 (file)
@@ -44,7 +44,7 @@
 
 static CLAVE grabar_ordenado_en_bloque(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size,
                                        void *bloque, int num_bloque, EMUFS_FREE fs, int *err);
-
+static void b_plus_actualizar_ids(EMUFS *emu, void *bloque, int num_bloque);
 
 int emufs_tipo3_inicializar(EMUFS* efs)
 {
@@ -64,7 +64,8 @@ int emufs_tipo3_inicializar(EMUFS* efs)
        efs->leer_registro_raw = emufs_tipo3_leer_registro_raw;
        efs->leer_estadisticas = emufs_tipo3_leer_estadisticas;
        efs->compactar         = emufs_tipo3_compactar;
-       efs->modificar_registro = emufs_tipo3_modificar_registro;
+       efs->modificar_registro= emufs_tipo3_modificar_registro;
+       efs->obtener_claves_raw= emufs_tipo3_obtener_claves_raw;
        return EMUFS_OK;
 }
 
@@ -87,7 +88,7 @@ int emufs_tipo5_inicializar(EMUFS* efs)
        efs->leer_estadisticas = emufs_tipo3_leer_estadisticas;
        efs->compactar         = emufs_tipo3_compactar;
        efs->modificar_registro= emufs_tipo3_modificar_registro_plus;
-       efs->obtener_claves_raw = emufs_tipo3_obtener_claves_raw;
+       efs->obtener_claves_raw= emufs_tipo3_obtener_claves_raw;
        return EMUFS_OK;
 }
 
@@ -671,6 +672,7 @@ EMUFS_REG_ID emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
        0 = Sin problemas, retorno bloque donde insertar
        1 = Error de lectura en algun nodo, abortar operacion en funcion invocante.
        */
+       header = emufs_idx_get_new_id(emu, err);
        result = emufs_b_plus_get_bloque(emu->indices, &query, 0);
        if (result == 1){
                PERR("SE PRODUJO UN ERROR EN EL ARBOL.. ABORTANDO");
@@ -684,7 +686,6 @@ EMUFS_REG_ID emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                        return -1;
                }
                memset(bloque, 0, emu->tam_bloque);
-               header = emufs_idx_get_new_id(emu, err);
                if (*err) {
                        PERR("NO SE PUDO OBTENER UN ID");
                        free(bloque);
@@ -709,6 +710,8 @@ EMUFS_REG_ID emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                emufs_tipo3_grabar_bloque(emu, bloque, query.num_bloque);
                /*agrego la clave al arbol*/
                emufs_b_plus_insertar(emu->indices, &query);
+               /*agrego el id a idx*/
+               emufs_idx_agregar(emu, header, query.num_bloque);
                free(bloque);
                return header;
        } else { /*tengo que meter el registro en el bloque que me dijo el arbol*/
@@ -759,6 +762,8 @@ EMUFS_REG_ID emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                                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);
+                               /*actualizo los ids de idx*/
+                               b_plus_actualizar_ids(emu, new_bloque, query.num_bloque);
                                /*actualizo el arbol con la nueva clave*/
                                query.clave = clave;
                                emufs_b_plus_insertar(emu->indices, &query);
@@ -779,6 +784,8 @@ EMUFS_REG_ID emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                                query.num_bloque = emufs_create_new_block(emu);
                                /*grabo el bloque nuevo*/
                                emufs_tipo3_grabar_bloque(emu, new_bloque, query.num_bloque);
+                               /*actualizo los ids del bloque nuevo*/
+                               b_plus_actualizar_ids(emu, new_bloque, query.num_bloque);
                                /*grabo el registro en el bloque original*/
                                grabar_ordenado_en_bloque(emu,ptr,size,bloque,num_bloque,fs+move_size,err);
                                /*actualizo el arbol con la menor clave del bloque nuevo*/
@@ -857,6 +864,7 @@ CLAVE grabar_ordenado_en_bloque(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, void
        memcpy(new_bloque+emu->tam_bloque-sizeof(int), &cant_reg, sizeof(int));
        emufs_tipo3_grabar_bloque(emu, new_bloque, num_bloque);
        clave = emufs_indice_generar_clave(emu->indices, new_bloque+sizeof(EMUFS_REG_ID));
+       emufs_idx_agregar(emu, header, num_bloque);
        free(new_bloque);
        return clave;
 }
@@ -867,6 +875,7 @@ int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato)
        INDEX_DAT query;
        int result, iter, cant_reg;
        EMUFS_REG_SIZE tam_reg = emu->tam_reg;
+       EMUFS_REG_ID id;
        CLAVE clave_ajena, ancla;
        int err = 0;
 
@@ -899,7 +908,9 @@ int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato)
        while ( iter < emu->tam_bloque ){
                clave_ajena = emufs_indice_generar_clave(emu->indices, aux+sizeof(EMUFS_REG_ID));
                if ( emufs_indice_es_igual(emu->indices, clave, clave_ajena) ){
-                       /*tenngo que borrar este registro*/
+                       /*tengo que borrar este registro*/
+                       /*leo el id*/
+                       memcpy(&id, aux, sizeof(EMUFS_REG_ID));
                        /*limpio el espacio que ocupaba*/
                        memset(aux, 0, tam_reg+sizeof(EMUFS_REG_ID));
                        /*hay que reacomodar todo*/
@@ -931,6 +942,7 @@ int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato)
                        emufs_b_plus_reemplazar_clave(emu->indices, ancla, query, 0);
                }
        }
+       emufs_idx_borrar(emu, id);
        free(bloque);
        return 0;
 }
@@ -1033,3 +1045,23 @@ B_PLUS_KEYBUCKET *emufs_tipo3_obtener_claves_raw(EMUFS *emu, int num_bloque)
        free(aux);
        return keys;
 }
+
+void b_plus_actualizar_ids(EMUFS *emu, void *bloque, int num_bloque)
+{
+       EMUFS_REG_ID id;
+       int cant_reg,i;
+       EMUFS_REG_SIZE tam_reg = emu->tam_reg;
+       char *aux;
+       /*leo la cantidad de registros*/
+       memcpy(&cant_reg, bloque+emu->tam_bloque-sizeof(int), sizeof(int));
+       /*reemplazo todos los ids*/
+       aux = bloque;
+       for(i=0; i<cant_reg; i++){
+               /*leo id a reemplazar*/
+               memcpy(&id, aux, sizeof(EMUFS_REG_ID));
+               /*reemplazo el id*/
+               emufs_idx_agregar(emu, id, num_bloque);
+               /*me muevo para la sig iteracion*/
+               aux += tam_reg+sizeof(EMUFS_REG_ID);
+       }
+}