521dad5888fde0e10237c9c6b741e071cd0c5cee
angie
  Tue May 14 09:47:56 2019 -0700
hgSession: added CGI param hgS_sessionDataDbSuffix to randomize choice of customData db* when bulk-converting old saved sessions to use sessionDataDir/sessionDataDbPrefix.  refs #22440

diff --git src/hg/hgSession/hgSession.c src/hg/hgSession/hgSession.c
index c6deead..c07a0d5 100644
--- src/hg/hgSession/hgSession.c
+++ src/hg/hgSession/hgSession.c
@@ -39,31 +39,31 @@
 #include "hubConnect.h"
 #include "trackHub.h"
 
 void usage()
 /* Explain usage and exit. */
 {
 errAbort(
   "hgSession - Interface with wiki login and do session saving/loading.\n"
   "usage:\n"
   "    hgSession <various CGI settings>\n"
   );
 }
 
 /* Global variables. */
 struct cart *cart;
-char *excludeVars[] = {"Submit", "submit", NULL};
+char *excludeVars[] = {"Submit", "submit", hgsSessionDataDbSuffix, NULL};
 struct slName *existingSessionNames = NULL;
 
 /* Javascript to confirm that the user truly wants to delete a session. */
 #define confirmDeleteFormat "return confirm('Are you sure you want to delete ' + decodeURIComponent('%s') + '?');"
 
 char *cgiDecodeClone(char *encStr)
 /* Allocate and return a CGI-decoded copy of encStr. */
 {
 size_t len = strlen(encStr);
 char *decStr = needMem(len+1);
 cgiDecode(encStr, decStr, len);
 return decStr;
 }
 
 
@@ -787,31 +787,32 @@
     if ((row = sqlNextRow(sr)) != NULL)
 	{
 	safef(firstUseBuf, sizeof(firstUseBuf), "'%s'", row[0]);
 	firstUse = firstUseBuf;
 	useCount = atoi(row[1]) + 1;
 	}
     sqlFreeResult(&sr);
 
     /* Remove pre-existing session (if any) before updating. */
     dyStringClear(dy);
     sqlDyStringPrintf(dy, "DELETE FROM %s WHERE userName = '%s' AND "
 		       "sessionName = '%s';",
 		   namedSessionTable, encUserName, encSessionName);
     sqlUpdate(conn, dy->string);
 
-    saveSessionData(cart, encUserName, encSessionName);
+    saveSessionData(cart, encUserName, encSessionName,
+                    cgiOptionalString(hgsSessionDataDbSuffix));
 
     dyStringClear(dy);
     sqlDyStringPrintf(dy, "INSERT INTO %s ", namedSessionTable);
     dyStringAppend(dy, "(userName, sessionName, contents, shared, "
 		       "firstUse, lastUse, useCount, settings) VALUES (");
     dyStringPrintf(dy, "'%s', '%s', ", encUserName, encSessionName);
     dyStringAppend(dy, "'");
     cleanHgSessionFromCart(cart);
     struct dyString *encoded = newDyString(4096);
     cartEncodeState(cart, encoded);
 
     // Now add all the default visibilities to output.
     outDefaultTracks(cart, encoded);
 
     sqlDyAppendEscaped(dy, encoded->string);