Skip to content

Commit

Permalink
Refs #4189, added expected screenshot for DBStats, added actual & moc…
Browse files Browse the repository at this point in the history
…k data access class to DBStats, fix bug that occurs when deleting merged assets that do not exist and fix diffviewer generation regression (expected URL was incorrect).
  • Loading branch information
diosmosis committed Feb 27, 2014
1 parent 4ad2b98 commit 13a08d5
Show file tree
Hide file tree
Showing 9 changed files with 254 additions and 40 deletions.
2 changes: 1 addition & 1 deletion core/AssetManager/UIAsset/OnDiskUIAsset.php
Expand Up @@ -103,7 +103,7 @@ public function exists()
*/
private function assetIsReadable()
{
return is_readable($this->getAbsoluteLocation());
return file_exists($this->getAbsoluteLocation()) && is_readable($this->getAbsoluteLocation());
}

public function getModificationDate()
Expand Down
4 changes: 3 additions & 1 deletion plugins/DBStats/API.php
Expand Up @@ -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();
}
}

/**
Expand Down
11 changes: 10 additions & 1 deletion plugins/DBStats/DBStats.php
Expand Up @@ -37,7 +37,8 @@ public function getListHooksRegistered()
'Menu.Admin.addItems' => 'addMenu',
'TaskScheduler.getScheduledTasks' => 'getScheduledTasks',
'ViewDataTable.configure' => 'configureViewDataTable',
'ViewDataTable.getDefaultType' => 'getDefaultTypeViewDataTable'
'ViewDataTable.getDefaultType' => 'getDefaultTypeViewDataTable',
"TestingEnvironment.addHooks" => 'setupTestEnvironment'
);
}

Expand Down Expand Up @@ -374,4 +375,12 @@ private function setIndividualSummaryFooterMessage(ViewDataTable $view)
$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();
});
}
}
70 changes: 70 additions & 0 deletions 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);
}
}
52 changes: 17 additions & 35 deletions plugins/DBStats/MySQLMetadataProvider.php
Expand Up @@ -15,6 +15,7 @@
use Piwik\Db;
use Piwik\DbHelper;
use Piwik\Option;
use Piwik\Piwik;

/**
* Utility class that provides general information about databases, including the size of
Expand All @@ -31,12 +32,21 @@ 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();
}
}

/**
Expand All @@ -47,31 +57,7 @@ public function __construct()
*/
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();
}

/**
Expand All @@ -89,7 +75,7 @@ public function getTableStatus($table)
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);
}
}

Expand All @@ -108,7 +94,7 @@ public function getAllTablesStatus($matchingRegex = null)
$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;
}
Expand Down Expand Up @@ -230,11 +216,8 @@ private function getRowCountsByArchiveName($statuses, $getRowSizeMethod, $forceC
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));
Expand Down Expand Up @@ -277,7 +260,7 @@ public function getEstimatedBlobArchiveRowSize($row_count, $blob_size, $name_siz
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) {
Expand Down Expand Up @@ -362,5 +345,4 @@ public function reduceArchiveRowName($name)

return $name;
}
}

}
151 changes: 151 additions & 0 deletions 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'),
);
}
}
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion tests/PHPUnit/TestingEnvironment.php
Expand Up @@ -115,6 +115,6 @@ public static function addHooks()
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
}
}
2 changes: 1 addition & 1 deletion tests/lib/screenshot-testing/support/diff-viewer.js
Expand Up @@ -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>&nbsp;<a href="' + expectedUrlGithub
var expectedHtml = '<a href="' + expectedUrl + '">Expected</a>&nbsp;<a href="' + expectedUrlGithub
+ '">[Github]</a>';
} else {
var expectedHtml = '<em>Not found</em>';
Expand Down

0 comments on commit 13a08d5

Please sign in to comment.