Beispiel #1
0
        /// <summary>
        /// este método define qual o método será chamado para o select sem where
        /// </summary>
        /// <param name="tabela"></param>
        /// <returns></returns>
        private TabelaSelect returnDados(Metadados tabela)
        {
            // não funcionou corretamente após trazer gambiarra select para dentro.
            //return Base.getInstance().arqBinarios[tabela.getNome()].returnDados(tabela);

            // manter este
            return(GambiarraSelect.getInstance().returnDados(tabela));
        }
Beispiel #2
0
        // Carregar os arquivos de indices na memoria.
        private void carregarIndices()
        {
            Metadados meta = GerenciadorMemoria.getInstance().recuperarMetadados(arqTabela.nome);

            foreach (KeyValuePair <string, string[]> item in meta.getIndexes())
            {
                arqsIndices.Add(item.Key, new ArquivoIndice(item.Key));
            }
        }
Beispiel #3
0
 private void bSave_Click(object sender, EventArgs e)
 {
     ds.dtMetadadosRow md = (ds.dtMetadadosRow)((DataRowView)gvMetadados.GetRow(gvMetadados.FocusedRowHandle)).Row;
     sfd.FileName = string.Format("{0}_{1}_{2}_Medicao.xls", md.DataMedicao.ToString("yyyyMMdd"),
                                  Convert.ToUInt64(md.ParcelaUTMX), Convert.ToUInt64(md.ParcelaUTMY));
     if (sfd.ShowDialog() == DialogResult.OK)
     {
         Medicoes.ExportToXls(sfd.FileName);
         Metadados.ExportToXls(sfd.FileName.Replace("Medicao", "Parcela"));
     }
 }
Beispiel #4
0
 private void acaoZero()
 {
     identificadores.Clear();
     select.clear();
     fromTabelas.Clear();
     valoresColunas.Clear();
     metadados   = new Metadados();
     sexta       = true;
     allColunas  = true;
     contColunas = 0;
     operacao    = 0;
 }
Beispiel #5
0
 public static void setResultado(Metadados meta)
 {
     gridView.Columns.Clear();
     string[] head = new string[] { "Campo", "Tipo", "Tamanho", "Primary", "Foreign" };
     foreach (string s in head)
     {
         gridView.Columns.Add(s, s);
     }
     foreach (DadosTabela d in meta.getDados().Values)
     {
         gridView.Rows.Add(d.getNomeCampo(), d.geTipo(), d.getTamanho(), d.isPrimary(), (d.isForeing() ? d.getForeing()[0] + "(" + d.getForeing()[1] + ")" : "False"));
     }
     gridView.Refresh();
 }
Beispiel #6
0
        public TabelaSelect returnTudo()
        {
            br.BaseStream.Position = 0;
            int        count;
            TabelaDado td   = new TabelaDado(nome);
            Metadados  meta = GerenciadorMemoria.getInstance().recuperarMetadados(nome);

            while (br.BaseStream.Position != br.BaseStream.Length)
            {
                RegistroTabela r = new RegistroTabela(br.ReadInt64());
                count = br.ReadInt32();
                //Form1.addMensagem("Count colunas" + count); // somente para depuração

                try
                {
                    for (int i = 0; i < count; i++)
                    {
                        DadoTabela d;
                        if (meta.getDados()[meta.getNomesColunas()[i]].getTipoDado() == TipoDado.Inteiro)
                        {
                            //Form1.addMensagem("Inteiro"); // somente para depuração
                            d = new DadoTabela(meta.getNomesColunas()[i], meta.getDados()[meta.getNomesColunas()[i]].getTipoDado(), br.ReadByte(), br.ReadBoolean(), br.ReadInt32());
                        }
                        else
                        {
                            //Form1.addMensagem("Char"); // somente para depuração
                            d = new DadoTabela(meta.getNomesColunas()[i], meta.getDados()[meta.getNomesColunas()[i]].getTipoDado(), br.ReadByte(), br.ReadBoolean(), br.ReadString());
                        }

                        r.dados.Add(d);
                    }
                }
                catch (System.Exception e)
                {
                    Form1.addMensagem(e.Message);
                }

                td.registros.Add(r);
            }

            return(TabelaSelect.getTabelaSelect(td));
        }
