This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/myddas/pl/myddas_assert_predicates.ypp

422 lines
13 KiB
Plaintext
Raw Normal View History

/*************************************************************************
* *
2015-02-14 11:35:07 +00:00
* YAP Prolog *
* *
2015-02-14 11:35:07 +00:00
* 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,
c_db_connection_type/2
]).
:- 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
]).
2015-02-14 11:35:07 +00:00
:- use_module(myddas_sqlite3,[
sqlite3_result_set/1,
c_sqlite3_change_database/2,
c_sqlite3_connect/4,
c_sqlite3_disconnect/1,
c_sqlite3_get_attributes_types/3,
c_sqlite3_get_database/2,
c_sqlite3_get_fields_properties/3,
c_sqlite3_get_next_result_set/3,
c_sqlite3_query/5,
c_sqlite3_number_of_fields/3,
2017-11-18 00:04:42 +00:00
sqlite3_row/3
]).
:- use_module(myddas_odbc,[
odbc_result_set/1,
c_odbc_change_database/2,
c_odbc_connect/4,
c_odbc_disconnect/1,
c_odbc_get_attributes_types/3,
c_odbc_get_database/2,
c_odbc_get_fields_properties/3,
c_odbc_get_next_result_set/3,
c_odbc_query/5,
c_odbc_number_of_fields/3,
c_odbc_row/3
2015-02-14 11:35:07 +00:00
]).
2018-06-27 23:49:42 +01:00
:- use_module( library(lists)).
:- meta_predicate db_import(+,+,:), db_import(+,:).
2015-02-14 11:35:07 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_import/3
% db_import/2
%
db_import(RelationName,PredName):-
db_import(myddas,RelationName,PredName).
db_import(Connection,RelationName,PredName0) :-
'$error_checks'(db_import(Connection,RelationName,PredName0)),
2017-11-18 00:04:42 +00:00
get_value(Connection,Con),
2015-02-14 11:35:07 +00:00
table_arity( Con, ConType, RelationName, Arity ),
strip_module(PredName0, Module, PredName),
2018-11-25 13:27:48 +00:00
\+ c_db_check_if_exists_pred(PredName,Arity,Module),
R=..[relation,PredName,Arity,RelationName],
% assert relation fact
2018-07-02 16:48:00 +01:00
assert(Module:R),
2017-11-18 00:04:42 +00:00
Size is 2*Arity,
2015-02-14 11:35:07 +00:00
length(TypesList, Size),
% get attributes types in TypesList [field0,type0,field1,type1...]
2015-02-14 11:35:07 +00:00
table_attributes( ConType, Con, RelationName, TypesList ),
2017-11-18 00:04:42 +00:00
% assert attributes facts
'$assert_attribute_information'(0,Arity,RelationName,TypesList),
% build PredName functor
functor(P,PredName,Arity),
P=..[PredName|LA],
%build PredName clause
2018-11-08 02:33:36 +00:00
table_access_predicate( ConType, Con, Arity, P, LA, Module, Assert ),
2018-07-02 16:48:00 +01:00
assert_static(Module:Assert),
c_db_add_preds(PredName,Arity,Module,Con).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2018-07-02 16:48:00 +01:00
:- meta_predicate db_view(:,0).
:- meta_predicate db_view(+,:,0).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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),
2017-11-18 00:04:42 +00:00
% 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
2015-02-14 11:35:07 +00:00
table_view( ConType, Con, CopyView, CopyGoal, Arity, LA, M, Assert ),
assert(Module:Assert),
c_db_add_preds(ViewName,Arity,Module,Con).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2018-11-08 02:33:36 +00:00
% @pred 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
2015-02-14 11:35:07 +00:00
table_arity( Con, ConType, RelationName, 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],
2017-11-18 00:04:42 +00:00
Size is 2*Arity,
'$make_a_list'(Size,TypesList),
% get attributes types in TypesList [field0,type0,field1,type1...]
% and build PredName clause
2015-02-14 11:35:07 +00:00
table_insert( ConType, Con, RelationName, TypesList, Predicate, LA, Assert ),
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),
2018-07-31 22:13:30 +01:00
user:c_db_preds_conn(Con,Module,Name,Arity),
listing(Module:Name/Arity),
fail.
db_listing.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2018-11-08 02:33:36 +00:00
%% @pred db_listing(+PredIndicator)
%%
%% describe a table's data.
db_listing(Module:Name/Arity):-!,
c_db_connection(Con),
2018-07-31 22:13:30 +01:00
user:c_db_preds_conn(Con,Module,Name,Arity),
listing(Module:Name/Arity).
db_listing(Name/Arity):-!,
c_db_connection(Con),
2018-07-31 22:13:30 +01:00
user:c_db_preds_conn(Con,Module,Name,Arity),
listing(Module:Name/Arity).
db_listing(Name):-
c_db_connection(Con),
2018-07-31 22:13:30 +01:00
user:c_db_preds_conn(Con,Module,Name,Arity),
listing(Module:Name/Arity).
2015-02-14 11:35:07 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% table_arity :- number of columns in a relation.
2018-11-08 02:33:36 +00:00
% %
2015-02-14 11:35:07 +00:00
table_arity( Con, ConType, RelationName, Arity ) :-
c_db_connection_type(Con,ConType),
% get relation arity
( ConType == mysql ->
c_db_my_number_of_fields(RelationName,Con,Arity)
;
2015-02-16 11:44:37 +00:00
ConType == postgres ->
2018-11-23 00:01:55 +00:00
c_postgres_number_of_fields(RelationName,Con,Arity)
2015-02-14 11:35:07 +00:00
;
2015-02-16 11:44:37 +00:00
ConType == odbc ->
c_odbc_number_of_fields(RelationName,Con,Arity)
2015-02-16 11:44:37 +00:00
;
2015-02-14 11:35:07 +00:00
c_sqlite3_number_of_fields(RelationName,Con,Arity))
.
2018-11-08 02:33:36 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2015-02-14 11:35:07 +00:00
% major attributes types.
table_attributes( mysql, Con, RelationName, TypesList ) :-
c_db_my_get_attributes_types(RelationName,Con,TypesList).
2015-02-16 11:44:37 +00:00
table_attributes( postgres, Con, RelationName, TypesList ) :-
c_postgres_get_attributes_types(RelationName,Con,TypesList).
2015-02-14 11:35:07 +00:00
table_attributes( odbc, Con, RelationName, TypesList ) :-
c_odbc_get_attributes_types(RelationName,Con,TypesList).
2015-02-14 11:35:07 +00:00
table_attributes( sqlite3, Con, RelationName, TypesList ) :-
c_sqlite3_get_attributes_types(RelationName,Con,TypesList).
% predicate for DB-> query
2018-07-02 16:48:00 +01:00
2015-02-14 11:35:07 +00:00
table_access_predicate( mysql, Con, Arity, P, LA, M,
2018-11-08 02:33:36 +00:00
M:( P :- myddas_util_predicates:'$copy_term_nv'(P,[],G,_),
2018-07-03 00:08:19 +01:00
myddas_prolog2sql:translate(G,G,Code),
2018-11-08 02:33:36 +00:00
user:queries_atom(Code,FinalSQL),
2015-02-14 11:35:07 +00:00
db_my_result_set(Mode),
2018-07-03 00:08:19 +01:00
myddas_util_predicates:'$write_or_not'(FinalSQL),
2018-11-08 02:33:36 +00:00
user:c_db_my_query(FinalSQL,ResultSet,Con,Mode,_),
2015-02-14 11:35:07 +00:00
!,
2018-11-08 02:33:36 +00:00
user:c_db_my_row(ResultSet,Arity,LA)
)).
table_access_predicate( postgres, Con, Arity, P, LA, M,
M:( P :- myddas_util_predicates:'$copy_term_nv'(P,[],G,_),
myddas_prolog2sql:translate(M:G,M:G,Code),
myddas_prolog2sql:queries_atom(Code,FinalSQL),
myddas_postgres:postgres_result_set(Mode),
myddas_util_predicates:'$write_or_not'(FinalSQL),
c_postgres_query(FinalSQL,ResultSet,Con,Mode,_),
!,
c_postgres_row(ResultSet,Arity,LA) )
).
2015-02-16 11:44:37 +00:00
2015-02-14 11:35:07 +00:00
table_access_predicate( sqlite3, Con, Arity, P, LA, M,
2018-11-08 02:33:36 +00:00
M:( P :- (myddas_util_predicates:'$copy_term_nv'(P,[],G,_),
2018-07-03 00:08:19 +01:00
myddas_prolog2sql:translate(G,G,Code),
myddas_prolog2sql:queries_atom(Code,FinalSQL),
myddas_sqlite3:sqlite3_result_set(Mode),
myddas_util_predicates:'$write_or_not'(FinalSQL),
user:c_sqlite3_query(FinalSQL,ResultSet,Con,Mode,_),
2015-02-14 11:35:07 +00:00
!,
2018-07-03 00:08:19 +01:00
myddas_aqlite3:sqlite3_row(ResultSet,Arity,LA)
2015-02-14 11:35:07 +00:00
) )).
table_access_predicate( odbc, Con, Arity, P, LA, M,
2018-11-08 02:33:36 +00:00
M:( P :- (myddas_util_predicates:'$copy_term_nv'(P,[],G,_),
2018-07-03 00:08:19 +01:00
myddas_prolog2sql:translate(G,G,Code),
myddas_prolog2sql:queries_atom(Code,FinalSQL),
myddas_odbc:odbc_result_set(Mode),
'myddas_util_predicates:$write_or_not'(FinalSQL),
myddas_odbc:c_odbc_query(FinalSQL,ResultSet,Con,Mode,_),
2015-02-14 11:35:07 +00:00
!,
2018-07-03 00:08:19 +01:00
myddas_odbc:c_odbc_row(ResultSet,Arity,LA)
2015-02-14 11:35:07 +00:00
) )).
2018-11-08 02:33:36 +00:00
2015-02-14 11:35:07 +00:00
table_insert( mysql, Con, RelationName, TypesList, Predicate, LA,
( Predicate :- myddas_assert_predicates:
( '$get_values_for_insert'(TypesList,LA,ValuesList),
'$make_atom'(['INSERT INTO `',RelationName,'` VALUES ('|ValuesList],SQL),
db_my_result_set(Mode),
'$write_or_not'(SQL),
c_db_my_query(SQL,_,Con,Mode,_)))
).
2015-02-16 11:44:37 +00:00
table_insert( postgres, Con, RelationName, TypesList, Predicate, LA,
( Predicate :- myddas_assert_predicates:
( '$get_values_for_insert'(TypesList,LA,ValuesList),
'$make_atom'(['INSERT INTO `',RelationName,'` VALUES ('|ValuesList],SQL),
postgres_result_set(Mode),
'$write_or_not'(SQL),
c_postgres_query(SQL,_,Con,Mode,_)))
).
2015-02-14 11:35:07 +00:00
table_insert( sqlite3, Con, RelationName, TypesList, Predicate, LA,
( Predicate :- myddas_assert_predicates:
( '$get_values_for_insert'(TypesList,LA,ValuesList),
'$make_atom'(['INSERT INTO `',RelationName,'` VALUES ('|ValuesList],SQL),
sqlite3_result_set(Mode),
2015-02-14 11:35:07 +00:00
'$write_or_not'(SQL),
c_sqlite3_query(SQL,_,Con,Mode,_)))
).
2017-11-18 00:04:42 +00:00
2015-02-14 11:35:07 +00:00
table_insert( odbc, Con, RelationName, TypesList, Predicate, LA,
( Predicate :- myddas_assert_predicates:
( '$get_values_for_insert'(TypesList,LA,ValuesList),
'$make_atom'(['INSERT INTO `',RelationName,'` VALUES ('|ValuesList],SQL),
'$write_or_not'(SQL),
c_odbc_my_query(SQL,_,_,_,Con)))
).
table_view( mysql, Con, CopyView, CopyGoal, Arity, LA, M,
( CopyView :-
M:( '$copy_term_nv'(CopyView,[],ProjT,Dic),
'$copy_term_nv'(CopyGoal,Dic,NG,_),
translate(ProjT,NG,Code),
queries_atom(Code,FinalSQL),
db_my_result_set(Mode),
'$write_or_not'(FinalSQL),
c_db_my_query(FinalSQL,ResultSet,Con,Mode,_),
!,
c_db_my_row(ResultSet,Arity,LA) ))).
2015-02-16 11:44:37 +00:00
table_view( postgres, Con, CopyView, CopyGoal, Arity, LA, M,
( CopyView :-
M:( '$copy_term_nv'(CopyView,[],ProjT,Dic),
'$copy_term_nv'(CopyGoal,Dic,NG,_),
translate(ProjT,NG,Code),
queries_atom(Code,FinalSQL),
db_my_result_set(Mode),
'$write_or_not'(FinalSQL),
c_postgres_query(FinalSQL,ResultSet,Con,Mode,_),
!,
c_postgres_row(ResultSet,Arity,LA) ))).
2015-02-14 11:35:07 +00:00
table_view( odbc, Con, CopyView, CopyGoal, Arity, LA, M,
( CopyView :-
M:( '$copy_term_nv'(CopyView,[],ProjT,Dic),
'$copy_term_nv'(CopyGoal,Dic,NG,_),
translate(ProjT,NG,Code),
length(BindList, Arity ),
queries_atom(Code,FinalSQL),
'$write_or_not'(FinalSQL),
c_odbc_query(FinalSQL,ResultSet,Arity,BindList,Con),
2015-02-14 11:35:07 +00:00
!,
c_odbc_row(ResultSet,Arity,LA) ))).
2015-02-14 11:35:07 +00:00
table_view( sqlite3, Con, CopyView, CopyGoal, Arity, LA, M,
( CopyView :-
M:( '$copy_term_nv'(CopyView,[],ProjT,Dic),
'$copy_term_nv'(CopyGoal,Dic,NG,_),
translate(ProjT,NG,Code),
queries_atom(Code,FinalSQL),
'$write_or_not'(FinalSQL),
c_sqlite3_query(FinalSQL,ResultSet,Con,_,_),
!,
c_sqlite3_row(ResultSet,Arity,LA) ))).