diff options
author | mattab <matthieu.aubry@gmail.com> | 2013-06-18 09:24:06 +0400 |
---|---|---|
committer | mattab <matthieu.aubry@gmail.com> | 2013-06-18 09:24:06 +0400 |
commit | e61b8958733ede26a524bc228b85a07bacec21c0 (patch) | |
tree | 60bf26d17b8f5a2c93ff2f9adc5350bb62634f55 /core | |
parent | 5a59fd9f50c3abeb7c67acf3745a1f0549a82878 (diff) |
Removing TablePartitioning from codebase, since it was rather ugly. Introducing ArchiveTableCreator
Diffstat (limited to 'core')
-rw-r--r-- | core/DataAccess/ArchiveTableCreator.php | 50 | ||||
-rw-r--r-- | core/DataTable/Manager.php | 2 | ||||
-rw-r--r-- | core/Db/Schema/Myisam.php | 3 | ||||
-rw-r--r-- | core/TablePartitioning.php | 135 |
4 files changed, 48 insertions, 142 deletions
diff --git a/core/DataAccess/ArchiveTableCreator.php b/core/DataAccess/ArchiveTableCreator.php index f5f1c44287..c932639fdb 100644 --- a/core/DataAccess/ArchiveTableCreator.php +++ b/core/DataAccess/ArchiveTableCreator.php @@ -11,20 +11,62 @@ class Piwik_DataAccess_ArchiveTableCreator { + const NUMERIC_TABLE = "numeric"; + + const BLOB_TABLE = "blob"; + + static public $tablesAlreadyInstalled = null; + static public function getNumericTable(Piwik_Date $date) { - return self::getTable($date, "numeric"); + return self::getTable($date, self::NUMERIC_TABLE); } static public function getBlobTable(Piwik_Date $date) { - return self::getTable($date, "blob"); + return self::getTable($date, self::BLOB_TABLE); } static protected function getTable(Piwik_Date $date, $type) { - Piwik_TablePartitioning_Monthly::createArchiveTablesIfAbsent($date); + $tableNamePrefix = "archive_" . $type; + $tableName = $tableNamePrefix . "_" . $date->toString('Y_m'); + $tableName = Piwik_Common::prefixTable($tableName); + self::createArchiveTablesIfAbsent($tableName, $tableNamePrefix); + return $tableName; + } + + static protected function createArchiveTablesIfAbsent($tableName, $tableNamePrefix) + { + if (is_null(self::$tablesAlreadyInstalled)) { + self::refreshTableList(); + } - return Piwik_Common::prefixTable("archive_" . $type . "_" . $date->toString('Y_m')); + if (!in_array($tableName, self::$tablesAlreadyInstalled)) { + $db = Zend_Registry::get('db'); + $sql = Piwik::getTableCreateSql($tableNamePrefix); + + // replace table name template by real name + $tableNamePrefix = Piwik_Common::prefixTable($tableNamePrefix); + $sql = str_replace($tableNamePrefix, $tableName, $sql); + try { + $db->query($sql); + } catch (Exception $e) { + // accept mysql error 1050: table already exists, throw otherwise + if (!$db->isErrNo($e, '1050')) { + throw $e; + } + } + self::$tablesAlreadyInstalled[] = $tableName; + } + } + + static public function clear() + { + self::$tablesAlreadyInstalled = null; + } + static public function refreshTableList($forceReload = false) + { + self::$tablesAlreadyInstalled = Piwik::getTablesInstalled($forceReload); } }
\ No newline at end of file diff --git a/core/DataTable/Manager.php b/core/DataTable/Manager.php index b091ec6466..eab94df8f8 100644 --- a/core/DataTable/Manager.php +++ b/core/DataTable/Manager.php @@ -136,7 +136,7 @@ class Piwik_DataTable_Manager foreach ($this->tables as $id => $table) { if (!($table instanceof Piwik_DataTable)) { echo "Error table $id is not instance of datatable<br />"; - var_dump($table); + var_export($table); } else { echo "<hr />"; echo "Table (index=$id) TableId = " . $table->getId() . "<br />"; diff --git a/core/Db/Schema/Myisam.php b/core/Db/Schema/Myisam.php index 959ea056d8..55cd20e715 100644 --- a/core/Db/Schema/Myisam.php +++ b/core/Db/Schema/Myisam.php @@ -458,8 +458,7 @@ class Piwik_Db_Schema_Myisam implements Piwik_Db_Schema_Interface // we get the intersection between all the tables in the DB and the tables to be installed $tablesInstalled = array_intersect($allMyTables, $allTables); - // at this point we have only the piwik tables which is good - // but we still miss the piwik generated tables (using the class Piwik_TablePartitioning) + // at this point we have the static list of core tables, but let's add the monthly archive tables $allArchiveNumeric = $db->fetchCol("SHOW TABLES LIKE '" . $prefixTables . "archive_numeric%'"); $allArchiveBlob = $db->fetchCol("SHOW TABLES LIKE '" . $prefixTables . "archive_blob%'"); diff --git a/core/TablePartitioning.php b/core/TablePartitioning.php deleted file mode 100644 index 330c9f168a..0000000000 --- a/core/TablePartitioning.php +++ /dev/null @@ -1,135 +0,0 @@ -<?php -/** - * Piwik - Open source web analytics - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * - * @category Piwik - * @package Piwik - */ - -/** - * FIXMEA: simplify/delete this code - * - * @package Piwik - * @subpackage Piwik_TablePartitioning - */ -abstract class Piwik_TablePartitioning -{ - protected $tableName = null; - protected $generatedTableName = null; - protected $timestamp = null; - - static public $tablesAlreadyInstalled = null; - - public function __construct($tableName) - { - $this->tableName = $tableName; - } - - abstract protected function generateTableName(); - - public function setTimestamp($timestamp) - { - $this->timestamp = $timestamp; - $this->generatedTableName = null; - $this->getTableName(); - } - - public function getTableName() - { - // table name already processed - if (!is_null($this->generatedTableName)) { - return $this->generatedTableName; - } - - if (is_null($this->timestamp)) { - throw new Exception("You have to specify a timestamp for a Table Partitioning by date."); - } - - // generate table name - $this->generatedTableName = $this->generateTableName(); - - // we make sure the table already exists - $this->checkTableExists(); - } - - protected function checkTableExists() - { - if (is_null(self::$tablesAlreadyInstalled)) { - self::$tablesAlreadyInstalled = Piwik::getTablesInstalled($forceReload = false); - } - - if (!in_array($this->generatedTableName, self::$tablesAlreadyInstalled)) { - $db = Zend_Registry::get('db'); - $sql = Piwik::getTableCreateSql($this->tableName); - - $config = Piwik_Config::getInstance(); - $prefixTables = $config->database['tables_prefix']; - $sql = str_replace($prefixTables . $this->tableName, $this->generatedTableName, $sql); - try { - $db->query($sql); - } catch (Exception $e) { - // mysql error 1050: table already exists - if (!$db->isErrNo($e, '1050')) { - // failed for some other reason - throw $e; - } - } - - self::$tablesAlreadyInstalled[] = $this->generatedTableName; - } - } - - public function __toString() - { - return $this->getTableName(); - } -} - -/** - * - * @package Piwik - * @subpackage Piwik_TablePartitioning - */ -class Piwik_TablePartitioning_Monthly extends Piwik_TablePartitioning -{ - private static $blobArchiveTable = null; - private static $numericArchiveTable = null; - - public function __construct($tableName) - { - parent::__construct($tableName); - } - - protected function generateTableName() - { - $config = Piwik_Config::getInstance(); - return $config->database['tables_prefix'] . $this->tableName . "_" . date("Y_m", $this->timestamp); - } - - /** - * Creates archive_blob & archive_numeric tables for a period if they don't already exist. - * - * @param Piwik_Date - */ - public static function createArchiveTablesIfAbsent(Piwik_Date $dateInMonth) - { - $timestamp = $dateInMonth->getTimestamp(); - - self::$blobArchiveTable->setTimestamp($timestamp); - self::$blobArchiveTable->getTableName(); - - self::$numericArchiveTable->setTimestamp($timestamp); - self::$numericArchiveTable->getTableName(); - } - - public static function init() - { - self::$blobArchiveTable = new Piwik_TablePartitioning_Monthly('archive_blob'); - self::$numericArchiveTable = new Piwik_TablePartitioning_Monthly('archive_numeric'); - } -} - -Piwik_TablePartitioning_Monthly::init(); |