Source for file Client.php
Documentation is available at Client.php
* @package Amazon_SimpleDB
* @copyright Copyright 2008 Amazon Technologies, Inc.
* @link http://aws.amazon.com
* @license http://aws.amazon.com/apache2.0 Apache License, Version 2.0
/*******************************************************************************
* Amazon Simple DB PHP5 Library
* Generated: Thu Aug 28 06:20:51 PDT 2008
* @see Amazon_SimpleDB_Interface
require_once ('Amazon/SimpleDB/Interface.php');
* Amazon SimpleDB is a web service for running queries on structured
* data in real time. This service works in close conjunction with Amazon
* Simple Storage Service (Amazon S3) and Amazon Elastic Compute Cloud
* (Amazon EC2), collectively providing the ability to store, process
* and query data sets in the cloud. These services are designed to make
* web-scale computing easier and more cost-effective for developers.
* Traditionally, this type of functionality has been accomplished with
* a clustered relational database that requires a sizable upfront
* investment, brings more complexity than is typically needed, and often
* requires a DBA to maintain and administer. In contrast, Amazon SimpleDB
* is easy to use and provides the core functionality of a database -
* real-time lookup and simple querying of structured data without the
* operational complexity. Amazon SimpleDB requires no schema, automatically
* indexes your data and provides a simple API for storage and access.
* This eliminates the administrative burden of data modeling, index
* maintenance, and performance tuning. Developers gain access to this
* functionality within Amazon's proven computing environment, are able
* to scale instantly, and pay only for what they use.
* Amazon_SimpleDB_Client is an implementation of Amazon_SimpleDB
const SERVICE_VERSION =
'2007-11-07';
private $_awsAccessKeyId =
null;
private $_awsSecretAccessKey =
null;
private $_config =
array ('ServiceURL' =>
'http://sdb.amazonaws.com',
'UserAgent' =>
'Amazon SimpleDB PHP5 Library',
* @param string $awsAccessKeyId AWS Access Key ID
* @param string $awsSecretAccessKey AWS Secret Access Key
* @param array $config configuration options.
* Valid configuration options are:
* <li>SignatureVersion</li>
* <li>TimesRetryOnError</li>
public function __construct($awsAccessKeyId, $awsSecretAccessKey, $config =
null)
$this->_awsAccessKeyId =
$awsAccessKeyId;
$this->_awsSecretAccessKey =
$awsSecretAccessKey;
// Public API ------------------------------------------------------------//
* The CreateDomain operation creates a new domain. The domain name must be unique
* among the domains associated with the Access Key ID provided in the request. The CreateDomain
* operation may take 10 or more seconds to complete.
* @see http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_CreateDomain.html
* @param mixed $request array of parameters for Amazon_SimpleDB_Model_CreateDomainRequest request
* or Amazon_SimpleDB_Model_CreateDomainRequest object itself
* @see Amazon_SimpleDB_Model_CreateDomain
* @return Amazon_SimpleDB_Model_CreateDomainResponse Amazon_SimpleDB_Model_CreateDomainResponse
* @throws Amazon_SimpleDB_Exception
require_once ('Amazon/SimpleDB/Model/CreateDomainRequest.php');
require_once ('Amazon/SimpleDB/Model/CreateDomainResponse.php');
* The ListDomains operaton lists all domains associated with the Access Key ID. It returns
* domain names up to the limit set by MaxNumberOfDomains. A NextToken is returned if there are more
* than MaxNumberOfDomains domains. Calling ListDomains successive times with the
* NextToken returns up to MaxNumberOfDomains more domain names each time.
* @see http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_ListDomains.html
* @param mixed $request array of parameters for Amazon_SimpleDB_Model_ListDomainsRequest request
* or Amazon_SimpleDB_Model_ListDomainsRequest object itself
* @see Amazon_SimpleDB_Model_ListDomains
* @return Amazon_SimpleDB_Model_ListDomainsResponse Amazon_SimpleDB_Model_ListDomainsResponse
* @throws Amazon_SimpleDB_Exception
require_once ('Amazon/SimpleDB/Model/ListDomainsRequest.php');
require_once ('Amazon/SimpleDB/Model/ListDomainsResponse.php');
* The DeleteDomain operation deletes a domain. Any items (and their attributes) in the domain
* are deleted as well. The DeleteDomain operation may take 10 or more seconds to complete.
* @see http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_DeleteDomain.html
* @param mixed $request array of parameters for Amazon_SimpleDB_Model_DeleteDomainRequest request
* or Amazon_SimpleDB_Model_DeleteDomainRequest object itself
* @see Amazon_SimpleDB_Model_DeleteDomain
* @return Amazon_SimpleDB_Model_DeleteDomainResponse Amazon_SimpleDB_Model_DeleteDomainResponse
* @throws Amazon_SimpleDB_Exception
require_once ('Amazon/SimpleDB/Model/DeleteDomainRequest.php');
require_once ('Amazon/SimpleDB/Model/DeleteDomainResponse.php');
* The PutAttributes operation creates or replaces attributes within an item. You specify new attributes
* using a combination of the Attribute.X.Name and Attribute.X.Value parameters. You specify
* the first attribute by the parameters Attribute.0.Name and Attribute.0.Value, the second
* attribute by the parameters Attribute.1.Name and Attribute.1.Value, and so on.
* Attributes are uniquely identified within an item by their name/value combination. For example, a single
* item can have the attributes { "first_name", "first_value" } and { "first_name",
* second_value" }. However, it cannot have two attribute instances where both the Attribute.X.Name and
* Attribute.X.Value are the same.
* Optionally, the requestor can supply the Replace parameter for each individual value. Setting this value
* to true will cause the new attribute value to replace the existing attribute value(s). For example, if an
* item has the attributes { 'a', '1' }, { 'b', '2'} and { 'b', '3' } and the requestor does a
* PutAttributes of { 'b', '4' } with the Replace parameter set to true, the final attributes of the
* item will be { 'a', '1' } and { 'b', '4' }, replacing the previous values of the 'b' attribute
* @see http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_PutAttributes.html
* @param mixed $request array of parameters for Amazon_SimpleDB_Model_PutAttributesRequest request
* or Amazon_SimpleDB_Model_PutAttributesRequest object itself
* @see Amazon_SimpleDB_Model_PutAttributes
* @return Amazon_SimpleDB_Model_PutAttributesResponse Amazon_SimpleDB_Model_PutAttributesResponse
* @throws Amazon_SimpleDB_Exception
require_once ('Amazon/SimpleDB/Model/PutAttributesRequest.php');
require_once ('Amazon/SimpleDB/Model/PutAttributesResponse.php');
* Returns all of the attributes associated with the item. Optionally, the attributes returned can be limited to
* the specified AttributeName parameter.
* If the item does not exist on the replica that was accessed for this operation, an empty attribute is
* returned. The system does not return an error as it cannot guarantee the item does not exist on other
* @see http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_GetAttributes.html
* @param mixed $request array of parameters for Amazon_SimpleDB_Model_GetAttributesRequest request
* or Amazon_SimpleDB_Model_GetAttributesRequest object itself
* @see Amazon_SimpleDB_Model_GetAttributes
* @return Amazon_SimpleDB_Model_GetAttributesResponse Amazon_SimpleDB_Model_GetAttributesResponse
* @throws Amazon_SimpleDB_Exception
require_once ('Amazon/SimpleDB/Model/GetAttributesRequest.php');
require_once ('Amazon/SimpleDB/Model/GetAttributesResponse.php');
* Deletes one or more attributes associated with the item. If all attributes of an item are deleted, the item is
* @see http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_DeleteAttributes.html
* @param mixed $request array of parameters for Amazon_SimpleDB_Model_DeleteAttributesRequest request
* or Amazon_SimpleDB_Model_DeleteAttributesRequest object itself
* @see Amazon_SimpleDB_Model_DeleteAttributes
* @return Amazon_SimpleDB_Model_DeleteAttributesResponse Amazon_SimpleDB_Model_DeleteAttributesResponse
* @throws Amazon_SimpleDB_Exception
require_once ('Amazon/SimpleDB/Model/DeleteAttributesRequest.php');
require_once ('Amazon/SimpleDB/Model/DeleteAttributesResponse.php');
* The Query operation returns a set of ItemNames that match the query expression. Query operations that
* run longer than 5 seconds will likely time-out and return a time-out error response.
* A Query with no QueryExpression matches all items in the domain.
* @see http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_Query.html
* @param mixed $request array of parameters for Amazon_SimpleDB_Model_QueryRequest request
* or Amazon_SimpleDB_Model_QueryRequest object itself
* @see Amazon_SimpleDB_Model_Query
* @return Amazon_SimpleDB_Model_QueryResponse Amazon_SimpleDB_Model_QueryResponse
* @throws Amazon_SimpleDB_Exception
public function query($request)
require_once ('Amazon/SimpleDB/Model/QueryRequest.php');
require_once ('Amazon/SimpleDB/Model/QueryResponse.php');
* The QueryWithAttributes operation returns a set of item names and associated attributes.
* The query semantics of this operation are identical to the Query operation.
* @see http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_QueryWithAttributes.html
* @param mixed $request array of parameters for Amazon_SimpleDB_Model_QueryWithAttributesRequest request
* or Amazon_SimpleDB_Model_QueryWithAttributesRequest object itself
* @see Amazon_SimpleDB_Model_QueryWithAttributes
* @return Amazon_SimpleDB_Model_QueryWithAttributesResponse Amazon_SimpleDB_Model_QueryWithAttributesResponse
* @throws Amazon_SimpleDB_Exception
require_once ('Amazon/SimpleDB/Model/QueryWithAttributesRequest.php');
require_once ('Amazon/SimpleDB/Model/QueryWithAttributesResponse.php');
// Private API ------------------------------------------------------------//
* Invoke request and return response
private function _invoke(array $parameters)
$actionName =
$parameters["Action"];
/* Submit the request and read response body */
/* Add required request parameters */
$parameters =
$this->_addRequiredParameters($parameters);
$response =
$this->_httpPost($parameters);
if ($response['Status'] ===
200) {
if ($response['Status'] ===
500 ||
$response['Status'] ===
503) {
$this->_pauseOnRetry(++
$retries, $response['Status']);
throw
$this->_reportAnyErrors($response['ResponseBody'], $response['Status']);
/* Rethrow on deserializer error */
require_once ('Amazon/SimpleDB/Exception.php');
require_once ('Amazon/SimpleDB/Exception.php');
return $response['ResponseBody'];
* Look for additional error strings in the response and return formatted exception
private function _reportAnyErrors($responseBody, $status, Exception $e =
null)
if (!is_null($responseBody) &&
strpos($responseBody, '<') ===
0) {
if (preg_match('@<RequestId>(.*)</RequestId>.*<Error><Code>(.*)</Code><Message>(.*)</Message></Error>.*(<Error>)?@mi',
$responseBody, $errorMatcherOne)) {
$requestId =
$errorMatcherOne[1];
$code =
$errorMatcherOne[2];
$message =
$errorMatcherOne[3];
require_once ('Amazon/SimpleDB/Exception.php');
'ErrorType' =>
'Unknown', 'RequestId' =>
$requestId, 'XML' =>
$responseBody));
} elseif (preg_match('@<Error><Code>(.*)</Code><Message>(.*)</Message></Error>.*(<Error>)?.*<RequestID>(.*)</RequestID>@mi',
$responseBody, $errorMatcherTwo)) {
$code =
$errorMatcherTwo[1];
$message =
$errorMatcherTwo[2];
$requestId =
$errorMatcherTwo[4];
require_once ('Amazon/SimpleDB/Exception.php');
'ErrorType' =>
'Unknown', 'RequestId' =>
$requestId, 'XML' =>
$responseBody));
} elseif (preg_match('@<Error><Code>(.*)</Code><Message>(.*)</Message><BoxUsage>(.*)</BoxUsage></Error>.*(<Error>)?.*<RequestID>(.*)</RequestID>@mi',
$responseBody, $errorMatcherThree)) {
$code =
$errorMatcherThree[1];
$message =
$errorMatcherThree[2];
$boxUsage =
$errorMatcherThree[3];
$requestId =
$errorMatcherThree[5];
require_once ('Amazon/SimpleDB/Exception.php');
'ErrorType' =>
'Unknown', 'BoxUsage' =>
$boxUsage, 'RequestId' =>
$requestId, 'XML' =>
$responseBody));
require_once ('Amazon/SimpleDB/Exception.php');
require_once ('Amazon/SimpleDB/Exception.php');
* Perform HTTP post with exponential retries on error 500 and 503
private function _httpPost(array $parameters)
$query =
$this->_getParametersAsString($parameters);
$url =
parse_url ($this->_config['ServiceURL']);
$post =
"POST / HTTP/1.0\r\n";
$post .=
"Host: " .
$url['host'] .
"\r\n";
$post .=
"Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n";
$post .=
"Content-Length: " .
strlen($query) .
"\r\n";
$post .=
"User-Agent: " .
$this->_config['UserAgent'] .
"\r\n";
switch ($url['scheme']) {
$port =
$port ===
null ?
443 :
$port;
$port =
$port ==
null ?
80 :
$port;
if ($socket =
@fsockopen($scheme .
$url['host'], $port, $errno, $errstr, 10)) {
$response .=
fgets($socket, 1160);
list
($other, $responseBody) =
explode("\r\n\r\n", $response, 2);
throw
new Exception ("Unable to establish connection to host " .
$url['host'] .
" $errstr");
return array ('Status' => (int)
$code, 'ResponseBody' =>
$responseBody);
* Exponential sleep on failed request
* @param retries current retry
* @throws Amazon_SimpleDB_Exception if maximum number of retries has been reached
private function _pauseOnRetry($retries, $status)
if ($retries <=
$this->_config['MaxErrorRetry']) {
$delay = (int)
(pow(4, $retries) *
100000) ;
require_once ('Amazon/SimpleDB/Exception.php');
throw
new Amazon_SimpleDB_Exception (array ('Message' =>
"Maximum number of retry attempts reached : $retries", 'StatusCode' =>
$status));
* Add authentication related and version parameters
private function _addRequiredParameters(array&