- Модуль: im
- Путь к файлу: ~/bitrix/modules/im/lib/update/chatstartingcount.php
- Класс: BitrixImUpdateChatStartingCount
- Вызов: ChatStartingCount::execute
public function execute(array &$result)
{
global $DB;
if (!Loader::includeModule(self::$moduleId))
{
return false;
}
$return = false;
$params = Option::get(self::$moduleId, self::OPTION_NAME, "");
$params = ($params !== "" ? @unserialize($params, ["allowed_classes" => false]) : []);
$params = (is_array($params) ? $params : []);
if (empty($params))
{
$params = [
"lastId" => 0,
"number" => 0,
"count" => RelationTable::getCount(),
];
}
if ($params["count"] > 0)
{
$result["steps"] = "";
$result["count"] = $params["count"];
$ids = RelationTable::getList(
[
'order' => ['ID' => 'ASC'],
'filter' => [
'>ID' => $params["lastId"],
'>START_ID' => 0
],
'select' => ['ID'],
'offset' => 0,
'limit' => 100
]
)->fetchAll();
$ids = array_map(function($item){
return $item['ID'];
}, $ids);
$idsCount = count($ids);
if ($idsCount > 0)
{
$params["lastId"] = $ids[$idsCount - 1];
$params["number"] += $idsCount;
$implodedIds = implode(',', $ids);
$DB->Query("
UPDATE b_im_relation R
INNER JOIN b_im_chat C ON R.CHAT_ID = C.ID
SET R.START_COUNTER = (
SELECT COUNT(1)
FROM b_im_message M
WHERE M.CHAT_ID = R.CHAT_ID AND M.ID < R.START_ID
)
WHERE R.ID IN (" .$implodedIds. ")
");
Option::set(self::$moduleId, self::OPTION_NAME, serialize($params));
$return = true;
}
else
{
Option::delete(self::$moduleId, ["name" => self::OPTION_NAME]);
}
$result["steps"] = $params["number"];
}
return $return;
}