Skip to content

Commit

Permalink
Merge pull request #3 from andrey-mokhov/1.3.0-dev
Browse files Browse the repository at this point in the history
Prepend 1.3.0 release
  • Loading branch information
andrey-mokhov committed Apr 12, 2017
2 parents ca9db82 + 7ea0b00 commit 9b1e1af
Show file tree
Hide file tree
Showing 22 changed files with 1,042 additions and 126 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,6 @@ nbproject
.idea
.project
.settings
/vendor/
phpunit.xml
/build/
32 changes: 32 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
sudo: false

language: php

matrix:
include:
- php: 5.5
- php: 5.6
env:
- TEST_COVERAGE=true
- php: 7
env: PHPSTAN=1
- php: 7.1
- php: hhvm
allow_failures:
- php: hhvm

before_install:
- if [[ $TEST_COVERAGE != 'true' ]]; then phpenv config-rm xdebug.ini || return 0 ; fi
- composer self-update
- if [[ $TEST_COVERAGE == 'true' ]]; then composer require --dev --no-update satooshi/php-coveralls:^1.0 ; fi

install:
- travis_retry composer install --dev --no-interaction

script:
- mkdir -p build/logs
- vendor/bin/phpunit -c phpunit.xml.dist --colors=always
- if [[ $PHPSTAN = 1 ]]; then composer require --dev phpstan/phpstan:^0.6 && vendor/bin/phpstan analyse -c phpstan.neon -l 3 src; fi

after_script:
- if [[ $TEST_COVERAGE == 'true' ]]; then vendor/bin/coveralls -v ; fi
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
BjyProfiler
===========

