git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1623 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
		
			
				
	
	
		
			294 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			294 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
/*************************************************************************
 | 
						|
*									 *
 | 
						|
*	 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_assert_predicates.yap	                         *
 | 
						|
* Last rev:							         *
 | 
						|
* mods:									 *
 | 
						|
* comments:	Predicates that assert other for the MyDDAS Interface	 *
 | 
						|
*									 *
 | 
						|
*************************************************************************/
 | 
						|
 | 
						|
:- module(myddas_assert_predicates,[
 | 
						|
				    db_import/2,
 | 
						|
				    db_import/3,
 | 
						|
				    db_view/2,
 | 
						|
				    db_view/3,
 | 
						|
				    db_insert/2,
 | 
						|
				    db_insert/3,
 | 
						|
				    db_abolish/2,
 | 
						|
				    db_listing/0,
 | 
						|
				    db_listing/1
 | 
						|
				   ]).
 | 
						|
 | 
						|
 | 
						|
:- use_module(myddas,[
 | 
						|
		      db_module/1
 | 
						|
		     ]).
 | 
						|
 | 
						|
:- use_module(myddas_errors,[
 | 
						|
			     '$error_checks'/1
 | 
						|
			     ]).
 | 
						|
 | 
						|
:- use_module(myddas_util_predicates,[
 | 
						|
				      '$get_values_for_insert'/3,
 | 
						|
				      '$make_atom'/2,
 | 
						|
				      '$write_or_not'/1,
 | 
						|
				      '$copy_term_nv'/4,
 | 
						|
				      '$assert_attribute_information'/4,
 | 
						|
				      '$make_a_list'/2,
 | 
						|
				      '$where_exists'/2,
 | 
						|
				      '$build_query'/5
 | 
						|
				      ]).
 | 
						|
 | 
						|
:- use_module(myddas_prolog2sql,[
 | 
						|
				 translate/3,
 | 
						|
				 queries_atom/2
 | 
						|
				]).
 | 
						|
:- use_module(myddas_mysql,[
 | 
						|
			    db_my_result_set/1
 | 
						|
			    ]).
 | 
						|
 | 
						|
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
% db_import/3
 | 
						|
% db_import/2
 | 
						|
%
 | 
						|
db_import(RelationName,PredName):-
 | 
						|
	db_import(myddas,RelationName,PredName).
 | 
						|
db_import(Connection,RelationName,PredName) :-
 | 
						|
	'$error_checks'(db_import(Connection,RelationName,PredName)),
 | 
						|
	get_value(Connection,Con),
 | 
						|
	c_db_connection_type(Con,ConType),
 | 
						|
		
 | 
						|
	% get relation arity
 | 
						|
        ( ConType == mysql ->
 | 
						|
	    c_db_my_number_of_fields(RelationName,Con,Arity)
 | 
						|
	;
 | 
						|
	    c_db_odbc_number_of_fields(RelationName,Con,Arity)
 | 
						|
	),
 | 
						|
	db_module(Module),
 | 
						|
	not c_db_check_if_exists_pred(PredName,Arity,Module),
 | 
						|
 | 
						|
	R=..[relation,PredName,Arity,RelationName],
 | 
						|
	% assert relation fact
 | 
						|
	assert(myddas_prolog2sql:R),
 | 
						|
	
 | 
						|
	Size is 2*Arity,
 | 
						|
        '$make_a_list'(Size,TypesList),
 | 
						|
	% get attributes types in TypesList [field0,type0,field1,type1...]
 | 
						|
	( ConType == mysql ->
 | 
						|
	    c_db_my_get_attributes_types(RelationName,Con,TypesList)
 | 
						|
	;
 | 
						|
	    c_db_odbc_get_attributes_types(RelationName,Con,TypesList)
 | 
						|
	),
 | 
						|
	
 | 
						|
	% assert attributes facts 
 | 
						|
        '$assert_attribute_information'(0,Arity,RelationName,TypesList),
 | 
						|
 | 
						|
	% build PredName functor
 | 
						|
	functor(P,PredName,Arity),
 | 
						|
	P=..[PredName|LA],
 | 
						|
 | 
						|
	M=myddas_assert_predicates,
 | 
						|
	%build PredName clause
 | 
						|
	( ConType == mysql ->
 | 
						|
 | 
						|
	    Assert =..[':-',P,','(M:'$copy_term_nv'(P,[],G,_),
 | 
						|
		              ','(M:translate(G,G,Code),
 | 
						|
		              ','(M:queries_atom(Code,FinalSQL),
 | 
						|
			      ','(M:db_my_result_set(Mode),
 | 
						|
			      ','(M:'$write_or_not'(FinalSQL),
 | 
						|
	                      ','(M:c_db_my_query(FinalSQL,ResultSet,Con,Mode,_),
 | 
						|
			      ','(!,M:c_db_my_row(ResultSet,Arity,LA))))))))]
 | 
						|
	    
 | 
						|
	    ;
 | 
						|
	    '$make_a_list'(Arity,BindList),
 | 
						|
	    Assert =..[':-',P,','(M:'$copy_term_nv'(P,[],G,_),
 | 
						|
			      ','(M:translate(G,G,Code),
 | 
						|
			      ','(M:queries_atom(Code,FinalSQL),
 | 
						|
			      ','(M:c_db_odbc_query(FinalSQL,ResultSet,Arity,BindList,Connection),
 | 
						|
		              ','(M:'$write_or_not'(FinalSQL),
 | 
						|
			      ','(!,M:c_db_odbc_row(ResultSet,BindList,LA)))))))]
 | 
						|
	    ),
 | 
						|
	
 | 
						|
	assert(Module:Assert),
 | 
						|
	c_db_add_preds(PredName,Arity,Module,Con).
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
 | 
						|
 | 
						|
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
% db_view/3
 | 
						|
