int finalizaTabela(table *t){ if(t == NULL) return ERRO_DE_PARAMETRO; FILE *esquema, *dicionario; tp_table *aux; int codTbl = quantidadeTabelas() + 1, qtdCampos = 0; // Conta a quantidade de tabelas já no dicionario e soma 1 no codigo dessa nova tabela. char nomeArquivo[TAMANHO_NOME_ARQUIVO]; memset(nomeArquivo, 0, TAMANHO_NOME_ARQUIVO); char directory[LEN_DB_NAME*2]; strcpy(directory, connected.db_directory); strcat(directory, "fs_schema.dat"); if((esquema = fopen(directory,"a+b")) == NULL) return ERRO_ABRIR_ARQUIVO; for(aux = t->esquema; aux != NULL; aux = aux->next){ // Salva novos campos no esquema da tabela, fs_schema.dat fwrite(&codTbl ,sizeof(codTbl) ,1,esquema); //Código Tabela fwrite(&aux->nome ,sizeof(aux->nome) ,1,esquema); //Nome campo fwrite(&aux->tipo ,sizeof(aux->tipo) ,1,esquema); //Tipo campo fwrite(&aux->tam ,sizeof(aux->tam) ,1,esquema); //Tamanho campo fwrite(&aux->chave ,sizeof(aux->chave) ,1,esquema); //Chave do campo fwrite(&aux->tabelaApt ,sizeof(aux->tabelaApt) ,1,esquema); //Tabela Apontada fwrite(&aux->attApt ,sizeof(aux->attApt) ,1,esquema); //Atributo apontado. qtdCampos++; // Soma quantidade total de campos inseridos. } fclose(esquema); strcpy(directory, connected.db_directory); strcat(directory, "fs_object.dat"); if((dicionario = fopen(directory,"a+b")) == NULL) return ERRO_ABRIR_ARQUIVO; strcpylower(nomeArquivo, t->nome); strcat(nomeArquivo, ".dat\0"); strcat(t->nome, "\0"); // Salva dados sobre a tabela no dicionario. fwrite(&t->nome,sizeof(t->nome),1,dicionario); fwrite(&codTbl,sizeof(codTbl),1,dicionario); fwrite(&nomeArquivo,sizeof(nomeArquivo),1,dicionario); fwrite(&qtdCampos,sizeof(qtdCampos),1,dicionario); fclose(dicionario); return SUCCESS; }
int finalizaTabela(table *t) { if(t == NULL) return ERRO_DE_PARAMETRO; FILE *esquema, *dicionario; tp_table *aux; int codTbl = quantidadeTabelas() + 1, qtdCampos = 0; // Conta a quantidade de tabelas já no dicionario e soma 1 no codigo dessa nova tabela. char nomeArquivo[TAMANHO_NOME_ARQUIVO]; if((esquema = fopen("fs_schema.dat","a+b")) == NULL) return ERRO_ABRIR_ARQUIVO; for(aux = t->esquema; aux!=NULL; aux = aux->next) // Salva novos campos no esquema da tabela, fs_schema.dat { fwrite(&codTbl,sizeof(codTbl),1,esquema); fwrite(&aux->nome,sizeof(aux->nome),1,esquema); fwrite(&aux->tipo,sizeof(aux->tipo),1,esquema); fwrite(&aux->tam,sizeof(aux->tam),1,esquema); qtdCampos++; // Soma quantidade total de campos inseridos. } fclose(esquema); if((dicionario = fopen("fs_object.dat","a+b")) == NULL) return ERRO_ABRIR_ARQUIVO; strcpy(nomeArquivo, t->nome); strcat(nomeArquivo, ".dat\0"); strcat(t->nome, "\0"); // Salva dados sobre a tabela no dicionario. fwrite(&t->nome,sizeof(t->nome),1,dicionario); fwrite(&codTbl,sizeof(codTbl),1,dicionario); fwrite(&nomeArquivo,sizeof(nomeArquivo),1,dicionario); fwrite(&qtdCampos,sizeof(qtdCampos),1,dicionario); fclose(dicionario); return SUCCESS; }
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; }
int procuraObjectArquivo(char *nomeTabela){ int teste = 0, cont = 0, achou = 0, tamanhoTotal = sizeof(struct fs_objects); char *table = (char *)malloc(sizeof(char) * tamanhoTotal); FILE *dicionario, *fp; char directory[LEN_DB_NAME*2]; strcpy(directory, connected.db_directory); strcat(directory, "fs_object.dat"); if((dicionario = fopen(directory,"a+b")) == NULL) { free(table); return ERRO_ABRIR_ARQUIVO; } strcpy(directory, connected.db_directory); strcat(directory, "fs_nobject.dat"); if((fp = fopen(directory, "a+b")) == NULL) { free(table); return ERRO_ABRIR_ARQUIVO; } fseek(dicionario, 0, SEEK_SET); fseek(fp, 0, SEEK_SET); while(cont < quantidadeTabelas()){ fread(table, sizeof(char), tamanhoTotal, dicionario); teste = TrocaArquivosObj(nomeTabela, table); if(teste == 0){ //NÃO É IGUAL fseek(fp, 0, SEEK_END); fwrite(table, sizeof(char), tamanhoTotal, fp); } else if(achou != 1){ //É IGUAL E NÃO TINHA SIDO DESCOBERTO. achou = 1; fread(table, sizeof(char), 0, dicionario); } cont++; } fclose(fp); fclose(dicionario); char directoryex[LEN_DB_NAME*4]; strcpy(directoryex, connected.db_directory); strcat(directoryex, "fs_object.dat"); remove(directoryex); strcpy(directoryex, "mv "); strcat(directoryex, connected.db_directory); strcat(directoryex, "fs_nobject.dat "); strcat(directoryex, connected.db_directory); strcat(directoryex, "fs_object.dat"); system(directoryex); free(table); return SUCCESS; }