if (nodo->nivel == 0) {
/* Vemos en que bloque deberia ir */
while ( i >= 0 && query->clave.i_clave != nodo->claves[i].i_clave ) i--;
+ b_plus_destruir_nodo(nodo);
if (i < 0) return 0; /* No encontre la clave */
else return 1; /* Encontre la clave */
}
Exitcode: 1 - Encontre lo buscado, 0 - No lo encontre */
int b_plus_buscar_prepost(INDICE *idx, CLAVE key, int num_node, CLAVE *prepostkey, int search_type)
{
- int i = 0, j = 0;
+ int i = 0, exitcode = 0;
NODO_B_PLUS *nodo = b_plus_leer_nodo(idx,num_node);
if (nodo == NULL) return -1;
i = nodo->cant_claves - 1;
if (nodo->nivel == 0) {
- while ( i >= 0 && key.i_clave < nodo->claves[i].i_clave ) --i;
- /* Busco predecesor en la hoja */
+ PERR ("Entre en hoja");
+ while ( i >= 0 && key.i_clave < nodo->claves[i].i_clave ) --i;
switch (search_type) {
- case 0: if (i < 0) return 0;
+ /* Busco predecesor en la hoja */
+ case 0: if (i < 0) exitcode = 0;
else {
*prepostkey = nodo->claves[i];
- return 1;
+ exitcode = 1;
}
break;
-
- case 1: if (nodo->claves[i].i_clave == key.i_clave) return 0;
+
+ /* Busco sucesor en la hoja */
+ case 1: if ((nodo->claves[i].i_clave == key.i_clave) && (i == nodo->cant_claves-1)) exitcode = 0;
else {
*prepostkey = nodo->claves[i+1];
- return 1;
+ exitcode = 1;
}
break;
- }
-
- /* Busco sucesor en la hoja */
- if ((search_type == 1) && (i < 0)) return 0;
- else if (i >= 0) {
- *prepostkey = nodo->claves[i];
- return 1;
- }
+ }
+ /* Libero y devuelvo exitcode */
+ b_plus_destruir_nodo(nodo);
+ return(exitcode);
+
} else {
/* Veo por que rama debo seguir buscando el pre o post */
while ( i >= 0 && key.i_clave < nodo->claves[i].i_clave ) --i;
else {
/* Busco primero por la rama derecha, sino por la izquierda */
exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+2],prepostkey,search_type);
- if (exitcode == 0) exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],prepostkey,search_type);
+ if (exitcode == 0)
+ {
+ PERR("Volvi de rama derecha");
+ exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],prepostkey,search_type);
+ }
}
} else {
/* Busco un sucesor, y funciona como getbloque... */
+ PERR("Busco sucesor..., llamo recursivo..");
+ printf("Voy a buscar en hijo nro: %i\n",nodo->hijos[i+1]);
exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],prepostkey,search_type);
if (exitcode == 0) {
*prepostkey = nodo->claves[i+1];
exitcode = 1;
}
- }
-
+ }
}
return exitcode;