From: Nicolás Dimov Date: Tue, 18 May 2004 20:51:54 +0000 (+0000) Subject: Intento de buscar el numero de bloque donde deberia ir una clave nueva, no esta teste... X-Git-Tag: svn_import_r684~228 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/990a2380d0acd43cfb5a867f77bdc460bab90769?ds=inline Intento de buscar el numero de bloque donde deberia ir una clave nueva, no esta testeado y faltan verificar casos. --- diff --git a/emufs/Makefile b/emufs/Makefile index 2e0dbf5..b3969fe 100644 --- a/emufs/Makefile +++ b/emufs/Makefile @@ -1,9 +1,9 @@ CFLAGS=-Wall -g -ansi -pedantic -DDEBUG LDFLAGS=-lm -EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o indices.o indice_b.o +EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o indices.o indice_b.o b_plus.o -TARGETS=libemufs.a tipo1_main tipo2_main tipo3_main b_test +TARGETS=libemufs.a tipo1_main tipo2_main tipo3_main b_plus_test all: $(TARGETS) @@ -14,6 +14,7 @@ tipo2_main: tipo2_main.o $(EMUFS_COMMON) tipo3_main: tipo3_main.o $(EMUFS_COMMON) b_plus_test: b_plus_test.o b_plus.o + #b_plus_test: b_plus_test.o b_plus.o indices.o emufs.o #b_test: b_test.o indice_b.o diff --git a/emufs/b_plus.c b/emufs/b_plus.c index 0e84bcd..5a93927 100644 --- a/emufs/b_plus.c +++ b/emufs/b_plus.c @@ -2,10 +2,19 @@ #include "b_plus.h" /* Private prototypes */ +/* numerando los bloques */ +static int nuevo_bloque = -1; +int get_new_block_number(); int b_plus_grabar_nodo(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_node); NODO_B_PLUS *b_plus_leer_nodo(INDEXSPECS *idx, int num_node); NODO_B_PLUS *b_plus_crearnodo(INDEXSPECS *idx); +/** Me devuelve un numero de bloque nuevo */ +int get_new_block_number() +{ + nuevo_bloque++; + return nuevo_bloque; +} /** Crea un nuevo nodo y lo inicializa */ NODO_B_PLUS *b_plus_crearnodo(INDEXSPECS *idx) { @@ -55,20 +64,72 @@ int emufs_b_plus_crear(INDEXSPECS *idx) { int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query) { 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 es el primero que se inserta */ + 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; + /* Debo obtener un numero de bloque para devolverle al query!!! */ + /* por ahora el nuevo bloque se va incrementando, sin recuperacion de vacios FIX*/ + query->num_bloque = get_new_block_number(); + /* Le asigno al nodo del arbol el mismo numero que devolvi */ + *(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*/ + /* librero el nodo */ + free(curnode); + return 0; + } /* Mientras no encontre la hoja con la clave, busco.. */ - while ((curnode->nivel > 0) && curnode) - { - + /* RECORDAR QUE LAS CLAVES DEBEN ESTAR ORDENADAS PARA QUE ESTO FUNCIONE !! */ + while (curnode->nivel > 0) + { /*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!!!!*/ + /* 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; + } + } + 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] ){ + if ( curnode->cant_claves != i ) /* si no es la ultima clave */ + continue; + else { /* si era la ultima */ + /* cargo en query el numero del bloque donde deberia ir la nueva clave */ + query->num_bloque = curnode->hijos[i]; + free(curnode); + return 0; + } + } 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; + } } - + free(curnode); - return 0; }