/// <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)); }
// 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)); } }
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")); } }
private void acaoZero() { identificadores.Clear(); select.clear(); fromTabelas.Clear(); valoresColunas.Clear(); metadados = new Metadados(); sexta = true; allColunas = true; contColunas = 0; operacao = 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(); }
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)); }
// 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; }
/// <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); }
/// <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); }
/// <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); }
/// <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)); }
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); }
/* * ~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); }
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()); }
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; }
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)); }
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); }