+ /* 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;
+ }
+ }
+ 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.. */
+ if ( i == 0 ){
+ /*CREAR UN NODO NUEVO PARA METER UNA CLAVE MENOR A TODAS */
+ /* EL NUEVO NODO VA A SER UNA HOJA */
+ NODO_B_PLUS *new_nodo = b_plus_crearnodo(idx);
+ if (new_nodo == NULL){
+ PERR("NO SE PUDO CREAR EL NUEVO NODO");
+ return -1;
+ }
+ /* aumento la cantidad de claves */
+ new_nodo->cant_claves++;
+ /* inserto la clave en el nuevo nodo (es la primera)*/
+ new_nodo->claves[0] = query->clave.i_clave;
+ /* inserto la referencia al nuevo bloque, con un n */
+ new_nodo->hijos[0] = query->num_nuevo_bloque;
+ /* no le cambio el nivel porque es hoja ( por default == 0)*/
+ /* Aca viene la papota.. hay que hacer una funcion que meta un nodo
+ * en el arbol y lo reestructure correctamente.
+ * Ademas hay que grabar el registro en el .dat*/
+ b_plus_actualizar(curnode, new_nodo); /* le mando el padre.. seguro que lo voy a necesitar */
+ return 0;
+ } else {
+ query->num_bloque = curnode->hijos[i-1];
+ free(curnode);
+ return 0;
+ }
+ }