/**
  * Prepare online visitors for collection
  *
  * @param Mage_Log_Model_Visitor_Online $object
  * @return Mage_Log_Model_Resource_Visitor_Online
  */
 public function prepare(Mage_Log_Model_Visitor_Online $object)
 {
     if ($object->getUpdateFrequency() + $object->getPrepareAt() > time()) {
         return $this;
     }
     $readAdapter = $this->_getReadAdapter();
     $writeAdapter = $this->_getWriteAdapter();
     $writeAdapter->beginTransaction();
     try {
         $writeAdapter->delete($this->getMainTable());
         $visitors = array();
         $lastUrls = array();
         // retrieve online visitors general data
         $lastDate = Mage::getModel('core/date')->gmtTimestamp() - $object->getOnlineInterval() * 60;
         $select = $readAdapter->select()->from($this->getTable('log/visitor'), array('visitor_id', 'first_visit_at', 'last_visit_at', 'last_url_id'))->where('last_visit_at >= ?', $readAdapter->formatDate($lastDate));
         $query = $readAdapter->query($select);
         while ($row = $query->fetch()) {
             $visitors[$row['visitor_id']] = $row;
             $lastUrls[$row['last_url_id']] = $row['visitor_id'];
             $visitors[$row['visitor_id']]['visitor_type'] = Mage_Log_Model_Visitor::VISITOR_TYPE_VISITOR;
             $visitors[$row['visitor_id']]['customer_id'] = null;
         }
         if (!$visitors) {
             $this->commit();
             return $this;
         }
         // retrieve visitor remote addr
         $select = $readAdapter->select()->from($this->getTable('log/visitor_info'), array('visitor_id', 'remote_addr'))->where('visitor_id IN(?)', array_keys($visitors));
         $query = $readAdapter->query($select);
         while ($row = $query->fetch()) {
             $visitors[$row['visitor_id']]['remote_addr'] = $row['remote_addr'];
         }
         // retrieve visitor last URLs
         $select = $readAdapter->select()->from($this->getTable('log/url_info_table'), array('url_id', 'url'))->where('url_id IN(?)', array_keys($lastUrls));
         $query = $readAdapter->query($select);
         while ($row = $query->fetch()) {
             $visitorId = $lastUrls[$row['url_id']];
             $visitors[$visitorId]['last_url'] = $row['url'];
         }
         // retrieve customers
         $select = $readAdapter->select()->from($this->getTable('log/customer'), array('visitor_id', 'customer_id'))->where('visitor_id IN(?)', array_keys($visitors));
         $query = $readAdapter->query($select);
         while ($row = $query->fetch()) {
             $visitors[$row['visitor_id']]['visitor_type'] = Mage_Log_Model_Visitor::VISITOR_TYPE_CUSTOMER;
             $visitors[$row['visitor_id']]['customer_id'] = $row['customer_id'];
         }
         foreach ($visitors as $visitorData) {
             unset($visitorData['last_url_id']);
             $writeAdapter->insertForce($this->getMainTable(), $visitorData);
         }
         $writeAdapter->commit();
     } catch (Exception $e) {
         $writeAdapter->rollBack();
         throw $e;
     }
     $object->setPrepareAt();
     return $this;
 }
Beispiel #2
0
 /**
  * Prepare online visitors for collection
  *
  * @param Mage_Log_Model_Visitor_Online $object
  * @return Mage_Log_Model_Mysql4_Visitor_Online
  */
 public function prepare(Mage_Log_Model_Visitor_Online $object)
 {
     if ($object->getUpdateFrequency() + $object->getPrepareAt() > time()) {
         return $this;
     }
     $this->_getWriteAdapter()->beginTransaction();
     $this->_getWriteAdapter()->truncate($this->getMainTable());
     $visitors = array();
     $lastUrls = array();
     // retrieve online visitors general data
     $whereCond = sprintf('last_visit_at >= (? - INTERVAL %d MINUTE)', $object->getOnlineInterval());
     $select = $this->_getReadAdapter()->select()->from($this->getTable('log/visitor'), array('visitor_id', 'first_visit_at', 'last_visit_at', 'last_url_id'))->where($whereCond, now());
     $query = $this->_getReadAdapter()->query($select);
     while ($row = $query->fetch()) {
         $visitors[$row['visitor_id']] = $row;
         $lastUrls[$row['last_url_id']] = $row['visitor_id'];
         $visitors[$row['visitor_id']]['visitor_type'] = Mage_Log_Model_Visitor::VISITOR_TYPE_VISITOR;
         $visitors[$row['visitor_id']]['customer_id'] = null;
     }
     if (!$visitors) {
         $this->commit();
         return $this;
     }
     // retrieve visitor remote addr
     $select = $this->_getReadAdapter()->select()->from($this->getTable('log/visitor_info'), array('visitor_id', 'remote_addr'))->where('visitor_id IN(?)', array_keys($visitors));
     $query = $this->_getReadAdapter()->query($select);
     while ($row = $query->fetch()) {
         $visitors[$row['visitor_id']]['remote_addr'] = $row['remote_addr'];
     }
     // retrieve visitor last URLs
     $select = $this->_getReadAdapter()->select()->from($this->getTable('log/url_info_table'), array('url_id', 'url'))->where('url_id IN(?)', array_keys($lastUrls));
     $query = $this->_getReadAdapter()->query($select);
     while ($row = $query->fetch()) {
         $visitorId = $lastUrls[$row['url_id']];
         $visitors[$visitorId]['last_url'] = $row['url'];
     }
     // retrieve customers
     $select = $this->_getReadAdapter()->select()->from($this->getTable('log/customer'), array('visitor_id', 'customer_id'))->where('visitor_id IN(?)', array_keys($visitors));
     $query = $this->_getReadAdapter()->query($select);
     while ($row = $query->fetch()) {
         $visitors[$row['visitor_id']]['visitor_type'] = Mage_Log_Model_Visitor::VISITOR_TYPE_CUSTOMER;
         $visitors[$row['visitor_id']]['customer_id'] = $row['customer_id'];
     }
     foreach ($visitors as $visitorData) {
         unset($visitorData['last_url_id']);
         $this->_getWriteAdapter()->insert($this->getMainTable(), $visitorData);
     }
     $this->_getWriteAdapter()->commit();
     $object->setPrepareAt();
     return $this;
 }