• This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn more.

XenForo importer, likes problem

Affected version
1.5.15a

Jake Bunce

XenForo moderator
Staff member
#1
I had a customer with missing likes after a XF to XF import. I ended up just running a query to manually import the missing likes.

But in looking at the import code it doesn't look correct to my eye:

Code:
    /**
     * Limited to likes for post and profile posts at present
     *
     * @param integer $start
     * @param array $options
     */
    public function stepLikes($start, array $options)
    {
        $options = array_merge(array(
            'limit' => 100,
            'max' => false
        ), $options);

        $sDb = $this->_sourceDb;

        /* @var $model XenForo_Model_Import */
        $model = $this->_importModel;

        $likeTypes = $model->getSupportedLikeTypes();

        if ($options['max'] === false)
        {
            $options['max'] = $sDb->fetchOne('
                SELECT MAX(like_id)
                FROM xf_liked_content
                WHERE content_type IN (' . $sDb->quote(array_keys($likeTypes)) . ')
            ');
        }

        $likes = $sDb->fetchAll($sDb->limit(
            '
                SELECT *
                FROM xf_liked_content
                WHERE content_type IN (' . $sDb->quote(array_keys($likeTypes)) . ')
                    AND like_id > ' . $sDb->quote($start) . '
                ORDER BY like_id
            ', $options['limit']
        ));
        if (!$likes)
        {
            return true;
        }

        $next = 0;
        $total = 0;

        $groupedLikes = array();
        $userIds = array();
        foreach ($likes AS $like)
        {
            $groupedLikes[$like['content_type']][$like['content_id']] = $like; // not adding a new record each time?  it looks to me like this would only capture one like per batch per content item
            $userIds[] = $like['like_user_id'];
            $userIds[] = $like['content_user_id'];
        }

        $userIdMap = $model->getImportContentMap('user', $userIds);

        XenForo_Db::beginTransaction();

        foreach ($groupedLikes AS $contentType => $likes)
        {
            $contentIdMap = $model->getImportContentMap($contentType, array_keys($likes));

            foreach ($likes AS $contentId => $like)
            {
                $next = $like['like_id'];

                $newContentId = $this->_mapLookUp($contentIdMap, $contentId);
                if (!$newContentId)
                {
                    continue;
                }

                $model->importLike(
                    $contentType,
                    $newContentId,
                    $this->_mapLookUp($userIdMap, $like['content_user_id'], 0),
                    $this->_mapLookUp($userIdMap, $like['like_user_id'], 0),
                    $like['like_date']
                );

                $total++;
            }
        }

        XenForo_Db::commit();

        $this->_session->incrementStepImportTotal($total);

        return array($next, $options, $this->_getProgressOutput($next, $options['max']));
    }