Пример #1
0
//  Função que guarda os tokens reconhecidos pelo yacc/lex
void getToken(char * token, int type){
    w_token *novo;
    novo = (w_token *)malloc(sizeof(w_token));
    //printf("token: %s  tipo=%d\n", token, type);

    novo->tipo = type;
    novo->next = NULL;
    if(type == WT_ABRE_P){
        char *c = (char *)malloc(sizeof(char));
        *c = '(';
        novo->valor=c;
    }
    else if(type == WT_FECHA_P){
        char *c = (char *)malloc(sizeof(char));
        *c = ')';
        novo->valor=c;
    }
    else if(type == WT_NUMERO){
        int *c = malloc(sizeof(int));
        *c = convertI(token);
        novo->valor = c;
    }
    else if(type == WT_VALOR){
        double *c = malloc(sizeof(double));
        *c = convertD(token);
        novo->valor = c;
    }
    else{
        novo->valor=(void *)malloc(strlen(token));
        strcpy(novo->valor,token);
    }
    insert_token_list(novo);
    novo = NULL;
}
Пример #2
0
int finalizaInsert(char *nome, column *c)
{
	column *auxC;
	int i = 0, x = 0, t;
	FILE *dados;


	struct fs_objects dicio = leObjeto(nome); // Le dicionario
	tp_table *auxT = leSchema(dicio); // Le esquema
	
	if((dados = fopen(dicio.nArquivo,"a+b")) == NULL)
    	return ERRO_ABRIR_ARQUIVO;
	
	for(auxC = c, t = 0; auxC != NULL; auxC = auxC->next, t++)
	{
		if(t >= dicio.qtdCampos)
			t = 0;

		if(auxT[t].tipo == 'S'){ // Grava um dado do tipo string.
			if(sizeof(auxC->valorCampo) > auxT[t].tam){
				return ERRO_NO_TAMANHO_STRING;
			}
			if(strcmp(auxC->nomeCampo, auxT[t].nome) != 0){
				return ERRO_NOME_CAMPO;
			}
			char valorCampo[auxT[t].tam];
			strcpy(valorCampo, auxC->valorCampo);
			strcat(valorCampo, "\0");
			fwrite(&valorCampo,sizeof(valorCampo),1,dados);
		}
		else if(auxT[t].tipo == 'I'){ // Grava um dado do tipo inteiro.
			i = 0;
			while (i < strlen(auxC->valorCampo))
			{
				if(auxC->valorCampo[i] < 48 || auxC->valorCampo[i] > 57){ 
					return ERRO_NO_TIPO_INTEIRO;
				}
				i++;
			}

			int valorInteiro = convertI(auxC->valorCampo);
			fwrite(&valorInteiro,sizeof(valorInteiro),1,dados);
		}
		else if(auxT[t].tipo == 'D'){ // Grava um dado do tipo double.
			x = 0;
			while (x < strlen(auxC->valorCampo))
			{
				if((auxC->valorCampo[x] < 48 || auxC->valorCampo[x] > 57) && (auxC->valorCampo[x] != 46)){ 
					return ERRO_NO_TIPO_DOUBLE;
				}
				x++;
			}

			double valorDouble = convertD(auxC->valorCampo);
			fwrite(&valorDouble,sizeof(valorDouble),1,dados);
		}
		else if(auxT[t].tipo == 'C'){ // Grava um dado do tipo char.

			if(strlen(auxC->valorCampo) > (sizeof(char)))
			{
				return ERRO_NO_TIPO_CHAR;
			}
			char valorChar = auxC->valorCampo[0];
			fwrite(&valorChar,sizeof(valorChar),1,dados);			
		}

	}
	fclose(dados);
	free(c); // Libera a memoria da estrutura.
	free(auxT); // Libera a memoria da estrutura.
	return SUCCESS;
}
Пример #3
0
int finalizaInsert(char *nome, column *c)
{
	column *auxC;
	int i = 0, x = 0, t;
	FILE *dados;

	if(!verificaNomeTabela(nome)){
		printf("\nA Tabela informada nao existe!\n");
		return 0;
	}

	struct fs_objects dicio = leObjeto(nome); // Le dicionario
	tp_table *auxT = leSchema(dicio); // Le esquema

	//se estiver inserindo na tabela de chaves, verifica regras de PK e FK
	if (strcmp (nome, "BD_Chaves") == 0){
		column *auxP;
		char *tabela_fk=(char *)malloc(sizeof(char)*TAMANHO_NOME_TABELA);
		char *campo_fk=(char *)malloc(sizeof(char)*TAMANHO_NOME_TABELA);
		int p, fk;
		
		if(existe_arquivo("BD_Chaves.dat")){
			int pk;
			for(auxP = c, p = 0; auxP != NULL; auxP = auxP->next, p++)
			{
				if(p >= dicio.qtdCampos)
					p = 0;

				if (pk != 1 && auxT[p].tipo == 'C'){
					//Se está tentando inserir PK, seta pk = 1 para verificar posteriormente se já existe PK 
					if (strcmp (auxP->valorCampo, "P") == 0){
						pk = 1;
						p=0;
						auxP = c;
					}
				}

				//Caso esteja inserindo PK, verifica se tabela já possui PK
				if (pk == 1 && strcmp (auxP->nomeCampo, "TabelaOrigem") == 0){
					printf("\nInserindo chave na tabela %s",auxP->valorCampo);
					if(TabelaPossuiPk(auxP->valorCampo))
						return ERRO_VIOLACAO_PK;
				}
				
				if (fk != 1 && auxT[p].tipo == 'C'){
					//Se está tentando inserir FK, seta Fk = 1 para verificar posteriormente se tabela da FK existe 
					if (strcmp (auxP->valorCampo, "F") == 0){
						fk = 1;
						p=0;
						auxP = c;
					}
				}

				//Caso esteja inserindo FK, verifica se tabela da FK existe
				if (fk == 1 && strcmp (auxP->nomeCampo, "TabelaDestino") == 0 && tabela_fk == NULL)
					strcpy(tabela_fk, auxP->valorCampo);

				if (fk == 1 && strcmp (auxP->nomeCampo, "CampoDestino") == 0 && campo_fk == NULL)
					strcpy(campo_fk, auxP->valorCampo);
			}
		}else{
			for(auxP = c, p = 0; auxP != NULL; auxP = auxP->next, p++)
			{
				if(p >= dicio.qtdCampos)
					p = 0;

				if (fk != 1 && auxT[p].tipo == 'C'){
					//Se está tentando inserir FK, seta Fk = 1 para verificar posteriormente se tabela da FK existe 
					if (strcmp (auxP->valorCampo, "F") == 0){
						fk = 1;
						p=0;
						auxP = c;
					}
				}

				//Caso esteja inserindo FK, verifica se tabela da FK existe
				if (fk == 1 && strcmp (auxP->nomeCampo, "TabelaDestino") == 0 && strcmp(tabela_fk, "\0") == 0)
					strcpy(tabela_fk, auxP->valorCampo);

				if (fk == 1 && strcmp (auxP->nomeCampo, "CampoDestino") == 0 && strcmp(campo_fk, "\0") == 0)
					strcpy(campo_fk, auxP->valorCampo);
			}
		}
		// Verifica se tabela destino da FK existe e se campo destino da Fk existe na tabela destino
		if(strcmp(tabela_fk, "\0") != 0 && strcmp(campo_fk, "\0") != 0){
			//Verifica se tabela destino da fk existe
			if(!verificaNomeTabela(tabela_fk)){
				printf("Erro: Tabela Destino da FK nao existe!\n");
				return 0;
			}

			// Verifica se campo da fk existe na tabela destino da fk
			if(campo_existe_na_tabela(tabela_fk,campo_fk) == 0){
				printf("Campo %s nao existe na tabela %s!\n",campo_fk, tabela_fk);
				return 0;
			}
		}
	}

	if((dados = fopen(dicio.nArquivo,"a+b")) == NULL)
    	return ERRO_ABRIR_ARQUIVO;

    char *tabela_origem=(char *)malloc(sizeof(char)*TAMANHO_NOME_TABELA);

	for(auxC = c, t = 0; auxC != NULL; auxC = auxC->next, t++)
	{
		if(t >= dicio.qtdCampos)
			t = 0;

		if(auxT[t].tipo == 'S'){ // Grava um dado do tipo string.
			if(sizeof(auxC->valorCampo) > auxT[t].tam){
				return ERRO_NO_TAMANHO_STRING;
			}
			if(strcmp(auxC->nomeCampo, auxT[t].nome) != 0){
				return ERRO_NOME_CAMPO;
			}
			char valorCampo[auxT[t].tam];
			strcpy(valorCampo, auxC->valorCampo);
			strcat(valorCampo, "\0");
			fwrite(&valorCampo,sizeof(valorCampo),1,dados);
		}
		else if(auxT[t].tipo == 'I'){ // Grava um dado do tipo inteiro.
			i = 0;
			while (i < strlen(auxC->valorCampo))
			{
				if(auxC->valorCampo[i] < 48 || auxC->valorCampo[i] > 57){ 
					return ERRO_NO_TIPO_INTEIRO;
				}
				i++;
			}

			int valorInteiro = convertI(auxC->valorCampo);
			fwrite(&valorInteiro,sizeof(valorInteiro),1,dados);
		}
		else if(auxT[t].tipo == 'D'){ // Grava um dado do tipo double.
			x = 0;
			while (x < strlen(auxC->valorCampo))
			{
				if((auxC->valorCampo[x] < 48 || auxC->valorCampo[x] > 57) && (auxC->valorCampo[x] != 46)){ 
					return ERRO_NO_TIPO_DOUBLE;
				}
				x++;
			}

			double valorDouble = convertD(auxC->valorCampo);
			fwrite(&valorDouble,sizeof(valorDouble),1,dados);
		}
		else if(auxT[t].tipo == 'C'){ // Grava um dado do tipo char.

			if(strlen(auxC->valorCampo) > (sizeof(char)))
			{
				return ERRO_NO_TIPO_CHAR;
			}
			char valorChar = auxC->valorCampo[0];
			fwrite(&valorChar,sizeof(valorChar),1,dados);
		}

		//Caso tenha criado chaves
		if (strcmp (auxC->nomeCampo, "TabelaOrigem") == 0)
			strcpy(tabela_origem, auxC->valorCampo);
		if (strcmp (auxC->nomeCampo, "TabelaDestino") == 0){
			if (strcmp (auxC->valorCampo, "\0") == 0)
				printf("\nChave primaria criada na tabela %s",tabela_origem);
			else
				printf("\nChave estrangeira criada na tabela %s",tabela_origem);
		}

	}
	fclose(dados);
	free(c); // Libera a memoria da estrutura.
	free(auxT); // Libera a memoria da estrutura.
	return SUCCESS;
}
Пример #4
0
int finalizaInsert(char *nome, column *c) {
    column *auxC, *temp;
    int i = 0, x = 0, t, erro, j = 0;
    FILE *dados;

    struct fs_objects objeto,dicio; // Le dicionario
    tp_table *auxT ; // Le esquema
    auxT = abreTabela(nome, &dicio, &auxT);

    table *tab     = (table *)malloc(sizeof(table));
    tp_table *tab2 = (tp_table *)malloc(sizeof(struct tp_table));
    memset(tab2, 0, sizeof(tp_table));

    tab->esquema = abreTabela(nome, &objeto, &tab->esquema);
    tab2 = procuraAtributoFK(objeto);

    for(j = 0, temp = c; j < objeto.qtdCampos && temp != NULL; j++, temp = temp->next) {
        switch(tab2[j].chave) {
        case NPK:
            erro = SUCCESS;
            break;

        case PK:
            erro = verificaChavePK(nome, temp , temp->nomeCampo, temp->valorCampo);
            if (erro == ERRO_CHAVE_PRIMARIA) {
                printf("ERROR: duplicate key value violates unique constraint \"%s_pkey\"\nDETAIL:  Key (%s)=(%s) already exists.\n", nome, temp->nomeCampo, temp->valorCampo);

                free(auxT); // Libera a memoria da estrutura.
                //free(temp); // Libera a memoria da estrutura.
                free(tab); // Libera a memoria da estrutura.
                free(tab2); // Libera a memoria da estrutura.
                return ERRO_CHAVE_PRIMARIA;
            }
            if (erro == ERRO_CHAVE_PRIMARIA_NULA) {
                printf("ERROR:  null value in column '%s' violates not-null constraint \"%s_pkey\"\nDETAIL: Primary Key (%s) is null.\n",temp->nomeCampo,nome,temp->nomeCampo);

                free(auxT); // Libera a memoria da estrutura.
                //free(temp); // Libera a memoria da estrutura.
                free(tab); // Libera a memoria da estrutura.
                free(tab2); // Libera a memoria da estrutura.
                return ERRO_CHAVE_PRIMARIA_NULA;
            }

            break;

        case FK:
            if (tab2[j].chave == 2 && strlen(tab2[j].attApt) != 0 && strlen(tab2[j].tabelaApt) != 0) {

                erro = verificaChaveFK(nome, temp, tab2[j].nome, temp->valorCampo, tab2[j].tabelaApt, tab2[j].attApt);

                if (erro != SUCCESS) {
                    printf("ERROR: invalid reference to \"%s.%s\". The value \"%s\" does not exist.\n", tab2[j].tabelaApt,tab2[j].attApt,temp->valorCampo);

                    free(auxT); // Libera a memoria da estrutura.
                    free(temp); // Libera a memoria da estrutura.
                    free(tab); // Libera a memoria da estrutura.
                    free(tab2); // Libera a memoria da estrutura.
                    return ERRO_CHAVE_ESTRANGEIRA;
                }
            }

            break;
        }
    }


    if (erro == ERRO_CHAVE_ESTRANGEIRA) {
        printf("ERROR: unknown foreign key error.\n");

        free(auxT); // Libera a memoria da estrutura.
        free(temp); // Libera a memoria da estrutura.
        free(tab); // Libera a memoria da estrutura.
        free(tab2); // Libera a memoria da estrutura.
        return ERRO_CHAVE_ESTRANGEIRA;
    }

    if (erro == ERRO_CHAVE_PRIMARIA) {
        printf("ERROR: unknown primary key error.\n");

        free(auxT); // Libera a memoria da estrutura.
        free(temp); // Libera a memoria da estrutura.
        free(tab); // Libera a memoria da estrutura.
        free(tab2); // Libera a memoria da estrutura.
        return ERRO_CHAVE_PRIMARIA;
    }
    if (erro == ERRO_DE_PARAMETRO) {
        printf("ERROR: invalid parameter.\n");
        free(auxT); // Libera a memoria da estrutura.
        free(temp); // Libera a memoria da estrutura.
        free(tab); // Libera a memoria da estrutura.
        free(tab2); // Libera a memoria da estrutura.
        return ERRO_DE_PARAMETRO;
    }

    char directory[LEN_DB_NAME*2];
    strcpy(directory, connected.db_directory);
    strcat(directory, dicio.nArquivo);

    if((dados = fopen(directory,"a+b")) == NULL) {
        printf("ERROR: cannot open file.\n");
        free(auxT); // Libera a memoria da estrutura.
        free(temp); // Libera a memoria da estrutura.
        free(tab); // Libera a memoria da estrutura.
        free(tab2); // Libera a memoria da estrutura.
        return ERRO_ABRIR_ARQUIVO;

    }

    for(auxC = c, t = 0; auxC != NULL; auxC = auxC->next, t++) {
        if (t >= dicio.qtdCampos)
            t = 0;



        if (auxT[t].tipo == 'S') { // Grava um dado do tipo string.

            if (sizeof(auxC->valorCampo) > auxT[t].tam && sizeof(auxC->valorCampo) != 8) {
                printf("ERROR: invalid string length.\n");
                free(tab); // Libera a memoria da estrutura.
                free(tab2); // Libera a memoria da estrutura.
                free(auxT); // Libera a memoria da estrutura.
                free(temp); // Libera a memoria da estrutura.
                fclose(dados);
                return ERRO_NO_TAMANHO_STRING;
            }

            if (objcmp(auxC->nomeCampo, auxT[t].nome) != 0) {
                printf("ERROR: column name \"%s\" is not valid.\n", auxC->nomeCampo);
                free(tab); // Libera a memoria da estrutura.
                free(tab2); // Libera a memoria da estrutura.
                free(auxT); // Libera a memoria da estrutura.
                free(temp); // Libera a memoria da estrutura.
                fclose(dados);
                return ERRO_NOME_CAMPO;
            }

            char valorCampo[auxT[t].tam];
            strncpy(valorCampo, auxC->valorCampo, auxT[t].tam);
            strcat(valorCampo, "\0");
            fwrite(&valorCampo,sizeof(valorCampo),1,dados);

        } else if (auxT[t].tipo == 'I') { // Grava um dado do tipo inteiro.
            i = 0;
            while (i < strlen(auxC->valorCampo)) {
                if (auxC->valorCampo[i] < 48 || auxC->valorCampo[i] > 57) {
                    printf("ERROR: column \"%s\" expectet integer.\n", auxC->nomeCampo);
                    free(tab); // Libera a memoria da estrutura.
                    free(tab2); // Libera a memoria da estrutura.
                    free(auxT); // Libera a memoria da estrutura.
                    //free(temp); // Libera a memoria da estrutura.
                    fclose(dados);
                    return ERRO_NO_TIPO_INTEIRO;
                }
                i++;
            }

            int valorInteiro = 0;

            sscanf(auxC->valorCampo,"%d",&valorInteiro);
            fwrite(&valorInteiro,sizeof(valorInteiro),1,dados);

        } else if (auxT[t].tipo == 'D') { // Grava um dado do tipo double.
            x = 0;
            while (x < strlen(auxC->valorCampo)) {
                if((auxC->valorCampo[x] < 48 || auxC->valorCampo[x] > 57) && (auxC->valorCampo[x] != 46)) {
                    printf("ERROR: column \"%s\" expect double.\n", auxC->nomeCampo);
                    free(tab); // Libera a memoria da estrutura.
                    free(tab2); // Libera a memoria da estrutura.
                    free(auxT); // Libera a memoria da estrutura.
                    free(temp); // Libera a memoria da estrutura.
                    fclose(dados);
                    return ERRO_NO_TIPO_DOUBLE;
                }
                x++;
            }

            double valorDouble = convertD(auxC->valorCampo);
            fwrite(&valorDouble,sizeof(valorDouble),1,dados);
        }
        else if (auxT[t].tipo == 'C') { // Grava um dado do tipo char.

            if (strlen(auxC->valorCampo) > (sizeof(char))) {
                printf("ERROR: column \"%s\" expect char.\n", auxC->nomeCampo);
                free(tab); // Libera a memoria da estrutura.
                free(tab2); // Libera a memoria da estrutura.
                free(auxT); // Libera a memoria da estrutura.
                free(temp); // Libera a memoria da estrutura.
                fclose(dados);
                return ERRO_NO_TIPO_CHAR;
            }
            char valorChar = auxC->valorCampo[0];
            fwrite(&valorChar,sizeof(valorChar),1,dados);
        }

    }

    fclose(dados);
    free(tab); // Libera a memoria da estrutura.
    free(tab2); // Libera a memoria da estrutura.
    free(auxT); // Libera a memoria da estrutura.
    free(temp); // Libera a memoria da estrutura.
    return SUCCESS;
}