1.3.0-dev:
[![Build Status](https://travis-ci.org/andrey-mokhov/BjyProfiler.svg?branch=1.3.0-dev)](https://travis-ci.org/andrey-mokhov/BjyProfiler.svg?branch=1.3.0-dev)
[![Coverage Status](https://coveralls.io/repos/github/andrey-mokhov/BjyProfiler/badge.svg?branch=1.3.0-dev)](https://coveralls.io/github/andrey-mokhov/BjyProfiler?branch=1.3.0-dev)

Provides Zend\Db adapters with extensions for database query profiling, as well as a profiler similar to ZF1's Zend\_Db\_Profiler.
I ported much of this code from ZF1's Zend_Db.

Expand Down
13 changes: 10 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"profiler",
"zdt"
],
"homepage": "https://github.com/bjyoungblood/BjyProfiler",
"homepage": "https://github.com/andrey-mokhov/BjyProfiler",
"authors": [
{
"name": "Ben Youngblood",
Expand All @@ -23,8 +23,11 @@
}
],
"require": {
"php": ">=5.5",
"zendframework/zend-db": ">=2.8.0"
"php": "^5.5 || ^7.0",
"zendframework/zend-servicemanager": "^3.0.3",
"zendframework/zend-modulemanager": "^2.7",
"zendframework/zend-db": "^2.7",
"zendframework/zend-log": "^2.7"
},
"autoload": {
"psr-4": {
Expand All @@ -36,5 +39,9 @@
"module": "BjyProfiler",
"config-provider": "BjyProfiler\\ConfigProvider"
}
},
"require-dev": {
"phpunit/phpunit": "^4.0 || ^5.0",
"zendframework/zend-mvc": "^2.7 || ^3.0"
}
}
Empty file added phpstan.neon
Empty file.
34 changes: 34 additions & 0 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
colors="true">
<testsuites>
<testsuite name="BjyProfiler Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>

<groups>
<exclude>
<group>disable</group>
</exclude>
</groups>

<filter>
<whitelist addUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./src</directory>
</whitelist>
</filter>

<logging>
<log type="coverage-clover" target="build/logs/clover.xml"/>
</logging>

<php>
<ini name="date.timezone" value="UTC"/>

<!-- Integration Test Variables -->
<env name="TESTS_ZEND_DB_ADAPTER_DRIVER_SQLITE_ENABLED" value="true" />
<env name="TESTS_ZEND_DB_ADAPTER_DRIVER_SQLITE_DATABASE" value=":memory:" />
</php>
</phpunit>
4 changes: 2 additions & 2 deletions src/ConfigProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
class ConfigProvider
{
/**
* Retrieve zend-db default configuration.
* Retrieve BjyProfiler default configuration.
*
* @return array
*/
Expand All @@ -25,7 +25,7 @@ public function __invoke()
}

/**
* Retrieve zend-db default dependency configuration.
* Retrieve BjyProfiler default dependency configuration.
*
* @return array
*/
Expand Down
63 changes: 0 additions & 63 deletions src/Db/Adapter/ProfilingAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,72 +2,9 @@

namespace BjyProfiler\Db\Adapter;

use BjyProfiler\Db\Profiler\Profiler;
use Zend\Db\Adapter\Adapter;
use Zend\Db\Adapter\Driver as ZdbDriver;
use Zend\Db\Adapter\Profiler\ProfilerInterface;
use Zend\Db\ResultSet;

class ProfilingAdapter extends Adapter
{
protected $profiler;

public function setProfiler(ProfilerInterface $p)
{
$this->profiler = $p;
return $this;
}

public function getProfiler()
{
return $this->profiler;
}

public function query($sql, $parametersOrQueryMode = self::QUERY_MODE_PREPARE, ResultSet\ResultSetInterface $resultPrototype = null)
{
$this->getProfiler()->startQuery($sql);
$return = parent::query($sql, $parametersOrQueryMode, $resultPrototype);
$this->getProfiler()->endQuery();
return $return;
}

public function injectProfilingStatementPrototype(array $options = array())
{
$profiler = $this->getProfiler();
if (!$profiler instanceof Profiler) {
throw new \InvalidArgumentException('No profiler attached!');
}

$driver = $this->getDriver();
if (method_exists($driver, 'registerStatementPrototype')) {
$driverName = get_class($driver);
switch ($driverName) {
case 'Zend\Db\Adapter\Driver\IbmDb2\IbmDb2':
$statementPrototype = new ZdbDriver\IbmDb2\Statement();
break;
case 'Zend\Db\Adapter\Driver\Mysqli\Mysqli':
$defaults = array('buffer_results' => false);
$options = array_intersect_key(array_merge($defaults, $options), $defaults);

$statementPrototype = new ZdbDriver\Mysqli\Statement($options['buffer_results']);
break;
case 'Zend\Db\Adapter\Driver\Oci8\Oci8':
$statementPrototype = new ZdbDriver\Oci8\Statement();
break;
case 'Zend\Db\Adapter\Driver\Sqlsrv\Sqlsrv':
$statementPrototype = new ZdbDriver\Sqlsrv\Statement();
break;
case 'Zend\Db\Adapter\Driver\Pgsql\Pgsql':
$statementPrototype = new ZdbDriver\Pgsql\Statement();
break;
case 'Zend\Db\Adapter\Driver\Pdo\Pdo':
default:
$statementPrototype = new ZdbDriver\Pdo\Statement();
}

$statementPrototype->setProfiler($this->getProfiler());
$driver->registerStatementPrototype($statementPrototype);
}
}
}

15 changes: 5 additions & 10 deletions src/Db/Adapter/ProfilingAdapterFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

use BjyProfiler\Db\Profiler;
use Interop\Container\ContainerInterface;
use Zend\Log;
use Zend\ServiceManager\Factory\FactoryInterface;

class ProfilingAdapterFactory implements FactoryInterface
Expand All @@ -17,21 +18,15 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o
$config = $container->get('Configuration');
$adapter = new ProfilingAdapter($config['db']);

if (php_sapi_name() == 'cli') {
$logger = new \Zend\Log\Logger();
if ('cli' === php_sapi_name()) {
$logger = new Log\Logger();
// write queries profiling info to stdout in CLI mode
$writer = new \Zend\Log\Writer\Stream('php://output');
$logger->addWriter($writer, \Zend\Log\Logger::DEBUG);
$writer = new Log\Writer\Stream('php://output');
$logger->addWriter($writer, Log\Logger::DEBUG);
$adapter->setProfiler(new Profiler\LoggingProfiler($logger));
} else {
$adapter->setProfiler(new Profiler\Profiler());
}
if (isset($config['db']['options']) && is_array($config['db']['options'])) {
$options = $config['db']['options'];
} else {
$options = array();
}
$adapter->injectProfilingStatementPrototype($options);
return $adapter;
}
}
59 changes: 47 additions & 12 deletions src/Db/Profiler/LoggingProfiler.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

namespace BjyProfiler\Db\Profiler;


use Zend\Log\Logger;

class LoggingProfiler extends Profiler
Expand Down Expand Up @@ -36,35 +35,60 @@ class LoggingProfiler extends Profiler
* @var array
* @see Query
*/
protected $parametersStart = array('sql', 'parameters');
protected $parametersStart = ['sql', 'parameters'];
/**
* Query parameters to log on query finish
*
* @var array
* @see Query
*/
protected $parametersFinish = array('elapsed');
protected $parametersFinish = ['elapsed'];

public function __construct(Logger $logger, $enabled = true, array $options = array())
/**
* LoggingProfiler constructor.
* @param Logger $logger
* @param bool $enabled
* @param array $options
*/
public function __construct(Logger $logger, $enabled = true, array $options = [])
{
parent::__construct($enabled);
$this->setLogger($logger);

if (isset($options['priority'])) $this->setPriority($options['priority']);
if (isset($options['maxProfiles'])) $this->setMaxProfiles($options['maxProfiles']);
if (isset($options['parametersStart'])) $this->setParametersStart($options['parametersStart']);
if (isset($options['parametersFinish'])) $this->setParametersFinish($options['parametersFinish']);
if (isset($options['priority'])) {
$this->setPriority($options['priority']);
}
if (isset($options['maxProfiles'])) {
$this->setMaxProfiles($options['maxProfiles']);
}
if (isset($options['parametersStart'])) {
$this->setParametersStart($options['parametersStart']);
}
if (isset($options['parametersFinish'])) {
$this->setParametersFinish($options['parametersFinish']);
}
}

/**
* @param string $sql
* @param null $parameters
* @param null $stack
* @return int|bool
*/
public function startQuery($sql, $parameters = null, $stack = null) {
parent::startQuery($sql, $parameters, $stack);
$result = parent::startQuery($sql, $parameters, $stack);
$this->logStart();
return $result;
}

/**
* @return bool
*/
public function endQuery() {
parent::endQuery();
$result = parent::endQuery();
$this->logEnd();
$this->trimToMaxQueries();
return $result;
}

private function logStart() {
Expand Down Expand Up @@ -96,10 +120,13 @@ private function trimToMaxQueries() {

/**
* @param int $level
* @return static
*/
public function setPriority($level)
{
$this->priority = $level;

return $this;
}

/**
Expand All @@ -111,15 +138,17 @@ public function getPriority()
}

/**
* @param \Zend\Log\Logger $logger
* @param Logger $logger
* @return static
*/
public function setLogger(Logger $logger)
{
$this->logger = $logger;
return $this;
}

/**
* @return \Zend\Log\Logger
* @return Logger
*/
public function getLogger()
{
Expand All @@ -128,10 +157,12 @@ public function getLogger()

/**
* @param int $maxProfiles
* @return static
*/
public function setMaxProfiles($maxProfiles)
{
$this->maxProfiles = $maxProfiles;
return $this;
}

/**
Expand All @@ -144,10 +175,12 @@ public function getMaxProfiles()

/**
* @param array $parametersFinish
* @return static
*/
public function setParametersFinish(array $parametersFinish)
{
$this->parametersFinish = $parametersFinish;
return $this;
}

/**
Expand All @@ -160,10 +193,12 @@ public function getParametersFinish()

/**
* @param array $parametersStart
* @return static
*/
public function setParametersStart(array $parametersStart)
{
$this->parametersStart = $parametersStart;
return $this;
}

/**
Expand Down
Loading

0 comments on commit 9b1e1af

Please sign in to comment.