int showTupleBuffer(struct page *buffer, struct CAMPOS *campos, char *meta, int pg, int rg){ //mostra o registro de número "rg" da página "pg" do bufffer int k, i, tam = tamTupla(campos,meta), qt=qtCampos(meta,campos[0].id); char *linha = NULL; int error; if(pg < 0 || pg > BP) return PAGE_INVALIDA; else if(buffer[pg].nrec == 0) return EMPTY_PAGE; if(buffer[pg].position != 0){ for(i = 0; i< qt; i++) printf("%-20s", campos[i].nome); printf("\n--------------------------------------------------------------------------------------------\n"); for(k = 0; k < buffer[pg].nrec; k ++){ if(k == rg){ linha = strcop(buffer[pg].data, k, tam); //Função que devolve uma string para a impressão da tupla if(!linha){ return OUT_OF_MEMORY; } error = leTupla(campos, meta, linha); //Mostra a string if(error != OKAY) return error; printf("\n\n"); return OKAY; } } return TUPLE_NOT_FOUND; } return GENERIC_ERROR; }
void leTupla(struct CAMPOS *campos, char *meta, char *linha){ //Lê uma tupla da memória char *auxStr; //Variável auxiliar para leitura de stringd if(linha == NULL) return; int qtdCampos, j, k=0 ; // k é a posição do byte dentro da tupla qtdCampos = qtCampos(meta); for(j=0 ; j<qtdCampos; j++){ if(j!=0) printf(" | "); if(campos[j].tipo == 'S'){ auxStr = linha + k; //acesso a posição de inínio de uma string printf("%-20s", auxStr); k += campos[j].tamanho; //Atualição de leitura do número de bytes para char }else if(campos[j].tipo == 'D'){ double *n = (double *)&linha[k]; printf("%-20.2f", *n); k += sizeof(double); //Atualição de leitura do número de bytes para double }else if(campos[j].tipo == 'I'){ int *n = (int *)&linha[k]; printf("%-20d", *n); k += sizeof(int); //Atualição de leitura do número de bytes para int } } printf("\n"); }
int tamTupla(struct CAMPOS *campos, char *meta){// Retorna o tamanho total da tupla da tabela. int qtdCampos = qtCampos(meta), i, tamanhoGeral = 0; if(qtdCampos){ // Lê o primeiro inteiro que representa a quantidade de campos da tabela. for(i = 0; i < qtdCampos; i++) tamanhoGeral += campos[i].tamanho ; // Soma os tamanhos de cada campo da tabela. } return tamanhoGeral; }
int tamTupla(struct CAMPOS *campos, char *meta){ // Retorna o tamanho total da tupla da tabela. int qtdCampos, i, tamanhoGeral = 0; qtdCampos = qtCampos(meta, campos[0].id); if(!(qtdCampos)){ return GENERIC_ERROR; } for(i = 0; i < qtdCampos; i++) tamanhoGeral += campos[i].tamanho ; // Soma os tamanhos de cada campo da tabela. return tamanhoGeral; }
void showTupleBuffer(struct page *buffer, struct CAMPOS *campos, char *meta, int pg, int rg){ //mostra o registro de número "rg" da página "pg" do bufffer int k, i, tam = tamTupla(campos,meta), qt=qtCampos(meta); char *linha = NULL; if(buffer[pg].position != 0){ for(i = 0; i< qt; i++) printf("%-25s", campos[i].nome); printf("\n--------------------------------------------------------------------------------------------\n"); for(k = 0; k < buffer[pg].nrec; k ++){ if(k == rg){ linha = strcop(buffer[pg].data, k, tam); //Função que devolve uma string para a impressão da tupla leTupla(campos, meta, linha); //Mostra a string return; } } printf("Posição inválida!\n"); } }
int leMetaDados(struct CAMPOS **campos,char *fs_coluna, struct OBJ *table){ FILE *metadados; *campos = NULL; int i, j = 0, tam; char c; int error; int qtdCampos; if(!table->id){ return TABLE_NOT_FOUND; } qtdCampos = qtCampos(fs_coluna, table->id); if(!(qtdCampos)){ error = qtdCampos; return error; } metadados = fopen(fs_coluna, "r"); // Abre os metadados armazenados em fs_coluna if(!(metadados)){ return FS_COLUNA_NOT_FOUND; } int posi = positionOnFile(fs_coluna, table->id); if((posi) < 0){ return GENERIC_ERROR; } fseek(metadados, posi, SEEK_CUR); if(qtdCampos) // Lê o primeiro inteiro que representa a quantidade de campos da tabela. { int t; *campos =(struct CAMPOS *)malloc(sizeof(struct CAMPOS)*qtdCampos); // Cria uma estrutura para armazenar os dados dos campos. if(!(*campos)){ return OUT_OF_MEMORY; } for( i = 0; i < qtdCampos ; i ++) // Laço para ler o nome, tipo e tamanho de cada campo. { (*campos)->id = table->id; fread(&t, sizeof(int),1,metadados); fread(&c, sizeof(char),1,metadados); while (c != '\0') // Laço para ler o nome do campo. { (*campos)->nome[j] = c; fread(&c, sizeof(char),1,metadados); j++; } fseek(metadados, TAM_NOME - j -1, SEEK_CUR); fread(&c, 1, 1, metadados); // Lê o tipo do campo. (*campos)->tipo = c; fread(&tam , sizeof(int), 1, metadados); // Lê o tamanho do campo. (*campos)->tamanho = tam; j = 0; (*campos)++; } fclose(metadados);// Fecha o arquivo meta (*campos) -= i; return OKAY; } return GENERIC_ERROR; }
struct CAMPOS *leMetaDados(char *fs_coluna, int id){ FILE *metadados; int qtdCampos, i, j = 0, tam; char c; if(!id){ } qtdCampos = qtCampos(fs_coluna, id);// printf("qt : %d",qtdCampos); metadados = fopen(fs_coluna, "r"); // Abre os metadados armazenados em meta if (metadados == NULL) exit(0); if(qtdCampos) // Lê o primeiro inteiro que representa a quantidade de campos da tabela. { int t; struct CAMPOS *campos=(struct CAMPOS *)malloc(sizeof(struct CAMPOS)*qtdCampos); // Cria uma estrutura para armazenar os dados dos campos. for( i = 0; i < qtdCampos ; i ++) // Laço para ler o nome, tipo e tamanho de cada campo. { campos[i].id = id; fread(&t, sizeof(int),1,metadados); fread(&c, sizeof(char),1,metadados); while (c != '\0') // Laço para ler o nome do campo. { campos[i].nome[j] = c; fread(&c, sizeof(char),1,metadados); j++; } fseek(metadados, TAM_NOME - j -1, SEEK_CUR); fread(&c, 1, 1, metadados); // Lê o tipo do campo. campos[i].tipo = c; fread(&tam , sizeof(int), 1, metadados); // Lê o tamanho do campo. campos[i].tamanho = tam; j = 0; //fseek(metadados,0,SEEK_END); //long pos = ftell(metadados); //pega o tamanho do arquivo //printf("t : %d e %d", pos,qtdCampos); } fclose(metadados);// Fecha o arquivo meta /* printf("\nid: %d \n", campos[0].id); puts(campos[0].nome); printf("TIPO %c\n", campos[0].tipo); printf("TAAMM: %d\n", campos[0].tamanho); printf("\nid: %d \n", campos[1].id); puts(campos[1].nome); printf("TIPO %c\n", campos[1].tipo); printf("TAAMM: %d\n", campos[1].tamanho); printf("\nid: %d \n", campos[2].id); puts(campos[2].nome); printf("TIPO %c\n", campos[2].tipo); printf("TAAMM: %d\n", campos[2].tamanho);*/ /*int tf = *CAMPOS_TAM ; printf("TAMANHO : %d e %d", tf,qtdCampos);*/ return campos; } return NULL; }