예제 #1
0
        /**Inserta un  bloque en la Organización hash dinámica*/
        private bool InsBloque(CBloque b)
        {
            CCubeta cubetaAux, nuevaCubeta;
            CBloque bAux;
            int entrada;
            bool res;

            cubetaSel = entrada = ConvertDecimal(tHashExt, b.ConvertClaveToBinary());//Se determina su posición en la tabla Hash
            cubetaAux = tHashExt.getAtEntrada(entrada).getCubeta();//Se lee la cubeta em la entrada corrrespondiente

            if ((res = Repetidos(b, cubetaAux)) == false)//Validación para repetidos
                if (cubetaAux.InsertaClave(b.getDir(), FuncionHash(b)) == true)
                {
                    //Se escribe la cubeta con la nueva información
                    getArchivo().EscribeCubeta(cubetaAux);
                    getArchivo().EscribeBloque(b, b.getDir());
                }
                else
                {
                    //Se checan los prefijos de asociación entre la tabla hash y una de las cubetas
                    if (tHashExt.getPrefAsociacion() == cubetaAux.getPrefAsoc())
                    {
                        tHashExt.incPrefAsociacion();
                        tHashExt.Incrementate(getArchivo());
                    }

                    //Inicialización de la nueva cubeta
                    nuevaCubeta = new CCubeta(-1, TAM_CUBETA);
                    cubetaAux.IncPrefAsoc();
                    nuevaCubeta.setPrefAsoc(cubetaAux.getPrefAsoc());
                    getArchivo().EscribeCubeta(cubetaAux);
                    nuevaCubeta.setDir(getArchivo().ENDF());
                    ActualizaEntradas(cubetaAux, nuevaCubeta);
                    getArchivo().EscribeCubeta(nuevaCubeta);

                    //Se sacan todas las claves de la cubeta que se partio y se 
                    //Redistribuyen en todas las cubetas y la nueva cubeta creada.
                    for (int i = 0; i < cubetaAux.getTamaño(); i++)
                    {
                        bAux = getArchivo().leerBloque(cubetaAux.getAtDirBloque(i), tamBloque);
                        bAux.setTamAtri(tamAtri);
                        bAux.setTipoCA(tipoDato);
                        bAux.setDesp(desp);
                        bAux.setTamBlo(tamBloque);
                        cubetaAux.eliminaClave(i, cubetaAux.getAtDirBloque(i));
                        getArchivo().EscribeCubeta(cubetaAux);
                        res = InsBloque(bAux);
                    }

                    b.setDir(getArchivo().ENDF());
                    InsBloque(b);
                }
        
            return (res);
        }
예제 #2
0
        /**´Méetodo principal para llevar a cabo la inserción de algun bloque*/
        public bool Alta_HashDinamica(CNodoEntidad e, CBloque b)
        {
            /**
             * \param e Entidad a la que pertrnece el bloque
             * \param b Bloque Nuevo bloque a insertar
             * \return Retorna Falso(Si tuvo exito), True(Si ya existe el bloque alguna cubeta)
             * */
            CCubeta cubetaAux;
            CEntrada entradaAux;
            bool res = false;

            if (e.getApCabDatos() == -1)
            {
                tHashExt = new CTablaHashExt(); 
                cubetaAux = new CCubeta(-1, TAM_CUBETA); 
                entradaAux = new CEntrada(cubetaAux, -1);
                
                tHashExt.insEntrada(entradaAux);

                cubetaAux.setDir(getArchivo().ENDF());
                getArchivo().EscribeCubeta(cubetaAux);

                entradaAux.setDirCubeta(cubetaAux.getDir());
                entradaAux.setDir(getArchivo().ENDF());
                getArchivo().EscribeEntrada(entradaAux);

                tHashExt.setCabEntradas(entradaAux.getDir());
                tHashExt.setDir(getArchivo().ENDF());
                getArchivo().EscribeTablaHashExt(tHashExt);

                e.setApCabDatos(tHashExt.getDir());
                getArchivo().escribeEntidad(e, e.getDir());
            }
            else
                tHashExt = getArchivo().LeerTablaHashExt(e.getApCabDatos());

            b.setDir(getArchivo().ENDF());
         
            if ((res = InsBloque(b)) == false)
            {
                tHashExt.incNumReg();
                getArchivo().EscribeTablaHashExt(tHashExt);
            }

            return (res);
        }
