static jint initializeJavaVM(JVMOptList *optList) { jint jstat; JavaVMInitArgs vm_args; if(pljava_debug) { elog(INFO, "Backend pid = %d. Attach the debugger and set pljava_debug to false to continue", getpid()); while(pljava_debug) pg_usleep(1000000L); } vm_args.nOptions = optList->size; vm_args.options = optList->options; vm_args.version = JNI_VERSION_1_4; vm_args.ignoreUnrecognized = JNI_FALSE; elog(DEBUG2, "creating Java virtual machine"); jstat = JNI_createVM(&s_javaVM, &vm_args); if(jstat == JNI_OK && JNI_exceptionCheck()) { JNI_exceptionDescribe(); JNI_exceptionClear(); jstat = JNI_ERR; } JVMOptList_delete(optList); return jstat; }
Datum Function_invokeTrigger(Function self, PG_FUNCTION_ARGS) { jvalue arg; Datum ret; arg.l = TriggerData_create((TriggerData*)fcinfo->context); if(arg.l == 0) return 0; currentInvocation->function = self; Type_invoke(self->func.nonudt.returnType, self->clazz, self->func.nonudt.method, &arg, fcinfo); fcinfo->isnull = false; if(JNI_exceptionCheck()) ret = 0; else { /* A new Tuple may or may not be created here. If it is, ensure that * it is created in the upper SPI context. */ MemoryContext currCtx = Invocation_switchToUpperContext(); ret = PointerGetDatum(TriggerData_getTriggerReturnTuple(arg.l, &fcinfo->isnull)); /* Triggers are not allowed to set the fcinfo->isnull, even when * they return null. */ fcinfo->isnull = false; MemoryContextSwitchTo(currCtx); } JNI_deleteLocalRef(arg.l); return ret; }
/** * Initialize the session */ static void initJavaSession(void) { jclass sessionClass = PgObject_getJavaClass("org/postgresql/pljava/internal/Session"); jmethodID init = PgObject_getStaticJavaMethod(sessionClass, "init", "()J"); mainThreadId = JNI_callStaticLongMethod(sessionClass, init); JNI_deleteLocalRef(sessionClass); if(JNI_exceptionCheck()) { JNI_exceptionDescribe(); JNI_exceptionClear(); ereport(ERROR, ( errcode(ERRCODE_INTERNAL_ERROR), errmsg("Unable to initialize java session"))); } }
/** * Initialize security */ void Backend_setJavaSecurity(bool trusted) { if(trusted != s_currentTrust) { /* GCJ has major issues here. Real work on SecurityManager and * related classes has just started in version 4.0.0. */ #ifndef GCJ JNI_callStaticVoidMethod(s_Backend_class, s_setTrusted, (jboolean)trusted); if(JNI_exceptionCheck()) { JNI_exceptionDescribe(); JNI_exceptionClear(); ereport(ERROR, ( errcode(ERRCODE_INTERNAL_ERROR), errmsg("Unable to initialize java security"))); } #endif s_currentTrust = trusted; } }
Datum _String_coerceObject(Type self, jobject jstr) { char* tmp; Datum ret; if(jstr == 0) return 0; jstr = JNI_callObjectMethod(jstr, s_Object_toString); if(JNI_exceptionCheck()) return 0; tmp = String_createNTS(jstr); JNI_deleteLocalRef(jstr); ret = FunctionCall3( &((String)self)->textInput, CStringGetDatum(tmp), ObjectIdGetDatum(((String)self) -> Type_extension.typeId /* elementType */ ), Int32GetDatum(-1)); pfree(tmp); return ret; }