Пример #1
0
        /**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);
        }
Пример #2
0
        /**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));
        }
Пример #3
0
        /**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);
        }