int interpretarInsertInto(Banco* banco, char* nomeArquivo) { FILE* file; TokenReader* tokenReader; Tabela* tabela; Campo** campos; int contadorCampos; int registrosInseridos; Tupla* tupla; Associacao* associacao; char* linha; char* token; file = fopen(nomeArquivo, "r"); linha = (char*) calloc(1000, sizeof (char)); //Para cada INSERT registrosInseridos = 0; tokenReader = newTokenReader(linha); while (fgets(linha, 1000, file) != NULL) { setTokenString(tokenReader, linha); token = nextToken(tokenReader); //INSERT if (strcasecmp(token, "INSERT")) { break; } token = nextToken(tokenReader); //INTO token = nextToken(tokenReader); tabela = getTabela(banco, token); if (!tabela) { return; } token = nextToken(tokenReader); //abre parêntesis tupla = criarTupla(tabela); //não é preciso pedir memória para cada posição, uma vez que ela apenas apontará para uma região já alocada campos = (Campo**) calloc(tabela->numeroCampos, sizeof (Campo*)); contadorCampos = 0; //campos while (1) { token = nextToken(tokenReader); //campo if (!strcasecmp(token, "VALUES")) { break; } campos[contadorCampos] = getCampo(tabela, token); contadorCampos++; token = nextToken(tokenReader); //comma } token = nextToken(tokenReader); //abre parêntesis contadorCampos = 0; //Para cada valor while (1) { token = nextToken(tokenReader); //campo if (!strcmp(token, ";")) { break; } //remover apóstrofes token[strlen(token)] substring(token, 1, strlen(token)-1) if (token[0] == '\'') { } associacao = findAssociacao(tabela, tupla, campos[contadorCampos]); associarValor(associacao, (char*) token); contadorCampos++; token = nextToken(tokenReader); //comma } adicionarTupla(tabela, tupla); free(campos); registrosInseridos += inserirRegistros(tabela); } fclose(file); return registrosInseridos; }
void carregarRegistros(Tabela* tabela) { FILE* file; Tupla* tupla; Campo* campo; Associacao* associacao; void* valor; char* nomeArquivoBloco; int i, j; short int numeroRegistros, deslocamentoRegistro, deslocamentoVarchar, tamanho; //liberar as tuplas freeTuplas(tabela); //mapaBits=tabela->numeroCampos/8+1 //olhar em todos os blocos for (i = 0; i < tabela->numeroBlocos; i++) { nomeArquivoBloco = tabela->nomesArquivosBlocos[i]; file = fopen(nomeArquivoBloco, "rb"); fread(&numeroRegistros, sizeof (numeroRegistros), 1, file); fseek(file, 6, SEEK_SET); //ler todos os registros while (tabela->numeroTuplas < numeroRegistros) { tupla = criarTupla(tabela); //pula os primeiros bytes e aponta para o próximo registro fseek(file, 6 + (tabela->numeroTuplas * 2), SEEK_SET); fread(&deslocamentoRegistro, sizeof (deslocamentoRegistro), 1, file); fseek(file, deslocamentoRegistro, SEEK_SET); //para cada registro //encontrar todos campos varchar for (j = 0; j < tabela->numeroCampos; j++) { associacao = tupla->associacoes[j]; campo = associacao->campo; if (campo->tipo == VARCHAR) { fread(&deslocamentoVarchar, sizeof (deslocamentoVarchar), 1, file); fread(&tamanho, sizeof (tamanho), 1, file); fseek(file, deslocamentoVarchar, SEEK_CUR); valor = calloc(tamanho, sizeof (char)); fread(valor, tamanho, 1, file); associarValor(associacao, valor); //aponta para próximo campo deslocamentoRegistro += 4; fseek(file, deslocamentoRegistro, SEEK_SET); free(valor); } } //restante dos arquivos for (j = 0; j < tabela->numeroCampos; j++) { associacao = tupla->associacoes[j]; campo = associacao->campo; if (campo->tipo != VARCHAR) { valor = malloc(campo->bytes); fread(valor, campo->bytes, 1, file); associarValor(associacao, valor); //aponta para próximo campo deslocamentoRegistro += campo->bytes; fseek(file, deslocamentoRegistro, SEEK_SET); free(valor); } } //ler mapa de bits e anular os dados na estrutura //populá-los nas tuplas adicionarTupla(tabela, tupla); } } fclose(file); }