Moodle  2.2.1
http://www.collinsharper.com
C:/xampp/htdocs/moodle/lib/zend/Zend/Service/WindowsAzure/Storage/Queue.php
Go to the documentation of this file.
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 }
 All Data Structures Namespaces Files Functions Variables Enumerations