Пример #1
0
 public Cubeta(Cubeta c)
 {
     noRegistro   = 9;
     dirSigCubeta = -1;
     registros    = new List <CRegistro>();
     direccion    = 0;
 }
Пример #2
0
        private void MuestraDatos()
        {
            Cubeta C = new Cubeta(tabla.NoRegistros);
            long   dirSig; int j = 0;

            for (int i = 0; i < tabla.NoCubetas; i++)
            {
                if (tabla.Cajones[i] != -1)
                {
                    dirSig = tabla.Cajones[i];
                    do
                    {
                        archivo.LeerCubeta(dirSig, C);
                        for (int k = 0; k < C.NoRegistros; k++, j++)
                        {
                            //if(dataGridView1.Rows[j] == null)
                            dataGridView1.Rows.Add();
                            dataGridView1.Rows[j].Cells[0].Value = C.Registros[k].A;
                            dataGridView1.Rows[j].Cells[1].Value = C.Registros[k].D;
                            dataGridView1.Rows[j].Cells[2].Value = C.Registros[k].B;
                            dataGridView1.Rows[j].Cells[3].Value = C.Registros[k].Clave;
                            dataGridView1.Rows[j].Cells[4].Value = C.NoRegistros;
                            dataGridView1.Rows[j].Cells[5].Value = C.DirSigCubeta;
                        }

                        dirSig = C.DirSigCubeta;
                        C      = new Cubeta(tabla.NoRegistros);
                    } while (dirSig != -1);
                }
            }
        }
Пример #3
0
 public void LeerCubeta(long dir, Cubeta C)
 {
     using (fs = new FileStream(path + nombre, FileMode.Open, FileAccess.Read))
     {
         C.Direccion = dir;
         fs.Seek(dir, SeekOrigin.Begin);
         byte[] bytes = new byte[sizeof(int)];
         fs.Read(bytes, 0, sizeof(int));
         int NoRegistros = BitConverter.ToInt32(bytes, 0);
         bytes = new byte[sizeof(long)];
         fs.Read(bytes, 0, sizeof(long));
         C.DirSigCubeta = BitConverter.ToInt64(bytes, 0);
         for (int i = 0; i < NoRegistros; i++)
         {
             bytes = new byte[sizeof(int)];
             fs.Read(bytes, 0, sizeof(int));
             int clave = BitConverter.ToInt32(bytes, 0);
             bytes = new byte[sizeof(int)];
             fs.Read(bytes, 0, sizeof(int));
             int a = BitConverter.ToInt32(bytes, 0);
             bytes = new byte[sizeof(long)];
             fs.Read(bytes, 0, sizeof(long));
             long d = BitConverter.ToInt64(bytes, 0);
             bytes = new byte[10];
             fs.Read(bytes, 0, 10);
             string s = Encoding.ASCII.GetString(bytes, 0, bytes.Length).TrimEnd('\0');
             C.Insertar(new CRegistro(clave, a, d, s));
         }
     }
 }
Пример #4
0
        public void InsertaRegistro(CRegistro registro)
        {
            Cubeta  C        = new Cubeta(noRegistros);
            Archivo archivo  = new Archivo(nombre, path);
            int     posicion = tabla.Hash(registro.Clave);
            long    dirC     = tabla.Cajones[posicion];

            if (dirC == -1)
            {
                dirC = tabla.PtrsCubetaVacia;
                if (dirC != -1)
                {
                    archivo.LeerCubeta(dirC, C);
                    tabla.PtrsCubetaVacia = C.DirSigCubeta;
                    C.DirSigCubeta        = -1;
                }

                C.Insertar(registro);
                C.Direccion = tabla.Cajones[posicion] = archivo.EscribirCubeta(C);
                archivo.EscribirTablaH(tabla);
            }
            else
            {
                long ant;
                dirC = tabla.Cajones[posicion];
                do
                {
                    C = new Cubeta(noRegistros);
                    archivo.LeerCubeta(dirC, C);
                    ant  = dirC;
                    dirC = C.DirSigCubeta;
                } while (C.NoRegistros >= noRegistros && dirC != -1);

                if (C.NoRegistros < noRegistros)
                {
                    C.Insertar(registro);
                    C.Direccion = ant;
                    archivo.EscribirCubeta(C);
                }
                else
                {
                    Cubeta cc = new Cubeta(noRegistros);
                    if (tabla.PtrsCubetaVacia != -1)
                    {
                        archivo.LeerCubeta(tabla.PtrsCubetaVacia, cc);
                        tabla.PtrsCubetaVacia = cc.DirSigCubeta;
                        cc.DirSigCubeta       = -1;
                    }

                    cc.Insertar(registro);
                    C.Direccion    = ant;
                    C.DirSigCubeta = cc.Direccion = archivo.EscribirCubeta(cc);
                    archivo.EscribirCubeta(C);
                }
                // archivo.LeerCubeta(dirC, C);
                // C.InsertaRegistro(registro);
            }
        }
Пример #5
0
        public void EliminaRegistro(int clave)
        {
            bool    encontrado = false;
            int     p          = tabla.Hash(clave);
            long    dirC       = tabla.Cajones[p];
            Cubeta  C          = new Cubeta(noRegistros);
            Cubeta  ant        = new Cubeta(noRegistros);
            Archivo archivo    = new Archivo(nombre, path);

            if (dirC != -1)
            {
                do
                {
                    archivo.LeerCubeta(dirC, C);
                    encontrado = C.Encontrado(clave);
                    if (!encontrado)
                    {
                        ant  = C;
                        dirC = C.DirSigCubeta;
                        C    = new Cubeta(noRegistros);
                    }
                } while (!encontrado && dirC != -1);
                if (encontrado)
                {
                    C.EliminaRegistro(clave);
                    if (C.Vacio())
                    {
                        if (C.Direccion == tabla.Cajones[p])
                        {
                            tabla.Cajones[p] = C.DirSigCubeta;
                        }
                        else
                        {
                            ant.DirSigCubeta = C.DirSigCubeta;
                            archivo.EscribirCubeta(ant);
                        }
                        C.DirSigCubeta        = tabla.PtrsCubetaVacia;
                        tabla.PtrsCubetaVacia = C.Direccion;
                        archivo.EscribirTablaH(tabla);
                    }
                    archivo.EscribirCubeta(C);
                }
            }
        }
