]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/b_plus.c
* BUGFIX : Habia un error al borrar claves que no estaban en las hojas.
[z.facultad/75.06/emufs.git] / emufs / b_plus.c
index 20eac04c47192926ba7673fb807a13fec062e51e..f061515c5b506c1afc6f5a74c0db1ec8b69ef96c 100644 (file)
@@ -340,31 +340,37 @@ int b_plus_insert_nonfull(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_nodo, INDE
     int i, num_nodo_hijo;
     NODO_B_PLUS *hijo;
     
     int i, num_nodo_hijo;
     NODO_B_PLUS *hijo;
     
-    i = nodo->cant_claves;
+    i = nodo->cant_claves-1; 
     if ( nodo->nivel == 0 ){
     if ( nodo->nivel == 0 ){
-        while ( i >= 1 && query->clave.i_clave < nodo->claves[i] ){
+        while ( i >= 0 && query->clave.i_clave < nodo->claves[i] ){
             nodo->claves[i+1] = nodo->claves[i];
             nodo->claves[i+1] = nodo->claves[i];
+                       nodo->hijos[i+1] = nodo->hijos[i];
             i--;
         }
         nodo->claves[i+1] = query->clave.i_clave;
             i--;
         }
         nodo->claves[i+1] = query->clave.i_clave;
+               nodo->hijos[i+1] = query->num_bloque;
         nodo->cant_claves++;
         nodo->cant_claves++;
-        b_plus_destruir_nodo(nodo);
         b_plus_grabar_nodo(idx, nodo, num_nodo);
         b_plus_grabar_nodo(idx, nodo, num_nodo);
+               b_plus_destruir_nodo(nodo);             
+               printf("Pero men yo grabee..\n");
     } else { 
     } else { 
-        while ( i >= 1 && query->clave.i_clave < nodo->claves[i] ) 
+        while ( i >= 0 && query->clave.i_clave < nodo->claves[i] ) 
             i--;
         i++;
             i--;
         i++;
-        num_nodo_hijo = nodo->hijos[i-1];
+        num_nodo_hijo = nodo->hijos[i];
         hijo = b_plus_leer_nodo(idx, num_nodo_hijo);
         if ( hijo->cant_claves == idx->size_claves/sizeof(int) ) {
         hijo = b_plus_leer_nodo(idx, num_nodo_hijo);
         if ( hijo->cant_claves == idx->size_claves/sizeof(int) ) {
-            b_plus_split_child(idx, 9999, nodo, i, hijo);
+            b_plus_split_child(idx, num_nodo, nodo, i, hijo);
             if ( query->clave.i_clave > nodo->claves[i] )
                 i++;
         }
             if ( query->clave.i_clave > nodo->claves[i] )
                 i++;
         }
-        b_plus_insert_nonfull(idx, hijo, num_nodo_hijo, query);
+               b_plus_destruir_nodo(hijo);
+               hijo = b_plus_leer_nodo(idx, nodo->hijos[i]);
+        b_plus_insert_nonfull(idx, hijo, nodo->hijos[i], query);
+               b_plus_destruir_nodo(hijo);     
     }
     }
-    b_plus_destruir_nodo(hijo);
-    return 0;
+       
+       return 0;
 }    
 
 int b_plus_insertar(INDEXSPECS *idx, INDEX_DAT *query)
 }    
 
 int b_plus_insertar(INDEXSPECS *idx, INDEX_DAT *query)
@@ -382,8 +388,8 @@ int b_plus_insertar(INDEXSPECS *idx, INDEX_DAT *query)
         b_plus_insert_nonfull(idx, new_root, 0, query);
     } else 
        {
         b_plus_insert_nonfull(idx, new_root, 0, query);
     } else 
        {
-               b_plus_insert_nonfull(idx, raiz, 0, query);
                printf ("Entre maaaaaallll\n");
                printf ("Entre maaaaaallll\n");
+               b_plus_insert_nonfull(idx, raiz, 0, query);
        }
     
     return 0;
        }
     
     return 0;