int iniciaAtributos(struct fs_objects *objeto, tp_table **tabela, tp_buffer **bufferpoll, char *nomeT){ *objeto = leObjeto(nomeT); *tabela = leSchema(*objeto); *bufferpoll = initbuffer(); if(*tabela == ERRO_ABRIR_ESQUEMA) { return ERRO_DE_PARAMETRO; } if(*bufferpoll == ERRO_DE_ALOCACAO) return ERRO_DE_PARAMETRO; return SUCCESS; }
void tb_schema (char * tbname, char * dbname ){ struct fs_objects objeto; int i; char temp[200]; tp_table * schema; strcpy(temp, dbname); strcat(temp, "/"); strcat(temp, tbname); tbname = temp; if(!verificaNomeTabela(tbname)){ printf("\nTabela não existe\n"); return; } objeto = leObjeto(tbname); schema = leSchema(objeto); puts("Atribute | Type | Modificer"); for ( i = 0; i < objeto.qtdCampos; i++){ printf("%s ", schema[i].nome); switch(schema[i].tipo){ case 'I': printf("INTEGER ");break; case 'D': printf("DOUBLE ");break; case 'S': printf("STRING "); } switch(schema[i].chave){ case 0: puts(" - ");break; case 1: puts("PRIMARY KEY");break; case 2: puts("FOREIGN KEY"); } } }
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 campo_existe_na_tabela(char tabela[],char campo[]){ int erro; struct fs_objects objeto = leObjeto(tabela); tp_table *esquema = leSchema(objeto); if(esquema == ERRO_ABRIR_ESQUEMA){ printf("Erro ao criar o esquema.\n"); return 0; } tp_buffer *bufferpoll = initbuffer(); if(bufferpoll == ERRO_DE_ALOCACAO){ printf("Erro ao alocar memória para o buffer.\n"); return 0; } erro = colocaTuplaBuffer(bufferpoll, 0, esquema, objeto); if(erro != SUCCESS){ printf("Erro %d: na função colocaTuplaBuffer().\n", erro); return 0; } erro = colocaTuplaBuffer(bufferpoll, 1, esquema, objeto); if(erro != SUCCESS){ printf("Erro %d: na função colocaTuplaBuffer().\n", erro); return 0; } erro = colocaTuplaBuffer(bufferpoll, 2, esquema, objeto); if(erro != SUCCESS){ printf("Erro %d: na função colocaTuplaBuffer().\n", erro); return 0; } column *pagina = getPage(bufferpoll, esquema, objeto, 0); if(pagina == ERRO_PARAMETRO){ printf("Erro, na função getPage(), problemas no parametro.\n"); return 0; } // Auxiliar dos dados da tupla buscada int j, y = 0; for(j=0; j < objeto.qtdCampos*bufferpoll[0].nrec; j++){ if(strcmp(pagina[j].nomeCampo,tabela) == 0){ for(y=j;y<j+objeto.qtdCampos;y++){ if (strcmp (pagina[y].nomeCampo, campo) == 0) return 1; // Encontrou a coluna(campo), retorna 1 } } } return 0; // Nao encontrou a coluna, retorna 0 }
void imprime(rc_select *GLOBAL_DATA_SELECT, rc_parser *GLOBAL_PARSER) { int j, f, k, l,erro, x, y, yy, p, q, cont=0, aux, podeImprimi; struct fs_objects objeto, objetoJ; if(!verificaNomeTabela(GLOBAL_DATA_SELECT->objName)){ printf("\nERROR: relation \"%s\" was not found.\n\n\n", GLOBAL_DATA_SELECT->objName); return; } objeto = leObjeto(GLOBAL_DATA_SELECT->objName); tp_table *esquema = leSchema(objeto); if(esquema == ERRO_ABRIR_ESQUEMA){ printf("ERROR: schema cannot be created.\n"); free(esquema); return; } tp_buffer *bufferpoll = initbuffer(); if(bufferpoll == ERRO_DE_ALOCACAO ){ free(bufferpoll); free(esquema); printf("ERROR: no memory available to allocate buffer.\n"); return; } erro = SUCCESS; for(x = 0; erro == SUCCESS; x++) erro = colocaTuplaBuffer(bufferpoll, x, esquema, objeto); if(GLOBAL_DATA_SELECT->join == NULL){ if(GLOBAL_DATA_SELECT->nColumn == 0){ printf("**\n"); int ntuples = --x; p = 0; while(x){ column *pagina = getPage(bufferpoll, esquema, objeto, p); if(pagina == ERRO_PARAMETRO){ printf("ERROR: could not open the table.\n"); free(bufferpoll); free(esquema); return; } if(!cont) { for(j=0; j < objeto.qtdCampos; j++){ if(pagina[j].tipoCampo == 'S') printf(" %-20s ", pagina[j].nomeCampo); else printf(" %-10s ", pagina[j].nomeCampo); if(j<objeto.qtdCampos-1) printf("|"); } printf("\n"); for(j=0; j < objeto.qtdCampos; j++){ printf("%s",(pagina[j].tipoCampo == 'S')? "----------------------": "------------"); if(j<objeto.qtdCampos-1) printf("+"); } printf("\n"); } cont++; podeImprimi = 0; aux =0; for(k = 0; k < bufferpoll[p].nrec; k++){ if(GLOBAL_DATA_SELECT->where != NULL){ for(j=0; j < objeto.qtdCampos && podeImprimi != 1; j++){ podeImprimi = verificaWhere(GLOBAL_DATA_SELECT, pagina, j + aux); } } if(podeImprimi == 0){ for(j=0; j < objeto.qtdCampos ; j++){ if(pagina[j + aux].tipoCampo == 'S') printf(" %-20s ", pagina[j + aux].valorCampo); else if(pagina[j + aux].tipoCampo == 'I'){ int *n = (int *)&pagina[j + aux].valorCampo[0]; printf(" %-10d ", *n); } else if(pagina[j + aux].tipoCampo == 'C'){ printf(" %-10c ", pagina[j + aux].valorCampo[0]); } else if(pagina[j + aux].tipoCampo == 'D'){ double *n = (double *)&pagina[j + aux].valorCampo[0]; printf(" %-10f ", *n); } if(objeto.qtdCampos==j+1) printf("\n"); else printf("|"); } }else { ntuples--; } podeImprimi = 0; aux += objeto.qtdCampos; } x-=bufferpoll[p++].nrec; } printf("\n(%d %s)\n\n",ntuples,(1>=ntuples)?"row": "rows"); }else{ int ntuples = --x; p = 0; while(x){ //aqui deve ser carregado as tuplas com as clasulas do where passar o rc select pra carregar a pagina //creio que seja a melhor forma pois ai só tera as tuplas das projeções e não precisa mexer drasticamente a função imprime, //pois para baixo é apenas printfs column *pagina = getPage(bufferpoll, esquema, objeto, p); if(pagina == ERRO_PARAMETRO){ printf("ERROR: could not open the table.\n"); free(bufferpoll); free(esquema); return; } int z; if(!cont) { for(j=0; j < GLOBAL_DATA_SELECT->nColumn ; j++){ for(z=0; z < objeto.qtdCampos; z++) { if(strcmp(GLOBAL_DATA_SELECT->columnName[j],pagina[z].nomeCampo)==0){ if(pagina[j].tipoCampo == 'S') printf(" %-20s ", pagina[z].nomeCampo); else printf(" %-10s ", pagina[z].nomeCampo); if(j< GLOBAL_DATA_SELECT->nColumn-1) printf("|"); } } } printf("\n"); for(j=0; j < GLOBAL_DATA_SELECT->nColumn ; j++){ printf("%s",(pagina[j].tipoCampo == 'S')? "----------------------": "------------"); if(j<GLOBAL_DATA_SELECT->nColumn-1) printf("+"); } printf("\n"); } cont++; podeImprimi = 0, aux = 0; for(k = 0; k < bufferpoll[p].nrec; k++){ if(GLOBAL_DATA_SELECT->where != NULL){ for(j=0; j < objeto.qtdCampos && podeImprimi != 1; j++){ podeImprimi = verificaWhere(GLOBAL_DATA_SELECT, pagina, j + aux); } } if(podeImprimi == 0){ for(z=0; z < GLOBAL_DATA_SELECT->nColumn ; z++){ for(j=0; j < objeto.qtdCampos ; j++){ if(strcmp(GLOBAL_DATA_SELECT->columnName[z],pagina[j].nomeCampo)==0){ if(pagina[j + aux].tipoCampo == 'S') printf(" %-20s ", pagina[j + aux].valorCampo); else if(pagina[j + aux].tipoCampo == 'I'){ int *n = (int *)&pagina[j + aux].valorCampo[0]; printf(" %-10d ", *n); } else if(pagina[j + aux].tipoCampo == 'C'){ printf(" %-10c ", pagina[j + aux].valorCampo[0]); } else if(pagina[j + aux].tipoCampo == 'D'){ double *n = (double *)&pagina[j + aux].valorCampo[0]; printf(" %-10f ", *n); } if(GLOBAL_DATA_SELECT->nColumn==(z+1)) printf("\n"); else printf("|"); } } } }else { ntuples--; } podeImprimi = 0; aux += objeto.qtdCampos; } x-=bufferpoll[p++].nrec; } printf("\n(%d %s)\n\n",ntuples,(1>=ntuples)?"row": "rows"); } }else{ if(!verificaNomeTabela(GLOBAL_DATA_SELECT->join->table)){ printf("\nERROR: relation \"%s\" was not found.\n\n\n", GLOBAL_DATA_SELECT->join->table); return; } objetoJ = leObjeto(GLOBAL_DATA_SELECT->join->table); tp_table *esquemaJ = leSchema(objetoJ); if(esquemaJ == ERRO_ABRIR_ESQUEMA){ printf("ERROR: schema cannot be created.\n"); free(esquemaJ); return; } tp_buffer *bufferpollJ = initbuffer(); if(bufferpollJ == ERRO_DE_ALOCACAO ){ free(bufferpollJ); free(esquemaJ); printf("ERROR: no memory available to allocate buffer.\n"); return; } erro = SUCCESS; for(y = 0; erro == SUCCESS; y++) erro = colocaTuplaBuffer(bufferpollJ, y, esquemaJ, objetoJ); int ntuples = --x; y--; p = 0; while(x){ printf("while join x\n"); column *pagina = getPage(bufferpoll, esquema, objeto, p); if(pagina == ERRO_PARAMETRO){ printf("ERROR: could not open the table.\n"); free(bufferpoll); free(esquema); return; } column *paginaJ = getPage(bufferpollJ, esquemaJ, objetoJ, p); if(paginaJ == ERRO_PARAMETRO){ printf("ERROR: could not open the table.\n"); free(bufferpollJ); free(esquemaJ); return; } int podeImprimi = 0; if(!cont) { for(j=0; j < objeto.qtdCampos; j++){ if(pagina[j].tipoCampo == 'S') printf(" %-20s ", pagina[j].nomeCampo); else printf(" %-10s ", pagina[j].nomeCampo); if(j < (objeto.qtdCampos + objetoJ.qtdCampos)-1) printf("|"); } for(l = 0; l < objetoJ.qtdCampos ; l++){ if(pagina[ l + j].tipoCampo == 'S') printf(" %-20s ", paginaJ[ l+ j].nomeCampo); else printf(" %-10s ", paginaJ[l + j].nomeCampo); if(j < (objeto.qtdCampos + objetoJ.qtdCampos) - 1) printf("|"); } printf("\n"); for(j=0; j < objeto.qtdCampos + objetoJ.qtdCampos; j++){ printf("%s",(pagina[j].tipoCampo == 'S')? "----------------------": "------------"); } printf("\n"); } cont++; for(k = 0; k < bufferpoll[p].nrec; k++){ yy = y; q = 0; aux = 0; podeImprimi = 0; while(yy){ printf("while join y%d\n", yy); column *paginaJ = getPage(bufferpollJ, esquemaJ, objetoJ, q); if(paginaJ == ERRO_PARAMETRO){ printf("ERROR: could not open the table.\n"); free(bufferpollJ); free(esquemaJ); return; } for(l = 0; l < bufferpollJ[q].nrec; l++){ for(j = 0; j < objeto.qtdCampos && podeImprimi != 1; j++){ for(f = 0; f < objetoJ.qtdCampos && podeImprimi != 1; f++){ printf("P %s = %s\n",pagina[j].valorCampo , paginaJ[f].valorCampo); if(strcmp( pagina[j].nomeCampo, paginaJ[f].nomeCampo) == 0){ printf("nome campo igual\n"); if((pagina[j].tipoCampo == 'S' || pagina[j].tipoCampo == 'C' ) && (paginaJ[f].tipoCampo == 'S' || paginaJ[f].tipoCampo == 'C' )){ printf(" campo char\n"); if(strcmp(pagina[j].valorCampo, paginaJ[f].valorCampo) != 0){ podeImprimi = 1; printf("nome igual\n");} }else if(pagina[j].tipoCampo == 'I' && paginaJ[f].tipoCampo == 'I' ){ int c = (int)pagina[j].valorCampo[0]; int s = (int)paginaJ[f].valorCampo[0]; printf("P3 %d = %d\n", c, s); printf("P %d = %d\n", j, f); if(c != s){ podeImprimi = 1; /*printf("P %d = %d\n", *c, *s);*/ } }else if(pagina[j].tipoCampo == 'D' && paginaJ[f].tipoCampo == 'D' ){ double c = atof(pagina[j].valorCampo); double s = atof(paginaJ[f].valorCampo); if(c != s) podeImprimi = 1; } } } if(podeImprimi == 0){ for(j=0; j < objeto.qtdCampos ; j++){ if(pagina[j + aux].tipoCampo == 'S') printf(" %-20s ", pagina[j + aux].valorCampo); else if(pagina[j + aux].tipoCampo == 'I'){ int *n = (int *)&pagina[j + aux].valorCampo[0]; printf(" %-10d ", *n); } else if(pagina[j + aux].tipoCampo == 'C'){ printf(" %-10c ", pagina[j + aux].valorCampo[0]); } else if(pagina[j + aux].tipoCampo == 'D'){ double *n = (double *)&pagina[j + aux].valorCampo[0]; printf(" %-10f ", *n); } if((objeto.qtdCampos+objetoJ.qtdCampos) != j + 1) printf("|"); } aux += objeto.qtdCampos; for(j = 0; j < objeto.qtdCampos ; j++){ if(paginaJ[j + aux].tipoCampo == 'S') printf(" %-20s ", paginaJ[j + aux].valorCampo); else if(paginaJ[j + aux].tipoCampo == 'I'){ int *n = (int *)&paginaJ[j + aux].valorCampo[0]; printf(" %-10d ", *n); } else if(paginaJ[j + aux].tipoCampo == 'C'){ printf(" %-10c ", paginaJ[j + aux].valorCampo[0]); } else if(paginaJ[j + aux].tipoCampo == 'D'){ double *n = (double *)&paginaJ[j + aux].valorCampo[0]; printf(" %-10f ", *n); } if((objeto.qtdCampos+objetoJ.qtdCampos)==j+1) printf("\n"); else printf("|"); } aux += objetoJ.qtdCampos; }else { ntuples--; } podeImprimi = 0; aux += objeto.qtdCampos; } } yy-=bufferpollJ[q++].nrec ; } yy = y; } x-=bufferpoll[p++].nrec ; } printf("\n(%d %s)\n\n",ntuples,(1>=ntuples)?"row": "rows"); } free(bufferpoll); free(esquema); }
tp_table *abreTabela(char *nomeTabela, struct fs_objects *objeto, tp_table **tabela) { *objeto = leObjeto(nomeTabela); *tabela = leSchema(*objeto); return *tabela; }
void imprimeAll(char nomeTabela[]) { int j,erro, x, p, cont=0; struct fs_objects objeto; if(!verificaNomeTabela(nomeTabela)){ printf("\nERROR: relation \"%s\" was not found.\n\n\n", nomeTabela); return; } objeto = leObjeto(nomeTabela); tp_table *esquema = leSchema(objeto); if(esquema == ERRO_ABRIR_ESQUEMA){ printf("ERROR: schema cannot be created.\n"); free(esquema); return; } tp_buffer *bufferpoll = initbuffer(); if(bufferpoll == ERRO_DE_ALOCACAO){ free(bufferpoll); free(esquema); printf("ERROR: no memory available to allocate buffer.\n"); return; } erro = SUCCESS; for(x = 0; erro == SUCCESS; x++) erro = colocaTuplaBuffer(bufferpoll, x, esquema, objeto); int ntuples = --x; p = 0; while(x){ column *pagina = getPage(bufferpoll, esquema, objeto, p); if(pagina == ERRO_PARAMETRO){ printf("ERROR: could not open the table.\n"); free(bufferpoll); free(esquema); return; } if(!cont) { for(j=0; j < objeto.qtdCampos; j++){ if(pagina[j].tipoCampo == 'S') printf(" %-20s ", pagina[j].nomeCampo); else printf(" %-10s ", pagina[j].nomeCampo); if(j<objeto.qtdCampos-1) printf("|"); } printf("\n"); for(j=0; j < objeto.qtdCampos; j++){ printf("%s",(pagina[j].tipoCampo == 'S')? "----------------------": "------------"); if(j<objeto.qtdCampos-1) printf("+"); } printf("\n"); } cont++; for(j=0; j < objeto.qtdCampos*bufferpoll[p].nrec; j++){ if(pagina[j].tipoCampo == 'S') printf(" %-20s ", pagina[j].valorCampo); else if(pagina[j].tipoCampo == 'I'){ int *n = (int *)&pagina[j].valorCampo[0]; printf(" %-10d ", *n); } else if(pagina[j].tipoCampo == 'C'){ printf(" %-10c ", pagina[j].valorCampo[0]); } else if(pagina[j].tipoCampo == 'D'){ double *n = (double *)&pagina[j].valorCampo[0]; printf(" %-10f ", *n); } if(j>=1 && ((j+1)%objeto.qtdCampos)==0) printf("\n"); else printf("|"); } x-=bufferpoll[p++].nrec; } printf("\n(%d %s)\n\n",ntuples,(1>=ntuples)?"row": "rows"); free(bufferpoll); free(esquema); }
void shell() { current_database = -1; char entrada[1000], nomeBD[TAM_NOME_BANCO]; int resultado = 0, codDB = -1; nomeBD[0]='\0'; char *current_db_name = strdup(">");//inicializa com nenhum banco conectado char *start; start = strdup("dbms-start");//este comando posteriormente como start do banco, no momento ele é automatico printf("\nWelcome to the DBMS Interface.\nType 'help' '\\h' for help.\n\n"); /** * **************************** * * Comandos do shell * * **************************** */ using_history ();//função para usar o histórico read_history (".history_file"); while(1) { int nTokens; strcpy(entrada, readline(current_db_name)); /** * Adiciona ao histórico */ if (entrada[0]) { char *expansion; int result; result = history_expand (entrada, &expansion); if (result) fprintf (stderr, "%s", expansion); if (result < 0 || result == 2) { free (expansion); continue; } add_history (expansion); strncpy (entrada, expansion, sizeof (entrada) - 1); free (expansion); write_history (".history_file");//adiciona no histórico } char **tokens = tokenize( trim_white_space(remove_newline(entrada)),' ',&nTokens); /** * Opção para criar tabela e banco de dados */ if (strcmp(strtolower(tokens[0]),"create")==0) { if(strcmp(strtolower(tokens[1]),"table")==0) { if (current_database == -1) { printf("Not connected to any database.\n"); continue; } createTable(entrada,current_database); } else if(strcmp(strtolower(tokens[1]),"database")==0) { if (nTokens >= 5) { printf("Invalid command. Type help to show de interface usage.\n"); continue; } if (strlen(tokens[2]) > TAM_NOME_BANCO ) { printf("Database name too big.\n"); continue; } resultado = checkCreateDB( remove_semicolon(tokens[2]) );//verifica a existência do nome e grava-o no arquivo if(resultado==-1) { printf("Error creating database file.\n"); } if(resultado==-3) { printf("Database exists.\n"); } else { printf("Database created successfully.\n"); } } else { printf("Invalid command. Type help to show de interface usage.\n"); continue; } } /** * Conecta ao banco de dados passado como parâmetro */ else if(strcmp(strtolower(tokens[0]),"\\c") == 0){ if (nTokens != 2) { printf("Invalid number of arguments. Type help to show the interface usage.\n"); continue; } char *name_db = remove_semicolon(tokens[1]); codDB = busca(name_db,1); //função chamada para conecção no banco, retorna o codigo do banco ao conectar if (codDB >= 0) { strcpy(nomeBD, name_db); //passa o nome do bd, para a variavel mostrar ao usuario qual o banco conectado free(current_db_name); current_db_name = (char*) malloc (sizeof(char)*(strlen(name_db)+3)); if (current_db_name == NULL) { printf("Out of memory.\nAborting...\n"); } strcpy(current_db_name,name_db); current_database = codDB; strcat(current_db_name,"=#"); current_db_name[strlen(current_db_name)] = '\0'; } else { printf("No such database '%s'.\n", name_db); continue; } } /** * Insere tuplas em uma tabela */ else if(strcmp(strtolower(tokens[0]),"insert")==0) { if (current_database == -1) { printf("Not connected to any database.\n"); continue; } insert(entrada,current_database); } /** * Imprime as tabelas do banco de dados atual * ou o esquema de uma tabela */ else if(strcmp(strtolower(tokens[0]),"\\d")==0) { if (current_database == -1) { printf("Not connected to any database.\n"); continue; } if (nTokens >= 3) { printf("Invalid number of arguments. Type help to show the interface usage.\n"); continue; } else if (nTokens == 1) { //imprime tabelas do banco de dados listaTabelas(current_database); } else { //imprime o esquema de uma tabela char *t = table_name_real(remove_semicolon(tokens[1]),current_database); if(!verificaNomeTabela(t)){ printf("Invalid table name.\n"); free(t); continue; } struct fs_objects objeto = leObjeto(t);//para verificar se a tabela esta no banco show_schema(objeto,tokens[1]); free(t); } } /** * Comando temporário para imprimir tabela */ else if (strcmp(strtolower(tokens[0]),"select")==0) { if (current_database == -1) { printf("Not connected to any database.\n"); continue; } selectTable(entrada,current_database); } /** * Imprime os registros da tabela passada */ else if (strcmp(strtolower(tokens[0]),"show")==0) { if (nTokens != 2) { printf("Invalid number of arguments. Type help to show the interface usage.\n"); continue; } if (current_database == -1) { printf("Not connected to any database.\n"); continue; } if (verificaNomeTabela(table_name_real(remove_semicolon(tokens[1]),current_database) ) == 0 ) { printf("Table %s doesn't exist.\n",remove_semicolon(tokens[1])); continue; } char *t = table_name_real(remove_semicolon(tokens[1]),current_database); char *file = table_name_real(remove_semicolon(tokens[1]),current_database); strcat(file,".dat"); if (existeArquivo(file) == 0) { printf("Table is empty.\n" ); continue; } imprime(t); free(file); free(t); } /** * Lista os bancos existentes */ else if(strcmp(strtolower(tokens[0]),"\\l")==0) { if (nTokens != 1) { printf("Invalid number of arguments. Type help to show the interface usage.\n"); continue; } //LISTA os bancos existentes listaBancos(); } /** * Opção para deletar o banco de dados e tabelas */ else if(strcmp(strtolower(tokens[0]),"drop")==0) { if (nTokens != 3) { printf("Invalid number of arguments. Type help to show the interface usage.\n"); continue; } else if(strcmp(strtolower(tokens[1]),"table") == 0){ if (current_database == -1) { printf("Not connected to any database.\n"); continue; } if (verificaNomeTabela(table_name_real(remove_semicolon(tokens[2]),current_database) ) == 0 ) { printf("Table %s doesn't exist.\n",remove_semicolon(tokens[2])); continue; } char *t = table_name_real(remove_semicolon(tokens[2]),current_database); char *exist = table_name_real(remove_semicolon(tokens[2]),current_database); int ok = excluirTabela(t); if (ok == SUCCESS) { printf("Table deleted successfully.\n"); } free(exist); free(t); } else if(strcmp(strtolower(tokens[1]),"database") == 0){ char *exist = table_name_real(remove_semicolon(tokens[2]),current_database); strcat(exist,".dat"); if (existeArquivo(exist) != 0) { printf("The database is not empty for drop, there are existing tables.\n" ); continue; } exist = remove_semicolon(tokens[2]); codDB = busca(exist,1); if(codDB == current_database) { printf("Cannot drop the currently open database.\n"); continue; } int drop = dropDatabase(remove_semicolon(tokens[2])); if(drop == 1)printf("Database deleted successfully.\n"); free(exist); } } /** * Ajuda ao usuário com exemplos da sintaxe dos comandos */ else if (strcmp(strtolower(tokens[0]),"help")==0 || strcmp(strtolower(tokens[0]),"\\h")==0) { if (nTokens != 1) { printf("Invalid number of arguments. Type help to show the interface usage.\n"); } help(); } /** * Imprime mensagem de copyright */ else if(strcmp(strtolower(remove_semicolon(tokens[0])),"\\copyright")==0) { printf("\nDatabase Management System\n"); printf("\nPermission to use, copy, modify, and distribute this software and its\ndocumentation for any purpose, without fee, and without a written agreement\nis hereby granted, provided that the above copyright notice and this\nparagraph and the following two paragraphs appear in all copies.\n"); printf("\nTHIS SOFTWARE IS BEING DEVELOPED BY STUDENTS OF DATABASE II CLASS AT UNIVERSIDADE FEDERAL DA FRONTEIRA SUL.\n\n"); } /** * Comando de saída */ else if(strcmp(strtolower(remove_semicolon(tokens[0])),"exit")==0) { break; } else if(strcmp(strtolower(remove_semicolon(tokens[0])),"quit")==0) { break; } else if(strcmp(strtolower(remove_semicolon(tokens[0])),"bye")==0) { break; } else if(strcmp(strtolower(remove_semicolon(tokens[0])),"\\q")==0) { break; } else { printf("Invalid command. Type help to show the interface usage.\n"); continue; } } free(start); free(current_db_name); }