void carregaDados(struct page *buffer, char *data, char *meta, struct CAMPOS *campos){ //Traz todos os registros para o buffer int i=1, tamTpl = tamTupla(campos, meta); char *linha = getTupla(campos, meta, data, 0); while(linha != NULL){ //Pega as tuplas e insere no buffer até que acabe o arquivo colocaTuplaBuffer(buffer, linha, campos, meta); linha = getTupla(campos, meta, data, i*tamTpl); i++; } }
void carregaDados(struct page *buffer, char *meta, struct CAMPOS *campos, struct OBJ *tabela){ //Traz todos os registros para o buffer //int id = 1; int i=1, tamTpl = tamTupla(campos, meta); //tamTpl representa o tamanho total dos atributos char *linha = getTupla(campos, meta, tabela, 0); while(linha != NULL){ //Pega as tuplas e insere no buffer até que acabe o arquivo colocaTuplaBuffer(buffer, linha, campos, meta); linha = getTupla(campos, meta, tabela, i*tamTpl); i++; } }
int existeAtributo(char *nomeTabela, column *c){ int erro, x, count; struct fs_objects objeto; memset(&objeto, 0, sizeof(struct fs_objects)); tp_table *tabela; tp_buffer *bufferpoll; column *aux = NULL; column *pagina = NULL; if(iniciaAtributos(&objeto, &tabela, &bufferpoll, nomeTabela) != SUCCESS) return ERRO_DE_PARAMETRO; erro = SUCCESS; for(x = 0; erro == SUCCESS; x++) erro = colocaTuplaBuffer(bufferpoll, x, tabela, objeto); pagina = getPage(bufferpoll, tabela, objeto, 0); if(pagina == NULL){ pagina = getPage(bufferpoll, tabela, objeto, 1); } if(pagina != NULL){ count = 0; for(x = 0; x < objeto.qtdCampos; x++){ if (!pagina[x].nomeCampo) continue; for(aux = c; aux != NULL; aux=aux->next) { if (!aux->nomeCampo) continue; if(objcmp(pagina[x].nomeCampo, aux->nomeCampo) == 0) count++; } } if(count != objeto.qtdCampos){ free(pagina); free(bufferpoll); free(tabela); return ERRO_DE_PARAMETRO; } } free(pagina); free(bufferpoll); free(tabela); return SUCCESS; }
int carregaDados(struct page *buffer, char *meta, struct CAMPOS *campos, struct OBJ *tabela){ //Traz todos os registros para o buffer int i=1,tamTpl = (tamTupla(campos, meta)); //tamTpl representa o tamanho total dos atributos char *linha; if(!(tamTpl)){ return GENERIC_ERROR; } if(!(linha =(char *)malloc(sizeof(char)*tamTpl))){ return OUT_OF_MEMORY; } int error; error = getTupla(linha,campos, meta, tabela, 0); if(error == OKAY){ while(linha != NULL){ //Pega as tuplas e insere no buffer até que acabe o arquivo error = colocaTuplaBuffer(buffer, linha, campos, meta); free(linha); linha =(char *)malloc(sizeof(char)*tamTpl); if(error == OKAY){ error = getTupla(linha,campos, meta, tabela, i*tamTpl); if( error != OKAY){ return OKAY; } i++; }else return error; } } else return error; return OKAY; }
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 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); }
int verificaChaveFK(char *nomeTabela,column *c, char *nomeCampo, char *valorCampo, char *tabelaApt, char *attApt){ int x,j, erro, page; char str[20]; char dat[5] = ".dat"; struct fs_objects objeto; tp_table *tabela; tp_buffer *bufferpoll; column *pagina = NULL; strcpylower(str, tabelaApt); strcat(str, dat); //Concatena e junta o nome com .dat erro = existeAtributo(nomeTabela, c); /*if(erro != SUCCESS ) return ERRO_DE_PARAMETRO;*/ //if(existeAtributo(tabelaApt, c)) //return ERRO_CHAVE_ESTRANGEIRA; if(iniciaAtributos(&objeto, &tabela, &bufferpoll, tabelaApt) != SUCCESS) { free(bufferpoll); free(tabela); return ERRO_DE_PARAMETRO; } erro = SUCCESS; for(x = 0; erro == SUCCESS; x++) erro = colocaTuplaBuffer(bufferpoll, x, tabela, objeto); for (page = 0; page < PAGES; page++) { if (pagina) free(pagina); pagina = getPage(bufferpoll, tabela, objeto, page); if (!pagina) break; for(j = 0; j < objeto.qtdCampos * bufferpoll[page].nrec; j++){ if (pagina[j].nomeCampo) { if(objcmp(pagina[j].nomeCampo, attApt) == 0){ if(pagina[j].tipoCampo == 'S'){ if(objcmp(pagina[j].valorCampo, valorCampo) == 0){ free(pagina); free(bufferpoll); free(tabela); return SUCCESS; } } else if(pagina[j].tipoCampo == 'I'){ int *n = (int *)&pagina[j].valorCampo[0]; if(*n == atoi(valorCampo)){ free(pagina); free(bufferpoll); free(tabela); return SUCCESS; } } else if(pagina[j].tipoCampo == 'D'){ double *nn = (double *)&pagina[j].valorCampo[0]; if(*nn == atof(valorCampo)){ free(pagina); free(bufferpoll); free(tabela); return SUCCESS; } } else if(pagina[j].tipoCampo == 'C'){ if(pagina[j].valorCampo == valorCampo){ free(pagina); free(bufferpoll); free(tabela); return SUCCESS; } } else { free(pagina); free(bufferpoll); free(tabela); return ERRO_CHAVE_ESTRANGEIRA; } } } } } if (pagina) free(pagina); free(bufferpoll); free(tabela); return ERRO_CHAVE_ESTRANGEIRA; }
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); }