|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00026 require_once 'Zend/Service/WindowsAzure/Credentials/SharedKey.php'; 00027 00031 require_once 'Zend/Service/WindowsAzure/RetryPolicy/RetryPolicyAbstract.php'; 00032 00036 require_once 'Zend/Http/Client.php'; 00037 00041 require_once 'Zend/Http/Response.php'; 00042 00046 require_once 'Zend/Service/WindowsAzure/Storage.php'; 00047 00051 require_once 'Zend/Service/WindowsAzure/Storage/QueueInstance.php'; 00052 00056 require_once 'Zend/Service/WindowsAzure/Storage/QueueMessage.php'; 00057 00061 require_once 'Zend/Service/WindowsAzure/Exception.php'; 00062 00063 00071 class Zend_Service_WindowsAzure_Storage_Queue extends Zend_Service_WindowsAzure_Storage 00072 { 00076 const MAX_MESSAGE_SIZE = 8388608; 00077 00081 const MAX_MESSAGE_TTL = 604800; 00082 00092 public function __construct($host = Zend_Service_WindowsAzure_Storage::URL_DEV_QUEUE, $accountName = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_ACCOUNT, $accountKey = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_KEY, $usePathStyleUri = false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy = null) 00093 { 00094 parent::__construct($host, $accountName, $accountKey, $usePathStyleUri, $retryPolicy); 00095 00096 // API version 00097 $this->_apiVersion = '2009-04-14'; 00098 } 00099 00106 public function queueExists($queueName = '') 00107 { 00108 if ($queueName === '') { 00109 throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); 00110 } 00111 if (!self::isValidQueueName($queueName)) { 00112 throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); 00113 } 00114 00115 // List queues 00116 $queues = $this->listQueues($queueName, 1); 00117 foreach ($queues as $queue) { 00118 if ($queue->Name == $queueName) { 00119 return true; 00120 } 00121 } 00122 00123 return false; 00124 } 00125 00134 public function createQueue($queueName = '', $metadata = array()) 00135 { 00136 if ($queueName === '') { 00137 throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); 00138 } 00139 if (!self::isValidQueueName($queueName)) { 00140 throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); 00141 } 00142 00143 // Create metadata headers 00144 $headers = array(); 00145 $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); 00146 00147 // Perform request 00148 $response = $this->_performRequest($queueName, '', Zend_Http_Client::PUT, $headers); 00149 if ($response->isSuccessful()) { 00150 return new Zend_Service_WindowsAzure_Storage_QueueInstance( 00151 $queueName, 00152 $metadata 00153 ); 00154 } else { 00155 throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); 00156 } 00157 } 00158 00166 public function getQueue($queueName = '') 00167 { 00168 if ($queueName === '') { 00169 throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); 00170 } 00171 if (!self::isValidQueueName($queueName)) { 00172 throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); 00173 } 00174 00175 // Perform request 00176 $response = $this->_performRequest($queueName, '?comp=metadata', Zend_Http_Client::GET); 00177 if ($response->isSuccessful()) { 00178 // Parse metadata 00179 $metadata = $this->_parseMetadataHeaders($response->getHeaders()); 00180 00181 // Return queue 00182 $queue = new Zend_Service_WindowsAzure_Storage_QueueInstance( 00183 $queueName, 00184 $metadata 00185 ); 00186 $queue->ApproximateMessageCount = intval($response->getHeader('x-ms-approximate-message-count')); 00187 return $queue; 00188 } else { 00189 throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); 00190 } 00191 } 00192 00200 public function getQueueMetadata($queueName = '') 00201 { 00202 if ($queueName === '') { 00203 throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); 00204 } 00205 if (!self::isValidQueueName($queueName)) { 00206 throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); 00207 } 00208 00209 return $this->getQueue($queueName)->Metadata; 00210 } 00211 00221 public function setQueueMetadata($queueName = '', $metadata = array()) 00222 { 00223 if ($queueName === '') { 00224 throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); 00225 } 00226 if (!self::isValidQueueName($queueName)) { 00227 throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); 00228 } 00229 if (count($metadata) == 0) { 00230 return; 00231 } 00232 00233 // Create metadata headers 00234 $headers = array(); 00235 $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); 00236 00237 // Perform request 00238 $response = $this->_performRequest($queueName, '?comp=metadata', Zend_Http_Client::PUT, $headers); 00239 00240 if (!$response->isSuccessful()) { 00241 throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); 00242 } 00243 } 00244 00251 public function deleteQueue($queueName = '') 00252 { 00253 if ($queueName === '') { 00254 throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); 00255 } 00256 if (!self::isValidQueueName($queueName)) { 00257 throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); 00258 } 00259 00260 // Perform request 00261 $response = $this->_performRequest($queueName, '', Zend_Http_Client::DELETE); 00262 if (!$response->isSuccessful()) { 00263 throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); 00264 } 00265 } 00266 00277 public function listQueues($prefix = null, $maxResults = null, $marker = null, $currentResultCount = 0) 00278 { 00279 // Build query string 00280 $queryString = '?comp=list'; 00281 if (!is_null($prefix)) { 00282 $queryString .= '&prefix=' . $prefix; 00283 } 00284 if (!is_null($maxResults)) { 00285 $queryString .= '&maxresults=' . $maxResults; 00286 } 00287 if (!is_null($marker)) { 00288 $queryString .= '&marker=' . $marker; 00289 } 00290 00291 // Perform request 00292 $response = $this->_performRequest('', $queryString, Zend_Http_Client::GET); 00293 if ($response->isSuccessful()) { 00294 $xmlQueues = $this->_parseResponse($response)->Queues->Queue; 00295 $xmlMarker = (string)$this->_parseResponse($response)->NextMarker; 00296 00297 $queues = array(); 00298 if (!is_null($xmlQueues)) { 00299 for ($i = 0; $i < count($xmlQueues); $i++) { 00300 $queues[] = new Zend_Service_WindowsAzure_Storage_QueueInstance( 00301 (string)$xmlQueues[$i]->QueueName 00302 ); 00303 } 00304 } 00305 $currentResultCount = $currentResultCount + count($queues); 00306 if (!is_null($maxResults) && $currentResultCount < $maxResults) { 00307 if (!is_null($xmlMarker) && $xmlMarker != '') { 00308 $queues = array_merge($queues, $this->listQueues($prefix, $maxResults, $xmlMarker, $currentResultCount)); 00309 } 00310 } 00311 if (!is_null($maxResults) && count($queues) > $maxResults) { 00312 $queues = array_slice($queues, 0, $maxResults); 00313 } 00314 00315 return $queues; 00316 } else { 00317 throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); 00318 } 00319 } 00320 00329 public function putMessage($queueName = '', $message = '', $ttl = null) 00330 { 00331 if ($queueName === '') { 00332 throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); 00333 } 00334 if (!self::isValidQueueName($queueName)) { 00335 throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); 00336 } 00337 if (strlen($message) > self::MAX_MESSAGE_SIZE) { 00338 throw new Zend_Service_WindowsAzure_Exception('Message is too big. Message content should be < 8KB.'); 00339 } 00340 if ($message == '') { 00341 throw new Zend_Service_WindowsAzure_Exception('Message is not specified.'); 00342 } 00343 if (!is_null($ttl) && ($ttl <= 0 || $ttl > self::MAX_MESSAGE_SIZE)) { 00344 throw new Zend_Service_WindowsAzure_Exception('Message TTL is invalid. Maximal TTL is 7 days (' . self::MAX_MESSAGE_SIZE . ' seconds) and should be greater than zero.'); 00345 } 00346 00347 // Build query string 00348 $queryString = ''; 00349 if (!is_null($ttl)) { 00350 $queryString .= '?messagettl=' . $ttl; 00351 } 00352 00353 // Build body 00354 $rawData = ''; 00355 $rawData .= '<QueueMessage>'; 00356 $rawData .= ' <MessageText>' . base64_encode($message) . '</MessageText>'; 00357 $rawData .= '</QueueMessage>'; 00358 00359 // Perform request 00360 $response = $this->_performRequest($queueName . '/messages', $queryString, Zend_Http_Client::POST, array(), false, $rawData); 00361 00362 if (!$response->isSuccessful()) { 00363 throw new Zend_Service_WindowsAzure_Exception('Error putting message into queue.'); 00364 } 00365 } 00366 00377 public function getMessages($queueName = '', $numOfMessages = 1, $visibilityTimeout = null, $peek = false) 00378 { 00379 if ($queueName === '') { 00380 throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); 00381 } 00382 if (!self::isValidQueueName($queueName)) { 00383 throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); 00384 } 00385 if ($numOfMessages < 1 || $numOfMessages > 32 || intval($numOfMessages) != $numOfMessages) { 00386 throw new Zend_Service_WindowsAzure_Exception('Invalid number of messages to retrieve.'); 00387 } 00388 if (!is_null($visibilityTimeout) && ($visibilityTimeout <= 0 || $visibilityTimeout > 7200)) { 00389 throw new Zend_Service_WindowsAzure_Exception('Visibility timeout is invalid. Maximum value is 2 hours (7200 seconds) and should be greater than zero.'); 00390 } 00391 00392 // Build query string 00393 $query = array(); 00394 if ($peek) { 00395 $query[] = 'peekonly=true'; 00396 } 00397 if ($numOfMessages > 1) { 00398 $query[] = 'numofmessages=' . $numOfMessages; 00399 } 00400 if (!$peek && !is_null($visibilityTimeout)) { 00401 $query[] = 'visibilitytimeout=' . $visibilityTimeout; 00402 } 00403 $queryString = '?' . implode('&', $query); 00404 00405 // Perform request 00406 $response = $this->_performRequest($queueName . '/messages', $queryString, Zend_Http_Client::GET); 00407 if ($response->isSuccessful()) { 00408 // Parse results 00409 $result = $this->_parseResponse($response); 00410 if (!$result) { 00411 return array(); 00412 } 00413 00414 $xmlMessages = null; 00415 if (count($result->QueueMessage) > 1) { 00416 $xmlMessages = $result->QueueMessage; 00417 } else { 00418 $xmlMessages = array($result->QueueMessage); 00419 } 00420 00421 $messages = array(); 00422 for ($i = 0; $i < count($xmlMessages); $i++) { 00423 $messages[] = new Zend_Service_WindowsAzure_Storage_QueueMessage( 00424 (string)$xmlMessages[$i]->MessageId, 00425 (string)$xmlMessages[$i]->InsertionTime, 00426 (string)$xmlMessages[$i]->ExpirationTime, 00427 ($peek ? '' : (string)$xmlMessages[$i]->PopReceipt), 00428 ($peek ? '' : (string)$xmlMessages[$i]->TimeNextVisible), 00429 base64_decode((string)$xmlMessages[$i]->MessageText) 00430 ); 00431 } 00432 00433 return $messages; 00434 } else { 00435 throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); 00436 } 00437 } 00438 00447 public function peekMessages($queueName = '', $numOfMessages = 1) 00448 { 00449 return $this->getMessages($queueName, $numOfMessages, null, true); 00450 } 00451 00458 public function clearMessages($queueName = '') 00459 { 00460 if ($queueName === '') { 00461 throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); 00462 } 00463 if (!self::isValidQueueName($queueName)) { 00464 throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); 00465 } 00466 00467 // Perform request 00468 $response = $this->_performRequest($queueName . '/messages', '', Zend_Http_Client::DELETE); 00469 if (!$response->isSuccessful()) { 00470 throw new Zend_Service_WindowsAzure_Exception('Error clearing messages from queue.'); 00471 } 00472 } 00473 00481 public function deleteMessage($queueName = '', Zend_Service_WindowsAzure_Storage_QueueMessage $message) 00482 { 00483 if ($queueName === '') { 00484 throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); 00485 } 00486 if (!self::isValidQueueName($queueName)) { 00487 throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); 00488 } 00489 if ($message->PopReceipt == '') { 00490 throw new Zend_Service_WindowsAzure_Exception('A message retrieved using "peekMessages" can NOT be deleted! Use "getMessages" instead.'); 00491 } 00492 00493 // Perform request 00494 $response = $this->_performRequest($queueName . '/messages/' . $message->MessageId, '?popreceipt=' . $message->PopReceipt, Zend_Http_Client::DELETE); 00495 if (!$response->isSuccessful()) { 00496 throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); 00497 } 00498 } 00499 00506 public static function isValidQueueName($queueName = '') 00507 { 00508 if (preg_match("/^[a-z0-9][a-z0-9-]*$/", $queueName) === 0) { 00509 return false; 00510 } 00511 00512 if (strpos($queueName, '--') !== false) { 00513 return false; 00514 } 00515 00516 if (strtolower($queueName) != $queueName) { 00517 return false; 00518 } 00519 00520 if (strlen($queueName) < 3 || strlen($queueName) > 63) { 00521 return false; 00522 } 00523 00524 if (substr($queueName, -1) == '-') { 00525 return false; 00526 } 00527 00528 return true; 00529 } 00530 00538 protected function _getErrorMessage(Zend_Http_Response $response, $alternativeError = 'Unknown error.') 00539 { 00540 $response = $this->_parseResponse($response); 00541 if ($response && $response->Message) { 00542 return (string)$response->Message; 00543 } else { 00544 return $alternativeError; 00545 } 00546 } 00547 }