public bool actualizaRegistro(CBloque nuevo) { /**Verificar si la clave primaria fue modificada en caso de que no se haya modificado, sobrescribir el registro en la misma direccion, pasar a otro procedimiento */ bool res = true; if (nuevo.ComparateTo(bloqueOriginal) == 0) { getArchivo().EscribeBloque(nuevo, dirBO); res = false; } else if ((res = buscaBloqueRep(nuevo)) == false)//Se checan que no se repetan los bloques con el nuevo { Elimina_BloqueHashDinamica(ent,bloqueOriginal); Alta_HashDinamica(ent, nuevo); List<CNodoEntidad> lR = new List<CNodoEntidad>(); List<CBloque> lB; lR = buscaRelacionesEnt(ent); if (lR.Count > 0) foreach (CNodoEntidad nE in lR) { lB = new List<CBloque>(); dameBloquesDatos(ref lB, nE, bloqueOriginal, ent); foreach (CBloque nB in lB) { nB.setClaveExt(nuevo.dameClave()); getArchivo().EscribeBloque(nB, nB.getDir()); } } } return (res); }
/**Compara la clave externa con la clave primaria de otro bloque*/ public int CompareClaveExt(CBloque bloqueB) { int res = -1; byte[] cA; byte[] cB; cA = this.dameClaveExt(); cB = bloqueB.dameClave(); if (BitConverter.ToString(cA, 0).CompareTo(BitConverter.ToString(cB, 0)) == 0) res = 0; return (res); }
/**\brief Modificacion de algun registro*/ public bool actualizaRegistro(CBloque nuevo, long posN) { bool res = true; int b = -1; List<CNodoEntidad> lR; List<CBloque> lB; // El registro que se modifico no altero la CP, por lo tanto // se sobreescribe el nuevo registro en la direccion correspondiente if (nuevo.ComparateTo(bloqueOriginal) == 0) { getArchivo().EscribeBloque(nuevo, dirBO); res = false; } else { //La clave primaria se ha modificado if (!(res = buscaBloqueRep(ent.getApCabDatos(), bloqueOriginal.dameClavePrim(), nuevo.dameClavePrim(),ref b))) { eliminaABplus(ent, bloqueOriginal); AltaArbolBplus(ent, nuevo, getArchivo().ENDF()); lR = new List<CNodoEntidad>(); lR = buscaRelacionesEnt(ent); if (lR.Count > 0) foreach (CNodoEntidad nE in lR) { lB = new List<CBloque>(); dameBloques(ref lB, nE, bloqueOriginal, ent); foreach (CBloque nB in lB) { nB.setClaveExt(nuevo.dameClave()); getArchivo().EscribeBloque(nB, nB.getDir()); } } } } return (res); }
/**\brief Compara dos bloques*/ public int ComparateTo(CBloque bloqueB) { /** * \details * Se realiza la comparación de dos blques con respecto a su clave primaria * \param bloqueB Boque con el que se realizara la comparación * \return Valor de 0 (Iguales) * */ int res; byte[] cA; byte[] cB; bloqueB.setDesp(this.getDesp()); bloqueB.setTamAtri(this.getTamAtri()); cA = this.dameClave(); cB = bloqueB.dameClave(); res = comparaClaves(cA, cB, tipo); return (res); }
/* Crea el indice primario correspondiente al bloque*/ public CIndice generaIndPri(CBloque nuevoB) { CIndice nuevo = new CIndice(); byte[] indAux = null; int num, tamInd = 0; long num2; switch (nuevoB.getTipoCA()) { case 3://Clave Primaria de Tipo entera num = BitConverter.ToInt32(nuevoB.dameClave(), 0); indAux = BitConverter.GetBytes((num / 10) * 10); tamInd = 4; break; case 5://Clave primaria de tipo Long num2 = BitConverter.ToInt64(nuevoB.dameClave(), 0); indAux = BitConverter.GetBytes((num2 / 10) * 10); tamInd = 8; break; case 7://Clave Primaria de Tipo Cadena indAux = new byte[1];//Se saca el primer caracter indAux[0] = nuevoB.dameClave()[0]; tamInd = 1; break; } nuevo.setTipoInd(nuevoB.getTipoCA()); nuevo.setTamIndPri(tamInd); nuevo.setIndPrim(indAux); return (nuevo); }