Skip to content
Extraits de code Groupes Projets
Valider d0d43a7b rédigé par mattab's avatar mattab
Parcourir les fichiers

Committing two new files

parent 5049adcc
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
<?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
*/
class Piwik_DataAccess_ArchiveTableCreator
{
static public function getNumericTable(Piwik_Date $date)
{
return self::getTable($date, "numeric");
}
static public function getBlobTable(Piwik_Date $date)
{
return self::getTable($date, "blob");
}
static protected function getTable(Piwik_Date $date, $type)
{
Piwik_TablePartitioning_Monthly::createArchiveTablesIfAbsent($date);
return Piwik_Common::prefixTable("archive_" . $type . "_" . $date->toString('Y_m'));
}
}
\ No newline at end of file
<?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
*/
class Piwik_DataAccess_ArchiveWriter
{
/**
* A row is created to lock an idarchive for the current archive being processed
* @var string
*/
const PREFIX_SQL_LOCK = "locked_";
protected $fields = array('idarchive',
'idsite',
'date1',
'date2',
'period',
'ts_archived',
'name',
'value');
public function __construct($idSite, Piwik_Segment $segment, Piwik_Period $period, $requestedPlugin, $isArchiveTemporary)
{
$this->idArchive = false;
$this->idSite = $idSite;
$this->segment = $segment;
$this->period = $period;
$this->doneFlag = Piwik_ArchiveProcessor_Rules::getDoneStringFlagFor($segment, $period->getLabel(), $requestedPlugin);
$this->isArchiveTemporary = $isArchiveTemporary;
$this->dateStart = $this->period->getDateStart();
$this->numericTable = Piwik_DataAccess_ArchiveTableCreator::getNumericTable($this->dateStart);
$this->blobTable = Piwik_DataAccess_ArchiveTableCreator::getBlobTable($this->dateStart);
}
public function getIdArchive()
{
if($this->idArchive === false) {
throw new Exception("Must call allocateNewArchiveId() first");
}
return $this->idArchive;
}
public function initNewArchive()
{
$this->acquireLock();
$this->allocateNewArchiveId();
$this->logArchiveStatusAsIncomplete();
}
protected function acquireLock()
{
$lockName = $this->getArchiveProcessorLockName();
$result = Piwik_GetDbLock($lockName, $maxRetries = 30);
if (!$result) {
Piwik::log("SELECT GET_LOCK failed to acquire lock. Proceeding anyway.");
}
}
protected function allocateNewArchiveId()
{
$this->idArchive = $this->insertNewArchiveId();
return $this->idArchive;
}
protected function insertNewArchiveId()
{
$table = $this->numericTable;
$idSite = $this->idSite;
$db = Zend_Registry::get('db');
$locked = self::PREFIX_SQL_LOCK . Piwik_Common::generateUniqId();
$date = date("Y-m-d H:i:s");
$dbLockName = "allocateNewArchiveId.$table";
if (Piwik_GetDbLock($dbLockName, $maxRetries = 30) === false) {
throw new Exception("allocateNewArchiveId: Cannot get named lock for table $table.");
}
$insertSql = "INSERT INTO $table "
. " SELECT ifnull(max(idarchive),0)+1,
'" . $locked . "',
" . (int)$idSite . ",
'" . $date . "',
'" . $date . "',
0,
'" . $date . "',
0 "
. " FROM $table as tb1";
$db->exec($insertSql);
Piwik_ReleaseDbLock($dbLockName);
$selectIdSql = "SELECT idarchive FROM $table WHERE name = ? LIMIT 1";
$id = $db->fetchOne($selectIdSql, $locked);
return $id;
}
protected function logArchiveStatusAsIncomplete()
{
$statusWhileProcessing = Piwik_ArchiveProcessor::DONE_ERROR;
$this->insertRecord($this->doneFlag, $statusWhileProcessing);
}
protected function getArchiveProcessorLockName()
{
return self::makeLockName($this->idSite, $this->period, $this->segment);
}
/**
* @param $idsite
* @param $period
* @param Piwik_Segment $segment
* @return string
*/
protected static function makeLockName($idsite, Piwik_Period $period, Piwik_Segment $segment)
{
$config = Piwik_Config::getInstance();
$lockName = 'piwik.'
. $config->database['dbname'] . '.'
. $config->database['tables_prefix'] . '/'
. $idsite . '/'
. (!$segment->isEmpty() ? $segment->getHash() . '/' : '')
. $period->getId() . '/'
. $period->getDateStart()->toString('Y-m-d') . ','
. $period->getDateEnd()->toString('Y-m-d');
return $lockName . '/' . md5($lockName . Piwik_Common::getSalt());
}
public function finalizeArchive()
{
$this->deletePreviousArchiveStatus();
$this->logArchiveStatusAsFinal();
$this->releaseArchiveProcessorLock();
if($this->period->getLabel() != 'day') {
$purgeArchivesOlderThan = Piwik_ArchiveProcessor_Rules::doPurgeOutdatedArchives($this->dateStart);
if($purgeArchivesOlderThan) {
Piwik_DataAccess_ArchiveSelector::purgeOutdatedArchives($this->dateStart, $purgeArchivesOlderThan);
}
}
}
protected function deletePreviousArchiveStatus()
{
Piwik_Query("DELETE FROM " . $this->numericTable . "
WHERE idarchive = ? AND (name = '" . $this->doneFlag . "' OR name LIKE '" . self::PREFIX_SQL_LOCK . "%')",
array($this->getIdArchive())
);
}
protected function logArchiveStatusAsFinal()
{
$status = Piwik_ArchiveProcessor::DONE_OK;
if ($this->isArchiveTemporary) {
$status = Piwik_ArchiveProcessor::DONE_OK_TEMPORARY;
}
$this->insertRecord($this->doneFlag, $status);
}
protected function releaseArchiveProcessorLock()
{
$lockName = $this->getArchiveProcessorLockName();
return Piwik_ReleaseDbLock($lockName);
}
public function insertBulkRecords($records)
{
// Using standard plain INSERT if there is only one record to insert
if ($DEBUG_DO_NOT_USE_BULK_INSERT = false
|| count($records) == 1
) {
foreach ($records as $record) {
$this->insertRecord($record[0], $record[1]);
}
return true;
}
$bindSql = $this->getInsertRecordBind();
$values = array();
$valueSeen = false;
foreach ($records as $record) {
// don't record zero
if (empty($record[1])) continue;
$bind = $bindSql;
$bind[] = $record[0]; // name
$bind[] = $record[1]; // value
$values[] = $bind;
$valueSeen = $record[1];
}
if (empty($values)) return true;
$tableName = $this->getTableNameToInsert($valueSeen);
Piwik::tableInsertBatch($tableName, $this->getInsertFields(), $values);
return true;
}
/**
* Inserts a record in the right table (either NUMERIC or BLOB)
*
* @param string $name
* @param mixed $value
*/
public function insertRecord($name, $value)
{
if ($this->isRecordZero($value)) {
return false;
}
$tableName = $this->getTableNameToInsert($value);
// duplicate idarchives are Ignored, see http://dev.piwik.org/trac/ticket/987
$query = "INSERT IGNORE INTO " . $tableName . "
(" . implode(", ", $this->getInsertFields()) . ")
VALUES (?,?,?,?,?,?,?,?)";
$bindSql = $this->getInsertRecordBind();
$bindSql[] = $name;
$bindSql[] = $value;
Piwik_Query($query, $bindSql);
return true;
}
protected function getInsertRecordBind()
{
return array($this->getIdArchive(),
$this->idSite,
$this->dateStart->toString('Y-m-d'),
$this->period->getDateEnd()->toString('Y-m-d'),
$this->period->getId(),
date("Y-m-d H:i:s"));
}
protected function getTableNameToInsert($value)
{
if (is_numeric($value)) {
return $this->numericTable;
}
return $this->blobTable;
}
protected function getInsertFields()
{
return $this->fields;
}
protected function isRecordZero($value)
{
return ($value === '0' || $value === false || $value === 0 || $value === 0.0);
}
}
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter