/* * Register this type. */ static void _registerType(Oid typeId, const char* javaTypeName, Type type, TypeObtainer obtainer) { CacheEntry ce = (CacheEntry)MemoryContextAlloc(TopMemoryContext, sizeof(CacheEntryData)); ce->typeId = typeId; ce->type = type; ce->obtainer = obtainer; if(javaTypeName != 0) HashMap_putByString(s_obtainerByJavaName, javaTypeName, ce); if(typeId != InvalidOid && HashMap_getByOid(s_obtainerByOid, typeId) == 0) HashMap_putByOid(s_obtainerByOid, typeId, ce); }
/* * 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 ':' */ } }