예제 #3
0
        /**Crea cada uno de los nodos de arbol en forma recursiva, asindo un recorrido en preorden
         * y va agranagando todos estos nodos al nuevo archivo*/
        public long generaArbolRec(CArchivo aO, CArchivo aD, int tamBloque, long dirCab)
        {
            CNodo nodoAux, nuevoNodo;
            CBloque bloqueAux,bloqueNuevo;
            long dirNodo = -1;
            int LS;

            if (dirCab != -1)
            {
                nodoAux = aO.leerNodo(dirCab);
                nuevoNodo = creaNodo(aO,aD,nodoAux);
                
                if (nodoAux.getTipoNodo() == HOJA || nodoAux.getTipoNodo() == RAIZHOJA)
                    LS = nodoAux.getNumElemnt();
                else
                    LS = nodoAux.getNumElemnt() + 1;

                for (int i = 0; i < LS; i++)
                    if (nodoAux.getTipoNodo() == HOJA || nodoAux.getTipoNodo() == RAIZHOJA)
                    {
                        bloqueAux = aO.leerBloque(nodoAux.getAtDirNodo(i), tamBloque);
                        bloqueNuevo = new CBloque();
                        bloqueNuevo.setBloque(bloqueAux.getBloque());
                        bloqueNuevo.setTamBlo(tamBloque);
                        bloqueNuevo.setDir(aD.ENDF());
                        aD.EscribeBloque(bloqueNuevo, aD.ENDF());
                        nuevoNodo.setAtDirNodo(i, bloqueNuevo.getDir());
                    }
                    else
                       nuevoNodo.setAtDirNodo(i,generaArbolRec(aO,aD,tamBloque,nodoAux.getAtDirNodo(i)));

               aD.escribeNodo(nuevoNodo);
               dirNodo = nuevoNodo.getDir();
             
            }

            return(dirNodo);   
        }
예제 #4
0
        /**Se lee un bloque da datos desde un archivo
         * \param pos Posicion donde inicia el bloque da datos
         * \param tam Tamaño de este boque*/
        public CBloque leerBloque(long pos, int tam)
        {
            CBloque bloqueAux = new CBloque();
            byte[] bloque;

            if (pos == -1)
                return (null);
             
            br.BaseStream.Seek(pos, SeekOrigin.Begin);
            bloqueAux.setDir(br.ReadInt64());
            bloque = br.ReadBytes(tam);
            bloqueAux.setBloque(bloque);

            return (bloqueAux);
        }
예제 #5
0
        /**Copia toda la lista de bloques al nuevo archivo*/
        public void CopiarSec(CArchivo fileOri, CArchivo fileNew, long dirEnt, int tamBloque, ref List<CBloque> listBloque)
        {
            CBloque bloqueAux, bloqueNuevo;
            
            while (dirEnt != -1)
            {
                bloqueAux = fileOri.leerBloque(dirEnt, tamBloque);
                bloqueNuevo = new CBloque();
                bloqueNuevo.setBloque(bloqueAux.getBloque());
                bloqueNuevo.setTamBlo(tamBloque);
                bloqueNuevo.setDir(fileNew.ENDF());
                fileNew.EscribeBloque(bloqueNuevo, fileNew.ENDF());
                listBloque.Add(bloqueNuevo);
                dirEnt = bloqueAux.getSigBlo();
            }

            for (int i = 0; i < listBloque.Count - 1; i++)
            {
                listBloque[i].setSigBlo(listBloque[i + 1].getDir());
                fileNew.EscribeBloque(listBloque[i], listBloque[i].getDir());
            }
        }