/**Escribe una tabla hash*/ public void EscribeTablaHash(CHash tabla) { bw.BaseStream.Seek(tabla.getDir(), SeekOrigin.Begin); bw.Write(tabla.getDir()); bw.Write(tabla.getTamaño()); bw.Write(tabla.getNumCubetas()); for (int i = 0; i < tabla.getTamaño(); bw.Write(tabla.getAtDirCubeta(i)), i++) ; }
/**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 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); } }
private void ImprimeTablaHash(long dir) { if (dir != -1) { tablaHashStatic = getArchivo().LeerTablaHash(dir); for (int nC = 1, i = 0; i < tablaHashStatic.getTamaño(); i++, nC++) { tablaHash.Rows.Add(); tablaHash.Rows[i].HeaderCell.Value = nC.ToString(); tablaHash.Rows[i].Cells[0].Value = tablaHashStatic.getAtDirCubeta(i).ToString(); } } }
/**\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); }
/**Método principal para llevar a cabo el alta de algun bloque*/ public int Alta_HashEstatica(CNodoEntidad e, CBloque b) { int fH, fC; int res; CHash tHash; fH = fC = 0; if (e.getApCabDatos() == -1) { tHash = new CHash(getArchivo().ENDF(), TAM_HASH); getArchivo().EscribeTablaHash(tHash); e.setApCabDatos(tHash.getDir()); getArchivo().escribeEntidad(e, e.getDir()); }else tHash = getArchivo().LeerTablaHash(e.getApCabDatos());//Se lee la tabla Hash FuncionHash(b, ref fH, ref fC); cubetaSel = fH; res = InsDirBloque(tHash, fH, b, fC); return (res); }
/**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()); } }