// 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; }
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; }
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; }
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; }