Example #1
0
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++;
    }
}
Example #2
0
File: func.c Project: lucacp/BDII-2
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++;
    }
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #6
0
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
}
Example #7
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;
}
Example #9
0
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);
}