X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/568a401891b45d9764b41e5c2091a55178691611..a666806d9361a2876a07941b8d2bb5c973e1557e:/emufs/indice_bplus.c?ds=sidebyside diff --git a/emufs/indice_bplus.c b/emufs/indice_bplus.c index 23a6f31..7165daf 100644 --- a/emufs/indice_bplus.c +++ b/emufs/indice_bplus.c @@ -305,6 +305,7 @@ int b_plus_existe_clave(INDICE *idx, INDEX_DAT *query, int num_node) 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 */ } @@ -327,40 +328,36 @@ int b_plus_cant_claves_nodo(INDICE *idx, int num_node) } /* Search_Type: 0 - Predecesor, 1 - Sucesor - Exitcode: 1 - Encontre lo buscado, 0 - No lo encontre */ + Exitcode: 1 - Encontre lo buscado, 0 - No lo encontre, -1 Error */ 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 */ + printf ("Entre en hoja nro %i\n",num_node); + while ( i >= 0 && key.i_clave < nodo->claves[i].i_clave ) --i; switch (search_type) { - case 0: if (i < 0) return 0; - else { - *prepostkey = nodo->claves[i]; - return 1; + /* Busco predecesor en la hoja */ + case 0: if (i <= 0) exitcode = 0; + else { + if (nodo->claves[i].i_clave == key.i_clave) *prepostkey = nodo->claves[i-1]; + else *prepostkey = nodo->claves[i]; + 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; - } + } } else { /* Veo por que rama debo seguir buscando el pre o post */ while ( i >= 0 && key.i_clave < nodo->claves[i].i_clave ) --i; @@ -368,21 +365,28 @@ int b_plus_buscar_prepost(INDICE *idx, CLAVE key, int num_node, CLAVE *prepostke if (i < 0) exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],prepostkey,search_type); 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); + exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i+1],prepostkey,search_type); + if (exitcode == 0) + exitcode = b_plus_buscar_prepost(idx,key,nodo->hijos[i],prepostkey,search_type); } + /* Handleo busqueda de clave menor o igual que todas */ + if (exitcode == 0) exitcode = -1; } else { /* Busco un sucesor, y funciona como getbloque... */ + 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; - } - } - + /* Veo si tengo que devolver la clave izquierda del padre del que acabo de buscar */ + if (exitcode == 0) + if (i < nodo->cant_claves-1) { + *prepostkey = nodo->claves[i+1]; + exitcode = 1; + } else exitcode = -1; + } } - return exitcode; + /* Libero y devuelvo exitcode */ + b_plus_destruir_nodo(nodo); + return(exitcode); } int emufs_b_plus_eliminar(INDICE *idx, CLAVE key, int num_node)