/** * @param Connector $connector * @param null $pageNumber * @param int $timeout * @return array * @throws \Bitrix\Main\ArgumentException */ public static function addFromConnector(Connector $connector, $pageNumber = null, $timeout = 0) { $startTime = getmicrotime(); $withoutNav = empty($pageNumber); $result = false; $onlyOneLoop = false; $rowsInPage = 5; $countAll = 0; $countProcessed = 0; $countUpdated = 0; $countAdded = 0; $countError = 0; $dataDb = $connector->getResult(); if ($dataDb->resourceCDBResult) { $dataDb = $dataDb->resourceCDBResult; } elseif ($dataDb->resource) { $dataDb = new \CDBResult($dataDb->resource); } else { $dataDb = new \CDBResult(); $dataDb->InitFromArray(array()); } if (!is_subclass_of($dataDb, 'CDBResultMysql')) { $rowsInPage = 50; $onlyOneLoop = true; } while ($timeout == 0 || getmicrotime() - $startTime < $timeout) { if (!$withoutNav) { $dataDb->NavStart($rowsInPage, false, $pageNumber); $countAll = $dataDb->SelectedRowsCount(); } $listId = null; while ($arData = $dataDb->Fetch()) { if ($withoutNav) { $countAll++; } $countProcessed++; if (!$listId) { $listId = ListTable::addIfNotExist($connector->getModuleId() . '_' . $connector->getCode(), Loc::getMessage('CONTACT_PULL_LIST_PREFIX') . $connector->getName()); } $id = null; $contactDb = ContactTable::getList(array('select' => array('ID'), 'filter' => array('EMAIL' => $arData['EMAIL']))); if ($arContact = $contactDb->fetch()) { $id = $arContact['ID']; $countUpdated++; } else { $resultAdd = static::add(array('NAME' => $arData['NAME'], 'EMAIL' => $arData['EMAIL'], 'USER_ID' => $arData['USER_ID'])); if ($resultAdd->isSuccess()) { $id = $resultAdd->getId(); $countAdded++; } else { $countError++; } } if ($id) { ContactListTable::addIfNotExist($id, $listId); } } if ($withoutNav) { $result = false; break; } if ($dataDb->NavPageCount <= $pageNumber) { $result = false; break; } else { $pageNumber++; $result = $pageNumber; } if ($onlyOneLoop) { break; } } if ($withoutNav) { $countProgress = $countAll; } else { $countProgress = ($pageNumber - 1) * $dataDb->NavPageSize; if (!$result || $countProgress > $countAll) { $countProgress = $countAll; } } return array('STATUS' => $result, 'COUNT_ALL' => $countAll, 'COUNT_PROGRESS' => $countProgress, 'COUNT_PROCESSED' => $countProcessed, 'COUNT_NEW' => $countAdded, 'COUNT_ERROR' => $countError); }