class MongoDbProfilerStorage

Hierarchy

Expanded class hierarchy of MongoDbProfilerStorage

1 file declares its use of MongoDbProfilerStorage
MongoDbProfilerStorageTest.php in drupal/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.php

File

drupal/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php, line 14

Namespace

Symfony\Component\HttpKernel\Profiler
View source
class MongoDbProfilerStorage implements ProfilerStorageInterface {
  protected $dsn;
  protected $lifetime;
  private $mongo;

  /**
   * Constructor.
   *
   * @param string  $dsn      A data source name
   * @param string  $username Not used
   * @param string  $password Not used
   * @param integer $lifetime The lifetime to use for the purge
   */
  public function __construct($dsn, $username = '', $password = '', $lifetime = 86400) {
    $this->dsn = $dsn;
    $this->lifetime = (int) $lifetime;
  }

  /**
   * {@inheritdoc}
   */
  public function find($ip, $url, $limit, $method, $start = null, $end = null) {
    $cursor = $this
      ->getMongo()
      ->find($this
      ->buildQuery($ip, $url, $method, $start, $end), array(
      '_id',
      'parent',
      'ip',
      'method',
      'url',
      'time',
    ))
      ->sort(array(
      'time' => -1,
    ))
      ->limit($limit);
    $tokens = array();
    foreach ($cursor as $profile) {
      $tokens[] = $this
        ->getData($profile);
    }
    return $tokens;
  }

  /**
   * {@inheritdoc}
   */
  public function purge() {
    $this
      ->getMongo()
      ->remove(array());
  }

  /**
   * {@inheritdoc}
   */
  public function read($token) {
    $profile = $this
      ->getMongo()
      ->findOne(array(
      '_id' => $token,
      'data' => array(
        '$exists' => true,
      ),
    ));
    if (null !== $profile) {
      $profile = $this
        ->createProfileFromData($this
        ->getData($profile));
    }
    return $profile;
  }

  /**
   * {@inheritdoc}
   */
  public function write(Profile $profile) {
    $this
      ->cleanup();
    $record = array(
      '_id' => $profile
        ->getToken(),
      'parent' => $profile
        ->getParentToken(),
      'data' => base64_encode(serialize($profile
        ->getCollectors())),
      'ip' => $profile
        ->getIp(),
      'method' => $profile
        ->getMethod(),
      'url' => $profile
        ->getUrl(),
      'time' => $profile
        ->getTime(),
    );
    $result = $this
      ->getMongo()
      ->update(array(
      '_id' => $profile
        ->getToken(),
    ), array_filter($record, function ($v) {
      return !empty($v);
    }), array(
      'upsert' => true,
    ));
    return (bool) (isset($result['ok']) ? $result['ok'] : $result);
  }

  /**
   * Internal convenience method that returns the instance of the MongoDB Collection
   *
   * @return \MongoCollection
   *
   * @throws \RuntimeException
   */
  protected function getMongo() {
    if ($this->mongo === null) {
      if (preg_match('#^(mongodb://.*)/(.*)/(.*)$#', $this->dsn, $matches)) {
        $server = $matches[1] . (!empty($matches[2]) ? '/' . $matches[2] : '');
        $database = $matches[2];
        $collection = $matches[3];
        $mongoClass = version_compare(phpversion('mongo'), '1.3.0', '<') ? '\\Mongo' : '\\MongoClient';
        $mongo = new $mongoClass($server);
        $this->mongo = $mongo
          ->selectCollection($database, $collection);
      }
      else {
        throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use MongoDB with an invalid dsn "%s". The expected format is "mongodb://[user:pass@]host/database/collection"', $this->dsn));
      }
    }
    return $this->mongo;
  }

  /**
   * @param array $data
   *
   * @return Profile
   */
  protected function createProfileFromData(array $data) {
    $profile = $this
      ->getProfile($data);
    if ($data['parent']) {
      $parent = $this
        ->getMongo()
        ->findOne(array(
        '_id' => $data['parent'],
        'data' => array(
          '$exists' => true,
        ),
      ));
      if ($parent) {
        $profile
          ->setParent($this
          ->getProfile($this
          ->getData($parent)));
      }
    }
    $profile
      ->setChildren($this
      ->readChildren($data['token']));
    return $profile;
  }

  /**
   * @param string $token
   *
   * @return Profile[] An array of Profile instances
   */
  protected function readChildren($token) {
    $profiles = array();
    $cursor = $this
      ->getMongo()
      ->find(array(
      'parent' => $token,
      'data' => array(
        '$exists' => true,
      ),
    ));
    foreach ($cursor as $d) {
      $profiles[] = $this
        ->getProfile($this
        ->getData($d));
    }
    return $profiles;
  }
  protected function cleanup() {
    $this
      ->getMongo()
      ->remove(array(
      'time' => array(
        '$lt' => time() - $this->lifetime,
      ),
    ));
  }

  /**
   * @param string $ip
   * @param string $url
   * @param string $method
   * @param int    $start
   * @param int    $end
   *
   * @return array
   */
  private function buildQuery($ip, $url, $method, $start, $end) {
    $query = array();
    if (!empty($ip)) {
      $query['ip'] = $ip;
    }
    if (!empty($url)) {
      $query['url'] = $url;
    }
    if (!empty($method)) {
      $query['method'] = $method;
    }
    if (!empty($start) || !empty($end)) {
      $query['time'] = array();
    }
    if (!empty($start)) {
      $query['time']['$gte'] = $start;
    }
    if (!empty($end)) {
      $query['time']['$lte'] = $end;
    }
    return $query;
  }

  /**
   * @param array $data
   *
   * @return array
   */
  private function getData(array $data) {
    return array(
      'token' => $data['_id'],
      'parent' => isset($data['parent']) ? $data['parent'] : null,
      'ip' => isset($data['ip']) ? $data['ip'] : null,
      'method' => isset($data['method']) ? $data['method'] : null,
      'url' => isset($data['url']) ? $data['url'] : null,
      'time' => isset($data['time']) ? $data['time'] : null,
      'data' => isset($data['data']) ? $data['data'] : null,
    );
  }

  /**
   * @param array $data
   *
   * @return Profile
   */
  private function getProfile(array $data) {
    $profile = new Profile($data['token']);
    $profile
      ->setIp($data['ip']);
    $profile
      ->setMethod($data['method']);
    $profile
      ->setUrl($data['url']);
    $profile
      ->setTime($data['time']);
    $profile
      ->setCollectors(unserialize(base64_decode($data['data'])));
    return $profile;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
MongoDbProfilerStorage::$dsn protected property
MongoDbProfilerStorage::$lifetime protected property
MongoDbProfilerStorage::$mongo private property
MongoDbProfilerStorage::buildQuery private function
MongoDbProfilerStorage::cleanup protected function
MongoDbProfilerStorage::createProfileFromData protected function
MongoDbProfilerStorage::find public function Finds profiler tokens for the given criteria. Overrides ProfilerStorageInterface::find
MongoDbProfilerStorage::getData private function
MongoDbProfilerStorage::getMongo protected function Internal convenience method that returns the instance of the MongoDB Collection 1
MongoDbProfilerStorage::getProfile private function
MongoDbProfilerStorage::purge public function Purges all data from the database. Overrides ProfilerStorageInterface::purge
MongoDbProfilerStorage::read public function Reads data associated with the given token. Overrides ProfilerStorageInterface::read
MongoDbProfilerStorage::readChildren protected function
MongoDbProfilerStorage::write public function Saves a Profile. Overrides ProfilerStorageInterface::write
MongoDbProfilerStorage::__construct public function Constructor.