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) {