From 867623708fb7684584977cfef9e9ba022b0fce64 Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Mon, 2 Apr 2012 13:12:11 +0300 Subject: [PATCH] New config var: 'default_user' This allows to fall back to old default of 'session_user'. New default is 'current_user'. --- doc/config.txt | 12 +++++++++++- src/cluster.c | 25 +++++++++++++++++++++++-- src/plproxy.h | 1 + 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/doc/config.txt b/doc/config.txt index 18cc6b0..b51fe23 100644 --- a/doc/config.txt +++ b/doc/config.txt @@ -20,7 +20,7 @@ The following plproxy schema functions are used to define the clusters: === plproxy.get_cluster_version(cluster_name) === ----------------------- +--------------------- plproxy.get_cluster_version(cluster_name text) returns integer ---------------------- @@ -161,6 +161,16 @@ or NULL then the parameter is disabled (a default value will be used) 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. diff --git a/src/cluster.c b/src/cluster.c index f32df7f..fc59c36 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -313,6 +313,8 @@ set_config_key(ProxyFunction *func, ProxyConfig *cf, const char *key, const char 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); } @@ -968,12 +970,31 @@ static void 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); diff --git a/src/plproxy.h b/src/plproxy.h index f58c9cf..5f58321 100644 --- a/src/plproxy.h +++ b/src/plproxy.h @@ -134,6 +134,7 @@ typedef struct ProxyConfig int keepidle; int keepintvl; int keepcnt; + char default_user[NAMEDATALEN]; } ProxyConfig; typedef struct ConnUserInfo { -- 2.39.5