-/** Busca el nro de bloque donde se debe guardar un reg con clave X */
-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 la raiz esta vacia */
- 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*/
- /*grabo el nodo en el archivo*/
- b_plus_grabar_nodo(idx, &nodo, 0);
- /* librero el nodo */
- free(curnode);
- return 0;
- }
-
- /* Mientras no encontre la hoja con la clave, busco.. */
- /* RECORDAR QUE LAS CLAVES DEBEN ESTAR ORDENADAS PARA QUE ESTO FUNCIONE !! */
- while (curnode->nivel > 0 && curnode)
- { /*recorro las claves hasta encontrar la primera mayor a la que quiero insertar*/
- for(i=0; i<curnode->cant_claves; i++){
- /* 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;
- }
+
+/** Busca el nro de bloque donde se debe guardar un reg con clave X.
+ * Posibilidades: return 0 - Encontro un bloque potencial
+ * return -1 - No hay clave, inserto clave de nuevo bloques
+ * return 1 - Hubo falla de lectura de un nodo, Abortar
+ */
+int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query, int num_node) {
+
+ NODO_B_PLUS *nodo;
+ nodo = b_plus_leer_nodo(idx,num_node);
+ if (nodo == NULL) return 1;
+ int i = nodo->cant_claves - 1;
+ int exitcode = 0;
+
+ /* Si es un hoja, busco dentro de la hoja, otherwise, busco la hoja */
+ if (nodo->nivel == 0) {
+ /* Vemos en que bloque deberia ir */
+ while ( i >= 0 && query->clave.i_clave < nodo->claves[i] ) i--;
+ if (i < 0) {
+ /* La clave es menor que todas, debo insertarla */
+ b_plus_destruir_nodo(nodo);
+ emufs_b_plus_insertar(idx,query);
+ return -1;