]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
Intento de buscar el numero de bloque donde deberia ir una clave nueva, no esta teste...
authorNicolás Dimov <ndimov@gmail.com>
Tue, 18 May 2004 20:51:54 +0000 (20:51 +0000)
committerNicolás Dimov <ndimov@gmail.com>
Tue, 18 May 2004 20:51:54 +0000 (20:51 +0000)
emufs/Makefile
emufs/b_plus.c

index 2e0dbf53b5027ccda6d05e433738c8e83e1790bc..b3969fe493994bf6587e5976bbba3bf3fa2cd8d4 100644 (file)
@@ -1,9 +1,9 @@
 CFLAGS=-Wall -g -ansi -pedantic -DDEBUG 
 LDFLAGS=-lm
 
-EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o indices.o indice_b.o
+EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o indices.o indice_b.o b_plus.o
 
-TARGETS=libemufs.a tipo1_main tipo2_main tipo3_main b_test
+TARGETS=libemufs.a tipo1_main tipo2_main tipo3_main b_plus_test
 
 all: $(TARGETS)
 
@@ -14,6 +14,7 @@ tipo2_main: tipo2_main.o $(EMUFS_COMMON)
 tipo3_main: tipo3_main.o $(EMUFS_COMMON)
 
 b_plus_test: b_plus_test.o b_plus.o
+
 #b_plus_test: b_plus_test.o b_plus.o indices.o emufs.o
 
 #b_test: b_test.o indice_b.o
index 0e84bcd6df9a618c027bc8057ab2ddac68762192..5a93927e52d3af3e079e4d8ab4317f3b11fb4198 100644 (file)
@@ -2,10 +2,19 @@
 #include "b_plus.h"
 
 /* Private prototypes */
+/* numerando los bloques */
+static int nuevo_bloque = -1;
+int get_new_block_number();
 int b_plus_grabar_nodo(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_node);
 NODO_B_PLUS *b_plus_leer_nodo(INDEXSPECS *idx, int num_node);
 NODO_B_PLUS *b_plus_crearnodo(INDEXSPECS *idx);
 
+/** Me devuelve un numero de bloque nuevo */
+int get_new_block_number()
+{
+       nuevo_bloque++;
+       return nuevo_bloque;
+}
 
 /** Crea un nuevo nodo y lo inicializa */
 NODO_B_PLUS *b_plus_crearnodo(INDEXSPECS *idx) {
@@ -55,20 +64,72 @@ int emufs_b_plus_crear(INDEXSPECS *idx) {
 int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query) {
 
     NODO_B_PLUS *curnode;
-       
+       int i, prox_nodo;
        /* Comienzo leyendo la raiz, entry point de toda funcion */
        printf ("Buscando donde insertar clave: %i\n\n",query->clave.i_clave);
        curnode = b_plus_leer_nodo(idx,0);      
        if (curnode == NULL) return -1;
+       /* Me fijo si es el primero que se inserta */
+       if ( curnode->cant_claves == 0 ){ /* entra la clave en la raiz */ 
+               /* ojo que este es un caso muy particular */
+               /* aumento la cant de claves*/
+               curnode->cant_claves++;
+               /* inserto la clave en el nodo, como es la primera no hace falta ordenar nada*/
+               *(curnode->claves) = query->clave.i_clave;
+               /* Debo obtener un numero de bloque para devolverle al query!!! */
+               /* por ahora el nuevo bloque se va incrementando, sin recuperacion de vacios FIX*/
+               query->num_bloque = get_new_block_number();
+               /* Le asigno al nodo del arbol el mismo numero que devolvi */
+               *(curnode->hijos) = query->num_bloque;
+               /* Cargado el query salgo de la func, luego habra que actualizar el .dat 
+                  y luego volver a grabar el nodo en el arbol*/                
+               /* librero el nodo */
+               free(curnode);
+               return 0;
+       } 
        
        /* Mientras no encontre la hoja con la clave, busco.. */
-       while ((curnode->nivel > 0) && curnode)
-       {
-               
+       /* RECORDAR QUE LAS CLAVES DEBEN ESTAR ORDENADAS PARA QUE ESTO FUNCIONE !! */ 
+       while (curnode->nivel > 0)
+       {       /*recorro las claves hasta encontrar la primera mayor a la que quiero insertar*/
+               for(i=0; i<=curnode->cant_claves; i++){ /* ojo si la cant_claves es cero!!!!*/
+                       /* me fijo que si es mayor */
+                       if ( (query->clave.i_clave >= curnode->claves[i])) {
+                               if ( curnode->cant_claves != i ) /* si no es la ultima clave del nodo */
+                                       continue; /*paso a la siguiente*/
+                               else {  /* si era la ultima, la clave deberia ir ahi */
+                                       /*cargo el proximo nodo*/
+                                       prox_nodo = curnode->hijos[i+1];
+                                       break; /*salgo del for*/
+                               }
+                       } else {  /*si no es mayor o igual es menor*/
+                               prox_nodo = curnode->hijos[i];
+                               break;
+                       }
+               }
+               free(curnode);
+               curnode = b_plus_leer_nodo(idx, prox_nodo);
+       } 
+       /*cuando salgo de aca deberia tener cargado en curnode el nodo hoja que busque*/
+       for (i=0; i<=curnode->cant_claves-1; i++){
+               if ( query->clave.i_clave > curnode->claves[i] ){
+                       if ( curnode->cant_claves != i ) /* si no es la ultima clave */
+                               continue;
+                       else {   /* si era la ultima */
+                               /* cargo en query el numero del bloque donde deberia ir la nueva clave */
+                               query->num_bloque = curnode->hijos[i];
+                               free(curnode);
+                               return 0;
+                       }
+               } else {  /* si no era mayor, era menor */
+                       /* guardo el bloque anterior porque me pase.. */
+                       query->num_bloque = curnode->hijos[i-1];
+                       free(curnode);
+                       return 0;
+               }
        }
-       
+
        free(curnode);
-       
        return 0;
 }