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