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;
}