jobject JavaArgContainer::CreateJavaArgObject()

in language-extensions/java/src/JavaArgContainer.cpp [506:703]


jobject JavaArgContainer::CreateJavaArgObject(JNIEnv *env, const JavaArg *arg)
{
	jobject obj = nullptr;

	switch (arg->GetType())
	{
	case SQL_C_SLONG:
	{
		jint javaData = *(reinterpret_cast<const int*>(arg->GetValue()));

		jclass objectClass = env->FindClass("java/lang/Integer");

		jmethodID init = env->GetMethodID(objectClass, "<init>", "(I)V");

		obj = env->NewObject(objectClass, init, javaData);

		break;
	}
	case SQL_C_BIT:
	{
		jboolean javaData = *(reinterpret_cast<const bool*>(arg->GetValue()));

		jclass objectClass = env->FindClass("java/lang/Boolean");
		jmethodID init = env->GetMethodID(objectClass, "<init>", "(Z)V");

		obj = env->NewObject(objectClass, init, javaData);

		break;
	}
	case SQL_C_DOUBLE:
	{
		jdouble javaData = *(reinterpret_cast<const double*>(arg->GetValue()));

		jclass objectClass = env->FindClass("java/lang/Double");
		jmethodID init = env->GetMethodID(objectClass, "<init>", "(D)V");

		obj = env->NewObject(objectClass, init, javaData);

		break;
	}
	case SQL_C_FLOAT:
	{
		jfloat javaData = *(reinterpret_cast<const float*>(arg->GetValue()));

		jclass objectClass = env->FindClass("java/lang/Float");
		jmethodID init = env->GetMethodID(objectClass, "<init>", "(F)V");

		obj = env->NewObject(objectClass, init, javaData);

		break;
	}

	case SQL_C_SBIGINT:
	{
		jlong javaData = *(reinterpret_cast<const long long*>(arg->GetValue()));

		jclass objectClass = env->FindClass("java/lang/Long");
		jmethodID init = env->GetMethodID(objectClass, "<init>", "(J)V");

		obj = env->NewObject(objectClass, init, javaData);

		break;
	}
	case SQL_C_UTINYINT:
	{
		const unsigned char data = *(reinterpret_cast<const unsigned char*>(arg->GetValue()));
		jshort javaData = static_cast<short>(data);

		jclass objectClass = env->FindClass("java/lang/Short");
		jmethodID init = env->GetMethodID(objectClass, "<init>", "(S)V");

		obj = env->NewObject(objectClass, init, javaData);

		break;
	}
	case SQL_C_SSHORT:
	{
		jshort javaData = *(reinterpret_cast<const short*>(arg->GetValue()));

		jclass objectClass = env->FindClass("java/lang/Short");
		jmethodID init = env->GetMethodID(objectClass, "<init>", "(S)V");

		obj = env->NewObject(objectClass, init, javaData);

		break;
	}
	case SQL_C_CHAR:
	{
		obj = JniTypeHelper::CreateString<true>(env, arg->GetValue(), arg->GetStrLenOrInd());

		break;
	}
	case SQL_C_WCHAR:
	{
		// Get the length of the unicode string, the size is the total number of bytes and
		// unicode characters are two bytes wide.
		//
		jsize strLen = static_cast<jsize>(arg->GetStrLenOrInd() / sizeof(jchar));
		const jchar *data = reinterpret_cast<const jchar*>(arg->GetValue());

		obj = static_cast<jobject>(env->NewString(data, strLen));

		break;
	}
	case SQL_C_BINARY:
	{
		jsize jSize = static_cast<jsize>(arg->GetStrLenOrInd());

		// Create a new java binary string
		//
		jbyteArray jArr = env->NewByteArray(jSize);

		// Copy the data into the java array
		//
		env->SetByteArrayRegion(jArr, 0, jSize, static_cast<jbyte*>(arg->GetValue()));

		obj = static_cast<jobject>(jArr);

		break;
	}
	case SQL_C_GUID:
	{
		const SQLGUID *odbcGuid = reinterpret_cast<const SQLGUID*>(arg->GetValue());

		// Convert the guid to string
		//
		string guidString = JniTypeHelper::ConvertGuidToString(odbcGuid);

		obj = static_cast<jobject>(env->NewStringUTF(guidString.c_str()));

		break;
	}
	case SQL_C_TYPE_DATE:
	{
		const SQL_DATE_STRUCT *odbcDate = reinterpret_cast<const SQL_DATE_STRUCT*>(arg->GetValue());

		// Convert the ODBC date to java.sql.date
		//
		jclass dateClass = env->FindClass("java/sql/Date");
		jmethodID dateMethod = env->GetStaticMethodID(dateClass,
													  "valueOf",
													  "(Ljava/lang/String;)Ljava/sql/Date;");

		JniTypeHelper::DateStructToJavaSqlDate(env,
											   odbcDate,
											   dateClass,
											   dateMethod,
											   obj);

		break;
	}
	case SQL_C_NUMERIC:
	{
		const SQL_NUMERIC_STRUCT *odbcNumeric = static_cast<SQL_NUMERIC_STRUCT*>(arg->GetValue());

		jclass bigDecimalClass = env->FindClass("java/math/BigDecimal");
		jclass bigIntegerClass = env->FindClass("java/math/BigInteger");
		jmethodID bigIntegerCtor = JniHelper::FindMethod(env, bigIntegerClass, "<init>", "(I[B)V");
		jmethodID bigDecimalCtor = JniHelper::FindMethod(env,
														 bigDecimalClass,
														 "<init>",
														 "(Ljava/math/BigInteger;I)V");

		JniTypeHelper::NumericStructToBigDecimal(env,
												 odbcNumeric,
												 arg->GetDecimalDigits(),
												 bigDecimalClass,
												 bigDecimalCtor,
												 bigIntegerClass,
												 bigIntegerCtor,
												 obj);

		break;
	}
	case SQL_C_TYPE_TIMESTAMP:
	{
		const SQL_TIMESTAMP_STRUCT *odbcTimestamp =
			static_cast<SQL_TIMESTAMP_STRUCT*>(arg->GetValue());

		jclass timestampClass = env->FindClass("java/sql/Timestamp");
		jmethodID tsValueOfMethod = env->GetStaticMethodID(timestampClass,
														   "valueOf",
														   "(Ljava/lang/String;)Ljava/sql/Timestamp;");

		JniTypeHelper::TimestampStructToJavaTimestamp(env,
													  odbcTimestamp,
													  timestampClass,
													  tsValueOfMethod,
													  obj);

		break;
	}
	default:
		throw runtime_error("Unsupported parameter type encountered");
	}

	return obj;
}