Ejemplo n.º 1
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;
}
Ejemplo n.º 2
0
int main(int argc, char **argv) {
    char op = '\0', base = '\0';
    char arq_entrada[200], arq_saida[200], buf[20];

    //Se o programa for inicializado sem parametros, eles serao
    //pedidos ao usuario.
    //Os parametros serao solicitados novamente, ate que sejam
    //passados corretamente.
    if (argc == 1) {
        printf("\nBem Vindo ao programa de conversoes do Grupo 3!\n");
        printf("E antes que voce pergunte, nao, nao somos Universal\n");

        /* Pede a base a ser utilizada para realizar a operação*/
        do {
            printf("\nInforme a base que deseja utilizar.\n");
            printf("Opcoes disponiveis:\n");
            printf("b62 , b64 , b85 , b91 ou 0 para sair.\n");
            scanf("%s", buf);
            getchar();
            if (!strcmp(buf, "b62"))
                base = '2';
            else if (!strcmp(buf, "b64"))
                base = '4';
            else if (!strcmp(buf, "b85"))
                base = '5';
            else if (!strcmp(buf, "b91"))
                base = '1';
            else if (!strcmp(buf, "0"))
                exit(0);
        } while(!existe_opcao(base));


        /* Pede pela operação que deseja realizar*/
        do {
            printf("\nInforme a operacao que deseja realizar.\n");
            printf("0 - Sair. \n1 - Encoding. \n2 - Decoding.\n");
            scanf("%c", &op);
            getchar();
            if (op == '0')
                exit(0);
        } while(op != '1' &&  op!= '2');

        /* Pede pelo arquivo de entrada a ser codificado ou decodificado*/
        printf("\nInforme o nome do arquivo de entrada: ");
        scanf("%s", arq_entrada);
        while (!existe_arquivo(arq_entrada)) {
            printf("\nArquivo informado nao existe! Tente novamente ");
            printf("\nInforme o nome do arquivo que de entrada: ");
            scanf("%s", arq_entrada);
        }
        
        // Pede o nome do arquivo de saida.
        printf("\nInforme o nome do arquivo de saida: ");
        scanf("%s", arq_saida);
    }
    
    /* Caso do -h */
    else if (argc == 2) {
        op = OPT1(argc, argv);
    }
        
    /* Se os valores forem passados as variáveis serão inicializadas */
    else if (argc == 5) {
        op = OPT1(argc, argv);
        if (!strcmp(argv[2], "-b62"))
            base = '2';
        else if (!strcmp(argv[2], "-b64"))
            base = '4';
        else if (!strcmp(argv[2], "-b85"))
            base = '5';
        else if (!strcmp(argv[2], "-b91"))
            base = '1';
        else
            base = '0';
        strcpy(arq_entrada, argv[3]);
        strcpy(arq_saida, argv[4]);
    }

    conversor(op, base, arq_entrada, arq_saida);
    return 0;
}