/**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); }
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); }
/**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++) ; }
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); }
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); }
/**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); }
/**\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); }
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); }