5 use \pq\Query\Executor
;
6 use \pq\Query\WriterInterface
;
9 * An asynchronous query executor
11 class AsyncExecutor
extends Executor
32 * Set (promise) callbacks
34 * Example with reactphp:
36 * use React\Promise\Deferred;
38 * $exec = new pq\Query\AsyncExecutor(new pq\Connection);
39 * $exec->setCallbacks(
42 * return new Deferred;
45 * function(Deferred $context, $result) {
46 * $context->resolve($result);
49 * function(Deferred $context, callable $cb) {
50 * return $context->promise()->then($cb);
52 * $exec->execute($queryWriter, function($result){});
59 * $exec = new pq\Query\AsyncExecutor(new pq\Connection);
60 * $exec->setCallbacks(
63 * return new Deferred;
66 * function(Deferred $context, $result) {
67 * $context->succeed($result);
70 * function(Deferred $context, callable $cb) {
71 * return $context->promise()->when(function($error, $result) use ($cb) {
75 * $exec->execute($queryWriter, function($result){});
78 * @param callable $init context initializer as function()
79 * @param callable $done result receiver as function($context, $result)
80 * @param callable $then callback queue as function($context, $callback)
82 function setCallbacks(callable
$init, callable
$done, callable
$then) {
89 * Get (promise) callbacks previously set
90 * @return array(callable)
92 function getCallbacks() {
93 return array($this->init
, $this->done
, $this->then
);
97 * Prepare (promise) callbacks
98 * @param callable $callback
99 * @return array($context, $resolver)
101 protected function prepareCallbacks(callable
$callback/*, ... */) {
102 list($init, $done, $then) = $this->getCallbacks();
105 foreach (func_get_args() as $cb) {
106 $then($context, $cb);
109 return array($context, function($result) use ($context, $done) {
110 $done($context, $result);
115 * Execute the query asynchronously through \pq\Connection::execParamsAsync()
116 * @param \pq\Query\WriterInterface $query
117 * @param callable $callback result callback
118 * @return mixed context created by the init callback
120 function execute(WriterInterface
$query, callable
$callback) {
121 $this->result
= null;
122 $this->query
= $query;
125 list($context, $resolver) = $this->prepareCallbacks(
126 function(\pq\Result
$result) {
127 $this->result
= $result;
131 $this->getConnection()->execParamsAsync($query, $query->getParams(),
132 $query->getTypes(), $resolver);