コード例 #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
        /**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);
        }
コード例 #3
0
        private bool buscaBloqueRep(CBloque nuevo)
        {
            CCubeta cubetaAux;
            CBloque bloqueAux;
            int posCub;

            posCub = ConvertDecimal(tHashExt, nuevo.ConvertClaveToBinary());
            cubetaAux = tHashExt.getAtEntrada(posCub).getCubeta();

            for (int i = 0; i < cubetaAux.getTamaño(); i++)
            {
                bloqueAux = getArchivo().leerBloque(cubetaAux.getAtDirBloque(i), nuevo.getTamBlo());

                if (bloqueAux != null && nuevo.ComparateTo(bloqueAux) == 0)
                    return (true);
            }

            return (false);
        }