Changeset: df2d480e8c3c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=df2d480e8c3c
Modified Files:
monetdb5/extras/pyapi/connection.c
monetdb5/extras/pyapi/connection.h
monetdb5/extras/pyapi/pyapi.c
monetdb5/extras/pyapi/pyapi.h
Branch: jit
Log Message:
Merge with default
diffs (121 lines):
diff --git a/monetdb5/extras/pyapi/connection.c
b/monetdb5/extras/pyapi/connection.c
--- a/monetdb5/extras/pyapi/connection.c
+++ b/monetdb5/extras/pyapi/connection.c
@@ -262,13 +262,23 @@ PyObject *Py_Connection_Create(Client cn
return (PyObject*) op;
}
-void _connection_init(void)
+static void _connection_import_array(void) {
+ import_array();
+}
+
+str _connection_init(void)
{
- import_array();
+ str msg = MAL_SUCCEED;
+ _connection_import_array();
LOAD_SQL_FUNCTION_PTR(SQLdestroyResult, "lib_sql.dll");
LOAD_SQL_FUNCTION_PTR(SQLstatementIntern, "lib_sql.dll");
+ if (msg != MAL_SUCCEED) {
+ return msg;
+ }
+
if (PyType_Ready(&Py_ConnectionType) < 0)
- return;
+ return createException(MAL, "pyapi.eval", "Failed to initialize
connection type.");
+ return msg;
}
diff --git a/monetdb5/extras/pyapi/connection.h
b/monetdb5/extras/pyapi/connection.h
--- a/monetdb5/extras/pyapi/connection.h
+++ b/monetdb5/extras/pyapi/connection.h
@@ -31,7 +31,7 @@ extern PyTypeObject Py_ConnectionType;
PyObject *Py_Connection_Create(Client cntxt, bit mapped, QueryStruct
*query_ptr, int query_sem);
-void _connection_init(void);
+str _connection_init(void);
char* _connection_query(Client cntxt, char* query, res_table** result);
void _connection_cleanup_result(void* output);
diff --git a/monetdb5/extras/pyapi/pyapi.c b/monetdb5/extras/pyapi/pyapi.c
--- a/monetdb5/extras/pyapi/pyapi.c
+++ b/monetdb5/extras/pyapi/pyapi.c
@@ -439,8 +439,8 @@ str ConvertToSQLType(Client cntxt, BAT *
//! [RETURN_VALUES] Step 4: It collects the return values and converts them
back into BATs
//! If 'mapped' is set to True, it will fork a separate process at
[FORK_PROCESS] that executes Step 1-3, the process will then write the return
values into memory mapped files and exit, then Step 4 is executed by the main
process
str PyAPIeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, bit
grouped, bit mapped) {
- sql_func * sqlfun = *(sql_func**) getArgReference(stk, pci, pci->retc);
- str exprStr = *getArgReference_str(stk, pci, pci->retc + 1);
+ sql_func * sqlfun;
+ str exprStr;
const int additional_columns = 3;
int i = 1, ai = 0;
@@ -466,8 +466,8 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
void **mmap_ptrs = NULL;
size_t *mmap_sizes = NULL;
#endif
- bit varres = sqlfun ? sqlfun->varres : 0;
- int retcols = !varres ? pci->retc : -1;
+ bit varres;
+ int retcols;
bool gstate = 0;
int unnamedArgs = 0;
bit parallel_aggregation = grouped && mapped;
@@ -485,6 +485,16 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
pyapi_enableflag);
}
+ if (!pyapiInitialized) {
+ throw(MAL, "pyapi.eval",
+ "Embedded Python is enabled but an error was thrown during
initialization.");
+ }
+
+ sqlfun = *(sql_func**) getArgReference(stk, pci, pci->retc);
+ exprStr = *getArgReference_str(stk, pci, pci->retc + 1);
+ varres = sqlfun ? sqlfun->varres : 0;
+ retcols = !varres ? pci->retc : -1;
+
VERBOSE_MESSAGE("PyAPI Start\n");
args = (str*) GDKzalloc(pci->argc * sizeof(str));
@@ -1609,11 +1619,12 @@ str
if (PyAPIEnabled()) {
MT_lock_set(&pyapiLock);
if (!pyapiInitialized) {
+ str msg = MAL_SUCCEED;
char* iar = NULL;
Py_Initialize();
PyRun_SimpleString("import numpy");
import_array1(iar);
- _connection_init();
+ msg = _connection_init();
marshal_module = PyImport_Import(PyString_FromString("marshal"));
if (marshal_module == NULL) {
return createException(MAL, "pyapi.eval", "Failed to load
Marshal module.");
@@ -1636,6 +1647,10 @@ str
LOAD_SQL_FUNCTION_PTR(batstr_2_date, "lib_sql.dll");
LOAD_SQL_FUNCTION_PTR(batdbl_num2dec_lng, "lib_sql.dll");
LOAD_SQL_FUNCTION_PTR(SQLbatstr_cast, "lib_sql.dll");
+ if (msg != MAL_SUCCEED) {
+ MT_lock_unset(&pyapiLock);
+ return msg;
+ }
pyapiInitialized++;
}
MT_lock_unset(&pyapiLock);
diff --git a/monetdb5/extras/pyapi/pyapi.h b/monetdb5/extras/pyapi/pyapi.h
--- a/monetdb5/extras/pyapi/pyapi.h
+++ b/monetdb5/extras/pyapi/pyapi.h
@@ -110,7 +110,7 @@ pyapi_export void* lookup_function(char
#define LOAD_SQL_FUNCTION_PTR(fcnname,libname)
\
fcnname##_ptr = (fcnname##_ptr_tpe) lookup_function(#fcnname, libname);
\
if (fcnname##_ptr == NULL) { \
- WARNING_MESSAGE("Failed to load function %s", #fcnname);
\
+ msg = createException(MAL, "pyapi.eval", "Failed to load function %s",
#fcnname); \
}
#endif /* _PYPI_LIB_ */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list