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

Reply via email to