/************************************************************************* * * * 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 ]). :- 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, 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 ]). :- use_module( library(lists)). :- meta_predicate db_import(+,+,:), db_import(+,:). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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)), get_value(Connection,Con), table_arity( Con, ConType, RelationName, Arity ), strip_module(PredName0, Module, PredName), not c_db_check_if_exists_pred(PredName,Arity,Module), R=..[relation,PredName,Arity,RelationName], % assert relation fact assert(Module:R), Size is 2*Arity, length(TypesList, Size), % get attributes types in TypesList [field0,type0,field1,type1...] table_attributes( ConType, Con, RelationName, TypesList ), % assert attributes facts '$assert_attribute_information'(0,Arity,RelationName,TypesList), % build PredName functor functor(P,PredName,Arity), P=..[PredName|LA], %build PredName clause table_access_predicate( ConType, Con, Arity, P, LA, Module, Assert ), assert_static(Module:Assert), c_db_add_preds(PredName,Arity,Module,Con). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- 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), % 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 table_view( ConType, Con, CopyView, CopyGoal, Arity, LA, M, Assert ), assert(Module:Assert), c_db_add_preds(ViewName,Arity,Module,Con). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @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 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], Size is 2*Arity, '$make_a_list'(Size,TypesList), % get attributes types in TypesList [field0,type0,field1,type1...] % and build PredName clause 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), user:c_db_preds_conn(Con,Module,Name,Arity), listing(Module:Name/Arity), fail. db_listing. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% @pred db_listing(+PredIndicator) %% %% describe a table's data. db_listing(Module:Name/Arity):-!, c_db_connection(Con), user:c_db_preds_conn(Con,Module,Name,Arity), listing(Module:Name/Arity). db_listing(Name/Arity):-!, c_db_connection(Con), user:c_db_preds_conn(Con,Module,Name,Arity), listing(Module:Name/Arity). db_listing(Name):- c_db_connection(Con), user:c_db_preds_conn(Con,Module,Name,Arity), listing(Module:Name/Arity). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % table_arity :- number of columns in a relation. % % 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) ; ConType == postgres -> c_postgres_number_of_fields(RelationName,Con,Arit) ; ConType == odbc -> c_odbc_number_of_fields(RelationName,Con,Arity) ; c_sqlite3_number_of_fields(RelationName,Con,Arity)) . %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % major attributes types. table_attributes( mysql, Con, RelationName, TypesList ) :- c_db_my_get_attributes_types(RelationName,Con,TypesList). table_attributes( postgres, Con, RelationName, TypesList ) :- c_postgres_get_attributes_types(RelationName,Con,TypesList). table_attributes( odbc, Con, RelationName, TypesList ) :- c_odbc_get_attributes_types(RelationName,Con,TypesList). table_attributes( sqlite3, Con, RelationName, TypesList ) :- c_sqlite3_get_attributes_types(RelationName,Con,TypesList). % predicate for DB-> query table_access_predicate( mysql, Con, Arity, P, LA, M, M:( P :- myddas_util_predicates:'$copy_term_nv'(P,[],G,_), myddas_prolog2sql:translate(G,G,Code), user:queries_atom(Code,FinalSQL), db_my_result_set(Mode), myddas_util_predicates:'$write_or_not'(FinalSQL), user:c_db_my_query(FinalSQL,ResultSet,Con,Mode,_), !, 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) ) ). table_access_predicate( sqlite3, Con, Arity, P, LA, M, M:( P :- (myddas_util_predicates:'$copy_term_nv'(P,[],G,_), 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,_), !, myddas_aqlite3:sqlite3_row(ResultSet,Arity,LA) ) )). table_access_predicate( odbc, Con, Arity, P, LA, M, M:( P :- (myddas_util_predicates:'$copy_term_nv'(P,[],G,_), 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,_), !, myddas_odbc:c_odbc_row(ResultSet,Arity,LA) ) )). 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,_))) ). 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,_))) ). 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), '$write_or_not'(SQL), c_sqlite3_query(SQL,_,Con,Mode,_))) ). 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) ))). 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) ))). 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), !, c_odbc_row(ResultSet,Arity,LA) ))). 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) ))).