45764c815bb96401f97540ca20ef0b09f67cdcf2 angie Fri May 24 13:37:21 2019 -0700 When re-saving session, preserve shared column which is not a boolean but rather {0, 1, 2=public session}. refs #22440 note-170 diff --git src/hg/hgSession/hgSession.c src/hg/hgSession/hgSession.c index d2ace25..7eeeccf 100644 --- src/hg/hgSession/hgSession.c +++ src/hg/hgSession/hgSession.c @@ -761,31 +761,31 @@ } if (tdb->visibility != tvHide) outIfNotPresent(cart, dy, tdb->track, tdb->visibility); } // Put a variable in the cart that says we put the default // visibilities in it. if (dy) dyStringPrintf(dy,"&%s=on", CART_HAS_DEFAULT_VISIBILITY); else printf("%s on", CART_HAS_DEFAULT_VISIBILITY); } #define INITIAL_USE_COUNT 0 static int saveCartAsSession(struct sqlConnection *conn, char *encUserName, char *encSessionName, - boolean shareSession) + int sharingLevel) /* Save all settings in cart, either adding a new session or overwriting an existing session. * Return useCount so that the caller can distinguish between adding and overWriting. */ { struct sqlResult *sr = NULL; struct dyString *dy = dyStringNew(16 * 1024); char **row; char *firstUse = "now()"; int useCount = INITIAL_USE_COUNT; char firstUseBuf[32]; /* If this session already existed, preserve its firstUse and useCount. */ sqlDyStringPrintf(dy, "SELECT firstUse, useCount FROM %s " "WHERE userName = '%s' AND sessionName = '%s';", namedSessionTable, encUserName, encSessionName); sr = sqlGetResult(conn, dy->string); @@ -811,31 +811,31 @@ 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); dyStringFree(&encoded); dyStringAppend(dy, "', "); -dyStringPrintf(dy, "%d, ", (shareSession ? 1 : 0)); +dyStringPrintf(dy, "%d, ", sharingLevel); dyStringPrintf(dy, "%s, now(), %d, '');", firstUse, useCount); sqlUpdate(conn, dy->string); dyStringFree(&dy); /* Prevent modification of custom track collections just saved to namedSessionDb: */ cartCopyCustomComposites(cart); return useCount; } char *doNewSession(char *userName) /* Save current settings in a new named session. * Return a message confirming what we did. */ { if (userName == NULL) return "Unable to save session -- please log in and try again."; @@ -1545,82 +1545,82 @@ namedSessionTable, dyRa->string, encUserName, encSessionName); sqlUpdate(conn, dyQuery->string); dyStringPrintf(dyMessage, "Updated description of %s.\n", sessionName); } } if (isEmpty(dyMessage->string)) dyStringPrintf(dyMessage, "No changes to session %s.\n", sessionName); dyStringPrintf(dyMessage, "%s %s", getSessionLink(encUserName, encSessionName), getSessionEmailLink(encUserName, encSessionName)); if (shared) printShareMessage(dyMessage, encUserName, encSessionName, FALSE); return dyStringCannibalize(&dyMessage); } -static boolean isSessionShared(struct sqlConnection *conn, char *encUserName, char *encSessionName) +static int getSharingLevel(struct sqlConnection *conn, char *encUserName, char *encSessionName) /* Return the value of 'shared' from the namedSessionDb row for user & session; - * errAbort if there is no such session. */ + * errAbort if there is no such session. (0 = not shared, 1 = shared by link, 2 = public session) */ { char query[2048]; sqlSafef(query, sizeof(query), "select shared from %s where userName='%s' and sessionName = '%s';", namedSessionTable, encUserName, encSessionName); char buf[256]; char *sharedStr = sqlQuickQuery(conn, query, buf, sizeof buf); if (sharedStr == NULL) errAbort("Unable to find session for userName='%s' and sessionName='%s'; no result from query '%s'", encUserName, encSessionName, query); return atoi(sharedStr); } char *doReSaveSession(char *userName, char *actionVar) /* Load a session (which may have old trash and customTrash references) and re-save it * so that customTrash tables will be moved to customData* databases and trash paths * will be replaced with userdata (hg.conf sessionDataDir) paths. * NOTE: this is not intended to be reachable by the UI; it is for a script to update * old sessions to use the new sessionData locations. */ { if (userName == NULL) return "Unable to re-save session -- please log in and try again."; struct sqlConnection *conn = hConnectCentral(); char *sessionName = cloneString(trimSpaces(cartString(cart, hgsNewSessionName))); char *encUserName = cgiEncodeFull(userName); char *encSessionName = cgiEncodeFull(sessionName); -boolean shareSession = isSessionShared(conn, encUserName, encSessionName); +int sharingLevel = getSharingLevel(conn, encUserName, encSessionName); cartLoadUserSession(conn, userName, sessionName, cart, NULL, actionVar); // Don't cartCopyCustomComposites because we're not going to make any track collection changes hubConnectLoadHubs(cart); // Some old sessions reference databases that are no longer present, and that triggers an errAbort // when cartHideDefaultTracks calls hgTrackDb. Don't let that stop the process of updating other // stuff in the session. struct errCatch *errCatch = errCatchNew(); if (errCatchStart(errCatch)) cartHideDefaultTracks(cart); errCatchEnd(errCatch); if (errCatch->gotError) fprintf(stderr, "doReSaveSession: Error from cartHideDefaultTracks: '%s'; Continuing...", errCatch->message->string); errCatchFree(&errCatch); struct dyString *dyMessage = dyStringNew(1024); dyStringPrintf(dyMessage, "Re-saved settings from user %s's session %s " "that %s be shared with others. %s %s", - userName, htmlEncode(sessionName), (shareSession ? "may" : "may not"), + userName, htmlEncode(sessionName), (sharingLevel ? "may" : "may not"), getSessionLink(userName, encSessionName), getSessionEmailLink(encUserName, encSessionName)); cartCheckForCustomTracks(cart, dyMessage); -int useCount = saveCartAsSession(conn, encUserName, encSessionName, shareSession); +int useCount = saveCartAsSession(conn, encUserName, encSessionName, sharingLevel); if (useCount <= INITIAL_USE_COUNT) errAbort("Expected useCount of at least %d after re-saving session for " "userName='%s', sessionName='%s', but got %d", INITIAL_USE_COUNT+1, encUserName, encSessionName, useCount); hDisconnectCentral(&conn); return dyStringCannibalize(&dyMessage); } // ====================================== void prepBackGroundCall(char **pBackgroundProgress, char *cleanPrefix) /* fix cart and save state */ { *pBackgroundProgress = cloneString(cgiUsualString("backgroundProgress", NULL)); cartRemove(cart, "backgroundExec");