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->resolver()->resolve($result);
49 * function(Deferred $context, callable $cb) {
50 * return $context->then($cb);
52 * $exec->execute($queryWriter, function($result){});
58 * use function Amp\reactor;
60 * $exec = new pq\Query\AsyncExecutor(new pq\Connection);
61 * $exec->setCallbacks(
64 * return new Future(reactor());
67 * function(Future $context, $result) {
68 * $context->succeed($result);
71 * function(Future $context, callable $cb) {
72 * return $context->when(function ($error, $result) use ($cb) {
76 * $exec->execute($queryWriter, function($result){});
79 * @param callable $init context initializer as function()
80 * @param callable $done result receiver as function($context, $result)
81 * @param callable $then callback queue as function($context, $callback)
83 function setCallbacks(callable
$init, callable
$done, callable
$then) {
90 * Get (promise) callbacks previously set
91 * @return array(callable)
93 function getCallbacks() {
94 return array($this->init
, $this->done
, $this->then
);
98 * Prepare (promise) callbacks
99 * @param callable $callback
100 * @return array($context, $resolver)
102 protected function prepareCallbacks(callable
$callback/*, ... */) {
103 list($init, $done, $then) = $this->getCallbacks();
106 foreach (func_get_args() as $cb) {
107 $then($context, $cb);
110 return array($context, function($result) use ($context, $done) {
111 $done($context, $result);
116 * Execute the query asynchronously through \pq\Connection::execParamsAsync()
117 * @param \pq\Query\WriterInterface $query
118 * @param callable $callback result callback
119 * @return mixed context created by the init callback
121 function execute(WriterInterface
$query, callable
$callback) {
122 $this->result
= null;
123 $this->query
= $query;
126 list($context, $resolver) = $this->prepareCallbacks(
127 function(\pq\Result
$result) {
128 $this->result
= $result;
131 $this->getConnection()->execParamsAsync($query, $query->getParams(),
132 $query->getTypes(), $resolver);