1 <?php
2
3 4 5 6 7 8 9 10
11
12 namespace frankmayer\ArangoDbPhpCore\Config;
13
14 use frankmayer\ArangoDbPhpCore\ClientException;
15 use frankmayer\ArangoDbPhpCore\Exception;
16
17 18 19 20 21 22 23 24
25 class ConnectionOptions implements
26 \ArrayAccess
27 {
28 29 30 31 32
33 private $_values = [];
34
35 36 37 38 39
40 private $_endpoint = null;
41
42 43 44
45 const OPTION_ENDPOINT = 'endpoint';
46
47 48 49
50 const OPTION_HOST = 'host';
51
52 53 54
55 const OPTION_PORT = 'port';
56
57 58 59
60 const OPTION_TIMEOUT = 'timeout';
61
62 63 64
65 const OPTION_TRACE = 'trace';
66
67 68 69
70 const OPTION_ENHANCED_TRACE = 'enhancedTrace';
71
72 73 74
75 const OPTION_CREATE = 'createCollection';
76
77 78 79
80 const OPTION_REVISION = 'rev';
81
82 83 84
85 const OPTION_UPDATE_POLICY = 'policy';
86
87 88 89
90 const OPTION_UPDATE_KEEPNULL = 'keepNull';
91
92 93 94
95 const OPTION_REPLACE_POLICY = 'policy';
96
97 98 99
100 const OPTION_DELETE_POLICY = 'policy';
101
102 103 104
105 const OPTION_WAIT_SYNC = 'waitForSync';
106
107 108 109
110 const OPTION_LIMIT = 'limit';
111
112 113 114
115 const OPTION_SKIP = 'skip';
116
117 118 119
120 const OPTION_BATCHSIZE = 'batchSize';
121
122 123 124
125 const OPTION_JOURNAL_SIZE = 'journalSize';
126
127 128 129
130 const OPTION_IS_SYSTEM = 'isSystem';
131
132 133 134
135 const OPTION_IS_VOLATILE = 'isVolatile';
136
137 138 139
140 const OPTION_AUTH_USER = 'AuthUser';
141
142 143 144
145 const OPTION_AUTH_PASSWD = 'AuthPasswd';
146
147 148 149
150 const OPTION_AUTH_TYPE = 'AuthType';
151
152 153 154
155 const OPTION_CLIENT = 'Client';
156
157 158 159
160 const OPTION_RECONNECT = 'Reconnect';
161
162 163 164
165 const OPTION_BATCH = 'Batch';
166
167 168 169
170 const OPTION_BATCHPART = 'BatchPart';
171
172 173 174
175 const OPTION_CHECK_UTF8_CONFORM = 'CheckUtf8Conform';
176
177 178 179 180 181 182 183 184
185 public function __construct(array $options)
186 {
187 $this->_values = array_merge(self::getDefaults(), $options);
188 $this->validate();
189 }
190
191 192 193 194 195
196 public function getAll()
197 {
198 return $this->_values;
199 }
200
201 202 203 204 205 206 207 208 209 210
211 public function offsetSet($offset, $value)
212 {
213 $this->_values[$offset] = $value;
214 $this->validate();
215 }
216
217 218 219 220 221 222 223
224 public function offsetExists($offset)
225 {
226 return isset($this->_values[$offset]);
227 }
228
229 230 231 232 233 234 235 236 237
238 public function offsetUnset($offset)
239 {
240 unset($this->_values[$offset]);
241 $this->validate();
242 }
243
244 245 246 247 248 249 250 251 252
253 public function offsetGet($offset)
254 {
255 if (!array_key_exists($offset, $this->_values)) {
256 throw new ClientException('Invalid option ' . $offset);
257 }
258
259 return $this->_values[$offset];
260 }
261
262 263 264 265 266 267
268 public function getEndpoint()
269 {
270 if ($this->_endpoint === null) {
271
272 $this->_endpoint = new Endpoint($this->_values[self::OPTION_ENDPOINT]);
273 }
274
275 return $this->_endpoint;
276 }
277
278 279 280 281 282
283 private static function getDefaults()
284 {
285 return [
286 self::OPTION_ENDPOINT => null,
287 self::OPTION_HOST => null,
288 self::OPTION_PORT => DefaultValues::DEFAULT_PORT,
289 self::OPTION_TIMEOUT => DefaultValues::DEFAULT_TIMEOUT,
290 self::OPTION_CREATE => DefaultValues::DEFAULT_CREATE,
291 self::OPTION_UPDATE_POLICY => DefaultValues::DEFAULT_UPDATE_POLICY,
292 self::OPTION_REPLACE_POLICY => DefaultValues::DEFAULT_REPLACE_POLICY,
293 self::OPTION_DELETE_POLICY => DefaultValues::DEFAULT_DELETE_POLICY,
294 self::OPTION_REVISION => null,
295 self::OPTION_WAIT_SYNC => DefaultValues::DEFAULT_WAIT_SYNC,
296 self::OPTION_BATCHSIZE => null,
297 self::OPTION_JOURNAL_SIZE => DefaultValues::DEFAULT_JOURNAL_SIZE,
298 self::OPTION_IS_SYSTEM => false,
299 self::OPTION_IS_VOLATILE => DefaultValues::DEFAULT_IS_VOLATILE,
300 self::OPTION_CLIENT => DefaultValues::DEFAULT_CLIENT,
301 self::OPTION_TRACE => null,
302 self::OPTION_ENHANCED_TRACE => false,
303 self::OPTION_AUTH_USER => null,
304 self::OPTION_AUTH_PASSWD => null,
305 self::OPTION_AUTH_TYPE => null,
306 self::OPTION_RECONNECT => false,
307 self::OPTION_BATCH => false,
308 self::OPTION_BATCHPART => false,
309 self::OPTION_CHECK_UTF8_CONFORM => DefaultValues::DEFAULT_CHECK_UTF8_CONFORM,
310 ];
311 }
312
313 314 315 316 317
318 private static function getSupportedAuthTypes()
319 {
320 return ['Basic'];
321 }
322
323 324 325 326 327
328 private static function getSupportedClientTypes()
329 {
330 return ['Close', 'Keep-Alive'];
331 }
332
333 334 335 336 337 338
339 private function validate()
340 {
341 if (isset($this->_values[self::OPTION_HOST]) && !is_string($this->_values[self::OPTION_HOST])) {
342 throw new ClientException('host should be a string');
343 }
344
345 if (isset($this->_values[self::OPTION_PORT]) && !is_int($this->_values[self::OPTION_PORT])) {
346 throw new ClientException('port should be an integer');
347 }
348
349
350 if (isset($this->_values[self::OPTION_HOST]) && isset($this->_values[self::OPTION_ENDPOINT])) {
351 throw new ClientException('must not specify both host and endpoint');
352 } else {
353 if (isset($this->_values[self::OPTION_HOST]) && !isset($this->_values[self::OPTION_ENDPOINT])) {
354
355 $this->_values[self::OPTION_ENDPOINT] = 'tcp://' . $this->_values[self::OPTION_HOST] . ':' . $this->_values[self::OPTION_PORT];
356 }
357 }
358
359 assert(isset($this->_values[self::OPTION_ENDPOINT]));
360
361 $this->getEndpoint();
362 if (Endpoint::getType($this->_values[self::OPTION_ENDPOINT]) === Endpoint::TYPE_UNIX) {
363
364 $this->_values[self::OPTION_PORT] = 0;
365 }
366
367 if (isset($this->_values[self::OPTION_AUTH_TYPE]) && !in_array(
368 $this->_values[self::OPTION_AUTH_TYPE],
369 self::getSupportedAuthTypes()
370 )
371 ) {
372 throw new ClientException('unsupported authorization method');
373 }
374
375 if (isset($this->_values[self::OPTION_CLIENT]) && !in_array(
376 $this->_values[self::OPTION_CLIENT],
377 self::getSupportedClientTypes()
378 )
379 ) {
380 throw new ClientException(sprintf(
381 "unsupported client value '%s'",
382 $this->_values[self::OPTION_CLIENT]
383 ));
384 }
385
386 UpdatePolicy::validate($this->_values[self::OPTION_UPDATE_POLICY]);
387 UpdatePolicy::validate($this->_values[self::OPTION_REPLACE_POLICY]);
388 UpdatePolicy::validate($this->_values[self::OPTION_DELETE_POLICY]);
389 }
390 }
391