$aQuery[$tag] = $query;
}
-function sqimap_run_pipelined_command ($imap_stream, $aQuery, $handle_errors,
+function sqimap_run_pipelined_command ($imap_stream, $aQueryList, $handle_errors,
&$aServerResponse, &$aServerMessage, $unique_id = false,
$filter=false,$outputstream=false,$no_return=false) {
+
$aResponse = false;
- foreach($aQuery as $tag => $query) {
- fputs($imap_stream,$query);
- $aResults[$tag] = false;
+ /*
+ Do not fire all calls at once to the imap-server but split the calls up
+ in portions of $iChunkSize. If we do not do that I think we misbehave as
+ IMAP client or should handle BYE calls if the IMAP-server drops the
+ connection because the number of queries is to large. This isn't tested
+ but a wild guess how it could work in the field.
+ */
+ $iQueryCount = count($aQueryList);
+ $iChunkSize = 32;
+ // array_chunk would also do the job but it's supported from php > 4.2
+ $aQueryChunks = array();
+ $iLoops = floor($iQueryCount / $iChunkSize);
+
+ if ($iLoops * $iChunkSize !== $iQueryCount) ++$iLoops;
+
+ if (!function_exists('array_chunk')) { // arraychunk replacement
+ reset($aQueryList);
+ for($i=0;$i<$iLoops;++$i) {
+ for($j=0;$j<$iChunkSize;++$j) {
+ $key = key($aQueryList);
+ $aTmp[$key] = $aQueryList[$key];
+ if (next($aQueryList) === false) break;
+ }
+ $aQueryChunks[] = $aTmp;
+ }
+ } else {
+ $aQueryChunks = array_chunk($aQueryList,$iChunkSize,true);
}
+
+ for ($i=0;$i<$iLoops;++$i) {
+ $aQuery = $aQueryChunks[$i];
+ foreach($aQuery as $tag => $query) {
+ fputs($imap_stream,$query);
+ $aResults[$tag] = false;
+ }
- foreach($aQuery as $tag => $query) {
- if (!$aResults[$tag]) {
- $aReturnedResponse = sqimap_read_data_list ($imap_stream, $tag,
+ foreach($aQuery as $tag => $query) {
+ if (!$aResults[$tag]) {
+ $aReturnedResponse = sqimap_read_data_list ($imap_stream, $tag,
$handle_errors, $response, $message, $query,
$filter,$outputstream,$no_return);
- foreach ($aReturnedResponse as $returned_tag => $aResponse) {
- if (!empty($aResponse)) {
- $aResults[$returned_tag] = $aResponse[0];
- } else {
- $aResults[$returned_tag] = $aResponse;
- }
- $aServerResponse[$returned_tag] = $response[$returned_tag];
- $aServerMessage[$returned_tag] = $message[$returned_tag];
+ foreach ($aReturnedResponse as $returned_tag => $aResponse) {
+ if (!empty($aResponse)) {
+ $aResults[$returned_tag] = $aResponse[0];
+ } else {
+ $aResults[$returned_tag] = $aResponse;
+ }
+ $aServerResponse[$returned_tag] = $response[$returned_tag];
+ $aServerMessage[$returned_tag] = $message[$returned_tag];
+ }
}
}
}