/**Elimina un bloque el forma logica y fisica*/
        public bool EliminaBloque(CBloque b, CTablaHashExt tH)
        {
            CEntrada entradaAux;
            CCubeta cubetaAux;
            int numEnt;
            bool res, band = false ;

            numEnt = ConvertDecimal(tH,b.ConvertClaveToBinary());//Se obtiene la poscion de la entrada
            entradaAux = tH.getListEntradas()[numEnt];//Se carga la entrada
            cubetaAux = entradaAux.getCubeta();

            //Se elimina la clave de cuebta leida
            res = cubetaAux.eliminaClave(FuncionHash(b), b, getArchivo());
            getArchivo().EscribeCubeta(cubetaAux);
            tH.decNumReg();
            getArchivo().EscribeTablaHashExt(tH);

            if (res == true)//Si es verdadero es porque la cubeta se quedo vacia
                if (tH.getPrefAsociacion() == 0)
                    band = true;
                else
                    if (cubetaAux.getPrefAsoc() == tH.getPrefAsociacion())//Se checa los estados de prefijos, en la cubeta y la tabla hash
                    {
                        entradaAux.setCubeta(tH.getAtEntrada(entradaAux.getEspejo()).getCubeta());
                        getArchivo().EscribeEntrada(entradaAux);
                        entradaAux.getCubeta().DecPrefAsoc();
                        getArchivo().EscribeCubeta(entradaAux.getCubeta());

                        while (!tH.validaPrefijos())
                            tH.Doblate(getArchivo());

                        if (tH.getNumReg() == 0)
                            band = true;
                    }

        return (band);
        }
        private void ImprimeTablaHash(long dir)
        {
            dGTablaHash.Rows.Clear();
            dGCubeta.Rows.Clear();
            tablaDatos.Rows.Clear();
            btI.Text = "";
            btIJ.Text = "";

            if (dir != -1)
            {
                tHashExt = getArchivo().LeerTablaHashExt(dir);
                btI.Text = "i = " + tHashExt.getPrefAsociacion().ToString();

                for (int nC = 0, i = 0; i < tHashExt.getListEntradas().Count; i++, nC++)
                {
                    dGTablaHash.Rows.Add();
                    dGTablaHash.Rows[i].HeaderCell.Value = nC.ToString();
                    dGTablaHash.Rows[i].Cells[0].Value = tHashExt.getAtEntrada(i).getDirCubeta().ToString();
                }

                ImprimeCubeta(0);
            }
        }
        /**Convierte una clave primaria(Binaria) a su representación decimal*/
        private int ConvertDecimal(CTablaHashExt tH , string cad)
        {
            int cont = cad.Length;
            int dec = 0;

            for (int i = tH.getPrefAsociacion(); i > 0 && cont != 0; i--, cont--)
                if (cad[cont - 1] != '0')
                    dec = dec + (int)(Math.Pow(2, (double)(cad.Length - cont)));

            return (dec);
        }
Example #4
0
        /**Busca una cubeta en la tabla Hash Extendible*/
        private int buscaCubeta(long dirCub, CTablaHashExt tH)
        {
            foreach (CEntrada e in tH.getListEntradas())
                if (e.getDirCubeta() == dirCub)
                    return (tH.getListEntradas().IndexOf(e));

            return (-1);
        }
        /**´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);
        }
Example #6
0
        /**Se lee una objeto de la clase CTablaHashExt que sera utilizada el la Hash Dinámica*/
        public CTablaHashExt LeerTablaHashExt(long dir)
        {
            CTablaHashExt tExt;
            CEntrada entradaAux;
            CCubeta cubetaAux;
            long aux;
            int posCub;

            entradaAux = null;
            tExt = null;

            if (dir != -1)
            {
                tExt = new CTablaHashExt();

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

                tExt.setDir(br.ReadInt64());
                tExt.setPrefAsociacion(br.ReadInt32());
                tExt.setCabEntradas(br.ReadInt64());
                tExt.setNumReg(br.ReadInt32());

                aux = tExt.getCabEntradas();
                
                while (aux != -1)
                {
                    entradaAux = LeerEntrada(aux);
                    cubetaAux = LeerCubeta(entradaAux.getDirCubeta());

                    if ((posCub = buscaCubeta(cubetaAux.getDir(), tExt)) == -1)
                        entradaAux.setCubeta(cubetaAux);
                    else
                        entradaAux.setCubeta(tExt.getAtEntrada(posCub).getCubeta());

                    tExt.insEntrada(entradaAux);
                    aux = entradaAux.getSigEntrada();
                }
            }

            return (tExt);
        }
Example #7
0
        /**Se escribe la tabla hash extendible de la organización hash dinámica*/
        public void EscribeTablaHashExt(CTablaHashExt t)
        { 
            bw.BaseStream.Seek(t.getDir(), SeekOrigin.Begin);

            bw.Write(t.getDir());
            bw.Write(t.getPrefAsociacion());
            bw.Write(t.getCabEntradas());
            bw.Write(t.getNumReg());
        }
Example #8
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);

        }
Example #9
0
        private List<CCubeta> dameCubetas(CTablaHashExt tH)
        {
            List<CCubeta> L;

            L = new List<CCubeta>();

            foreach (CEntrada e in tH.getListEntradas())
                if (L.Contains(e.getCubeta()) == false)
                    L.Add(e.getCubeta());

            return (L);
        }
Example #10
0
        private CTablaHashExt creaTabla(CTablaHashExt tH)
        {
            CTablaHashExt nueva;
            CEntrada entAux;

            nueva = new CTablaHashExt();

            nueva.setPrefAsociacion(tH.getPrefAsociacion());
            nueva.setNumReg(tH.getNumReg());

            foreach (CEntrada e in tH.getListEntradas())
            {
                entAux = new CEntrada();
                entAux.setID(e.getID());
                entAux.setEspejo(e.getEspejo());
                nueva.insEntrada(entAux);
            }

            return (nueva);
        }