You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
3.1 KiB
145 lines
3.1 KiB
<?php
|
|
|
|
/*
|
|
|
|
Copyright (c) 2009-2019 F3::Factory/Bong Cosca, All rights reserved.
|
|
|
|
This file is part of the Fat-Free Framework (http://fatfreeframework.com).
|
|
|
|
This is free software: you can redistribute it and/or modify it under the
|
|
terms of the GNU General Public License as published by the Free Software
|
|
Foundation, either version 3 of the License, or later.
|
|
|
|
Fat-Free Framework is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with Fat-Free Framework. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
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]);
|
|
}
|
|
}
|
|
|
|
}
|
|
|