_sModuleName = 'timeline';
$this -> _sTableWithTransKey = 'bx_timeline_events';
$this -> _sImageVideoFiles = $this -> _oDb -> getExtraParam('root') . 'flash' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR . "video" . DIRECTORY_SEPARATOR . "files" . DIRECTORY_SEPARATOR;
}
public function getTotalRecords()
{
return (int)$this -> _mDb -> getOne("SELECT COUNT(*) FROM `" . $this -> _oConfig -> _aMigrationModules[$this -> _sModuleName]['table_name'] . "` ORDER BY `id`");
}
/**
* Returns data from the module into which data was added
*
* @param int $iModuleItemId object id
* @param string $sModule module name @uses BxDolMConfig::_aMigrationModules
* @return array
*/
private function getModuleItemInfo($iModuleItemId, $sModule = 'forum')
{
$sTable = '';
$sModule = '';
switch($sModule)
{
case 'events':
$sTable = 'bx_events_data';
$sModule = 'bx_events';
break;
case 'store':
$sTable = 'bx_market_products';
$sModule = 'bx_market';
break;
case 'files':
$sTable = 'bx_files_main';
$sModule = 'bx_files';
break;
case 'polls':
$sTable = 'bx_polls_entries';
$sModule = 'bx_polls';
break;
case 'groups':
$sTable = 'bx_groups_data';
$sModule = 'bx_groups';
break;
case 'blogs':
$sTable = 'bx_posts_posts';
$sModule = 'bx_posts';
break;
}
if (!$sTable)
return array();
if ($this->_oDb->isEnabledByName($sModule) && !$this -> _oDb -> isFieldExists($sTable, $this -> _sTransferFieldIdent))
return array();
return $this -> _oDb -> getRow("SELECT * FROM `{$sTable}` WHERE `{$this -> _sTransferFieldIdent}` = :id", array('id' => $iModuleItemId));
}
/**
* Convert Dolphin timeline record into UNA timeline record
*
* @param array $aInfo Dolphin timeline record
* @return array
*/
private function getFormatedData(&$aInfo)
{
$sAction = '';
$sType = '';
$sContent = '';
$sDescription = '';
$iAuthor = $this -> getProfileId($aInfo['owner_id']);
$iObjectId = $this -> getProfileId($aInfo['object_id']);
$iTime = time();
$sTitle = '';
$aData = array();
$mixedTransferred = $this -> isModuleContentTransferred($aInfo['type']);
if ($mixedTransferred === 0)
return array();
switch($aInfo['type'])
{
case 'bx_events':
case 'bx_forum':
case 'bx_groups':
case 'bx_blogs':
case 'bx_store':
case 'bx_polls':
if (!($aInfo['action'] == 'add' || $aInfo['action'] == 'create'))
return array();
$sModule = $this -> _oConfig -> _aModulesAliases[$aInfo['type']];
$aItemInfo = $this -> getModuleItemInfo($aInfo['object_id'], $sModule);
if (empty($aItemInfo))
return array();
$sAction = 'added';
$sType = $aInfo['type'];
$iObjectId = $aItemInfo['id'];
$iTime = $aInfo['date'];
switch($sModule)
{
case 'events':
$sTitle = $aItemInfo['event_name'];
break;
case 'store':
$sTitle = $aItemInfo['title'];
$sType = 'bx_market';
break;
case 'files':
$sTitle = $aItemInfo['title'];
break;
case 'videos':
$sTitle = $aItemInfo['title'];
break;
case 'photos':
$sTitle = $aItemInfo['title'];
break;
case 'polls':
$sTitle = $aItemInfo['text'];
break;
case 'groups':
$sTitle = $aItemInfo['group_name'];
break;
case 'blogs':
$sTitle = $aItemInfo['title'];
$sType = 'bx_posts';
break;
}
$oProfile = BxDolProfile::getInstance($iAuthor);
$sDescription = _t('_bx_timeline_txt_user_added_sample', $oProfile -> getDisplayName(), _t("_{$sType}_txt_sample_single_with_article"));
break;
case 'wall_common_link':
$sType = 'timeline_common_post';
$sTitle = '';
preg_match('!https?://\S+!', $aInfo['description'], $aUrl);
if (!empty($aUrl[0]))
{
$aData = array(
'url' => $aUrl[0],
'type' => 'link'
);
$sContent = serialize(array());
}
break;
case 'wall_common_photos':
case 'wall_common_videos':
$sType = 'timeline_common_post';
$sTitle = $aInfo['type'] == 'wall_common_photos' ? '' : '';
$aItemInfo = @unserialize($aInfo['content']);
if (!empty($aItemInfo))
{
$aData = array(
'media_id' => $aItemInfo['id'],
'type' => $aItemInfo['type']
);
$sContent = serialize(array());
}
break;
case 'wall_common_text':
$sTitle = html2txt($aInfo['content']);
$sType = 'timeline_common_post';
$sContent = serialize(array());
break;
case 'wall_common_repost':
$sType = 'timeline_common_repost';
if (isset($aInfo['content']))
$aItemInfo = @unserialize($aInfo['content']);
if (!isset($aItemInfo['action']) || !($aItemInfo['action'] == 'add' || $aItemInfo['action'] == 'create') || !isset($this -> _oConfig -> _aModulesAliases[$aItemInfo['type']]))
break;
else
$sSubAction = 'added';
$aSubInfo = $this -> getModuleItemInfo($aItemInfo['object_id'], $this -> _oConfig -> _aModulesAliases[$aItemInfo['type']]);
if (empty($aSubInfo))
break;
$sSubType = $aItemInfo['type'];
$sSubType = $sSubType == 'bx_blogs' ? 'bx_posts' : $sSubType;
$sSubType = $sSubType == 'bx_store' ? 'bx_market' : $sSubType;
$sContent = serialize(array('type' => $sSubType, 'action' => 'added', 'object_id' => $aSubInfo['id']));
break;
}
$aResult = array
(
'type' => $sType,
'action' => $sAction,
'owner_id' => $iAuthor,
'object_id' => $iObjectId,
'privacy' => 3,
'content' => $sContent,
'title' => $sTitle,
'description' => $sDescription,
'date' => $iTime,
'active' => (int)$aInfo['active'],
'hidden' => (int)$aInfo['hidden'],
'data' => $aData
);
return $aResult;
}
/**
* Migrate timeline link from Dolphin to UNA
*
* @param int $iEventId record id
* @param string $sUrl html url
* @param int $iProfileId profile id
* @return int affected rows
*/
private function addLink($iEventId, $sUrl, $iProfileId)
{
$aSiteInfo = bx_get_site_info($sUrl, array(
'thumbnailUrl' => array('tag' => 'link', 'content_attr' => 'href'),
'OGImage' => array('name_attr' => 'property', 'name' => 'og:image'),
));
$sTitle = !empty($aSiteInfo['title']) ? $aSiteInfo['title'] : _t('_Empty');
$sDescription = !empty($aSiteInfo['description']) ? $aSiteInfo['description'] : _t('_Empty');
$sMediaUrl = '';
if(!empty($aSiteInfo['thumbnailUrl']))
$sMediaUrl = $aSiteInfo['thumbnailUrl'];
else if(!empty($aSiteInfo['OGImage']))
$sMediaUrl = $aSiteInfo['OGImage'];
$iMediaId = 0;
$oStorage = null;
if(!empty($sMediaUrl))
{
$oStorage = BxDolStorage::getObjectInstance('bx_timeline_photos');
$iMediaId = $oStorage->storeFileFromUrl($sMediaUrl, true, $iProfileId);
$oStorage -> afterUploadCleanup($iMediaId, $iProfileId);
}
if (!$sTitle && !$sDescription && !$iMediaId)
return false;
$sQuery = $this -> _oDb -> prepare("
INSERT INTO
`bx_timeline_links`
SET
`profile_id` = ?,
`media_id` = ?,
`url` = ?,
`title` = ?,
`text` = ?,
`added` = UNIX_TIMESTAMP()
", $iProfileId, $iMediaId, $sUrl, $sTitle, $sDescription);
$this -> _oDb -> query($sQuery);
return $this -> _oDb -> query("INSERT INTO `bx_timeline_links2events` SET `event_id` = :event, `link_id` = :link", array('event' => $iEventId, 'link' => $this -> _oDb -> lastId()));
}
/**
* Transfer timeline photos
*
* @param int $iEventId UNA record id
* @param int $iPhotoId Description for $iPhotoId
* @param int $iProfileId Description for $iProfileId
* @return Return description
*/
private function addPhoto($iEventId, $iPhotoId, $iProfileId)
{
$aMedia = $this -> _mDb -> getRow("SELECT * FROM `bx_photos_main` WHERE `ID`=:id LIMIT 1", array('id' => $iPhotoId));
if (empty($aMedia))
return false;
$sImagePath = $this -> _sImagePhotoFiles . "{$aMedia['ID']}.{$aMedia['Ext']}";
if (file_exists($sImagePath))
{
$oStorage = BxDolStorage::getObjectInstance('bx_timeline_photos');
$iMediaId = $oStorage -> storeFileFromPath($sImagePath, true, $iProfileId, $iEventId);
if ($iMediaId)
{
$oStorage -> afterUploadCleanup($iMediaId, $iProfileId);
return $this -> _oDb -> query("INSERT INTO `bx_timeline_photos2events` SET `event_id` = :event, `media_id` = :media_id", array('event' => $iEventId, 'media_id' => $iMediaId));
}
}
return false;
}
private function addVideo($iEventId, $iVideoId, $iProfileId)
{
$aMedia = $this -> _mDb -> getRow("SELECT * FROM `RayVideoFiles` WHERE `ID`=:id LIMIT 1", array('id' => $iVideoId));
if (empty($aMedia))
return false;
$sVideoPath = $this -> _sImageVideoFiles . "{$iVideoId}.m4v";
if (file_exists($sVideoPath))
{
$oStorage = BxDolStorage::getObjectInstance('bx_timeline_videos');
$iMediaId = $oStorage -> storeFileFromPath($sVideoPath, true, $iProfileId, $iEventId);
if ($iMediaId)
{
$oStorage -> afterUploadCleanup($iMediaId, $iProfileId);
return $this -> _oDb -> query("INSERT INTO `bx_timeline_videos2events` SET `event_id` = :event, `media_id` = :media_id", array('event' => $iEventId, 'media_id' => $iMediaId));
}
}
return false;
}
public function runMigration()
{
if (!$this -> getTotalRecords())
{
$this -> setResultStatus(_t('_bx_dolphin_migration_no_data_to_transfer'));
return BX_MIG_SUCCESSFUL;
}
$this -> setResultStatus(_t('_bx_dolphin_migration_started_migration_timeline'));
$this -> createMIdField();
$iFeedsId = $this -> getLastMIDField();
$sStart = '';
if ($iFeedsId)
$sStart = " WHERE `id` > {$iFeedsId}";
$aResult = $this -> _mDb -> getAll("SELECT * FROM `". $this -> _oConfig -> _aMigrationModules[$this -> _sModuleName]['table_name'] . "` {$sStart} ORDER BY `id`");
foreach($aResult as $iKey => $aValue)
{
$aInfo = $this -> getFormatedData($aValue);
if (empty($aInfo) || !$aInfo['type'])
continue;
$iFeedId = $this -> isItemExisted($aValue['id']);
if (!$iFeedId)
{
$sQuery = $this -> _oDb -> prepare(
"
INSERT INTO
`{$this -> _sTableWithTransKey}`
SET
`owner_id` = ?,
`type` = ?,
`action` = ?,
`object_id` = ?,
`object_privacy_view` = ?,
`content` = ?,
`title` = ?,
`description` = ?,
`date` = ?,
`active` = ?,
`status` = ?
",
$aInfo['owner_id'],
$aInfo['type'],
$aInfo['action'],
$aInfo['object_id'],
$this -> getValidPrivacy($aInfo['privacy']),
$aInfo['content'],
$aInfo['title'],
$aInfo['description'],
$aInfo['date'],
$aInfo['active'],
$aInfo['hidden'] ? 'hidden' : 'active'
);
$this -> _oDb -> query($sQuery);
$iFeedId = $this -> _oDb -> lastId();
if (!$iFeedId){
$this -> setResultStatus(_t('_bx_dolphin_migration_started_migration_timeline_error', (int)$aValue['id']));
return BX_MIG_FAILED;
}
$this -> _iTransferred++;
}
if (!empty($aInfo['data']))
switch($aInfo['data']['type'])
{
case 'videos' : $this -> addVideo($iFeedId, $aInfo['data']['media_id'], $aInfo['owner_id']); break;
case 'photos' : $this -> addPhoto($iFeedId, $aInfo['data']['media_id'], $aInfo['owner_id']); break;
case 'link' : $this -> addLink($iFeedId, $aInfo['data']['url'], $aInfo['owner_id']); break;
}
$iComments = $this -> transferComments($iFeedId, (int)$aValue['id'], 'timeline');
$this -> _oDb -> query("UPDATE `{$this -> _sTableWithTransKey}`
SET
`comments` = :cmts
WHERE `id` = :id",
array(
'id' => $iFeedId,
'cmts' => (int)$iComments,
));
$this -> setMID($iFeedId, $aValue['id']);
}
// set as finished;
$this -> setResultStatus(_t('_bx_dolphin_migration_started_migration_timeline_finished', $this -> _iTransferred));
return BX_MIG_SUCCESSFUL;
}
public function removeContent()
{
if (!$this -> _oDb -> isTableExists($this -> _sTableWithTransKey) || !$this -> _oDb -> isFieldExists($this -> _sTableWithTransKey, $this -> _sTransferFieldIdent))
return false;
$aRecords = $this -> _oDb -> getAll("SELECT
`e`.`id`,
`l`.`link_id`,
`p`.`media_id` as `photo_id`,
`v`.`media_id` as `video_id`
FROM `{$this -> _sTableWithTransKey}` as `e`
LEFT JOIN `bx_timeline_links2events` as `l` ON `e`.`id` = `l`.`event_id`
LEFT JOIN `bx_timeline_photos2events` as `p` ON `e`.`id` = `p`.`event_id`
LEFT JOIN `bx_timeline_videos2events` as `v` ON `e`.`id` = `v`.`event_id`
WHERE `e`.`{$this -> _sTransferFieldIdent}`!=0");
if (!empty($aRecords))
{
$iNumber = 0;
foreach($aRecords as $iKey => $aValue)
{
$oComments = BxDolCmts::getObjectInstance('bx_timeline', $aValue['id']);
if($oComments !== false)
$oComments->onObjectDelete($aValue['id']);
if ($aValue['video_id'])
{
$oStorage = BxDolStorage::getObjectInstance('bx_timeline_videos');
$oStorage->deleteFile($aValue['video_id']);
$this -> _oDb -> query("DELETE FROM `bx_timeline_videos2events` WHERE `event_id`=:id", array('id' => $aValue['id']));
}
if ($aValue['photo_id'])
{
$oStorage = BxDolStorage::getObjectInstance('bx_timeline_photos');
$oStorage->deleteFile($aValue['photo_id']);
$this -> _oDb -> query("DELETE FROM `bx_timeline_photos2events` WHERE `event_id`=:id", array('id' => $aValue['id']));
}
if ($aValue['link_id'])
{
$sQuery = $this-> _oDb -> prepare("DELETE FROM `tl`, `tle` USING `bx_timeline_links` AS `tl` LEFT JOIN `bx_timeline_links2events` AS `tle` ON `tl`.`id`=`tle`.`link_id` WHERE `tle`.`event_id` = ?", $aValue['id']);
$this -> _oDb -> query($sQuery);
}
$this -> _oDb -> query("DELETE FROM `{$this -> _sTableWithTransKey}` WHERE `id`=:id", array('id' => $aValue['id']));
$iNumber++;
}
}
parent::removeContent();
return $iNumber;
}
}
/** @} */