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 */
+ /* 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->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)
+ 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++){ /* ojo si la cant_claves es cero!!!!*/
+ for(i=0; i<curnode->cant_claves; i++){
/* me fijo que si es mayor */
- if ( (query->clave.i_clave >= curnode->claves[i])) {
+ 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 */
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] ){
+ 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 */
}
} 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;
+ if ( i == 0 )
+ /*CREAR UN NODO NUEVO PARA METER UNA CLAVE MENOR A TODAS */
+ else {
+ query->num_bloque = curnode->hijos[i-1];
+ free(curnode);
+ return 0;
+ }
}
}
- free(curnode);
+ if (curnode) free(curnode);
return 0;
}
return 0;
}
+
+int emufs_b_plus_insertar_clave(INDEX_DAT *dataset)
+{
+ return 0;
+}
int emufs_b_plus_crear(INDEXSPECS *idx);
int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *dataset);
int emufs_b_plus_actualizar_nodo(INDEX_DAT *dataset);
+
+/** inserta una clave en el arbol y devuelve en dataset->num_bloque el
+ bloque donde se insertara en el .dat*/
+int emufs_b_plus_insertar_clave(INDEX_DAT *dataset);
+
+
int emufs_b_plus_buscar();
int emufs_b_plus_destuir();