Beispiel #7
0
        // Insere o registro nos indices.
        public void insertIndices(RegistroTabela registro, long posicao, string tabela)
        {
            if (arqsIndices.Count > 0)
            {
                // Percorre indices.
                RegistroIndice registroIndice;
                Metadados      meta = GerenciadorMemoria.getInstance().recuperarMetadados(tabela);
                foreach (KeyValuePair <string, string[]> item in meta.getIndexes())
                {
                    // Monta indice.
                    registroIndice = new RegistroIndice();
                    for (int i = 0; i < item.Value.Length; i++)
                    {
                        DadoIndice dadoIndice = new DadoIndice(meta.getDados()[item.Value[i]].getTipoDado(), registro.dados[meta.getNomesColunas().IndexOf(item.Value[i])].valor);
                        registroIndice.dados.Add(dadoIndice);
                    }

                    // Insere no indice.
                    insertIndice(item.Key, registroIndice, posicao);
                }
            }
        }
        public TabelaSelect returnDados(List<Filtro> filtrosAND, Dictionary<string, List<string>> filtrosJoin, Metadados tabela)
        {
            try { Base.getInstance().desalocarBinarios(tabela.getNome()); } catch { }
            TabelaSelect ts = null;
            FileStream file = null;
            BinaryReader br = null;
            try
            {
                string arquivo = mem.getPath() + "\\" + tabela.getNome() + ".dat";
                file = new FileStream(arquivo, FileMode.Open);
                using (br = new BinaryReader(file))
                {
                    int count;
                    ts = new TabelaSelect();

                    Metadados meta = GerenciadorMemoria.getInstance().recuperarMetadados(tabela.getNome());
                    int colunas = meta.getNomesColunas().Count;
                    ts.Campos = new string[colunas];
                    for (int i = 0; i < colunas; i++)
                    {
                        ts.Campos[i] = meta.getNome() + "." + meta.getNomesColunas()[i];
                    }

                    //calcula o tamanho de cada registro
                    int tamRegistro = 12;
                    int posPrimary = 0;//posicao do primary key no registro
                    foreach (DadosTabela dados in meta.getDados().Values)
                    {
                        if (dados.isPrimary()) posPrimary = tamRegistro + 2;
                        tamRegistro += dados.getTamanho() + 2;
                    }

                    long posMax = br.BaseStream.Length; //posicao máxima para leitura do arquivo
                    //organiza os filtros por coluna
                    List<Filtro>[] filtrosCampo = new List<Filtro>[colunas];
                    for (int i = 0; i < colunas; i++)
                    {
                        ts.Campos[i] = meta.getNome() + "." + meta.getNomesColunas()[i];
                        filtrosCampo[i] = new List<Filtro>();
                        foreach (Filtro f in filtrosAND)
                        {
                            if (f.LValue.Equals(ts.Campos[i])) filtrosCampo[i].Add(f);
                        }
                        if (filtrosJoin.ContainsKey(ts.Campos[i]))
                        {
                            posMax = posicionaPonteiroArquivo(filtrosJoin[ts.Campos[i]], br, tamRegistro, posPrimary);
                        }
                        //se o campo for PrimaryKey organiza o filtro
                        else if (filtrosCampo[i].Count > 0 && meta.getDados()[meta.getNomesColunas()[i]].isPrimary())
                        {
                            ordenaFiltros(filtrosCampo[i]);
                            //define o intervalo de consulta do arquivo caso exista filtro de chave primaria
                            posMax = posicionaPonteiroArquivo(filtrosCampo[i], br, tamRegistro, posPrimary);
                        }
                    }

                    //lê cada registro
                    while (br.BaseStream.Position < posMax)
                    {
                        string[] registro = new string[colunas];
                        long posicao = br.ReadInt64();
                        count = br.ReadInt32();
                        bool insere = true;
                        //Lê cada dado dentro do registro
                        for (int i = 0; i < count && insere; i++)
                        {
                            string nomeColuna = meta.getNomesColunas()[i];
                            TipoDado tipo = meta.getDados()[nomeColuna].getTipoDado();
                            bool isPrimary = meta.getDados()[nomeColuna].isPrimary();
                            string valor = "";
                            string campo = meta.getNome() + "." + nomeColuna;

                            if (tipo == TipoDado.Inteiro)
                            {
                                byte tamanho = br.ReadByte();
                                bool isValido = br.ReadBoolean();
                                int numero = br.ReadInt32();
                                valor = isValido ? numero + "" : "NULL";
                                foreach (Filtro f in filtrosCampo[i])
                                {
                                    switch (f.Op)
                                    {
                                        case OperadorRel.Igual:
                                            if (f.RValue.ToLower().Equals("null"))
                                            {
                                                if (isValido) insere = false;
                                            }
                                            else
                                            {
                                                if (numero != Convert.ToInt32(f.RValue)) insere = false;
                                            }
                                            break;
                                        case OperadorRel.MaiorQue:
                                            if (numero <= Convert.ToInt32(f.RValue)) insere = false;
                                            break;
                                        case OperadorRel.MenorQue:
                                            if (numero >= Convert.ToInt32(f.RValue)) insere = false;
                                            break;
                                        case OperadorRel.MaiorIgualA:
                                            if (numero < Convert.ToInt32(f.RValue)) insere = false;
                                            break;
                                        case OperadorRel.MenorIgualA:
                                            if (numero > Convert.ToInt32(f.RValue)) insere = false;
                                            break;
                                        case OperadorRel.Diferente:
                                            if (f.RValue.ToLower().Equals("null"))
                                            {
                                                if (!isValido) insere = false;
                                            }
                                            else
                                            {
                                                if (numero == Convert.ToInt32(f.RValue)) insere = false;
                                            }
                                            break;
                                        default:
                                            throw new SGDBException("Passou onde nao devia: GambiarraSelect.retornaDados.Inteiro.Default.");
                                    }
                                }
                                if(insere && filtrosJoin.ContainsKey(campo))
                                {
                                    insere = filtrosJoin[campo].Exists(s => s.Equals(valor));
                                }
                            }
                            else
                            {
                                byte tamanho = br.ReadByte();
                                bool isValido = br.ReadBoolean();
                                byte[] literal = br.ReadBytes(tamanho);
                                string texto = new System.Text.ASCIIEncoding().GetString(literal);
                                valor = isValido ? texto.TrimEnd() : "NULL";
                                foreach (Filtro f in filtrosCampo[i])
                                {
                                    switch (f.Op)
                                    {
                                        case OperadorRel.Igual:
                                            if (f.RValue.ToLower().Equals("null"))
                                            {
                                                if (isValido) insere = false;
                                            }
                                            else
                                            {
                                                byte[] filtro = new byte[tamanho];
                                                new System.Text.ASCIIEncoding().GetBytes(f.RValue.PadRight(tamanho)).CopyTo(filtro, 0);
                                                string filtro2 = new System.Text.ASCIIEncoding().GetString(filtro).TrimEnd();
                                                if (!valor.Equals(filtro2)) insere = false;
                                            }
                                            break;
                                        case OperadorRel.Diferente:
                                            if (f.RValue.ToLower().Equals("null"))
                                            {
                                                if (isValido) insere = false;
                                            }
                                            else
                                            {
                                                byte[] filtro = new byte[tamanho];
                                                new System.Text.ASCIIEncoding().GetBytes(f.RValue.PadRight(tamanho)).CopyTo(filtro, 0);
                                                string filtro2 = new System.Text.ASCIIEncoding().GetString(filtro).TrimEnd();
                                                if (valor.Equals(filtro2)) insere = false;
                                            }
                                            break;
                                        default:
                                            throw new SemanticError("Comparação de literais só pode ser igual ou diferente");
                                    }
                                }
                                if (insere && filtrosJoin.ContainsKey(campo))
                                {
                                    insere = filtrosJoin[campo].Exists(s => s.Equals(valor));
                                }

                            }

                            registro[i] = valor;
                        }

                        if (insere)
                        {
                            ts.Registros.Add(registro);
                            if (ts.Registros.Count >= Base.getInstance().qtd_max_registros) break;
                        }

                        if (br.BaseStream.Position % tamRegistro != 0)
                            br.BaseStream.Position += tamRegistro - (br.BaseStream.Position % tamRegistro);
                    }
                }
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.StackTrace);
                Console.ReadLine();
            }
            finally
            {
                if (br != null)
                {
                    br.Close();
                }
                if (file != null)
                {
                    file.Close();
                }
            }
            return ts;
        }
Beispiel #9
0
        /// <summary>
        /// este método define qual o método será chamado para o select sem where
        /// </summary>
        /// <param name="tabela"></param>
        /// <returns></returns>
        private TabelaSelect returnDados(Metadados tabela)
        {
            // não funcionou corretamente após trazer gambiarra select para dentro.
            //return Base.getInstance().arqBinarios[tabela.getNome()].returnDados(tabela);

            // manter este
            return GambiarraSelect.getInstance().returnDados(tabela);
        }
Beispiel #10
0
        /// <summary>
        /// este método define qual o método será chamado para o select com where
        /// </summary>
        /// <param name="filtrosAND"></param>
        /// <param name="tabela"></param>
        /// <returns></returns>
        private TabelaSelect returnDados(List<Filtro> filtrosAND,Dictionary<string,List<string>> filtrosJoin, Metadados tabela)
        {
            // não funcionou corretamente após trazer gambiarra select para dentro.
            //return Base.getInstance().arqBinarios[tabela.getNome()].returnDados(filtrosAND, filtrosJoin, tabela);

            // manter este
            return GambiarraSelect.getInstance().returnDados(filtrosAND, filtrosJoin, tabela);
        }
