Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormattpiwik <matthieu.aubry@gmail.com>2011-01-14 03:04:08 +0300
committermattpiwik <matthieu.aubry@gmail.com>2011-01-14 03:04:08 +0300
commitecedd2c7fda81cca177bdf774ebd92b7c0e1326e (patch)
tree41426ae6a4ff106e35645dd4fa977466178df48c
parent3156f9ec247b3ac792997cc9ccfad955b8762e4a (diff)
Fixes #2007
* stores idvisitor, config_id as BIGINT rather than char(32) * updates Tracking and Archiving code git-svn-id: http://dev.piwik.org/svn/trunk@3729 59fd770c-687e-43c8-a1e3-f5a4ff64c105
-rw-r--r--core/ArchiveProcessing/Day.php4
-rw-r--r--core/ArchiveProcessing/Period.php2
-rw-r--r--core/Cookie.php2
-rw-r--r--core/Db/Schema/Myisam.php10
-rw-r--r--core/Tracker.php20
-rw-r--r--core/Tracker/Action.php12
-rw-r--r--core/Tracker/GoalManager.php21
-rw-r--r--core/Tracker/Visit.php80
-rw-r--r--core/Updates/1.2.php43
-rw-r--r--plugins/Actions/Actions.php6
-rw-r--r--plugins/Live/API.php6
-rw-r--r--plugins/Referers/Referers.php2
-rw-r--r--plugins/VisitFrequency/VisitFrequency.php2
-rw-r--r--tests/integration/Main.test.php3
14 files changed, 145 insertions, 68 deletions
diff --git a/core/ArchiveProcessing/Day.php b/core/ArchiveProcessing/Day.php
index deff461fad..031a572a55 100644
--- a/core/ArchiveProcessing/Day.php
+++ b/core/ArchiveProcessing/Day.php
@@ -36,7 +36,7 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
*/
protected function compute()
{
- $query = "SELECT count(distinct visitor_idcookie) as nb_uniq_visitors,
+ $query = "SELECT count(distinct idvisitor) as nb_uniq_visitors,
count(*) as nb_visits,
sum(visit_total_actions) as nb_actions,
max(visit_total_actions) as max_actions,
@@ -145,7 +145,7 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
public function getArrayInterestForLabel($label)
{
$query = "SELECT $label as label,
- count(distinct visitor_idcookie) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`,
+ count(distinct idvisitor) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`,
count(*) as `". Piwik_Archive::INDEX_NB_VISITS ."`,
sum(visit_total_actions) as `". Piwik_Archive::INDEX_NB_ACTIONS ."`,
max(visit_total_actions) as `". Piwik_Archive::INDEX_MAX_ACTIONS ."`,
diff --git a/core/ArchiveProcessing/Period.php b/core/ArchiveProcessing/Period.php
index 86cf3cb805..513955cbc0 100644
--- a/core/ArchiveProcessing/Period.php
+++ b/core/ArchiveProcessing/Period.php
@@ -302,7 +302,7 @@ class Piwik_ArchiveProcessing_Period extends Piwik_ArchiveProcessing
protected function computeNbUniqVisitors()
{
$query = "
- SELECT count(distinct visitor_idcookie) as nb_uniq_visitors
+ SELECT count(distinct idvisitor) as nb_uniq_visitors
FROM ".Piwik_Common::prefixTable('log_visit')."
WHERE visit_last_action_time >= ?
AND visit_last_action_time <= ?
diff --git a/core/Cookie.php b/core/Cookie.php
index f080bd1fa2..ce59c74855 100644
--- a/core/Cookie.php
+++ b/core/Cookie.php
@@ -368,7 +368,7 @@ class Piwik_Cookie
*/
public function __toString()
{
- $str = 'COOKIE '.$this->name.', rows count: '.count($this->value). ', cookie size = '.strlen($this->generateContentString()).' bytes<br/>';
+ $str = 'COOKIE '.$this->name.', rows count: '.count($this->value). ', cookie size = '.strlen($this->generateContentString())." bytes\n";
$str .= var_export($this->value, $return = true);
return $str;
}
diff --git a/core/Db/Schema/Myisam.php b/core/Db/Schema/Myisam.php
index 71d1f1655b..e0dd892699 100644
--- a/core/Db/Schema/Myisam.php
+++ b/core/Db/Schema/Myisam.php
@@ -169,8 +169,8 @@ class Piwik_Db_Schema_Myisam implements Piwik_Db_Schema_Interface
'log_visit' => "CREATE TABLE {$prefixTables}log_visit (
idvisit INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
idsite INTEGER(10) UNSIGNED NOT NULL,
+ idvisitor BIGINT( 20 ) UNSIGNED NOT NULL,
visitor_localtime TIME NOT NULL,
- visitor_idcookie CHAR(32) NOT NULL,
visitor_returning TINYINT(1) NOT NULL,
visit_first_action_time DATETIME NOT NULL,
visit_last_action_time DATETIME NOT NULL,
@@ -185,7 +185,7 @@ class Piwik_Db_Schema_Myisam implements Piwik_Db_Schema_Interface
referer_name VARCHAR(70) NULL,
referer_url TEXT NOT NULL,
referer_keyword VARCHAR(255) NULL,
- config_md5config CHAR(32) NOT NULL,
+ config_id BIGINT( 20 ) UNSIGNED NOT NULL,
config_os CHAR(3) NOT NULL,
config_browser_name VARCHAR(10) NOT NULL,
config_browser_version VARCHAR(20) NOT NULL,
@@ -206,14 +206,14 @@ class Piwik_Db_Schema_Myisam implements Piwik_Db_Schema_Interface
location_continent CHAR(3) NOT NULL,
PRIMARY KEY(idvisit),
INDEX index_idsite_idvisit (idsite, idvisit),
- INDEX index_idsite_datetime_config (idsite, visit_last_action_time, config_md5config(8))
+ INDEX index_idsite_datetime_config (idsite, visit_last_action_time, config_id)
) DEFAULT CHARSET=utf8
",
'log_conversion' => "CREATE TABLE `{$prefixTables}log_conversion` (
idvisit int(10) unsigned NOT NULL,
idsite int(10) unsigned NOT NULL,
- visitor_idcookie char(32) NOT NULL,
+ idvisitor BIGINT(20) NOT NULL,
server_time datetime NOT NULL,
idaction_url int(11) default NULL,
idlink_va int(11) default NULL,
@@ -236,9 +236,9 @@ class Piwik_Db_Schema_Myisam implements Piwik_Db_Schema_Interface
'log_link_visit_action' => "CREATE TABLE {$prefixTables}log_link_visit_action (
idlink_va INTEGER(11) NOT NULL AUTO_INCREMENT,
idsite int(10) UNSIGNED NOT NULL,
+ idvisitor BIGINT(20) NOT NULL,
server_time DATETIME NOT NULL,
idvisit INTEGER(10) UNSIGNED NOT NULL,
- visitor_idcookie char(32) NOT NULL,
idaction_url INTEGER(10) UNSIGNED NOT NULL,
idaction_url_ref INTEGER(10) UNSIGNED NOT NULL,
idaction_name INTEGER(10) UNSIGNED,
diff --git a/core/Tracker.php b/core/Tracker.php
index 271d848e4c..003972b8ae 100644
--- a/core/Tracker.php
+++ b/core/Tracker.php
@@ -324,6 +324,26 @@ class Piwik_Tracker
$this->setState(self::STATE_LOGGING_DISABLE);
}
}
+
+ /**
+ * Helper which returns the function call to convert the first 16 chars of a md5 hash to a BIGINT
+ *
+ * @return string used in SQL statement
+ */
+ static public function getBindConvertStringAsBigInt()
+ {
+ return 'cast(conv(?, 16, 10) as unsigned integer)';
+ }
+
+ /**
+ * Reverse int to string conversion
+ * @see getBindConvertStringAsBigInt()
+ * @param $field
+ */
+ static public function getSelectConvertBigIntAsString($field)
+ {
+ return "LPAD(LOWER(conv(".$field.",10,16)), 16, '0')";
+ }
}
if(!function_exists('printDebug'))
diff --git a/core/Tracker/Action.php b/core/Tracker/Action.php
index be04923129..7b8cd86bc3 100644
--- a/core/Tracker/Action.php
+++ b/core/Tracker/Action.php
@@ -170,9 +170,9 @@ class Piwik_Tracker_Action implements Piwik_Tracker_Action_Interface
}
$parsedUrl['query'] = substr($validQuery,0,-strlen($separator));
$url = Piwik_Common::getParseUrlReverse($parsedUrl);
- printDebug('Excluded parameters "'.implode(',',$excludedParameters).'" from URL.
- Before was <br/><code>"'.$originalUrl.'"</code>, <br/>
- After is <br/><code>"'.$url.'"</code>');
+ printDebug('Excluded parameters "'.implode(',',$excludedParameters).'" from URL');
+ printDebug(' Before was "'.$originalUrl.'"');
+ printDebug(' After is "'.$url.'"');
return $url;
}
@@ -285,12 +285,12 @@ class Piwik_Tracker_Action implements Piwik_Tracker_Action_Interface
}
Piwik_Tracker::getDatabase()->query(
"INSERT INTO ".Piwik_Common::prefixTable('log_link_visit_action')
- ." (idvisit, idsite, server_time, visitor_idcookie, idaction_url, idaction_name, idaction_url_ref, idaction_name_ref, time_spent_ref_action)
- VALUES (?,?,?,?,?,?,?,?,?)",
+ ." (idvisit, idsite, idvisitor, server_time, idaction_url, idaction_name, idaction_url_ref, idaction_name_ref, time_spent_ref_action)
+ VALUES (?,?,".Piwik_Tracker::getBindConvertStringAsBigInt().",?,?,?,?,?,?)",
array( $idVisit,
$this->idSite,
- Piwik_Tracker::getDatetimeFromTimestamp($this->timestamp),
$visitorIdCookie,
+ Piwik_Tracker::getDatetimeFromTimestamp($this->timestamp),
$this->getIdActionUrl(),
$idActionName ,
$idRefererActionUrl,
diff --git a/core/Tracker/GoalManager.php b/core/Tracker/GoalManager.php
index 374c7b5cde..89198fc0e8 100644
--- a/core/Tracker/GoalManager.php
+++ b/core/Tracker/GoalManager.php
@@ -177,7 +177,7 @@ class Piwik_Tracker_GoalManager
$goal = array(
'idvisit' => $visitorInformation['idvisit'],
'idsite' => $idSite,
- 'visitor_idcookie' => $visitorInformation['visitor_idcookie'],
+ 'idvisitor' => $visitorInformation['idvisitor'],
'server_time' => Piwik_Tracker::getDatetimeFromTimestamp($visitorInformation['visit_last_action_time']),
'location_country' => $location_country,
'location_continent'=> $location_continent,
@@ -220,14 +220,19 @@ class Piwik_Tracker_GoalManager
}
printDebug($newGoal);
- $fields = implode(", ", array_keys($newGoal));
- $bindFields = substr(str_repeat( "?,",count($newGoal)),0,-1);
-
+ // idvisitor has a special INSERT
+ $idVisitor = $newGoal['idvisitor'];
+ unset($newGoal['idvisitor']);
+
+ $fields = implode(", ", array_keys($newGoal)) . ', idvisitor ';
+ $bindFields = substr(str_repeat( "?,",count($newGoal)),0,-1) . ','. Piwik_Tracker::getBindConvertStringAsBigInt();
+ $newGoal['idvisitor'] = $idVisitor;
+
try {
- Piwik_Tracker::getDatabase()->query(
- "INSERT IGNORE INTO " . Piwik_Common::prefixTable('log_conversion') . " ($fields)
- VALUES ($bindFields) ", array_values($newGoal)
- );
+ $sql = "INSERT IGNORE INTO " . Piwik_Common::prefixTable('log_conversion') . "
+ ($fields) VALUES ($bindFields) ";
+ $bind = array_values($newGoal);
+ Piwik_Tracker::getDatabase()->query($sql, $bind);
} catch( Exception $e) {
if(Piwik_Tracker::getDatabase()->isErrNo($e, '1062'))
{
diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php
index 457c5b8ca7..9e78e3ae44 100644
--- a/core/Tracker/Visit.php
+++ b/core/Tracker/Visit.php
@@ -182,7 +182,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
if(!is_null($action))
{
$action->record( $this->visitorInfo['idvisit'],
- $this->visitorInfo['visitor_idcookie'],
+ $this->visitorInfo['idvisitor'],
$idRefererActionUrl,
$idRefererActionName,
$this->visitorInfo['time_spent_ref_action']
@@ -219,7 +219,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
$this->handleNewVisit($idActionUrl, $idActionName, $someGoalsConverted);
if(!is_null($action))
{
- $action->record( $this->visitorInfo['idvisit'], $this->visitorInfo['visitor_idcookie'], 0, 0, 0 );
+ $action->record( $this->visitorInfo['idvisit'], $this->visitorInfo['idvisitor'], 0, 0, 0 );
}
}
@@ -344,8 +344,8 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
SET $sqlActionUpdate ".implode($updateParts, ', ')."
WHERE idsite = ?
AND idvisit = ?
- AND visitor_idcookie = ?";
- array_push($sqlBind, $this->idsite, $this->visitorInfo['idvisit'], $this->visitorInfo['visitor_idcookie'] );
+ AND idvisitor = ". Piwik_Tracker::getBindConvertStringAsBigInt();
+ array_push($sqlBind, $this->idsite, $this->visitorInfo['idvisit'], $this->visitorInfo['idvisitor'] );
$result = Piwik_Tracker::getDatabase()->query($sqlQuery, $sqlBind);
printDebug('Updating visitor with idvisit='.$this->visitorInfo['idvisit'].', setting visit_last_action_time='.$datetimeServer.' and visit_total_time='.$visitTotalTime);
@@ -355,7 +355,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
{
printDebug("Visitor with this idcookie and idvisit wasn't found in the DB.");
throw new Piwik_Tracker_Visit_VisitorNotFoundInDatabase(
- "The visitor with visitor_idcookie=".$this->visitorInfo['visitor_idcookie']." and idvisit=".$this->visitorInfo['idvisit']
+ "The visitor with idvisitor=".$this->visitorInfo['idvisitor']." and idvisit=".$this->visitorInfo['idvisit']
." wasn't found in the DB, we fallback to a new visitor");
}
@@ -389,7 +389,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
$serverTimestamp = $this->getCurrentTimestamp();
- $idcookie = $this->getVisitorIdcookie();
+ $idcookie = substr($this->getVisitorIdcookie(), 0, 16);
$returningVisitor = $this->isVisitorKnown() ? 1 : 0;
$defaultTimeOnePageVisit = Piwik_Tracker_Config::getInstance()->Tracker['default_time_one_page_visit'];
@@ -406,7 +406,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
$this->visitorInfo = array(
'idsite' => $this->idsite,
'visitor_localtime' => $localTime,
- 'visitor_idcookie' => $idcookie,
+ 'idvisitor' => $idcookie,
'visitor_returning' => $returningVisitor,
'visit_first_action_time' => Piwik_Tracker::getDatetimeFromTimestamp($serverTimestamp),
'visit_last_action_time' => Piwik_Tracker::getDatetimeFromTimestamp($serverTimestamp),
@@ -421,7 +421,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
'referer_name' => $refererInfo['referer_name'],
'referer_url' => Piwik_Common::unsanitizeInputValue($refererInfo['referer_url']),
'referer_keyword' => $refererInfo['referer_keyword'],
- 'config_md5config' => $userInfo['config_md5config'],
+ 'config_id' => $userInfo['config_id'],
'config_os' => $userInfo['config_os'],
'config_browser_name' => $userInfo['config_browser_name'],
'config_browser_version' => $userInfo['config_browser_version'],
@@ -461,13 +461,25 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
$this->visitorInfo['referer_keyword'] = substr($this->visitorInfo['referer_keyword'], 0, 255);
$this->visitorInfo['config_resolution'] = substr($this->visitorInfo['config_resolution'], 0, 9);
- $fields = implode(", ", array_keys($this->visitorInfo));
- $values = substr(str_repeat( "?,",count($this->visitorInfo)),0,-1);
+ // idVisitor and configId appear as 16b long md5 hash, but are inserted as bigint
+ $idVisitor = $this->visitorInfo['idvisitor'];
+ $configId = $this->visitorInfo['config_id'];
+ unset($this->visitorInfo['idvisitor']);
+ unset($this->visitorInfo['config_id']);
+
+ $fields = implode(", ", array_keys($this->visitorInfo)) . ', idvisitor, config_id';
+ $values = substr(str_repeat( "?,",count($this->visitorInfo)),0,-1)
+ .', '.Piwik_Tracker::getBindConvertStringAsBigInt()
+ .', '.Piwik_Tracker::getBindConvertStringAsBigInt();
+
+ $sql = "INSERT INTO ".Piwik_Common::prefixTable('log_visit'). " ($fields) VALUES ($values)";
- printDebug($this->visitorInfo);
- Piwik_Tracker::getDatabase()->query( "INSERT INTO ".Piwik_Common::prefixTable('log_visit').
- " ($fields) VALUES ($values)", array_values($this->visitorInfo));
+ $this->visitorInfo['idvisitor'] = $idVisitor;
+ $this->visitorInfo['config_id'] = $configId;
+ $bind = array_values($this->visitorInfo);
+ Piwik_Tracker::getDatabase()->query( $sql, $bind);
+
$idVisit = Piwik_Tracker::getDatabase()->lastInsertId();
$this->visitorInfo['idvisit'] = $idVisit;
@@ -487,7 +499,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
{
if($this->isVisitorKnown())
{
- $idcookie = $this->visitorInfo['visitor_idcookie'];
+ $idcookie = $this->visitorInfo['idvisitor'];
}
else
{
@@ -724,11 +736,12 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
$this->printCookie();
- if( false !== ($idVisitor = $this->cookie->get( Piwik_Tracker::COOKIE_INDEX_IDVISITOR )) )
+ if( false !== ($idVisitor = $this->cookie->get( Piwik_Tracker::COOKIE_INDEX_IDVISITOR ))
+ && strlen($idVisitor) >= 16)
{
- $this->visitorInfo['visitor_idcookie'] = $idVisitor;
+ $this->visitorInfo['idvisitor'] = substr($idVisitor, 0, 16);
$this->visitorKnown = true;
- printDebug("The visitor has the piwik cookie (idcookie = ".$this->visitorInfo['visitor_idcookie'].") ");
+ printDebug("The visitor has the piwik cookie (idvisitor = ".$this->visitorInfo['idvisitor'].") ");
}
else
{
@@ -736,20 +749,20 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
}
$userInfo = $this->getUserSettingsInformation();
- $md5Config = $userInfo['config_md5config'];
+ $configId = $userInfo['config_id'];
$timeLookBack = date('Y-m-d H:i:s', $this->getCurrentTimestamp() - self::TIME_IN_PAST_TO_SEARCH_FOR_VISITOR);
- $bindSql = array( $timeLookBack, $this->idsite, $md5Config);
+ $bindSql = array( $timeLookBack, $this->idsite, $configId);
$where = '';
if( Piwik_Tracker_Config::getInstance()->Tracker['trust_visitors_cookies']
- && !empty($this->visitorInfo['visitor_idcookie']))
+ && !empty($this->visitorInfo['idvisitor']))
{
// If the visitor cookies should be trusted (ie. intranet) we add this condition
- $where = 'AND visitor_idcookie = ? ';
- $bindSql[] = $idVisitor;
+ $where = 'AND idvisitor = '.Piwik_Tracker::getBindConvertStringAsBigInt();
+ $bindSql[] = $this->visitorInfo['idvisitor'];
}
- $sql = " SELECT visitor_idcookie,
+ $sql = " SELECT ".Piwik_Tracker::getSelectConvertBigIntAsString('idvisitor')." as idvisitor,
visit_last_action_time,
visit_first_action_time,
idvisit,
@@ -758,16 +771,15 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
FROM ".Piwik_Common::prefixTable('log_visit').
" WHERE visit_last_action_time >= ?
AND idsite = ?
- AND config_md5config = ?
+ AND config_id = ".Piwik_Tracker::getBindConvertStringAsBigInt()."
".$where."
ORDER BY visit_last_action_time DESC
LIMIT 1";
$visitRow = Piwik_Tracker::getDatabase()->fetch($sql, $bindSql);
-
if($visitRow
&& count($visitRow) > 0)
{
- $this->visitorInfo['visitor_idcookie'] = $visitRow['visitor_idcookie'];
+ $this->visitorInfo['idvisitor'] = $visitRow['idvisitor'];
$this->visitorInfo['visit_last_action_time'] = strtotime($visitRow['visit_last_action_time']);
$this->visitorInfo['visit_first_action_time'] = strtotime($visitRow['visit_first_action_time']);
$this->visitorInfo['idvisit'] = $visitRow['idvisit'];
@@ -776,14 +788,18 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
$this->visitorKnown = true;
- printDebug("The visitor is known because of his userSettings+IP (idvisit = {$this->visitorInfo['idvisit']}, last action = ".date("r", $this->visitorInfo['visit_last_action_time']).", first action = ".date("r", $this->visitorInfo['visit_first_action_time']) .")");
+ printDebug("The visitor is known (idvisit = {$this->visitorInfo['idvisit']}, last action = ".date("r", $this->visitorInfo['visit_last_action_time']).", first action = ".date("r", $this->visitorInfo['visit_first_action_time']) .")");
if(!empty($where))
{
- printDebug("Also matched the visitor based on his idcookie: {$visitRow['visitor_idcookie']}");
+ printDebug("Also matched the visitor based on his idcookie: {$visitRow['idvisitor']}");
}
}
+ else
+ {
+ printDebug("The visitor was not matched with an existing visitor...");
+ }
}
-
+
/**
* Gets the UserSettings information and returns them in an array of name => value
*
@@ -841,7 +857,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
$browserLang);
$this->userSettingsInformation = array(
- 'config_md5config' => $configurationHash,
+ 'config_id' => $configurationHash,
'config_os' => $os,
'config_browser_name' => $browserName,
'config_browser_version' => $browserVersion,
@@ -915,7 +931,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
// idcookie has been generated in handleNewVisit or we simply propagate the old value
$this->cookie->set( Piwik_Tracker::COOKIE_INDEX_IDVISITOR,
- $this->visitorInfo['visitor_idcookie'] );
+ $this->visitorInfo['idvisitor'] );
$this->cookie->save();
}
@@ -1143,7 +1159,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface
*/
protected function getConfigHash( $os, $browserName, $browserVersion, $resolution, $plugin_Flash, $plugin_Java, $plugin_Director, $plugin_Quicktime, $plugin_RealPlayer, $plugin_PDF, $plugin_WindowsMedia, $plugin_Gears, $plugin_Silverlight, $plugin_Cookie, $ip, $browserLang)
{
- return md5( $os . $browserName . $browserVersion . $resolution . $plugin_Flash . $plugin_Java . $plugin_Director . $plugin_Quicktime . $plugin_RealPlayer . $plugin_PDF . $plugin_WindowsMedia . $plugin_Gears . $plugin_Silverlight . $plugin_Cookie . $ip . $browserLang );
+ return substr( md5( $os . $browserName . $browserVersion . $resolution . $plugin_Flash . $plugin_Java . $plugin_Director . $plugin_Quicktime . $plugin_RealPlayer . $plugin_PDF . $plugin_WindowsMedia . $plugin_Gears . $plugin_Silverlight . $plugin_Cookie . $ip . $browserLang ), 0, 16);
}
/**
diff --git a/core/Updates/1.2.php b/core/Updates/1.2.php
index a7caee8a45..2795973afd 100644
--- a/core/Updates/1.2.php
+++ b/core/Updates/1.2.php
@@ -18,30 +18,65 @@ class Piwik_Updates_1_2 extends Piwik_Updates
static function getSql($schema = 'Myisam')
{
return array(
+ // Various performance improvements schema updates
'ALTER TABLE `'. Piwik_Common::prefixTable('log_visit') .'`
DROP `visit_server_date`,
DROP INDEX `index_idsite_date_config`,
+ DROP INDEX `index_idsite_datetime_config`,
ADD `visit_entry_idaction_name` INT UNSIGNED NOT NULL AFTER `visit_entry_idaction_url`,
ADD `visit_exit_idaction_name` INT UNSIGNED NOT NULL AFTER `visit_exit_idaction_url`,
CHANGE `visit_exit_idaction_url` `visit_exit_idaction_url` INT UNSIGNED NOT NULL,
- CHANGE `visit_entry_idaction_url` `visit_entry_idaction_url` INT UNSIGNED NOT NULL
+ CHANGE `visit_entry_idaction_url` `visit_entry_idaction_url` INT UNSIGNED NOT NULL,
+ ADD `idvisitor` BIGINT( 20 ) UNSIGNED NOT NULL AFTER `idsite`,
+ ADD `config_id` BIGINT( 20 ) UNSIGNED NOT NULL AFTER `config_md5config`
' => false,
'ALTER TABLE `'. Piwik_Common::prefixTable('log_link_visit_action') .'`
ADD `idsite` INT( 10 ) UNSIGNED NOT NULL AFTER `idlink_va` ,
ADD `server_time` DATETIME NOT NULL AFTER `idsite`,
- ADD `visitor_idcookie` char(32) NOT NULL AFTER `idsite`,
+ ADD `idvisitor` BIGINT(20) UNSIGNED NOT NULL AFTER `idsite`,
ADD `idaction_name_ref` INT UNSIGNED NOT NULL AFTER `idaction_name`,
ADD INDEX `index_idsite_servertime` ( `idsite` , `server_time` )
' => false,
- // Backfill logs as best as we can
+
+ 'ALTER TABLE `'. Piwik_Common::prefixTable('log_conversion') .'`
+ ADD `idvisitor` BIGINT( 20 ) UNSIGNED NOT NULL AFTER `idsite`
+ ' => false,
+
+ // Migrate 128bits IDs inefficiently stored as 8bytes (256 bits) into 64bits
+ 'UPDATE '.Piwik_Common::prefixTable('log_visit') .'
+ SET idvisitor = cast(conv(substring(visitor_idcookie,1,16), 16, 10) as unsigned integer),
+ config_id = cast(conv(substring(config_id,1,16), 16, 10) as unsigned integer)
+ ' => false,
+ 'UPDATE '.Piwik_Common::prefixTable('log_conversion') .'
+ SET idvisitor = cast(conv(substring(visitor_idcookie,1,16), 16, 10) as unsigned integer)
+ ' => false,
+
+ // Drop migrated fields
+ 'ALTER TABLE `'. Piwik_Common::prefixTable('log_visit') .'`
+ DROP visitor_idcookie,
+ DROP config_md5config
+ ' => false,
+ 'ALTER TABLE `'. Piwik_Common::prefixTable('log_conversion') .'`
+ DROP visitor_idcookie
+ ' => false,
+
+ // Recreate INDEX on new field
+ 'ALTER TABLE `'. Piwik_Common::prefixTable('log_visit') .'`
+ ADD INDEX `index_idsite_datetime_config` (idsite, visit_last_action_time, config_id)
+ ' => false,
+
+ // Backfill action logs as best as we can
'UPDATE '.Piwik_Common::prefixTable('log_link_visit_action') .' as action,
'.Piwik_Common::prefixTable('log_visit') .' as visit
SET action.idsite = visit.idsite,
action.server_time = visit.visit_last_action_time,
- action.visitor_idcookie = visit.visitor_idcookie
+ action.idvisitor = visit.idvisitor
WHERE action.idvisit=visit.idvisit
' => false,
+
+ // New index used max once per request, in case this table grows significantly in the future
'ALTER TABLE `'. Piwik_Common::prefixTable('option') .'` ADD INDEX ( `autoload` ) ' => false,
+
);
}
diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php
index e18553ecb9..479fb76fa7 100644
--- a/plugins/Actions/Actions.php
+++ b/plugins/Actions/Actions.php
@@ -218,7 +218,7 @@ class Piwik_Actions extends Piwik_Plugin
type,
idaction,
count(distinct idvisit) as `". Piwik_Archive::INDEX_NB_VISITS ."`,
- count(distinct visitor_idcookie) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`,
+ count(distinct idvisitor) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`,
count(*) as `". Piwik_Archive::INDEX_PAGE_NB_HITS ."`
FROM ".Piwik_Common::prefixTable('log_link_visit_action')." as log_link_visit_action
LEFT JOIN ".Piwik_Common::prefixTable('log_action')." as log_action ON (log_link_visit_action.%s = idaction)
@@ -235,7 +235,7 @@ class Piwik_Actions extends Piwik_Plugin
* Entry actions for Page URLs and Page names
*/
$queryString = "SELECT %s as idaction,
- count(distinct visitor_idcookie) as `". Piwik_Archive::INDEX_PAGE_ENTRY_NB_UNIQ_VISITORS ."`,
+ count(distinct idvisitor) as `". Piwik_Archive::INDEX_PAGE_ENTRY_NB_UNIQ_VISITORS ."`,
count(*) as `". Piwik_Archive::INDEX_PAGE_ENTRY_NB_VISITS ."`,
sum(visit_total_actions) as `". Piwik_Archive::INDEX_PAGE_ENTRY_NB_ACTIONS ."`,
sum(visit_total_time) as `". Piwik_Archive::INDEX_PAGE_ENTRY_SUM_VISIT_LENGTH ."`,
@@ -253,7 +253,7 @@ class Piwik_Actions extends Piwik_Plugin
* Exit actions
*/
$queryString = "SELECT %s as idaction,
- count(distinct visitor_idcookie) as `". Piwik_Archive::INDEX_PAGE_EXIT_NB_UNIQ_VISITORS ."`,
+ count(distinct idvisitor) as `". Piwik_Archive::INDEX_PAGE_EXIT_NB_UNIQ_VISITORS ."`,
count(*) as `". Piwik_Archive::INDEX_PAGE_EXIT_NB_VISITS ."`
FROM ".Piwik_Common::prefixTable('log_visit')."
WHERE visit_last_action_time >= ?
diff --git a/plugins/Live/API.php b/plugins/Live/API.php
index d809692b78..2a7be3d137 100644
--- a/plugins/Live/API.php
+++ b/plugins/Live/API.php
@@ -203,7 +203,7 @@ class Piwik_Live_API
if(!empty($visitorId))
{
- $where[] = Piwik_Common::prefixTable('log_visit') . ".visitor_idcookie = ? ";
+ $where[] = Piwik_Common::prefixTable('log_visit') . ".idvisitor = ? ";
$whereBind[] = $visitorId;
}
@@ -344,10 +344,10 @@ class Piwik_Live_API
*/
private function cleanVisitorDetails( &$visitorDetails, $idSite )
{
- $toUnset = array('config_md5config');
+ $toUnset = array('config_id');
if(Piwik::isUserIsAnonymous())
{
- $toUnset[] = 'visitor_idcookie';
+ $toUnset[] = 'idvisitor';
$toUnset[] = 'location_ip';
}
foreach($toUnset as $keyName)
diff --git a/plugins/Referers/Referers.php b/plugins/Referers/Referers.php
index 5f5e338a18..c2fa26ccaa 100644
--- a/plugins/Referers/Referers.php
+++ b/plugins/Referers/Referers.php
@@ -272,7 +272,7 @@ class Piwik_Referers extends Piwik_Plugin
referer_name,
referer_keyword,
referer_url,
- count(distinct visitor_idcookie) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`,
+ count(distinct idvisitor) as `". Piwik_Archive::INDEX_NB_UNIQ_VISITORS ."`,
count(*) as `". Piwik_Archive::INDEX_NB_VISITS ."`,
sum(visit_total_actions) as `". Piwik_Archive::INDEX_NB_ACTIONS ."`,
max(visit_total_actions) as `". Piwik_Archive::INDEX_MAX_ACTIONS ."`,
diff --git a/plugins/VisitFrequency/VisitFrequency.php b/plugins/VisitFrequency/VisitFrequency.php
index eee2dccc80..c092b8128b 100644
--- a/plugins/VisitFrequency/VisitFrequency.php
+++ b/plugins/VisitFrequency/VisitFrequency.php
@@ -102,7 +102,7 @@ class Piwik_VisitFrequency extends Piwik_Plugin
/* @var $archiveProcessing Piwik_ArchiveProcessing */
$archiveProcessing = $notification->getNotificationObject();
- $query = "SELECT count(distinct visitor_idcookie) as nb_uniq_visitors_returning,
+ $query = "SELECT count(distinct idvisitor) as nb_uniq_visitors_returning,
count(*) as nb_visits_returning,
sum(visit_total_actions) as nb_actions_returning,
max(visit_total_actions) as max_actions_returning,
diff --git a/tests/integration/Main.test.php b/tests/integration/Main.test.php
index 7da869f7d8..cb3eb7fd88 100644
--- a/tests/integration/Main.test.php
+++ b/tests/integration/Main.test.php
@@ -242,7 +242,8 @@ class Test_Piwik_Integration_Main extends Test_Integration
// -
// Second new visitor on Idsite 1: one page view
$visitorB = $this->getTracker($idSite, $dateTime, $defaultInit = true);
- $visitorB->setIp('1.5.6.8');
+ $visitorB->setIp('100.52.656.83');
+ $visitorB->setResolution(800, 300);
$visitorB->setForceVisitDateTime(Piwik_Date::factory($dateTime)->addHour(1)->getDatetime());
$visitorB->setUrlReferer( '' );
$visitorB->setUserAgent('Opera/9.63 (Windows NT 5.1; U; en) Presto/2.1.1');