Example #1
0
 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);
         }
     }
 }