From 347f484f4959765335f19d6e69dd8df300956014 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicol=C3=A1s=20Dimov?= Date: Tue, 18 May 2004 22:51:14 +0000 Subject: [PATCH] Puliendo un poco para que no se cuelgue --- emufs/b_plus.c | 32 ++++++++++++++++++++++---------- emufs/b_plus.h | 6 ++++++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/emufs/b_plus.c b/emufs/b_plus.c index 5a93927..1f99463 100644 --- a/emufs/b_plus.c +++ b/emufs/b_plus.c @@ -69,7 +69,7 @@ int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query) { 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*/ @@ -83,6 +83,8 @@ int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query) { *(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; @@ -90,11 +92,11 @@ int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query) { /* 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; icant_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 */ @@ -110,9 +112,10 @@ int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query) { 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; icant_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 */ @@ -123,13 +126,17 @@ int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query) { } } 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; } @@ -193,3 +200,8 @@ int b_plus_grabar_nodo(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_node) return 0; } + +int emufs_b_plus_insertar_clave(INDEX_DAT *dataset) +{ + return 0; +} diff --git a/emufs/b_plus.h b/emufs/b_plus.h index 9c4aa39..564c3ae 100644 --- a/emufs/b_plus.h +++ b/emufs/b_plus.h @@ -34,6 +34,12 @@ typedef struct nodo_b_plus { 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(); -- 2.43.0