/**Inicialización de sus atributos*/
 public CEntrada(CCubeta c,long miDir)
 {
     dir = miDir;
     dirCubeta = c.getDir();
     sigEntrada = -1;
     cubeta = c;
 }
        /**Modifica la información de alguna entrada*/
        public void ActualizaEntradas(CCubeta cubAux, CCubeta nueva )
        {
            CEntrada entAux;
            int nEnt, tamHash;

            tamHash = tHashExt.getListEntradas().Count;
            nEnt = (int)Math.Pow(2, (double)(tHashExt.getPrefAsociacion() - cubAux.getPrefAsoc()));

            for (int i = tamHash - 1; i >= 0 && nEnt != 0; i--)
            {
                entAux = tHashExt.getAtEntrada(i);
                if (entAux.getCubeta() == cubAux)
                {
                    entAux.setCubeta(nueva);
                    nEnt--;
                    getArchivo().EscribeEntrada(entAux);
                }
            }
        }
        private bool Repetidos(CBloque b, CCubeta cubeta)
        {
            CBloque bAux;

            for (int i = 0; i < cubeta.getTamaño(); i++)
            {
                bAux = getArchivo().leerBloque(cubeta.getAtDirBloque(i), b.getTamBlo());

                if (bAux != null && (b.ComparateTo(bAux) == 0))
                    return (true);
            }
            return (false);
        }
        /**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);
        }
        /**´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);
        }
 public void setCubeta(CCubeta nueva)
 {
     cubeta = nueva;
     setDirCubeta(nueva.getDir());
 }
        /**Lectura de una cubeta que se utilizara en el Hash Dinamica*/
        public CCubeta LeerCubeta(long dir)
        {
            CCubeta cubetaAux = null;

            if (dir != -1)
            {
                cubetaAux = new CCubeta();

                br.BaseStream.Seek(dir, SeekOrigin.Begin);

                cubetaAux.setDir(br.ReadInt64());
                cubetaAux.setTamaño(br.ReadInt32());
                cubetaAux.setNumDirBloques(br.ReadInt32());
                cubetaAux.setPrefAsoc(br.ReadInt32());

                cubetaAux.creaVectDirReg(cubetaAux.getTamaño());

                for (int i = 0; i < cubetaAux.getTamaño(); cubetaAux.setAtDirBloque(i, br.ReadInt64()), i++) ;
            }
            
            return (cubetaAux);
        }
        /**Se escribe un objeto cubeta de la organizacion Hash Dinamica en el archivo de trabajo
         * \param cubeta Cubeta a escribir, ya cuenta con su direccion en el archivo*/
        public void EscribeCubeta(CCubeta cubeta)
        {
            bw.BaseStream.Seek(cubeta.getDir(), SeekOrigin.Begin);

            bw.Write(cubeta.getDir());
            bw.Write(cubeta.getTamaño());
            bw.Write(cubeta.getNumDirBloques());
            bw.Write(cubeta.getPrefAsoc());

            for (int i = 0; i < cubeta.getTamaño(); bw.Write(cubeta.getAtDirBloque(i)), i++) ;
        }
Exemple #9
0
        private List<int> buscaEntradas(CTablaHashExt tH, CCubeta cub)
        {
            List<int> L;
            int numEnt;

            L = new List<int>();
            numEnt = (int)Math.Pow((int)2,((int)(tH.getPrefAsociacion()-cub.getPrefAsoc())));

            foreach (CEntrada e in tH.getListEntradas())
                if (numEnt > 0)
                {
                    if (e.getCubeta() == cub)
                    {
                        L.Add(e.getID());
                        numEnt--;
                    }
                }
                else
                    break;

           return(L);

        }
Exemple #10
0
        private CCubeta creaCubeta(CCubeta c, CArchivo aN, CArchivo aO)
        {
            CCubeta nuevaCub;
            CBloque bloqAux;

            nuevaCub = new CCubeta(aN.ENDF(), c.getTamaño());

            nuevaCub.setNumDirBloques(c.getNumDirBloques());
            nuevaCub.setPrefAsoc(c.getPrefAsoc());

            for (int i = 0; i < c.getTamaño(); i++)
                if ((bloqAux = aO.leerBloque(c.getAtDirBloque(i), tamBloque)) != null)
                {
                    bloqAux.setTamBlo(tamBloque);
                    nuevaCub.setAtDirBloque(i, aN.ENDF());
                    aN.EscribeBloque(bloqAux, aN.ENDF());
                }

            nuevaCub.setDir(aN.ENDF());
            aN.EscribeCubeta(nuevaCub);

            return (nuevaCub);
        }