Exemplo n.º 1
0
        /**Se lee una objeto cubeta, que sera utilizado en la Hash Estatica*/
        public Cubeta LeerCubetaHashEstatica(long dir)
        {
            Cubeta cubetaAux = null;

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

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

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

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

                for (int i = 0; i < cubetaAux.getTamaño(); cubetaAux.setAtDirBloque(i, br.ReadInt64()), i++) ;
            }

            return (cubetaAux);
        }
Exemplo n.º 2
0
        private bool RegEliminado(Cubeta cubeta, CBloque b, int pC)
        {
            CBloque bAux;
            bool res = true;
            int posOrg = pC;
            
            while (true)
            {
                 bAux = getArchivo().leerBloque(cubeta.getAtDirBloque(pC), b.getTamBlo());
                  
                 if ( bAux != null && (b.ComparateTo(bAux) == 0))
                       break;
                 else
                 {
                     pC++;
                     if (pC == cubeta.getTamaño())
                          pC = 0;

                     if (pC == posOrg)
                     {
                            res = false;
                            break;
                     }
                  }
            }
            
            if (res == true)
            {
                cubeta.setAtDirBloque(pC, -1);
                cubeta.decNumDirBloques();
                getArchivo().EscribeCubetaHashEstatia(cubeta);
            }
            
            return (res);
        }
Exemplo n.º 3
0
        /**Se escribe una objeto cubeta para la organización Hash Estatica*/ 
        public void EscribeCubetaHashEstatia(Cubeta cubeta)
        {
            bw.BaseStream.Seek(cubeta.getDir(), SeekOrigin.Begin);

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

            for (int i = 0; i < cubeta.getTamaño(); bw.Write(cubeta.getAtDirBloque(i)), i++) ;
        }
Exemplo n.º 4
0
        private bool ExisteDireccion(Cubeta cubeta, int pos, CBloque b)
        {
            bool res = true;

            if (cubeta.getAtDirBloque(pos) == -1)
            {
                cubeta.incNumDirBloques();
                getArchivo().EscribeCubetaHashEstatia(cubeta);
                cubeta.setAtDirBloque(pos, getArchivo().ENDF());
                getArchivo().EscribeBloque(b, getArchivo().ENDF());
                res = false;
            }

            return (res);
        }
Exemplo n.º 5
0
        private int Repetidos(CBloque b, Cubeta 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 (3);
            }
            return (1);
        }
Exemplo n.º 6
0
     /**Se intenta insertar un la direccion de un bloque en la cubeta*/
     public int InsBloqueDatos(CBloque b, Cubeta cubeta, int indexCubeta)
     {
         /** Este método retornara alguno de estos tres valores
          *  1 : Si hay espacio en la cubeta  y se pudo insertar
          *  2 : Si la cubeta esta llena
          *  3 : Si el Bloque es repetido
          * */
         int res = 1;
 
         if (cubeta.getNumDirBloques() == TAM_CUBETA)
             res = 2;
         else
          if( ((res = Repetidos(b,cubeta)) == 1) && ExisteDireccion(cubeta, indexCubeta, b) == true )
             {
                indexCubeta++;
               
                 for (; ; )
                 {
                     if (indexCubeta == TAM_CUBETA)
                        indexCubeta = 0;
                         
                     if (ExisteDireccion(cubeta, indexCubeta, b) == false)
                          break;
                     else
                          indexCubeta++;
                 }
            }
             
         return (res);
     }
Exemplo n.º 7
0
        /**\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);
        }
Exemplo n.º 8
0
        private long CopiarListaCubetasRec(long dirCub, CArchivo aO, CArchivo aN, int tamBloque)
        {
            Cubeta cubAux, nuevaCub = null;
            CBloque bloqAux;
            long sigCub = -1;

            if( dirCub != -1)
            {
                cubAux = aO.LeerCubetaHashEstatica(dirCub);
                sigCub = CopiarListaCubetasRec(cubAux.getSigCubeta(), aO, aN, tamBloque);

                nuevaCub = new Cubeta(aN.ENDF(), cubAux.getTamaño());

                nuevaCub.setNumDirBloques(cubAux.getNumDirBloques());

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

                nuevaCub.setDir(aN.ENDF());
                nuevaCub.setSigCubeta(sigCub);
                aN.EscribeCubetaHashEstatia(nuevaCub);
                sigCub = nuevaCub.getDir();
            }

            return (sigCub);
        }