hasGlobalPermission('settings','read')){ $clang = $this->getController()->lang; Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page."); $this->getController()->redirect($this->getController()->createUrl("/admin/")); } Yii::app()->loadHelper('database'); Yii::app()->loadHelper('surveytranslator'); } public function index() { $aData = $this->_checkintegrity(); $this->_renderWrappedTemplate('checkintegrity', 'check_view', $aData); } public function fixredundancy() { $clang = Yii::app()->lang; $oldsmultidelete=Yii::app()->request->getPost('oldsmultidelete', array()); $aData['messages'] = array(); if ( Permission::model()->hasGlobalPermission('settings','update') && Yii::app()->request->getPost('ok') == 'Y') { $aDelete = $this->_checkintegrity(); if (isset($aDelete['redundanttokentables'])) { foreach ($aDelete['redundanttokentables'] as $aTokenTable) { if(in_array($aTokenTable['table'],$oldsmultidelete)) { Yii::app()->db->createCommand()->dropTable($aTokenTable['table']); $aData['messages'][] = sprintf($clang->gT('Deleting token table: %s'),$aTokenTable['table']); } } } if (isset($aDelete['redundantsurveytables'])) { foreach ($aDelete['redundantsurveytables'] as $aSurveyTable) { if(in_array($aSurveyTable['table'],$oldsmultidelete)) { Yii::app()->db->createCommand()->dropTable($aSurveyTable['table']); $aData['messages'][] = sprintf($clang->gT('Deleting survey table: %s'),$aSurveyTable['table']); } } } if(count($aData['messages'])==0) { $aData['messages'][] = $clang->gT('No old survey or token table selected.'); } $this->_renderWrappedTemplate('checkintegrity', 'fix_view', $aData); } } public function fixintegrity() { $aData = array(); $clang = Yii::app()->lang; if (Permission::model()->hasGlobalPermission('settings','update') && Yii::app()->request->getPost('ok') == 'Y') { $aDelete = $this->_checkintegrity(); // TMSW Condition->Relevance: Update this to process relevance instead if (isset($aDelete['conditions'])) { $aData = $this->_deleteConditions($aDelete['conditions'], $aData, $clang); } if (isset($aDelete['questionattributes'])) { $aData = $this->_deleteQuestionAttributes($aDelete['questionattributes'], $aData, $clang); } if ($aDelete['defaultvalues']) { $aData = $this->_deleteDefaultValues($aData, $clang); } if ($aDelete['quotas']) { $aData = $this->_deleteQuotas($aData, $clang); } if ($aDelete['quotals']) { $this->_deleteQuotaLanguageSettings(); } if ($aDelete['quotamembers']) { $aData = $this->_deleteQuotaMembers($aData, $clang); } if (isset($aDelete['assessments'])) { $aData = $this->_deleteAssessments($aDelete['assessments'], $aData, $clang); } if (isset($aDelete['answers'])) { $aData = $this->_deleteAnswers($aDelete['answers'], $aData, $clang); } if (isset($aDelete['surveys'])) { $aData = $this->_deleteSurveys($aDelete['surveys'], $aData, $clang); } if (isset($aDelete['surveylanguagesettings'])) { $aData = $this->_deleteSurveyLanguageSettings($aDelete['surveylanguagesettings'], $aData, $clang); } if (isset($aDelete['questions'])) { $aData = $this->_deleteQuestions($aDelete['questions'], $aData, $clang); } if (isset($aDelete['groups'])) { $aData = $this->_deleteGroups($aDelete['groups'], $aData, $clang); } if (isset($aDelete['orphansurveytables'])) { $aData = $this->_dropOrphanSurveyTables($aDelete['orphansurveytables'], $aData, $clang); } if (isset($aDelete['orphantokentables'])) { $aData = $this->_deleteOrphanTokenTables($aDelete['orphantokentables'], $aData, $clang); } $this->_renderWrappedTemplate('checkintegrity', 'fix_view', $aData); } } private function _deleteOrphanTokenTables(array $tokenTables, array $aData, Limesurvey_lang $clang) { foreach ($tokenTables as $aTokenTable) { Yii::app()->db->createCommand()->dropTable($aTokenTable); $aData['messages'][] = $clang->gT('Deleting orphan token table:') . ' ' . $aTokenTable; } return $aData; } private function _dropOrphanSurveyTables(array $surveyTables, array $aData, Limesurvey_lang $clang) { foreach ($surveyTables as $aSurveyTable) { Yii::app()->db->createCommand()->dropTable($aSurveyTable); $aData['messages'][] = $clang->gT('Deleting orphan survey table:') . ' ' . $aSurveyTable; } return $aData; } private function _deleteGroups(array $groups, array $aData, Limesurvey_lang $clang) { foreach ($groups as $group) $gids[] = $group['gid']; $criteria = new CDbCriteria; $criteria->addInCondition('gid', $gids); QuestionGroup::model()->deleteAll($criteria); if (QuestionGroup::model()->hasErrors()) safeDie(QuestionGroup::model()->getError()); $aData['messages'][] = sprintf($clang->gT('Deleting groups: %u groups deleted'), count($groups)); return $aData; } private function _deleteQuestions(array $questions, array $aData, Limesurvey_lang $clang) { foreach ($questions as $question) $qids[] = $question['qid']; $criteria = new CDbCriteria; $criteria->addInCondition('qid', $qids); Question::model()->deleteAll($criteria); if (Question::model()->hasErrors()) safeDie(Question::model()->getError()); $aData['messages'][] = sprintf($clang->gT('Deleting questions: %u questions deleted'), count($questions)); return array($criteria, $aData); } private function _deleteSurveyLanguageSettings(array $surveyLanguageSettings, array $aData, Limesurvey_lang $clang) { foreach ($surveyLanguageSettings as $surveylanguagesetting) $surveyls_survey_ids[] = $surveylanguagesetting['slid']; $criteria = new CDbCriteria; $criteria->compare('surveyls_survey_id', $surveyls_survey_ids); SurveyLanguageSetting::model()->deleteAll($criteria); if (SurveyLanguageSetting::model()->hasErrors()) safeDie(SurveyLanguageSetting::model()->getError()); $aData['messages'][] = sprintf($clang->gT('Deleting survey languagesettings: %u survey languagesettings deleted'), count($surveyLanguageSettings)); return array($criteria, $aData); } private function _deleteSurveys(array $surveys, array $aData, Limesurvey_lang $clang) { foreach ($surveys as $survey) { Survey::model()->deleteByPk($survey['sid']); } if (Survey::model()->hasErrors()) safeDie(Survey::model()->getError()); $aData['messages'][] = sprintf($clang->gT('Deleting surveys: %u surveys deleted'), count($surveys)); return $aData; } private function _deleteAnswers(array $answers, array $aData, Limesurvey_lang $clang) { foreach ($answers as $aAnswer) { Answer::model()->deleteAll('qid=:qid AND code=:code',array(':qid'=>$aAnswer['qid'],':code'=>$aAnswer['code'])); if (Answer::model()->hasErrors()) safeDie(Answer::model()->getError()); } $aData['messages'][] = sprintf($clang->gT('Deleting answers: %u answers deleted'), count($answers)); return $aData; } private function _deleteAssessments(array $assessments, array $aData, Limesurvey_lang $clang) { foreach ($assessments as $assessment) $assessments_ids[] = $assessment['id']; $assessments_ids = array(); Assessment::model()->deleteByPk('id',$assessments_ids); if (Assessment::model()->hasErrors()) safeDie(Assessment::model()->getError()); $aData['messages'][] = sprintf($clang->gT('Deleting assessments: %u assessment entries deleted'), count($assessments)); return $aData; } private function _deleteQuotaMembers(array $aData, Limesurvey_lang $clang) { $quota_ids = array(); $quotas = Quota::model()->findAll(); foreach ($quotas as $quota) $quota_ids[] = $quota['id']; $criteria = new CDbCriteria; $criteria->addNotInCondition('quota_id', $quota_ids); $qids = array(); $questions = Question::model()->findAll(); foreach ($questions as $question) $qids[] = $question['qid']; $criteria->addNotInCondition('qid', $qids, 'OR'); $sids = array(); $surveys = Survey::model()->findAll(); foreach ($surveys as $survey) $sids[] = $survey['sid']; $criteria->addNotInCondition('sid', $sids, 'OR'); QuotaMember::model()->deleteAll($criteria); if (QuotaLanguageSetting::model()->hasErrors()) safeDie(QuotaLanguageSetting::model()->getError()); $aData['messages'][] = $clang->gT('Deleting orphaned quota members.'); return $aData; } 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); if (QuotaLanguageSetting::model()->hasErrors()) safeDie(QuotaLanguageSetting::model()->getError()); } private function _deleteQuotas(array $aData, Limesurvey_lang $clang) { $sids = array(); $surveys = Survey::model()->findAll(); foreach ($surveys as $survey) $sids[] = $survey['sid']; $criteria = new CDbCriteria; $criteria->addNotInCondition('sid', $sids); Quota::model()->deleteAll($criteria); if (Quota::model()->hasErrors()) safeDie(Quota::model()->getError()); $aData['messages'][] = $clang->gT('Deleting orphaned quotas.'); return $aData; } private function _deleteDefaultValues(array $aData, Limesurvey_lang $clang) { $qids = array(); $questions = Question::model()->findAll(); foreach ($questions as $question) $qids[] = $question['qid']; $criteria = new CDbCriteria; $criteria->addNotInCondition('qid', $qids); DefaultValue::model()->deleteAll($criteria); if (DefaultValue::model()->hasErrors()) safeDie(DefaultValue::model()->getError()); $aData['messages'][] = $clang->gT('Deleting orphaned default values.'); return $aData; } private function _deleteQuestionAttributes(array $questionAttributes, array $aData, Limesurvey_lang $clang) { $qids = array(); foreach ($questionAttributes as $questionattribute) $qids[] = $questionattribute['qid']; $criteria = new CDbCriteria; $criteria->addInCondition('qid', $qids); QuestionAttribute::model()->deleteAll($criteria); if (QuestionAttribute::model()->hasErrors()) safeDie(QuestionAttribute::model()->getError()); $aData['messages'][] = sprintf($clang->gT('Deleting question attributes: %u attributes deleted'), count($questionAttributes)); return $aData; } private function _deleteConditions(array $conditions, array $aData, Limesurvey_lang $clang) { $cids = array(); foreach ($conditions as $condition) $cids[] = $condition['cid']; Condition::model()->deleteByPk($cids); if (Condition::model()->hasErrors()) safeDie(Condition::model()->getError()); $aData['messages'][] = sprintf($clang->gT('Deleting conditions: %u conditions deleted'), count($condition)); return $aData; } /** * This function checks the LimeSurvey database for logical consistency and returns an according array * containing all issues in the particular tables. * @returns Array with all found issues. */ protected function _checkintegrity() { $clang = Yii::app()->lang; /*** 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']; $criteria = new CDbCriteria; $criteria->addNotInCondition('uid', $uids, 'OR'); $surveys = Survey::model()->findAll(); $sids = array(); foreach ($surveys as $survey) $sids[] = $survey['sid']; $criteria->addNotInCondition('entity_id', $sids, 'OR'); $criteria->addCondition("entity='survey'"); Permission::model()->deleteAll($criteria); // Deactivate surveys that have a missing response table foreach ($surveys as $survey) { if ($survey['active']=='Y' && !tableExists("{{survey_{$survey['sid']}}}")) { Survey::model()->updateByPk($survey['sid'],array('active'=>'N')); } } // Fix subquestions fixSubquestions(); /*** Check for active survey tables with missing survey entry and rename them ***/ $sDBPrefix = Yii::app()->db->tablePrefix; $sQuery = dbSelectTablesLike('{{survey}}\_%'); $aResult = dbQueryOrFalse($sQuery) or safeDie("Couldn't get list of conditions from database
{$sQuery}
"); foreach ($aResult->readAll() as $aRow) { $sTableName = substr(reset($aRow), strlen($sDBPrefix)); if ($sTableName == 'survey_links' || $sTableName == 'survey_url_parameters') continue; $aTableName=explode('_',$sTableName); if (isset($aTableName[1]) && ctype_digit($aTableName[1])) { $iSurveyID = $aTableName[1]; if (!in_array($iSurveyID, $sids)) { $sDate = date('YmdHis') . rand(1, 1000); $sOldTable = "survey_{$iSurveyID}"; $sNewTable = "old_survey_{$iSurveyID}_{$sDate}"; try { $deactivateresult = Yii::app()->db->createCommand()->renameTable("{{{$sOldTable}}}", "{{{$sNewTable}}}"); } catch (CDbException $e) { die ('Couldn\'t make backup of the survey table. Please try again. The database reported the following error:
' . htmlspecialchars($e) . '
'); } } } } /*** Check for active token tables with missing survey entry ***/ $aResult = dbQueryOrFalse(dbSelectTablesLike('{{tokens}}\_%')) or safeDie("Couldn't get list of conditions from database
{$sQuery}
"); foreach ($aResult->readAll() as $aRow) { $sTableName = substr(reset($aRow), strlen($sDBPrefix)); $iSurveyID = substr($sTableName, strpos($sTableName, '_') + 1); if (!in_array($iSurveyID, $sids)) { $sDate = date('YmdHis') . rand(1, 1000); $sOldTable = "tokens_{$iSurveyID}"; $sNewTable = "old_tokens_{$iSurveyID}_{$sDate}"; try { $deactivateresult = Yii::app()->db->createCommand()->renameTable("{{{$sOldTable}}}", "{{{$sNewTable}}}"); } catch (CDbException $e) { die ('Couldn\'t make backup of the survey table. Please try again. The database reported the following error:
' . htmlspecialchars($e) . '
'); } } } /**********************************************************************/ /* Check conditions */ /**********************************************************************/ // TMSW Condition->Relevance: Replace this with analysis of relevance $conditions = Condition::model()->findAll(); if (Condition::model()->hasErrors()) safeDie(Condition::model()->getError()); $okQuestion = array(); foreach ($conditions as $condition) { if ($condition['cqid'] != 0) { // skip case with cqid=0 for codnitions on {TOKEN:EMAIL} for instance if (!array_key_exists($condition['cqid'], $okQuestion)) { $iRowCount = Question::model()->countByAttributes(array('qid' => $condition['cqid'])); if (Question::model()->hasErrors()) safeDie(Question::model()->getError()); if (!$iRowCount) { $aDelete['conditions'][] = array('cid' => $condition['cid'], 'reason' => $clang->gT('No matching CQID')); } else { $okQuestion[$condition['cqid']] = $condition['cqid']; } } } if ($condition['cfieldname']) //Only do this if there actually is a 'cfieldname' { if (preg_match('/^\+{0,1}[0-9]+X[0-9]+X*$/', $condition['cfieldname'])) { // only if cfieldname isn't Tag such as {TOKEN:EMAIL} or any other token list ($surveyid, $gid, $rest) = explode('X', $condition['cfieldname']); $iRowCount = count(QuestionGroup::model()->findAllByAttributes(array('gid'=>$gid))); if (QuestionGroup::model()->hasErrors()) safeDie(QuestionGroup::model()->getError()); if (!$iRowCount) $aDelete['conditions'][] = array('cid' => $condition['cid'], 'reason' => $clang->gT('No matching CFIELDNAME group!') . " ($gid) ({$condition['cfieldname']})"); } } elseif (!$condition['cfieldname']) { $aDelete['conditions'][] = array('cid' => $condition['cid'], 'reason' => $clang->gT('No CFIELDNAME field set!') . " ({$condition['cfieldname']})"); } } /**********************************************************************/ /* Check question attributes */ /**********************************************************************/ $question_attributes = QuestionAttribute::model()->findAllBySql('select qid from {{question_attributes}} where qid not in (select qid from {{questions}})'); if (QuestionAttribute::model()->hasErrors()) safeDie(QuestionAttribute::model()->getError()); foreach ($question_attributes as $question_attribute) { $aDelete['questionattributes'][] = array('qid' => $question_attribute['qid']); } // foreach /**********************************************************************/ /* Check default values */ /**********************************************************************/ $questions = Question::model()->findAll(); if (Question::model()->hasErrors()) safeDie(Question::model()->getError()); $qids = array(); foreach ($questions as $question) $qids[] = $question['qid']; $criteria = new CDbCriteria; $criteria->addNotInCondition('qid', $qids); $aDelete['defaultvalues'] = count(DefaultValue::model()->findAll($criteria)); if (DefaultValue::model()->hasErrors()) safeDie(DefaultValue::model()->getError()); /**********************************************************************/ /* Check quotas */ /**********************************************************************/ $surveys = Survey::model()->findAll(); if (Survey::model()->hasErrors()) safeDie(Survey::model()->getError()); $sids = array(); foreach ($surveys as $survey) $sids[] = $survey['sid']; $criteria = new CDbCriteria; $criteria->addNotInCondition('sid', $sids); $aDelete['quotas'] = count(Quota::model()->findAll($criteria)); 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']; $criteria = new CDbCriteria; $criteria->addNotInCondition('quotals_quota_id', $ids); $aDelete['quotals'] = count(QuotaLanguageSetting::model()->findAll($criteria)); if (QuotaLanguageSetting::model()->hasErrors()) safeDie(QuotaLanguageSetting::model()->getError()); /**********************************************************************/ /* Check quota members */ /**********************************************************************/ $quotas = Quota::model()->findAll(); $quota_ids = array(); foreach ($quotas as $quota) $quota_ids[] = $quota['id']; $criteria = new CDbCriteria; $criteria->addNotInCondition('quota_id', $quota_ids); $questions = Question::model()->findAll(); $qids = array(); foreach ($questions as $question) $qids[] = $question['qid']; $criteria->addNotInCondition('qid', $qids, 'OR'); $surveys = Survey::model()->findAll(); $sids = array(); foreach ($surveys as $survey) $sids[] = $survey['sid']; $criteria->addNotInCondition('sid', $sids, 'OR'); $aDelete['quotamembers'] = count(QuotaMember::model()->findAll($criteria)); if (QuotaMember::model()->hasErrors()) safeDie(QuotaMember::model()->getError()); /**********************************************************************/ /* Check assessments */ /**********************************************************************/ $criteria = new CDbCriteria; $criteria->compare('scope', 'T'); $assessments = Assessment::model()->findAll($criteria); if (Assessment::model()->hasErrors()) safeDie(Assessment::model()->getError()); foreach ($assessments as $assessment) { $iAssessmentCount = count(Survey::model()->findAllByPk($assessment['sid'])); if (Survey::model()->hasErrors()) safeDie(Survey::model()->getError()); if (!$iAssessmentCount) { $aDelete['assessments'][] = array('id' => $assessment['id'], 'assessment' => $assessment['name'], 'reason' => $clang->gT('No matching survey')); } } $criteria = new CDbCriteria; $criteria->compare('scope', 'G'); $assessments = Assessment::model()->findAll($criteria); if (Assessment::model()->hasErrors()) safeDie(Assessment::model()->getError()); foreach ($assessments as $assessment) { $iAssessmentCount = count(QuestionGroup::model()->findAllByPk(array('gid'=>$assessment['gid'], 'language'=>$assessment['language']))); if (QuestionGroup::model()->hasErrors()) safeDie(QuestionGroup::model()->getError()); if (!$iAssessmentCount) { $aDelete['assessments'][] = array('id' => $assessment['id'], 'assessment' => $assessment['name'], 'reason' => $clang->gT('No matching group')); } } /**********************************************************************/ /* Check answers */ /**********************************************************************/ $answers = Answer::model()->findAll(); if (Answer::model()->hasErrors()) safeDie(Answer::model()->getError()); $okQuestion = array(); foreach ($answers as $answer) { if (!array_key_exists($answer['qid'], $okQuestion)) { $iAnswerCount = Question::model()->countByAttributes(array('qid' => $answer['qid'])); if (Question::model()->hasErrors()) safeDie(Question::model()->getError()); if (!$iAnswerCount) { $aDelete['answers'][] = array('qid' => $answer['qid'], 'code' => $answer['code'], 'reason' => $clang->gT('No matching question')); } else { $okQuestion[$answer['qid']] = $answer['qid']; } } } /***************************************************************************/ /* Check survey languagesettings and restore them if they don't exist */ /***************************************************************************/ $surveys = Survey::model()->findAll(); foreach ($surveys as $survey) { $aLanguages=$survey->additionalLanguages; $aLanguages[]=$survey->language; foreach ($aLanguages as $langname) { if ($langname) { $oLanguageSettings = SurveyLanguageSetting::model()->find('surveyls_survey_id=:surveyid AND surveyls_language=:langname', array(':surveyid'=>$survey->sid,':langname'=>$langname)); if(!$oLanguageSettings) { $oLanguageSettings= new SurveyLanguageSetting; $languagedetails=getLanguageDetails($langname); $insertdata = array( 'surveyls_survey_id' => $survey->sid, 'surveyls_language' => $langname, 'surveyls_title' => '', 'surveyls_dateformat' => $languagedetails['dateformat'] ); foreach ($insertdata as $k => $v) $oLanguageSettings->$k = $v; $usresult=$oLanguageSettings->save(); } } } } /**********************************************************************/ /* 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']; $criteria = new CDbCriteria; $criteria->addNotInCondition('surveyls_survey_id', $sids); $surveys_languagesettings = SurveyLanguageSetting::model()->findAll($criteria); if (SurveyLanguageSetting::model()->hasErrors()) safeDie(SurveyLanguageSetting::model()->getError()); foreach ($surveys_languagesettings as $surveys_languagesetting) { $aDelete['surveylanguagesettings'][] = array('slid' => $surveys_languagesetting['surveyls_survey_id'], 'reason' => $clang->gT('The related survey is missing.')); } /**********************************************************************/ /* Check questions */ /**********************************************************************/ $questions = Question::model()->findAll(); if (Question::model()->hasErrors()) safeDie(Question::model()->getError()); $groups = QuestionGroup::model()->findAll(); if (QuestionGroup::model()->hasErrors()) safeDie(QuestionGroup::model()->getError()); $gids = array(); foreach ($groups as $group) $gids[] = $group['gid']; foreach ($questions as $question) { //Make sure the group exists if (!in_array($question['gid'], $gids)) { $aDelete['questions'][] = array('qid' => $question['qid'], 'reason' => $clang->gT('No matching group') . " ({$question['gid']})"); } //Make sure survey exists if (!in_array($question['sid'], $sids)) { $aDelete['questions'][] = array('qid' => $question['qid'], 'reason' => $clang->gT('There is no matching survey.') . " ({$question['sid']})"); } } /**********************************************************************/ /* Check groups */ /**********************************************************************/ $surveys = Survey::model()->findAll(); if (Survey::model()->hasErrors()) safeDie(Survey::model()->getError()); $sids = array(); foreach ($surveys as $survey) $sids[] = $survey['sid']; $criteria = new CDbCriteria; $criteria->addNotInCondition('sid', $sids); $groups = QuestionGroup::model()->findAll($criteria); foreach ($groups as $group) { $aDelete['groups'][] = array('gid' => $group['gid'], 'reason' => $clang->gT('There is no matching survey.') . ' SID:' . $group['sid']); } /**********************************************************************/ /* Check old survey tables */ /**********************************************************************/ //1: Get list of 'old_survey' tables and extract the survey id //2: Check if that survey id still exists //3: If it doesn't offer it for deletion $sQuery = dbSelectTablesLike('{{old_survey}}%'); $aResult = dbQueryOrFalse($sQuery) or safeDie("Couldn't get list of conditions from database
$sQuery
"); $aTables = $aResult->readAll(); $aOldSIDs = array(); $aSIDs = array(); foreach ($aTables as $sTable) { $sTable = reset($sTable); list($sOldText, $SurveyText, $iSurveyID, $sDate) = explode('_', substr($sTable, strlen($sDBPrefix))); $aOldSIDs[] = $iSurveyID; $aFullOldSIDs[$iSurveyID][] = $sTable; } $aOldSIDs = array_unique($aOldSIDs); //$sQuery = 'SELECT sid FROM {{surveys}} ORDER BY sid'; //$oResult = dbExecuteAssoc($sQuery) or safeDie('Couldn\'t get unique survey ids'); $surveys = Survey::model()->findAll(); if (Survey::model()->hasErrors()) safeDie(Survey::model()->getError()); $aSIDs = array(); foreach ($surveys as $survey) { $aSIDs[] = $survey['sid']; } foreach ($aOldSIDs as $iOldSID) { if (!in_array($iOldSID, $aSIDs)) { foreach ($aFullOldSIDs[$iOldSID] as $sTableName) { $aDelete['orphansurveytables'][] = $sTableName; } } else { foreach ($aFullOldSIDs[$iOldSID] as $sTableName) { $aTableParts = explode('_', substr($sTableName, strlen($sDBPrefix))); if (count($aTableParts) == 4) { $sOldText = $aTableParts[0]; $SurveyText = $aTableParts[1]; $iSurveyID = $aTableParts[2]; $sDateTime = $aTableParts[3]; $sType = $clang->gT('responses'); } elseif (count($aTableParts) == 5) { //This is a timings table ( $sOldText = $aTableParts[0]; $SurveyText = $aTableParts[1]; $iSurveyID = $aTableParts[2]; $sDateTime = $aTableParts[4]; $sType = $clang->gT('timings'); } $iYear = substr($sDateTime, 0, 4); $iMonth = substr($sDateTime, 4, 2); $iDay = substr($sDateTime, 6, 2); $iHour = substr($sDateTime, 8, 2); $iMinute = substr($sDateTime, 10, 2); $sDate = date('d M Y H:i', mktime($iHour, $iMinute, 0, $iMonth, $iDay, $iYear)); $sQuery = 'SELECT count(*) as recordcount FROM ' . $sTableName; $aFirstRow = Yii::app()->db->createCommand($sQuery)->queryRow(); if ($aFirstRow['recordcount']==0) { // empty table - so add it to immediate deletion $aDelete['orphansurveytables'][] = $sTableName; } else { $aOldSurveyTableAsk[] = array('table' => $sTableName, 'details' => sprintf($clang->gT('Survey ID %d saved at %s containing %d record(s) (%s)'), $iSurveyID, $sDate, $aFirstRow['recordcount'], $sType)); } } } } /**********************************************************************/ /* CHECK OLD TOKEN TABLES */ /**********************************************************************/ //1: Get list of 'old_token' tables and extract the survey id //2: Check if that survey id still exists //3: If it doesn't offer it for deletion $aResult = dbQueryOrFalse(dbSelectTablesLike('{{old_token}}%')) or safeDie("Couldn't get list of conditions from database
$sQuery
"); $aTables = $aResult->readAll(); $aOldTokenSIDs = array(); $aTokenSIDs = array(); $aFullOldTokenSIDs = array(); foreach ($aTables as $sTable) { $sTable = reset($sTable); list($sOldText, $SurveyText, $iSurveyID, $sDateTime) = explode('_', substr($sTable, strlen($sDBPrefix))); $aTokenSIDs[] = $iSurveyID; $aFullOldTokenSIDs[$iSurveyID][] = $sTable; } $aOldTokenSIDs = array_unique($aTokenSIDs); $surveys = Survey::model()->findAll(); if (Survey::model()->hasErrors()) safeDie(Survey::model()->getError()); $aSIDs = array(); foreach ($surveys as $survey) { $aSIDs[] = $survey['sid']; } foreach ($aOldTokenSIDs as $iOldTokenSID) { if (!in_array($iOldTokenSID, $aOldTokenSIDs)) { foreach ($aFullOldTokenSIDs[$iOldTokenSID] as $sTableName) { $aDelete['orphantokentables'][] = $sTableName; } } else { foreach ($aFullOldTokenSIDs[$iOldTokenSID] as $sTableName) { list($sOldText, $sTokensText, $iSurveyID, $sDateTime) = explode('_', substr($sTableName, strlen($sDBPrefix))); $iYear = substr($sDateTime, 0, 4); $iMonth = substr($sDateTime, 4, 2); $iDay = substr($sDateTime, 6, 2); $iHour = substr($sDateTime, 8, 2); $iMinute = substr($sDateTime, 10, 2); $sDate = date('D, d M Y h:i a', mktime($iHour, $iMinute, 0, $iMonth, $iDay, $iYear)); $sQuery = 'SELECT count(*) as recordcount FROM ' . $sTableName; $aFirstRow = Yii::app()->db->createCommand($sQuery)->queryRow(); if ($aFirstRow['recordcount']==0) { // empty table - so add it to immediate deletion $aDelete['orphantokentables'][] = $sTableName; } else { $aOldTokenTableAsk[] = array('table' => $sTableName, 'details' => sprintf($clang->gT('Survey ID %d saved at %s containing %d record(s)'), $iSurveyID, $sDate, $aFirstRow['recordcount'])); } } } } if ($aDelete['defaultvalues'] == 0 && $aDelete['quotamembers'] == 0 && $aDelete['quotas'] == 0 && $aDelete['quotals'] == 0 && count($aDelete) == 4 ) { $aDelete['integrityok'] = true; } else { $aDelete['integrityok'] = false; } if (!isset($aOldTokenTableAsk) && !isset($aOldSurveyTableAsk)) { $aDelete['redundancyok'] = true; } else { $aDelete['redundancyok'] = false; $aDelete['redundanttokentables'] = array(); $aDelete['redundantsurveytables'] = array(); if (isset($aOldTokenTableAsk)) { $aDelete['redundanttokentables'] = $aOldTokenTableAsk; } if (isset($aOldSurveyTableAsk)) { $aDelete['redundantsurveytables'] = $aOldSurveyTableAsk; } } /**********************************************************************/ /* CHECK CPDB SURVEY_LINKS TABLE FOR REDUNDENT TOKEN TABLES */ /**********************************************************************/ //1: Get distinct list of survey_link survey ids, check if tokens // table still exists for each one, and remove if not /* TODO */ /**********************************************************************/ /* CHECK CPDB SURVEY_LINKS TABLE FOR REDUNDENT TOKEN ENTRIES */ /**********************************************************************/ //1: For each survey_link, see if the matching entry still exists in // the token table and remove if it doesn't. /* TODO */ return $aDelete; } /** * Renders template(s) wrapped in header and footer * * @param string $sAction Current action, the folder to fetch views from * @param string|array $aViewUrls View url(s) * @param array $aData Data to be passed on. Optional. */ protected function _renderWrappedTemplate($sAction = 'checkintegrity', $aViewUrls = array(), $aData = array()) { parent::_renderWrappedTemplate($sAction, $aViewUrls, $aData); } }