/**
  * Inserts a trace of the user action into the database
  * @global string $wgDBtype
  * @param Title $oTitle
  * @param User $oUser
  * @param Request $oRequest
  * @return boolean
  */
 public function insertTrace($oTitle, $oUser, $oRequest)
 {
     if (wfReadOnly()) {
         return true;
     }
     if ($oUser->getId() == 0) {
         return true;
     }
     // Anonymous user
     $sPageTitle = $oTitle->getText();
     if ($sPageTitle == '-') {
         return true;
     }
     // otherwise strange '-' with page_id 0 are logged
     $iPageId = $oTitle->getArticleId();
     $iPageNamespaceId = $oTitle->getNamespace();
     $iCurrentTimestamp = time();
     $vLastLoggedPageHash = $oRequest->getSessionData($this->mExtensionKey . '::lastLoggedPageHash');
     $vLastLoggedTime = $oRequest->getSessionData($this->mExtensionKey . '::lastLoggedTime');
     $sCurrentPageHash = md5($iPageId . $iPageNamespaceId . $sPageTitle);
     //this combination should be pretty unique, even with specialpages.
     $iMaxIdleTime = BsConfig::get('MW::WhoIsOnline::MaxIdleTime');
     $iInterval = BsConfig::get('MW::WhoIsOnline::Interval');
     if ($vLastLoggedPageHash == $sCurrentPageHash && $vLastLoggedTime + $iMaxIdleTime + $iInterval + $iMaxIdleTime * 0.1 > $iCurrentTimestamp) {
         return true;
     }
     //log action
     wfProfileIn('BS::' . __METHOD__);
     $oRequest->setSessionData($this->mExtensionKey . '::lastLoggedPageHash', $sCurrentPageHash);
     $oRequest->setSessionData($this->mExtensionKey . '::lastLoggedTime', $iCurrentTimestamp);
     $iRemoveEntriesAfter = 2592000;
     $dbw = wfGetDB(DB_MASTER);
     $dbw->delete('bs_whoisonline', array('wo_timestamp < ' . ($iCurrentTimestamp - $iRemoveEntriesAfter)));
     $aNewRow = array();
     $aNewRow['wo_page_id'] = $oTitle->getArticleId();
     $aNewRow['wo_page_namespace'] = $oTitle->getNamespace();
     $aNewRow['wo_page_title'] = $sPageTitle;
     $aNewRow['wo_user_id'] = $oUser->getId();
     $aNewRow['wo_user_name'] = $oUser->getName();
     $aNewRow['wo_user_real_name'] = $oUser->getRealName();
     $aNewRow['wo_timestamp'] = $iCurrentTimestamp;
     $aNewRow['wo_action'] = $oRequest->getVal('action', 'view');
     global $wgDBtype;
     if ($wgDBtype == 'oracle') {
         $aNewRow['wo_id'] = 0;
     }
     $dbw->insert('bs_whoisonline', $aNewRow);
     wfProfileOut('BS::' . __METHOD__);
     return true;
 }