% db_view/2
 | 
						|
%
 | 
						|
db_view(PredName,DbGoal) :-
 | 
						|
	db_view(myddas,PredName,DbGoal).
 | 
						|
db_view(Connection,PredName,DbGoal) :-
 | 
						|
	'$error_checks'(db_view(Connection,PredName,DbGoal)),
 | 
						|
	get_value(Connection,Con),
 | 
						|
		
 | 
						|
       	% get arity of projection term
 | 
						|
	functor(PredName,ViewName,Arity),
 | 
						|
	db_module(Module),
 | 
						|
	not c_db_check_if_exists_pred(ViewName,Arity,Module),
 | 
						|
 | 
						|
	% This copy_term is done to prevent the unification
 | 
						|
	% with top-level variables   A='var('A')' error
 | 
						|
	copy_term((PredName,DbGoal),(CopyView,CopyGoal)),
 | 
						|
 | 
						|
	CopyView=..[ViewName|LA],
 | 
						|
 | 
						|
	M=myddas_assert_predicates,
 | 
						|
	c_db_connection_type(Con,ConType),
 | 
						|
 | 
						|
	% build view clause
 | 
						|
	( ConType == mysql ->
 | 
						|
	    Assert =..[':-',CopyView,
 | 
						|
		       ','(M:'$copy_term_nv'(CopyView,[],ProjT,Dic),
 | 
						|
		       ','(M:'$copy_term_nv'(CopyGoal,Dic,NG,_),
 | 
						|
		       ','(M:translate(ProjT,NG,Code),
 | 
						|
		       ','(M:queries_atom(Code,FinalSQL),
 | 
						|
		       ','(M:db_my_result_set(Mode),
 | 
						|
		       ','(M:'$write_or_not'(FinalSQL),
 | 
						|
               	       ','(M:c_db_my_query(FinalSQL,ResultSet,Con,Mode,_),
 | 
						|
		       ','(!,M:c_db_my_row(ResultSet,Arity,LA)))))))))]
 | 
						|
	    ;
 | 
						|
	    % Assert =..[':-',NewName,
 | 
						|
% 		       ','(M:translate(CopyView,CopyGoal,Code),
 | 
						|
% 		       ','(M:queries_atom(Code,FinalSQL),
 | 
						|
% 	               ','(M:'$make_a_list'(Arity,BindList),
 | 
						|
% 		       ','(M:'$write_or_not'(FinalSQL),
 | 
						|
% 	      	       ','(M:c_db_odbc_query(FinalSQL,ResultSet,Arity,BindList,Con),
 | 
						|
% 		       ','(!,M:c_db_odbc_row(ResultSet,BindList,LA)))))))]
 | 
						|
	    true
 | 
						|
	    ),
 | 
						|
	assert(Module:Assert),
 | 
						|
	c_db_add_preds(ViewName,Arity,Module,Con).
 | 
						|
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
 | 
						|
 | 
						|
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
% db_insert/3
 | 
						|
%
 | 
						|
%
 | 
						|
db_insert(RelationName,PredName) :-
 | 
						|
	db_insert(myddas,RelationName,PredName).
 | 
						|
