예제 #1
0
        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);
        }
예제 #2
0
 /**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);
 }
예제 #3
0
        /**\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);
        }
예제 #4
0
        /**\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);
        }
예제 #5
0
        /* 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);
        }