/** * At some point if performance is a problem with rebuilding activity models, then the stored procedure * needs to be refactored to somehow support more joins dynamically. * @see https://www.pivotaltracker.com/story/show/38804909 * @param boolean $forcePhp */ public static function rebuild($forcePhp = false) { //Forcing php way until we can fix failing tests here: AccountReadPermissionsOptimizationScenariosTest $forcePhp = true; assert('is_bool($forcePhp)'); foreach (self::getMungableModelClassNames() as $modelClassName) { if (!SECURITY_OPTIMIZED || $forcePhp) { self::rebuildViaSlowWay($modelClassName); } else { //models that extend activity are special and can only be done with the PHP process. They cannot //be done using the stored procedure because it does not support the extra joins needed to determine //which securable items to look at. if (is_subclass_of($modelClassName, 'Activity')) { self::rebuildViaSlowWay($modelClassName); } else { $modelTableName = RedBeanModel::getTableName($modelClassName); $mungeTableName = self::getMungeTableName($modelClassName); if (!is_subclass_of($modelClassName, 'OwnedSecurableItem')) { throw new NotImplementedException($message, $code, $previous); } if (is_subclass_of($modelClassName, 'Person')) { if ($modelClassName != 'Contact') { throw new NotSupportedException(); } else { $modelTableName = Person::getTableName('Person'); } } ZurmoDatabaseCompatibilityUtil::callProcedureWithoutOuts("rebuild('{$modelTableName}', '{$mungeTableName}')"); } } } }
public static function forgetAll($forgetDbLevelCache = true) { if (static::supportsAndAllowsDatabaseCaching() && $forgetDbLevelCache) { ZurmoDatabaseCompatibilityUtil::callProcedureWithoutOuts("clear_cache_actual_rights()"); } parent::forgetAll(); }
/** * @return bool */ public function generateCampaignItemsForDueCampaigns() { $nowTimestamp = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); // Begin Not Coding Standard $sql = "`generate_campaign_items`(" . Campaign::STATUS_ACTIVE . "," . Campaign::STATUS_PROCESSING . ",'{$nowTimestamp}')"; // End Not Coding Standard ZurmoDatabaseCompatibilityUtil::callProcedureWithoutOuts($sql); Yii::app()->jobQueue->add('CampaignQueueMessagesInOutbox', 5); return true; }
/** * At some point if performance is a problem with rebuilding activity models, then the stored procedure * needs to be refactored to somehow support more joins dynamically. * @see https://www.pivotaltracker.com/story/show/38804909 * @param boolean $overwriteExistingTables * @param boolean $forcePhp */ public static function rebuild($overwriteExistingTables = true, $forcePhp = false, $messageStreamer = null) { //Forcing php way until we can fix failing tests here: AccountReadPermissionsOptimizationScenariosTest $forcePhp = true; assert('is_bool($overwriteExistingTables)'); assert('is_bool($forcePhp)'); foreach (PathUtil::getAllMungableModelClassNames() as $modelClassName) { $mungeTableName = self::getMungeTableName($modelClassName); $readTableExists = ZurmoRedBean::$writer->doesTableExist($mungeTableName); if (!$overwriteExistingTables && $readTableExists) { if (isset($messageStreamer)) { $messageStreamer->add(Zurmo::t('ZurmoModule', "Skipping {{tableName}}", array('{{tableName}}' => $mungeTableName))); } // skip if we don't want to overwrite existing tables and table already exists continue; } if (isset($messageStreamer)) { $messageStreamer->add(Zurmo::t('ZurmoModule', "Building {{tableName}}", array('{{tableName}}' => $mungeTableName))); } if (!SECURITY_OPTIMIZED || $forcePhp) { self::rebuildViaSlowWay($modelClassName); } else { //models that extend activity are special and can only be done with the PHP process. They cannot //be done using the stored procedure because it does not support the extra joins needed to determine //which securable items to look at. if (is_subclass_of($modelClassName, 'Activity')) { self::rebuildViaSlowWay($modelClassName); } else { $modelTableName = $modelClassName::getTableName(); if (!is_subclass_of($modelClassName, 'OwnedSecurableItem')) { throw new NotImplementedException(); } if (is_subclass_of($modelClassName, 'Person')) { if ($modelClassName != 'Contact') { throw new NotSupportedException(); } else { $modelTableName = Person::getTableName(); } } ZurmoDatabaseCompatibilityUtil::callProcedureWithoutOuts("rebuild('{$modelTableName}', '{$mungeTableName}')"); } } } }
public function testPermissionsCachingBasics() { if (!SECURITY_OPTIMIZED) { return; } $accounts = Account::getAll(); $account = $accounts[0]; $user = User::getByUsername('bobby'); $this->assertNotEquals($account->owner->id, $user->id); $account->addPermissions($user, Permission::READ); $this->assertTrue($account->save()); $securableItemId = $account->getClassId('SecurableItem'); $permitableId = $user->getClassId('Permitable'); R::exec("call get_securableitem_cached_actual_permissions_for_permitable({$securableItemId}, {$permitableId}, @allow_permissions, @deny_permissions)"); $allow_permissions = intval(R::getCell('select @allow_permissions')); $deny_permissions = intval(R::getCell('select @deny_permissions')); $this->assertEquals(Permission::NONE, $allow_permissions); $this->assertEquals(Permission::NONE, $deny_permissions); ZurmoDatabaseCompatibilityUtil::callProcedureWithoutOuts("cache_securableitem_actual_permissions_for_permitable({$securableItemId}, {$permitableId}, 1, 0)"); R::exec("call get_securableitem_cached_actual_permissions_for_permitable({$securableItemId}, {$permitableId}, @allow_permissions, @deny_permissions)"); $allow_permissions = intval(R::getCell('select @allow_permissions')); $deny_permissions = intval(R::getCell('select @deny_permissions')); $this->assertEquals(Permission::READ, $allow_permissions); $this->assertEquals(Permission::NONE, $deny_permissions); ZurmoDatabaseCompatibilityUtil::callProcedureWithoutOuts("clear_cache_securableitem_actual_permissions({$securableItemId})"); R::exec("call get_securableitem_cached_actual_permissions_for_permitable({$securableItemId}, {$permitableId}, @allow_permissions, @deny_permissions)"); $allow_permissions = intval(R::getCell('select @allow_permissions')); $deny_permissions = intval(R::getCell('select @deny_permissions')); $this->assertEquals(Permission::NONE, $allow_permissions); $this->assertEquals(Permission::NONE, $deny_permissions); $account->removeAllPermissions(); $this->assertTrue($account->save()); $this->assertEquals(Permission::NONE, $account->getEffectivePermissions($user)); $this->assertEquals(array(Permission::NONE, Permission::NONE), $account->getExplicitActualPermissions($user)); $this->assertEquals(array(Permission::NONE, Permission::NONE), $account->getInheritedActualPermissions($user)); }
public static function forgetAll($forgetDbLevelCache = true) { if (PHP_CACHING_ON) { self::$securableItemToPermitableToCombinedPermissions = array(); self::$namedSecurableItemActualPermissions = array(); } if (SECURITY_OPTIMIZED && DB_CACHING_ON && $forgetDbLevelCache) { ZurmoDatabaseCompatibilityUtil::callProcedureWithoutOuts("clear_cache_all_actual_permissions()"); } if (MEMCACHE_ON && Yii::app()->cache !== null) { self::incrementCacheIncrementValue(static::$cacheType); } }
public static function forgetAll($forgetDbLevelCache = true) { if (static::supportsAndAllowsPhpCaching()) { static::$securableItemToPermitableToCombinedPermissions = array(); static::$namedSecurableItemActualPermissions = array(); } if (SECURITY_OPTIMIZED && static::supportsAndAllowsDatabaseCaching() && $forgetDbLevelCache) { ZurmoDatabaseCompatibilityUtil::callProcedureWithoutOuts("clear_cache_all_actual_permissions()"); } if (static::supportsAndAllowsDatabaseCaching() && $forgetDbLevelCache) { ZurmoDatabaseCompatibilityUtil::callProcedureWithoutOuts("clear_cache_named_securable_all_actual_permissions()"); } static::clearMemcacheCache(); }
/** * Updates the email message using stored procedure * @param EmailMessage $emailMessage */ protected function updateEmailMessageForSending(EmailMessage $emailMessage, $useSQL = false) { if (!$useSQL) { Yii::log("EmailMessage should have been saved by this point. Anyways, saving now", CLogger::LEVEL_INFO); // we save it and return. No need to call SP as the message is saved already; $emailMessage->save(false); return; } $nowTimestamp = "'" . DateTimeUtil::convertTimestampToDbFormatDateTime(time()) . "'"; $sendAttempts = $emailMessage->sendAttempts ? $emailMessage->sendAttempts : 1; $sentDateTime = $emailMessage->sentDateTime ? "'" . $emailMessage->sentDateTime . "'" : 'null'; $serializedData = $emailMessage->error->serializedData ? "'" . $emailMessage->error->serializedData . "'" : 'null'; $sql = '`update_email_message_for_sending`( ' . $emailMessage->id . ', ' . $sendAttempts . ', ' . $sentDateTime . ', ' . $emailMessage->folder->id . ', ' . $serializedData . ', ' . $nowTimestamp . ')'; ZurmoDatabaseCompatibilityUtil::callProcedureWithoutOuts($sql); $emailMessage->forget(); }