From 6c1d3d1a95398b97764f09dfebb164d9f27f4e2e Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Thu, 28 Jun 2018 12:48:29 +0100 Subject: [PATCH] :more db stuff --- C/errors.c | 11 ++++++++ C/text.c | 7 +++-- CXX/yapi.cpp | 3 -- H/TermExt.h | 36 +++++++++++++++++------- library/gensym.yap | 4 +++ os/iopreds.c | 2 +- os/readline.c | 4 +-- packages/myddas/mysql/CMakeLists.txt | 10 +++---- packages/myddas/odbc/CMakeLists.txt | 8 +++--- packages/myddas/pl/myddas_driver.ypp | 12 ++++---- packages/myddas/pl/myddas_mysql.ypp | 4 +-- packages/myddas/pl/myddas_prolog2sql.ypp | 16 ++++++----- packages/myddas/postgres/CMakeLists.txt | 8 +++--- packages/myddas/sqlite3/CMakeLists.txt | 24 +++++++++------- packages/myddas/sqlite3/myddas_sqlite3.c | 8 +++--- packages/myddas/sqlite3/sqlitest.yap | 4 +-- pl/messages.yap | 30 ++++++++++++++------ pl/undefined.yap | 2 +- 18 files changed, 122 insertions(+), 71 deletions(-) diff --git a/C/errors.c b/C/errors.c index 805d47b59..7d9bebe72 100755 --- a/C/errors.c +++ b/C/errors.c @@ -1001,6 +1001,15 @@ static Int read_exception(USES_REGS1) { return Yap_unify(ARG2, rc); } +static Int print_exception(USES_REGS1) { + yap_error_descriptor_t *t = AddressOfTerm(Deref(ARG1)); + printErr(t); + // Yap_DebugPlWriteln(rc); + return true; +} + + + static Int query_exception(USES_REGS1) { const char *query; Term t; @@ -1022,6 +1031,7 @@ static Int query_exception(USES_REGS1) { } } + static Int drop_exception(USES_REGS1) { yap_error_descriptor_t *t = AddressOfTerm(Deref(ARG1)); free(t); @@ -1226,6 +1236,7 @@ static Int is_predicate_indicator(USES_REGS1) { void Yap_InitErrorPreds(void) { CACHE_REGS + Yap_InitCPred("$print_exception", 1, print_exception, 0); Yap_InitCPred("$reset_exception", 1, reset_exception, 0); Yap_InitCPred("$new_exception", 1, new_exception, 0); Yap_InitCPred("$get_exception", 1, get_exception, 0); diff --git a/C/text.c b/C/text.c index 8e28c678e..eb6000f34 100644 --- a/C/text.c +++ b/C/text.c @@ -437,12 +437,15 @@ unsigned char *Yap_readText(seq_tv_t *inp USES_REGS) { LOCAL_Error_TYPE = TYPE_ERROR_TEXT; } } - LOCAL_ActiveError->errorRawTerm = MkUStringTerm(inp->val.uc); - } if (LOCAL_Error_TYPE != YAP_NO_ERROR) { + if (inp->val.uc != NULL) { + LOCAL_ActiveError->errorRawTerm = MkUStringTerm(inp->val.uc); + + } Yap_ThrowError(LOCAL_Error_TYPE, LOCAL_ActiveError->errorRawTerm, "Converting to text from term "); return NULL; } + } if (IsAtomTerm(inp->val.t) && inp->type & YAP_STRING_ATOM) { // this is a term, extract to a buffer, and representation is wide diff --git a/CXX/yapi.cpp b/CXX/yapi.cpp index 12a8a726d..2642befef 100644 --- a/CXX/yapi.cpp +++ b/CXX/yapi.cpp @@ -726,9 +726,6 @@ if (!result) { } PredEntry *YAPQuery::rewriteUndefQuery() { - Term ts[2]; - ts[0] = CurrentModule; - ts[1] = goal; ARG1 = goal = Yap_SaveTerm(Yap_MkApplTerm(FunctorCall , 1, &goal)); return ap = PredCall; diff --git a/H/TermExt.h b/H/TermExt.h index 7913028a6..f0975b063 100755 --- a/H/TermExt.h +++ b/H/TermExt.h @@ -294,11 +294,19 @@ INLINE_ONLY Term __MkStringTerm(const char *s USES_REGS); INLINE_ONLY Term __MkStringTerm(const char *s USES_REGS) { Term t = AbsAppl(HR); - size_t sz = ALIGN_BY_TYPE(strlen((char *)s) + 1, CELL); - HR[0] = (CELL)FunctorString; - HR[1] = (CELL)sz; - strcpy((char *)(HR + 2), (const char *)s); - HR[2 + sz] = EndSpecials; + size_t sz; + if ((s[0] == '\0')) { + sz = sizeof(CELL); + HR[0] = (CELL)FunctorString; + HR[1] = (CELL)sz; + HR[2] = 0; + } else { + sz = ALIGN_BY_TYPE(strlen((char *)s) + 1, CELL); + HR[0] = (CELL)FunctorString; + HR[1] = (CELL)sz; + strcpy((char *)(HR + 2), (const char *)s); + } + HR[2 + sz] = EndSpecials; HR += 3 + sz; return t; } @@ -311,11 +319,19 @@ __MkUStringTerm(const unsigned char *s USES_REGS); INLINE_ONLY Term __MkUStringTerm(const unsigned char *s USES_REGS) { Term t = AbsAppl(HR); - size_t sz = ALIGN_BY_TYPE(strlen((char *)s) + 1, CELL); - HR[0] = (CELL)FunctorString; - HR[1] = (CELL)sz; - strcpy((char *)(HR + 2), (const char *)s); - HR[2 + sz] = EndSpecials; + size_t sz; + if ((s[0] == '\0')) { + sz = sizeof(CELL); + HR[0] = (CELL)FunctorString; + HR[1] = (CELL)sz; + HR[2] = 0; + } else { + sz = ALIGN_BY_TYPE(strlen((char *)s) + 1, CELL); + HR[0] = (CELL)FunctorString; + HR[1] = (CELL)sz; + strcpy((char *)(HR + 2), (const char *)s); + } + HR[2 + sz] = EndSpecials; HR += 3 + sz; return t; } diff --git a/library/gensym.yap b/library/gensym.yap index 11c213214..49524f7bd 100644 --- a/library/gensym.yap +++ b/library/gensym.yap @@ -8,6 +8,7 @@ * */ :- module(gensym, [ + init_gensym/1, gensym/2, reset_gensym/1, reset_gensym/0 @@ -26,6 +27,9 @@ :- dynamic gensym_key/2. +init_gensym(Key) :- + assert(gensym_key(Atom,0) ). + gensym(Atom, New) :- retract(gensym_key(Atom,Id)), !, atomic_concat(Atom,Id,New), diff --git a/os/iopreds.c b/os/iopreds.c index 938028fea..a36d2d6aa 100644 --- a/os/iopreds.c +++ b/os/iopreds.c @@ -473,7 +473,7 @@ static void InitStdStreams(void) { #if USE_READLINE if (GLOBAL_Stream[StdInStream].status & Tty_Stream_f && GLOBAL_Stream[StdOutStream].status & Tty_Stream_f && - GLOBAL_Stream[StdErrStream].status & Tty_Stream_f && !Yap_embedded) { + GLOBAL_Stream[StdErrStream].status & Tty_Stream_f && !Yap_Embedded) { Yap_InitReadline(TermTrue); } #endif diff --git a/os/readline.c b/os/readline.c index 627c1fd40..01b240eb9 100644 --- a/os/readline.c +++ b/os/readline.c @@ -280,7 +280,7 @@ bool Yap_ReadlineOps(StreamDesc *s) { bool Yap_InitReadline(Term enable) { // don't call readline within emacs - if (Yap_embedded) + if (Yap_Embedded) return false; if (!(GLOBAL_Stream[StdInStream].status & Tty_Stream_f) || getenv("INSIDE_EMACS") || enable != TermTrue) { @@ -450,7 +450,7 @@ int Yap_ReadlineForSIGINT(void) { static Int has_readline(USES_REGS1) { #if USE_READLINE - if (!Yap_embedded) { + if (!Yap_Embedded) { return true; } return false; diff --git a/packages/myddas/mysql/CMakeLists.txt b/packages/myddas/mysql/CMakeLists.txt index 38397f8dc..a4b43401a 100644 --- a/packages/myddas/mysql/CMakeLists.txt +++ b/packages/myddas/mysql/CMakeLists.txt @@ -20,18 +20,18 @@ set_property(GLOBAL APPEND PROPERTY COMPILE_DEFINITIONS -DMYDDAS_MYSQL=1) if (WIN32) - add_library(Yapmysql OBJECT ${MYSQL_SOURCES}) + add_library(YAPmysql OBJECT ${MYSQL_SOURCES}) else() - add_lib(Yapmysql ${MYSQL_SOURCES}) - target_link_libraries(Yapmysql ${MYSQL_LIBRARIES} libYap) - install(TARGETS Yapmysql + add_lib(YAPmysql ${MYSQL_SOURCES}) + target_link_libraries(YAPmysql ${MYSQL_LIBRARIES} libYap) + install(TARGETS YAPmysql RUNTIME DESTINATION ${YAP_INSTALL_DLLDIR} ARCHIVE DESTINATION ${YAP_INSTALL_DLLDIR} LIBRARY DESTINATION ${YAP_INSTALL_DLLDIR} ) endif() include_directories(${MYSQL_INCLUDE_DIR} ..) - set_target_properties(Yapmysql PROPERTIES + set_target_properties(YAPmysql PROPERTIES POSITION_INDEPENDENT_CODE ON PREFIX "" ) diff --git a/packages/myddas/odbc/CMakeLists.txt b/packages/myddas/odbc/CMakeLists.txt index 6d9e7e835..3e0be1ad7 100644 --- a/packages/myddas/odbc/CMakeLists.txt +++ b/packages/myddas/odbc/CMakeLists.txt @@ -13,11 +13,11 @@ if (ODBC_FOUND) # ODBC_INCLUDE_DIRECTORIES, where to find sql.h # ODBC_LIBRARIES, the libraries to link against to use ODBC # ODBC_FOUND. If false, you cannot build anything that requires Odbc. -add_lib(Yapodbc ${YAPODBC_SOURCES}) -target_link_libraries(Yapodbc libYap ${ODBC_LIBRARIES}) +add_lib(YAPodbc ${YAPODBC_SOURCES}) +target_link_libraries(YAPodbc libYap ${ODBC_LIBRARIES}) include_directories (${ODBC_INCLUDE_DIRECTORIES} ..) -set_target_properties (Yapodbc PROPERTIES +set_target_properties (YAPodbc PROPERTIES POSITION_INDEPENDENT_CODE ON PREFIX "" ) @@ -28,7 +28,7 @@ set_target_properties (Yapodbc PROPERTIES -DMYDDAS_ODBC=1) - install(TARGETS Yapodbc + install(TARGETS YAPodbc LIBRARY DESTINATION ${YAP_INSTALL_DLLDIR} RUNTIME DESTINATION ${YAP_INSTALL_DLLDIR} ARCHIVE DESTINATION ${YAP_INSTALL_DLLDIR} diff --git a/packages/myddas/pl/myddas_driver.ypp b/packages/myddas/pl/myddas_driver.ypp index 7ee4d7fc3..0a08d34b4 100644 --- a/packages/myddas/pl/myddas_driver.ypp +++ b/packages/myddas/pl/myddas_driver.ypp @@ -18,23 +18,23 @@ #undef sqlite3 #define DBMS(x) sqlite3_##x #define c_DBMS(x) c_sqlite3_##x -#define NAME() 'libYapsqlite3' +#define NAME() 'YAPsqlite3' #define MODULE() user #define INIT() init_sqlite3 #elif defined( odbc ) #undef odbc #define DBMS(x) odbc_##x #define c_DBMS(x) c_odbc_##x -#define NAME() 'libYapodbc' +#define NAME() 'YAPodbc' #define MODULE() user #define INIT() init_odbc #elif defined( postgres ) #undef postgres #define DBMS(x) postgres_##x #define c_DBMS(x) c_postgres_##x -#define NAME() 'libYappostgres' +#define NAME() 'YAPpostgres' #define MODULE() user -#define INIT() init_odbc +#define INIT() init_postgres #endif #if defined(DBMS) @@ -71,7 +71,9 @@ '$make_a_list'/2, '$write_or_not'/1 ]). -% :- load_foreign_files( [NAME()], [], INIT()). +#ifndef __ANDROID__ +:- load_foreign_files( [NAME()], [], INIT()). +#endif %-------------------------------------------------------- % Public Predicates diff --git a/packages/myddas/pl/myddas_mysql.ypp b/packages/myddas/pl/myddas_mysql.ypp index 6d4c8b3f9..29228f44b 100644 --- a/packages/myddas/pl/myddas_mysql.ypp +++ b/packages/myddas/pl/myddas_mysql.ypp @@ -55,7 +55,7 @@ ]). -:- load_foreign_files( ['Yapmysql'], [], init_mysql). +:- load_foreign_files( ['YAPmysql'], [], init_mysql). %-------------------------------------------------------- @@ -248,4 +248,4 @@ db_my_sql_mode(Connection,SQLMode):- -#endif /* MYDDAS_MYSQL*/ \ No newline at end of file +#endif /* MYDDAS_MYSQL*/ diff --git a/packages/myddas/pl/myddas_prolog2sql.ypp b/packages/myddas/pl/myddas_prolog2sql.ypp index 37951b8d8..e552f3ce1 100644 --- a/packages/myddas/pl/myddas_prolog2sql.ypp +++ b/packages/myddas/pl/myddas_prolog2sql.ypp @@ -38,17 +38,19 @@ % -------------------------------------------------------------------------------------- -:- use_module(lists,[ - append/3, - member/2 - ]). - :- module(myddas_prolog2sql,[ translate/3, queries_atom/2 ]). +:- use_module(library(lists),[ + append/3, + member/2 + ]). + +:- use_module(library(gensym)). + :- use_module(myddas_prolog2sql_optimizer,[ optimize_sql/2 @@ -1225,7 +1227,7 @@ column_atom(Number,List,Diff) :- append(X1,Diff,List). - +#if SEPIA % --- gensym(Root,Symbol) ---------------------------------------------------- % % SEPIA 3.2. version - other Prolog implementations provide gensym/2 @@ -1246,7 +1248,7 @@ gensym(Atom,Var) :- char_code(Var,NewCode), set_value(Atom,Var). - +#endif % --- auxiliary predicates (some of them may be built-in... -------------------- diff --git a/packages/myddas/postgres/CMakeLists.txt b/packages/myddas/postgres/CMakeLists.txt index a91252bbe..e591ed865 100644 --- a/packages/myddas/postgres/CMakeLists.txt +++ b/packages/myddas/postgres/CMakeLists.txt @@ -14,10 +14,10 @@ if (PostgreSQL_FOUND) # PostgreSQL_INCLUDE_DIRS - Include directories for PostgreSQL # PostgreSQL_LIBRARY_DIRS - Link directories for PostgreSQL libraries # PostgreSQL_LIBRARIES - The PostgreSQL libraries. - add_lib(Yappostgres ${YAPPOSTGRES_SOURCES}) - target_link_libraries(Yappostgres libYap ${PostgreSQL_LIBRARIES}) + add_lib(YAPpostgres ${YAPPOSTGRES_SOURCES}) + target_link_libraries(YAPpostgres libYap ${PostgreSQL_LIBRARIES}) include_directories (${PostgreSQL_INCLUDE_DIRS} ..) - set_target_properties (Yappostgres PROPERTIES + set_target_properties (YAPpostgres PROPERTIES POSITION_INDEPENDENT_CODE ON PREFIX "" ) @@ -27,7 +27,7 @@ set (MYDDAS_FLAGS ${MYDDAS_FLAGS} ON PARENT_SCOPE) set_property(GLOBAL APPEND PROPERTY COMPILE_DEFINITIONS -DMYDDAS_POSTGRES=1) -install(TARGETS Yappostgres +install(TARGETS YAPpostgres LIBRARY DESTINATION ${YAP_INSTALL_DLLDIR} RUNTIME DESTINATION ${YAP_INSTALL_DLLDIR} ARCHIVE DESTINATION ${YAP_INSTALL_DLLDIR} diff --git a/packages/myddas/sqlite3/CMakeLists.txt b/packages/myddas/sqlite3/CMakeLists.txt index 0fd9e112c..863278b17 100644 --- a/packages/myddas/sqlite3/CMakeLists.txt +++ b/packages/myddas/sqlite3/CMakeLists.txt @@ -1,4 +1,4 @@ -message( " * Sqlite3 Data-Base (http://www.sqlite3ql.org), distributed with MYDDAS" ) +message( " * Sqlite3 Data-Base (http://www.sqlite3.org), distributed with MYDDAS" ) set (SQLITE_EXTRA chinook.db @@ -35,23 +35,27 @@ add_definitions(-DSQLITE_ENABLE_FTS5=1 ) SET_PROPERTY(DIRECTORY PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 ) -add_library( Yapsqlite3 OBJECT +if (ANDROID) +add_library( YAPsqlite3 OBJECT ${YAPSQLITE3_SOURCES} ) +else() -if (NOT ANDROID) -add_library( sqlite4YAP SHARED - src/sqlite3.c) + list(APPEND YAPSQLITE3_SOURCES src/sqlite3.c) -set_target_properties(sqlite4YAP + +add_library( YAPsqlite3 SHARED + ${YAPSQLITE3_SOURCES}) + + set_target_properties(YAPsqlite3 PROPERTIES # RPATH ${libdir} VERSION ${LIBYAPTAI_FULL_VERSION} # SOVERSION ${LIBYAPTAI_MAJOR_VERSION}.${LIBYAPTAI_MINOR_VERSION} - POSITION_INDEPENDENT_CODE TRUE - ) + POSITION_INDEPENDENT_CODE ON + PREFIX "" + ) - -install(TARGETS sqlite4YAP +install(TARGETS YAPsqlite3 RUNTIME DESTINATION ${YAP_INSTALL_DLLDIR} ARCHIVE DESTINATION ${YAP_INSTALL_DLLDIR} LIBRARY DESTINATION ${YAP_INSTALL_DLLDIR} diff --git a/packages/myddas/sqlite3/myddas_sqlite3.c b/packages/myddas/sqlite3/myddas_sqlite3.c index f4b4de05a..7df12c11d 100644 --- a/packages/myddas/sqlite3/myddas_sqlite3.c +++ b/packages/myddas/sqlite3/myddas_sqlite3.c @@ -36,7 +36,7 @@ int i; \ i = sqlite3_##f; \ if (i != SQLITE_OK) { \ - Yap_Error(EVALUATION_ERROR_DBMS, t, "%s failed with status %d: %s\n", \ + Yap_ThrowError(EVALUATION_ERROR_DBMS, MkStringTerm(#f), "%s failed with status %d: %s\n", \ #f, i, sqlite3_errmsg(db)); \ } \ } @@ -46,7 +46,7 @@ int i; \ i = sqlite3_##f; \ if (i != SQLITE_##x) { \ - fprintf(stderr, "%s failed with status %d: %s\n", #f, i, \ + Yap_ThrowError(EVALUATION_ERROR_DBMS, MkStringTerm(#f), "%s failed with status %d: %s\n", #f, i, \ sqlite3_errmsg(db)); \ exit(1); \ } \ @@ -489,7 +489,7 @@ static Int c_sqlite3_row_terminate(USES_REGS1) { struct result_set *res_set = rs->res_set; sqlite3 *db = res_set->db; // no more data - CALL_SQLITE(ARG1, finalize(res_set->stmt)); + CALL_SQLITE(Deref(ARG1), finalize(res_set->stmt)); free(res_set); free(rs); return true; @@ -667,7 +667,7 @@ static void Yap_InitBackMYDDAS_SQLITE3Preds(void) { // Yap_InitCPredBack("c_sqlite3_row", 3, 0, c_sqlite3_row_initialise, // c_sqlite3_row, c_sqlite3_row_terminate); Yap_InitCPred("c_sqlite3_row_initialise", 2, c_sqlite3_row_initialise, 0); - Yap_InitCPred("c_sqlite3_row_terminate", 1, c_sqlite3_row_terminate, 0); + Yap_InitCPred("c_sqlite3_row_terminate", 2, c_sqlite3_row_terminate, 0); Yap_InitCPredBack("c_sqlite3_row_get", 4, 0, c_sqlite3_row, c_sqlite3_row, 0); } diff --git a/packages/myddas/sqlite3/sqlitest.yap b/packages/myddas/sqlite3/sqlitest.yap index 540b1115d..532d888ef 100644 --- a/packages/myddas/sqlite3/sqlitest.yap +++ b/packages/myddas/sqlite3/sqlitest.yap @@ -12,7 +12,8 @@ main_ :- main_ . init :- - db_open(sqlite3, '/data/user/0/pt.up.yap.yapdroid/files/Yap/chinook.db', _, _), + % db_open(sqlite3, '/data/user/0/pt.up.yap.yapdroid/files/Yap/chinook.db', _, _), + db_open(sqlite3, 'chinook.db', _, _), writeln('chinook has landed'). go :- @@ -75,7 +76,6 @@ go :- writeln(X:Y). go_cut0 :- - start_low_level_trace, artists(X,Y), writeln(X:Y), !. diff --git a/pl/messages.yap b/pl/messages.yap index 8edd742c8..effdc541b 100644 --- a/pl/messages.yap +++ b/pl/messages.yap @@ -198,12 +198,13 @@ compose_message( halt, _Level) --> !, % syntax error. compose_message(error(E, Exc), Level) --> - { '$show_consult_level'(LC) }, + { '$show_consult_level'(LC), '$print_exception'(Exc) + }, location(error(E, Exc), Level, LC), main_message(error(E,Exc) , Level, LC ), - c_goal( Exc, Level ), - caller( Exc, Level ), - extra_info( Exc, Level ), + c_goal( error(E, Exc), Level ), + caller( error(E, Exc), Level ), + extra_info( error(E, Exc), Level ), !, [nl,nl]. compose_message( false, _Level) --> !, @@ -367,7 +368,7 @@ display_consulting( F, Level, _, LC) --> display_consulting(_F, _, _, _LC) --> []. -caller( error(_,Info), _) --> +caller( Info, _) --> { '$error_descriptor'(Info, Desc) }, ({ '$query_exception'(errorGoal, Desc, Call), Call = M:(H :- G) @@ -381,7 +382,7 @@ caller( error(_,Info), _) --> -> ['~*|by ~w' - [10,Call]] ; - true + [] ), { '$query_exception'(prologPredFile, Desc, File), File \= [], @@ -397,7 +398,7 @@ caller( error(_,Info), _) --> caller( _, _) --> []. -c_goal( error(_,Info), Level ) --> +c_goal( Info, Level ) --> { '$error_descriptor'(Info, Desc) }, { '$query_exception'(errorFile, Desc, File), Func \= [], @@ -980,6 +981,17 @@ Note: errors in the implementation of print_message/2 are very confusing to YAP (who will process the error?). So we write this small stub to ensure everything os ok +*/ +/* +/*:- dynamic in/0. +prolog:print_message(Severity, Msg) :- + \+ in, + assert(in), + start_low_level_trace, + ( prolog:print_message(Severity, Msg), fail; + stop_low_level_trace, + retract(in) + ).*/ */ prolog:print_message(Severity, Msg) :- ( @@ -995,7 +1007,7 @@ prolog:print_message(Severity, Msg) :- ; Severity == silent -> - true + [] ; '$pred_exists'(portray_message(_,_),user), user:portray_message(Severity, Msg) @@ -1045,7 +1057,7 @@ prolog:print_message(Severity, Term) :- prolog:print_message(_Severity, _Term) :- format(user_error,'failed to print ~w: ~w~n' ,[ _Severity, _Term]). -'$error_descriptor'( Info, Info ). +'$error_descriptor'( error(_,Info), Info ). /** diff --git a/pl/undefined.yap b/pl/undefined.yap index 583889636..d2125e996 100644 --- a/pl/undefined.yap +++ b/pl/undefined.yap @@ -138,7 +138,7 @@ undefined_query(G0, M0, Cut) :- '$handle_error'(Action,G0,M0) ). -%:- '$undefp_handler'('$undefp'(_,_), prolog). +:- '$undefp_handler'('$undefp'(_,_), prolog). /** @pred unknown(- _O_,+ _N_)