Пример #6
0
        public long EscribirCubeta(Cubeta C /*, byte[] bytes*/)
        {
            long d;

            using (fs = new FileStream(path + nombre, FileMode.Open, FileAccess.ReadWrite))
            {
                if (C.Direccion != -1)
                {
                    fs.Seek(C.Direccion, SeekOrigin.Begin);
                }
                else
                {
                    fs.Seek(0, SeekOrigin.End);
                }

                d = fs.Position;
                byte[] bytes = new byte[10];
                using (var bw = new BinaryWriter(fs))
                {
                    bw.Write(C.NoRegistros);
                    bw.Write(C.DirSigCubeta);
                    for (int i = 0; i < C.Max_reg; i++)
                    {
                        if (i < C.NoRegistros)
                        {
                            bw.Write(C.Registros[i].Clave);
                            bw.Write(C.Registros[i].A);
                            bw.Write(C.Registros[i].D);

                            Encoding.ASCII.GetBytes(C.Registros[i].B, 0, C.Registros[i].B.Length, bytes, 0);
                            bw.Write(bytes);
                        }
                        else
                        {
                            bw.Write((int)-1);
                            bw.Write((int)-1);
                            bw.Write((long)-1);
                            bw.Write(bytes);
                        }
                    }
                }
            }
            return(d);
        }
Пример #7
0
        public void InsertaRegistro(CRegistro registro)
        {
            Cubeta  C        = new Cubeta(noRegistros);
            Archivo a        = new Archivo("", "");
            int     posicion = Hash(registro.Clave);
            long    dirC     = cajones[posicion];

            if (dirC == -1)
            {
                dirC = ptrsCubetaVacia;
                if (dirC != -1)
                {
                    a.LeerCubeta(cajones[posicion], C);
                    ptrsCubetaVacia = C.DirSigCubeta;
                    C.DirSigCubeta  = -1;
                }

                C.InsertaRegistro(registro);     //a = a eso
                cajones[posicion] = C.Direccion; // o cajones[posicion] = C.InsertaRegistro(registro);
                                                 // cajones[posicion] = a.EscribirCubeta(C);
                a.EscribirTablaH(this);
            }
            else
            {
                long ant;
                dirC = cajones[posicion];
                do
                {
                    a.LeerCubeta(dirC, C);
                    ant = dirC;
                } while ((dirC = C.DirSigCubeta) != -1 && C.Registros[C.Registros.Count - 1].Clave < registro.Clave);

                if (C.Registros[C.Registros.Count - 1].Clave > registro.Clave)
                {
                    if (C.Registros[0].Clave > registro.Clave)
                    {
                        dirC = ant;
                    }
                }
                a.LeerCubeta(dirC, C);
                C.InsertaRegistro(registro);
            }
        }
Пример #8
0
        public void EliminaRegistro(int clave)
        {
            bool    terminado = false;
            Archivo a         = new Archivo("", "");
            int     p         = Hash(clave);
            long    dirC      = cajones[p];
            Cubeta  C         = new Cubeta(noRegistros);
            Cubeta  ant       = new Cubeta(noRegistros);

            if (dirC != -1)
            {
                do
                {
                    a.LeerCubeta(dirC, C);
                    if (C.Registros[C.Registros.Count - 1].Clave >= clave || dirC == -1)
                    {
                        terminado = true;
                        if (C.EliminaRegistro(clave))
                        {
                            if (C.Vacio())
                            {
                                if (C.Direccion == cajones[p])
                                {
                                    cajones[p] = C.DirSigCubeta;
                                }
                                else
                                {
                                    ant.DirSigCubeta = C.DirSigCubeta;
                                }
                                C.DirSigCubeta  = ptrsCubetaVacia;
                                ptrsCubetaVacia = C.Direccion;
                            }
                        }
                    }
                    else
                    {
                        ant  = C;
                        dirC = C.DirSigCubeta;
                    }
                } while (!terminado);
            }
        }
Пример #9
0
        public long InsertaRegistro(CRegistro registro /*, string path*/)
        {
            Archivo a = new Archivo("", "");
            //maneja desbordamiento y insercion ordenanda
            long dir, ant, d = direccion;

            if (registros.Count < MAX_REG)
            {
                Inserta(registro);
                d = a.EscribirCubeta(this);
                //direccion = d = a.EscribirCubeta(this); checar retorno de cubeta con valor actualizdo
            }
            else
            {
                Cubeta    cc = new Cubeta(MAX_REG);
                CRegistro regAux;
                if (registros[registros.Count - 1].Clave > registro.Clave)
                {
                    regAux = new CRegistro(registros[registros.Count - 1]);
                    registros.RemoveAt(registros.Count - 1);
                    Inserta(registro);
                    d = a.EscribirCubeta(this);
                }
                else
                {
                    regAux = registro;
                }

                dir = dirSigCubeta;
                if (dir != -1)
                {
                    a.LeerCubeta(dir, cc);
                    cc.InsertaRegistro(regAux);
                }
                else
                {
                    //crear cubeta y encadena
                    dirSigCubeta = cc.InsertaRegistro(regAux);
                }
            }
            return(d);
        }