static Datum _doubleArray_coerceObject(Type self, jobject doubleArray) { ArrayType* v; jsize nElems; if(doubleArray == 0) return 0; nElems = JNI_getArrayLength((jarray)doubleArray); #if (PGSQL_MAJOR_VER == 8 && PGSQL_MINOR_VER < 2) v = createArrayType(nElems, sizeof(jdouble), FLOAT8OID); #else v = createArrayType(nElems, sizeof(jdouble), FLOAT8OID, false); #endif if(!JNI_isInstanceOf( doubleArray, s_DoubleArray_class)) JNI_getDoubleArrayRegion((jdoubleArray)doubleArray, 0, nElems, (jdouble*)ARR_DATA_PTR(v)); else { int idx = 0; jdouble *array = (jdouble*)ARR_DATA_PTR(v); for(idx = 0; idx < nElems; ++idx) { array[idx] = JNI_callDoubleMethod(JNI_getObjectArrayElement(doubleArray, idx), s_Double_doubleValue); } } PG_RETURN_ARRAYTYPE_P(v); }
static Datum _booleanArray_coerceObject(Type self, jobject booleanArray) { ArrayType* v; jsize nElems; if(booleanArray == 0) return 0; nElems = JNI_getArrayLength((jarray)booleanArray); v = createArrayType(nElems, sizeof(jboolean), BOOLOID, false); JNI_getBooleanArrayRegion((jbooleanArray)booleanArray, 0, nElems, (jboolean*)ARR_DATA_PTR(v)); PG_RETURN_ARRAYTYPE_P(v); }
static Datum _intArray_coerceObject(Type self, jobject intArray) { ArrayType* v; jsize nElems; if(intArray == 0) return 0; nElems = JNI_getArrayLength((jarray)intArray); v = createArrayType(nElems, sizeof(jint), INT4OID, false); JNI_getIntArrayRegion((jintArray)intArray, 0, nElems, (jint*)ARR_DATA_PTR(v)); PG_RETURN_ARRAYTYPE_P(v); }
static Datum _byte_array_coerceObject(Type self, jobject byteArray) { bytea* bytes = 0; if(byteArray == 0) return 0; if(JNI_isInstanceOf(byteArray, s_byteArray_class)) { jsize length = JNI_getArrayLength((jarray)byteArray); int32 byteaSize = length + VARHDRSZ; bytes = (bytea*)palloc(byteaSize); #if (PGSQL_MAJOR_VER == 8 && PGSQL_MINOR_VER < 3) VARATT_SIZEP(bytes) = byteaSize; #else SET_VARSIZE(bytes, byteaSize); #endif JNI_getByteArrayRegion((jbyteArray)byteArray, 0, length, (jbyte*)VARDATA(bytes)); } else if(JNI_isInstanceOf(byteArray, s_BlobValue_class)) { jobject byteBuffer; int32 byteaSize; jlong length = JNI_callLongMethod(byteArray, s_BlobValue_length); byteaSize = (int32)(length + VARHDRSZ); bytes = (bytea*)palloc(byteaSize); #if (PGSQL_MAJOR_VER == 8 && PGSQL_MINOR_VER < 3) VARATT_SIZEP(bytes) = byteaSize; #else SET_VARSIZE(bytes, byteaSize); #endif byteBuffer = JNI_newDirectByteBuffer((void*)VARDATA(bytes), length); if(byteBuffer != 0) JNI_callVoidMethod(byteArray, s_BlobValue_getContents, byteBuffer); JNI_deleteLocalRef(byteBuffer); } else { Exception_throwIllegalArgument("Not coercable to bytea"); } PG_RETURN_BYTEA_P(bytes); }
static Datum _Array_coerceObject(Type self, jobject objArray) { ArrayType* v; jsize idx; int lowerBound = 1; Type elemType = Type_getElementType(self); int nElems = (int)JNI_getArrayLength((jarray)objArray); Datum* values = (Datum*)palloc(nElems * sizeof(Datum) + nElems * sizeof(bool)); bool* nulls = (bool*)(values + nElems); for(idx = 0; idx < nElems; ++idx) { jobject obj = JNI_getObjectArrayElement(objArray, idx); if(obj == 0) { nulls[idx] = true; values[idx] = 0; } else { nulls[idx] = false; values[idx] = Type_coerceObject(elemType, obj); JNI_deleteLocalRef(obj); } } v = construct_md_array( values, nulls, 1, &nElems, &lowerBound, Type_getOid(elemType), Type_getLength(elemType), Type_isByValue(elemType), Type_getAlign(elemType)); pfree(values); PG_RETURN_ARRAYTYPE_P(v); }