db_insert(Connection,RelationName,PredName) :-
 | 
						|
	'$error_checks'(db_insert3(Connection,RelationName,PredName)),
 | 
						|
	get_value(Connection,Con),
 | 
						|
	c_db_connection_type(Con,ConType),
 | 
						|
 | 
						|
	% get relation arity
 | 
						|
	( ConType == mysql ->
 | 
						|
	    c_db_my_number_of_fields(RelationName,Con,Arity)
 | 
						|
	;
 | 
						|
	    c_db_odbc_number_of_fields(RelationName,Con,Arity)
 | 
						|
	),
 | 
						|
	db_module(Module),
 | 
						|
	not c_db_check_if_exists_pred(PredName,Arity,Module),
 | 
						|
 | 
						|
	R=..[relation,PredName,Arity,RelationName],
 | 
						|
	% assert relation fact
 | 
						|
	assert(myddas_prolog2sql:R),
 | 
						|
 | 
						|
	% build PredName functor
 | 
						|
	functor(Predicate,PredName,Arity),
 | 
						|
	Predicate=..[PredName|LA],
 | 
						|
	
 | 
						|
	Size is 2*Arity,
 | 
						|
        '$make_a_list'(Size,TypesList),
 | 
						|
 | 
						|
	% get attributes types in TypesList [field0,type0,field1,type1...]
 | 
						|
	% and build PredName clause
 | 
						|
	( ConType == mysql ->
 | 
						|
	    c_db_my_get_attributes_types(RelationName,Con,TypesList),
 | 
						|
	    Assert =..[':-',Predicate,','(myddas_assert_predicates:'$get_values_for_insert'(TypesList,LA,ValuesList),
 | 
						|
					  ','(myddas_assert_predicates:'$make_atom'(['INSERT INTO `',RelationName,'` VALUES ('|ValuesList],SQL),
 | 
						|
					      ','(myddas_assert_predicates:db_my_result_set(Mode),
 | 
						|
						  ','(myddas_assert_predicates:'$write_or_not'(SQL),
 | 
						|
						      myddas_assert_predicates:c_db_my_query(SQL,_,Con,Mode,_)))))]
 | 
						|
	;
 | 
						|
	    c_db_odbc_get_attributes_types(RelationName,Con,TypesList),
 | 
						|
	    Assert =..[':-',Predicate,','(myddas_assert_predicates:'$get_values_for_insert'(TypesList,LA,ValuesList),
 | 
						|
					  ','(myddas_assert_predicates:'$make_atom'(['INSERT INTO `',RelationName,'` VALUES ('|ValuesList],SQL),
 | 
						|
					      ','(myddas_assert_predicates:'$write_or_not'(SQL),
 | 
						|
						  myddas_assert_predicates:c_db_odbc_query(SQL,_,_,_,Con))))]
 | 
						|
	),
 | 
						|
	assert(Module:Assert),
 | 
						|
	c_db_add_preds(PredName,Arity,Module,Con).
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
 | 
						|
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
% db_abolish(+,+)
 | 
						|
%
 | 
						|
%
 | 
						|
db_abolish(Module:PredName,Arity):-!,
 | 
						|
	'$error_checks'(db_abolish(Module:PredName,Arity)),
 | 
						|
	c_db_delete_predicate(Module,PredName,Arity),
 | 
						|
	abolish(Module:PredName,Arity).
 | 
						|
db_abolish(PredName,Arity):-
 | 
						|
	'$error_checks'(db_abolish(PredName,Arity)),
 | 
						|
	db_module(Module),
 | 
						|
	c_db_delete_predicate(Module,PredName,Arity),
 | 
						|
	abolish(Module:PredName,Arity).
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
 | 
						|
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
% db_abolish(+,+)
 | 
						|
%
 | 
						|
%
 | 
						|
db_abolish(Module:PredName,Arity):-!,
 | 
						|
	'$error_checks'(db_abolish(Module:PredName,Arity)),
 | 
						|
	c_db_delete_predicate(Module,PredName,Arity),
 | 
						|
	abolish(Module:PredName,Arity).
 | 
						|
db_abolish(PredName,Arity):-
 | 
						|
	'$error_checks'(db_abolish(PredName,Arity)),
 | 
						|
	db_module(Module),
 | 
						|
	c_db_delete_predicate(Module,PredName,Arity),
 | 
						|
	abolish(Module:PredName,Arity).
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
 | 
						|
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
% db_listing.
 | 
						|
%
 | 
						|
%
 | 
						|
db_listing:-
 | 
						|
	c_db_connection(Con),
 | 
						|
	c_db_preds_conn(Con,Module,Name,Arity),
 | 
						|
	listing(Module:Name/Arity),
 | 
						|
	fail.
 | 
						|
db_listing.
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
 | 
						|
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
% db_listing.
 | 
						|
%
 | 
						|
%
 | 
						|
db_listing(Module:Name/Arity):-!,
 | 
						|
	c_db_connection(Con),
 | 
						|
	c_db_preds_conn(Con,Module,Name,Arity),
 | 
						|
	listing(Module:Name/Arity).
 | 
						|
db_listing(Name/Arity):-!,
 | 
						|
	c_db_connection(Con),
 | 
						|
	c_db_preds_conn(Con,Module,Name,Arity),
 | 
						|
	listing(Module:Name/Arity).
 | 
						|
db_listing(Name):-
 | 
						|
	c_db_connection(Con),
 | 
						|
	c_db_preds_conn(Con,Module,Name,Arity),
 | 
						|
	listing(Module:Name/Arity).
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
 |