/**Lectura de una cubeta que se utilizara en el Hash Dinamica*/ public CCubeta LeerCubeta(long dir) { CCubeta cubetaAux = null; if (dir != -1) { cubetaAux = new CCubeta(); br.BaseStream.Seek(dir, SeekOrigin.Begin); cubetaAux.setDir(br.ReadInt64()); cubetaAux.setTamaño(br.ReadInt32()); cubetaAux.setNumDirBloques(br.ReadInt32()); cubetaAux.setPrefAsoc(br.ReadInt32()); cubetaAux.creaVectDirReg(cubetaAux.getTamaño()); for (int i = 0; i < cubetaAux.getTamaño(); cubetaAux.setAtDirBloque(i, br.ReadInt64()), i++) ; } return (cubetaAux); }
/**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); }
private CCubeta creaCubeta(CCubeta c, CArchivo aN, CArchivo aO) { CCubeta nuevaCub; CBloque bloqAux; nuevaCub = new CCubeta(aN.ENDF(), c.getTamaño()); nuevaCub.setNumDirBloques(c.getNumDirBloques()); nuevaCub.setPrefAsoc(c.getPrefAsoc()); for (int i = 0; i < c.getTamaño(); i++) if ((bloqAux = aO.leerBloque(c.getAtDirBloque(i), tamBloque)) != null) { bloqAux.setTamBlo(tamBloque); nuevaCub.setAtDirBloque(i, aN.ENDF()); aN.EscribeBloque(bloqAux, aN.ENDF()); } nuevaCub.setDir(aN.ENDF()); aN.EscribeCubeta(nuevaCub); return (nuevaCub); }