Revision on the MyDDAS Interface

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1481 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
tiagosoares 2005-12-19 13:41:15 +00:00
parent b52c6d333e
commit 4630006e9f
10 changed files with 749 additions and 548 deletions

View File

@ -124,7 +124,7 @@ HEADERS = \
$(srcdir)/OPTYap/alpha_locks_funcs.h \
$(srcdir)/OPTYap/pthread_locks.h \
$(srcdir)/H/cut_c.h \
$(srcdir)/MYDDAS/myddas_util.h
$(srcdir)/MYDDAS/myddas_util.h $(srcdir)/MYDDAS/myddas_structs.h
C_SOURCES= \
$(srcdir)/C/absmi.c $(srcdir)/C/adtdefs.c \

View File

@ -16,14 +16,123 @@
*************************************************************************/
:- module(myddas,[
db_open/5,
db_close/1,
db_verbose/1,
db_is_database_predicate/3,
db_module/1,
db_stats/2
db_is_database_predicate/3,
db_stats/2,
db_sql_select/3,
db_insert/2,
db_create_table/3,
db_export_view/4,
db_get_attributes_types/3,
db_number_of_fields/3,
% myddas_assert_predicates.yap
db_import/3,
db_view/3,
db_insert/3,
% myddas_mysql.yap
db_my_open/5,
db_my_close/1,
db_my_import/3,
db_my_view/3,
db_my_insert/2,
db_my_insert/3,
db_my_result_set/1,
db_my_describe/2,
db_my_describe/3,
db_my_show_tables/1,
db_my_show_tables/2,
db_my_sql_select/3,
db_my_number_of_fields/3,
db_my_get_attributes_types/3
]).
:- use_module(myddas_util_predicates).
:- use_module(myddas_errors).
:- use_module(myddas_assert_predicates,[
db_import/3,
db_view/3,
db_insert/3
]).
:- use_module(myddas_mysql,[
db_my_open/5,
db_my_close/1,
db_my_import/3,
db_my_view/3,
db_my_insert/2,
db_my_insert/3,
db_my_result_set/1,
db_my_describe/2,
db_my_describe/3,
db_my_show_tables/1,
db_my_show_tables/2,
db_my_sql_select/3,
db_my_number_of_fields/3,
db_my_get_attributes_types/3
]).
:- use_module(myddas_util_predicates,[
'$process_sql_goal'/4,
'$process_fields'/3,
'$get_values_for_insert'/3,
'$make_atom'/2,
'$write_or_not'/1,
'$abolish_all'/1,
'$make_a_list'/2
]).
:- use_module(myddas_errors,[
'$error_checks'/1
]).
:- use_module(myddas_prolog2sql,[
translate/3
]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_open/5
%
%
db_open(mysql,Connection,Host/Db,User,Password) :-!,
'$error_checks'(db_open(mysql,Connection,Host/Db,User,Password)),
c_db_my_connect(Host,User,Password,Db,Con),
set_value(Connection,Con).
db_open(odbc,Connection,ODBCEntry,User,Password) :-!,
'$error_checks'(db_open(odbc,Connection,ODBCEntry,User,Password)),
c_db_odbc_connect(ODBCEntry,User,Password,Con),
set_value(Connection,Con).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_close/1
%
%
db_close(Connection):-
'$error_checks'(db_close(Connection)),
get_value(Connection,Con),
'$abolish_all'(Con).
db_close(Connection) :-
'$error_checks'(db_close(Connection)),
get_value(Connection,Con),
c_db_connection_type(Con,ConType),
( ConType == mysql ->
c_db_my_disconnect(Con)
;
c_db_odbc_disconnect(Con)
),
set_value(Connection,[]). % "deletes" atom
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_verbose/1
@ -41,6 +150,19 @@ db_verbose(_):-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_module/1
%
%
db_module(X):-
var(X),!,
get_value(db_module,X).
db_module(ModuleName):-
set_value(db_module,ModuleName).
% default value
:- db_module(user).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_is_database_predicate/3
@ -52,29 +174,163 @@ db_is_database_predicate(PredName,Arity,Module):-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_module/1
%
%
db_module(X):-
var(X),!,
get_value(db_module,X).
db_module(ModuleName):-
set_value(db_module,ModuleName).
%default value
:- db_module(user).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_stats/2
%
%
:- set_value(db_myddas_stats_count,0).
db_stats(Connection,List):-
'$get_value'(Connection,Conn),
NumberOfStats = 2,
NumberOfStats = 6,
'$make_a_list'(NumberOfStats,List),
c_db_my_stats(Conn,List).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
( var(Connection) ->
c_db_stats(0,List)
;
get_value(Connection,Conn),
c_db_stats(Conn,List)
),
write('MYDDAS'),nl,write(List),nl,
get_value(db_myddas_stats_count,Value),
write(Value),nl.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_sql_select/3
%
%
db_sql_select(Connection,SQL,LA):-
'$error_checks'(db_sql_select(Connection,SQL,LA)),
get_value(Connection,Con),
c_db_connection_type(Con,ConType),
( ConType == mysql ->
c_db_my_number_of_fields_in_query(SQL,Con,Arity)
;
c_db_odbc_number_of_fields(SQL,Con,Arity)
),
'$make_a_list'(Arity,LA),
'$write_or_not'(SQL),
( ConType == mysql ->
db_my_result_set(Mode),
c_db_my_query(SQL,ResultSet,Con,Mode),!,
c_db_my_row(ResultSet,Arity,LA)
;
'$make_a_list'(Arity,BindList),
c_db_odbc_query(SQL,ResultSet,Arity,BindList,Con),!,
c_db_odbc_row(ResultSet,BindList,LA)
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_insert/2
%
%
db_insert(Connection,PredName):-
translate(PredName,PredName,Code),
'$error_checks'(db_insert2(Connection,PredName,Code)),
'$get_values_for_insert'(Code,ValuesList,RelName),
'$make_atom'(['INSERT INTO ',RelName,' VALUES'|ValuesList],SQL),
get_value(Connection,Con),
c_db_connection_type(Con,ConType),
'$write_or_not'(SQL),
( ConType == mysql ->
db_my_result_set(Mode),
c_db_my_query(SQL,_,Con,Mode)
;
c_db_odbc_query(SQL,_,_,_,Con)
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_create_table/3
% FieldsList = [field(Name,Type,Null,Key,DefaultValue)]
% Example [field(campo1,'char(12)',y,y,a),field(campo2,int,y,y,0)]
% TODO Test with ODBC & Type Checks
db_create_table(Connection,TableName,FieldsInf):-
'$error_checks'(db_create_table(Connection,TableName,FieldsInf)),
get_value(Connection,Con),
'$process_fields'(FieldsInf,FieldString,KeysSQL),
'$make_atom'(['CREATE TABLE `',TableName,'` ( ',FieldString,KeysSQL,' )'],FinalSQL),
c_db_connection_type(Con,ConType),
'$write_or_not'(FinalSQL),
( ConType == mysql ->
db_my_result_set(Mode),
c_db_my_query(FinalSQL,_,Con,Mode)
;
c_db_odbc_query(FinalSQL,_,_,_,Con)
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_export_view/4
% TODO Test with ODBC
%
db_export_view(Connection,TableViewName,SQLorDbGoal,FieldsInf):-
'$error_checks'(db_export_view(Connection,TableViewName,SQLorDbGoal,FieldsInf)),
get_value(Connection,Con),
'$process_sql_goal'(TableViewName,SQLorDbGoal,TableName,SQL),
% Case there's some information about the
% attribute fields of the relation given
% by the user
( FieldsInf == [] ->
'$make_atom'(['CREATE TABLE ',TableName,' AS ',SQL],FinalSQL)
;
'$process_fields'(FieldsInf,FieldString,KeysSQL),
'$make_atom'(['CREATE TABLE ',TableName,' (',FieldString,KeysSQL,') AS ',SQL],FinalSQL)
),
c_db_connection_type(Con,ConType),
'$write_or_not'(FinalSQL),
( ConType == mysql ->
db_my_result_set(Mode),
c_db_my_query(FinalSQL,_,Con,Mode)
;
c_db_odbc_query(FinalSQL,_,_,_,Con)
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_get_attributes_types/3
%
%
db_get_attributes_types(Connection,RelationName,TypesList) :-
'$error_checks'(db_get_attributes_types(Connection,RelationName,TypesList)),
get_value(Connection,Con),
c_db_connection_type(Con,ConType),
( ConType == mysql ->
c_db_my_number_of_fields(RelationName,Con,Arity)
;
c_db_odbc_number_of_fields(RelationName,Con,Arity)
),
Size is 2*Arity,
'$make_a_list'(Size,TypesList),
c_db_connection_type(Con,ConType),
( ConType == mysql ->
c_db_my_get_attributes_types(RelationName,Con,TypesList)
;
c_db_odbc_get_attributes_types(RelationName,Con,TypesList)
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_number_of_fields/3
%
%
db_number_of_fields(Connection,RelationName,Arity) :-
'$error_checks'(db_number_of_fields(Connection,RelationName,Arity)),
get_value(Connection,Con),
c_db_connection_type(Con,ConType),
( ConType == mysql ->
c_db_my_number_of_fields(RelationName,Con,Arity)
;
c_db_odbc_number_of_fields(RelationName,Con,Arity)
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View File

@ -0,0 +1,230 @@
/*************************************************************************
* *
* 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/3,
db_view/3,
db_insert/3
]).
:- 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,
'$make_list_of_args'/4,
'$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(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),
'$make_list_of_args'(1,Arity,P,LA),
%Optimization
'$copy_term_nv'(P,[],G,_),
%generate the SQL query
translate(G,G,Code),
queries_atom(Code,SQL),
%build PredName clause
( ConType == mysql ->
Assert =..[':-',P,','(myddas_assert_predicates:'$build_query'(0,SQL,Code,LA,FinalSQL),
','(myddas_assert_predicates:db_my_result_set(Mode),
','(myddas_assert_predicates:'$write_or_not'(FinalSQL),
','(myddas_assert_predicates:c_db_my_query(FinalSQL,ResultSet,Con,Mode),
','(!,myddas_assert_predicates:c_db_my_row(ResultSet,Arity,LA))))))]
% Assert =..[':-',P,','(get_value(db_myddas_stats_count,Number),
% ','(statistics(cputime,TimeI),
% ','(myddas_assert_predicates:'$build_query'(0,SQL,Code,LA,FinalSQL),
% ','(myddas_assert_predicates:db_my_result_set(Mode),
% ','(myddas_assert_predicates:'$write_or_not'(FinalSQL),
% ','(myddas_assert_predicates:c_db_my_query(FinalSQL,ResultSet,Con,Mode),
% ','(statistics(cputime,TimeF),
% ','(Temp is TimeF - TimeI,
% ','(Temp2 is Temp + Number,
% ','(set_value(db_myddas_stats_count,Temp2),
% ','(!,myddas_assert_predicates:c_db_my_row(ResultSet,Arity,LA))))))))))))]
;
Assert =..[':-',P,','(myddas_assert_predicates:'$build_query'(0,SQL,Code,LA,FinalSQL),
','(myddas_assert_predicates:'$make_a_list'(Arity,BindList),
','(myddas_assert_predicates:c_db_odbc_query(FinalSQL,ResultSet,Arity,BindList,Connection),
','(myddas_assert_predicates:'$write_or_not'(FinalSQL),
','(!,myddas_assert_predicates:c_db_odbc_row(ResultSet,BindList,LA))))))]
),
assert(Module:Assert),
c_db_add_preds(PredName,Arity,Module,Con).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_view/3
%
%
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),
functor(NewName,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)),
translate(CopyView,CopyGoal,Code),
queries_atom(Code,SQL),
% checks if the WHERE commend of SQL exists in the string
'$where_exists'(SQL,Flag),
'$make_list_of_args'(1,Arity,NewName,LA),
c_db_connection_type(Con,ConType),
% build view clause
( ConType == mysql ->
Assert =..[':-',NewName,
','(myddas_assert_predicates:'$build_query'(Flag,SQL,Code,LA,FinalSQL),
','(myddas_assert_predicates:db_my_result_set(Mode),
','(myddas_assert_predicates:'$write_or_not'(FinalSQL),
','(myddas_assert_predicates:c_db_my_query(FinalSQL,ResultSet,Con,Mode),
','(!,myddas_assert_predicates:c_db_my_row(ResultSet,Arity,LA))))))]
;
Assert =..[':-',NewName,
','(myddas_assert_predicates:'$build_query'(Flag,SQL,Code,LA,FinalSQL),
','(myddas_assert_predicates:'$make_a_list'(Arity,BindList),
','(myddas_assert_predicates:'$write_or_not'(FinalSQL),
','(myddas_assert_predicates:c_db_odbc_query(FinalSQL,ResultSet,Arity,BindList,Con),
','(!,myddas_assert_predicates:c_db_odbc_row(ResultSet,BindList,LA))))))]
),
assert(Module:Assert),
c_db_add_preds(ViewName,Arity,Module,Con).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_insert/3
%
%
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),
'$make_list_of_args'(1,Arity,Predicate,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).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View File

@ -16,98 +16,101 @@
*************************************************************************/
:- module(myddas_errors,[
'$error_checks'/1,
'$db_my_error'/2
'$error_checks'/1
]).
:- use_module(myddas_util_predicates).
:- use_module(myddas_util_predicates,[
'$make_a_list'/2,
'$check_fields'/2
]).
% must have only one relation
'$error_checks'(db_my_insert3(_,_,_)):-!.
'$error_checks'(db_my_insert2(_,Conn,[query(Att,[rel(Relation,_)],_)])) :- !,
:- use_module(lists,[
is_list/1
]).
'$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_my_number_of_fields(Relation,Conn,Arity),
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),
c_db_my_get_fields_properties(Relation,Conn,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'(Preddb_Call):-
%'$do_error'(db_my_error(incompatible_db_predicate,PredCall)).
'$error_checks'(db_my_open(Host,User,Password,Db,Conn)) :- !,
'$error_checks'(db_open(mysql,Connection,Host/Db,User,Password)) :- !,
nonvar(Host), % == \+var(Host)
nonvar(User),
nonvar(Password),
nonvar(Db),
atom(Conn),
get_value(Conn,[]). % Nao pode ter nenhum valor atribuido
'$error_checks'(db_my_close(_)) :- !.
'$error_checks'(db_my_import(RelationName,PredName,_)) :- !,
nonvar(RelationName),
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,PredName,DbGoal)) :- !,
atom(Connection),
nonvar(DbGoal),
nonvar(PredName).
'$error_checks'(db_my_view(PredName,DbGoal,_)) :- !,
nonvar(DbGoal),
nonvar(PredName).
'$error_checks'(db_my_number_of_fields(RelationName,_,_)) :- !,
'$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_my_get_attributes_types(RelationName,_,_)) :- !,
'$error_checks'(db_sql_select(Connection,SQL,LA)):- !,
atom(Connection),
nonvar(SQL),
var(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_my_describe(Relation,_)) :- !,
nonvar(Relation).
'$error_checks'(db_my_show_tables(_)):- !.
'$error_checks'(db_my_sql_select(_,SQL,LA)):- !,
nonvar(SQL),
var(LA).
'$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(Conn,Connection)) :- !,
'$error_checks'(get_value(Connection,Con)) :- !,
% This also prevents the case of giving the number of the connection
% as an argument
atom(Conn),
var(Connection),
get_value(Conn,Value),
atom(Connection),
var(Con),
get_value(Connection,Value),
Value \== [].
% must have only one relation
%'$error_checks'(db_insert(_,_,_)):-!.
'$error_checks'(db_odbc_insert3(_,_,_)):-!.
'$error_checks'(db_odbc_insert2(PredName,Conn,[query(Att,[rel(Relation,_)],_)])) :- !,
% Number of fields of the Relation, must be
% equal to the number of attributes
c_db_odbc_number_of_fields(Relation,Conn,Arity),
length(Att,Arity),
% All fields must be Instanciated ( FALTA POR O NULL )
'$make_a_list'(Arity,FieldsProperties),
c_db_odbc_get_fields_properties(Relation,Conn,FieldsProperties),
'$check_fields'(Att,FieldsProperties).
%'$error_checks'(PredCall):-
%'$do_error'(db_error(incompatible_db_predicate,PredCall)).
'$error_checks'(db_odbc_open(Host,User,Password,Conn)) :- !,
nonvar(Host), % == \+var(Host)
nonvar(User),
nonvar(Password),
atom(Conn),
get_value(Conn,[]). % Nao pode ter nenhum valor atribuido
'$error_checks'(db_odbc_close(_)) :- !.
'$error_checks'(db_odbc_import(RelationName,PredName,_)) :- !,
nonvar(RelationName),
nonvar(PredName).
'$error_checks'(db_odbc_view(PredName,DbGoal,Connection)) :- !,
nonvar(DbGoal),
nonvar(PredName).
'$error_checks'(db_odbc_number_of_fields(RelationName,Connection,Arity)) :- !,
nonvar(RelationName).
'$error_checks'(db_odbc_get_attributes_types(RelationName,Connection,TypesList)) :- !,
nonvar(RelationName).
'$error_checks'(db_odbc_sql_select(Connection,SQL,LA)):- !,
nonvar(SQL),
var(LA).
% 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
@ -116,9 +119,3 @@
var(Connection),
get_value(Conn,Value),
Value \== [].
'$db_my_error'(ERROR,_):-var(ERROR),!.
'$db_my_error'(2005,c_db_my_connect(Host,User,Password,Db,Connection)):-!,
write(Host),nl.

View File

@ -11,7 +11,7 @@
* File: myddas_mysql.yap *
* Last rev: *
* mods: *
* comments: MySQL Server communication library *
* comments: MySQL Predicates *
* *
*************************************************************************/
@ -30,16 +30,19 @@
db_my_sql_select/3,
db_my_number_of_fields/3,
db_my_get_attributes_types/3
]).
]).
:- use_module(myddas_errors,[
'$error_checks'/1
]).
:- use_module(myddas).
:- use_module(myddas_errors).
:- use_module(myddas_prolog2sql,[translate/3,queries_atom/2]).
:- use_module(myddas_util_predicates).
:- use_module(myddas_util_predicates,[
'$get_value'/2,
'$make_atom'/2,
'$write_or_not'/1
]).
:- use_module(lists,[append/3]).
%--------------------------------------------------------
% Public Predicates
@ -49,11 +52,10 @@
% db_my_open/5
%
%
db_my_open(Host,User,Password,Db,Conn) :-
'$error_checks'(db_my_open(Host,User,Password,Db,Conn)),
c_db_my_connect(Host,User,Password,Db,Connection),
%'$db_my_error'(ERROR,c_db_my_connect(Host,User,Password,Db,Connection)),
set_value(Conn,Connection).
db_my_open(_,_,_,_,_) :-
write('WARNING!! Now we use db_open/5'),nl,
write('USAGE: db_open(ConType,Connection,Host/Db,User,Password).'),nl,
halt.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -62,14 +64,10 @@ db_my_open(Host,User,Password,Db,Conn) :-
% db_my_close/1
%
%
db_my_close(Conn):-
'$error_checks'(db_my_close(Conn)),
'$abolish_all'(Conn).
db_my_close(Conn) :-
'$error_checks'(db_my_close(Conn)),
'$get_value'(Conn,Connection),
c_db_my_disconnect(Connection),
set_value(Conn,[]). % "deletes" atom
db_my_close(_):-
write('WARNING!! Now we use db_close/1'),nl,
write('USAGE: db_close(Connection).'),nl,
halt.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -79,10 +77,10 @@ db_my_close(Conn) :-
% db_my_import/3
%
%
db_my_import(RelationName,PredName,Connection) :-
'$error_checks'(db_my_import(RelationName,PredName,Connection)),
'$get_value'(Connection,Conn),
'$assert_import_clause'(RelationName,PredName,Conn).
db_my_import(_,_,_) :-
write('WARNING!! Now we use db_import/3'),nl,
write('USAGE: db_import(Connection,RelationName,PredName).'),nl,
halt.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -91,10 +89,10 @@ db_my_import(RelationName,PredName,Connection) :-
% db_my_view/3
%
%
db_my_view(PredName,DbGoal,Connection) :-
'$error_checks'(db_my_view(PredName,DbGoal,Connection)),
'$get_value'(Connection,Conn),
'$assert_view_clause'(PredName,DbGoal,Conn).
db_my_view(_,_,_) :-
write('WARNING!! Now we use db_view/3'),nl,
write('USAGE: db_import(Connection,RelationName,DBGoal).'),nl,
halt.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -103,14 +101,10 @@ db_my_view(PredName,DbGoal,Connection) :-
% db_my_insert/2
%
%
db_my_insert(PredName,Connection):-
'$get_value'(Connection,Conn),
translate(PredName,PredName,Code),
'$error_checks'(db_my_insert2(PredName,Conn,Code)),
'$get_values_for_insert'(Code,ValuesList,RelName),
'$make_atom'(['INSERT INTO ',RelName,' VALUES'|ValuesList],SQL),
db_my_result_set(Mode),
c_db_my_query(SQL,_,Conn,Mode).
db_my_insert(_,_):-
write('WARNING!! Now we use db_insert/2'),nl,
write('USAGE: db_insert(Connection,PredName).'),nl,
halt.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -119,10 +113,10 @@ db_my_insert(PredName,Connection):-
% db_my_insert/3
%
%
db_my_insert(RelationName,PredName,Connection) :-
'$get_value'(Connection,Conn),
'$error_checks'(db_my_insert3(RelationName,PredName,Connection)),
'$assert_relation_insert'(RelationName,PredName,Conn).
db_my_insert(_,_,_) :-
write('WARNING!! Now we use db_insert/3'),nl,
write('USAGE: db_insert(Connection,RelationName,PredName).'),nl,
halt.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -209,15 +203,10 @@ db_my_show_tables(Connection,table(Table)) :-
% db_my_sql_select/3
%
%
db_my_sql_select(Connection,SQL,LA):-
'$error_checks'(db_my_sql_select(Connection,SQL,LA)),
'$get_value'(Connection,Conn),
c_db_my_number_of_fields_in_query(SQL,Conn,Arity),
'$make_a_list'(Arity,LA),
db_my_result_set(Mode),
'$write_or_not'(SQL),!,
c_db_my_query(SQL,ResultSet,Conn,Mode),
c_db_my_row(ResultSet,Arity,LA).
db_my_sql_select(_,_,_):-
write('WARNING!! Now we use db_sql_select/3'),nl,
write('USAGE: db_sql_select(Connection,SQL,ListaArgs).'),nl,
halt.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -226,10 +215,10 @@ db_my_sql_select(Connection,SQL,LA):-
% db_my_number_of_fields/3
%
%
db_my_number_of_fields(RelationName,Connection,Arity) :-
'$error_checks'(db_my_number_of_fields(RelationName,Connection,Arity)),
'$get_value'(Connection,Conn),
c_db_my_number_of_fields(RelationName,Conn,Arity).
db_my_number_of_fields(_,_,_) :-
write('WARNING!! Now we use db_number_of_fields/3'),nl,
write('USAGE: db_number_of_fields(Connection,RelationName,Arity).'),nl,
halt.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -238,113 +227,8 @@ db_my_number_of_fields(RelationName,Connection,Arity) :-
% db_my_get_attributes_types/3
%
%
db_my_get_attributes_types(RelationName,Connection,TypesList) :-
'$error_checks'(db_my_get_attributes_types(RelationName,Connection,TypesList)),
'$get_value'(Connection,Conn),
c_db_my_number_of_fields(RelationName,Conn,Arity),
Size is 2*Arity,
'$make_a_list'(Size,TypesList),
c_db_my_get_attributes_types(RelationName,Conn,TypesList).
db_my_get_attributes_types(_,_,_) :-
write('WARNING!! Now we use db_get_attributes_types/3'),nl,
write('USAGE: db_get_attributes_types(Connection,RelationName,TypesList).'),nl,
halt.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%--------------------------------------------------------
% Private Predicates
%--------------------------------------------------------
'$assert_view_clause'(ViewName,DbGoal,Connection) :-
% here we can add some error control, like checking DBgoals include
% only DB relations
% get arity of projection term
functor(ViewName,PredName,Arity),
functor(NewName,PredName,Arity),
db_module(Module),
not c_db_my_check_if_exists_pred(PredName,Arity,Module),
% This copy_term is done to prevent the unification
% with top-level variables A='var('A')' error
copy_term((ViewName,DbGoal),(CopyView,CopyGoal)),
translate(CopyView,CopyGoal,Code),
queries_atom(Code,SQL),
% checks if the WHERE commend of SQL exists in the string
'$where_exists'(SQL,Flag),
'$make_list_of_args'(1,Arity,NewName,LA),
% build view clause
Assert =..[':-',NewName,
','(myddas_mysql:'$build_query'(Flag,SQL,Code,LA,FinalSQL),
','(myddas_mysql:db_my_result_set(Mode),
','(myddas_mysql:'$write_or_not'(FinalSQL),
','(myddas_mysql:c_db_my_query(FinalSQL,ResultSet,Connection,Mode),
','(!,myddas_mysql:c_db_my_row(ResultSet,Arity,LA))))))],
assert(Module:Assert),
c_db_add_preds(PredName,Arity,Module,Connection).
'$assert_relation_insert'(RelationName,PredName,Connection) :-
% get relation arity
c_db_my_number_of_fields(RelationName,Connection,Arity),
db_module(Module),
not c_db_my_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...]
c_db_my_get_attributes_types(RelationName,Connection,TypesList),
% build PredName functor
functor(P,PredName,Arity),
'$make_list_of_args'(1,Arity,P,LA),
% build PredName clause
Assert =..[':-',P,','(myddas_mysql:'$get_values_for_insert'(TypesList,LA,ValuesList),
','(myddas_mysql:'$make_atom'(['INSERT INTO ',RelationName,' VALUES ('|ValuesList],SQL),
','(myddas_mysql:db_my_result_set(Mode),
','(myddas_mysql:'$write_or_not'(SQL),
myddas_mysql:c_db_my_query(SQL,_,Connection,Mode)))))],
assert(Module:Assert),
c_db_add_preds(PredName,Arity,Module,Connection).
'$assert_import_clause'(RelationName,PredName,Connection) :-
% get relation arity
c_db_my_number_of_fields(RelationName,Connection,Arity),
db_module(Module),
not c_db_my_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...]
c_db_my_get_attributes_types(RelationName,Connection,TypesList),
% assert attributes facts
'$assert_attribute_information'(0,Arity,RelationName,TypesList),
% build PredName functor
functor(P,PredName,Arity),
'$make_list_of_args'(1,Arity,P,LA),
%Optimization
'$copy_term_nv'(P,[],G,_),
%generate the SQL query
translate(G,G,Code),
queries_atom(Code,SQL),
% build PredName clause
Assert =..[':-',P,','(myddas_mysql:'$build_query'(0,SQL,Code,LA,FinalSQL),
','(myddas_mysql:db_my_result_set(Mode),
','(myddas_mysql:'$write_or_not'(FinalSQL),
','(myddas_mysql:c_db_my_query(FinalSQL,ResultSet,Connection,Mode),
','(!,myddas_mysql:c_db_my_row(ResultSet,Arity,LA))))))],
assert(Module:Assert),
c_db_add_preds(PredName,Arity,Module,Connection).

