コード例 #1
0
int iniciaAtributos(struct fs_objects *objeto, tp_table **tabela, tp_buffer **bufferpoll, char *nomeT){


    *objeto     = leObjeto(nomeT);
    *tabela     = leSchema(*objeto);
    *bufferpoll = initbuffer();

    if(*tabela == ERRO_ABRIR_ESQUEMA) {
        return ERRO_DE_PARAMETRO;
    }

    if(*bufferpoll == ERRO_DE_ALOCACAO)
        return ERRO_DE_PARAMETRO;

    return SUCCESS;
}
コード例 #2
0
ファイル: func.c プロジェクト: rafael---/DBMS-Interface
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");
		}
	}		

}
コード例 #3
0
ファイル: buffend.c プロジェクト: roseliwenzel/BancoII-UFFS
int finalizaInsert(char *nome, column *c)
{
	column *auxC;
	int i = 0, x = 0, t;
	FILE *dados;


	struct fs_objects dicio = leObjeto(nome); // Le dicionario
	tp_table *auxT = leSchema(dicio); // Le esquema
	
	if((dados = fopen(dicio.nArquivo,"a+b")) == NULL)
    	return ERRO_ABRIR_ARQUIVO;
	
	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);			
		}

	}
	fclose(dados);
	free(c); // Libera a memoria da estrutura.
	free(auxT); // Libera a memoria da estrutura.
	return SUCCESS;
}
コード例 #4
0
ファイル: buffend.c プロジェクト: favero07/bufferpoll_BDII
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;
}
コード例 #5
0
ファイル: buffend.c プロジェクト: favero07/bufferpoll_BDII
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
}
コード例 #6
0
ファイル: imprime.c プロジェクト: schein00/uffsdb
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);
}
コード例 #7
0
tp_table *abreTabela(char *nomeTabela, struct fs_objects *objeto, tp_table **tabela) {
    *objeto     = leObjeto(nomeTabela);
    *tabela     = leSchema(*objeto);

    return *tabela;
}
コード例 #8
0
ファイル: imprimeAll.c プロジェクト: edurox/uffsdb
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);
}
コード例 #9
0
ファイル: shell.c プロジェクト: Trindad/dbms-interface
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);
}