/*****************************************
*  INTERPRETEUR D'ALGEBRE RELATIONNELLE  *
*    Olivier Christiaen - 11 Sep 2004	 *
*               UMH-LIG1		 *
*   Evolutions: www.christiaen.org/sqf	 *
******************************************/


#ifndef SQF_H
# define SQF_H

#define TAILLE_MAX_COL 20	/* taille max d'une colonne */
#define NBR_MAX_COL 8		/* nbre max de colonne dans une relation */
#define TAILLE_MAX_CHAMPS 180 /* longueur max d'une liste de champs */
#define NBR_LIGNES_INIT 30 /* nbre de lignes par defaut dans une relation (realouable) */

typedef int booleen;
typedef char champ[TAILLE_MAX_COL];

typedef struct {
		booleen actif;			 /* flag plutot qu'effacement si doublon */
		int 	longueur;		 /* elt prealable de comparaison de 2 enreg */
		champ	element[NBR_MAX_COL];
		} tuple;

typedef struct {
		char   nom[TAILLE_MAX_COL];/* le nom de la table tel que ds dico */
		int    nbr_colonnes;	   /* nbre de colonnes reellement utilisees*/
		int    nbr_tuples;
		int    nbr_tuples_actifs;
	int    nbr_tuples_max;
		tuple* enregistrement;
		} relation;

typedef struct {
		char	   nom_relation[TAILLE_MAX_COL];
		relation * adresse_relation;
		} entree_dictionnaire;	/* une entree dico = nom relation + adresse */

typedef struct {
		int    nbr_relation;   /*nbre de relations enregistrees dans le dico*/
		entree_dictionnaire * relation_dico;
		} dictionnaire;

struct arg_operation {
		int    no_op;	/* type de l'operation */
		champ nom_resultante; /* nom de la relation resultante svt temporaire */
	champ  arg1;	/* valeur de l'argument */
	champ  arg2;
	champ  arg3;
	champ  arg4;
	champ  arg5;
		};


/* declaration des fichiers d'entree et sortie */
extern FILE *yyin, *yyout;

/* declaration du dictionnaire des relations  */
dictionnaire * dico;
booleen flag_prod_cart = 0; /* permet temporairement d'avoir des attributs
identiques dans une relation uniquement pour le cas du traitement du produit cartésien */
int num_ligne=1; /* numero de ligne pour permettre la localisation des erreurs */

/*	 PROTOTYPES DES FONCTIONS	*/
struct arg_operation * garnir_struct(int no_op, char * arg1, char * arg2, char * arg3, char * arg4);
void executer_operation(char * relation_resultante, struct arg_operation * operandes);
relation * relation_existe(char *nom_relation);
int compter_champs();
relation* creer_relation(char * nom_relation, char * champs_rel);
void afficher_relation(char * nom_relation);
void initialiser_dico();
int comparer_noms_champs(char * champs);
void afficher_dico();
int verifier_presence_tuple(char * nom_relation1,char * nom_relation2, int no_tuple);
void ajouter_ds_dico(relation * relation_courante);
int verifier_schema(char * nom_relation1, char * nom_relation2);
int ajouter_tuple(char * nom_relation, char* champs);
void erreur(int code);
int verifier_doublon(relation * relation_courante);
int comparer_champ_champ(relation * relation_courante, int no_tuple, int tuple_courant);
void projection(char * nom_relation_init ,char * nom_relation_res , char* champs );
int verifier_champ_relation(relation * relation_courante, char * champ);
void renommer(char * nom_relation_init ,char * nom_relation_res ,char * attribut_init , char * attribut_res );
char * transformer_tuple_liste(char * nom_relation, int no_tuple);
void union_rel(char * nom_relation1, char * nom_relation2 ,char * nom_relation_res);
void difference(char * nom_relation1, char * nom_relation2 ,char * nom_relation_res);
void selection(char * nom_relation_init,char * nom_relation_res,char * attribut,char operateur, char * valeur_attr);
void selection_attribut(char * nom_relation_init,char * nom_relation_res,char * attribut1,char operateur,char * attribut2);
void jointure(char * nom_relation1, char * nom_relation2, char * nom_relation_res);
void produit_cartesien(char * nom_relation1,char * nom_relation2,char * nom_relation_res);
void liberer_memoire();

#endif