View File

@ -1,260 +0,0 @@
/*************************************************************************
* *
* 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_odbc.yap *
* Last rev: *
* mods: *
* comments: ODBC Driver communication library *
* *
*************************************************************************/
:- module(myddas_odbc,[
db_odbc_open/4,
db_odbc_close/1,
db_odbc_import/3,
db_odbc_view/3,
db_odbc_insert/2,
db_odbc_insert/3,
db_odbc_sql_select/3,
db_odbc_number_of_fields/3,
db_odbc_get_attributes_types/3
]).
:- use_module(myddas).
:- use_module(myddas_errors).
:- use_module(myddas_prolog2sql,[translate/3,queries_atom/2]).
:- use_module(myddas_util_predicates).
:- use_module(lists,[append/3]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_odbc_open/4
%
%
db_odbc_open(ODBCEntry,User,Password,Conn) :-
'$error_checks'(db_odbc_open(ODBCEntry,User,Password,Conn)),
c_db_odbc_connect(ODBCEntry,User,Password,Connection),
set_value(Conn,Connection).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_odbc_close/1
%
%
db_odbc_close(Conn):-
'$error_checks'(db_odbc_close(Conn)),
'$abolish_all'(Conn).
db_odbc_close(Conn) :-
'$error_checks'(db_odbc_close(Conn)),
'$get_value'(Conn,Connection),
c_db_odbc_disconnect(Connection),
set_value(Conn,[]). % "deletes" atom
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_odbc_import/3
%
%
db_odbc_import(RelationName,PredName,Connection) :-
'$error_checks'(db_odbc_import(RelationName,PredName,Connection)),
'$get_value'(Connection,Conn),
'$assert_import_clause'(RelationName,PredName,Conn).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_odbc_view/3
%
%
db_odbc_view(PredName,DbGoal,Connection) :-
'$error_checks'(db_odbc_view(PredName,DbGoal,Connection)),
'$get_value'(Connection,Conn),
'$assert_view_clause'(PredName,DbGoal,Conn).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_odbc_insert/2
%
%
db_odbc_insert(PredName,Connection):-
'$get_value'(Connection,Conn),
translate(PredName,PredName,Code),
'$error_checks'(db_odbc_insert2(PredName,Conn,Code)),
'$get_values_for_insert'(Code,ValuesList,RelName),
'$make_atom'(['INSERT INTO ',RelName,' VALUES'|ValuesList],SQL),
c_db_odbc_query(SQL,_,_,_,Conn).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_odbc_insert/3
%
%
db_odbc_insert(RelationName,PredName,Connection) :-
'$error_checks'(db_odbc_insert3(RelationName,PredName,Connection)),
'$get_value'(Connection,Conn),
'$assert_relation_insert'(RelationName,PredName,Conn).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_odbc_sql_select/3
%
%
db_odbc_sql_select(Connection,SQL,LA):-
'$error_checks'(db_odbc_sql_select(Connection,SQL,LA)),
'$get_value'(Connection,Conn),
c_db_odbc_number_of_fields_in_query(SQL,Conn,Arity),
'$make_a_list'(Arity,LA),
'$make_a_list'(Arity,BindList),
'$write_or_not'(SQL),
c_db_odbc_query(SQL,ResultSet,Arity,BindList,Conn),!,
c_db_odbc_row(ResultSet,BindList,LA).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_odbc_number_of_fields/3
%
%
db_odbc_number_of_fields(RelationName,Connection,Arity) :-
'$error_checks'(db_odbc_number_of_fields(RelationName,Connection,Arity)),
'$get_value'(Connection,Conn),
c_db_odbc_number_of_fields(RelationName,Conn,Arity).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_odbc_get_attributes_types/3
%
%
db_odbc_get_attributes_types(RelationName,Connection,TypesList) :-
'$error_checks'(db_odbc_get_attributes_types(RelationName,Connection,TypesList)),
'$get_value'(Connection,Conn),
c_db_odbc_number_of_fields(RelationName,Conn,Arity),
Size is 2*Arity,
'$make_a_list'(Size,TypesList),
c_db_odbc_get_attributes_types(RelationName,Conn,TypesList).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%--------------------------------------------------------
% Private Predicates
%--------------------------------------------------------
'$assert_view_clause'(ViewName,DbGoal,Connection) :-
% here we can add some error control, like checking DBgoals include
% only DB relations
% get arity of projection term
functor(ViewName,PredName,Arity),
functor(NewName,PredName,Arity),
db_module(Module),
not c_db_check_if_exists_pred(PredName,Arity,Module),
% This copy_term is done to prevent the unification
% with top-level variables A='var('A')' error
copy_term((ViewName,DbGoal),(CopyView,CopyGoal)),
translate(ViewName,DbGoal,Code),
queries_atom(Code,SQL),
% checks if the WHERE commend of SQL exists in the string
'$where_exists'(SQL,Flag),
'$make_list_of_args'(1,Arity,NewName,LA),
% build view clause
Assert =..[':-',NewName,
','(myddas_odbc:'$build_query'(Flag,SQL,Code,LA,FinalSQL),
','(myddas_odbc:'$make_a_list'(Arity,BindList),
','(myddas_odbc:c_db_odbc_query(FinalSQL,ResultSet,Arity,BindList,Connection),
','(myddas_odbc:'$write_or_not'(FinalSQL),
','(!,myddas_odbc:c_db_odbc_row(ResultSet,BindList,LA))))))],
assert(Module:Assert),
c_db_add_preds(PredName,Arity,Module,Connection).
'$assert_relation_insert'(RelationName,PredName,Connection) :-
% get relation arity
c_db_odbc_number_of_fields(RelationName,Connection,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...]
c_db_odbc_get_attributes_types(RelationName,Connection,TypesList),
% build PredName functor
functor(P,PredName,Arity),
'$make_list_of_args'(1,Arity,P,LA),
% build PredName clause
Assert =..[':-',P,','(myddas_odbc:'$get_values_for_insert'(TypesList,LA,ValuesList),
','(myddas_odbc:'$make_atom'(['INSERT INTO ',RelationName,' VALUES ('|ValuesList],SQL),
myddas_odbc:c_db_odbc_query(SQL,_,_,_,Connection)))],
assert(Module:Assert),
c_db_add_preds(PredName,Arity,Module,Connection).
'$assert_import_clause'(RelationName,PredName,Connection) :-
% get relation arity
c_db_odbc_number_of_fields(RelationName,Connection,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...]
c_db_odbc_get_attributes_types(RelationName,Connection,TypesList),
% assert attributes facts
'$assert_attribute_information'(0,Arity,RelationName,TypesList),
% build PredName functor
functor(P,PredName,Arity),
% build arg list for db_row/2
'$make_list_of_args'(1,Arity,P,LA),
%Optimization
'$copy_term_nv'(P,[],G,_),
%generate the SQL query
translate(G,G,Code),
queries_atom(Code,SQL),
% build PredName clause
Assert =..[':-',P,','(myddas_odbc:'$build_query'(0,SQL,Code,LA,FinalSQL),
','(myddas_odbc:'$make_a_list'(Arity,BindList),
','(myddas_odbc:c_db_odbc_query(FinalSQL,ResultSet,Arity,BindList,Connection),
','(myddas_odbc:'$write_or_not'(FinalSQL),
','(!,myddas_odbc:c_db_odbc_row(ResultSet,BindList,LA))))))],
assert(Module:Assert),
c_db_add_preds(PredName,Arity,Module,Connection).

View File

@ -287,7 +287,7 @@ translate_goal(distinct(Goal),List,SQL,Dict,DistinctDict):-!,
%DEBUG
add_distinct_statement(Dict,Dict):-
append([A],[1,2],_).
append([_],[1,2],_).

View File

@ -1,10 +1,13 @@
:- module(myddas_test_predicates,[
% Tests or Debug Predicates
%db_my_delete/2,
db_create_table/3,
db_export_view/4,
db_assert_view/4,
db_my_insert_test/2,
db_my_update/3,
db_my_import_query_normal/3,
db_view/3, % DEBUG ONLY
db_view_original/3, % DEBUG ONLY
db_my_ilpview/4
]).
@ -17,6 +20,36 @@
:- use_module(lists).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_assert_view/4
% TODO Test with ODBC
% TODO error checks
db_assert_view(ViewName,SQLorDbGoal,FieldsInf,Connection):-
'$get_value'(Connection,Con),
%'$error_checks'(),
( var(ViewName) ->
c_db_get_new_table_name(Con,ViewName),
TableName = ViewName
),
'$process_sql_goal'(ViewName,SQLorDbGoal,TableName,SQL),
% Case there's some information about the
% attribute fields of the relation given
% by the user
'$generate_final_sql'(FieldsInf,TableName,SQL,FinalSQL),
'$run_query'(Con,FinalSQL),
% TODO: Optimize this
db_my_import(TableName,TableName,Connection).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_my_insert/2
%
@ -271,10 +304,10 @@ db_my_ilpview(LA,ViewName,DbGoal,Connection):-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% db_view/3
% db_view_original/3
%
%
db_view(PredName,DbGoal,Connection) :-
db_view_original(PredName,DbGoal,Connection) :-
'$error_checks'(db_my_view(PredName,DbGoal,Connection)),
'$get_value'(Connection,Conn),
'$assert_view_clause2'(PredName,DbGoal,Conn).

View File

@ -16,6 +16,8 @@
*************************************************************************/
:- module(myddas_util_predicates,[
'$process_sql_goal'/4,
'$process_fields'/3,
'$check_fields'/2,
'$get_value'/2,
'$get_values_for_insert'/3,
@ -34,9 +36,75 @@
'$assert_facts'/2
]).
:- use_module(myddas).
:- use_module(myddas_errors).
:- use_module(lists,[append/3]).
:- use_module(myddas,[
db_verbose/1
]).
:- use_module(myddas_errors,[
'$error_checks'/1
]).
:- use_module(myddas_prolog2sql,[
translate/3,
queries_atom/2
]).
'$process_sql_goal'(TableViewName,SQLorDbGoal,TableName,SQL):-
(atom(SQLorDbGoal) ->
SQL = SQLorDbGoal,
TableName = TableViewName
;
% This copy_term is done to prevent the unification
% with top-level variables A='var('A')' error
copy_term((TableViewName,SQLorDbGoal),(CopyView,CopyGoal)),
translate(CopyView,CopyGoal,Code),
queries_atom(Code,SQL),
functor(TableViewName,TableName,_)
).
'$process_fields'(FieldsInf,FieldString,KeysSQL):-
'$create_field_list'(FieldsInf,FieldString,PrimaryKeys),
'$process_primary_keys'(PrimaryKeys,KeysSQL).
'$process_primary_keys'([],'').
'$process_primary_keys'([FieldName|Fields],KeysSQL):-
'$process_primary_keys_put_comma'(Fields,CommaSQL),
'$make_atom'([' , PRIMARY KEY ( ',FieldName,CommaSQL,' )'],KeysSQL).
'$process_primary_keys_put_comma'([],''):-!.
'$process_primary_keys_put_comma'([FieldName|Fields],CommaSQL):-!,
'$process_primary_keys_put_comma'(Fields,TempSQL),
'$make_atom'([' , `',FieldName,'` ',TempSQL],CommaSQL).
'$create_field_list'([field(Name,Type,Null,Key,DefaultValue)],FinalSQL,PrimaryKeys):-!,
'$field_extra_options'(Name,Null,Key,[],DefaultValue,TempSQL,PrimaryKeys),
'$make_atom'([' `',Name,'` ',Type,TempSQL],FinalSQL).
'$create_field_list'([field(Name,Type,Null,Key,DefaultValue)|T],FinalSQL,PrimaryKeys):-
%'$check_field_type'
'$create_field_list'(T,Result,KeyInfo),
'$field_extra_options'(Name,Null,Key,KeyInfo,DefaultValue,TempSQL1,PrimaryKeys),
'$make_atom'([' `',Name,'` ',Type,TempSQL1,' , ',Result],FinalSQL).
'$field_extra_options'(Name,Null,Key,KeyInfo,DefaultValue,Result,PrimaryKeys):-
( Null == 'y' ->
'$make_atom'([' NOT NULL '],TempSQL1)
;
TempSQL1 = ''
),
(var(DefaultValue) ->
Result = TempSQL1
;
'$make_atom'([TempSQL1,' DEFAULT \'',DefaultValue,'\' '],Result)
),
( Key == 'y' ->
PrimaryKeys = [Name|KeyInfo]
;
PrimaryKeys = KeyInfo
).
%
% Predicate's used to determine if the command 'WHERE' exists in the
@ -212,12 +280,10 @@
'$build_set_condition_with_comma'(FieldValues,SQLRest).
% Este predicado vai sempre falhar
'$abolish_all'(Conn):-
'$get_value'(Conn,Connection),!,
% C Predicate
p_db_preds_conn(Connection,Pred_Name,Pred_Arity),
abolish(user:Pred_Name,Pred_Arity),
% This predicate will always fail
'$abolish_all'(Con):-
c_db_preds_conn(Con,Pred_Module,Pred_Name,Pred_Arity),
abolish(Pred_Module:Pred_Name,Pred_Arity),
fail.
'$write_or_not'(X) :-
@ -226,20 +292,15 @@
'$write_or_not'(_).
'$make_atom'(L,A) :-
'$make_atom_list'(L,L1),
atom_codes(A,L1).
'$make_atom_list'([],[]).
'$make_atom_list'([H|T],L2) :-
atom(H),!,
atom_codes(H,L),
'$make_atom_list'(T,L1),
append(L,L1,L2).
'$make_atom_list'([H|T],L2) :-
number_chars(H,L),
'$make_atom_list'(T,L1),
append(L,L1,L2).
'$make_atom'([],'').
'$make_atom'([Atom|T],Final) :-
atom(Atom),!,
'$make_atom'(T,Result),
atom_concat(Atom,Result,Final).
'$make_atom'([Number|T],Final) :-
'$make_atom'(T,Result),
number_atom(Number,Atom),
atom_concat(Atom,Result,Final).
@ -281,9 +342,9 @@
% Only for making the error tests in all of the calls to
% get_value/2
'$get_value'(Conn,Connection) :-
'$error_checks'(get_value(Conn,Connection)),
get_value(Conn,Connection).
'$get_value'(Connection,Con) :-
'$error_checks'(get_value(Connection,Con)),
get_value(Connection,Con).
'$check_fields'([],[]).

View File

@ -50,8 +50,8 @@ PROGRAMS= $(srcdir)/apply_macros.yap \
$(srcdir)/ugraphs.yap \
$(srcdir)/ypp.yap \
$(srcdir)/MYDDAS/myddas.yap \
$(srcdir)/MYDDAS/myddas_assert_predicates.yap \
$(srcdir)/MYDDAS/myddas_mysql.yap \
$(srcdir)/MYDDAS/myddas_odbc.yap \
$(srcdir)/MYDDAS/myddas_errors.yap \
$(srcdir)/MYDDAS/myddas_prolog2sql.yap \
$(srcdir)/MYDDAS/myddas_util_predicates.yap \