- 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;
- /* En query->num_bloque viene un numero de bloque nuevo valido..*/
- /* Le asigno al nodo del arbol el mismo numero que venia en query*/
- *(curnode->hijos) = query->num_bloque;
- /* Cargado el query salgo de la func, luego habra que actualizar el .dat */
- /*grabo el nodo en el archivo*/
- b_plus_grabar_nodo(idx, curnode, 0);
- /* librero el nodo */
- b_plus_destruir_nodo(curnode);
- return 0;
- }
- PERR("TENGO LA HOJA");
- /* 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;
- }
- }
- b_plus_destruir_nodo(curnode);
- curnode = b_plus_leer_nodo(idx, prox_nodo);
- }