Example #1
0
        /**Escribe una tabla hash*/
        public void EscribeTablaHash(CHash tabla)
        {
            bw.BaseStream.Seek(tabla.getDir(), SeekOrigin.Begin);
            
            bw.Write(tabla.getDir());
            bw.Write(tabla.getTamaño());
            bw.Write(tabla.getNumCubetas());

            for (int i = 0; i < tabla.getTamaño(); bw.Write(tabla.getAtDirCubeta(i)), i++) ;
        }
Example #2
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 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);
                }
        }
        private void ImprimeTablaHash(long dir)
        {
            if (dir != -1)
            {
                tablaHashStatic = getArchivo().LeerTablaHash(dir);

                for (int nC = 1, i = 0; i < tablaHashStatic.getTamaño(); i++, nC++)
                {
                    tablaHash.Rows.Add();
                    tablaHash.Rows[i].HeaderCell.Value = nC.ToString();
                    tablaHash.Rows[i].Cells[0].Value = tablaHashStatic.getAtDirCubeta(i).ToString();
                }
            }
        }
        /**\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);
        }
        /**Método principal para llevar a cabo el alta de algun bloque*/
        public int Alta_HashEstatica(CNodoEntidad e, CBloque b)
        {
            int fH, fC;
            int res;
            CHash tHash;

            fH = fC = 0;

            if (e.getApCabDatos() == -1)
            {
                tHash = new CHash(getArchivo().ENDF(), TAM_HASH);
                getArchivo().EscribeTablaHash(tHash);
                e.setApCabDatos(tHash.getDir());
                getArchivo().escribeEntidad(e, e.getDir());
            }else
                tHash = getArchivo().LeerTablaHash(e.getApCabDatos());//Se lee la tabla Hash 

            FuncionHash(b, ref fH, ref fC);
            cubetaSel = fH;
            res = InsDirBloque(tHash, fH, b, fC);

            return (res);
        }
Example #7
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());
            }
        }