diff -r 5b37998e522e -r 162c1de6545a web/lib/Zend/Service/WindowsAzure/Storage/Batch.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/Zend/Service/WindowsAzure/Storage/Batch.php Fri Mar 11 15:05:35 2011 +0100 @@ -0,0 +1,248 @@ +_storageClient = $storageClient; + $this->_baseUrl = $baseUrl; + $this->_beginBatch(); + } + + /** + * Get base URL for creating requests + * + * @return string + */ + public function getBaseUrl() + { + return $this->_baseUrl; + } + + /** + * Starts a new batch operation set + * + * @throws Zend_Service_WindowsAzure_Exception + */ + protected function _beginBatch() + { + $this->_storageClient->setCurrentBatch($this); + } + + /** + * Cleanup current batch + */ + protected function _clean() + { + unset($this->_operations); + $this->_storageClient->setCurrentBatch(null); + $this->_storageClient = null; + unset($this); + } + + /** + * Enlist operation in current batch + * + * @param string $path Path + * @param string $queryString Query string + * @param string $httpVerb HTTP verb the request will use + * @param array $headers x-ms headers to add + * @param boolean $forTableStorage Is the request for table storage? + * @param mixed $rawData Optional RAW HTTP data to be sent over the wire + * @throws Zend_Service_WindowsAzure_Exception + */ + public function enlistOperation($path = '/', $queryString = '', $httpVerb = Zend_Http_Client::GET, $headers = array(), $forTableStorage = false, $rawData = null) + { + // Set _forTableStorage + if ($forTableStorage) { + $this->_forTableStorage = true; + } + + // Set _isSingleSelect + if ($httpVerb == Zend_Http_Client::GET) { + if (count($this->_operations) > 0) { + throw new Zend_Service_WindowsAzure_Exception("Select operations can only be performed in an empty batch transaction."); + } + $this->_isSingleSelect = true; + } + + // Clean path + if (strpos($path, '/') !== 0) { + $path = '/' . $path; + } + + // Clean headers + if ($headers === null) { + $headers = array(); + } + + // URL encoding + $path = Zend_Service_WindowsAzure_Storage::urlencode($path); + $queryString = Zend_Service_WindowsAzure_Storage::urlencode($queryString); + + // Generate URL + $requestUrl = $this->getBaseUrl() . $path . $queryString; + + // Generate $rawData + if ($rawData === null) { + $rawData = ''; + } + + // Add headers + if ($httpVerb != Zend_Http_Client::GET) { + $headers['Content-ID'] = count($this->_operations) + 1; + if ($httpVerb != Zend_Http_Client::DELETE) { + $headers['Content-Type'] = 'application/atom+xml;type=entry'; + } + $headers['Content-Length'] = strlen($rawData); + } + + // Generate $operation + $operation = ''; + $operation .= $httpVerb . ' ' . $requestUrl . ' HTTP/1.1' . "\n"; + foreach ($headers as $key => $value) + { + $operation .= $key . ': ' . $value . "\n"; + } + $operation .= "\n"; + + // Add data + $operation .= $rawData; + + // Store operation + $this->_operations[] = $operation; + } + + /** + * Commit current batch + * + * @return Zend_Http_Response + * @throws Zend_Service_WindowsAzure_Exception + */ + public function commit() + { + // Perform batch + $response = $this->_storageClient->performBatch($this->_operations, $this->_forTableStorage, $this->_isSingleSelect); + + // Dispose + $this->_clean(); + + // Parse response + $errors = null; + preg_match_all('/(.*)<\/message>/', $response->getBody(), $errors); + + // Error? + if (count($errors[2]) > 0) { + throw new Zend_Service_WindowsAzure_Exception('An error has occured while committing a batch: ' . $errors[2][0]); + } + + // Return + return $response; + } + + /** + * Rollback current batch + */ + public function rollback() + { + // Dispose + $this->_clean(); + } + + /** + * Get operation count + * + * @return integer + */ + public function getOperationCount() + { + return count($this->_operations); + } + + /** + * Is single select? + * + * @return boolean + */ + public function isSingleSelect() + { + return $this->_isSingleSelect; + } +}