From 7131d5972505ccc8d6b2a36296065556a38a9078 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Fri, 20 Dec 2024 12:51:20 +0530 Subject: [PATCH] Adds code to update idvisitor if changed in visits_log table, #DEV-18502 --- core/Tracker/Model.php | 20 ++++++++++++++++++++ core/Tracker/Visit.php | 8 ++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/core/Tracker/Model.php b/core/Tracker/Model.php index d2ccb5c4f37..6c0481bd50d 100644 --- a/core/Tracker/Model.php +++ b/core/Tracker/Model.php @@ -641,6 +641,26 @@ public function isSiteEmpty($siteId) return $result == null; } + /** + * Update an existing visit in the DB + * + * @param int $idvisit + * @param string $idVisitor + * + * @throws Db\DbException + */ + public function updateVisitorIDForConversion($idvisit, $idVisitor): void + { + $table = Common::prefixTable('log_conversion'); + $sqlQuery = "UPDATE $table SET idvisitor = ? WHERE idvisit = ?"; + + $sqlBind = []; + $sqlBind[] = $idVisitor; + $sqlBind[] = $idvisit; + + $this->getDb()->query($sqlQuery, $sqlBind); + } + /** * Build an array of fields and bind values * diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php index 8ddd420ca54..88599bfa4e5 100644 --- a/core/Tracker/Visit.php +++ b/core/Tracker/Visit.php @@ -16,6 +16,7 @@ use Piwik\Date; use Piwik\Exception\UnexpectedWebsiteFoundException; use Matomo\Network\IPUtils; +use Piwik\Piwik; use Piwik\Plugin\Dimension\VisitDimension; use Piwik\Plugins\Actions\Tracker\ActionsRequestProcessor; use Piwik\Plugins\UserCountry\Columns\Base; @@ -429,17 +430,20 @@ protected function updateExistingVisit($valuesToUpdate) $idSite = $this->request->getIdSite(); $idVisit = $this->visitProperties->getProperty('idvisit'); + $model = $this->getModel(); - $wasInserted = $this->getModel()->updateVisit($idSite, $idVisit, $valuesToUpdate); + $wasInserted = $model->updateVisit($idSite, $idVisit, $valuesToUpdate); // Debug output if (isset($valuesToUpdate['idvisitor'])) { + $model->updateVisitorIDForConversion($idVisit, $valuesToUpdate['idvisitor']); + Piwik::postEvent('Visit.updateIDVisitor', [$idVisit, $valuesToUpdate['idvisitor']]); $valuesToUpdate['idvisitor'] = bin2hex($valuesToUpdate['idvisitor']); } if ($wasInserted) { Common::printDebug('Updated existing visit: ' . var_export($valuesToUpdate, true)); - } elseif (!$this->getModel()->hasVisit($idSite, $idVisit)) { + } elseif (!$model->hasVisit($idSite, $idVisit)) { // mostly for WordPress. see https://github.com/matomo-org/matomo/pull/15587 // as WP doesn't set `MYSQLI_CLIENT_FOUND_ROWS` and therefore when the update succeeded but no value changed // it would still return 0 vs OnPremise would return 1 or 2.