/**Se lee del archivo de trabajo un objeto de la clase CIndice, que sera utilzado * en la organización secuencial indexada*/ public CIndice LeerIndicePrimario(long pos) { BinaryReader br; CIndice indPri = new CIndice(); br = getBr(); br.BaseStream.Seek(pos, SeekOrigin.Begin); indPri.setTipoInd(br.ReadInt32()); indPri.setTamIndPri(br.ReadInt32()); indPri.setIndPrim(br.ReadBytes(indPri.getTamIndPri())); indPri.setSigInd(br.ReadInt64()); indPri.setCabBloques(br.ReadInt64()); indPri.setDirInd(br.ReadInt64()); return (indPri); }
/**Inserta el bloque de datos, accediendo a la estructura de datos implementada en el archivo*/ public int insBloque(CIndice ind, CBloque nuevo, long posB) { CBloque bAux, bAnt = null; long ptrAux, ptrAnt = -1; int band = -1; ptrAux = ind.getCabBloques(); while (ptrAux != -1) { bAux = getArchivo().leerBloque(ptrAux, nuevo.getTamBlo()); if ((band = nuevo.ComparateTo(bAux)) > 0) { ptrAnt = ptrAux; bAnt = bAux; bAnt.setTamBlo(nuevo.getTamBlo()); ptrAux = bAux.getSigBlo(); } else break; } if (band == 0) return 0; else if (ptrAux == ind.getCabBloques()) { ind.setCabBloques(posB); getArchivo().EscribeIndicePrimario(ind); } else { bAnt.setSigBlo(posB); getArchivo().EscribeBloque(bAnt, ptrAnt); } nuevo.setSigBlo(ptrAux); getArchivo().EscribeBloque(nuevo, posB); return (band); }
/**Elimian un bloque del archivo implementado en la organización*/ public void eliminaBloque(ref CIndice ind, CBloque b) { CBloque bloAux, bloAnt; long ptrAux, ptrAnt; int tamB; bloAux = bloAnt = null; ptrAux = ptrAnt = -1; tamB = b.getTamBlo(); ptrAux = ind.getCabBloques(); while (ptrAux != -1)//Se ubica el registro en el archivo { bloAux = getArchivo().leerBloque(ptrAux, tamB); if (b.ComparateTo(bloAux) != 0) { ptrAnt = ptrAux; bloAnt = bloAux; bloAnt.setTamBlo(tamB); ptrAux = bloAux.getSigBlo(); } else break; } if (ptrAux == ind.getCabBloques())//Se actualiza la cabecera de datos de la entidad en caso de que sea el primero { ind.setCabBloques( bloAux.getSigBlo()); getArchivo().EscribeIndicePrimario(ind); } else { bloAnt.setSigBlo(bloAux.getSigBlo()); bloAnt.setTamBlo(tamB); getArchivo().EscribeBloque(bloAnt, ptrAnt); } }
/**Función de Mantenimiento para la Organizacion Secuencial indexada*/ public void MantenimientoSecInd(CArchivo fileOri, CArchivo fileNew, CNodoEntidad ent, CNodoEntidad entC, int tamBloque) { List<CBloque> listBloque; List<CIndice> listaInd; CIndice indPri,nuevoInd; long aux; listaInd = new List<CIndice>(); aux = ent.getApCabDatos(); while (aux != -1) { indPri = fileOri.LeerIndicePrimario(aux); nuevoInd = new CIndice(); nuevoInd.setIndPrim(indPri.getIndPrim()); nuevoInd.setTamIndPri(indPri.getTamIndPri()); nuevoInd.setTipoInd(indPri.getTipoInd()); listBloque = new List<CBloque>(); CopiarSec(fileOri, fileNew, indPri.getCabBloques(), tamBloque, ref listBloque); nuevoInd.setDirInd(fileNew.ENDF()); nuevoInd.setCabBloques(listBloque[0].getDir()); fileNew.EscribeIndicePrimario(nuevoInd); listaInd.Add(nuevoInd); aux = indPri.getSigInd(); } for (int i = 0; i < listaInd.Count - 1; i++) { listaInd[i].setSigInd(listaInd[i + 1].getDirInd()); fileNew.EscribeIndicePrimario((listaInd[i])); } entC.setApCabDatos(listaInd[0].getDirInd()); fileNew.escribeEntidad(entC, ent.getDir()); }