From bc82175e5eaf8b39d5a3d88cddaa1f0bdebb7712 Mon Sep 17 00:00:00 2001 From: tiagosoares Date: Fri, 10 Feb 2006 23:42:19 +0000 Subject: [PATCH] MYDDAS: New functionalitys to the MYDDAS system git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1541 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- MYDDAS/myddas_mysql.c | 8 +- MYDDAS/myddas_odbc.c | 4 +- MYDDAS/myddas_shared.c | 158 +++++++++++--------- library/MYDDAS/myddas.yap | 38 ++++- library/MYDDAS/myddas_assert_predicates.yap | 92 ++++++++---- library/MYDDAS/myddas_errors.yap | 11 +- 6 files changed, 197 insertions(+), 114 deletions(-) diff --git a/MYDDAS/myddas_mysql.c b/MYDDAS/myddas_mysql.c index bcc5687fc..8594c2bf0 100755 --- a/MYDDAS/myddas_mysql.c +++ b/MYDDAS/myddas_mysql.c @@ -311,7 +311,7 @@ c_db_my_number_of_fields(void) { MYSQL_RES *res_set; - sprintf(sql,"DESCRIBE %s",relation); + sprintf(sql,"DESCRIBE `%s`",relation); /* executar a query SQL */ if (mysql_query(conn, sql) != 0) @@ -356,7 +356,7 @@ c_db_my_get_attributes_types(void) { MYSQL_ROW row; Term head, list; - sprintf(sql,"DESCRIBE %s",relation); + sprintf(sql,"DESCRIBE `%s`",relation); /* executar a query SQL */ if (mysql_query(conn, sql) != 0) @@ -598,10 +598,10 @@ c_db_my_get_fields_properties(void) { MYSQL *conn = (MYSQL *) (IntegerOfTerm(arg_conn)); - /* 1=2 -> We only need the meta information about the fields + /* LIMIT 0 -> We only need the meta information about the fields to know their properties, we don't need the results of the query*/ - sprintf (sql,"SELECT * FROM %s where 1=2",relacao); + sprintf (sql,"SELECT * FROM `%s` LIMIT 0",relacao); /* executar a query SQL */ if (mysql_query(conn, sql) != 0) diff --git a/MYDDAS/myddas_odbc.c b/MYDDAS/myddas_odbc.c index 6e9f91faf..41d7f8269 100755 --- a/MYDDAS/myddas_odbc.c +++ b/MYDDAS/myddas_odbc.c @@ -624,9 +624,9 @@ c_db_odbc_get_fields_properties(void) { SQLHDBC hdbc =(SQLHDBC) (IntegerOfTerm(arg_conn)); - /* 1=2 -> We don't need the results of the query, + /* LIMIT 0 -> We don't need the results of the query, only the information about the fields of the relation*/ - sprintf (sql,"SELECT * FROM %s where 1=2",relacao); + sprintf (sql,"SELECT * FROM `%s` LIMIT 0",relacao); /*Allocate an handle for the query*/ SQLALLOCHANDLE(SQL_HANDLE_STMT, hdbc, &hstmt, "db_get_fields_properties"); diff --git a/MYDDAS/myddas_shared.c b/MYDDAS/myddas_shared.c index ffd90daf1..0a8e4f339 100644 --- a/MYDDAS/myddas_shared.c +++ b/MYDDAS/myddas_shared.c @@ -27,11 +27,13 @@ #include "myddas_statistics.h" #endif -STATIC_PROTO(int c_db_get_new_table_name,(void)); +//STATIC_PROTO(int c_db_get_new_table_name,(void)); STATIC_PROTO(int c_db_connection_type,(void)); STATIC_PROTO(int c_db_add_preds,(void)); STATIC_PROTO(int c_db_preds_conn_start ,(void)); STATIC_PROTO(int c_db_preds_conn_continue ,(void)); +STATIC_PROTO(int c_db_connection_start ,(void)); +STATIC_PROTO(int c_db_connection_continue ,(void)); STATIC_PROTO(int c_db_check_if_exists_pred,(void)); STATIC_PROTO(int c_db_delete_predicate,(void)); STATIC_PROTO(int c_db_multi_queries_number,(void)); @@ -42,23 +44,46 @@ STATIC_PROTO(int c_db_stats,(void)); STATIC_PROTO(int c_db_check,(void)); #endif -/* c_db_get_new_table_name: -TableName */ -static int -c_db_get_new_table_name (void){ -/* Term arg_con = Deref(ARG1); */ -/* Term arg_name = Deref(ARG2); */ - -/* int *con = (int *) IntegerOfTerm(arg_con); */ -/* char *tableName = myddas_util_get_table_name(con); */ - -/* Yap_unify(arg_name, MkAtomTerm(Yap_LookupAtom(tableName))); */ - -/* free(tableName); */ - - return TRUE; -} +void Yap_InitMYDDAS_SharedPreds(void) +{ + /* c_db_connection_type: Connection x Type */ + Yap_InitCPred("c_db_connection_type",2,c_db_connection_type, 0); + /* CORRECT THIS: db_add_preds : PredName * Arity * Connection */ + Yap_InitCPred("c_db_add_preds",4,c_db_add_preds, 0); + /* c_db_check_if_exists_pred : PredName * Arity * Connection */ + Yap_InitCPred("c_db_check_if_exists_pred",3,c_db_check_if_exists_pred, 0); + + /* c_db_delete_pred : Module * PredName * Arity */ + Yap_InitCPred("c_db_delete_predicate",3,c_db_delete_predicate, 0); + + /* c_db_delete_pred : Module * PredName * Arity */ + Yap_InitCPred("c_db_multi_queries_number",2,c_db_multi_queries_number, 0); + +#ifdef MYDDAS_STATS + /* db_stats: Connection * Stats*/ + Yap_InitCPred("c_db_stats",2, c_db_stats, 0); +#endif + +#ifdef DEBUG + Yap_InitCPred("c_db_check",0, c_db_check, 0); +#endif +} + +void Yap_InitBackMYDDAS_SharedPreds(void) +{ + /* Gives all the predicates associated to a given connection */ + Yap_InitCPredBack("c_db_preds_conn", 4, sizeof(int), + c_db_preds_conn_start, + c_db_preds_conn_continue, 0); + /* Gives all the connections stored on the MYDDAS Structure*/ + Yap_InitCPredBack("c_db_connection", 1, sizeof(int), + c_db_connection_start, + c_db_connection_continue, 0); + + +} /* Gives the type of a given connection, in other words, type will be mysql or odbc @@ -99,7 +124,7 @@ c_db_add_preds (void){ if (myddas_util_add_predicate(nome,aridade,module,conn) == NULL) { #ifdef DEBUG - printf ("ERRO : Nao consegui adicionar predicado\n"); + printf ("ERROR : Could not add Predicate: Line: %d File: %s\n",__LINE__,__FILE__); #endif return FALSE; } @@ -170,14 +195,44 @@ c_db_multi_queries_number(void){ return TRUE; } + +static int +c_db_connection_start(void){ + + MYDDAS_UTIL_CONNECTION node = + Yap_regp->MYDDAS_GLOBAL_POINTER->myddas_top_connections; + + EXTRA_CBACK_ARG(1,1)=(CELL) MkIntegerTerm((int)node); + + return (c_db_connection_continue()); +} + +static int +c_db_connection_continue(void){ + Term arg_conn = Deref(ARG1); + + MYDDAS_UTIL_CONNECTION node; + node = (MYDDAS_UTIL_CONNECTION) IntegerOfTerm(EXTRA_CBACK_ARG(1,1)); + + /* There is no connections */ + if (node == NULL) + { + cut_fail(); + return FALSE; + } + + Yap_unify(arg_conn, MkIntegerTerm((int)(node->connection))); + EXTRA_CBACK_ARG(1,1)=(CELL) MkIntegerTerm((int)(node->next)); + + return TRUE; + +} + /* db_preds_conn : Connection(+) * Pred_name(-) * Pred_arity */ static int c_db_preds_conn_start (void){ Term arg_conn = Deref(ARG1); - Term module = Deref(ARG2); - Term nome = Deref(ARG3); - Term aridade = Deref(ARG4); - + int *conn = (int *) IntegerOfTerm(arg_conn); MYDDAS_UTIL_CONNECTION node = myddas_util_search_connection(conn); @@ -192,30 +247,32 @@ c_db_preds_conn_start (void){ void *pointer = myddas_util_get_list_pred(node); EXTRA_CBACK_ARG(4,1)=(CELL) MkIntegerTerm((int)pointer); - if (IsVarTerm(nome) && IsVarTerm(aridade) && IsVarTerm(module)) - return (c_db_preds_conn_continue()); - - cut_fail(); - return FALSE; + return (c_db_preds_conn_continue()); } /* db_preds_conn : Connection(+) * Pred_name(-) * Pred_arity*/ static int c_db_preds_conn_continue (void){ Term module = Deref(ARG2); - Term nome = Deref(ARG3); - Term aridade = Deref(ARG4); + Term name = Deref(ARG3); + Term arity = Deref(ARG4); void *pointer; pointer = (void *) IntegerOfTerm(EXTRA_CBACK_ARG(4,1)); if (pointer != NULL) { - Yap_unify(module, MkAtomTerm(Yap_LookupAtom(myddas_util_get_pred_module(pointer)))); - Yap_unify(nome, MkAtomTerm(Yap_LookupAtom(myddas_util_get_pred_name(pointer)))); - Yap_unify(aridade, MkIntegerTerm((int)myddas_util_get_pred_arity(pointer))); - EXTRA_CBACK_ARG(4,1)=(CELL) MkIntegerTerm((int)myddas_util_get_pred_next(pointer)); + + if (!Yap_unify(module, MkAtomTerm(Yap_LookupAtom(myddas_util_get_pred_module(pointer))))){ + return FALSE; + } + if (!Yap_unify(name,MkAtomTerm(Yap_LookupAtom(myddas_util_get_pred_name(pointer))))){ + return FALSE; + } + if (!Yap_unify(arity, MkIntegerTerm((int)myddas_util_get_pred_arity(pointer)))){ + return FALSE; + } return TRUE; } else @@ -386,43 +443,6 @@ void Yap_MyDDAS_delete_all_myddas_structs(void) /* } */ } -void Yap_InitMYDDAS_SharedPreds(void) -{ - - Yap_InitCPred("c_db_get_new_table_name",2,c_db_get_new_table_name, 0); - - - Yap_InitCPred("c_db_connection_type",2,c_db_connection_type, 0); - - /* CORRECT THIS: db_add_preds : PredName * Arity * Connection */ - Yap_InitCPred("c_db_add_preds",4,c_db_add_preds, 0); - - /* c_db_check_if_exists_pred : PredName * Arity * Connection */ - Yap_InitCPred("c_db_check_if_exists_pred",3,c_db_check_if_exists_pred, 0); - - /* c_db_delete_pred : Module * PredName * Arity */ - Yap_InitCPred("c_db_delete_predicate",3,c_db_delete_predicate, 0); - - /* c_db_delete_pred : Module * PredName * Arity */ - Yap_InitCPred("c_db_multi_queries_number",2,c_db_multi_queries_number, 0); - -#ifdef MYDDAS_STATS - /* db_stats: Connection * Stats*/ - Yap_InitCPred("c_db_stats",2, c_db_stats, 0); -#endif - -#ifdef DEBUG - Yap_InitCPred("c_db_check",0, c_db_check, 0); -#endif -} - -void Yap_InitBackMYDDAS_SharedPreds(void) -{ - Yap_InitCPredBack("c_db_preds_conn", 4, sizeof(int), - c_db_preds_conn_start, - c_db_preds_conn_continue, 0); - -} diff --git a/library/MYDDAS/myddas.yap b/library/MYDDAS/myddas.yap index e4b343135..e34cd0d7c 100644 --- a/library/MYDDAS/myddas.yap +++ b/library/MYDDAS/myddas.yap @@ -17,13 +17,17 @@ :- module(myddas,[ db_open/5, + db_open/4, db_close/1, + db_close/0, db_verbose/1, db_module/1, db_is_database_predicate/3, db_stats/2, + db_sql/2, + db_sql/3, db_sql_select/3, db_prolog_select/3, db_prolog_select_multi/3, @@ -43,11 +47,15 @@ db_datalog_select/3, % myddas_assert_predicates.yap + db_import/2, db_import/3, + db_view/2, db_view/3, db_insert/3, db_abolish/2, - + db_listing/0, + db_listing/1, + % myddas_mysql.yap db_my_open/5, db_my_close/1, @@ -75,10 +83,14 @@ ]). :- use_module(myddas_assert_predicates,[ + db_import/2, db_import/3, + db_view/2, db_view/3, db_insert/3, - db_abolish/2 + db_abolish/2, + db_listing/0, + db_listing/1 ]). :- use_module(myddas_mysql,[ @@ -135,9 +147,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% db_open/5 -% +% db_open/5 +% db_open/4 % +db_open(Interface,HostDb,User,Password):- + db_open(Interface,myddas,HostDb,User,Password). 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), @@ -153,8 +167,10 @@ db_open(odbc,Connection,ODBCEntry,User,Password) :- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % db_close/1 +% db_close/0 % -% +db_close:- + db_close(myddas). db_close(Connection):- '$error_checks'(db_close(Connection)), get_value(Connection,Con), @@ -232,12 +248,18 @@ db_stats(Connection,List):- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +db_sql_select(_,_,_):- + nl,write('Know use db_sql/3 insted of db_sql_select/3'),nl, + halt. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% db_sql_select(+,+,-) +% db_sql(+,+,-) % % -db_sql_select(Connection,SQL,LA):- - '$error_checks'(db_sql_select(Connection,SQL,LA)), +db_sql(SQL,LA):- + db_sql(myddas,SQL,LA). +db_sql(Connection,SQL,LA):- + '$error_checks'(db_sql(Connection,SQL,LA)), get_value(Connection,Con), c_db_connection_type(Con,ConType), ( ConType == mysql -> diff --git a/library/MYDDAS/myddas_assert_predicates.yap b/library/MYDDAS/myddas_assert_predicates.yap index 765e1a3c6..e5c60a90a 100644 --- a/library/MYDDAS/myddas_assert_predicates.yap +++ b/library/MYDDAS/myddas_assert_predicates.yap @@ -16,10 +16,14 @@ *************************************************************************/ :- module(myddas_assert_predicates,[ + db_import/2, db_import/3, + db_view/2, db_view/3, db_insert/3, - db_abolish/2 + db_abolish/2, + db_listing/0, + db_listing/1 ]). @@ -54,8 +58,10 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % db_import/3 +% db_import/2 % -% +db_import(RelationName,PredName):- + db_import(myddas,Relation,PredName). db_import(Connection,RelationName,PredName) :- '$error_checks'(db_import(Connection,RelationName,PredName)), get_value(Connection,Con), @@ -90,13 +96,6 @@ db_import(Connection,RelationName,PredName) :- 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), - M=myddas_assert_predicates, %build PredName clause ( ConType == mysql -> @@ -109,27 +108,10 @@ db_import(Connection,RelationName,PredName) :- ','(M:c_db_my_query(FinalSQL,ResultSet,Con,Mode), ','(!,M:c_db_my_row(ResultSet,Arity,LA))))))))] -% Assert =..[':-',P,','(M:'$build_query'(0,SQL,Code,LA,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 =..[':-',P,','(get_value(db_myddas_stats_count,Number), -% ','(statistics(cputime,TimeI), -% ','(M:'$build_query'(0,SQL,Code,LA,FinalSQL), -% ','(M:db_my_result_set(Mode), -% ','(M:'$write_or_not'(FinalSQL), -% ','(M: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), -% ','(!,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:translate(G,G,Code), ','(M:queries_atom(Code,FinalSQL), ','(M:c_db_odbc_query(FinalSQL,ResultSet,Arity,BindList,Connection), ','(M:'$write_or_not'(FinalSQL), @@ -144,8 +126,10 @@ db_import(Connection,RelationName,PredName) :- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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), @@ -247,13 +231,61 @@ db_insert(Connection,RelationName,PredName) :- % % db_abolish(Module:PredName,Arity):-!, - %'$error_checks'(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)), + '$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). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + diff --git a/library/MYDDAS/myddas_errors.yap b/library/MYDDAS/myddas_errors.yap index be81cf066..1d2ef1587 100644 --- a/library/MYDDAS/myddas_errors.yap +++ b/library/MYDDAS/myddas_errors.yap @@ -28,6 +28,15 @@ is_list/1 ]). + +'$error_checks'(db_abolish(ModulePredName,Arity)):-!, + (ModulePredName = Module:PredName -> + atom(Module), + atom(PredName) + ; + atom(ModulePredName) + ), + number(Arity). '$error_checks'(db_show_database(Connection,_)):- !, atom(Connection). '$error_checks'(db_change_database(Connection,Database)):- !, @@ -106,7 +115,7 @@ '$error_checks'(db_get_attributes_types(Connection,RelationName,_)) :- !, atom(Connection), nonvar(RelationName). -'$error_checks'(db_sql_select(Connection,SQL,LA)):- !, +'$error_checks'(db_sql(Connection,SQL,LA)):- !, atom(Connection), nonvar(SQL), not ground(LA).