static void buildSignature(Function self, StringInfo sign, Type retType, bool alt) { Type* tp = self->func.nonudt.paramTypes; Type* ep = tp + self->func.nonudt.numParams; appendStringInfoChar(sign, '('); while(tp < ep) appendStringInfoString(sign, Type_getJNISignature(*tp++)); if(!self->func.nonudt.isMultiCall && Type_isOutParameter(retType)) appendStringInfoString(sign, Type_getJNISignature(retType)); appendStringInfoChar(sign, ')'); appendStringInfoString(sign, Type_getJNIReturnSignature(retType, self->func.nonudt.isMultiCall, alt)); }
Type Array_fromOid2(Oid typeId, Type elementType, DatumCoercer coerceDatum, ObjectCoercer coerceObject) { Type self; TypeClass arrayClass; const char* elemClassName = PgObjectClass_getName(PgObject_getClass((PgObject)elementType)); const char* elemJNISignature = Type_getJNISignature(elementType); const char* elemJavaTypeName = Type_getJavaTypeName(elementType); MemoryContext currCtx = MemoryContextSwitchTo(TopMemoryContext); char* tmp = palloc(strlen(elemClassName) + 3); sprintf(tmp, "%s[]", elemClassName); arrayClass = TypeClass_alloc(tmp); tmp = palloc(strlen(elemJNISignature) + 2); sprintf(tmp, "[%s", elemJNISignature); arrayClass->JNISignature = tmp; tmp = palloc(strlen(elemJavaTypeName) + 3); sprintf(tmp, "%s[]", elemJavaTypeName); arrayClass->javaTypeName = tmp; arrayClass->coerceDatum = coerceDatum; arrayClass->coerceObject = coerceObject; arrayClass->canReplaceType = _Array_canReplaceType; self = TypeClass_allocInstance(arrayClass, typeId); MemoryContextSwitchTo(currCtx); self->elementType = elementType; Type_registerType(arrayClass->javaTypeName, self); if(Type_isPrimitive(elementType)) self->objectType = Array_fromOid(typeId, Type_getObjectType(elementType)); return self; }
static const char* _Type_getJNIReturnSignature(Type self, bool forMultiCall, bool useAltRepr) { return forMultiCall ? "Ljava/util/Iterator;" : Type_getJNISignature(self); }