Exemple #1
0
struct fs_objects leObjeto(char *nTabela){

    FILE *dicionario;
    char *tupla = (char *)malloc(sizeof(char)*TAMANHO_NOME_TABELA);
    memset(tupla, '\0', TAMANHO_NOME_TABELA);
    int cod;

    char directory[LEN_DB_NAME*2];
    strcpy(directory, connected.db_directory);
    strcat(directory, "fs_object.dat");

    dicionario = fopen(directory, "a+b"); // Abre o dicionario de dados.

    struct fs_objects objeto;

    if(!verificaNomeTabela(nTabela)){
        printf("ERROR: relation \"%s\" was not found.\n", nTabela);
        if (dicionario)
            fclose(dicionario);
        free(tupla);

        return objeto;
    }

    if (dicionario == NULL) {
        printf("ERROR: data dictionary was not found.\n\n");
        free(tupla);
        return objeto;
    }


    while(fgetc (dicionario) != EOF){
        fseek(dicionario, -1, 1);

        fread(tupla, sizeof(char), TAMANHO_NOME_TABELA , dicionario); //Lê somente o nome da tabela

        if(objcmp(tupla, nTabela) == 0){ // Verifica se o nome dado pelo usuario existe no dicionario de dados.
            strcpylower(objeto.nome, tupla);
            fread(&cod,sizeof(int),1,dicionario);   // Copia valores referentes a tabela pesquisada para a estrutura.
            objeto.cod=cod;
            fread(tupla,sizeof(char),TAMANHO_NOME_TABELA,dicionario);
            strcpylower(objeto.nArquivo, tupla);
            fread(&cod,sizeof(int),1,dicionario);
            objeto.qtdCampos = cod;

            free(tupla);
            fclose(dicionario);
            return objeto;
        }
        fseek(dicionario, 28, 1); // Pula a quantidade de caracteres para a proxima verificacao(4B do codigo, 20B do nome do arquivo e 4B da quantidade de campos).
    }
    free(tupla);
    fclose(dicionario);

    return objeto;
}
Exemple #2
0
//----------------------------------------
// CRIA TABELA
table *iniciaTabela(char *nome)
{
	if(verificaNomeTabela(nome)){	// Se o nome já existir no dicionario, retorna erro.
		return ERRO_NOME_TABELA_INVALIDO;
	}

	table *t = (table *)malloc(sizeof(table)*1);
	strcpy(t->nome,nome); // Inicia a estrutura de tabela com o nome da tabela.
	t->esquema = NULL; // Inicia o esquema da tabela com NULL.
	return t; // Retorna estrutura para criação de uma tabela.
}
Exemple #3
0
// LEITURA DE DICIONARIO E ESQUEMA
struct fs_objects leObjeto(char *nTabela){

	FILE *dicionario;
	char *tupla = (char *)malloc(sizeof(char)*TAMANHO_NOME_TABELA);
	int cod;
	dicionario = fopen("fs_object.dat", "a+b"); // Abre o dicionario de dados.

	struct fs_objects objeto;

	if(!verificaNomeTabela(nTabela)){
		printf("Erro GRAVE! na função leObjeto(). Nome da tabela inválido.\nAbortando...\n");
		exit(1);
	}

	if (dicionario == NULL)	{
		printf("Erro GRAVE! na função leObjeto(). Arquivo não encontrado.\nAbortando...\n\n");
		exit(1);
	}
	

