/**
* Called to prepare data grab, and then cache the results on the software level for the request.
*
* This will call PreloadDiscussionMedia, which will either query the db, or query memcached.
*
* @param mixed $Sender
*/
protected function cacheAttachedMedia($Sender)
{
if ($Sender->data('Conversation')) {
$ConversationMessageIDList = $this->getConversationMessageIDList(val('ConversationID', $Sender->data('Conversation')));
if (count($ConversationMessageIDList)) {
$MediaData = $this->preloadDiscussionMedia(val('ConversationID', $Sender->data('Conversation')), $ConversationMessageIDList, 'conversation');
}
$this->mediaCache = $MediaData;
return;
}
if ($Sender->data('Messages')) {
$Message = $Sender->data('Messages')->result();
$MessageID = val(0, $Message)->MessageID;
$MessageIDList = array($MessageID);
if (count($MessageIDList)) {
$MediaData = $this->preloadDiscussionMedia(val('ConversationID', $Sender->data('Messages')), $MessageIDList, 'conversation');
}
$this->mediaCache = $MediaData;
return;
}
$DiscussionID = null;
$Comments = $Sender->data('Comments');
if ($answers = $Sender->data('Answers')) {
$commentsArray = $Comments->resultObject();
$commentsArray = array_merge($answers, $commentsArray);
$commentsData = new Gdn_DataSet();
$commentsData->importDataset($commentsArray);
$Comments = $commentsData;
}
$CommentIDList = array();
$MediaData = array();
if ($Sender->data('Discussion.DiscussionID')) {
$DiscussionID = $Sender->data('Discussion.DiscussionID');
}
if (is_null($DiscussionID) && !empty($Comments)) {
$DiscussionID = $Comments->firstRow()->DiscussionID;
}
if ($DiscussionID) {
if ($Comments instanceof Gdn_DataSet && $Comments->numRows()) {
$Comments->dataSeek(-1);
while ($Comment = $Comments->nextRow()) {
$CommentIDList[] = $Comment->CommentID;
}
} elseif (!empty($Sender->Discussion)) {
$CommentIDList[] = $Sender->DiscussionID = $Sender->Discussion->DiscussionID;
}
if (isset($Sender->Comment) && isset($Sender->Comment->CommentID)) {
$CommentIDList[] = $Sender->Comment->CommentID;
}
// TODO
// Added note for caching here because it was the CommentIDList that is the main problem.
// Note about memcaching:
// Main problem with this is when a new comment is posted. It will only
// have that current comment in the list, which, after calling
// PreloadDiscussionMedia, means it will be the only piece of data added
// to the cache, which prevents all the rest of the comments from loading
// their own attachments. Consider either adding to the cache when a new
// file is uploaded, or just getting a list of all comments for a discussion.
// This is why memcaching has been disabled for now. There are a couple
// ways to prevent this, but they all seem unnecessary.
if (count($CommentIDList)) {
$MediaData = $this->preloadDiscussionMedia($DiscussionID, $CommentIDList);
}
$this->mediaCache = $MediaData;
}
}