New config var: 'default_user'
authorMarko Kreen <markokr@gmail.com>
Mon, 2 Apr 2012 10:12:11 +0000 (13:12 +0300)
committerMarko Kreen <markokr@gmail.com>
Tue, 3 Apr 2012 12:34:44 +0000 (15:34 +0300)
This allows to fall back to old default of 'session_user'.

New default is 'current_user'.

doc/config.txt
src/cluster.c
src/plproxy.h

index 18cc6b0a8cc1d6abb34149b00268befb0f055585..b51fe23fddafde81e6cdabc2d35f8bc6f387a42a 100644 (file)
@@ -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.
 
index f32df7fa9369e97688f9e2fb9bfe114f1b0ca2d3..fc59c368735af6a14a29a4205a900a51accea1ba 100644 (file)
@@ -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);
index f58c9cf6db31d1b67d46d140fc9a765fb88aa9b0..5f58321ee24e97b4d3e934b14a41157a83ea9a26 100644 (file)
@@ -134,6 +134,7 @@ typedef struct ProxyConfig
        int                     keepidle;
        int                     keepintvl;
        int                     keepcnt;
+       char            default_user[NAMEDATALEN];
 } ProxyConfig;
 
 typedef struct ConnUserInfo {