* @link http://netmonsters.ru * @package Majestic * @subpackage db * @since 2011-11-15 */ /** * @property MongoDriver $driver * @property MongoCursor $result */ class MongoStatement extends DbStatement { protected $insertId = false; public function count() { if ($this->result instanceof MongoCursor) { return $this->result->count(); } else { throw new GeneralException('MongoStatement error. Impossible count result of opened cursor.'); } } public function order($sort = array()) { if ($this->result instanceof MongoCursor) { $this->result->sort($sort); return $this; } else { throw new GeneralException('MongoStatement error. Impossible order results of opened cursor.'); } } public function skip($skip = 0) { if ($this->result instanceof MongoCursor) { $this->result->skip($skip); return $this; } else { throw new GeneralException('MongoStatement error. Impossible skip results of opened cursor.'); } } public function limit($limit = 0) { if ($this->result instanceof MongoCursor) { $this->result->limit($limit); return $this; } else { throw new GeneralException('MongoStatement error. Impossible limit results of opened cursor.'); } } public function fetch($style = Db::FETCH_OBJ) { if (!$this->result) { return false; } if (is_array($this->result) && isset($this->result['retval'])) { return $this->result['retval']; } switch ($style) { case Db::FETCH_OBJ: $row = $this->fetchObject(); break; case Db::FETCH_ASSOC: if ($this->result instanceof MongoCursor) { $row = $this->result->getNext(); } else { $row = $this->result; } break; default: throw new GeneralException('Invalid fetch mode "' . $style . '" specified'); } return $row; } public function fetchObject($class = 'stdClass') { if ($this->result instanceof MongoCursor) { $row = $this->result->getNext(); } else { $row = $this->result; } if (is_array($row) && isset($row['_id'])) { $row = new ArrayObject($row, ArrayObject::ARRAY_AS_PROPS); } else { $row = false; } return $row; } public function close() { $this->result = null; } /** * @return int */ public function affectedRows() { if (is_array($this->result)) { if (isset($this->result['ok']) && $this->result['ok'] == 1) { if (isset($this->result['n'])) { return $this->result['n']; } } else { return false; } } elseif (is_int($this->result) || $this->result instanceof MongoId) { return $this->result; } return false; } public function numRows() { if ($this->result instanceof MongoCursor) { return $this->result->count(); } else { return false; } } /** * @param MongoDbCommand $request * @throws GeneralException * @return bool */ protected function driverExecute($request) { $this->result = false; $mongo = $this->driver->getConnection(); if ($mongo instanceof Mongo) { if (Config::get('PROFILER_DETAILS')) { $profiler = Profiler::getInstance()->profilerCommand('Mongo', $request); $result = $request->execute(); $profiler->end(); } else { $result = $request->execute(); } if ($result === false) { throw new GeneralException('MongoDB request error.'); } if ($result instanceof MongoCursor || is_array($result)) { $this->result = $result; if (is_array($result) && isset($result['value'])) { $this->result = $result['value']; } if (is_array($result) && isset($result['values'])) { $this->result = $result['values']; } if (is_array($result) && isset($result['upserted'])) { $this->result = $result['n'] > 1 ? $result['n'] : $result['upserted']; } } elseif (is_int($result)) { $this->result = $result; } if ($request instanceof InsertMongoCommand) { $this->insertId = $request->getInsertId(); } return true; } else { throw new GeneralException('No connection to MongoDB server.'); } } public function bindParam($param, &$value) { $this->request->bindParam($param, $value); } protected function assemble() { return $this->request; } public function getInsertId() { return $this->insertId; } }