Esempio n. 1
0
        /**Lee la tabla hash estatica*/
        public CHash LeerTablaHash(long dir)
        {
            CHash tablaH = new CHash();
        
            br.BaseStream.Seek(dir, SeekOrigin.Begin);
            tablaH.setDir(br.ReadInt64());
            tablaH.setTamaño(br.ReadInt32());
            tablaH.setNumCubetas(br.ReadInt32());

            tablaH.creaVectorCubetas(tablaH.getTamaño());

            for (int i = 0; i < tablaH.getTamaño(); tablaH.setAtDirCubeta(i, br.ReadInt64()), i++) ;

            return (tablaH);
        }
        /**\brief Inserta un bloque*/
        public int InsDirBloque(CHash tablaH, int posCubeta, CBloque b, int fC)
        {
         
            /**
             * \details
             * Lleva a cabo la inserción de un bloque, utilizando la posición de fC, generada por la
             * función hash(Metodo de plegamiento)
             * \param tablaH Tabla Hash
             * \param posCuebta Posición de la cubeta
             * \param b Bloque a insertar
             * \param fC Posicion del bloque dentro de la tabla hash
             **/
            Cubeta cubetaAux, cubetaAnt;
            long dirAux;
            int res = 1;

            cubetaAnt = cubetaAux = null;
            dirAux = tablaH.getAtDirCubeta(posCubeta);

            //Recorrido por las cubetas
            while (dirAux != -1 )
            {
                cubetaAux = getArchivo().LeerCubetaHashEstatica(dirAux);

                if ((res = InsBloqueDatos(b, cubetaAux, fC)) == 2)
                {
                    cubetaAnt = cubetaAux;
                    dirAux = cubetaAux.getSigCubeta();
                }
                else
                    break;
            }

            if (res == 1)
            {
                if (tablaH.getAtDirCubeta(posCubeta) == -1)//Si no existen cubetas se crea la primera y se asocia con la entidad
                {
                    cubetaAux = new Cubeta(getArchivo().ENDF(), TAM_CUBETA);
                    res = InsBloqueDatos(b, cubetaAux, fC);
                    getArchivo().EscribeCubetaHashEstatia(cubetaAux);
                    tablaH.setAtDirCubeta(posCubeta, cubetaAux.getDir());
                    tablaH.incNumCubetas();
                    getArchivo().EscribeTablaHash(tablaH);
                }
                else
                    if (dirAux == -1)
                    {
                        cubetaAux = new Cubeta(getArchivo().ENDF(), TAM_CUBETA);
                        res = InsBloqueDatos(b, cubetaAux, fC);
                        getArchivo().EscribeCubetaHashEstatia(cubetaAux);
                        cubetaAnt.setSigCubeta(cubetaAux.getDir());
                        getArchivo().EscribeCubetaHashEstatia(cubetaAnt);
                    }
                    else
                        if (res == 1)
                            getArchivo().EscribeCubetaHashEstatia(cubetaAux);
            }

            return (res);
        }
        /**\brief Eliima un bloque de datos*/
        private void EliminaBloque(CHash tablaH, CBloque b)
        {

            /**
             * \details
             * Se lleva a cabo la eliminación de algun registro. Aplicando la función has en la tabla y la cubeta
             * \param tablaH Tabla hash donde existe la cubeta
             * \param b Bloque a eliminar
             * */

            Cubeta cubetaAux, cubetaAnt;
            long dirAux;
        
            cubetaAnt = cubetaAux = null;
            pH = pC = -1;

            FuncionHash(b, ref pH, ref pC);//Se hacen las funciones has en la tabla has y la cubeta

            dirAux = tablaH.getAtDirCubeta(pH);

            while (dirAux != -1)//Se intenta eliminar el registro
            {
                cubetaAux = getArchivo().LeerCubetaHashEstatica(dirAux);
                if (RegEliminado(cubetaAux, b, pC) == false)
                {
                    cubetaAnt = cubetaAux;
                    dirAux = cubetaAux.getSigCubeta();
                }
                else
                    break;
            }

            if (cubetaAux.getNumDirBloques() == 0)
               if (dirAux == tablaH.getAtDirCubeta(pH))
                {
                    tablaH.setAtDirCubeta(pH, cubetaAux.getSigCubeta());
                    if (cubetaAux.getSigCubeta() == -1)
                    {
                        tablaH.decNumCubetas();
                        cubetasRestantes = tablaH.getNumCubetas(); 
                    }

                    getArchivo().EscribeTablaHash(tablaH);
                }
                else
                {
                    cubetaAnt.setSigCubeta(cubetaAux.getSigCubeta());
                    getArchivo().EscribeCubetaHashEstatia(cubetaAnt);
                }
        }
Esempio n. 4
0
        /**Función de Mantenimiento para la Hash Estatica*/
        private void MantenimientoHashEstatica(CArchivo fileOri, CArchivo fileNew, CNodoEntidad ent, CNodoEntidad entC, int tamBloque)
        {
            CHash tablaHash, nuevaTablaHash;
            long cabTabla;

            cabTabla = ent.getApCabDatos();

            if (cabTabla != -1)
            {
                tablaHash = fileOri.LeerTablaHash(cabTabla);
                nuevaTablaHash = new CHash(fileNew.ENDF(), tablaHash.getTamaño());
                nuevaTablaHash.setNumCubetas(tablaHash.getNumCubetas());

                fileNew.EscribeTablaHash(nuevaTablaHash);

                for (int i = 0; i < tablaHash.getTamaño(); i++)
                    nuevaTablaHash.setAtDirCubeta(i, CopiarListaCubetasRec(tablaHash.getAtDirCubeta(i), fileOri, fileNew, tamBloque));

                fileNew.EscribeTablaHash(nuevaTablaHash);

                entC.setApCabDatos(nuevaTablaHash.getDir());
                fileNew.escribeEntidad(entC, entC.getDir());
            }
        }