See More

/* * Copyright (c) 2004, 2005, 2006 TADA AB - Taby Sweden * Distributed under the terms shown in the file COPYRIGHT * found in the root folder of this project or at * http://eng.tada.se/osprojects/COPYRIGHT.html * * @author Thomas Hallgren */ #include #include #include "pljava/Backend.h" #include "pljava/Invocation.h" #include "pljava/Exception.h" #include "pljava/type/String.h" #include "pljava/type/ErrorData.h" jclass Class_class; jmethodID Class_getName; jclass ServerException_class; jmethodID ServerException_getErrorData; jmethodID ServerException_init; jclass Throwable_class; jmethodID Throwable_getMessage; jmethodID Throwable_printStackTrace; jclass IllegalArgumentException_class; jmethodID IllegalArgumentException_init; jclass SQLException_class; jmethodID SQLException_init; jmethodID SQLException_getSQLState; jclass UnsupportedOperationException_class; jmethodID UnsupportedOperationException_init; void Exception_featureNotSupported(const char* requestedFeature, const char* introVersion) { jstring jmsg; jobject ex; StringInfoData buf; initStringInfo(&buf); PG_TRY(); { appendStringInfoString(&buf, "Feature: "); appendStringInfoString(&buf, requestedFeature); appendStringInfoString(&buf, " lacks support in PostgreSQL version "); appendStringInfo(&buf, "%d.%d", PGSQL_MAJOR_VER, PGSQL_MINOR_VER); appendStringInfoString(&buf, ". It was introduced in version "); appendStringInfoString(&buf, introVersion); ereport(DEBUG3, (errmsg(buf.data))); jmsg = String_createJavaStringFromNTS(buf.data); ex = JNI_newObject(UnsupportedOperationException_class, UnsupportedOperationException_init, jmsg); JNI_deleteLocalRef(jmsg); JNI_throw(ex); } PG_CATCH(); { ereport(WARNING, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("Exception while generating exception: %s", buf.data))); } PG_END_TRY(); pfree(buf.data); } void Exception_throw(int errCode, const char* errMessage, ...) { char buf[1024]; va_list args; jstring message; jstring sqlState; jobject ex; int idx; va_start(args, errMessage); vsnprintf(buf, sizeof(buf), errMessage, args); ereport(DEBUG3, (errcode(errCode), errmsg(buf))); PG_TRY(); { message = String_createJavaStringFromNTS(buf); /* unpack MAKE_SQLSTATE code */ for (idx = 0; idx < 5; ++idx) { buf[idx] = PGUNSIXBIT(errCode); errCode >>= 6; } buf[idx] = 0; sqlState = String_createJavaStringFromNTS(buf); ex = JNI_newObject(SQLException_class, SQLException_init, message, sqlState); JNI_deleteLocalRef(message); JNI_deleteLocalRef(sqlState); JNI_throw(ex); } PG_CATCH(); { ereport(WARNING, (errcode(errCode), errmsg("Exception while generating exception: %s", buf))); } PG_END_TRY(); va_end(args); } void Exception_throwIllegalArgument(const char* errMessage, ...) { char buf[1024]; va_list args; jstring message; jobject ex; va_start(args, errMessage); vsnprintf(buf, sizeof(buf), errMessage, args); ereport(DEBUG3, (errmsg(buf))); PG_TRY(); { message = String_createJavaStringFromNTS(buf); ex = JNI_newObject(IllegalArgumentException_class, IllegalArgumentException_init, message); JNI_deleteLocalRef(message); JNI_throw(ex); } PG_CATCH(); { ereport(WARNING, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("Exception while generating exception: %s", buf))); } PG_END_TRY(); va_end(args); } void Exception_throwSPI(const char* function, int errCode) { Exception_throw(ERRCODE_INTERNAL_ERROR, "SPI function SPI_%s failed with error %s", function, SPI_result_code_string(errCode)); } void Exception_throw_ERROR(const char* funcName) { jobject ex; PG_TRY(); { jobject ed = ErrorData_getCurrentError(); FlushErrorState(); ex = JNI_newObject(ServerException_class, ServerException_init, ed); currentInvocation->errorOccured = true; elog(DEBUG1, "Exception in function %s", funcName); JNI_deleteLocalRef(ed); JNI_throw(ex); } PG_CATCH(); { elog(WARNING, "Exception while generating exception"); } PG_END_TRY(); } extern void Exception_initialize(void); void Exception_initialize(void) { Class_class = (jclass)JNI_newGlobalRef(PgObject_getJavaClass("java/lang/Class")); Throwable_class = (jclass)JNI_newGlobalRef(PgObject_getJavaClass("java/lang/Throwable")); Throwable_getMessage = PgObject_getJavaMethod(Throwable_class, "getMessage", "()Ljava/lang/String;"); Throwable_printStackTrace = PgObject_getJavaMethod(Throwable_class, "printStackTrace", "()V"); IllegalArgumentException_class = (jclass)JNI_newGlobalRef(PgObject_getJavaClass("java/lang/IllegalArgumentException")); IllegalArgumentException_init = PgObject_getJavaMethod(IllegalArgumentException_class, "", "(Ljava/lang/String;)V"); SQLException_class = (jclass)JNI_newGlobalRef(PgObject_getJavaClass("java/sql/SQLException")); SQLException_init = PgObject_getJavaMethod(SQLException_class, "", "(Ljava/lang/String;Ljava/lang/String;)V"); SQLException_getSQLState = PgObject_getJavaMethod(SQLException_class, "getSQLState", "()Ljava/lang/String;"); UnsupportedOperationException_class = (jclass)JNI_newGlobalRef(PgObject_getJavaClass("java/lang/UnsupportedOperationException")); UnsupportedOperationException_init = PgObject_getJavaMethod(UnsupportedOperationException_class, "", "(Ljava/lang/String;)V"); Class_getName = PgObject_getJavaMethod(Class_class, "getName", "()Ljava/lang/String;"); } extern void Exception_initialize2(void); void Exception_initialize2(void) { ServerException_class = (jclass)JNI_newGlobalRef(PgObject_getJavaClass("org/postgresql/pljava/internal/ServerException")); ServerException_init = PgObject_getJavaMethod(ServerException_class, "", "(Lorg/postgresql/pljava/internal/ErrorData;)V"); ServerException_getErrorData = PgObject_getJavaMethod(ServerException_class, "getErrorData", "()Lorg/postgresql/pljava/internal/ErrorData;"); }