public function _run(Query $query, $options) { if (isset($options) && !is_array($options)) { throw new RqlDriverError("Options must be an array."); } if (!$this->isOpen()) { throw new RqlDriverError("Not connected."); } // Generate a token for the request $tries = 0; $maxToken = 1 << 30; do { $token = rand(0, $maxToken); $haveCollision = isset($this->activeTokens[$token]); } while ($haveCollision && $tries++ < 1024); if ($haveCollision) { throw new RqlDriverError("Unable to generate a unique token for the query."); } // Send the request $pbTerm = $query->_getPBTerm(); $pbQuery = $this->makeQuery(); $pbQuery->setToken($token); $pbQuery->setType(pb\Query_QueryType::PB_START); $pbQuery->setQuery($pbTerm); if (isset($this->defaultDb)) { $pair = new pb\Query_AssocPair(); $pair->setKey('db'); $pair->setVal($this->defaultDb->_getPBTerm()); $pbQuery->appendGlobalOptargs($pair); } if (isset($options)) { foreach ($options as $key => $value) { $pair = new pb\Query_AssocPair(); $pair->setKey($key); $pair->setVal(nativeToDatum($value)->_getPBTerm()); $pbQuery->appendGlobalOptargs($pair); } } $this->sendProtobuf($pbQuery); if (isset($options) && isset($options['noreply']) && $options['noreply'] === true) { return null; } else { // Await the response $response = $this->receiveResponse($token, $query); if ($response->getType() == pb\Response_ResponseType::PB_SUCCESS_PARTIAL) { $this->activeTokens[$token] = true; } if ($response->getType() == pb\Response_ResponseType::PB_SUCCESS_ATOM) { return $this->createDatumFromResponse($response); } else { return $this->createCursorFromResponse($response); } } }