Beispiel #11
0
        /// <summary>
        /// método responsável por retornar o resultado do SELECT
        /// </summary>
        /// <returns>TabelaSelect formatada para apresentar no Form1</returns>
        public TabelaSelect run()
        {
            TabelaSelect tabelaSelect = null;

            //caso e select seja select tabela.* from tabela não será necessário
            //aplicar join pois tratará de apenas uma tabela
            //tratamento apenas para where
            if (asterisco)
            {
                string arqTabela = mem.getPath() + "\\" + tabelas[0].getNome() + ".dat";
                if (where != null)
                {
                    if (where.ListaFiltro == null || where.ListaFiltro.Count == 0)
                    {
                        //se não tiver filtro retorna tudo
                        //tabelaSelect = new Binarios(arqTabela).returnDados(tabelas[0]);
                        tabelaSelect = returnDados(tabelas[0]);
                    }
                    //traz os resultados filtrados por grupos de AND e depois junta com os OR's
                    foreach (List <Filtro> filtrosAND in where.ListaFiltro)
                    {
                        TabelaSelect tabelaFiltro = null;
                        tabelaFiltro = returnDados(filtrosAND, new Dictionary <string, List <string> >(), tabelas[0]);
                        if (tabelaSelect == null)
                        {
                            tabelaSelect = tabelaFiltro;
                        }
                        else
                        {
                            tabelaSelect.uniaoDistinct(tabelaFiltro);
                        }
                    }
                }
                else
                {
                    //se nao tiver filtro retorna tudo

                    tabelaSelect = returnDados(tabelas[0]);
                }
                //envia comando para a TabelaSelect ordenar os registros
                if (ordem.Count > 0)
                {
                    tabelaSelect.ordenaRegistros(ordem, ordemAscendente);
                }
                return(tabelaSelect);
            }

            //Se não tem asterisco o negócio complica

            //ordena as tabelas por qtdade registros
            tabelas.Sort(delegate(Metadados m1, Metadados m2)
            {
                return(m1.getNumeroRegistrosTabela() > m2.getNumeroRegistrosTabela() ? -1 : 1);
            });


            Dictionary <Metadados, Where> filtros = new Dictionary <Metadados, Where>();

            //separa os filtros referentes a cada tabela e, se tiver filtro, joga a tabela no inicio da ordenação
            for (int i = 0; i < tabelas.Count; i++)
            {
                Metadados m       = tabelas[i];
                Where     filtroE = new Where();
                //separa os filtros
                foreach (List <Filtro> filtrosAND in where.ListaFiltro)
                {
                    List <Filtro> maisFiltro = (filtrosAND.Where(f => f.LValue.StartsWith(m.getNome())).ToList());
                    filtroE.ListaFiltro.Add(maisFiltro);
                }
                //ordena pro inicio
                if (filtroE.ListaFiltro.Count > 0)
                {
                    m = tabelas[i];
                    tabelas.Remove(m);
                    tabelas.Insert(0, m);
                }
                filtros.Add(m, filtroE);
            }
            //seleciona cada tabela separadamente
            while (tabelas.Count > 0)
            {
                Metadados    m            = tabelas.First();
                TabelaSelect tabelaFiltro = null;
                //traz os resultados filtrados por grupos de AND e depois junta com os OR's
                if (filtros[m].ListaFiltro.Count > 0)
                {
                    foreach (List <Filtro> filtrosAND in where.ListaFiltro)
                    {
                        TabelaSelect tabelaFiltroOR = null;
                        //informa apenas os filtros relacionados com a tabela em questão
                        tabelaFiltroOR = returnDados(filtrosAND, filtros[m].FiltroJoin, m);
                        if (tabelaFiltro == null)
                        {
                            tabelaFiltro = tabelaFiltroOR;
                        }
                        else
                        {
                            tabelaFiltro.uniaoDistinct(tabelaFiltroOR);
                        }
                    }
                }
                else
                {
                    tabelaFiltro = returnDados(m);
                }

                tabelas.Remove(m);
                filtros.Remove(m);
                //Adicionando campos de join como filtro.

                foreach (Filtro f in where.ListaJoin)
                {
                    if (f.LValue.StartsWith(m.getNome()))
                    {
                        Metadados outroM = null;
                        foreach (Metadados meta in filtros.Keys)
                        {
                            if (f.RValue.StartsWith(meta.getNome()))
                            {
                                outroM = meta;
                                break;
                            }
                        }
                        //insere os registros de join como filtro para as proximas tabelas
                        if (outroM != null)
                        {
                            List <string> maisFiltro = new List <string>();
                            int           colEsq     = 0;
                            for (int i = 0; i < tabelaFiltro.Campos.Length; i++)
                            {
                                if (tabelaFiltro.Campos[i].Equals(f.LValue))
                                {
                                    colEsq = i;
                                    break;
                                }
                            }
                            foreach (string[] reg in tabelaFiltro.Registros)
                            {
                                maisFiltro.Add(reg[colEsq]);
                            }
                            maisFiltro.Sort();
                            filtros[outroM].FiltroJoin.Add(f.LValue, maisFiltro);

                            //joga o outroM para ser o proximo a pesquisar
                            tabelas.Remove(outroM);
                            tabelas.Insert(0, outroM);
                        }
                    }
                    if (f.RValue.StartsWith(m.getNome()))
                    {
                        Metadados outroM = null;
                        foreach (Metadados meta in filtros.Keys)
                        {
                            if (f.LValue.StartsWith(meta.getNome()))
                            {
                                outroM = meta;
                                break;
                            }
                        }
                        //insere os registros de join como filtro para as proximas tabelas
                        if (outroM != null)
                        {
                            List <string> maisFiltro = new List <string>();
                            int           colDir     = 0;
                            for (int i = 0; i < tabelaFiltro.Campos.Length; i++)
                            {
                                if (tabelaFiltro.Campos[i].Equals(f.LValue))
                                {
                                    colDir = i;
                                    break;
                                }
                            }
                            foreach (string[] reg in tabelaFiltro.Registros)
                            {
                                maisFiltro.Add(reg[colDir]);
                            }
                            maisFiltro.Sort();
                            filtros[outroM].FiltroJoin.Add(f.RValue, maisFiltro);

                            //joga o outroM para ser o proximo a pesquisar
                            tabelas.Remove(outroM);
                            tabelas.Insert(0, outroM);
                        }
                    }
                }/**/
                //se tem mais tabelas faz o join
                if (tabelaSelect == null)
                {
                    tabelaSelect = tabelaFiltro;
                }
                else
                {
                    tabelaSelect = tabelaSelect.join(tabelaFiltro, Where.ListaJoin);
                }
            }
            //envia comando para a TabelaSelect ordenar os registros
            if (ordem.Count > 0)
            {
                tabelaSelect.ordenaRegistros(ordem, ordemAscendente);
            }
            return(tabelaSelect);
        }
Beispiel #12
0
        /// <summary>
        /// este método define qual o método será chamado para o select com where
        /// </summary>
        /// <param name="filtrosAND"></param>
        /// <param name="tabela"></param>
        /// <returns></returns>
        private TabelaSelect returnDados(List <Filtro> filtrosAND, Dictionary <string, List <string> > filtrosJoin, Metadados tabela)
        {
            // não funcionou corretamente após trazer gambiarra select para dentro.
            //return Base.getInstance().arqBinarios[tabela.getNome()].returnDados(filtrosAND, filtrosJoin, tabela);

            // manter este
            return(GambiarraSelect.getInstance().returnDados(filtrosAND, filtrosJoin, tabela));
        }
