/*************************************************************************
*									 *
*	 YAP Prolog 							 *
*									 *
*	Yap Prolog was developed at NCCUP - Universidade do Porto	 *
*									 *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 *
*									 *
**************************************************************************
*									 *
* File:		myddas_errors.yap					 *
* Last rev:								 *
* mods:									 *
* comments:	MYDDAS errors checks and errors Messages                 *
*									 *
*************************************************************************/

:- module(myddas_errors,[
			 '$error_checks'/1
			 ]).

:- use_module(myddas_util_predicates,[
				      '$make_a_list'/2,
				      '$check_fields'/2,
				      '$check_list_on_list'/2
				      ]).

'$error_checks'(db_abolish(ModulePredName,Arity)):-!,
	(ModulePredName = Module:PredName ->
	    atom(Module),
	    atom(PredName)
	;
	    atom(ModulePredName)
	),
	number(Arity).
'$error_checks'(db_show_databases(Connection)):- !,
	atom(Connection).
'$error_checks'(db_show_database(Connection,_)):- !,
	atom(Connection).
'$error_checks'(db_my_sql_mode(Connection,_)):- !,
	atom(Connection).
'$error_checks'(db_change_database(Connection,Database)):- !,
	atom(Connection),
	atom(Database).
'$error_checks'(db_prolog_select_multi(Connection,DbGoalsList,_)):- !,
	atom(Connection),
	is_list(DbGoalsList).
'$error_checks'(db_multi_queries_number(Connection,Number)):-!,
        atom(Connection),
	( var(Number) ->
	    true
	;
	    number(Number),
	    Number > 0
	).
'$error_checks'(db_command(Connection,SQL)):-!,
        atom(Connection),
        nonvar(SQL).
#ifdef MYDDAS_STATS
'$error_checks'(db_stats(_,List)):-!,
	var(List).
'$error_checks'(db_stats_time(Reference,Time)):-!,
	number(Reference),
	var(Time).
#endif
'$error_checks'(db_export_view(Connection,TableViewName,SQLorDbGoal,FieldsInf)):-!,
        atom(Connection),
	( atom(TableViewName) -> atom(SQLorDbGoal) ; true ),
        ( atom(SQLorDbGoal) -> atom(TableViewName) ; true ),
	is_list(FieldsInf).
'$error_checks'(db_create_table(Connection,TableName,FieldsInf)):-!,
        atom(Connection),
	atom(TableName),
	FieldsInf = [_|_].
'$error_checks'(db_insert3(Connection,RelationName,PredName)):-!,
        atom(Connection),
	atom(RelationName),
	atom(PredName).
'$error_checks'(db_insert2(Connection,_,[query(Att,[rel(Relation,_)],_)])) :- !,
        atom(Connection), 
	get_value(Connection,Con),
	% Number of fields of the Relation, must be
        % equal to the number of attributes
	c_db_connection_type(Con,ConType),
	( ConType == mysql ->
	    c_db_my_number_of_fields(Relation,Con,Arity)
	;
	    c_db_odbc_number_of_fields(Relation,Con,Arity)
	),
	length(Att,Arity),
	% All fields must be Instanciated ( FALTA POR O NULL )
	'$make_a_list'(Arity,FieldsProperties),
	( ConType == mysql ->
	    c_db_my_get_fields_properties(Relation,Con,FieldsProperties)
	;
	    c_db_odbc_get_fields_properties(Relation,Con,FieldsProperties)
	),
	'$check_fields'(Att,FieldsProperties).
'$error_checks'(db_open(mysql,Connection,Host/Db/Port/_,User,Password)) :- !,
	nonvar(Host), % ==  \+var(Host)
	nonvar(User),
	nonvar(Password),
	nonvar(Db),
	integer(Port),
	atom(Connection),
	get_value(Connection,[]).  % Nao pode ter nenhum valor atribuido
'$error_checks'(db_open(odbc,Connection,ODBCEntry,User,Password)) :- !,
	nonvar(ODBCEntry), % ==  \+var(ODBCEntry)
	nonvar(User),
	nonvar(Password),
	atom(Connection),
	get_value(Connection,[]).  % Nao pode ter nenhum valor atribuido
'$error_checks'(db_view(Connection,Pred,DbGoal)) :- !,
        atom(Connection),
        nonvar(DbGoal),
	nonvar(Pred),
	nonvar(DbGoal),
	Pred =.. [_|_],
	DbGoal =.. [_|_].
	%'$check_list_on_list'(PredArgs,DbGoalArgs).
'$error_checks'(db_import(Connection,RelationName,PredName)) :- !,
        atom(Connection),
        atom(RelationName),
	atom(PredName).
'$error_checks'(db_get_attributes_types(Connection,RelationName,_)) :- !,
        atom(Connection),
	nonvar(RelationName).
'$error_checks'(db_call_procedure(_,Procedure,Args,LA)) :- !,
	nonvar(Procedure),
	ground(Args),
	not ground(LA).
'$error_checks'(db_sql(Connection,SQL,LA)):- !,
        atom(Connection),
        nonvar(SQL),
	not ground(LA).
'$error_checks'(db_number_of_fields(Connection,RelationName,_)) :- !,
        atom(Connection),
	nonvar(RelationName).
'$error_checks'(db_close(Connection)) :- !,
        atom(Connection).
% must have only one relation
'$error_checks'(db_datalog_describe(Relation,_)) :- !,
	nonvar(Relation).
'$error_checks'(db_describe(Connection,Relation,_)) :- !,
	atom(Connection),
	nonvar(Relation).
'$error_checks'(db_my_show_tables(_)):- !.
'$error_checks'(db_is_database_predicate(PredName,Arity,Module)):-!,
        nonvar(PredName),
	nonvar(Arity),
	nonvar(Module).
% Prevent the error of given an atom that has no value
'$error_checks'(get_value(Connection,Con)) :- !,
	% This also prevents the case of giving the number of the connection
	% as an argument
	atom(Connection),
	var(Con),
	get_value(Connection,Value),
	Value \== [].

% Prevent the error of given an atom that has no value
'$error_checks'(get_value(Conn,Connection)) :- !,
	% This also prevents the case of giving the number of the connection
	% as an argument
	atom(Conn),
	var(Connection),
	get_value(Conn,Value),
	Value \== [].
