1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
<?php
/**
* PHP OpenCloud library.
*
* @copyright 2014 Rackspace Hosting, Inc. See LICENSE for information.
* @license https://www.apache.org/licenses/LICENSE-2.0
* @author Glen Campbell <glen.campbell@rackspace.com>
* @author Jamie Hannaford <jamie.hannaford@rackspace.com>
*/
namespace OpenCloud\Database\Resource;
use OpenCloud\Common\PersistentObject;
use OpenCloud\Common\Exceptions;
use OpenCloud\Common\Lang;
/**
* This class represents a Database in the Rackspace "Red Dwarf"
* database-as-a-service product.
*/
class Database extends PersistentObject
{
protected static $json_collection_name = 'databases';
protected static $url_resource = 'databases';
public $name;
/**
* Creates a new database object
*
* Unlike other objects (Servers, DataObjects, etc.), passing a database
* name to the constructor does *not* pull information from the database.
* For example, if you pass an ID to the `Server()` constructor, it will
* attempt to retrieve the information on that server from the service,
* and will return an error if it is not found. However, the Cloud
* Databases service does not permit retrieval of information on
* individual databases (only via Collection), and thus passing in a
* name via the `$info` parameter only creates an in-memory object that
* is not necessarily tied to an actual database.
*
* @param Instance $instance the parent DbService\Instance of the database
* @param mixed $info if an array or object, treated as properties to set;
* if a string, treated as the database name
* @return void
* @throws DatabaseNameError if `$info` is not a string, object, or array
*/
public function __construct(Instance $instance, $info = null)
{
$this->setParent($instance);
// Catering for laziness
if (is_string($info)) {
$info = array('name' => $info);
}
return parent::__construct($instance->getService(), $info);
}
/**
* Returns name of this database. Because it's so important (i.e. as an
* identifier), it will throw an error if not set/empty.
*
* @return type
* @throws Exceptions\DatabaseNameError
*/
public function getName()
{
if (empty($this->name)) {
throw new Exceptions\DatabaseNameError(
Lang::translate('The database does not have a Url yet')
);
}
return $this->name;
}
public function primaryKeyField()
{
return 'name';
}
/**
* Returns the Instance of the database
*
* @return Instance
*/
public function instance()
{
return $this->getParent();
}
/**
* Creates a new database
*
* @api
* @param array $params array of attributes to set prior to Create
* @return \OpenCloud\HttpResponse
*/
public function create($params = array())
{
// target the /databases subresource
$url = $this->getParent()->url('databases');
if (isset($params['name'])) {
$this->name = $params['name'];
}
$json = json_encode($this->createJson($params));
$this->checkJsonError();
// POST it off
return $this->getClient()->post($url, self::getJsonHeader(), $json)->send();
}
/**
* Updates an existing database
*
* @param array $params ignored
* @throws DatabaseUpdateError always; updates are not permitted
* @return void
*/
public function update($params = array())
{
return $this->noUpdate();
}
/**
* Deletes a database
*
* @api
* @return \OpenCloud\HttpResponseb
*/
public function delete()
{
return $this->getClient()->delete($this->url())->send();
}
/**
* Returns the JSON object for creating the database
*/
protected function createJson(array $params = array())
{
$database = (object) array_merge(array('name' => $this->getName(), $params));
return (object) array(
'databases' => array($database)
);
}
}
|