1: <?php
2: /**
3: * Copyright 2012-2014 Rackspace US, Inc.
4: *
5: * Licensed under the Apache License, Version 2.0 (the "License");
6: * you may not use this file except in compliance with the License.
7: * You may obtain a copy of the License at
8: *
9: * http://www.apache.org/licenses/LICENSE-2.0
10: *
11: * Unless required by applicable law or agreed to in writing, software
12: * distributed under the License is distributed on an "AS IS" BASIS,
13: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14: * See the License for the specific language governing permissions and
15: * limitations under the License.
16: */
17:
18: namespace OpenCloud\Database\Resource;
19:
20: use OpenCloud\Common\Exceptions;
21: use OpenCloud\Common\Lang;
22: use OpenCloud\Common\Resource\PersistentResource;
23:
24: /**
25: * This class represents a Database in the Rackspace "Red Dwarf"
26: * database-as-a-service product.
27: */
28: class Database extends PersistentResource
29: {
30: /** @var string */
31: public $name;
32:
33: protected static $json_collection_name = 'databases';
34: protected static $url_resource = 'databases';
35:
36: public function __construct(Instance $instance, $info = null)
37: {
38: $this->setParent($instance);
39:
40: // Catering for laziness
41: if (is_string($info)) {
42: $info = array('name' => $info);
43: }
44:
45: return parent::__construct($instance->getService(), $info);
46: }
47:
48: /**
49: * Returns name of this database. Because it's so important (i.e. as an
50: * identifier), it will throw an error if not set/empty.
51: *
52: * @return type
53: * @throws Exceptions\DatabaseNameError
54: */
55: public function getName()
56: {
57: if (empty($this->name)) {
58: throw new Exceptions\DatabaseNameError(
59: Lang::translate('The database does not have a Url yet')
60: );
61: }
62:
63: return $this->name;
64: }
65:
66: public function primaryKeyField()
67: {
68: return 'name';
69: }
70:
71: /**
72: * Returns the Instance of the database
73: *
74: * @return Instance
75: */
76: public function instance()
77: {
78: return $this->getParent();
79: }
80:
81: /**
82: * Creates a new database
83: *
84: * @api
85: * @param array $params array of attributes to set prior to Create
86: * @return \OpenCloud\HttpResponse
87: */
88: public function create($params = array())
89: {
90: // target the /databases subresource
91: $url = $this->getParent()->url('databases');
92:
93: if (isset($params['name'])) {
94: $this->name = $params['name'];
95: }
96:
97: $json = json_encode($this->createJson($params));
98: $this->checkJsonError();
99:
100: // POST it off
101: return $this->getClient()->post($url, self::getJsonHeader(), $json)->send();
102: }
103:
104: /**
105: * Updates an existing database
106: *
107: * @param array $params ignored
108: * @throws DatabaseUpdateError always; updates are not permitted
109: * @return void
110: */
111: public function update($params = array())
112: {
113: return $this->noUpdate();
114: }
115:
116: /**
117: * Returns the JSON object for creating the database
118: */
119: protected function createJson(array $params = array())
120: {
121: $database = (object) array_merge(array('name' => $this->getName(), $params));
122:
123: return (object) array(
124: 'databases' => array($database)
125: );
126: }
127: }
128: