Type Type_fromJavaType(Oid typeId, const char* javaTypeName) { CacheEntry ce = (CacheEntry)HashMap_getByString(s_obtainerByJavaName, javaTypeName); if(ce == 0) { int jtlen = strlen(javaTypeName) - 2; if(jtlen > 0 && strcmp("[]", javaTypeName + jtlen) == 0) { Type type; char* elemName = palloc(jtlen+1); memcpy(elemName, javaTypeName, jtlen); elemName[jtlen] = 0; type = Type_getArrayType(Type_fromJavaType(InvalidOid, elemName), typeId); pfree(elemName); return type; } ereport(ERROR, ( errcode(ERRCODE_CANNOT_COERCE), errmsg("No java type mapping installed for \"%s\"", javaTypeName))); } return ce->type == 0 ? ce->obtainer(typeId == InvalidOid ? ce->typeId : typeId) : ce->type; }
/* * Append those parts of path that has not yet been appended. The HashMap unique is * keeping track of what has been appended already. First appended part will be * prefixed with prefix. */ static void appendPathParts(const char* path, StringInfoData* bld, HashMap unique, const char* prefix) { StringInfoData buf; if(path == 0 || strlen(path) == 0) return; for (;;) { char* pathPart; size_t len; if(*path == 0) break; len = strcspn(path, ";:"); if(len == 1 && *(path+1) == ':' && isalnum(*path)) /* * Windows drive designator, leave it "as is". */ len = strcspn(path+2, ";:") + 2; else if(len == 0) { /* Ignore zero length components. */ ++path; continue; } initStringInfo(&buf); if(*path == '$') { if(len == 7 || (strcspn(path, "/\\") == 7 && strncmp(path, "$libdir", 7) == 0)) { char pathbuf[MAXPGPATH]; get_pkglib_path(my_exec_path, pathbuf); len -= 7; path += 7; appendStringInfoString(&buf, pathbuf); } else ereport(ERROR, ( errcode(ERRCODE_INVALID_NAME), errmsg("invalid macro name '%*s' in PL/Java classpath", (int)len, path))); } if(len > 0) { appendBinaryStringInfo(&buf, path, (int)len); path += len; } pathPart = buf.data; if(HashMap_getByString(unique, pathPart) == 0) { if(HashMap_size(unique) == 0) appendStringInfo(bld, "%s", prefix); else #if defined(WIN32) appendStringInfoChar(bld, ';'); #else appendStringInfoChar(bld, ':'); #endif appendStringInfo(bld, "%s", pathPart); HashMap_putByString(unique, pathPart, (void*)1); } pfree(pathPart); if(*path == 0) break; ++path; /* Skip ':' */ } }