Skip to content

Commit

Permalink
Fixed issue #9457: Error in integrity check when using MSSQL
Browse files Browse the repository at this point in the history
  • Loading branch information
c-schmitz committed Aug 21, 2015
1 parent d27535c commit 8187a73
Showing 1 changed file with 36 additions and 50 deletions.
86 changes: 36 additions & 50 deletions application/controllers/admin/checkintegrity.php
Expand Up @@ -250,26 +250,30 @@ private function _deleteQuotaMembers(array $aData)
return $aData;
}

/**
* This function Deletes quota language settings without related main entries
*
*/
private function _deleteQuotaLanguageSettings()
{
$quotas = Quota::model()->findAll();
foreach ($quotas as $quota) $quota_ids[] = $quota['id'];
$criteria = new CDbCriteria;
$criteria->addNotInCondition('quotals_quota_id', $quota_ids);

QuotaLanguageSetting::model()->deleteAll($criteria);
$oCriteria = new CDbCriteria;
$oCriteria->join = 'LEFT JOIN {{quota}} q ON t.quotals_quota_id=q.id';
$oCriteria->condition = '(q.id IS NULL)';
QuotaLanguageSetting::model()->deleteAll($oCriteria);
if (QuotaLanguageSetting::model()->hasErrors()) safeDie(QuotaLanguageSetting::model()->getError());
}

/**
* This function deletes quota entries which not having a related survey entry
*
* @param mixed $aData
*/
private function _deleteQuotas(array $aData)
{
$sids = array();
$surveys = Survey::model()->findAll();
foreach ($surveys as $survey) $sids[] = $survey['sid'];
$criteria = new CDbCriteria;
$criteria->addNotInCondition('sid', $sids);

Quota::model()->deleteAll($criteria);
$oCriteria = new CDbCriteria;
$oCriteria->join = 'LEFT JOIN {{surveys}} q ON t.sid=q.sid';
$oCriteria->condition = '(q.sid IS NULL)';
Quota::model()->deleteAll($oCriteria);
if (Quota::model()->hasErrors()) safeDie(Quota::model()->getError());
$aData['messages'][] = gT('Deleting orphaned quotas.');
return $aData;
Expand Down Expand Up @@ -322,25 +326,21 @@ private function _deleteConditions(array $conditions, array $aData)
*/
protected function _checkintegrity()
{


/*** Plainly delete survey permissions if the survey or user does not exist ***/
$users = User::model()->findAll();
$uids = array();
foreach ($users as $user) $uids[] = $user['uid'];
// Delete survey permissions if the user does not exist
$oCriteria = new CDbCriteria;
$oCriteria->addNotInCondition('uid', $uids, 'OR');

$surveys = Survey::model()->findAll();
$sids = array();
foreach ($surveys as $survey) $sids[] = $survey['sid'];
$oCriteria->addNotInCondition('entity_id', $sids, 'OR');
$oCriteria->addCondition("entity='survey'");
$oCriteria->join = 'LEFT JOIN {{users}} u ON {{permissions}}.uid=u.uid';
$oCriteria->condition = '(u.uid IS NULL)';
Permission::model()->deleteAll($oCriteria);

// Delete survey permissions if the survey does not exist
$oCriteria = new CDbCriteria;
$oCriteria->join = 'LEFT JOIN {{surveys}} s ON {{permissions}}.entity_id=s.sid';
$oCriteria->condition = "(s.sid IS NULL AND entity='survey')";
Permission::model()->deleteAll($oCriteria);


// Deactivate surveys that have a missing response table
$surveys = Survey::model()->findAll();
foreach ($surveys as $survey)
{
if ($survey['active']=='Y' && !tableExists("{{survey_{$survey['sid']}}}"))
Expand Down Expand Up @@ -457,26 +457,19 @@ protected function _checkintegrity()
/**********************************************************************/
/* Check quotas */
/**********************************************************************/
$surveys = Survey::model()->findAll();
if (Survey::model()->hasErrors()) safeDie(Survey::model()->getError());
$sids = array();
foreach ($surveys as $survey) $sids[] = $survey['sid'];
$oCriteria = new CDbCriteria;
$oCriteria->addNotInCondition('sid', $sids);

$oCriteria = new CDbCriteria;
$oCriteria->join = 'LEFT JOIN {{surveys}} s ON t.sid=s.sid';
$oCriteria->condition = '(s.sid IS NULL)';
$aDelete['quotas'] = count(Quota::model()->findAll($oCriteria));
if (Quota::model()->hasErrors()) safeDie(Quota::model()->getError());

/**********************************************************************/
/* Check quota languagesettings */
/**********************************************************************/
$quotas = Quota::model()->findAll();
if (Quota::model()->hasErrors()) safeDie(Quota::model()->getError());
$ids = array();
foreach ($quotas as $quota) $ids[] = $quota['id'];
$oCriteria = new CDbCriteria;
$oCriteria->addNotInCondition('quotals_quota_id', $ids);

$oCriteria->join = 'LEFT JOIN {{quota}} s ON t.quotals_quota_id=s.id';
$oCriteria->condition = '(s.id IS NULL)';
$aDelete['quotals'] = count(QuotaLanguageSetting::model()->findAll($oCriteria));
if (QuotaLanguageSetting::model()->hasErrors()) safeDie(QuotaLanguageSetting::model()->getError());

Expand Down Expand Up @@ -563,19 +556,14 @@ protected function _checkintegrity()
}
}


/**********************************************************************/
/* Check survey language settings */
/**********************************************************************/
$surveys = Survey::model()->findAll();
if (Survey::model()->hasErrors()) safeDie(Survey::model()->getError());
$sids = array();
foreach ($surveys as $survey) $sids[] = $survey['sid'];
$oCriteria = new CDbCriteria;
$oCriteria->addNotInCondition('surveyls_survey_id', $sids);
$oCriteria->join = 'LEFT JOIN {{surveys}} s ON t.surveyls_survey_id=s.sid';
$oCriteria->condition = '(s.sid IS NULL)';
$surveys_languagesettings = SurveyLanguageSetting::model()->findAll($oCriteria);
if (SurveyLanguageSetting::model()->hasErrors()) safeDie(SurveyLanguageSetting::model()->getError());

foreach ($surveys_languagesettings as $surveys_languagesetting)
{
$aDelete['surveylanguagesettings'][] = array('slid' => $surveys_languagesetting['surveyls_survey_id'], 'reason' => gT('The related survey is missing.'));
Expand All @@ -597,13 +585,11 @@ protected function _checkintegrity()
/**********************************************************************/
/* Check groups */
/**********************************************************************/
$surveys = Survey::model()->findAll();
if (Survey::model()->hasErrors()) safeDie(Survey::model()->getError());
$sids = array();
foreach ($surveys as $survey) $sids[] = $survey['sid'];
$oCriteria = new CDbCriteria;
$oCriteria->addNotInCondition('sid', $sids);
$oCriteria->join = 'LEFT JOIN {{surveys}} s ON t.sid=s.sid';
$oCriteria->condition = '(s.sid IS NULL)';
$groups = QuestionGroup::model()->findAll($oCriteria);
/** @var QuestionGroup $group */
foreach ($groups as $group)
{
$aDelete['groups'][] = array('gid' => $group['gid'], 'reason' => gT('There is no matching survey.') . ' SID:' . $group['sid']);
Expand Down

0 comments on commit 8187a73

Please sign in to comment.