	while(fgetc (dicionario) != EOF){
        fseek(dicionario, -1, 1);

        fread(tupla, sizeof(char), TAMANHO_NOME_TABELA , dicionario); //Lê somente o nome da tabela

        if(strcmp(tupla, nTabela) == 0){ // Verifica se o nome dado pelo usuario existe no dicionario de dados.
      		strcpy(objeto.nome, tupla);
      		fread(&cod,sizeof(int),1,dicionario);	// Copia valores referentes a tabela pesquisada para a estrutura.
      		objeto.cod=cod;
      		fread(tupla,sizeof(char),TAMANHO_NOME_TABELA,dicionario);
      		strcpy(objeto.nArquivo, tupla);
      		fread(&cod,sizeof(int),1,dicionario);
      		objeto.qtdCampos = cod;
      		
        	return objeto;
        }
        fseek(dicionario, 28, 1); // Pula a quantidade de caracteres para a proxima verificacao(4B do codigo, 20B do nome do arquivo e 4B da quantidade de campos).
	}
	return objeto;
}
Exemple #4
0
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");
		}
	}		

}
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;
}
Exemple #6
0
void printTable(char *tbl){
	if(tbl == NULL){     //mostra todas as tabelas do banco
		FILE *dicionario;
		printf("		List of Relations\n");
		char *tupla = (char *)malloc(sizeof(char)*TAMANHO_NOME_TABELA);

		char directory[LEN_DB_NAME*2];
    	strcpy(directory, connected.db_directory);
    	strcat(directory, "fs_object.dat");

		if((dicionario = fopen(directory,"a+b")) == NULL){
			free(tupla);
			printf("ERROR: cannot open file\n");
			return;
		}

		printf(" %-10s | %-15s | %-10s | %-10s\n", "Schema", "Name", "Type", "Owner");
		printf("------------+-----------------+------------+-------\n");
		int i=0;
		while(fgetc (dicionario) != EOF){
			fseek(dicionario, -1, 1);
			fread(tupla, sizeof(char), TAMANHO_NOME_TABELA, dicionario);
			printf(" %-10s | %-15s | %-10s | %-10s\n", "public", tupla, "tuple", "ibetres");
			fseek(dicionario, 28, 1);
			i++;
		}
		fclose(dicionario);
		free(tupla);
		printf("(%d %s)\n\n", i, (i<=1)? "row": "rows");
	} else{               //mostra todos atributos da tabela *tbl

		if(!verificaNomeTabela(tbl)) {
			printf("Did not find any relation named \"%s\".\n", tbl);
			return;
		}

		printf("	  Table \"public.%s\"\n", tbl);
		printf(" %-18s | %-12s | %-10s\n", "Column", "Type", "Modifiers");
		printf("--------------------+--------------+-----------\n");

		struct fs_objects objeto1;
		tp_table *esquema1;

		abreTabela(tbl, &objeto1, &esquema1);

		tp_table *tab3 = (tp_table *)malloc(sizeof(struct tp_table));
		tab3 = procuraAtributoFK(objeto1); //retorna tp_table
		int l, ipk=0, ifk=0;

		char **pk 			= (char**)malloc(objeto1.qtdCampos*sizeof(char**));
		char **fkTable		= (char**)malloc(objeto1.qtdCampos*sizeof(char**));
		char **fkColumn 	= (char**)malloc(objeto1.qtdCampos*sizeof(char**));
		char **refColumn 	= (char**)malloc(objeto1.qtdCampos*sizeof(char**));

		memset(pk 		, 0, objeto1.qtdCampos);
		memset(fkTable 	, 0, objeto1.qtdCampos);
		memset(fkColumn , 0, objeto1.qtdCampos);
		memset(refColumn, 0, objeto1.qtdCampos);

		int i;
		for(i=0; i<objeto1.qtdCampos; i++) {
			pk[i] 			= (char*)malloc(TAMANHO_NOME_CAMPO*sizeof(char));
			fkTable[i] 		= (char*)malloc(TAMANHO_NOME_CAMPO*sizeof(char));
			fkColumn[i] 	= (char*)malloc(TAMANHO_NOME_CAMPO*sizeof(char));
			refColumn[i] 	= (char*)malloc(TAMANHO_NOME_CAMPO*sizeof(char));

			memset(pk[i] 		, '\0', TAMANHO_NOME_CAMPO);
			memset(fkTable[i] 	, '\0', TAMANHO_NOME_CAMPO);
			memset(fkColumn[i]  , '\0', TAMANHO_NOME_CAMPO);
			memset(refColumn[i] , '\0', TAMANHO_NOME_CAMPO);

		}

		for(l=0; l<objeto1.qtdCampos; l++) {

			if(tab3[l].chave == PK){
				strcpylower(pk[ipk++], tab3[l].nome);
			}
			else if(tab3[l].chave == FK){
				strcpylower(fkTable[ifk]	, tab3[l].tabelaApt);
				strcpylower(fkColumn[ifk]	, tab3[l].attApt);
				strcpylower(refColumn[ifk++], tab3[l].nome);
			}

			printf("  %-17s |", tab3[l].nome);

			if(tab3[l].tipo == 'S')
				printf(" %-8s(%d) |", " varchar", tab3[l].tam);
			else if(tab3[l].tipo == 'I')
				printf(" %-10s   |", " integer");
			else if(tab3[l].tipo == 'C')
				printf(" %-10s   |", " char");
			else if(tab3[l].tipo == 'D')
				printf(" %-10s   |", " double");

			printf(" %-10s ", (tab3[l].chave == PK || tab3[l].chave == FK)? "not null": "null");

			printf("\n");
		}
		if(ipk){	//printf PK's
			printf("Indexes:\n");
			for(l = 0; l < ipk; l++){
				printf("\t\"%s_pkey\" PRIMARY KEY (%s)\n", tbl, pk[l]);
			}
		}
		if(ifk){	//printf FK's
			printf("Foreign-key constrains:\n");
			for(l = 0; l < ifk; l++){
				printf("\t\"%s_%s_fkey\" FOREIGN KEY (%s) REFERENCES %s(%s)\n",tbl, refColumn[l], refColumn[l], fkTable[l], fkColumn[l]);
			}
		}

		free(pk);
		free(fkTable);
		free(fkColumn);
		free(refColumn);
		free(tab3);
		printf("\n");
	}
}
Exemple #7
0
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;
}
Exemple #8
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);
}
Exemple #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);
}
Exemple #10
0
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);
}