X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/f9b69e3a1e52468f70386b29ed47f61568e8eca6..ec7edba15ba5510149162d9998bc1b7146ca249d:/emufs/b_plus.c?ds=inline diff --git a/emufs/b_plus.c b/emufs/b_plus.c index 863f070..a30058b 100644 --- a/emufs/b_plus.c +++ b/emufs/b_plus.c @@ -1,13 +1,11 @@ /** Arbol B+ */ #include "b_plus.h" -#define INDEXSPECS INDICE + /**#*#*#*#*#**#*#*#*#*#* Private prototypes*#*#*#*#*#**#*#*#*#*#**#*#*#*/ -/* numerando los bloques */ 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_leer_nodo(INDEXSPECS *idx, int num_node); NODO_B_PLUS *b_plus_crearnodo(INDEXSPECS *idx); int b_plus_destruir_nodo(NODO_B_PLUS *nodo); -/*int b_plus_insertar_clave(INDEXSPECS *idx, INDEX_DAT *query);*/ int b_plus_split_child(INDEXSPECS *idx, int numparent, NODO_B_PLUS *parent, int ithchild, NODO_B_PLUS *fullnode); int b_plus_insert_nonfull(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_nodo, INDEX_DAT *query); int b_plus_insertar(INDEXSPECS *idx, INDEX_DAT *query); @@ -15,7 +13,7 @@ int b_plus_get_num_nodo(INDEXSPECS *idx); /**#*#*#*#*#**#*#*#*#*#*FIN PROTOTYPES*#*#*#*#*#**#*#*#*#*#**#*#*#*#*#*/ /** Crea un nuevo nodo y lo inicializa */ -NODO_B_PLUS *b_plus_crearnodo(INDEXSPECS *idx) { +NODO_B_PLUS *b_plus_crearnodo(INDEX *idx) { NODO_B_PLUS *nodo = (NODO_B_PLUS*)malloc(sizeof(NODO_B_PLUS)); if (nodo == NULL) return NULL; @@ -59,78 +57,13 @@ int emufs_b_plus_crear(INDEXSPECS *idx) { return error; } -/* Inserta una nueva clave y reestructura el arbol para que quede como debe */ -int b_plus_insertar_clave(INDEXSPECS *idx, INDEX_DAT *query) -{ - NODO_B_PLUS *curnode, *padre; - int i,j, prox_nodo = 0; - - /* Comienzo leyendo la raiz, entry point de toda funcion */ - curnode = b_plus_leer_nodo(idx,0); - if (curnode == NULL) return -1; - padre = curnode; - while ( curnode->nivel > 0 && curnode ) { - for(i=0; icant_claves; i++){ - /* 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; - } - } - padre = curnode; - curnode = b_plus_leer_nodo(idx, prox_nodo); - } - /* aca tengo el nodo donde deberia ir la clave, y su padre */ - - if ( curnode->cant_claves < idx->size_claves/sizeof(int) ){ - int *claves_aux = (int*)malloc(idx->size_claves); - int *hijos_aux = (int*)malloc(idx->size_hijos); - memset(claves_aux,-1,idx->size_claves); - memset(hijos_aux,-1,idx->size_hijos); - i = 0; - while ( (curnode->claves[i] < query->clave.i_clave) && (i < curnode->cant_claves)){ - claves_aux[i] = curnode->claves[i]; - hijos_aux[i] = curnode->hijos[i]; - i++; - } - curnode->cant_claves++; - claves_aux[i] = query->clave.i_clave; - hijos_aux[i] = query->num_bloque; - for (j=i+1; jcant_claves; j++){ - claves_aux[j] = curnode->claves[j-1]; - hijos_aux[j] = curnode->hijos[j-1]; - } - free(curnode->claves); - free(curnode->hijos); - curnode->claves = claves_aux; - curnode->hijos = hijos_aux; - printf ("Prox Nodo es: %i\n",prox_nodo); - b_plus_grabar_nodo(idx, curnode, prox_nodo); - b_plus_destruir_nodo(curnode); - } - - /* si el nodo esta lleno tengo que splitear */ - if ( curnode->cant_claves == idx->size_claves ) - { - /**FIXME**/ - } - return 0; -} /** Busca el nro de bloque donde se debe guardar un reg con clave X. * Posibilidades: return 0 - Encontro un bloque potencial * return -1 - No hay clave, inserto clave de nuevo bloques * return 1 - Hubo falla de lectura de un nodo, Abortar */ -int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query, int num_node) { +int emufs_b_plus_get_bloque(INDEX *idx, INDEX_DAT *query, int num_node) { NODO_B_PLUS *nodo; nodo = b_plus_leer_nodo(idx,num_node); @@ -166,7 +99,7 @@ int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query, int num_node) { } } -NODO_B_PLUS *b_plus_leer_nodo(INDEXSPECS *idx, int num_node) { +NODO_B_PLUS *b_plus_leer_nodo(INDEX *idx, int num_node) { /*int i = 0;*/ FILE *fp; @@ -215,7 +148,7 @@ NODO_B_PLUS *b_plus_leer_nodo(INDEXSPECS *idx, int num_node) { } -int b_plus_grabar_nodo(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_node) +int b_plus_grabar_nodo(INDEX *idx, NODO_B_PLUS *nodo, int num_node) { FILE *fp; @@ -239,7 +172,7 @@ int b_plus_destruir_nodo(NODO_B_PLUS *nodo) return 0; } -int b_plus_split_child(INDEXSPECS *idx, int numparent, NODO_B_PLUS *parent, int ithchild, NODO_B_PLUS *fullnode) +int b_plus_split_child(INDEX *idx, int numparent, NODO_B_PLUS *parent, int ithchild, NODO_B_PLUS *fullnode) { /* locals */ int minclaves = ceil(idx->size_hijos/sizeof(int)/2)-1; @@ -293,7 +226,7 @@ int b_plus_split_child(INDEXSPECS *idx, int numparent, NODO_B_PLUS *parent, int } -int b_plus_insert_nonfull(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_nodo, INDEX_DAT *query) +int b_plus_insert_nonfull(INDEX *idx, NODO_B_PLUS *nodo, int num_nodo, INDEX_DAT *query) { int i, num_nodo_hijo; NODO_B_PLUS *hijo; @@ -330,7 +263,7 @@ int b_plus_insert_nonfull(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_nodo, INDE return 0; } -int emufs_b_plus_insertar(INDEXSPECS *idx, INDEX_DAT *query) +int emufs_b_plus_insertar(INDEX *idx, INDEX_DAT *query) { NODO_B_PLUS *raiz; @@ -354,7 +287,7 @@ int emufs_b_plus_insertar(INDEXSPECS *idx, INDEX_DAT *query) return 0; } -int b_plus_get_num_nodo(INDEXSPECS *idx) +int b_plus_get_num_nodo(INDEX *idx) { FILE *fp; int num;