getConfig('dbversionnumber'));
// If trying to update silenty check if it is really possible
if ($bSilent && (count(array_intersect($aCriticalDBVersions,$aAllUpdates))>0)){
return false;
}
/// This function does anything necessary to upgrade
/// older versions to match current functionality
global $modifyoutput;
Yii::app()->loadHelper('database');
$sUserTemplateRootDir = Yii::app()->getConfig('usertemplaterootdir');
$sStandardTemplateRootDir = Yii::app()->getConfig('standardtemplaterootdir');
$oDB = Yii::app()->getDb();
$oDB->schemaCachingDuration = 0; // Deactivate schema caching
Yii::app()->setConfig('Updating',true);
try{
/**
* Add table for notifications
* @since 2016-08-04
* @author Olle Haerstedt
*/
if ($iOldDBVersion < 259) {
$oTransaction = $oDB->beginTransaction();
$oDB->createCommand()->createTable('{{notifications}}', array(
'id' => 'pk',
'entity' => 'string(15) not null',
'entity_id' => 'integer not null',
'title' => 'string not null', // varchar(255) in postgres
'message' => 'text not null',
'status' => "string(15) not null default 'new' ",
'importance' => 'integer default 1',
'display_class' => "string(31) default 'default'",
'created' => 'datetime not null',
'first_read' => 'datetime null'
));
$oDB->createCommand()->createIndex('notif_index', '{{notifications}}', 'entity, entity_id, status', false);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>259),"stg_name='DBVersion'");
$oTransaction->commit();
}
if ($iOldDBVersion < 260) {
$oTransaction = $oDB->beginTransaction();
alterColumn('{{participant_attribute_names}}','defaultname',"string(255)",false);
alterColumn('{{participant_attribute_names_lang}}','attribute_name',"string(255)",false);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>260),"stg_name='DBVersion'");
$oTransaction->commit();
}
if ($iOldDBVersion < 261) {
$oTransaction = $oDB->beginTransaction();
/*
* The hash value of a notification is used to calculate uniqueness.
* @since 2016-08-10
* @author Olle Haerstedt
*/
addColumn('{{notifications}}', 'hash', 'string(64)');
$oDB->createCommand()->createIndex('notif_hash_index', '{{notifications}}', 'hash', false);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>261),"stg_name='DBVersion'");
$oTransaction->commit();
}
if ($iOldDBVersion < 262) {
$oTransaction = $oDB->beginTransaction();
alterColumn('{{settings_global}}','stg_value',"text",false);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>262),"stg_name='DBVersion'");
$oTransaction->commit();
}
if ($iOldDBVersion < 263) {
$oTransaction = $oDB->beginTransaction();
// Dummy version update for hash column in installation SQL.
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>263),"stg_name='DBVersion'");
$oTransaction->commit();
}
/**
* Add seed column in all active survey tables
* Might take time to execute
* @since 2016-09-01
*/
if ($iOldDBVersion < 290) {
$oTransaction = $oDB->beginTransaction();
// Loop all surveys
$surveyquery = "SELECT sid FROM ".dbQuoteID('{{surveys}}');
$surveyids = Yii::app()->db->createCommand($surveyquery)->queryAll();
foreach ( $surveyids as $surv )
{
$prefix = Yii::app()->getDb()->tablePrefix;
$tableName = $prefix . 'survey_' . $surv['sid'];
// If survey has active table, create seed column
$table = Yii::app()->db->schema->getTable($tableName);
if ($table)
{
if (!isset($table->columns['seed']))
{
Yii::app()->db->createCommand()->addColumn($tableName, 'seed', 'string(31)');
}
else
{
continue;
}
// RAND is RANDOM in Postgres
switch (Yii::app()->db->driverName)
{
case 'pgsql':
Yii::app()->db->createCommand("UPDATE $tableName SET seed = ROUND(RANDOM() * 10000000)")->execute();
break;
default:
Yii::app()->db->createCommand("UPDATE $tableName SET seed = ROUND(RAND() * 10000000, 0)")->execute();
break;
}
}
}
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>290),"stg_name='DBVersion'");
$oTransaction->commit();
}
/**
* Plugin JSON config file
* @since 2016-08-22
*/
if ($iOldDBVersion < 291)
{
$oTransaction = $oDB->beginTransaction();
addColumn('{{plugins}}', 'version', 'string(32)');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>291),"stg_name='DBVersion'");
$oTransaction->commit();
}
/**
* Survey menue table
* @since 2017-07-03
*/
if ($iOldDBVersion < 293) {
$oTransaction = $oDB->beginTransaction();
createSurveyMenuTable293($oDB);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>293),"stg_name='DBVersion'");
$oTransaction->commit();
}
/**
* Survey menue table update
* @since 2017-07-03
*/
if ($iOldDBVersion < 294) {
$oTransaction = $oDB->beginTransaction();
$oDB->createCommand()->addColumn('{{surveymenu}}', 'position', "string(255) DEFAULT 'side'");
$oDB->createCommand()->truncateTable('{{surveymenu_entries}}');
$colsToAdd = array("id","menu_id","order","name","title","menu_title","menu_description","menu_icon","menu_icon_type","menu_class","menu_link","action","template","partial","classes","permission","permission_grade","data","getdatamethod","language","changed_at","changed_by","created_at","created_by");
$rowsToAdd = array(
array(1,1,1,'overview','Survey overview','Overview','Open general survey overview and quick action','list','fontawesome','','admin/survey/sa/view','','','','','','',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(2,1,2,'generalsettings','Edit survey general settings','General settings','Open general survey settings','gears','fontawesome','','','updatesurveylocalesettings','editLocalSettings_main_view','/admin/survey/subview/accordion/_generaloptions_panel','','surveysettings','read',NULL,'_generalTabEditSurvey','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(3,1,3,'surveytexts','Edit survey text elements','Survey texts','Edit survey text elements','file-text-o','fontawesome','','','updatesurveylocalesettings','editLocalSettings_main_view','/admin/survey/subview/tab_edit_view','','surveylocale','read',NULL,'_getTextEditData','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(4,1,4,'participants','Survey participants','Survey participants','Go to survey participant and token settings','user','fontawesome','','admin/tokens/sa/index/','','','','','surveysettings','update',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(5,1,4,'presentation','Presentation & navigation settings','Presentation','Edit presentation and navigation settings','eye-slash','fontawesome','','','updatesurveylocalesettings','editLocalSettings_main_view','/admin/survey/subview/accordion/_presentation_panel','','surveylocale','read',NULL,'_tabPresentationNavigation','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(6,1,5,'publication','Publication and access control settings','Publication & access','Edit settings for publicationa and access control','key','fontawesome','','','updatesurveylocalesettings','editLocalSettings_main_view','/admin/survey/subview/accordion/_publication_panel','','surveylocale','read',NULL,'_tabPublicationAccess','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(7,1,6,'surveypermissions','Edit surveypermissions','Survey permissions','Edit permissions for this survey','lock','fontawesome','','admin/surveypermission/sa/view/','','','','','surveysecurity','read',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(8,1,7,'tokens','Token handling','Participant tokens','Define how tokens should be treated or generated','users','fontawesome','','','updatesurveylocalesettings','editLocalSettings_main_view','/admin/survey/subview/accordion/_tokens_panel','','surveylocale','read',NULL,'_tabTokens','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(9,1,8,'quotas','Edit quotas','Survey quotas','Edit quotas for this survey.','tasks','fontawesome','','admin/quotas/sa/index/','','','','','quotas','read',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(10,1,9,'assessments','Edit assessments','Assessments','Edit and look at the asessements for this survey.','comment-o','fontawesome','','admin/assessments/sa/index/','','','','','assessments','read',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(11,1,10,'notification','Notification and data management settings','Data management','Edit settings for notification and data management','feed','fontawesome','','','updatesurveylocalesettings','editLocalSettings_main_view','/admin/survey/subview/accordion/_notification_panel','','surveylocale','read',NULL,'_tabNotificationDataManagement','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(12,1,11,'emailtemplates','Email templates','Email templates','Edit the templates for invitation, reminder and registration emails','envelope-square','fontawesome','','admin/emailtemplates/sa/index/','','','','','assessments','read',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(13,1,12,'panelintegration','Edit survey panel integration','Panel integration','Define panel integrations for your survey','link','fontawesome','','','updatesurveylocalesettings','editLocalSettings_main_view','/admin/survey/subview/accordion/_integration_panel','','surveylocale','read',NULL,'_tabPanelIntegration','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(14,1,13,'ressources','Add/Edit ressources to the survey','Ressources','Add/Edit ressources to the survey','file','fontawesome','','','updatesurveylocalesettings','editLocalSettings_main_view','/admin/survey/subview/accordion/_resources_panel','','surveylocale','read',NULL,'_tabResourceManagement','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0)
);
Yii::app()->db->createCommand("SET IDENTITY_INSERT {{surveymenu_entries}} ON")->execute();
foreach($rowsToAdd as $row){
$oDB->createCommand()->insert('{{surveymenu_entries}}', array_combine($colsToAdd,$row));
}
Yii::app()->db->createCommand("SET IDENTITY_INSERT {{surveymenu_entries}} Off")->execute();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>294),"stg_name='DBVersion'");
$oTransaction->commit();
}
/**
* Survey menue table update
* @since 2017-07-12
*/
if ($iOldDBVersion < 296) {
$oTransaction = $oDB->beginTransaction();
addColumn('{{surveymenu}}', 'user_id', "int"); // "int DEFAULT NULL"
addColumn('{{surveymenu_entries}}', 'user_id', "int"); // "int DEFAULT NULL"
Yii::app()->db->createCommand("SET IDENTITY_INSERT {{surveymenu}} ON")->execute();
//$oDB->createCommand()->insert('{{surveymenu}}', array('id' => 2,'parent_id' => NULL,'survey_id' => NULL,'order' => 1,'level' => 0,'title' => 'quickmenu','description' => 'Quickmenu', 'position'=>'collapsed', 'changed_at' => date('Y-m-d H:i:s'),'changed_by' => 0,'created_at' => date('Y-m-d H:i:s'),'created_by' => 0));
$oDB->createCommand()->insert('{{surveymenu}}', array('id' => 2,'order' => 1,'level' => 0,'title' => 'quickmenu','description' => 'Quickmenu', 'position'=>'collapsed', 'changed_at' => date('Y-m-d H:i:s'),'changed_by' => 0,'created_at' => date('Y-m-d H:i:s'),'created_by' => 0));
Yii::app()->db->createCommand("SET IDENTITY_INSERT {{surveymenu}} OFF")->execute();
//$colsToAdd = array("id","menu_id","user_id","order","name","title","menu_title","menu_description","menu_icon","menu_icon_type","menu_class","menu_link","action","template","partial","classes","permission","permission_grade","data","getdatamethod","language","changed_at","changed_by","created_at","created_by");
$colsToAdd = array("id","menu_id","order","name","title","menu_title","menu_description","menu_icon","menu_icon_type","menu_class","menu_link","action","template","partial","classes","permission","permission_grade","data","getdatamethod","language","changed_at","changed_by","created_at","created_by");
$rowsToAdd = array(
array(15,2,1,'activateSurvey','Activate survey','Activate survey','Activate survey','play','fontawesome','','admin/survey/sa/activate','','','','','surveyactivation','update','{\"render\": {\"isActive\": false}}','','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(16,2,2,'deactivateSurvey','Stop this survey','Stop this survey','Stop this survey','stop','fontawesome','','admin/survey/sa/deactivate','','','','','surveyactivation','update','{\"render\": {\"isActive\": true}}','','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(17,2,3,'testSurvey','Go to survey','Go to survey','Go to survey','cog','fontawesome','','survey/index','','','','','','','{\"render\": {\"link\": {\"external\": true, \"data\": {\"sid\": [\"this\",\"sid\"], \"newtest\": \"Y\", \"lang\": [\"this\",\"language\"]}}}}','','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(18,2,4,'listQuestions','List questions','List questions','List questions','list','fontawesome','','admin/survey/sa/listquestions','','','','','surveycontent','read',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(19,2,5,'listQuestionGroups','List question groups','List question groups','List question groups','th-list','fontawesome','','admin/survey/sa/listquestiongroups','','','','','surveycontent','read',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(20,2,6,'generalsettings','Edit survey general settings','General settings','Open general survey settings','gears','fontawesome','','','updatesurveylocalesettings','editLocalSettings_main_view','/admin/survey/subview/accordion/_generaloptions_panel','','surveysettings','read',NULL,'_generalTabEditSurvey','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(21,2,7,'surveypermissions','Edit surveypermissions','Survey permissions','Edit permissions for this survey','lock','fontawesome','','admin/surveypermission/sa/view/','','','','','surveysecurity','read',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(22,2,8,'quotas','Edit quotas','Survey quotas','Edit quotas for this survey.','tasks','fontawesome','','admin/quotas/sa/index/','','','','','quotas','read',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(23,2,9,'assessments','Edit assessments','Assessments','Edit and look at the asessements for this survey.','comment-o','fontawesome','','admin/assessments/sa/index/','','','','','assessments','read',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(24,2,10,'emailtemplates','Email templates','Email templates','Edit the templates for invitation, reminder and registration emails','envelope-square','fontawesome','','admin/emailtemplates/sa/index/','','','','','surveylocale','read',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(25,2,11,'surveyLogicFile','Survey logic file','Survey logic file','Survey logic file','sitemap','fontawesome','','admin/expressions/sa/survey_logic_file/','','','','','surveycontent','read',NULL,'','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(26,2,12,'tokens','Token handling','Participant tokens','Define how tokens should be treated or generated','user','fontawesome','','','updatesurveylocalesettings','editLocalSettings_main_view','/admin/survey/subview/accordion/_tokens_panel','','surveylocale','read',NULL,'_tabTokens','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(27,2,13,'cpdb','Central participant database','Central participant database','Central participant database','users','fontawesome','','admin/participants/sa/displayParticipants','','','','','tokens','read','{render: {\"link\": {}}','','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(28,2,14,'responses','Responses','Responses','Responses','icon-browse','iconclass','','admin/responses/sa/browse/','','','','','responses','read','{\"render\": {\"isActive\": true}}','','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(29,2,15,'statistics','Statistics','Statistics','Statistics','bar-chart','fontawesome','','admin/statistics/sa/index/','','','','','statistics','read','{\"render\": {\"isActive\": true}}','','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
array(30,2,16,'reorder','Reorder questions/question groups','Reorder questions/question groups','Reorder questions/question groups','icon-organize','iconclass','','admin/survey/sa/organize/','','','','','surveycontent','update','{\"render\": {\"isActive\": false}}','','en-GB',date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0),
);
Yii::app()->db->createCommand("SET IDENTITY_INSERT {{surveymenu_entries}} ON")->execute();
foreach($rowsToAdd as $row){
$combined = array_combine($colsToAdd,$row);
$oDB->createCommand()->insert('{{surveymenu_entries}}', $combined);
}
Yii::app()->db->createCommand("SET IDENTITY_INSERT {{surveymenu_entries}} OFF")->execute();
$oTransaction->commit();
}
/**
* Template tables
* @since 2017-07-12
*/
if ($iOldDBVersion < 298) {
$oTransaction = $oDB->beginTransaction();
upgradeTemplateTables298($oDB);
$oTransaction->commit();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>298),"stg_name='DBVersion'");
}
/**
* Template tables
* @since 2017-07-12
*/
if ($iOldDBVersion < 304) {
$oTransaction = $oDB->beginTransaction();
upgradeTemplateTables304($oDB);
$oTransaction->commit();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>304),"stg_name='DBVersion'");
}
/**
* Update to sidemenu rendering
*/
if ($iOldDBVersion < 305) {
$oTransaction = $oDB->beginTransaction();
$oDB->createCommand()->update('{{surveymenu_entries}}',
array('data'=> "{\"render\": {\"link\": {\"external\": true, \"data\": {\"sid\": [\"survey\",\"sid\"], \"newtest\": \"Y\", \"lang\": [\"survey\",\"language\"]}}}}"),
"id=17"
);
$oDB->createCommand()->update('{{surveymenu_entries}}',
array('data'=> "{\"render\": { \"link\": {\"data\": {\"surveyid\": [\"survey\",\"sid\"]}} } }"),
"id IN (1,4,7,9,10,12,18,19,21,22,23,24,25)"
);
$oDB->createCommand()->update('{{surveymenu_entries}}',
array('data'=> "{\"render\": {\"isActive\": false, \"link\": {\"data\": {\"surveyid\": [\"survey\",\"sid\"]}}}}"),
"id IN (15,30)"
);
$oDB->createCommand()->update('{{surveymenu_entries}}',
array('data'=> "{\"render\": {\"isActive\": true, \"link\": {\"data\": {\"surveyid\": [\"survey\",\"sid\"]}}}}"),
"id=16"
);
$oTransaction->commit();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>305),"stg_name='DBVersion'");
}
/**
* Template tables
* @since 2017-07-12
*/
if ($iOldDBVersion < 306) {
$oTransaction = $oDB->beginTransaction();
createSurveyGroupTables306($oDB);
$oTransaction->commit();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>306),"stg_name='DBVersion'");
}
/**
* User settings table
* @since 2016-08-29
*/
if ($iOldDBVersion < 307) {
$oTransaction = $oDB->beginTransaction();
if (tableExists('{settings_user}')) {
$oDB->createCommand()->dropTable('{{settings_user}}');
}
$oDB->createCommand()->createTable('{{settings_user}}', array(
'id' => 'int NOT NULL IDENTITY',
'uid' => 'integer NOT NULL',
'entity' => 'string(15)',
'entity_id' => 'string(31)',
'stg_name' => 'string(63) not null',
'stg_value' => 'text',
'PRIMARY KEY (id)'
));
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>307),"stg_name='DBVersion'");
$oTransaction->commit();
}
/*
* Change dbfieldnames to be more functional
*/
if ($iOldDBVersion < 308) {
$oTransaction = $oDB->beginTransaction();
$oDB->createCommand()->renameColumn('{{surveymenu_entries}}','order','ordering');
$oDB->createCommand()->renameColumn('{{surveymenu}}','order','ordering');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>308),"stg_name='DBVersion'");
$oTransaction->commit();
}
/*
* Add survey template editing to menu
*/
if ($iOldDBVersion < 309) {
$oTransaction = $oDB->beginTransaction();
$oDB->createCommand()->insert('{{surveymenu_entries}}',array_combine(
array(
"menu_id","ordering","name","title","menu_title","menu_description","menu_icon","menu_icon_type",
"menu_link","permission","permission_grade",
"data",
"language","changed_at","changed_by","created_at","created_by"),
array(
1,3,"template_options","Template options","Template options","Edit Template options for this survey","paint-brush","fontawesome",
"admin/templateoptions/sa/updatesurvey","surveysettings","read",
'{"render": {"link": { "pjaxed": false, "data": {"surveyid": ["survey","sid"], "gsid":["survey","gsid"]}}}}',
"en-GB",date('Y-m-d H:i:s'),0,date('Y-m-d H:i:s'),0
)
)
);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>309),"stg_name='DBVersion'");
$oTransaction->commit();
SurveymenuEntries::reorderMenu(1);
}
}
catch(Exception $e)
{
Yii::app()->setConfig('Updating',false);
$oTransaction->rollback();
// Activate schema caching
$oDB->schemaCachingDuration=3600;
// Load all tables of the application in the schema
$oDB->schema->getTables();
// clear the cache of all loaded tables
$oDB->schema->refresh();
//echo '
'.gT('An non-recoverable error happened during the update. Error details:')."
".htmlspecialchars($e->getMessage()).'
".htmlspecialchars($e->getMessage()).'