Beispiel #13
0
        public TabelaSelect returnDados(Metadados tabela)
        {
            try { Base.getInstance().desalocarBinarios(tabela.getNome()); } catch { }
            TabelaSelect ts   = null;
            FileStream   file = null;
            BinaryReader br   = null;

            try
            {
                string arquivo = mem.getPath() + "\\" + tabela.getNome() + ".dat";
                file = new FileStream(arquivo, FileMode.Open);
                using (br = new BinaryReader(file))
                {
                    int count;
                    ts = new TabelaSelect();

                    Metadados meta    = GerenciadorMemoria.getInstance().recuperarMetadados(tabela.getNome());
                    int       colunas = meta.getNomesColunas().Count;
                    ts.Campos = new string[colunas];
                    for (int i = 0; i < colunas; i++)
                    {
                        ts.Campos[i] = meta.getNome() + "." + meta.getNomesColunas()[i];
                    }

                    //lê cada registro
                    while (br.BaseStream.Position != br.BaseStream.Length)
                    {
                        string[]       registro = new string[colunas];
                        RegistroTabela r        = new RegistroTabela(br.ReadInt64());
                        count = br.ReadInt32();
                        //Lê cada dado dentro do registro
                        for (int i = 0; i < count; i++)
                        {
                            string   nomeColuna = meta.getNomesColunas()[i];
                            TipoDado tipo       = meta.getDados()[nomeColuna].getTipoDado();
                            string   valor      = "";
                            if (tipo == TipoDado.Inteiro)
                            {
                                byte tamanho  = br.ReadByte();
                                bool isValido = br.ReadBoolean();
                                int  numero   = br.ReadInt32();
                                valor = isValido ? numero + "" : "NULL";
                            }
                            else
                            {
                                byte   tamanho  = br.ReadByte();
                                bool   isValido = br.ReadBoolean();
                                byte[] literal  = br.ReadBytes(tamanho);
                                string texto    = new System.Text.ASCIIEncoding().GetString(literal);
                                valor = isValido ? texto : "NULL";
                            }

                            registro[i] = valor;
                        }

                        ts.Registros.Add(registro);
                        if (ts.Registros.Count >= Base.getInstance().qtd_max_registros)
                        {
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
                Console.ReadLine();
            }
            finally
            {
                if (br != null)
                {
                    br.Close();
                }
                if (file != null)
                {
                    file.Close();
                }
            }

            return(ts);
        }
Beispiel #14
0
        /*
         * ~Semantico()
         * {
         *  Base.getInstance().naoEhInsert();
         * }
         */

        public void executeAction(int action, Token token)
        {
            int index;

            if ((action != 16 && action != 1) && memoria.getDatabase() == null)
            {
                throw new SGDBException("utilize o comando SET DATABASE...");
            }

            switch (action)
            {
            case 0:
                execucaoComandoReal();
                acaoZero();
                break;

            case 1:
                memoria.createDatabase(token.getLexeme().ToLower());
                form1.Text = memoria.getDatabase();
                break;

            case 2:
                if (memoria.existeTabela(token.getLexeme().ToLower()))
                {
                    throw new SemanticError("Tabela " + token.getLexeme().ToLower() + " já existe", token.getLinha());
                }
                operacao = acao.CriarTabela;
                metadados.setNome(token.getLexeme().ToLower());
                break;

            case 3:
                if (memoria.existeIndice(token.getLexeme().ToLower()))
                {
                    throw new SemanticError("Index " + token.getLexeme().ToLower() + " já existe", token.getLinha());
                }
                operacao = acao.CriarIndex;
                identificadores.Add(token.getLexeme().ToLower());
                break;

            case 4:
                if (!memoria.existeTabela(token.getLexeme().ToLower()))
                {
                    throw new SemanticError("Tabela " + token.getLexeme().ToLower() + " não existe", token.getPosition());
                }
                // Como é so saber o metadados, e ele tem o nome da tabela, não precisa ficar colocando a mesma no array
                // de identificadores
                metadados = GerenciadorMemoria.getInstance().recuperarMetadados(token.getLexeme().ToLower());
                /* arquivoBinario = new ArquivoBinario(memoria.getPath());*/
                if (metadados.getNumeroRegistrosTabela() > 0)
                {
                    throw new SemanticError("Não se cria index em tabelas que já tenham dados", token.getLinha());
                }
                break;

            case 5:

                identificadores.Add(token.getLexeme().ToLower());
                break;

            case 6:
                if (sexta)
                {
                    Console.WriteLine(identificadores.Count);
                    Console.WriteLine(valoresColunas.Count);
                    for (int i = 0; i < identificadores.Count; i++)
                    {
                        metadados.addDados(new DadosTabela(identificadores[i], valoresColunas[i].getTipo(), valoresColunas[i].getTamanho()));
                    }
                    identificadores.Clear();
                    valoresColunas.Clear();
                    sexta = false;
                }
                else
                {
                    foreach (string id in identificadores)
                    {
                        if (!metadados.getDados().ContainsKey(id))
                        {
                            throw new SemanticError("Campo " + token.getLexeme() + " não existe", token.getLinha());
                        }
                        metadados.getDados()[id].setPrimary(true);
                    }
                    identificadores.Clear();
                }
                break;

            case 7:
                if (!metadados.getDados().ContainsKey(token.getLexeme()))
                {
                    throw new SemanticError("Campo " + token.getLexeme() + " não existe", token.getLinha());
                }
                identificadores.Add(token.getLexeme());
                break;

            case 8:
                if (!memoria.existeTabela(token.getLexeme().ToLower()))
                {
                    throw new SemanticError("Tabela " + token.getLexeme().ToLower() + " não existe", token.getPosition());
                }
                identificadores.Add(token.getLexeme().ToLower());
                break;

            case 9:
                if (!memoria.recuperarMetadados(identificadores[1]).getDados().ContainsKey(token.getLexeme().ToLower()))
                {
                    throw new SemanticError("Campo " + token.getLexeme().ToLower() + " na tabela " + identificadores[1] + "não existe", token.getPosition());
                }
                metadados.getDados()[identificadores[0]].setForeing(identificadores[1], token.getLexeme().ToLower());

                // so pra salvar a alteração de mais uma chave estrangeira
                Metadados aux = memoria.recuperarMetadados(identificadores[1]);
                //aux.getDadosColuna()[identificadores[1]].incForeing();
                //aux.getDados()[identificadores[1]].addForeing();
                aux.getDados()[identificadores[1]].incForeing();
                memoria.salvarMetadados(aux);

                identificadores.Clear();
                break;

            case 10:
                // decidir tamanho
                valoresColunas.Add(new ValoresCampos("INTEGER", 4));
                break;

            case 11:
                if (Convert.ToInt32(token.getLexeme()) > 255 || Convert.ToInt32(token.getLexeme()) < 1)
                {
                    throw new SemanticError("Tamanho do campo " + identificadores.Last() + " inválido", token.getLinha());
                }
                valoresColunas.Add(new ValoresCampos("VARCHAR", Convert.ToInt32(token.getLexeme())));
                break;

            case 12:
                if (Convert.ToInt32(token.getLexeme()) > 255 || Convert.ToInt32(token.getLexeme()) < 1)
                {
                    throw new SemanticError("Tamanho do campo " + identificadores.Last() + " inválido", token.getLinha());
                }
                valoresColunas.Add(new ValoresCampos("CHAR", Convert.ToInt32(token.getLexeme())));
                break;

            case 13:
                //Exclusão com verificação de foreing e exclusão das referencias
                memoria.dropTable(token.getLexeme().ToLower());
                break;

            case 14:
                //Exclusão de index
                if (memoria.existeIndice(token.getLexeme().ToLower()))
                {
                    identificadores.Add(token.getLexeme().ToLower());
                    operacao = acao.ExcluirIndex;
                }
                else
                {
                    throw new SemanticError("Index " + token.getLexeme().ToLower() + "não existe", token.getLinha());
                }
                break;

            case 15:
                Form1.setResultado(memoria.recuperarMetadados(token.getLexeme().ToLower()));
                break;

            case 16:
                memoria.setDatabase(token.getLexeme().ToLower());
                form1.Text = memoria.getDatabase();
                break;

            case 17:
                if (ultimoFiltro != null)
                {
                    throw new SGDBException("Falha na operação semântica 17. O Filtro deveria estar nulo.");
                }
                ultimoFiltro = new Filtro();
                if (token.getId() == 16)
                {
                    ultimoFiltro.IsAND = true;
                }
                else if (token.getId() == 17)
                {
                    ultimoFiltro.IsOR = true;
                }
                break;

            case 18:
                // Operador Relacional da cláusula Where do SELECT
                select.Where = select.Where == null ? new Where() : select.Where;
                ultimoFiltro = ultimoFiltro == null ? new Filtro() : ultimoFiltro;
                //Joga o campo para o LValue, caso tenha sido incluído como retorno do select. Acontece no primeiro filtro.
                //ultimoFiltro.LValue = ultimoFiltro.LValue == null? select.removeUltimoRetorno(): ultimoFiltro.LValue;
                switch (token.getId())
                {
                case 37:
                    ultimoFiltro.Op = OperadorRel.Igual;
                    break;

                case 38:
                    ultimoFiltro.Op = OperadorRel.MaiorQue;
                    select.Etapa    = Select.EtapaSemantica.WHERE;
                    break;

                case 39:
                    ultimoFiltro.Op = OperadorRel.MenorQue;
                    select.Etapa    = Select.EtapaSemantica.WHERE;
                    break;

                case 40:
                    ultimoFiltro.Op = OperadorRel.MaiorIgualA;
                    select.Etapa    = Select.EtapaSemantica.WHERE;
                    break;

                case 41:
                    ultimoFiltro.Op = OperadorRel.MenorIgualA;
                    select.Etapa    = Select.EtapaSemantica.WHERE;
                    break;

                case 42:
                    ultimoFiltro.Op = OperadorRel.Diferente;
                    select.Etapa    = Select.EtapaSemantica.WHERE;
                    break;

                default:
                    break;
                }
                break;

            case 19:
                operacao  = acao.InserirDados;
                metadados = memoria.recuperarMetadados(identificadores[0]);
                if (identificadores.Count > 1)
                {
                    allColunas  = false;
                    contColunas = identificadores.Count - 1;

                    for (int i = 1; i < identificadores.Count; i++)
                    {
                        if (!metadados.getDados().ContainsKey(identificadores[i]))
                        {
                            throw new SemanticError("Campo " + identificadores[i] + "não existe na tabela " + identificadores[0], token.getLinha());
                        }
                    }
                }
                break;

            case 20:
                int indexColuna;
                if (allColunas)
                {
                    index       = identificadores.Count - 1;
                    indexColuna = index;
                    if (index >= metadados.getNomesColunas().Count)
                    {
                        throw new SemanticError("Mais valores do que campos", token.getLinha());
                    }
                }
                else
                {
                    index       = identificadores.Count - contColunas;
                    indexColuna = metadados.getNomesColunas().IndexOf(identificadores[index]);
                    if ((index - 1) >= contColunas)
                    {
                        throw new SemanticError("Mais valores do que campos", token.getLinha());
                    }
                }
                if (ListaDeSimbolos.getInstance().classeToken(token.getId()).Contains(metadados.getDados()[metadados.getNomesColunas()[indexColuna]].geTipo()) || ListaDeSimbolos.getInstance().classeToken(token.getId()).Equals("null"))
                {
                    // tipo tá correto
                    // validação de tamanho
                    if (ListaDeSimbolos.getInstance().classeToken(token.getId()).Equals("null"))
                    {
                        identificadores.Add(token.getLexeme());
                    }
                    else
                    {
                        if (token.getId() == 3)    // Integer
                        {
                            if (Convert.ToUInt32(token.getLexeme()) <= UInt32.MaxValue)
                            {
                                identificadores.Add(token.getLexeme());
                            }
                            else
                            {
                                throw new SemanticError("DadoTabela " + token.getLexeme() + " de tamanho incompativel", token.getLinha());
                            }
                        }
                        else
                        {
                            if ((token.getLexeme().Length - 2) <= metadados.getDados()[metadados.getNomesColunas()[indexColuna]].getTamanho())
                            {
                                identificadores.Add(token.getLexeme());
                            }
                            else
                            {
                                throw new SemanticError("DadoTabela " + token.getLexeme() + " de tamanho incompativel(" + metadados.getDados()[metadados.getNomesColunas()[index]].getTamanho() + ")", token.getLinha());
                            }
                        }
                    }
                }
                else
                {
                    throw new SemanticError("DadoTabela " + token.getLexeme() + " tem tipo incompativel com o campo " + metadados.getDados()[metadados.getNomesColunas()[index]] + " de tipo " + metadados.getDados()[metadados.getNomesColunas()[index]].geTipo(), token.getLinha());
                }
                break;

            case 21:
                // tabela.campo --> Nome da coluna solicitada no SELECT
                // Caso ainda não tenha sido definido, define a ação SELECT
                select   = Select.singleton();
                operacao = acao.Select;
                // verifica a existencia do campo
                if (!memoria.recuperarMetadados(identificadores.Last()).getNomesColunas().Exists(s => s.Equals(token.getLexeme())))
                {
                    throw new SemanticError("Campo " + identificadores.Last() + "." + token.getLexeme() + " não existe", token.getLinha());
                }
                switch (select.Etapa)
                {
                case Select.EtapaSemantica.CAMPOS:
                    // Adiciona o campo de retorno do SELECT
                    select.addTabela(identificadores.Last());
                    string ret = identificadores.Last() + "." + token.getLexeme().ToLower();
                    identificadores.Remove(identificadores.Last());
                    select.addRetorno(ret);
                    break;

                case Select.EtapaSemantica.TABELA:
                    throw new SGDBException("Não devia passar por aqui. Ação semantica 21. Select.ETAPA = Tabela");

                case Select.EtapaSemantica.JOIN:
                    ultimoFiltro = ultimoFiltro == null ? new Filtro() : ultimoFiltro;         //necessário na primeira linha do where
                    if (ultimoFiltro.LValue == null)
                    {
                        //se ainda não foi atribuído LValue, então deve estar no lado esquerdo da operação.
                        ultimoFiltro.LValue = identificadores.Last() + "." + token.getLexeme().ToLower();
                        identificadores.Remove(identificadores.Last());
                    }
                    else
                    {
                        if (select.Etapa == Select.EtapaSemantica.WHERE)
                        {
                            throw new SemanticError("Os primeiros filtros devem ser de JOIN. Cláusula JOIN já finalizada.", token.getLinha());
                        }
                        if (ultimoFiltro.IsOR)
                        {
                            throw new SemanticError("JOIN deve utilizar AND", token.getLinha());
                        }
                        if (ultimoFiltro.LValue.Split('.')[0].Equals(identificadores.Last()))
                        {
                            throw new SemanticError("JOIN deve ser feito entre tabelas distintas", token.getLinha());
                        }
                        ultimoFiltro.RValue = identificadores.Last() + "." + token.getLexeme();
                        identificadores.Remove(identificadores.Last());
                        ultimoFiltro.IsAND = true;
                        select.Where.addJoin(ultimoFiltro);
                        ultimoFiltro = null;
                    }
                    break;

                case Select.EtapaSemantica.WHERE:
                    ultimoFiltro.LValue = identificadores.Last() + "." + token.getLexeme().ToLower();
                    identificadores.Remove(identificadores.Last());
                    break;

                case Select.EtapaSemantica.ORDER:
                    string campo = identificadores.Last() + "." + token.getLexeme().ToLower();
                    select.addOrderBy(campo);
                    identificadores.Remove(identificadores.Last());
                    break;

                default:
                    throw new SGDBException("Não devia passar por aqui. Ação semantica 21. Select.ETAPA = Default");
                }

                break;

            case 22:
                //token do apelido da cláusula AS. O SELECT adiciona o apelido no último campo adicionado.
                //clausulaAs[identificadores.Last()] = token.getLexeme(); // esta linha é necessária?
                if (select.Where != null)
                {
                    //se já passou pelo where, provavelmente está no ORDER BY
                    throw new SemanticError("Não existe AS pra ORDER BY!", token.getLinha());
                }
                select.addApelidoUltimo(token.getLexeme());
                break;

            case 23:
                //tabela.* --> selecão de todos os campos de uma tabela
                //Caso ainda não tenha sido definido, define a ação SELECT
                select   = Select.singleton();
                operacao = acao.Select;
                //busca a tabela armazenada na última ação semântica
                string tabela = identificadores.Last();
                identificadores.RemoveAt(identificadores.Count - 1);
                //inclui a tabela no objeto SELECT
                select.addTabela(tabela);
                //busca as colunas da tabela para incluir no retorno

                foreach (String col in memoria.recuperarMetadados(tabela).getNomesColunas())
                {
                    string coluna = tabela + "." + col;
                    identificadores.Add(coluna);     //estou inserindo no identificadores também porque ainda não sei se isto será usado em outro momento
                    select.addRetorno(coluna);
                }
                select.Asterisco = true;
                break;

            case 24:
                // FROM tabelas
                // inclui as tabelas numa lista a parte para validar depois com a classe select.
                fromTabelas.Add(token.getLexeme());
                break;

            case 25:
                throw new SemanticError("Ação INNER JOIN não suportada neste formato. Insira um filtro no Where.");

            case 26:
                throw new SemanticError("Ação LEFT JOIN não suportada.");

            case 27:
                throw new SemanticError("Ação RIGHT JOIN não suportada.");

            case 28:
                //final do ORDER BY. Verificar se os campos constam no retorno.
                //Não necessário, pois é verificado ao inserir cada campo, na ação 21.
                break;

            case 29:
                //Define a ordenação dos campos como descrecente
                select.orderDesc();
                break;

            case 30:
                select.Etapa        = Select.EtapaSemantica.WHERE;
                ultimoFiltro.RValue = token.getLexeme();
                //ultimoFiltro.IsOR? select.Where:break;
                if (ultimoFiltro.IsOR)
                {
                    select.Where.addFiltroOR(ultimoFiltro);
                }
                else
                {
                    select.Where.addFiltroAND(ultimoFiltro);
                }
                ultimoFiltro = null;
                break;

            case 31:
                //logo depois do FROM
                select.Etapa = Select.EtapaSemantica.TABELA;
                break;

            case 32:
                //logo antes do Where. o where inicia com possível join.
                select.Etapa = Select.EtapaSemantica.JOIN;
                break;

            case 33:
                //logo antes do order
                select.Etapa = Select.EtapaSemantica.ORDER;
                break;

            default:
                throw new SGDBException("Ação " + action + " não implementada.");
            }
            //Console.WriteLine("Ação #" + action + ", Token: " + token);
        }
Beispiel #15
0
        private void execucaoComandoReal()
        {
            string id;

            if (operacao != acao.InserirDados && anterior == acao.InserirDados)
            {
                //Base.getInstance().naoEhInsert();
                memoria.salvarMetadados();
            }
            switch (operacao)
            {
            case acao.Nada:
                //throw new SGDBException("Que ação é essa? Favor incluir um comando válido.");
                break;

            case acao.CriarTabela:
                metadados.criarIndiciePrimary();
                memoria.salvarMetadados(metadados);
                memoria.recuperarMetadados();
                break;

            case acao.InserirDados:

                id = identificadores[0];
                identificadores.RemoveAt(0);
                RegistroTabela registro = new RegistroTabela(-1);
                metadados = memoria.recuperarMetadados(id);

                if (allColunas)
                {
                    DadoTabela DadoTabela;
                    for (int i = 0; i < identificadores.Count; i++)
                    {
                        if (identificadores[i].Equals("null"))
                        {
                            DadoTabela = new DadoTabela(metadados.getNomesColunas()[i], metadados.getTipoDado(i), (byte)metadados.getDados()[metadados.getNomesColunas()[i]].getTamanho(), false, identificadores[i].Replace("\'", ""));
                        }
                        else
                        {
                            DadoTabela = new DadoTabela(metadados.getNomesColunas()[i], metadados.getTipoDado(i), (byte)metadados.getDados()[metadados.getNomesColunas()[i]].getTamanho(), true, identificadores[i].Replace("\'", ""));
                        }

                        registro.dados.Add(DadoTabela);
                    }
                }
                else
                {
                    DadoTabela dado  = null;
                    bool       nacho = true;
                    for (int i = 0; i < metadados.getNomesColunas().Count; i++)
                    {
                        nacho = true;
                        for (int j = 0; j < contColunas && nacho; j++)
                        {
                            if (metadados.getNomesColunas()[i].Equals(identificadores[j]))
                            {
                                if (identificadores[j + contColunas].Equals("null"))
                                {
                                    dado = new DadoTabela(metadados.getNomesColunas()[i], metadados.getTipoDado(i), (byte)metadados.getDados()[metadados.getNomesColunas()[i]].getTamanho(), false, identificadores[j + contColunas].Replace("\'", ""));
                                }
                                else
                                {
                                    dado = new DadoTabela(metadados.getNomesColunas()[i], metadados.getTipoDado(i), (byte)metadados.getDados()[metadados.getNomesColunas()[i]].getTamanho(), true, identificadores[j + contColunas].Replace("\'", ""));
                                }
                                nacho = false;
                            }
                        }
                        if (nacho)
                        {
                            dado = new DadoTabela(metadados.getNomesColunas()[i], metadados.getTipoDado(i), (byte)metadados.getDados()[metadados.getNomesColunas()[i]].getTamanho(), false, "null");
                        }

                        registro.dados.Add(dado);
                    }
                }
                // Console.WriteLine("TO STRING DA TABELA");

                /*TabelaDado tabelaDado = new TabelaDado(id, memoria.getPath());
                 * tabelaDado.Registros.Add(RegistroTabela);*/
                // Form1.addMensagem(tabelaDado.ToString());

                //arquivoBinario = new ArquivoTabela(memoria.getPath()+"\\"+metadados.getNome()+".dat");
                //long posi = arquivoBinario.insert(registro);
                Base.getInstance().insert(metadados.getNome(), registro);

                metadados.incRegistrosTabela();
                //metadados.addIndice(registro, posi, memoria.getPath());
                //memoria.salvarMetadados(metadados);
                memoria.atualizar();

                break;

            case acao.Select:
                Form1.addMensagem(select.ToString());
                Form1.setResultado(select.run(), select.Retorno);
                select.clear();
                break;

            case acao.CriarIndex:
                id = identificadores[0];
                identificadores.RemoveAt(0);
                foreach (string item in identificadores)
                {
                    if (!metadados.getDados().ContainsKey(item))
                    {
                        new SemanticError("A coluna " + item + "não existe na tabela " + metadados.getNome());
                    }
                }
                metadados.criarIndice(id, identificadores.ToArray());
                memoria.salvarMetadados(metadados);
                memoria.atualizar();
                break;

            case acao.ExcluirIndex:
                memoria.dropIndex(identificadores[0]);
                memoria.salvarMetadados();
                memoria.atualizar();
                break;

            default:
                throw new SGDBException("Ação Real" + operacao + " não implementada.");
            }
            anterior = operacao;
            //Console.WriteLine(metadados.StringIndices());
        }
Beispiel #16
0
        public TabelaSelect returnDados(Metadados tabela)
        {
            try { Base.getInstance().desalocarBinarios(tabela.getNome()); } catch { }
            TabelaSelect ts = null;
            FileStream file = null;
            BinaryReader br = null;
            try
            {
                string arquivo = mem.getPath() + "\\" + tabela.getNome() + ".dat";
                file = new FileStream(arquivo, FileMode.Open);
                using (br = new BinaryReader(file))
                {
                    int count;
                    ts = new TabelaSelect();

                    Metadados meta = GerenciadorMemoria.getInstance().recuperarMetadados(tabela.getNome());
                    int colunas = meta.getNomesColunas().Count;
                    ts.Campos = new string[colunas];
                    for (int i = 0; i < colunas; i++)
                    {
                        ts.Campos[i] = meta.getNome() + "." + meta.getNomesColunas()[i];
                    }

                    //lê cada registro
                    while (br.BaseStream.Position != br.BaseStream.Length)
                    {
                        string[] registro = new string[colunas];
                        RegistroTabela r = new RegistroTabela(br.ReadInt64());
                        count = br.ReadInt32();
                        //Lê cada dado dentro do registro
                        for (int i = 0; i < count; i++)
                        {
                            string nomeColuna = meta.getNomesColunas()[i];
                            TipoDado tipo = meta.getDados()[nomeColuna].getTipoDado();
                            string valor = "";
                            if (tipo == TipoDado.Inteiro)
                            {
                                byte tamanho = br.ReadByte();
                                bool isValido = br.ReadBoolean();
                                int numero = br.ReadInt32();
                                valor = isValido ? numero + "" : "NULL";
                            }
                            else
                            {
                                byte tamanho = br.ReadByte();
                                bool isValido = br.ReadBoolean();
                                byte[] literal = br.ReadBytes(tamanho);
                                string texto = new System.Text.ASCIIEncoding().GetString(literal);
                                valor = isValido ? texto : "NULL";
                            }

                            registro[i] = valor;
                        }

                        ts.Registros.Add(registro);
                        if (ts.Registros.Count >= Base.getInstance().qtd_max_registros) break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
                Console.ReadLine();
            }
            finally
            {
                if (br != null)
                {
                    br.Close();
                }
                if (file != null)
                {
                    file.Close();
                }
            }

            return ts;
        }
Beispiel #17
0
        public TabelaSelect returnFiltrado(Dictionary <string, Filtro> filtrosAND)
        {
            br.BaseStream.Position = 0;
            int        count;
            int        tamRegistro = 12;
            Metadados  meta        = GerenciadorMemoria.getInstance().recuperarMetadados(nome);
            TabelaDado td          = new TabelaDado(nome);

            foreach (DadosTabela dados in meta.getDados().Values)
            {
                tamRegistro += dados.getTamanho() + 2;
                //if (dados.getTipoDado() == TipoDado.String) tamRegistro++;
            }

            //lê cada registro
            while (br.BaseStream.Position != br.BaseStream.Length)
            {
                RegistroTabela r = new RegistroTabela(br.BaseStream.Position);
                count = br.ReadInt32();
                bool insere = true;
                //Lê cada dado dentro do registro
                for (int i = 0; i < count && insere; i++)
                {
                    DadoTabela d;
                    //Form1.addMensagem(i.ToString());

                    // *** erro aqui - inicio ***
                    // select localidade.* from localidade where localidade.cd_localidade = 1;
                    // da erro qdo i = 4
                    // mas quem deve limitar para nao chegar no 4 ?

                    string nomeColuna = meta.getNomesColunas()[i];
                    // *** erro aqui - Fim ***

                    TipoDado tipo  = meta.getDados()[nomeColuna].getTipoDado();
                    string   campo = meta.getNome() + "." + nomeColuna;
                    Filtro   f     = filtrosAND.ContainsKey(campo) ? filtrosAND[campo] : null;
                    if (tipo == TipoDado.Inteiro)
                    {
                        d = new DadoTabela(nomeColuna, tipo, br.ReadByte(), br.ReadBoolean(), br.ReadInt32());
                        if (f != null)
                        {
                            switch (f.Op)
                            {
                            case OperadorRel.Igual:
                                if (f.RValue.ToLower().Equals("null"))
                                {
                                    if (d.isValido)
                                    {
                                        insere = false;
                                    }
                                }
                                else
                                {
                                    if (d.getValorInt() != Convert.ToInt32(f.RValue))
                                    {
                                        insere = false;
                                    }
                                }
                                break;

                            case OperadorRel.MaiorQue:
                                if (d.getValorInt() <= Convert.ToInt32(f.RValue))
                                {
                                    insere = false;
                                }
                                break;

                            case OperadorRel.MenorQue:
                                if (d.getValorInt() >= Convert.ToInt32(f.RValue))
                                {
                                    insere = false;
                                }
                                break;

                            case OperadorRel.MaiorIgualA:
                                if (d.getValorInt() < Convert.ToInt32(f.RValue))
                                {
                                    insere = false;
                                }
                                break;

                            case OperadorRel.MenorIgualA:
                                if (d.getValorInt() > Convert.ToInt32(f.RValue))
                                {
                                    insere = false;
                                }
                                break;

                            case OperadorRel.Diferente:
                                if (f.RValue.ToLower().Equals("null"))
                                {
                                    if (!d.isValido)
                                    {
                                        insere = false;
                                    }
                                }
                                else
                                {
                                    if (d.getValorInt() == Convert.ToInt32(f.RValue))
                                    {
                                        insere = false;
                                    }
                                }
                                break;

                            default:
                                throw new SGDBException("Passou onde nao devia: GambiarraSelect.retornaDados.Inteiro.Default.");
                            }
                        }
                    }
                    else
                    {
                        byte   tamanho  = br.ReadByte();
                        bool   isValido = br.ReadBoolean();
                        byte[] valor    = br.ReadBytes(tamanho);
                        string texto    = new System.Text.ASCIIEncoding().GetString(valor);
                        d = new DadoTabela(nomeColuna, tipo, tamanho, isValido, texto);
                        if (f != null)
                        {
                            switch (f.Op)
                            {
                            case OperadorRel.Igual:
                                if (f.RValue.ToLower().Equals("null"))
                                {
                                    if (d.isValido)
                                    {
                                        insere = false;
                                    }
                                }
                                else
                                {
                                    byte[] filtro = new byte[d.tamanho];
                                    new System.Text.ASCIIEncoding().GetBytes(f.RValue.PadRight(d.tamanho)).CopyTo(filtro, 0);
                                    string filtro2 = new System.Text.ASCIIEncoding().GetString(filtro);
                                    if (!texto.Equals(filtro2))
                                    {
                                        insere = false;
                                    }
                                }
                                break;

                            case OperadorRel.Diferente:
                                if (f.RValue.ToLower().Equals("null"))
                                {
                                    if (!d.isValido)
                                    {
                                        insere = false;
                                    }
                                }
                                else
                                {
                                    byte[] filtro = new byte[d.tamanho];
                                    new System.Text.ASCIIEncoding().GetBytes(f.RValue.PadRight(d.tamanho)).CopyTo(filtro, 0);
                                    string filtro2 = new System.Text.ASCIIEncoding().GetString(filtro);
                                    if (texto.Equals(filtro2))
                                    {
                                        insere = false;
                                    }
                                }
                                break;

                            default:
                                throw new SemanticError("Comparação de literais só pode ser igual ou diferente");
                            }
                        }
                    }

                    r.dados.Add(d);
                }

                if (insere)
                {
                    td.registros.Add(r);
                }

                if (br.BaseStream.Position % tamRegistro != 0)
                {
                    br.BaseStream.Position += tamRegistro - (br.BaseStream.Position % tamRegistro);
                }
            }

            return(TabelaSelect.getTabelaSelect(td));
        }
Beispiel #18
0
        public TabelaSelect returnDados(List <Filtro> filtrosAND, Dictionary <string, List <string> > filtrosJoin, Metadados tabela)
        {
            try { Base.getInstance().desalocarBinarios(tabela.getNome()); } catch { }
            TabelaSelect ts   = null;
            FileStream   file = null;
            BinaryReader br   = null;

            try
            {
                string arquivo = mem.getPath() + "\\" + tabela.getNome() + ".dat";
                file = new FileStream(arquivo, FileMode.Open);
                using (br = new BinaryReader(file))
                {
                    int count;
                    ts = new TabelaSelect();

                    Metadados meta    = GerenciadorMemoria.getInstance().recuperarMetadados(tabela.getNome());
                    int       colunas = meta.getNomesColunas().Count;
                    ts.Campos = new string[colunas];
                    for (int i = 0; i < colunas; i++)
                    {
                        ts.Campos[i] = meta.getNome() + "." + meta.getNomesColunas()[i];
                    }

                    //calcula o tamanho de cada registro
                    int tamRegistro = 12;
                    int posPrimary  = 0;//posicao do primary key no registro
                    foreach (DadosTabela dados in meta.getDados().Values)
                    {
                        if (dados.isPrimary())
                        {
                            posPrimary = tamRegistro + 2;
                        }
                        tamRegistro += dados.getTamanho() + 2;
                    }

                    long posMax = br.BaseStream.Length; //posicao máxima para leitura do arquivo
                    //organiza os filtros por coluna
                    List <Filtro>[] filtrosCampo = new List <Filtro> [colunas];
                    for (int i = 0; i < colunas; i++)
                    {
                        ts.Campos[i]    = meta.getNome() + "." + meta.getNomesColunas()[i];
                        filtrosCampo[i] = new List <Filtro>();
                        foreach (Filtro f in filtrosAND)
                        {
                            if (f.LValue.Equals(ts.Campos[i]))
                            {
                                filtrosCampo[i].Add(f);
                            }
                        }
                        if (filtrosJoin.ContainsKey(ts.Campos[i]))
                        {
                            posMax = posicionaPonteiroArquivo(filtrosJoin[ts.Campos[i]], br, tamRegistro, posPrimary);
                        }
                        //se o campo for PrimaryKey organiza o filtro
                        else if (filtrosCampo[i].Count > 0 && meta.getDados()[meta.getNomesColunas()[i]].isPrimary())
                        {
                            ordenaFiltros(filtrosCampo[i]);
                            //define o intervalo de consulta do arquivo caso exista filtro de chave primaria
                            posMax = posicionaPonteiroArquivo(filtrosCampo[i], br, tamRegistro, posPrimary);
                        }
                    }

                    //lê cada registro
                    while (br.BaseStream.Position < posMax)
                    {
                        string[] registro = new string[colunas];
                        long     posicao  = br.ReadInt64();
                        count = br.ReadInt32();
                        bool insere = true;
                        //Lê cada dado dentro do registro
                        for (int i = 0; i < count && insere; i++)
                        {
                            string   nomeColuna = meta.getNomesColunas()[i];
                            TipoDado tipo       = meta.getDados()[nomeColuna].getTipoDado();
                            bool     isPrimary  = meta.getDados()[nomeColuna].isPrimary();
                            string   valor      = "";
                            string   campo      = meta.getNome() + "." + nomeColuna;

                            if (tipo == TipoDado.Inteiro)
                            {
                                byte tamanho  = br.ReadByte();
                                bool isValido = br.ReadBoolean();
                                int  numero   = br.ReadInt32();
                                valor = isValido ? numero + "" : "NULL";
                                foreach (Filtro f in filtrosCampo[i])
                                {
                                    switch (f.Op)
                                    {
                                    case OperadorRel.Igual:
                                        if (f.RValue.ToLower().Equals("null"))
                                        {
                                            if (isValido)
                                            {
                                                insere = false;
                                            }
                                        }
                                        else
                                        {
                                            if (numero != Convert.ToInt32(f.RValue))
                                            {
                                                insere = false;
                                            }
                                        }
                                        break;

                                    case OperadorRel.MaiorQue:
                                        if (numero <= Convert.ToInt32(f.RValue))
                                        {
                                            insere = false;
                                        }
                                        break;

                                    case OperadorRel.MenorQue:
                                        if (numero >= Convert.ToInt32(f.RValue))
                                        {
                                            insere = false;
                                        }
                                        break;

                                    case OperadorRel.MaiorIgualA:
                                        if (numero < Convert.ToInt32(f.RValue))
                                        {
                                            insere = false;
                                        }
                                        break;

                                    case OperadorRel.MenorIgualA:
                                        if (numero > Convert.ToInt32(f.RValue))
                                        {
                                            insere = false;
                                        }
                                        break;

                                    case OperadorRel.Diferente:
                                        if (f.RValue.ToLower().Equals("null"))
                                        {
                                            if (!isValido)
                                            {
                                                insere = false;
                                            }
                                        }
                                        else
                                        {
                                            if (numero == Convert.ToInt32(f.RValue))
                                            {
                                                insere = false;
                                            }
                                        }
                                        break;

                                    default:
                                        throw new SGDBException("Passou onde nao devia: GambiarraSelect.retornaDados.Inteiro.Default.");
                                    }
                                }
                                if (insere && filtrosJoin.ContainsKey(campo))
                                {
                                    insere = filtrosJoin[campo].Exists(s => s.Equals(valor));
                                }
                            }
                            else
                            {
                                byte   tamanho  = br.ReadByte();
                                bool   isValido = br.ReadBoolean();
                                byte[] literal  = br.ReadBytes(tamanho);
                                string texto    = new System.Text.ASCIIEncoding().GetString(literal);
                                valor = isValido ? texto.TrimEnd() : "NULL";
                                foreach (Filtro f in filtrosCampo[i])
                                {
                                    switch (f.Op)
                                    {
                                    case OperadorRel.Igual:
                                        if (f.RValue.ToLower().Equals("null"))
                                        {
                                            if (isValido)
                                            {
                                                insere = false;
                                            }
                                        }
                                        else
                                        {
                                            byte[] filtro = new byte[tamanho];
                                            new System.Text.ASCIIEncoding().GetBytes(f.RValue.PadRight(tamanho)).CopyTo(filtro, 0);
                                            string filtro2 = new System.Text.ASCIIEncoding().GetString(filtro).TrimEnd();
                                            if (!valor.Equals(filtro2))
                                            {
                                                insere = false;
                                            }
                                        }
                                        break;

                                    case OperadorRel.Diferente:
                                        if (f.RValue.ToLower().Equals("null"))
                                        {
                                            if (isValido)
                                            {
                                                insere = false;
                                            }
                                        }
                                        else
                                        {
                                            byte[] filtro = new byte[tamanho];
                                            new System.Text.ASCIIEncoding().GetBytes(f.RValue.PadRight(tamanho)).CopyTo(filtro, 0);
                                            string filtro2 = new System.Text.ASCIIEncoding().GetString(filtro).TrimEnd();
                                            if (valor.Equals(filtro2))
                                            {
                                                insere = false;
                                            }
                                        }
                                        break;

                                    default:
                                        throw new SemanticError("Comparação de literais só pode ser igual ou diferente");
                                    }
                                }
                                if (insere && filtrosJoin.ContainsKey(campo))
                                {
                                    insere = filtrosJoin[campo].Exists(s => s.Equals(valor));
                                }
                            }

                            registro[i] = valor;
                        }

                        if (insere)
                        {
                            ts.Registros.Add(registro);
                            if (ts.Registros.Count >= Base.getInstance().qtd_max_registros)
                            {
                                break;
                            }
                        }

                        if (br.BaseStream.Position % tamRegistro != 0)
                        {
                            br.BaseStream.Position += tamRegistro - (br.BaseStream.Position % tamRegistro);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
                Console.ReadLine();
            }
            finally
            {
                if (br != null)
                {
                    br.Close();
                }
                if (file != null)
                {
                    file.Close();
                }
            }
            return(ts);
        }