/**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); }
/**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); }
/**´Méetodo principal para llevar a cabo la inserción de algun bloque*/ public bool Alta_HashDinamica(CNodoEntidad e, CBloque b) { /** * \param e Entidad a la que pertrnece el bloque * \param b Bloque Nuevo bloque a insertar * \return Retorna Falso(Si tuvo exito), True(Si ya existe el bloque alguna cubeta) * */ CCubeta cubetaAux; CEntrada entradaAux; bool res = false; if (e.getApCabDatos() == -1) { tHashExt = new CTablaHashExt(); cubetaAux = new CCubeta(-1, TAM_CUBETA); entradaAux = new CEntrada(cubetaAux, -1); tHashExt.insEntrada(entradaAux); cubetaAux.setDir(getArchivo().ENDF()); getArchivo().EscribeCubeta(cubetaAux); entradaAux.setDirCubeta(cubetaAux.getDir()); entradaAux.setDir(getArchivo().ENDF()); getArchivo().EscribeEntrada(entradaAux); tHashExt.setCabEntradas(entradaAux.getDir()); tHashExt.setDir(getArchivo().ENDF()); getArchivo().EscribeTablaHashExt(tHashExt); e.setApCabDatos(tHashExt.getDir()); getArchivo().escribeEntidad(e, e.getDir()); } else tHashExt = getArchivo().LeerTablaHashExt(e.getApCabDatos()); b.setDir(getArchivo().ENDF()); if ((res = InsBloque(b)) == false) { tHashExt.incNumReg(); getArchivo().EscribeTablaHashExt(tHashExt); } 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); }