. */ namespace DB; //! MongoDB wrapper class Mongo { //@{ const E_Profiler='MongoDB profiler is disabled'; //@} protected //! UUID $uuid, //! Data source name $dsn, //! MongoDB object $db, //! Legacy flag $legacy, //! MongoDB log $log; /** * Return data source name * @return string **/ function dsn() { return $this->dsn; } /** * Return UUID * @return string **/ function uuid() { return $this->uuid; } /** * Return MongoDB profiler results (or disable logging) * @param $flag bool * @return string **/ function log($flag=TRUE) { if ($flag) { $cursor=$this->db->selectcollection('system.profile')->find(); foreach (iterator_to_array($cursor) as $frame) if (!preg_match('/\.system\..+$/',$frame['ns'])) $this->log.=date('r',$this->legacy() ? $frame['ts']->sec : (round((string)$frame['ts'])/1000)). ' ('.sprintf('%.1f',$frame['millis']).'ms) '. $frame['ns'].' ['.$frame['op'].'] '. (empty($frame['query'])? '':json_encode($frame['query'])). (empty($frame['command'])? '':json_encode($frame['command'])). PHP_EOL; } else { $this->log=FALSE; if ($this->legacy) $this->db->setprofilinglevel(-1); else $this->db->command(['profile'=>-1]); } return $this->log; } /** * Intercept native call to re-enable profiler * @return int **/ function drop() { $out=$this->db->drop(); if ($this->log!==FALSE) { if ($this->legacy) $this->db->setprofilinglevel(2); else $this->db->command(['profile'=>2]); } return $out; } /** * Redirect call to MongoDB object * @return mixed * @param $func string * @param $args array **/ function __call($func,array $args) { return call_user_func_array([$this->db,$func],$args); } /** * Return TRUE if legacy driver is loaded * @return bool **/ function legacy() { return $this->legacy; } //! Prohibit cloning private function __clone() { } /** * Instantiate class * @param $dsn string * @param $dbname string * @param $options array **/ function __construct($dsn,$dbname,array $options=NULL) { $this->uuid=\Base::instance()->hash($this->dsn=$dsn); if ($this->legacy=class_exists('\MongoClient')) { $this->db=new \MongoDB(new \MongoClient($dsn,$options?:[]),$dbname); $this->db->setprofilinglevel(2); } else { $this->db=(new \MongoDB\Client($dsn,$options?:[]))->$dbname; $this->db->command(['profile'=>2]); } } }