PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/concrete/vendor/zendframework/zend-queue/library/ZendQueue/Adapter/ArrayAdapter.php

https://gitlab.com/koodersmiikka/operaatio-terveys
PHP | 316 lines | 145 code | 37 blank | 134 comment | 16 complexity | bf7a2fcc8491b5fecd5be7d637e298bc MD5 | raw file
  1. <?php
  2. /**
  3. * Zend Framework (http://framework.zend.com/)
  4. *
  5. * @link http://github.com/zendframework/zf2 for the canonical source repository
  6. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  7. * @license http://framework.zend.com/license/new-bsd New BSD License
  8. * @package Zend_Queue
  9. */
  10. namespace ZendQueue\Adapter;
  11. use ZendQueue\Exception;
  12. use ZendQueue\Message;
  13. use ZendQueue\Queue;
  14. /**
  15. * Class for using a standard PHP array as a queue
  16. *
  17. * @category Zend
  18. * @package Zend_Queue
  19. * @subpackage Adapter
  20. */
  21. class ArrayAdapter extends AbstractAdapter
  22. {
  23. /**
  24. * @var array
  25. */
  26. protected $_data = array();
  27. /********************************************************************
  28. * Queue management functions
  29. *********************************************************************/
  30. /**
  31. * Does a queue already exist?
  32. *
  33. * Throws an exception if the adapter cannot determine if a queue exists.
  34. * use isSupported('isExists') to determine if an adapter can test for
  35. * queue existance.
  36. *
  37. * @param string $name
  38. * @return boolean
  39. */
  40. public function isExists($name)
  41. {
  42. return array_key_exists($name, $this->_data);
  43. }
  44. /**
  45. * Create a new queue
  46. *
  47. * Visibility timeout is how long a message is left in the queue "invisible"
  48. * to other readers. If the message is acknowleged (deleted) before the
  49. * timeout, then the message is deleted. However, if the timeout expires
  50. * then the message will be made available to other queue readers.
  51. *
  52. * @param string $name queue name
  53. * @param integer $timeout default visibility timeout
  54. * @return boolean
  55. */
  56. public function create($name, $timeout=null)
  57. {
  58. if ($this->isExists($name)) {
  59. return false;
  60. }
  61. if ($timeout === null) {
  62. $timeout = self::CREATE_TIMEOUT_DEFAULT;
  63. }
  64. $this->_data[$name] = array();
  65. return true;
  66. }
  67. /**
  68. * Delete a queue and all of it's messages
  69. *
  70. * Returns false if the queue is not found, true if the queue exists
  71. *
  72. * @param string $name queue name
  73. * @return boolean
  74. */
  75. public function delete($name)
  76. {
  77. $found = isset($this->_data[$name]);
  78. if ($found) {
  79. unset($this->_data[$name]);
  80. }
  81. return $found;
  82. }
  83. /**
  84. * Get an array of all available queues
  85. *
  86. * Not all adapters support getQueues(), use isSupported('getQueues')
  87. * to determine if the adapter supports this feature.
  88. *
  89. * @return array
  90. */
  91. public function getQueues()
  92. {
  93. return array_keys($this->_data);
  94. }
  95. /**
  96. * Return the approximate number of messages in the queue
  97. *
  98. * @param \ZendQueue\Queue $queue
  99. * @return integer
  100. * @throws \ZendQueue\Exception
  101. */
  102. public function count(Queue $queue=null)
  103. {
  104. if ($queue === null) {
  105. $queue = $this->_queue;
  106. }
  107. if (!isset($this->_data[$queue->getName()])) {
  108. throw new Exception\QueueNotFoundException('Queue does not exist');
  109. }
  110. return count($this->_data[$queue->getName()]);
  111. }
  112. /********************************************************************
  113. * Messsage management functions
  114. *********************************************************************/
  115. /**
  116. * Send a message to the queue
  117. *
  118. * @param string $message Message to send to the active queue
  119. * @param \ZendQueue\Queue $queue
  120. * @return \ZendQueue\Message
  121. * @throws \ZendQueue\Exception
  122. */
  123. public function send($message, Queue $queue=null)
  124. {
  125. if ($queue === null) {
  126. $queue = $this->_queue;
  127. }
  128. if (!$this->isExists($queue->getName())) {
  129. throw new Exception\QueueNotFoundException('Queue does not exist:' . $queue->getName());
  130. }
  131. // create the message
  132. $data = array(
  133. 'message_id' => md5(uniqid(rand(), true)),
  134. 'body' => $message,
  135. 'md5' => md5($message),
  136. 'handle' => null,
  137. 'created' => time(),
  138. 'queue_name' => $queue->getName(),
  139. );
  140. // add $data to the "queue"
  141. $this->_data[$queue->getName()][] = $data;
  142. $options = array(
  143. 'queue' => $queue,
  144. 'data' => $data,
  145. );
  146. $classname = $queue->getMessageClass();
  147. return new $classname($options);
  148. }
  149. /**
  150. * Get messages in the queue
  151. *
  152. * @param integer $maxMessages Maximum number of messages to return
  153. * @param integer $timeout Visibility timeout for these messages
  154. * @param \ZendQueue\Queue $queue
  155. * @return \ZendQueue\Message\MessageIterator
  156. */
  157. public function receive($maxMessages = null, $timeout = null, Queue $queue = null)
  158. {
  159. if ($maxMessages === null) {
  160. $maxMessages = 1;
  161. }
  162. if ($timeout === null) {
  163. $timeout = self::RECEIVE_TIMEOUT_DEFAULT;
  164. }
  165. if ($queue === null) {
  166. $queue = $this->_queue;
  167. }
  168. $data = array();
  169. if ($maxMessages > 0) {
  170. $start_time = microtime(true);
  171. $count = 0;
  172. $temp = &$this->_data[$queue->getName()];
  173. foreach ($temp as $key=>&$msg) {
  174. // count check has to be first, as someone can ask for 0 messages
  175. // ZF-7650
  176. if ($count >= $maxMessages) {
  177. break;
  178. }
  179. if (($msg['handle'] === null)
  180. || ($msg['timeout'] + $timeout < $start_time)
  181. ) {
  182. $msg['handle'] = md5(uniqid(rand(), true));
  183. $msg['timeout'] = microtime(true);
  184. $data[] = $msg;
  185. $count++;
  186. }
  187. }
  188. }
  189. $options = array(
  190. 'queue' => $queue,
  191. 'data' => $data,
  192. 'messageClass' => $queue->getMessageClass(),
  193. );
  194. $classname = $queue->getMessageSetClass();
  195. return new $classname($options);
  196. }
  197. /**
  198. * Delete a message from the queue
  199. *
  200. * Returns true if the message is deleted, false if the deletion is
  201. * unsuccessful.
  202. *
  203. * @param \ZendQueue\Message $message
  204. * @return boolean
  205. * @throws \ZendQueue\Exception
  206. */
  207. public function deleteMessage(Message $message)
  208. {
  209. // load the queue
  210. $queue = &$this->_data[$message->queue_name];
  211. foreach ($queue as $key => &$msg) {
  212. if ($msg['handle'] == $message->handle) {
  213. unset($queue[$key]);
  214. return true;
  215. }
  216. }
  217. return false;
  218. }
  219. /********************************************************************
  220. * Supporting functions
  221. *********************************************************************/
  222. /**
  223. * Return a list of queue capabilities functions
  224. *
  225. * $array['function name'] = true or false
  226. * true is supported, false is not supported.
  227. *
  228. * @param string $name
  229. * @return array
  230. */
  231. public function getCapabilities()
  232. {
  233. return array(
  234. 'create' => true,
  235. 'delete' => true,
  236. 'send' => true,
  237. 'receive' => true,
  238. 'deleteMessage' => true,
  239. 'getQueues' => true,
  240. 'count' => true,
  241. 'isExists' => true,
  242. );
  243. }
  244. /********************************************************************
  245. * Functions that are not part of the \ZendQueue\Adapter\AdapterAbstract
  246. *********************************************************************/
  247. /**
  248. * serialize
  249. */
  250. public function __sleep()
  251. {
  252. return array('_data');
  253. }
  254. /*
  255. * These functions are debug helpers.
  256. */
  257. /**
  258. * returns underlying _data array
  259. * $queue->getAdapter()->getData();
  260. *
  261. * @return $this;
  262. */
  263. public function getData()
  264. {
  265. return $this->_data;
  266. }
  267. /**
  268. * sets the underlying _data array
  269. * $queue->getAdapter()->setData($data);
  270. *
  271. * @param $data array
  272. * @return $this;
  273. */
  274. public function setData($data)
  275. {
  276. $this->_data = $data;
  277. return $this;
  278. }
  279. }