]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/tipo3.c
Ultimas correcciones.
[z.facultad/75.06/emufs.git] / emufs / tipo3.c
index c50639c7836e2f1a359a4cb35eaebd236cb55abf..0ebccc50becb63d831c93d21522ce8b58c895300 100644 (file)
@@ -646,6 +646,7 @@ void emufs_tipo3_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, c
 
 EMUFS_REG_ID emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, int *err)
 {
+       INDICE_DATO idx_data;
        CLAVE clave, menor_clave_bloque_nuevo;
        EMUFS_BLOCK_ID num_bloque; 
        EMUFS_REG_ID header;
@@ -707,10 +708,14 @@ EMUFS_REG_ID emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                if ( num_bloque != emufs_create_new_block(emu) )        PERR("NUMEROS DE NUEVO BLOQUE DISTINTOS");
                /*grabo el bloque en el archivo*/ /* OJO CON LO DE FS = 0 */
                emufs_tipo3_grabar_bloque(emu, bloque, query.num_bloque);
-               /*agrego la clave al arbol*/
+               /*agrego la clave al arbol bplus*/
                emufs_b_plus_insertar(emu->indices, &query);
                /*agrego el id a idx*/
                emufs_idx_agregar(emu, header, query.num_bloque);
+               /*actualizo los restantes arboles */
+               idx_data.id = header;
+               idx_data.bloque = query.num_bloque;
+               emufs_indice_agregar(emu->indices->sig, ptr, idx_data);
                free(bloque);
                return header;
        } else { /*tengo que meter el registro en el bloque que me dijo el arbol*/
@@ -730,6 +735,9 @@ EMUFS_REG_ID emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                        PERR("GRABO ORDENADO");                 
                        grabar_ordenado_en_bloque(emu, ptr, size, bloque, query.num_bloque, fs, err);
                        /*en teoria el nuevo registro no debe cambiar el ancla, por lo cual no actualizo el arbol*/
+                       idx_data.id = header;
+                       idx_data.bloque = query.num_bloque;
+                       emufs_indice_agregar(emu->indices->sig, ptr, idx_data);
                        free(bloque);
                        return header;
                } else { /* el registro no entra en el bloque, hay que crear uno nuevo y desparramar */
@@ -764,8 +772,11 @@ EMUFS_REG_ID emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                                /*actualizo los ids de idx*/
                                b_plus_actualizar_ids(emu, new_bloque, query.num_bloque);
                                /*actualizo el arbol con la nueva clave*/
+                               idx_data.id = header;
+                               idx_data.bloque = query.num_bloque;
                                query.clave = clave;
-                               emufs_b_plus_insertar(emu->indices, &query);
+                               emufs_b_plus_insertar(emu->indices, &query);                            
+                               emufs_indice_agregar(emu->indices->sig, ptr, idx_data);
                                /*grabo el bloque original*/
                                emufs_tipo3_grabar_bloque(emu, bloque, num_bloque);
                        } else {
@@ -789,6 +800,9 @@ EMUFS_REG_ID emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                                grabar_ordenado_en_bloque(emu,ptr,size,bloque,num_bloque,fs+move_size,err);
                                /*actualizo el arbol con la menor clave del bloque nuevo*/
                                query.clave = emufs_indice_generar_clave(emu->indices, new_bloque+sizeof(EMUFS_REG_ID));
+                               idx_data.id = header;
+                               idx_data.bloque = query.num_bloque;
+                               emufs_indice_agregar(emu->indices->sig, ptr, idx_data);
                                emufs_b_plus_insertar(emu->indices, &query);
                        }
                        if(*err != 0){
@@ -871,6 +885,7 @@ CLAVE grabar_ordenado_en_bloque(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, void
 int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato)
 {
        char *bloque, *aux;
+       INDICE_DATO idx_data;
        INDEX_DAT query;
        int result, iter, cant_reg;
        EMUFS_REG_SIZE tam_reg = emu->tam_reg;
@@ -916,7 +931,7 @@ int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato)
                        /*me posiciono en el reg siguiente*/
                        iter += tam_reg+sizeof(EMUFS_REG_ID);
                        break;/*ya borre, corto aca*/
-               }
+               }               
                iter += tam_reg+sizeof(EMUFS_REG_ID);
                aux += tam_reg+sizeof(EMUFS_REG_ID);
        }
@@ -942,6 +957,10 @@ int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato)
                }
        }
        emufs_idx_borrar(emu, id);
+       /* Elimino la entrada de los restantes arboles */                               
+       idx_data.id = id;
+       idx_data.bloque = query.num_bloque;
+       emufs_indice_borrar(emu->indices->sig, clave, idx_data);
        free(bloque);
        return 0;
 }