struct fs_objects leObjeto(char *nTabela){ FILE *dicionario; char *tupla = (char *)malloc(sizeof(char)*TAMANHO_NOME_TABELA); memset(tupla, '\0', TAMANHO_NOME_TABELA); int cod; char directory[LEN_DB_NAME*2]; strcpy(directory, connected.db_directory); strcat(directory, "fs_object.dat"); dicionario = fopen(directory, "a+b"); // Abre o dicionario de dados. struct fs_objects objeto; if(!verificaNomeTabela(nTabela)){ printf("ERROR: relation \"%s\" was not found.\n", nTabela); if (dicionario) fclose(dicionario); free(tupla); return objeto; } if (dicionario == NULL) { printf("ERROR: data dictionary was not found.\n\n"); free(tupla); return objeto; } while(fgetc (dicionario) != EOF){ fseek(dicionario, -1, 1); fread(tupla, sizeof(char), TAMANHO_NOME_TABELA , dicionario); //Lê somente o nome da tabela if(objcmp(tupla, nTabela) == 0){ // Verifica se o nome dado pelo usuario existe no dicionario de dados. strcpylower(objeto.nome, tupla); fread(&cod,sizeof(int),1,dicionario); // Copia valores referentes a tabela pesquisada para a estrutura. objeto.cod=cod; fread(tupla,sizeof(char),TAMANHO_NOME_TABELA,dicionario); strcpylower(objeto.nArquivo, tupla); fread(&cod,sizeof(int),1,dicionario); objeto.qtdCampos = cod; free(tupla); fclose(dicionario); return objeto; } fseek(dicionario, 28, 1); // Pula a quantidade de caracteres para a proxima verificacao(4B do codigo, 20B do nome do arquivo e 4B da quantidade de campos). } free(tupla); fclose(dicionario); return objeto; }
//---------------------------------------- // CRIA TABELA table *iniciaTabela(char *nome) { if(verificaNomeTabela(nome)){ // Se o nome já existir no dicionario, retorna erro. return ERRO_NOME_TABELA_INVALIDO; } table *t = (table *)malloc(sizeof(table)*1); strcpy(t->nome,nome); // Inicia a estrutura de tabela com o nome da tabela. t->esquema = NULL; // Inicia o esquema da tabela com NULL. return t; // Retorna estrutura para criação de uma tabela. }
// LEITURA DE DICIONARIO E ESQUEMA struct fs_objects leObjeto(char *nTabela){ FILE *dicionario; char *tupla = (char *)malloc(sizeof(char)*TAMANHO_NOME_TABELA); int cod; dicionario = fopen("fs_object.dat", "a+b"); // Abre o dicionario de dados. struct fs_objects objeto; if(!verificaNomeTabela(nTabela)){ printf("Erro GRAVE! na função leObjeto(). Nome da tabela inválido.\nAbortando...\n"); exit(1); } if (dicionario == NULL) { printf("Erro GRAVE! na função leObjeto(). Arquivo não encontrado.\nAbortando...\n\n"); exit(1); } while(fgetc (dicionario) != EOF){ fseek(dicionario, -1, 1); fread(tupla, sizeof(char), TAMANHO_NOME_TABELA , dicionario); //Lê somente o nome da tabela if(strcmp(tupla, nTabela) == 0){ // Verifica se o nome dado pelo usuario existe no dicionario de dados. strcpy(objeto.nome, tupla); fread(&cod,sizeof(int),1,dicionario); // Copia valores referentes a tabela pesquisada para a estrutura. objeto.cod=cod; fread(tupla,sizeof(char),TAMANHO_NOME_TABELA,dicionario); strcpy(objeto.nArquivo, tupla); fread(&cod,sizeof(int),1,dicionario); objeto.qtdCampos = cod; return objeto; } fseek(dicionario, 28, 1); // Pula a quantidade de caracteres para a proxima verificacao(4B do codigo, 20B do nome do arquivo e 4B da quantidade de campos). } return objeto; }
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 excluirTabela(char *nomeTabela) { struct fs_objects objeto, objeto1; tp_table *esquema, *esquema1; int x,erro, i, j, k, l, qtTable; char str[20]; char dat[5] = ".dat"; memset(str, '\0', 20); if (!verificaNomeTabela(nomeTabela)) { printf("ERROR: table \"%s\" does not exist.\n", nomeTabela); return ERRO_NOME_TABELA; } strcpylower(str, nomeTabela); strcat(str, dat); //Concatena e junta o nome com .dat abreTabela(nomeTabela, &objeto, &esquema); qtTable = quantidadeTabelas(); char **tupla = (char **)malloc(sizeof(char **)*qtTable); memset(tupla, 0, qtTable); for (i=0; i < qtTable; i++) { tupla[i] = (char *)malloc(sizeof(char)*TAMANHO_NOME_TABELA); memset(tupla[i], '\0', TAMANHO_NOME_TABELA); } tp_table *tab2 = (tp_table *)malloc(sizeof(struct tp_table)); tab2 = procuraAtributoFK(objeto); //retorna o tipo de chave que e cada campo FILE *dicionario; char directory[LEN_DB_NAME*2]; memset(directory, '\0', LEN_DB_NAME*2); strcpy(directory, connected.db_directory); strcat(directory, "fs_object.dat"); if((dicionario = fopen(directory,"a+b")) == NULL) return ERRO_ABRIR_ARQUIVO; k=0; while(fgetc (dicionario) != EOF){ fseek(dicionario, -1, 1); //coloca o nome de todas as tabelas em tupla fread(tupla[k], sizeof(char), TAMANHO_NOME_TABELA , dicionario); k++; fseek(dicionario, 28, 1); } fclose(dicionario); for(i = 0; i < objeto.qtdCampos; i++){ if(tab2[i].chave == PK){ for(j=0; j<qtTable; j++) { //se tiver chave primaria verifica se ela e chave if(objcmp(tupla[j], nomeTabela) != 0) { //estrangeira em outra tabela abreTabela(tupla[j], &objeto1, &esquema1); tp_table *tab3 = (tp_table *)malloc(sizeof(struct tp_table)); tab3 = procuraAtributoFK(objeto1); for(l=0; l<objeto1.qtdCampos; l++) { if(tab3[l].chave == FK) { //verifica se a outra tabela possui chave estrangeira. se sim, verifica se e da tabela anterior. if(objcmp(nomeTabela, tab3[l].tabelaApt) == 0) { printf("ERROR: cannot drop table \"%s\" because other objects depend on it.\n", nomeTabela); return ERRO_CHAVE_ESTRANGEIRA; } } } free(tab3); } } } } free(tab2); tp_buffer *bufferpoll = initbuffer(); if(bufferpoll == ERRO_DE_ALOCACAO){ printf("ERROR: no memory available to allocate buffer.\n"); return ERRO_LEITURA_DADOS; } erro = SUCCESS; for(x = 0; erro == SUCCESS; x++) erro = colocaTuplaBuffer(bufferpoll, x, esquema, objeto); if(procuraSchemaArquivo(objeto) != 0) { free(bufferpoll); return ERRO_REMOVER_ARQUIVO_SCHEMA; } if(procuraObjectArquivo(nomeTabela) != 0) { free(bufferpoll); return ERRO_REMOVER_ARQUIVO_OBJECT; } strcpy(directory, connected.db_directory); strcat(directory, str); remove(directory); free(bufferpoll); printf("DROP TABLE\n"); return SUCCESS; }
void printTable(char *tbl){ if(tbl == NULL){ //mostra todas as tabelas do banco FILE *dicionario; printf(" List of Relations\n"); char *tupla = (char *)malloc(sizeof(char)*TAMANHO_NOME_TABELA); char directory[LEN_DB_NAME*2]; strcpy(directory, connected.db_directory); strcat(directory, "fs_object.dat"); if((dicionario = fopen(directory,"a+b")) == NULL){ free(tupla); printf("ERROR: cannot open file\n"); return; } printf(" %-10s | %-15s | %-10s | %-10s\n", "Schema", "Name", "Type", "Owner"); printf("------------+-----------------+------------+-------\n"); int i=0; while(fgetc (dicionario) != EOF){ fseek(dicionario, -1, 1); fread(tupla, sizeof(char), TAMANHO_NOME_TABELA, dicionario); printf(" %-10s | %-15s | %-10s | %-10s\n", "public", tupla, "tuple", "ibetres"); fseek(dicionario, 28, 1); i++; } fclose(dicionario); free(tupla); printf("(%d %s)\n\n", i, (i<=1)? "row": "rows"); } else{ //mostra todos atributos da tabela *tbl if(!verificaNomeTabela(tbl)) { printf("Did not find any relation named \"%s\".\n", tbl); return; } printf(" Table \"public.%s\"\n", tbl); printf(" %-18s | %-12s | %-10s\n", "Column", "Type", "Modifiers"); printf("--------------------+--------------+-----------\n"); struct fs_objects objeto1; tp_table *esquema1; abreTabela(tbl, &objeto1, &esquema1); tp_table *tab3 = (tp_table *)malloc(sizeof(struct tp_table)); tab3 = procuraAtributoFK(objeto1); //retorna tp_table int l, ipk=0, ifk=0; char **pk = (char**)malloc(objeto1.qtdCampos*sizeof(char**)); char **fkTable = (char**)malloc(objeto1.qtdCampos*sizeof(char**)); char **fkColumn = (char**)malloc(objeto1.qtdCampos*sizeof(char**)); char **refColumn = (char**)malloc(objeto1.qtdCampos*sizeof(char**)); memset(pk , 0, objeto1.qtdCampos); memset(fkTable , 0, objeto1.qtdCampos); memset(fkColumn , 0, objeto1.qtdCampos); memset(refColumn, 0, objeto1.qtdCampos); int i; for(i=0; i<objeto1.qtdCampos; i++) { pk[i] = (char*)malloc(TAMANHO_NOME_CAMPO*sizeof(char)); fkTable[i] = (char*)malloc(TAMANHO_NOME_CAMPO*sizeof(char)); fkColumn[i] = (char*)malloc(TAMANHO_NOME_CAMPO*sizeof(char)); refColumn[i] = (char*)malloc(TAMANHO_NOME_CAMPO*sizeof(char)); memset(pk[i] , '\0', TAMANHO_NOME_CAMPO); memset(fkTable[i] , '\0', TAMANHO_NOME_CAMPO); memset(fkColumn[i] , '\0', TAMANHO_NOME_CAMPO); memset(refColumn[i] , '\0', TAMANHO_NOME_CAMPO); } for(l=0; l<objeto1.qtdCampos; l++) { if(tab3[l].chave == PK){ strcpylower(pk[ipk++], tab3[l].nome); } else if(tab3[l].chave == FK){ strcpylower(fkTable[ifk] , tab3[l].tabelaApt); strcpylower(fkColumn[ifk] , tab3[l].attApt); strcpylower(refColumn[ifk++], tab3[l].nome); } printf(" %-17s |", tab3[l].nome); if(tab3[l].tipo == 'S') printf(" %-8s(%d) |", " varchar", tab3[l].tam); else if(tab3[l].tipo == 'I') printf(" %-10s |", " integer"); else if(tab3[l].tipo == 'C') printf(" %-10s |", " char"); else if(tab3[l].tipo == 'D') printf(" %-10s |", " double"); printf(" %-10s ", (tab3[l].chave == PK || tab3[l].chave == FK)? "not null": "null"); printf("\n"); } if(ipk){ //printf PK's printf("Indexes:\n"); for(l = 0; l < ipk; l++){ printf("\t\"%s_pkey\" PRIMARY KEY (%s)\n", tbl, pk[l]); } } if(ifk){ //printf FK's printf("Foreign-key constrains:\n"); for(l = 0; l < ifk; l++){ printf("\t\"%s_%s_fkey\" FOREIGN KEY (%s) REFERENCES %s(%s)\n",tbl, refColumn[l], refColumn[l], fkTable[l], fkColumn[l]); } } free(pk); free(fkTable); free(fkColumn); free(refColumn); free(tab3); printf("\n"); } }
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; }
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); }
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); }