1/*************************************************************************
2*									 *
3*	 YAP Prolog 							 *
4*									 *
5*	Yap Prolog was developed at NCCUP - Universidade do Porto	 *
6*									 *
7* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 *
8*									 *
9**************************************************************************
10*									 *
11* File:		myddas_assert_predicates.yap	                         *
12* Last rev:							         *
13* mods:									 *
14* comments:	Predicates that assert other for the MyDDAS Interface	 *
15*									 *
16*************************************************************************/
17
18:- module(myddas_assert_predicates,[
19				    db_import/2,
20				    db_import/3,
21				    db_view/2,
22				    db_view/3,
23				    db_insert/2,
24				    db_insert/3,
25				    db_abolish/2,
26				    db_listing/0,
27				    db_listing/1
28				   ]).
29
30
31:- use_module(myddas,[
32		      db_module/1
33		     ]).
34
35:- use_module(myddas_errors,[
36			     '$error_checks'/1
37			     ]).
38
39:- use_module(myddas_util_predicates,[
40				      '$get_values_for_insert'/3,
41				      '$make_atom'/2,
42				      '$write_or_not'/1,
43				      '$copy_term_nv'/4,
44				      '$assert_attribute_information'/4,
45				      '$make_a_list'/2,
46				      '$where_exists'/2,
47				      '$build_query'/5
48				      ]).
49
50:- use_module(myddas_prolog2sql,[
51				 translate/3,
52				 queries_atom/2
53				]).
54:- use_module(myddas_mysql,[
55			    db_my_result_set/1
56			    ]).
57
58
59%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60% db_import/3
61% db_import/2
62%
63db_import(RelationName,PredName):-
64	db_import(myddas,RelationName,PredName).
65db_import(Connection,RelationName,PredName) :-
66	'$error_checks'(db_import(Connection,RelationName,PredName)),
67	get_value(Connection,Con),
68	c_db_connection_type(Con,ConType),
69
70	% get relation arity
71        ( ConType == mysql ->
72	    c_db_my_number_of_fields(RelationName,Con,Arity)
73	;
74	    c_db_odbc_number_of_fields(RelationName,Con,Arity)
75	),
76	db_module(Module),
77	not c_db_check_if_exists_pred(PredName,Arity,Module),
78
79	R=..[relation,PredName,Arity,RelationName],
80	% assert relation fact
81	assert(myddas_prolog2sql:R),
82
83	Size is 2*Arity,
84        '$make_a_list'(Size,TypesList),
85	% get attributes types in TypesList [field0,type0,field1,type1...]
86	( ConType == mysql ->
87	    c_db_my_get_attributes_types(RelationName,Con,TypesList)
88	;
89	    c_db_odbc_get_attributes_types(RelationName,Con,TypesList)
90	),
91
92	% assert attributes facts
93        '$assert_attribute_information'(0,Arity,RelationName,TypesList),
94
95	% build PredName functor
96	functor(P,PredName,Arity),
97	P=..[PredName|LA],
98
99	M=myddas_assert_predicates,
100	%build PredName clause
101	( ConType == mysql ->
102
103	    Assert =..[':-',P,','(M:'$copy_term_nv'(P,[],G,_),
104		              ','(M:translate(G,G,Code),
105		              ','(M:queries_atom(Code,FinalSQL),
106			      ','(M:db_my_result_set(Mode),
107			      ','(M:'$write_or_not'(FinalSQL),
108	                      ','(M:c_db_my_query(FinalSQL,ResultSet,Con,Mode,_),
109			      ','(!,M:c_db_my_row(ResultSet,Arity,LA))))))))]
110
111	    ;
112	    '$make_a_list'(Arity,BindList),
113	    Assert =..[':-',P,','(M:'$copy_term_nv'(P,[],G,_),
114			      ','(M:translate(G,G,Code),
115			      ','(M:queries_atom(Code,FinalSQL),
116			      ','(M:c_db_odbc_query(FinalSQL,ResultSet,Arity,BindList,Con),
117		              ','(M:'$write_or_not'(FinalSQL),
118			      ','(!,M:c_db_odbc_row(ResultSet,BindList,LA)))))))]
119	    ),
120
121	assert(Module:Assert),
122	c_db_add_preds(PredName,Arity,Module,Con).
123%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
124
125
126
127%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
128% db_view/3
129% db_view/2
130%
131db_view(PredName,DbGoal) :-
132	db_view(myddas,PredName,DbGoal).
133db_view(Connection,PredName,DbGoal) :-
134	'$error_checks'(db_view(Connection,PredName,DbGoal)),
135	get_value(Connection,Con),
136
137       	% get arity of projection term
138	functor(PredName,ViewName,Arity),
139	db_module(Module),
140	not c_db_check_if_exists_pred(ViewName,Arity,Module),
141
142	% This copy_term is done to prevent the unification
143	% with top-level variables   A='var('A')' error
144	copy_term((PredName,DbGoal),(CopyView,CopyGoal)),
145
146	CopyView=..[ViewName|LA],
147
148	M=myddas_assert_predicates,
149	c_db_connection_type(Con,ConType),
150
151	% build view clause
152	( ConType == mysql ->
153	    Assert =..[':-',CopyView,
154		       ','(M:'$copy_term_nv'(CopyView,[],ProjT,Dic),
155		       ','(M:'$copy_term_nv'(CopyGoal,Dic,NG,_),
156		       ','(M:translate(ProjT,NG,Code),
157		       ','(M:queries_atom(Code,FinalSQL),
158		       ','(M:db_my_result_set(Mode),
159		       ','(M:'$write_or_not'(FinalSQL),
160               	       ','(M:c_db_my_query(FinalSQL,ResultSet,Con,Mode,_),
161		       ','(!,M:c_db_my_row(ResultSet,Arity,LA)))))))))]
162	    ;
163	    % Assert =..[':-',NewName,
164% 		       ','(M:translate(CopyView,CopyGoal,Code),
165% 		       ','(M:queries_atom(Code,FinalSQL),
166% 	               ','(M:'$make_a_list'(Arity,BindList),
167% 		       ','(M:'$write_or_not'(FinalSQL),
168% 	      	       ','(M:c_db_odbc_query(FinalSQL,ResultSet,Arity,BindList,Con),
169% 		       ','(!,M:c_db_odbc_row(ResultSet,BindList,LA)))))))]
170	    true
171	    ),
172	assert(Module:Assert),
173	c_db_add_preds(ViewName,Arity,Module,Con).
174
175%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
176
177
178
179%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
180% db_insert/3
181%
182%
183db_insert(RelationName,PredName) :-
184	db_insert(myddas,RelationName,PredName).
185db_insert(Connection,RelationName,PredName) :-
186	'$error_checks'(db_insert3(Connection,RelationName,PredName)),
187	get_value(Connection,Con),
188	c_db_connection_type(Con,ConType),
189
190	% get relation arity
191	( ConType == mysql ->
192	    c_db_my_number_of_fields(RelationName,Con,Arity)
193	;
194	    c_db_odbc_number_of_fields(RelationName,Con,Arity)
195	),
196	db_module(Module),
197	not c_db_check_if_exists_pred(PredName,Arity,Module),
198
199	R=..[relation,PredName,Arity,RelationName],
200	% assert relation fact
201	assert(myddas_prolog2sql:R),
202
203	% build PredName functor
204	functor(Predicate,PredName,Arity),
205	Predicate=..[PredName|LA],
206
207	Size is 2*Arity,
208        '$make_a_list'(Size,TypesList),
209
210	% get attributes types in TypesList [field0,type0,field1,type1...]
211	% and build PredName clause
212	( ConType == mysql ->
213	    c_db_my_get_attributes_types(RelationName,Con,TypesList),
214	    Assert =..[':-',Predicate,','(myddas_assert_predicates:'$get_values_for_insert'(TypesList,LA,ValuesList),
215					  ','(myddas_assert_predicates:'$make_atom'(['INSERT INTO `',RelationName,'` VALUES ('|ValuesList],SQL),
216					      ','(myddas_assert_predicates:db_my_result_set(Mode),
217						  ','(myddas_assert_predicates:'$write_or_not'(SQL),
218						      myddas_assert_predicates:c_db_my_query(SQL,_,Con,Mode,_)))))]
219	;
220	    c_db_odbc_get_attributes_types(RelationName,Con,TypesList),
221	    Assert =..[':-',Predicate,','(myddas_assert_predicates:'$get_values_for_insert'(TypesList,LA,ValuesList),
222					  ','(myddas_assert_predicates:'$make_atom'(['INSERT INTO `',RelationName,'` VALUES ('|ValuesList],SQL),
223					      ','(myddas_assert_predicates:'$write_or_not'(SQL),
224						  myddas_assert_predicates:c_db_odbc_query(SQL,_,_,_,Con))))]
225	),
226	assert(Module:Assert),
227	c_db_add_preds(PredName,Arity,Module,Con).
228%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
229
230
231%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
232% db_abolish(+,+)
233%
234%
235db_abolish(Module:PredName,Arity):-!,
236	'$error_checks'(db_abolish(Module:PredName,Arity)),
237	c_db_delete_predicate(Module,PredName,Arity),
238	abolish(Module:PredName,Arity).
239db_abolish(PredName,Arity):-
240	'$error_checks'(db_abolish(PredName,Arity)),
241	db_module(Module),
242	c_db_delete_predicate(Module,PredName,Arity),
243	abolish(Module:PredName,Arity).
244%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
245
246
247%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
248% db_abolish(+,+)
249%
250%
251db_abolish(Module:PredName,Arity):-!,
252	'$error_checks'(db_abolish(Module:PredName,Arity)),
253	c_db_delete_predicate(Module,PredName,Arity),
254	abolish(Module:PredName,Arity).
255db_abolish(PredName,Arity):-
256	'$error_checks'(db_abolish(PredName,Arity)),
257	db_module(Module),
258	c_db_delete_predicate(Module,PredName,Arity),
259	abolish(Module:PredName,Arity).
260%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
261
262
263%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
264% db_listing.
265%
266%
267db_listing:-
268	c_db_connection(Con),
269	c_db_preds_conn(Con,Module,Name,Arity),
270	listing(Module:Name/Arity),
271	fail.
272db_listing.
273%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
274
275
276%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
277% db_listing.
278%
279%
280db_listing(Module:Name/Arity):-!,
281	c_db_connection(Con),
282	c_db_preds_conn(Con,Module,Name,Arity),
283	listing(Module:Name/Arity).
284db_listing(Name/Arity):-!,
285	c_db_connection(Con),
286	c_db_preds_conn(Con,Module,Name,Arity),
287	listing(Module:Name/Arity).
288db_listing(Name):-
289	c_db_connection(Con),
290	c_db_preds_conn(Con,Module,Name,Arity),
291	listing(Module:Name/Arity).
292%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
293
294