Skip to content

Commit

Permalink
Logging and profiling at Mongo improved.
Browse files Browse the repository at this point in the history
  • Loading branch information
klimov-paul committed Dec 5, 2013
1 parent e2f587a commit 99b6ae2
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 9 deletions.
4 changes: 2 additions & 2 deletions extensions/mongo/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -426,11 +426,11 @@ public function distinct($column, $condition = [])
*/
public function aggregate($pipeline, $pipelineOperator = [])
{
$token = 'Aggregating from ' . $this->getFullName();
$args = func_get_args();
$token = $this->composeLogToken('aggregate', $args);
Yii::info($token, __METHOD__);
try {
Yii::beginProfile($token, __METHOD__);
$args = func_get_args();
$result = call_user_func_array([$this->mongoCollection, 'aggregate'], $args);
$this->tryResultError($result);
Yii::endProfile($token, __METHOD__);
Expand Down
66 changes: 63 additions & 3 deletions extensions/mongo/Database.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@

use yii\base\Object;
use Yii;
use yii\helpers\Json;

/**
* Database represents the Mongo database information.
*
* @property string $name name of this database. This property is read-only.
*
* @author Paul Klimov <[email protected]>
* @since 2.0
*/
Expand All @@ -31,6 +34,14 @@ class Database extends Object
*/
private $_fileCollections = [];

/**
* @return string name of this database.
*/
public function getName()
{
return $this->mongoDb->__toString();
}

/**
* Returns the Mongo collection with the given name.
* @param string $name collection name
Expand Down Expand Up @@ -93,20 +104,69 @@ protected function selectFileCollection($prefix)
* @param string $name name of the collection
* @param array $options collection options in format: "name" => "value"
* @return \MongoCollection new mongo collection instance.
* @throws Exception on failure.
*/
public function createCollection($name, $options = [])
{
return $this->mongoDb->createCollection($name, $options);
$token = $this->getName() . '.create(' . $name . ', ' . Json::encode($options) . ')';
Yii::info($token, __METHOD__);
try {
Yii::beginProfile($token, __METHOD__);
$result = $this->mongoDb->createCollection($name, $options);
Yii::endProfile($token, __METHOD__);
return $result;
} catch (\Exception $e) {
Yii::endProfile($token, __METHOD__);
throw new Exception($e->getMessage(), (int)$e->getCode(), $e);
}
}

/**
* Executes Mongo command.
* @param array $command command specification.
* @param array $options options in format: "name" => "value"
* @return array database response.
* @throws Exception on failure.
*/
public function execute($command, $options = [])
public function executeCommand($command, $options = [])
{
return $this->mongoDb->command($command, $options);
$token = $this->getName() . '.$cmd(' . Json::encode($command) . ', ' . Json::encode($options) . ')';
Yii::info($token, __METHOD__);
try {
Yii::beginProfile($token, __METHOD__);
$result = $this->mongoDb->command($command, $options);
$this->tryResultError($result);
Yii::endProfile($token, __METHOD__);
return $result;
} catch (\Exception $e) {
Yii::endProfile($token, __METHOD__);
throw new Exception($e->getMessage(), (int)$e->getCode(), $e);
}
}

/**
* Checks if command execution result ended with an error.
* @param mixed $result raw command execution result.
* @throws Exception if an error occurred.
*/
protected function tryResultError($result)
{
if (is_array($result)) {
if (!empty($result['errmsg'])) {
$errorMessage = $result['errmsg'];
} elseif (!empty($result['err'])) {
$errorMessage = $result['err'];
}
if (isset($errorMessage)) {
if (array_key_exists('ok', $result)) {
$errorCode = (int)$result['ok'];
} else {
$errorCode = 0;
}
throw new Exception($errorMessage, $errorCode);
}
} elseif (!$result) {
throw new Exception('Unknown error, use "w=1" option to enable error tracking');
}
}
}
4 changes: 2 additions & 2 deletions extensions/mongo/Query.php
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ protected function buildCursor($db = null)
*/
protected function fetchRows($cursor, $all = true, $indexBy = null)
{
$token = 'Querying: ' . Json::encode($cursor->info());
$token = 'find(' . Json::encode($cursor->info()) . ')';
Yii::info($token, __METHOD__);
try {
Yii::beginProfile($token, __METHOD__);
Expand Down Expand Up @@ -213,7 +213,7 @@ public function one($db = null)
public function count($q = '*', $db = null)
{
$cursor = $this->buildCursor($db);
$token = 'Counting: ' . Json::encode($cursor->info());
$token = 'find.count(' . Json::encode($cursor->info()) . ')';
Yii::info($token, __METHOD__);
try {
Yii::beginProfile($token, __METHOD__);
Expand Down
11 changes: 9 additions & 2 deletions tests/unit/extensions/mongo/DatabaseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,22 @@ public function testGetFileCollection()
$this->assertFalse($collection === $collectionRefreshed);
}

public function testCommand()
public function testExecuteCommand()
{
$database = $connection = $this->getConnection()->getDatabase();

$result = $database->execute([
$result = $database->executeCommand([
'distinct' => 'customer',
'key' => 'name'
]);
$this->assertTrue(array_key_exists('ok', $result));
$this->assertTrue(array_key_exists('values', $result));
}

public function testCreateCollection()
{
$database = $connection = $this->getConnection()->getDatabase();
$collection = $database->createCollection('customer');
$this->assertTrue($collection instanceof \MongoCollection);
}
}

0 comments on commit 99b6ae2

Please sign in to comment.