/**Manda un dato hasta la pagina hoja y escribir el bloque de datos en esta, en forma recursiva*/ public bool EmpujaDato(long dirNodo, ref Object clave, ref long dirClave, CBloque b, long posB, ref CNodo nueva, ref bool bandera) { CNodo nodoAux = null; int i, res = -1; bool band = true; int tipoPagina = HOJA; nodoAux = getArchivo().leerNodo(dirNodo);//Se lee la pagina for ( i = 0; i < nodoAux.getNumElemnt(); i++) //Serecorren las direccion de sus descendientes(Direcciones a otros nodos) if ((res = nodoAux.comparaClave(i,clave)) != -1) break; if (res == 0) if (nodoAux.getTipoNodo() == RAIZHOJA || nodoAux.getTipoNodo() == HOJA) return (false); else i++; if(band) { if (nodoAux.getTipoNodo() == RAIZHOJA || nodoAux.getTipoNodo() == HOJA)//Estamos en una hoja { if (nodoAux.getNumElemnt() == 2 * GRADO) { tipoPagina = HOJA; nueva = particiona(nodoAux, b, posB, ref clave, ref dirClave, i); bandera = true; } else { nodoAux.insClaveOrd(clave, b, getArchivo(), i); getArchivo().escribeNodo(nodoAux); } } else { //Llamada recursiva band = EmpujaDato(nodoAux.getAtDirNodo(i), ref clave, ref dirClave, b, posB, ref nueva, ref bandera); if (bandera == true) { if (nodoAux.getNumElemnt() == 2 * GRADO) { tipoPagina = nodoAux.getTipoNodo(); nueva = particiona(nodoAux, b, nueva.getDir(), ref clave, ref dirClave, i); } else//Hay espacio para insertar la clave que sube { bandera = false; nodoAux.insClaveOrd(clave, b, getArchivo(), i); nodoAux.setAtDirClaves(i, dirClave); nodoAux.setAtDirNodo(i + 1, nueva.getDir()); getArchivo().escribeNodo(nodoAux); } } } } return (band); }
/**Escribe un objeto CNodo utilizado en Arbol B+*/ public void escribeNodo(CNodo nuevo) { bw.BaseStream.Seek(nuevo.getDir(), SeekOrigin.Begin); bw.Write(nuevo.getDir()); bw.Write(nuevo.getTipoNodo()); bw.Write(nuevo.getNumElemnt()); bw.Write(nuevo.getGrado()); bw.Write(nuevo.getTipoClave()); //Escribir la dir de las paginas u hojas for (int i = 0; i < (nuevo.getGrado() * 2) + 1; i++) bw.Write(nuevo.getAtDirNodo(i)); //Escribir la dir de las llaves de las paginas del arbol for (int i = 0; i < nuevo.getGrado() * 2; i++) bw.Write(nuevo.getAtDirClaves(i)); }
/**Metodo principal para la inserción de la clave junto con su bloque de datos*/ public bool AltaArbolBplus(CNodoEntidad e, CBloque b, long posB) { CNodo nuevo = null; Object clave; bool res = true; long dirClave = -1; clave = b.dameClavePrim(); if (e.getApCabDatos() == -1)//Si no hay algun arbol se crea la primera pagina { nuevo = new CNodo(RAIZHOJA, GRADO); nuevo.setDir(getArchivo().ENDF()); nuevo.setTipoClave(b.getTipoCA()); getArchivo().escribeNodo(nuevo); e.setApCabDatos(nuevo.getDir()); getArchivo().escribeEntidad(e, e.getDir()); } else { bool bandera = false; res = EmpujaDato(e.getApCabDatos(), ref clave, ref dirClave, b, posB, ref nuevo, ref bandera); if (bandera == true)//La raiz se partido { CNodo nuevaRaiz; nuevaRaiz = new CNodo(RAIZ, GRADO); nuevaRaiz.setAtClave(0, clave); nuevaRaiz.setAtDirClaves(0, dirClave); nuevaRaiz.setAtDirNodo(0, ent.getApCabDatos()); nuevaRaiz.setAtDirNodo(1, nuevo.getDir()); nuevaRaiz.setDir(getArchivo().ENDF()); nuevaRaiz.setNumElemnt(1); nuevaRaiz.setTipoClave(b.getTipoCA()); getArchivo().escribeNodo(nuevaRaiz); e.setApCabDatos(nuevaRaiz.getDir()); getArchivo().escribeEntidad(e, e.getDir()); } } return (res); }