=== plproxy.get_cluster_version(cluster_name) ===
-----------------------
+---------------------
plproxy.get_cluster_version(cluster_name text)
returns integer
----------------------
with same name. Its better to just add the parameter to
connect string.
+ default_user::
+
+ Either `current_user` (default) or `session_user`. They have same
+ meaning as SQL tokens. The specified user is used to look up SQL/MED
+ user mapping. In case of non-SQL/MED cluster, the user is put directly
+ to connect string, unless there already exist `user=` key. The user is
+ also used to cache the connections. Thus PL/Proxy 2.4+ supports connecting
+ to single cluster from same backend with different users.
+ +
+ *Deprecated*: it's use is to restore pre-2.4 default of `session_user`.
Example function without the use of separate tables for storing parameters.
cf->keepintvl = atoi(val);
else if (pg_strcasecmp("keepalive_count", key) == 0)
cf->keepcnt = atoi(val);
+ else if (pg_strcasecmp("default_user", key) == 0)
+ snprintf(cf->default_user, sizeof(cf->default_user), "%s", val);
else
plproxy_error(func, "Unknown config param: %s", key);
}
refresh_cluster(ProxyFunction *func, ProxyCluster *cluster)
{
ConnUserInfo *uinfo;
+ ProxyConfig *cf = &cluster->config;
Oid user_oid;
/*
- * Use current_user to pick user mapping
+ * Decide which user to use for connections.
*/
- user_oid = GetUserId();
+ if (cf->default_user[0])
+ {
+ if (strcmp(cf->default_user, "session_user") == 0)
+ user_oid = GetSessionUserId();
+ else if (strcmp(cf->default_user, "current_user") == 0)
+ user_oid = GetUserId();
+ else if (1)
+ /* dont support custom users, seems unnecessary */
+ elog(ERROR, "default_user: Expect 'current_user' or 'session_user', got '%s'",
+ cf->default_user);
+ else
+ /* easy to support, but seems confusing conceptually */
+ user_oid = get_role_oid(cf->default_user, false);
+ }
+ else
+ {
+ /* default: current_user */
+ user_oid = GetUserId();
+ }
/* set up user cache */
uinfo = get_userinfo(cluster, user_oid);