diff options
-rw-r--r-- | core/AssetManager/UIAsset/OnDiskUIAsset.php | 2 | ||||
-rw-r--r-- | plugins/DBStats/API.php | 4 | ||||
-rw-r--r-- | plugins/DBStats/DBStats.php | 11 | ||||
-rw-r--r-- | plugins/DBStats/MySQLMetadataDataAccess.php | 70 | ||||
-rwxr-xr-x | plugins/DBStats/MySQLMetadataProvider.php | 52 | ||||
-rw-r--r-- | plugins/DBStats/tests/Mocks/MockDataAccess.php | 151 | ||||
-rw-r--r-- | plugins/DBStats/tests/UI/expected-ui-screenshots/DBStats_admin_page.png | bin | 0 -> 312771 bytes | |||
-rw-r--r-- | tests/PHPUnit/TestingEnvironment.php | 2 | ||||
-rw-r--r-- | tests/lib/screenshot-testing/support/diff-viewer.js | 2 |
9 files changed, 254 insertions, 40 deletions
diff --git a/core/AssetManager/UIAsset/OnDiskUIAsset.php b/core/AssetManager/UIAsset/OnDiskUIAsset.php index f008f8aacd..f724709edf 100644 --- a/core/AssetManager/UIAsset/OnDiskUIAsset.php +++ b/core/AssetManager/UIAsset/OnDiskUIAsset.php @@ -103,7 +103,7 @@ class OnDiskUIAsset extends UIAsset */ private function assetIsReadable() { - return is_readable($this->getAbsoluteLocation()); + return file_exists($this->getAbsoluteLocation()) && is_readable($this->getAbsoluteLocation()); } public function getModificationDate() diff --git a/plugins/DBStats/API.php b/plugins/DBStats/API.php index 6da5604096..c90f327a7c 100644 --- a/plugins/DBStats/API.php +++ b/plugins/DBStats/API.php @@ -34,7 +34,9 @@ class API extends \Piwik\Plugin\API */ protected function __construct() { - $this->metadataProvider = new MySQLMetadataProvider(); + if ($this->metadataProvider === null) { + $this->metadataProvider = new MySQLMetadataProvider(); + } } /** diff --git a/plugins/DBStats/DBStats.php b/plugins/DBStats/DBStats.php index 402f88eb32..3f5a226696 100644 --- a/plugins/DBStats/DBStats.php +++ b/plugins/DBStats/DBStats.php @@ -37,7 +37,8 @@ class DBStats extends \Piwik\Plugin 'Menu.Admin.addItems' => 'addMenu', 'TaskScheduler.getScheduledTasks' => 'getScheduledTasks', 'ViewDataTable.configure' => 'configureViewDataTable', - 'ViewDataTable.getDefaultType' => 'getDefaultTypeViewDataTable' + 'ViewDataTable.getDefaultType' => 'getDefaultTypeViewDataTable', + "TestingEnvironment.addHooks" => 'setupTestEnvironment' ); } @@ -374,4 +375,12 @@ class DBStats extends \Piwik\Plugin $view->config->show_footer_message = Piwik::translate('Mobile_LastUpdated', $lastGenerated); } } + + public function setupTestEnvironment($environment) + { + Piwik::addAction("MySQLMetadataProvider.createDao", function (&$dao) { + require_once dirname(__FILE__) . "/tests/Mocks/MockDataAccess.php"; + $dao = new Mocks\MockDataAccess(); + }); + } } diff --git a/plugins/DBStats/MySQLMetadataDataAccess.php b/plugins/DBStats/MySQLMetadataDataAccess.php new file mode 100644 index 0000000000..e5fee259a1 --- /dev/null +++ b/plugins/DBStats/MySQLMetadataDataAccess.php @@ -0,0 +1,70 @@ +<?php +/** + * Piwik - Open source web analytics + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik\Plugins\DBStats; + +use Piwik\Db; +use Piwik\Config; +use \Exception; + +/** + * Data Access Object that serves MySQL stats. + */ +class MySQLMetadataDataAccess +{ + public function getDBStatus() + { + if (function_exists('mysql_connect')) { + $configDb = Config::getInstance()->database; + $link = mysql_connect($configDb['host'], $configDb['username'], $configDb['password']); + $status = mysql_stat($link); + mysql_close($link); + $status = explode(" ", $status); + } else { + $fullStatus = Db::fetchAssoc('SHOW STATUS'); + if (empty($fullStatus)) { + throw new Exception('Error, SHOW STATUS failed'); + } + + $status = array( + 'Uptime' => $fullStatus['Uptime']['Value'], + 'Threads' => $fullStatus['Threads_running']['Value'], + 'Questions' => $fullStatus['Questions']['Value'], + 'Slow queries' => $fullStatus['Slow_queries']['Value'], + 'Flush tables' => $fullStatus['Flush_commands']['Value'], + 'Open tables' => $fullStatus['Open_tables']['Value'], + 'Opens' => 'unavailable', // not available via SHOW STATUS + 'Queries per second avg' => 'unavailable' // not available via SHOW STATUS + ); + } + + return $status; + } + + public function getTableStatus($tableName) + { + return Db::fetchRow("SHOW TABLE STATUS LIKE ?", array($tableName)); + } + + public function getAllTablesStatus() + { + return Db::fetchAll("SHOW TABLE STATUS"); + } + + public function getRowCountsByArchiveName($tableName, $extraCols) + { + // otherwise, create data table & cache it + $sql = "SELECT name as 'label', COUNT(*) as 'row_count'$extraCols FROM $tableName GROUP BY name"; + return Db::fetchAll($sql); + } + + public function getColumnsFromTable($tableName) + { + return Db::fetchAll("SHOW COLUMNS FROM " . $tableName); + } +}
\ No newline at end of file diff --git a/plugins/DBStats/MySQLMetadataProvider.php b/plugins/DBStats/MySQLMetadataProvider.php index 549752fa35..4f3b346fb4 100755 --- a/plugins/DBStats/MySQLMetadataProvider.php +++ b/plugins/DBStats/MySQLMetadataProvider.php @@ -15,6 +15,7 @@ use Piwik\DataTable; use Piwik\Db; use Piwik\DbHelper; use Piwik\Option; +use Piwik\Piwik; /** * Utility class that provides general information about databases, including the size of @@ -32,11 +33,20 @@ class MySQLMetadataProvider private $tableStatuses = null; /** + * Data access object. + */ + public $dataAccess = null; + + /** * Constructor. */ public function __construct() { - // empty + Piwik::postTestEvent("MySQLMetadataProvider.createDao", array(&$this->dataAccess)); + + if ($this->dataAccess === null) { + $this->dataAccess = new MySQLMetadataDataAccess(); + } } /** @@ -47,31 +57,7 @@ class MySQLMetadataProvider */ public function getDBStatus() { - if (function_exists('mysql_connect')) { - $configDb = Config::getInstance()->database; - $link = mysql_connect($configDb['host'], $configDb['username'], $configDb['password']); - $status = mysql_stat($link); - mysql_close($link); - $status = explode(" ", $status); - } else { - $fullStatus = Db::fetchAssoc('SHOW STATUS'); - if (empty($fullStatus)) { - throw new Exception('Error, SHOW STATUS failed'); - } - - $status = array( - 'Uptime' => $fullStatus['Uptime']['Value'], - 'Threads' => $fullStatus['Threads_running']['Value'], - 'Questions' => $fullStatus['Questions']['Value'], - 'Slow queries' => $fullStatus['Slow_queries']['Value'], - 'Flush tables' => $fullStatus['Flush_commands']['Value'], - 'Open tables' => $fullStatus['Open_tables']['Value'], - 'Opens' => 'unavailable', // not available via SHOW STATUS - 'Queries per second avg' => 'unavailable' // not available via SHOW STATUS - ); - } - - return $status; + return $this->dataAccess->getDBStatus(); } /** @@ -89,7 +75,7 @@ class MySQLMetadataProvider if (!is_null($this->tableStatuses) && isset($this->tableStatuses[$prefixed])) { return $this->tableStatuses[$prefixed]; } else { - return Db::fetchRow("SHOW TABLE STATUS LIKE ?", array($prefixed)); + return $this->dataAccess->getTableStatus($prefixed); } } @@ -108,7 +94,7 @@ class MySQLMetadataProvider $tablesPiwik = DbHelper::getTablesInstalled(); $this->tableStatuses = array(); - foreach (Db::fetchAll("SHOW TABLE STATUS") as $t) { + foreach ($this->dataAccess->getAllTablesStatus() as $t) { if (in_array($t['Name'], $tablesPiwik)) { $this->tableStatuses[$t['Name']] = $t; } @@ -230,11 +216,8 @@ class MySQLMetadataProvider if ($cachedData !== false && !$forceCache) { $table = DataTable::fromSerializedArray($cachedData); } else { - // otherwise, create data table & cache it - $sql = "SELECT name as 'label', COUNT(*) as 'row_count'$extraCols FROM {$status['Name']} GROUP BY name"; - $table = new DataTable(); - $table->addRowsFromSimpleArray(Db::fetchAll($sql)); + $table->addRowsFromSimpleArray($this->dataAccess->getRowCountsByArchiveName($status['Name'], $extraCols)); $reduceArchiveRowName = array($this, 'reduceArchiveRowName'); $table->filter('GroupBy', array('label', $reduceArchiveRowName)); @@ -277,7 +260,7 @@ class MySQLMetadataProvider static $fixedSizeColumnLength = null; if (is_null($fixedSizeColumnLength)) { $fixedSizeColumnLength = 0; - foreach (Db::fetchAll("SHOW COLUMNS FROM " . $status['Name']) as $column) { + foreach ($this->dataAccess->getColumnsFromTable($status['Name']) as $column) { $columnType = $column['Type']; if (($paren = strpos($columnType, '(')) !== false) { @@ -362,5 +345,4 @@ class MySQLMetadataProvider return $name; } -} - +}
\ No newline at end of file diff --git a/plugins/DBStats/tests/Mocks/MockDataAccess.php b/plugins/DBStats/tests/Mocks/MockDataAccess.php new file mode 100644 index 0000000000..b394a2d599 --- /dev/null +++ b/plugins/DBStats/tests/Mocks/MockDataAccess.php @@ -0,0 +1,151 @@ +<?php +/** + * Piwik - Open source web analytics + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik\Plugins\DBStats\Mocks; + +use Piwik\Piwik; +use Piwik\Common; + +class MockDataAccess +{ + public static $tableStatuses = array( + 'user' => array(5, 8192, 8192), + 'access' => array(9, 8192, 1024), + 'site' => array(10, 32000, 8192), + 'site_url' => array(8, 8192, 8192), + 'goal' => array(5, 16000, 8192), + 'logger_message' => array(100, 48000, 1024), + 'log_action' => array(3000, 64000, 32000), + 'log_visit' => array(1300, 64000, 16000), + 'log_conversion_item' => array(600, 64000, 16000), + 'log_conversion' => array(1000, 64000, 16000), + 'log_link_visit_action' => array(3000, 64000, 16000), + 'log_profiling' => array(0, 8192, 8192), + 'option' => array(200, 16000, 8192), + 'session' => array(0, 8192, 8192), + 'archive_numeric' => array(8000, 16000, 16000), + 'archive_blob' => array(8000, 128000, 1024) + ); + + public static $numericRowCountsByArchiveName = array( + array('label' => 'numericName1', 'row_count' => 93), + array('label' => 'numericName2', 'row_count' => 203), + array('label' => 'done', 'row_count' => 400), + array('label' => 'done.plugin', 'row_count' => 150), + array('label' => 'numericName3', 'row_count' => 340), + array('label' => 'numericName4', 'row_count' => 240), + ); + + public static $blobRowCountsByArchiveName = array( + array('label' => 'blobName1', 'row_count' => 123), + array('label' => 'blobName2', 'row_count' => 145), + array('label' => 'blobName3', 'row_count' => 83), + array('label' => 'blobName4', 'row_count' => 45), + ); + + public function getDBStatus() + { + return array( + 'Uptime' => 10000, + 'Threads' => 10, + 'Questions' => 15, + 'Slow queries' => 20, + 'Flush tables' => 300, + 'Open tables' => 2, + 'Opens' => 'unavailable', + 'Queries per second avg' => 'unavailable' + ); + } + + public function getTableStatus($tableName) + { + list($rows, $rowLength, $indexRowLength) = self::$tableStatuses[$this->getTableNameKey($tableName)]; + + return array( + 'Name' => $tableName, + 'Engine' => 'InnoDB', + 'Version' => 10, + 'Row_format' => 'Compact', + 'Rows' => $rows, + 'Avg_row_length' => $rowLength, + 'Data_length' => $rows * $rowLength, + 'Max_data_length' => 0, + 'Index_length' => $rows * $indexRowLength, + 'Data_free' => 236978176, + 'Auto_increment' => null, + 'Create_time' => '2014-01-01 23:54:56', + 'Update_time' => null, + 'Check_time' => null, + 'Collation' => 'utf8_general_ci', + 'Checksum' => null, + 'Create_options' => "", + 'Comment' => "" + ); + } + + public function getAllTablesStatus() + { + $result = array(); + foreach (self::$tableStatuses as $tableName => $ignore) { + if ($tableName == "archive_numeric" + || $tableName == "archive_blob" + ) { + continue; + } + + $unprefixed = Common::prefixTable($tableName); + $result[] = $this->getTableStatus($unprefixed); + } + + $result[] = $this->getTableStatus(Common::prefixTable('archive_numeric_2012_01')); + $result[] = $this->getTableStatus(Common::prefixTable('archive_blob_2012_01')); + + $result[] = $this->getTableStatus(Common::prefixTable('archive_numeric_2012_02')); + $result[] = $this->getTableStatus(Common::prefixTable('archive_blob_2012_02')); + + $result[] = $this->getTableStatus(Common::prefixTable('archive_numeric_2012_03')); + $result[] = $this->getTableStatus(Common::prefixTable('archive_blob_2012_03')); + + $result[] = $this->getTableStatus(Common::prefixTable('archive_numeric_2012_04')); + $result[] = $this->getTableStatus(Common::prefixTable('archive_blob_2012_04')); + + return $result; + } + + public function getTableNameKey($tableName) + { + $result = Common::unprefixTable($tableName); + if (strpos($tableName, "archive_numeric")) { + $result = "archive_numeric"; + } else if (strpos($tableName, "archive_blob")) { + $result = "archive_blob"; + } + return $result; + } + + public function getRowCountsByArchiveName($tableName, $extraCols) + { + if (strpos($tableName, "achive_numeric")) { + return self::$numericRowCountsByArchiveName; + } else { + return self::$blobRowCountsByArchiveName; + } + } + + public function getColumnsFromTable($tableName) + { + return array( + array('Field' => 'field1', 'Type' => 'datetime'), + array('Field' => 'field2', 'Type' => 'int(11) unsigned'), + array('Field' => 'field3', 'Type' => 'varchar(10)'), + array('Field' => 'field4', 'Type' => 'varchar(24)'), + array('Field' => 'field5', 'Type' => 'char(32)'), + array('Field' => 'field6', 'Type' => 'timestamp'), + ); + } +}
\ No newline at end of file diff --git a/plugins/DBStats/tests/UI/expected-ui-screenshots/DBStats_admin_page.png b/plugins/DBStats/tests/UI/expected-ui-screenshots/DBStats_admin_page.png Binary files differnew file mode 100644 index 0000000000..6d1e0ba667 --- /dev/null +++ b/plugins/DBStats/tests/UI/expected-ui-screenshots/DBStats_admin_page.png diff --git a/tests/PHPUnit/TestingEnvironment.php b/tests/PHPUnit/TestingEnvironment.php index 28c0abf93c..e048f250eb 100644 --- a/tests/PHPUnit/TestingEnvironment.php +++ b/tests/PHPUnit/TestingEnvironment.php @@ -115,6 +115,6 @@ class Piwik_TestingEnvironment file_put_contents($outputFile, Common::json_encode($outputContents)); }); - Piwik::postEvent("TestingEnvironment.addHooks", $testingEnvironment); // for plugins that need to inject special testing logic + Piwik::postEvent("TestingEnvironment.addHooks", array($testingEnvironment), $pending = true); // for plugins that need to inject special testing logic } }
\ No newline at end of file diff --git a/tests/lib/screenshot-testing/support/diff-viewer.js b/tests/lib/screenshot-testing/support/diff-viewer.js index 738f428856..3fbbb66912 100644 --- a/tests/lib/screenshot-testing/support/diff-viewer.js +++ b/tests/lib/screenshot-testing/support/diff-viewer.js @@ -70,7 +70,7 @@ DiffViewerGenerator.prototype.generate = function (callback) { var expectedUrlGithub = 'https://raw.github.com/piwik/piwik-ui-tests/master/expected-ui-screenshots/' + entry.name + '.png'; - var expectedHtml = '<a href="' + entry.expectedUrl + '">Expected</a> <a href="' + expectedUrlGithub + var expectedHtml = '<a href="' + expectedUrl + '">Expected</a> <a href="' + expectedUrlGithub + '">[Github]</a>'; } else { var expectedHtml = '<em>Not found</em>'; |