0beb167e80f685e0617b33a69f148a3ae1cf9d21
max
  Mon Jun 30 05:47:37 2025 -0700
allow alternative namedSessionDb tables, when a session was not found, refs #35992

diff --git src/hg/lib/cart.c src/hg/lib/cart.c
index ce298cca279..3f5f9ab8dd6 100644
--- src/hg/lib/cart.c
+++ src/hg/lib/cart.c
@@ -641,45 +641,53 @@
  * CGI action variable that sent us here. 
  * If merge is TRUE, then don't clear the cart first. */
 {
 struct sqlResult *sr = NULL;
 char **row = NULL;
 char *userName = wikiLinkUserName();
 char *encSessionName = cgiEncodeFull(sessionName);
 char *encSessionOwner = cgiEncodeFull(sessionOwner);
 char query[512];
 
 if (isEmpty(sessionOwner))
     errAbort("Please go back and enter a wiki user name for this session.");
 if (isEmpty(sessionName))
     errAbort("Please go back and enter a session name to load.");
 
-sqlSafef(query, sizeof(query), "SELECT shared, contents FROM %s "
-      "WHERE userName = '%s' AND sessionName = '%s';",
-      namedSessionTable, encSessionOwner, encSessionName);
+char *queryTempl = "SELECT shared, contents FROM %s WHERE userName = '%s' AND sessionName = '%s';";
+sqlSafef(query, sizeof(query), queryTempl, namedSessionTable, encSessionOwner, encSessionName);
 sr = sqlGetResult(conn, query);
 
-if (sqlCountRows(sr)==0 && cfgOption("namedSessionAlt"))
+row = sqlNextRow(sr);
+
+// try alternative namedSessionDb tables if no result. Stop on first match.
+struct slName *namedSessionAlts = cfgValsWithPrefix("namedSessionAlt.");
+if (namedSessionAlts && row == NULL)
+    {
+    for (struct slName *sl = namedSessionAlts;  sl != NULL;  sl = sl->next)
         {
+        char *namedSessionAlt = sl->name;
         sqlFreeResult(&sr);
-    sqlSafef(query, sizeof(query), "SELECT shared, contents FROM %s "
-          "WHERE userName = '%s' AND sessionName = '%s';",
-          cfgOption("namedSessionAlt"), encSessionOwner, encSessionName);
+        sqlSafef(query, sizeof(query), queryTempl, namedSessionAlt, encSessionOwner, encSessionName);
         sr = sqlGetResult(conn, query);
+        row = sqlNextRow(sr);
+        if (row!=NULL)
+            break;
+        }
     }
 
-if ((row = sqlNextRow(sr)) != NULL)
+if (row != NULL)
     {
     boolean shared = atoi(row[0]);
     if (shared ||
 	(userName && sameString(sessionOwner, userName)))
 	{
 	char *sessionVar = cartSessionVarName();
 	char *hgsid = cartSessionId(cart);
     char *sessionTableString = cartOptionalString(cart, hgSessionTableState);
     sessionTableString = cloneString(sessionTableString);
     char *pubSessionsTableString = cartOptionalString(cart, hgPublicSessionsTableState);
     pubSessionsTableString = cloneString(pubSessionsTableString);
 	struct sqlConnection *conn2 = hConnectCentral();
 	sessionTouchLastUse(conn2, encSessionOwner, encSessionName);
         if (!merge)
             {