From: Alan Kennedy Date: Wed, 26 May 2004 01:24:54 +0000 (+0000) Subject: Somos RE GROSOS con Nico y insertamos jodidamente en el B+ X-Git-Tag: svn_import_r684~189 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/6aef50b3527d53caf1e701c665676deb8c2d79e0 Somos RE GROSOS con Nico y insertamos jodidamente en el B+ --- diff --git a/emufs/b_plus.c b/emufs/b_plus.c index f061515..3fd6f18 100644 --- a/emufs/b_plus.c +++ b/emufs/b_plus.c @@ -287,6 +287,7 @@ int b_plus_split_child(INDEXSPECS *idx, int numparent, NODO_B_PLUS *parent, int { /* locals */ int minclaves = ceil(idx->size_hijos/sizeof(int)/2)-1; + int maxhijos = idx->size_hijos/sizeof(int); int numbrother,j = 0; int es_interno = 1; @@ -305,15 +306,18 @@ int b_plus_split_child(INDEXSPECS *idx, int numparent, NODO_B_PLUS *parent, int for (j = 0; j < brother->cant_claves; ++j) brother->claves[j] = fullnode->claves[j+minclaves+es_interno]; - /* Copio los hijos ya sea para hoja o no hoja. Copia Chain Also! */ - for (j = 0; j < brother->cant_claves+1; ++j) + /* Copio los hijos ya sea para hoja o no hoja. */ + for (j = 0; j < brother->cant_claves; ++j) brother->hijos[j] = fullnode->hijos[j+minclaves+es_interno]; + /* Encadeno nodos! */ + brother->hijos[maxhijos-1] = fullnode->hijos[maxhijos-1]; + /* Ahora me ocupo del nodo que se partio */ fullnode->cant_claves = minclaves; /* Obtengo numero de nodo para brother, para encadenar */ numbrother = b_plus_get_num_nodo(idx); - fullnode->hijos[idx->size_hijos/sizeof(int)-1] = numbrother; + fullnode->hijos[maxhijos-1] = numbrother; /* Ahora fixeamos el padre, apuntando al nuevo hijo */ for (j = parent->cant_claves; j > ithchild; --j) @@ -331,6 +335,8 @@ int b_plus_split_child(INDEXSPECS *idx, int numparent, NODO_B_PLUS *parent, int b_plus_grabar_nodo(idx,brother,numbrother); b_plus_grabar_nodo(idx,parent,numparent); + b_plus_destruir_nodo(brother); + return 0; } @@ -351,8 +357,6 @@ int b_plus_insert_nonfull(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_nodo, INDE nodo->hijos[i+1] = query->num_bloque; nodo->cant_claves++; b_plus_grabar_nodo(idx, nodo, num_nodo); - b_plus_destruir_nodo(nodo); - printf("Pero men yo grabee..\n"); } else { while ( i >= 0 && query->clave.i_clave < nodo->claves[i] ) i--; @@ -364,10 +368,10 @@ int b_plus_insert_nonfull(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_nodo, INDE if ( query->clave.i_clave > nodo->claves[i] ) i++; } - b_plus_destruir_nodo(hijo); + if (hijo) b_plus_destruir_nodo(hijo); hijo = b_plus_leer_nodo(idx, nodo->hijos[i]); b_plus_insert_nonfull(idx, hijo, nodo->hijos[i], query); - b_plus_destruir_nodo(hijo); + if (hijo) b_plus_destruir_nodo(hijo); } return 0; @@ -386,11 +390,14 @@ int b_plus_insertar(INDEXSPECS *idx, INDEX_DAT *query) b_plus_grabar_nodo(idx, new_root, 0); b_plus_split_child(idx, 0, new_root, 0, raiz); b_plus_insert_nonfull(idx, new_root, 0, query); + b_plus_destruir_nodo(new_root); } else { printf ("Entre maaaaaallll\n"); b_plus_insert_nonfull(idx, raiz, 0, query); } + + b_plus_destruir_nodo(raiz); return 0; } diff --git a/emufs/b_plus_test.c b/emufs/b_plus_test.c index ccb5573..bf7a075 100644 --- a/emufs/b_plus_test.c +++ b/emufs/b_plus_test.c @@ -5,8 +5,8 @@ int main(int argc, char* argv[]) { /* Locals */ INDEX_DAT querydata; -NODO_B_PLUS *memnodo; -int num_node, i; +/*NODO_B_PLUS *memnodo; +int num_node, i; */ /* Creamos un handler EMUFS, luego un Indice B+ y testing... */ INDEXSPECS indice; indice.tam_bloque = SIZE_B_PLUS_HEADER + sizeof(int)*5 + sizeof(int)*6; @@ -17,26 +17,26 @@ printf("\nTam Nodo: %i Size Claves: %i Size_Hijos: %i\n",indice.tam_bloque,ind emufs_b_plus_crear(&indice); querydata.num_bloque = 9; -querydata.clave.i_clave = 5; +querydata.clave.i_clave = 8; b_plus_insertar(&indice,&querydata); querydata.num_bloque = 2; -querydata.clave.i_clave = 4; +querydata.clave.i_clave = 7; b_plus_insertar(&indice,&querydata); querydata.num_bloque = 7; -querydata.clave.i_clave = 3; +querydata.clave.i_clave = 5; b_plus_insertar(&indice,&querydata); querydata.num_bloque = 5; -querydata.clave.i_clave = 2; +querydata.clave.i_clave = 3; b_plus_insertar(&indice,&querydata); querydata.num_bloque = 8; querydata.clave.i_clave = 63; b_plus_insertar(&indice,&querydata); -num_node = 0; +/*num_node = 0; memnodo = b_plus_leer_nodo(&indice, num_node); printf("Dumping Node_%i\n",num_node); printf("Nivel: %i Cant Claves: %i\n",memnodo->nivel,memnodo->cant_claves); @@ -45,10 +45,26 @@ memnodo = b_plus_leer_nodo(&indice, num_node); printf("\nHijos:"); for (i = 0; i < indice.size_hijos/sizeof(int); ++i) printf(" %i",memnodo->hijos[i]); printf("\nEnd Dump\n"); -free(memnodo); +free(memnodo);*/ -/*querydata.num_bloque = 54; -querydata.clave.i_clave = 15; +querydata.num_bloque = 54; +querydata.clave.i_clave = 1; +b_plus_insertar(&indice, &querydata); + +querydata.num_bloque = 12; +querydata.clave.i_clave = 2; +b_plus_insertar(&indice, &querydata); + +querydata.num_bloque = 14; +querydata.clave.i_clave = 0; +b_plus_insertar(&indice, &querydata); + +querydata.num_bloque = 22; +querydata.clave.i_clave = 4; +b_plus_insertar(&indice, &querydata); + +/*querydata.num_bloque = 6; +querydata.clave.i_clave = 100; b_plus_insertar(&indice, &querydata);*/ return 0;