From: stekkel Date: Sun, 12 Feb 2006 14:41:26 +0000 (+0000) Subject: The old thread code caused time outs with a message set of 15000 messages so X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=commitdiff_plain;h=9a864f822f45af66f31d6240ae107c00d34ae52d;hp=0f3d157e2cd523a24544ad2f79684534819797b6 The old thread code caused time outs with a message set of 15000 messages so I started debugging, found out that preg_split was extremely slow and started to avoid that call. I ended up in removing a lot of overhead and working thread code. Next step is adapting the indent array and add more status info per node in order to generate nicer trees. git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@10726 7612ce4b-ef26-0410-bec9-ea0150e637f0 --- diff --git a/functions/imap_messages.php b/functions/imap_messages.php index 8520b5ad..c6eb5846 100755 --- a/functions/imap_messages.php +++ b/functions/imap_messages.php @@ -297,137 +297,17 @@ function get_squirrel_sort($imap_stream, $sSortField, $reverse = false, $aUid = return $aUid; } - -/** - * Returns an indent array for printMessageinfo() - * This represents the amount of indent needed (value), - * for this message number (key) - */ - -/* - * Notes for future work: - * indent_array should contain: indent_level, parent and flags, - * sibling notes .. - * To achieve that we need to define the following flags: - * 0: hasnochildren - * 1: haschildren - * 2: is first - * 4: is last - * a node has sibling nodes if it's not the last node - * a node has no sibling nodes if it's the last node - * By using binary comparations we can store the flag in one var - * - * example: - * -1 par = 0, level = 0, flag = 1 + 2 + 4 = 7 (haschildren, isfirst, islast) - * \-2 par = 1, level = 1, flag = 0 + 2 = 2 (hasnochildren, isfirst) - * |-3 par = 1, level = 1, flag = 1 + 4 = 5 (haschildren, islast) - * \-4 par = 3, level = 2, flag = 1 + 2 + 4 = 7 (haschildren, isfirst, islast) - * \-5 par = 4, level = 3, flag = 0 + 2 + 4 = 6 (hasnochildren, isfirst, islast) - */ -function get_parent_level($thread_new) { - $parent = ''; - $child = ''; - $cutoff = 0; - - /* - * loop through the threads and take unwanted characters out - * of the thread string then chop it up - */ - for ($i=0;$i (540) - * [1] => (1386) - * [2] => (1599 759 959 37) - * [3] => (492 1787) - * [4] => ((933)(1891)) - * [5] => (1030 (1497)(845)(1637)) + * -- 3 + * \-- 6 + * |-- 4 + * | \-- 23 + * | + * \-- 44 + * \-- 7 + * \-- 96 */ - for ($i=0,$iCnt=count($thread_temp);$i<$iCnt;$i++) { - if ($thread_temp[$i] != ')' && $thread_temp[$i] != '(') { - $thread_new[$k] = $thread_new[$k] . $thread_temp[$i]; - } elseif ($thread_temp[$i] == '(') { - $thread_new[$k] .= $thread_temp[$i]; - $counter++; - } elseif ($thread_temp[$i] == ')') { - if ($counter > 1) { - $thread_new[$k] .= $thread_temp[$i]; - $counter = $counter - 1; - } else { - $thread_new[$k] .= $thread_temp[$i]; - $k++; - $thread_new[$k] = ""; - $counter = $counter - 1; +/* + * Notes for future work: + * indent_array should contain: indent_level, parent and flags, + * sibling nodes .. + * To achieve that we need to define the following flags: + * 0: hasnochildren + * 1: haschildren + * 2: is first + * 4: is last + * a node has sibling nodes if it's not the last node + * a node has no sibling nodes if it's the last node + * By using binary comparations we can store the flag in one var + * + * example: + * -1 par = 0, level = 0, flag = 1 + 2 + 4 = 7 (haschildren, isfirst, islast) + * \-2 par = 1, level = 1, flag = 0 + 2 = 2 (hasnochildren, isfirst) + * |-3 par = 1, level = 1, flag = 1 + 4 = 5 (haschildren, islast) + * \-4 par = 3, level = 2, flag = 1 + 2 + 4 = 7 (haschildren, isfirst, islast) + * \-5 par = 4, level = 3, flag = 0 + 2 + 4 = 6 (hasnochildren, isfirst, islast) + */ + + $j = 0; + $k = 0; + $l = 0; + $aUidThread = array(); + $aIndent = array(); + $aUidSubThread = array(); + $aDepthStack = array(); + $sUid = ''; + + if ($sThreadResponse) { + for ($i=0,$iCnt = strlen($sThreadResponse);$i<$iCnt;++$i) { + $cChar = $sThreadResponse{$i}; + switch ($cChar) { + case '(': // new sub thread + $aDepthStack[$j] = $l; + ++$j; + break; + case ')': // close sub thread + if($sUid !== '') { + $aUidSubThread[] = $sUid; + $aIndent[$sUid] = $j + $l - 1; + ++$l; + $sUid = ''; + } + --$j; + if ($j === 0) { + // show message that starts the thread first. + $aUidSubThread = array_reverse($aUidSubThread); + // do not use array_merge because it's extremely slow and is causing timeouts + foreach ($aUidSubThread as $iUid) { + $aUidThread[] = $iUid; + } + $aUidSubThread = array(); + $l = 0; + $aDepthStack = array(); + } else { + $l = $aDepthStack[$j]; + } + break; + case ' ': // new child + if ($sUid !== '') { + $aUidSubThread[] = $sUid; + $aIndent[$sUid] = $j + $l - 1; + ++$l; + $sUid = ''; + } + break; + default: // part of UID + $sUid .= $cChar; + break; } } } - - $thread_new = array_reverse($thread_new); - /* place the threads after each other in one string */ - $thread_list = implode(" ", $thread_new); - $thread_list = str_replace("(", " ", $thread_list); - $thread_list = str_replace(")", " ", $thread_list); - $thread_list = preg_split("/\s/", $thread_list, -1, PREG_SPLIT_NO_EMPTY); - $server_sort_array = $thread_list; - - $indent_array = get_parent_level ($thread_new); - return array($thread_list,$indent_array); + unset($sThreadResponse); + // show newest threads first + $aUidThread = array_reverse($aUidThread); + return array($aUidThread,$aIndent); }