Пример #1
0
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;
}
Пример #2
0
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);
}