void InstallHelper_groundwork() { Invocation ctx; Invocation_pushInvocation(&ctx, false); ctx.function = Function_INIT_WRITER; PG_TRY(); { char const *lpt = LOADPATH_TBL_NAME; char const *lptq = quote_identifier(lpt); jstring pljlp = String_createJavaStringFromNTS(pljavaLoadPath); jstring jlpt = String_createJavaStringFromNTS(lpt); jstring jlptq = String_createJavaStringFromNTS(lptq); if ( lptq != lpt ) pfree((void *)lptq); JNI_callStaticVoidMethod( s_InstallHelper_class, s_InstallHelper_groundwork, pljlp, jlpt, jlptq, pljavaLoadingAsExtension ? JNI_TRUE : JNI_FALSE, extensionExNihilo ? JNI_TRUE : JNI_FALSE); JNI_deleteLocalRef(pljlp); JNI_deleteLocalRef(jlpt); JNI_deleteLocalRef(jlptq); Invocation_popInvocation(false); } PG_CATCH(); { Invocation_popInvocation(true); PG_RE_THROW(); } PG_END_TRY(); }
static Datum internalCallHandler(bool trusted, PG_FUNCTION_ARGS) { Invocation ctx; Datum retval = 0; if ( IS_COMPLETE != initstage ) { /* * Just in case it could be helpful in offering diagnostics later, hang * on to an Oid that is known to refer to PL/Java (because it got here). * It's cheap, and can be followed back to the right language and * handler function entries later if needed. */ *(trusted ? &pljavaTrustedOid : &pljavaUntrustedOid) = fcinfo->flinfo->fn_oid; initsequencer( initstage, false); /* Force initial setting */ s_currentTrust = !trusted; } Invocation_pushInvocation(&ctx, trusted); PG_TRY(); { Function function = Function_getFunction(fcinfo); if(CALLED_AS_TRIGGER(fcinfo)) { /* Called as a trigger procedure */ retval = Function_invokeTrigger(function, fcinfo); } else { /* Called as a function */ retval = Function_invoke(function, fcinfo); } Invocation_popInvocation(false); } PG_CATCH(); { Invocation_popInvocation(true); PG_RE_THROW(); } PG_END_TRY(); return retval; }
void InstallHelper_groundwork() { Invocation ctx; Invocation_pushInvocation(&ctx, false); ctx.function = Function_INIT_WRITER; PG_TRY(); { jstring pljlp = String_createJavaStringFromNTS(pljavaLoadPath); JNI_callStaticVoidMethod( s_InstallHelper_class, s_InstallHelper_groundwork, pljlp, pljavaLoadingAsExtension ? JNI_TRUE : JNI_FALSE, extensionExNihilo ? JNI_TRUE : JNI_FALSE); Invocation_popInvocation(false); } PG_CATCH(); { Invocation_popInvocation(true); PG_RE_THROW(); } PG_END_TRY(); }
static Datum internalCallHandler(bool trusted, PG_FUNCTION_ARGS) { Invocation ctx; Datum retval = 0; #ifdef USE_PLJAVA_SIGHANDLERS /* * Substitute SIGUSR1 handler CatchupInterruptHandler with new local * handler PLCatchupInterruptHandler, which will strictly let main * thread of GPDB to process the signal rather than any other threads. * * Resolving possible lwlock releasing crash caused by SIGUSR1. * MPP-23735 */ if(!s_handlerSubstituted) { s_mainThreadIdForHandler = pthread_self(); s_oldHandlerFunc = pqsignal(SIGUSR1, PLCatchupInterruptHandler); s_handlerSubstituted = true; } #endif /* * Just in case it could be helpful in offering diagnostics later, hang * on to an Oid that is known to refer to PL/Java (because it got here). * It's cheap, and can be followed back to the right language and * handler function entries later if needed. */ *(trusted ? &pljavaTrustedOid : &pljavaUntrustedOid) = fcinfo->flinfo->fn_oid; if ( IS_COMPLETE != initstage ) { initsequencer( initstage, false); /* Force initial setting */ s_currentTrust = !trusted; } Invocation_pushInvocation(&ctx, trusted); PG_TRY(); { Function function = Function_getFunction(fcinfo); if(CALLED_AS_TRIGGER(fcinfo)) { /* Called as a trigger procedure */ retval = Function_invokeTrigger(function, fcinfo); } else { /* Called as a function */ retval = Function_invoke(function, fcinfo); } Invocation_popInvocation(false); } PG_CATCH(); { Invocation_popInvocation(true); PG_RE_THROW(); } PG_END_TRY(); return retval; }