/** * Update models in read subscription table based on modelId and userId(userId is used implicitly in getSubsetIds) * @param string $modelClassName * @param User $user * @param bool $onlyOwnedModels * @param int $updateStartTimestamp * @param MessageLogger $messageLogger * @param array $arrayOfModelIdsToUpdate * permission subscription table just for account ids that exist in account temp build table */ public static function updateReadSubscriptionTableByModelClassNameAndUser($modelClassName, User $user, $updateStartTimestamp, $onlyOwnedModels = false, MessageLogger $messageLogger, $arrayOfModelIdsToUpdate = array()) { assert('$modelClassName === null || is_string($modelClassName) && $modelClassName != ""'); assert('is_int($updateStartTimestamp)'); $metadata = array(); $startTime = microtime(true); $lastReadPermissionUpdateTimestamp = static::getLastReadPermissionUpdateTimestamp(); $dateTime = DateTimeUtil::convertTimestampToDbFormatDateTime($lastReadPermissionUpdateTimestamp); $updateDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime($updateStartTimestamp); if ($modelClassName == 'Account' && !empty($arrayOfModelIdsToUpdate)) { $metadata['clauses'][1] = array('attributeName' => 'id', 'operatorType' => 'oneOf', 'value' => $arrayOfModelIdsToUpdate); $metadata['structure'] = "1"; } else { $metadata['clauses'][1] = array('attributeName' => 'createdDateTime', 'operatorType' => 'lessThanOrEqualTo', 'value' => $updateDateTime); $metadata['structure'] = "1"; if ($onlyOwnedModels) { $metadata['clauses'][2] = array('attributeName' => 'owner', 'operatorType' => 'equals', 'value' => $user->id); $metadata['structure'] .= " AND 2"; } } $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter($modelClassName); $where = RedBeanModelDataProvider::makeWhere($modelClassName, $metadata, $joinTablesAdapter); $userModelIds = $modelClassName::getSubsetIds($joinTablesAdapter, null, null, $where); $endTime = microtime(true); $executionTimeMs = $endTime - $startTime; $messageLogger->addDebugMessage(Zurmo::t('ZurmoModule', 'SQL time {modelClassName}: {miliSeconds}', array('{modelClassName}' => $modelClassName, '{miliSeconds}' => $executionTimeMs))); // Get models from subscription table $tableName = static::getSubscriptionTableName($modelClassName); $sql = "SELECT modelid FROM {$tableName} WHERE userid = " . $user->id . " AND subscriptiontype = " . static::TYPE_ADD; if ($modelClassName == 'Account' && !empty($arrayOfModelIdsToUpdate)) { $accountIds = static::getAccountIdsArrayFromBuildTable(); if (!empty($accountIds)) { $list = "'" . implode(", ", $accountIds) . "'"; $sql .= " AND modelid in ({$list})"; } } $permissionTableRows = ZurmoRedBean::getAll($sql); $permissionTableIds = array(); if (is_array($permissionTableRows) && !empty($permissionTableRows)) { foreach ($permissionTableRows as $permissionTableRow) { $permissionTableIds[] = $permissionTableRow['modelid']; } } $modelIdsToAdd = array_diff($userModelIds, $permissionTableIds); $modelIdsToDelete = array_diff($permissionTableIds, $userModelIds); if (is_array($modelIdsToAdd) && !empty($modelIdsToAdd)) { foreach ($modelIdsToAdd as $modelId) { $sql = "DELETE FROM {$tableName} WHERE\n userid = '" . $user->id . "'\n AND modelid = '{$modelId}'\n AND subscriptiontype='" . self::TYPE_DELETE . "'"; ZurmoRedBean::exec($sql); $sql = "SELECT * FROM {$tableName} WHERE\n userid = '" . $user->id . "'\n AND modelid = '{$modelId}'\n AND subscriptiontype='" . self::TYPE_ADD . "'"; $results = ZurmoRedBean::getAll($sql); if (!is_array($results) || empty($results)) { $sql = "INSERT INTO {$tableName} VALUES\n (null, '" . $user->id . "', '{$modelId}', '{$updateDateTime}', '" . self::TYPE_ADD . "')"; ZurmoRedBean::exec($sql); } } } if (is_array($modelIdsToDelete) && !empty($modelIdsToDelete)) { foreach ($modelIdsToDelete as $modelId) { $sql = "DELETE FROM {$tableName} WHERE\n userid = '" . $user->id . "'\n AND modelid = '{$modelId}'\n AND subscriptiontype='" . self::TYPE_ADD . "'"; ZurmoRedBean::exec($sql); $sql = "SELECT * FROM {$tableName} WHERE\n userid = '" . $user->id . "'\n AND modelid = '{$modelId}'\n AND subscriptiontype='" . self::TYPE_DELETE . "'"; $results = ZurmoRedBean::getAll($sql); if (!is_array($results) || empty($results)) { $sql = "INSERT INTO {$tableName} VALUES\n (null, '" . $user->id . "', '{$modelId}', '{$updateDateTime}', '" . self::TYPE_DELETE . "')"; ZurmoRedBean::exec($sql); } } } }