loadHelper('database');
$sUserTemplateRootDir = Yii::app()->getConfig('usertemplaterootdir');
$sStandardTemplateRootDir = Yii::app()->getConfig('standardtemplaterootdir');
$oLang = Yii::app()->lang;
echo str_pad($oLang->gT('The LimeSurvey database is being upgraded').' ('.date('Y-m-d H:i:s').')',14096).".
". $oLang->gT('Please be patient...')."
\n";
$sDBDriverName=setsDBDriverName();
setVarchar($sDBDriverName);
$sVarchar = Yii::app()->getConfig('varchar');
$sAutoIncrement = Yii::app()->getConfig('autoincrement');
$oDB = Yii::app()->getDb();
$oDB->schemaCachingDuration=0; // Deactivate schema caching
$oTransaction = $oDB->beginTransaction();
try
{
if ($iOldDBVersion < 111)
{
// Language upgrades from version 110 to 111 because the language names did change
$aOldNewLanguages=array('german_informal'=>'german-informal',
'cns'=>'cn-Hans',
'cnt'=>'cn-Hant',
'pt_br'=>'pt-BR',
'gr'=>'el',
'jp'=>'ja',
'si'=>'sl',
'se'=>'sv',
'vn'=>'vi');
foreach ($aOldNewLanguages as $sOldLanguageCode=>$sNewLanguageCode)
{
alterLanguageCode($sOldLanguageCode,$sNewLanguageCode);
}
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>111),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 112) {
// New size of the username field (it was previously 20 chars wide)
$oDB->createCommand()->alterColumn('{{users}}','users_name',"{$sVarchar}(64) NOT NULL");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>112),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 113) {
//Fixes the collation for the complete DB, tables and columns
if ($sDBDriverName=='mysql')
{
$sDatabaseName=getDBConnectionStringProperty('dbname');
fixMySQLCollations();
modifyDatabase("","ALTER DATABASE `$sDatabaseName` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;");echo $modifyoutput; flush();@ob_flush();
}
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>113),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 114) {
$oDB->createCommand()->alterColumn('{{saved_control}}','email',"{$sVarchar}(320) NOT NULL");
$oDB->createCommand()->alterColumn('{{surveys}}','adminemail',"{$sVarchar}(320) NOT NULL");
$oDB->createCommand()->alterColumn('{{users}}','email',"{$sVarchar}(320) NOT NULL");
$oDB->createCommand()->insert('{{settings_global}}',array('stg_name'=>'SessionName','stg_value'=>randomChars(64,'ABCDEFGHIJKLMNOPQRSTUVWXYZ!"$%&/()=?`+*~#",;.:abcdefghijklmnopqrstuvwxyz123456789')));
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>114),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 126) {
addColumn('{{surveys}}','printanswers',"{$sVarchar}(1) default 'N'");
addColumn('{{surveys}}','listpublic',"{$sVarchar}(1) default 'N'");
upgradeSurveyTables126();
upgradeTokenTables126();
// Create quota table
createTable('{{quota}}',array(
'id' => 'pk',
'sid' => 'integer',
'qlimit' => 'integer',
'name' => 'string',
'action' => 'integer',
'active' => 'integer NOT NULL DEFAULT 1'
));
// Create quota_members table
createTable('{{quota_members}}',array(
'id' => 'pk',
'sid' => 'integer',
'qid' => 'integer',
'quota_id' => 'integer',
'code' => $sVarchar.'(5)'
));
$oDB->createCommand()->createIndex('sid','{{quota_members}}','sid,qid,quota_id,code',true);
// Create templates_rights table
createTable('{{templates_rights}}',array(
'uid' => 'integer NOT NULL',
'folder' => 'string NOT NULL',
'use' => 'integer',
'PRIMARY KEY (uid, folder)'
));
// Create templates table
createTable('{{templates}}',array(
'folder' => 'string NOT NULL',
'creator' => 'integer NOT NULL',
'PRIMARY KEY (folder)'
));
// Rename Norwegian language codes
alterLanguageCode('no','nb');
addColumn('{{surveys}}','htmlemail',"{$sVarchar}(1) default 'N'");
addColumn('{{surveys}}','tokenanswerspersistence',"{$sVarchar}(1) default 'N'");
addColumn('{{surveys}}','usecaptcha',"{$sVarchar}(1) default 'N'");
addColumn('{{surveys}}','bounce_email','text');
addColumn('{{users}}','htmleditormode',"{$sVarchar}(7) default 'default'");
addColumn('{{users}}','superadmin',"integer NOT NULL default '0'");
addColumn('{{questions}}','lid1',"integer NOT NULL default '0'");
alterColumn('{{conditions}}','value',"string",false,'');
alterColumn('{{labels}}','title',"text");
$oDB->createCommand()->update('{{users}}',array('superadmin'=>1),"create_survey=1 AND create_user=1 AND move_user=1 AND delete_user=1 AND configurator=1");
$oDB->createCommand()->update('{{conditions}}',array('method'=>'=='),"(method is null) or method='' or method='0'");
dropColumn('{{users}}','move_user');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>126),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 127) {
modifyDatabase("","create index answers_idx2 on {{answers}} (sortorder)"); echo $modifyoutput;
modifyDatabase("","create index assessments_idx2 on {{assessments}} (sid)"); echo $modifyoutput;
modifyDatabase("","create index assessments_idx3 on {{assessments}} (gid)"); echo $modifyoutput;
modifyDatabase("","create index conditions_idx2 on {{conditions}} (qid)"); echo $modifyoutput;
modifyDatabase("","create index conditions_idx3 on {{conditions}} (cqid)"); echo $modifyoutput;
modifyDatabase("","create index groups_idx2 on {{groups}} (sid)"); echo $modifyoutput;
modifyDatabase("","create index question_attributes_idx2 on {{question_attributes}} (qid)"); echo $modifyoutput;
modifyDatabase("","create index questions_idx2 on {{questions}} (sid)"); echo $modifyoutput;
modifyDatabase("","create index questions_idx3 on {{questions}} (gid)"); echo $modifyoutput;
modifyDatabase("","create index questions_idx4 on {{questions}} (type)"); echo $modifyoutput;
modifyDatabase("","create index quota_idx2 on {{quota}} (sid)"); echo $modifyoutput;
modifyDatabase("","create index saved_control_idx2 on {{saved_control}} (sid)"); echo $modifyoutput;
modifyDatabase("","create index user_in_groups_idx1 on {{user_in_groups}} (ugid, uid)"); echo $modifyoutput;
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>127),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 128) {
upgradeTokens128();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>128),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 129) {
addColumn('{{surveys}}','startdate',"datetime");
addColumn('{{surveys}}','usestartdate',"{$sVarchar}(1) NOT NULL default 'N'");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>129),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 130)
{
addColumn('{{conditions}}','scenario',"integer NOT NULL default '1'");
$oDB->createCommand()->update('{{conditions}}',array('scenario'=>'1'),"(scenario is null) or scenario=0");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>130),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 131)
{
addColumn('{{surveys}}','publicstatistics',"{$sVarchar}(1) NOT NULL default 'N'");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>131),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 132)
{
addColumn('{{surveys}}','publicgraphs',"{$sVarchar}(1) NOT NULL default 'N'");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>132),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 133)
{
addColumn('{{users}}','one_time_pw','binary');
// Add new assessment setting
addColumn('{{surveys}}','assessments',"{$sVarchar}(1) NOT NULL default 'N'");
// add new assessment value fields to answers & labels
addColumn('{{answers}}','assessment_value',"integer NOT NULL default '0'");
addColumn('{{labels}}','assessment_value',"integer NOT NULL default '0'");
// copy any valid codes from code field to assessment field
switch ($sDBDriverName){
case 'mysql':
case 'mysqli':
$oDB->createCommand("UPDATE {{answers}} SET assessment_value=CAST(`code` as SIGNED) where `code` REGEXP '^-?[0-9]+$'")->execute();
$oDB->createCommand("UPDATE {{labels}} SET assessment_value=CAST(`code` as SIGNED) where `code` REGEXP '^-?[0-9]+$'")->execute();
// copy assessment link to message since from now on we will have HTML assignment messages
$oDB->createCommand("UPDATE {{assessments}} set message=concat(replace(message,'/''',''''),'
',link,'')")->execute();
break;
case 'sqlsrv':
case 'dblib':
case 'mssql':
try{
$oDB->createCommand("UPDATE {{answers}} SET assessment_value=CAST([code] as int) WHERE ISNUMERIC([code])=1")->execute();
$oDB->createCommand("UPDATE {{labels}} SET assessment_value=CAST([code] as int) WHERE ISNUMERIC([code])=1")->execute();
} catch(Exception $e){};
// copy assessment link to message since from now on we will have HTML assignment messages
alterColumn('{{assessments}}','link',"varchar(max)",false);
alterColumn('{{assessments}}','message',"varchar(max)",false);
$oDB->createCommand("UPDATE {{assessments}} set message=replace(message,'/''','''')+'
'+link+''")->execute();
break;
case 'pgsql':
$oDB->createCommand("UPDATE {{answers}} SET assessment_value=CAST(code as integer) where code ~ '^[0-9]+'")->execute();
$oDB->createCommand("UPDATE {{labels}} SET assessment_value=CAST(code as integer) where code ~ '^[0-9]+'")->execute();
// copy assessment link to message since from now on we will have HTML assignment messages
$oDB->createCommand("UPDATE {{assessments}} set message=replace(message,'/''','''')||'
'||link||''")->execute();
break;
default: die('Unkown database type');
}
// activate assessment where assessment rules exist
$oDB->createCommand("UPDATE {{surveys}} SET assessments='Y' where sid in (SELECT sid FROM {{assessments}} group by sid)")->execute();
// add language field to assessment table
addColumn('{{assessments}}','language',"{$sVarchar}(20) NOT NULL default 'en'");
// update language field with default language of that particular survey
$oDB->createCommand("UPDATE {{assessments}} SET language=(select language from {{surveys}} where sid={{assessments}}.sid)")->execute();
// drop the old link field
dropColumn('{{assessments}}','link');
// Add new fields to survey language settings
addColumn('{{surveys_languagesettings}}','surveyls_url',"string");
addColumn('{{surveys_languagesettings}}','surveyls_endtext','text');
// copy old URL fields ot language specific entries
$oDB->createCommand("UPDATE {{surveys_languagesettings}} set surveyls_url=(select url from {{surveys}} where sid={{surveys_languagesettings}}.surveyls_survey_id)")->execute();
// drop old URL field
dropColumn('{{surveys}}','url');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>133),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 134)
{
// Add new tokens setting
addColumn('{{surveys}}','usetokens',"{$sVarchar}(1) NOT NULL default 'N'");
addColumn('{{surveys}}','attributedescriptions','text');
dropColumn('{{surveys}}','attribute1');
dropColumn('{{surveys}}','attribute2');
upgradeTokenTables134();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>134),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 135)
{
alterColumn('{{question_attributes}}','value','text');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>135),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 136) //New Quota Functions
{
addColumn('{{quota}}','autoload_url',"integer NOT NULL default 0");
// Create quota table
$aFields = array(
'quotals_id' => 'pk',
'quotals_quota_id' => 'integer NOT NULL DEFAULT 0',
'quotals_language' => "{$sVarchar}(45) NOT NULL default 'en'",
'quotals_name' => 'string',
'quotals_message' => 'text NOT NULL',
'quotals_url' => 'string',
'quotals_urldescrip' => 'string',
);
createTable('{{quota_languagesettings}}',$aFields);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>136),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 137) //New Quota Functions
{
addColumn('{{surveys_languagesettings}}','surveyls_dateformat',"integer NOT NULL default 1");
addColumn('{{users}}','dateformat',"integer NOT NULL default 1");
$oDB->createCommand()->update('{{surveys}}',array('startdate'=>NULL),"usestartdate='N'");
$oDB->createCommand()->update('{{surveys}}',array('expires'=>NULL),"useexpiry='N'");
dropColumn('{{surveys}}','useexpiry');
dropColumn('{{surveys}}','usestartdate');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>137),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 138) //Modify quota field
{
alterColumn('{{quota_members}}','code',"{$sVarchar}(11)");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>138),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 139) //Modify quota field
{
upgradeSurveyTables139();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>139),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 140) //Modify surveys table
{
addColumn('{{surveys}}','emailresponseto','text');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>140),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 141) //Modify surveys table
{
addColumn('{{surveys}}','tokenlength','integer NOT NULL default 15');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>141),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 142) //Modify surveys table
{
upgradeQuestionAttributes142();
$oDB->createCommand()->alterColumn('{{surveys}}','expires',"datetime");
$oDB->createCommand()->alterColumn('{{surveys}}','startdate',"datetime");
$oDB->createCommand()->update('{{question_attributes}}',array('value'=>0),"value='false'");
$oDB->createCommand()->update('{{question_attributes}}',array('value'=>1),"value='true'");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>142),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 143)
{
addColumn('{{questions}}','parent_qid','integer NOT NULL default 0');
addColumn('{{answers}}','scale_id','integer NOT NULL default 0');
addColumn('{{questions}}','scale_id','integer NOT NULL default 0');
addColumn('{{questions}}','same_default','integer NOT NULL default 0');
dropPrimaryKey('answers');
addPrimaryKey('answers', array('qid','code','language','scale_id'));
$aFields = array(
'qid' => "integer NOT NULL default 0",
'scale_id' => 'integer NOT NULL default 0',
'sqid' => 'integer NOT NULL default 0',
'language' => $sVarchar.'(20) NOT NULL',
'specialtype' => $sVarchar."(20) NOT NULL default ''",
'defaultvalue' => 'text',
);
createTable('{{defaultvalues}}',$aFields);
addPrimaryKey('defaultvalues', array('qid','specialtype','language','scale_id','sqid'));
// -Move all 'answers' that are subquestions to the questions table
// -Move all 'labels' that are answers to the answers table
// -Transscribe the default values where applicable
// -Move default values from answers to questions
upgradeTables143();
dropColumn('{{answers}}','default_value');
dropColumn('{{questions}}','lid');
dropColumn('{{questions}}','lid1');
$aFields = array(
'sesskey' => "{$sVarchar}(64) NOT NULL DEFAULT ''",
'expiry' => "datetime NOT NULL",
'expireref' => "{$sVarchar}(250) DEFAULT ''",
'created' => "datetime NOT NULL",
'modified' => "datetime NOT NULL",
'sessdata' => 'text'
);
createTable('{{sessions}}',$aFields);
addPrimaryKey('sessions',array('sesskey'));
$oDB->createCommand()->createIndex('sess2_expiry','{{sessions}}','expiry');
$oDB->createCommand()->createIndex('sess2_expireref','{{sessions}}','expireref');
// Move all user templates to the new user template directory
echo sprintf($oLang->gT("Moving user templates to new location at %s..."),$sUserTemplateRootDir)."
";
$hTemplateDirectory = opendir($sStandardTemplateRootDir);
$aFailedTemplates=array();
// get each entry
while($entryName = readdir($hTemplateDirectory)) {
if (!in_array($entryName,array('.','..','.svn')) && is_dir($sStandardTemplateRootDir.DIRECTORY_SEPARATOR.$entryName) && !isStandardTemplate($entryName))
{
if (!rename($sStandardTemplateRootDir.DIRECTORY_SEPARATOR.$entryName,$sUserTemplateRootDir.DIRECTORY_SEPARATOR.$entryName))
{
$aFailedTemplates[]=$entryName;
};
}
}
if (count($aFailedTemplates)>0)
{
echo "The following templates at {$sStandardTemplateRootDir} could not be moved to the new location at {$sUserTemplateRootDir}:
";
foreach ($aFailedTemplates as $sFailedTemplate)
{
echo "- {$sFailedTemplate}
";
}
echo "
Please move these templates manually after the upgrade has finished.
";
}
// close directory
closedir($hTemplateDirectory);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>143),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 145)
{
addColumn('{{surveys}}','savetimings',"{$sVarchar}(1) NULL default 'N'");
addColumn('{{surveys}}','showXquestions',"{$sVarchar}(1) NULL default 'Y'");
addColumn('{{surveys}}','showgroupinfo',"{$sVarchar}(1) NULL default 'B'");
addColumn('{{surveys}}','shownoanswer',"{$sVarchar}(1) NULL default 'Y'");
addColumn('{{surveys}}','showqnumcode',"{$sVarchar}(1) NULL default 'X'");
addColumn('{{surveys}}','bouncetime','integer');
addColumn('{{surveys}}','bounceprocessing',"{$sVarchar}(1) NULL default 'N'");
addColumn('{{surveys}}','bounceaccounttype',"{$sVarchar}(4)");
addColumn('{{surveys}}','bounceaccounthost',"{$sVarchar}(200)");
addColumn('{{surveys}}','bounceaccountpass',"{$sVarchar}(100)");
addColumn('{{surveys}}','bounceaccountencryption',"{$sVarchar}(3)");
addColumn('{{surveys}}','bounceaccountuser',"{$sVarchar}(200)");
addColumn('{{surveys}}','showwelcome',"{$sVarchar}(1) default 'Y'");
addColumn('{{surveys}}','showprogress',"{$sVarchar}(1) default 'Y'");
addColumn('{{surveys}}','allowjumps',"{$sVarchar}(1) default 'N'");
addColumn('{{surveys}}','navigationdelay',"integer default 0");
addColumn('{{surveys}}','nokeyboard',"{$sVarchar}(1) default 'N'");
addColumn('{{surveys}}','alloweditaftercompletion',"{$sVarchar}(1) default 'N'");
$aFields = array(
'sid' => "integer NOT NULL",
'uid' => "integer NOT NULL",
'permission' => $sVarchar.'(20) NOT NULL',
'create_p' => "integer NOT NULL default 0",
'read_p' => "integer NOT NULL default 0",
'update_p' => "integer NOT NULL default 0",
'delete_p' => "integer NOT NULL default 0",
'import_p' => "integer NOT NULL default 0",
'export_p' => "integer NOT NULL default 0"
);
createTable('{{survey_permissions}}',$aFields);
addPrimaryKey('survey_permissions', array('sid','uid','permission'));
upgradeSurveyPermissions145();
// drop the old survey rights table
$oDB->createCommand()->dropTable('{{surveys_rights}}');
// Add new fields for email templates
addColumn('{{surveys_languagesettings}}','email_admin_notification_subj',"string");
addColumn('{{surveys_languagesettings}}','email_admin_responses_subj',"string");
addColumn('{{surveys_languagesettings}}','email_admin_notification',"text");
addColumn('{{surveys_languagesettings}}','email_admin_responses',"text");
//Add index to questions table to speed up subquestions
$oDB->createCommand()->createIndex('parent_qid_idx','{{questions}}','parent_qid');
addColumn('{{surveys}}','emailnotificationto',"text");
upgradeSurveys145();
dropColumn('{{surveys}}','notification');
alterColumn('{{conditions}}','method',"{$sVarchar}(5)",false,'');
$oDB->createCommand()->renameColumn('{{surveys}}','private','anonymized');
$oDB->createCommand()->update('{{surveys}}',array('anonymized'=>'N'),"anonymized is NULL");
alterColumn('{{surveys}}','anonymized',"{$sVarchar}(1)",false,'N');
//now we clean up things that were not properly set in previous DB upgrades
$oDB->createCommand()->update('{{answers}}',array('answer'=>''),"answer is NULL");
$oDB->createCommand()->update('{{assessments}}',array('scope'=>''),"scope is NULL");
$oDB->createCommand()->update('{{assessments}}',array('name'=>''),"name is NULL");
$oDB->createCommand()->update('{{assessments}}',array('message'=>''),"message is NULL");
$oDB->createCommand()->update('{{assessments}}',array('minimum'=>''),"minimum is NULL");
$oDB->createCommand()->update('{{assessments}}',array('maximum'=>''),"maximum is NULL");
$oDB->createCommand()->update('{{groups}}',array('group_name'=>''),"group_name is NULL");
$oDB->createCommand()->update('{{labels}}',array('code'=>''),"code is NULL");
$oDB->createCommand()->update('{{labelsets}}',array('label_name'=>''),"label_name is NULL");
$oDB->createCommand()->update('{{questions}}',array('type'=>'T'),"type is NULL");
$oDB->createCommand()->update('{{questions}}',array('title'=>''),"title is NULL");
$oDB->createCommand()->update('{{questions}}',array('question'=>''),"question is NULL");
$oDB->createCommand()->update('{{questions}}',array('other'=>'N'),"other is NULL");
alterColumn('{{answers}}','answer',"text",false);
alterColumn('{{answers}}','assessment_value','integer',false , '0');
alterColumn('{{assessments}}','scope',"{$sVarchar}(5)",false , '');
alterColumn('{{assessments}}','name',"text",false);
alterColumn('{{assessments}}','message',"text",false);
alterColumn('{{assessments}}','minimum',"{$sVarchar}(50)",false , '');
alterColumn('{{assessments}}','maximum',"{$sVarchar}(50)",false , '');
// change the primary index to include language
if ($sDBDriverName=='mysql') // special treatment for mysql because this needs to be in one step since an AUTOINC field is involved
{
$oDB->createCommand("ALTER TABLE {{assessments}} DROP PRIMARY KEY, ADD PRIMARY KEY (`id`, `language`)")->execute();
}
else
{
dropPrimaryKey('assessments');
addPrimaryKey('assessments',array('id','language'));
}
alterColumn('{{conditions}}','cfieldname',"{$sVarchar}(50)",false , '');
dropPrimaryKey('defaultvalues');
alterColumn('{{defaultvalues}}','specialtype',"{$sVarchar}(20)",false , '');
addPrimaryKey('defaultvalues', array('qid','specialtype','language','scale_id','sqid'));
alterColumn('{{groups}}','group_name',"{$sVarchar}(100)",false , '');
alterColumn('{{labels}}','code',"{$sVarchar}(5)",false , '');
dropPrimaryKey('labels');
alterColumn('{{labels}}','language',"{$sVarchar}(20)",false , 'en');
addPrimaryKey('labels', array('lid', 'sortorder', 'language'));
alterColumn('{{labelsets}}','label_name',"{$sVarchar}(100)",false , '');
alterColumn('{{questions}}','parent_qid','integer',false ,'0');
alterColumn('{{questions}}','title',"{$sVarchar}(20)",false , '');
alterColumn('{{questions}}','question',"text",false);
try{ $oDB->createCommand()->dropIndex('questions_idx4','{{questions}}');} catch(Exception $e){};
alterColumn('{{questions}}','type',"{$sVarchar}(1)",false , 'T');
try{ $oDB->createCommand()->createIndex('questions_idx4','{{questions}}','type');} catch(Exception $e){};
alterColumn('{{questions}}','other',"{$sVarchar}(1)",false , 'N');
alterColumn('{{questions}}','mandatory',"{$sVarchar}(1)");
alterColumn('{{question_attributes}}','attribute',"{$sVarchar}(50)");
alterColumn('{{quota}}','qlimit','integer');
$oDB->createCommand()->update('{{saved_control}}',array('identifier'=>''),"identifier is NULL");
alterColumn('{{saved_control}}','identifier',"text",false);
$oDB->createCommand()->update('{{saved_control}}',array('access_code'=>''),"access_code is NULL");
alterColumn('{{saved_control}}','access_code',"text",false);
alterColumn('{{saved_control}}','email',"{$sVarchar}(320)");
$oDB->createCommand()->update('{{saved_control}}',array('ip'=>''),"ip is NULL");
alterColumn('{{saved_control}}','ip',"text",false);
$oDB->createCommand()->update('{{saved_control}}',array('saved_thisstep'=>''),"saved_thisstep is NULL");
alterColumn('{{saved_control}}','saved_thisstep',"text",false);
$oDB->createCommand()->update('{{saved_control}}',array('status'=>''),"status is NULL");
alterColumn('{{saved_control}}','status',"{$sVarchar}(1)",false , '');
$oDB->createCommand()->update('{{saved_control}}',array('saved_date'=>'1980-01-01 00:00:00'),"saved_date is NULL");
alterColumn('{{saved_control}}','saved_date',"datetime",false);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>''),"stg_value is NULL");
alterColumn('{{settings_global}}','stg_value',"string",false , '');
alterColumn('{{surveys}}','admin',"{$sVarchar}(50)");
$oDB->createCommand()->update('{{surveys}}',array('active'=>'N'),"active is NULL");
alterColumn('{{surveys}}','active',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','startdate',"datetime");
alterColumn('{{surveys}}','adminemail',"{$sVarchar}(320)");
alterColumn('{{surveys}}','anonymized',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','faxto',"{$sVarchar}(20)");
alterColumn('{{surveys}}','format',"{$sVarchar}(1)");
alterColumn('{{surveys}}','language',"{$sVarchar}(50)");
alterColumn('{{surveys}}','additional_languages',"string");
alterColumn('{{surveys}}','printanswers',"{$sVarchar}(1)",true , 'N');
alterColumn('{{surveys}}','publicstatistics',"{$sVarchar}(1)",true , 'N');
alterColumn('{{surveys}}','publicgraphs',"{$sVarchar}(1)",true , 'N');
alterColumn('{{surveys}}','assessments',"{$sVarchar}(1)",true , 'N');
alterColumn('{{surveys}}','usetokens',"{$sVarchar}(1)",true , 'N');
alterColumn('{{surveys}}','bounce_email',"{$sVarchar}(320)");
alterColumn('{{surveys}}','tokenlength','integer',true , 15);
$oDB->createCommand()->update('{{surveys_languagesettings}}',array('surveyls_title'=>''),"surveyls_title is NULL");
alterColumn('{{surveys_languagesettings}}','surveyls_title',"{$sVarchar}(200)",false);
alterColumn('{{surveys_languagesettings}}','surveyls_endtext',"text");
alterColumn('{{surveys_languagesettings}}','surveyls_url',"string");
alterColumn('{{surveys_languagesettings}}','surveyls_urldescription',"string");
alterColumn('{{surveys_languagesettings}}','surveyls_email_invite_subj',"string");
alterColumn('{{surveys_languagesettings}}','surveyls_email_remind_subj',"string");
alterColumn('{{surveys_languagesettings}}','surveyls_email_register_subj',"string");
alterColumn('{{surveys_languagesettings}}','surveyls_email_confirm_subj',"string");
alterColumn('{{surveys_languagesettings}}','surveyls_dateformat','integer',false , 1);
$oDB->createCommand()->update('{{users}}',array('users_name'=>''),"users_name is NULL");
$oDB->createCommand()->update('{{users}}',array('full_name'=>''),"full_name is NULL");
alterColumn('{{users}}','users_name',"{$sVarchar}(64)",false , '');
alterColumn('{{users}}','full_name',"{$sVarchar}(50)",false);
alterColumn('{{users}}','lang',"{$sVarchar}(20)");
alterColumn('{{users}}','email',"{$sVarchar}(320)");
alterColumn('{{users}}','superadmin','integer',false , 0);
alterColumn('{{users}}','htmleditormode',"{$sVarchar}(7)",true,'default');
alterColumn('{{users}}','dateformat','integer',false , 1);
try{
setTransactionBookmark();
$oDB->createCommand()->dropIndex('email','{{users}}');
}
catch(Exception $e)
{
// do nothing
rollBackToTransactionBookmark();
}
$oDB->createCommand()->update('{{user_groups}}',array('name'=>''),"name is NULL");
$oDB->createCommand()->update('{{user_groups}}',array('description'=>''),"description is NULL");
alterColumn('{{user_groups}}','name',"{$sVarchar}(20)",false);
alterColumn('{{user_groups}}','description',"text",false);
try { $oDB->createCommand()->dropIndex('user_in_groups_idx1','{{user_in_groups}}'); } catch(Exception $e) {}
try { addPrimaryKey('user_in_groups', array('ugid','uid')); } catch(Exception $e) {}
addColumn('{{surveys_languagesettings}}','surveyls_numberformat',"integer NOT NULL DEFAULT 0");
createTable('{{failed_login_attempts}}',array(
'id' => "pk",
'ip' => $sVarchar.'(37) NOT NULL',
'last_attempt' => $sVarchar.'(20) NOT NULL',
'number_attempts' => "integer NOT NULL"
));
upgradeTokens145();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>145),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 146) //Modify surveys table
{
upgradeSurveyTimings146();
// Fix permissions for new feature quick-translation
try { setTransactionBookmark(); $oDB->createCommand("INSERT into {{survey_permissions}} (sid,uid,permission,read_p,update_p) SELECT sid,owner_id,'translations','1','1' from {{surveys}}")->execute(); echo $modifyoutput; flush();@ob_flush();} catch(Exception $e) { rollBackToTransactionBookmark();}
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>146),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 147)
{
addColumn('{{users}}','templateeditormode',"{$sVarchar}(7) NOT NULL default 'default'");
addColumn('{{users}}','questionselectormode',"{$sVarchar}(7) NOT NULL default 'default'");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>147),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 148)
{
addColumn('{{users}}','participant_panel',"integer NOT NULL default 0");
createTable('{{participants}}',array(
'participant_id' => $sVarchar.'(50) NOT NULL',
'firstname' => $sVarchar.'(40) default NULL',
'lastname' => $sVarchar.'(40) default NULL',
'email' => $sVarchar.'(80) default NULL',
'language' => $sVarchar.'(40) default NULL',
'blacklisted' => $sVarchar.'(1) NOT NULL',
'owner_uid' => "integer NOT NULL"
));
addPrimaryKey('participants', array('participant_id'));
createTable('{{participant_attribute}}',array(
'participant_id' => $sVarchar.'(50) NOT NULL',
'attribute_id' => "integer NOT NULL",
'value' => $sVarchar.'(50) NOT NULL'
));
addPrimaryKey('participant_attribute', array('participant_id','attribute_id'));
createTable('{{participant_attribute_names}}',array(
'attribute_id' => $sAutoIncrement,
'attribute_type' => $sVarchar.'(4) NOT NULL',
'visible' => $sVarchar.'(5) NOT NULL',
'PRIMARY KEY (attribute_id,attribute_type)'
));
createTable('{{participant_attribute_names_lang}}',array(
'attribute_id' => 'integer NOT NULL',
'attribute_name' => $sVarchar.'(30) NOT NULL',
'lang' => $sVarchar.'(20) NOT NULL'
));
addPrimaryKey('participant_attribute_names_lang', array('attribute_id','lang'));
createTable('{{participant_attribute_values}}',array(
'attribute_id' => 'integer NOT NULL',
'value_id' => 'pk',
'value' => $sVarchar.'(20) NOT NULL'
));
createTable('{{participant_shares}}',array(
'participant_id' => $sVarchar.'(50) NOT NULL',
'share_uid' => 'integer NOT NULL',
'date_added' => 'datetime NOT NULL',
'can_edit' => $sVarchar.'(5) NOT NULL'
));
addPrimaryKey('participant_shares', array('participant_id','share_uid'));
createTable('{{survey_links}}',array(
'participant_id' => $sVarchar.'(50) NOT NULL',
'token_id' => 'integer NOT NULL',
'survey_id' => 'integer NOT NULL',
'date_created' => 'datetime NOT NULL'
));
addPrimaryKey('survey_links', array('participant_id','token_id','survey_id'));
// Add language field to question_attributes table
addColumn('{{question_attributes}}','language',"{$sVarchar}(20)");
upgradeQuestionAttributes148();
fixSubquestions();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>148),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 149)
{
$aFields = array(
'id' => 'integer',
'sid' => 'integer',
'parameter' => $sVarchar.'(50)',
'targetqid' => 'integer',
'targetsqid' => 'integer'
);
createTable('{{survey_url_parameters}}',$aFields);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>149),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 150)
{
addColumn('{{questions}}','relevance','TEXT');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>150),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 151)
{
addColumn('{{groups}}','randomization_group',"{$sVarchar}(20) NOT NULL default ''");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>151),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 152)
{
$oDB->createCommand()->createIndex('question_attributes_idx3','{{question_attributes}}','attribute');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>152),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 153)
{
createTable('{{expression_errors}}',array(
'id' => 'pk',
'errortime' => $sVarchar.'(50)',
'sid' => 'integer',
'gid' => 'integer',
'qid' => 'integer',
'gseq' => 'integer',
'qseq' => 'integer',
'type' => $sVarchar.'(50)',
'eqn' => 'text',
'prettyprint' => 'text'
));
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>153),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 154)
{
$oDB->createCommand()->addColumn('{{groups}}','grelevance',"text");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>154),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 155)
{
addColumn('{{surveys}}','googleanalyticsstyle',"{$sVarchar}(1)");
addColumn('{{surveys}}','googleanalyticsapikey',"{$sVarchar}(25)");
try { setTransactionBookmark(); $oDB->createCommand()->renameColumn('{{surveys}}','showXquestions','showxquestions');} catch(Exception $e) { rollBackToTransactionBookmark();}
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>155),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 156)
{
try
{
$oDB->createCommand()->dropTable('{{survey_url_parameters}}');
}
catch(Exception $e)
{
// do nothing
}
createTable('{{survey_url_parameters}}',array(
'id' => 'pk',
'sid' => 'integer NOT NULL',
'parameter' => $sVarchar.'(50) NOT NULL',
'targetqid' => 'integer',
'targetsqid' => 'integer'
));
$oDB->createCommand()->dropTable('{{sessions}}');
if ($sDBDriverName=='mysql')
{
createTable('{{sessions}}',array(
'id' => $sVarchar.'(32) NOT NULL',
'expire' => 'integer',
'data' => 'longtext'
));
}
else
{
createTable('{{sessions}}',array(
'id' => $sVarchar.'(32) NOT NULL',
'expire' => 'integer',
'data' => 'text'
));
}
addPrimaryKey('sessions', array('id'));
addColumn('{{surveys_languagesettings}}','surveyls_attributecaptions',"TEXT");
addColumn('{{surveys}}','sendconfirmation',"{$sVarchar}(1) default 'Y'");
upgradeSurveys156();
// If a survey has an deleted owner, re-own the survey to the superadmin
$oDB->schema->refresh();
Survey::model()->refreshMetaData();
$surveys = Survey::model();
$surveys = $surveys->with(array('owner'))->findAll();
foreach ($surveys as $row)
{
if (!isset($row->owner->attributes))
{
Survey::model()->updateByPk($row->sid,array('owner_id'=>1));
}
}
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>156),"stg_name='DBVersion'");
$oTransaction->commit();
$oTransaction=$oDB->beginTransaction();
}
if ($iOldDBVersion < 157)
{
// MySQL DB corrections
try { setTransactionBookmark(); $oDB->createCommand()->dropIndex('questions_idx4','{{questions}}'); } catch(Exception $e) { rollBackToTransactionBookmark();}
alterColumn('{{answers}}','assessment_value','integer',false , '0');
dropPrimaryKey('answers');
alterColumn('{{answers}}','scale_id','integer',false , '0');
addPrimaryKey('answers', array('qid','code','language','scale_id'));
alterColumn('{{conditions}}','method',"{$sVarchar}(5)",false , '');
alterColumn('{{participants}}','owner_uid','integer',false);
alterColumn('{{participant_attribute_names}}','visible',$sVarchar.'(5)',false);
alterColumn('{{questions}}','type',"{$sVarchar}(1)",false , 'T');
alterColumn('{{questions}}','other',"{$sVarchar}(1)",false , 'N');
alterColumn('{{questions}}','mandatory',"{$sVarchar}(1)");
alterColumn('{{questions}}','scale_id','integer',false , '0');
alterColumn('{{questions}}','parent_qid','integer',false ,'0');
alterColumn('{{questions}}','same_default','integer',false , '0');
alterColumn('{{quota}}','qlimit','integer');
alterColumn('{{quota}}','action','integer');
alterColumn('{{quota}}','active','integer',false , '1');
alterColumn('{{quota}}','autoload_url','integer',false , '0');
alterColumn('{{saved_control}}','status',"{$sVarchar}(1)",false , '');
try { setTransactionBookmark(); alterColumn('{{sessions}}','id',"{$sVarchar}(32)",false); } catch(Exception $e) { rollBackToTransactionBookmark();}
alterColumn('{{surveys}}','active',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','anonymized',"{$sVarchar}(1)",false,'N');
alterColumn('{{surveys}}','format',"{$sVarchar}(1)");
alterColumn('{{surveys}}','savetimings',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','datestamp',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','usecookie',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','allowregister',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','allowsave',"{$sVarchar}(1)",false , 'Y');
alterColumn('{{surveys}}','autonumber_start','integer' ,false, '0');
alterColumn('{{surveys}}','autoredirect',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','allowprev',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','printanswers',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','ipaddr',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','refurl',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','publicstatistics',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','publicgraphs',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','listpublic',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','htmlemail',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','sendconfirmation',"{$sVarchar}(1)",false , 'Y');
alterColumn('{{surveys}}','tokenanswerspersistence',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','assessments',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','usecaptcha',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','usetokens',"{$sVarchar}(1)",false , 'N');
alterColumn('{{surveys}}','tokenlength','integer',false, '15');
alterColumn('{{surveys}}','showxquestions',"{$sVarchar}(1)", true , 'Y');
alterColumn('{{surveys}}','showgroupinfo',"{$sVarchar}(1) ", true , 'B');
alterColumn('{{surveys}}','shownoanswer',"{$sVarchar}(1) ", true , 'Y');
alterColumn('{{surveys}}','showqnumcode',"{$sVarchar}(1) ", true , 'X');
alterColumn('{{surveys}}','bouncetime','integer');
alterColumn('{{surveys}}','showwelcome',"{$sVarchar}(1)", true , 'Y');
alterColumn('{{surveys}}','showprogress',"{$sVarchar}(1)", true , 'Y');
alterColumn('{{surveys}}','allowjumps',"{$sVarchar}(1)", true , 'N');
alterColumn('{{surveys}}','navigationdelay','integer', false , '0');
alterColumn('{{surveys}}','nokeyboard',"{$sVarchar}(1)", true , 'N');
alterColumn('{{surveys}}','alloweditaftercompletion',"{$sVarchar}(1)", true , 'N');
alterColumn('{{surveys}}','googleanalyticsstyle',"{$sVarchar}(1)");
alterColumn('{{surveys_languagesettings}}','surveyls_dateformat','integer',false , 1);
try { setTransactionBookmark(); alterColumn('{{survey_permissions}}','sid',"integer",false); } catch(Exception $e) { rollBackToTransactionBookmark();}
try { setTransactionBookmark(); alterColumn('{{survey_permissions}}','uid',"integer",false); } catch(Exception $e) { rollBackToTransactionBookmark();}
alterColumn('{{survey_permissions}}','create_p', 'integer',false , '0');
alterColumn('{{survey_permissions}}','read_p', 'integer',false , '0');
alterColumn('{{survey_permissions}}','update_p','integer',false , '0');
alterColumn('{{survey_permissions}}','delete_p' ,'integer',false , '0');
alterColumn('{{survey_permissions}}','import_p','integer',false , '0');
alterColumn('{{survey_permissions}}','export_p' ,'integer',false , '0');
alterColumn('{{survey_url_parameters}}','targetqid' ,'integer');
alterColumn('{{survey_url_parameters}}','targetsqid' ,'integer');
alterColumn('{{templates_rights}}','use','integer',false );
alterColumn('{{users}}','create_survey','integer',false, '0');
alterColumn('{{users}}','create_user','integer',false, '0');
alterColumn('{{users}}','participant_panel','integer',false, '0');
alterColumn('{{users}}','delete_user','integer',false, '0');
alterColumn('{{users}}','superadmin','integer',false, '0');
alterColumn('{{users}}','configurator','integer',false, '0');
alterColumn('{{users}}','manage_template','integer',false, '0');
alterColumn('{{users}}','manage_label','integer',false, '0');
alterColumn('{{users}}','dateformat','integer',false, 1);
alterColumn('{{users}}','participant_panel','integer',false , '0');
alterColumn('{{users}}','parent_id','integer',false);
try { setTransactionBookmark(); alterColumn('{{surveys_languagesettings}}','surveyls_survey_id',"integer",false); } catch(Exception $e) { rollBackToTransactionBookmark(); }
alterColumn('{{user_groups}}','owner_id',"integer",false);
dropPrimaryKey('user_in_groups');
alterColumn('{{user_in_groups}}','ugid',"integer",false);
alterColumn('{{user_in_groups}}','uid',"integer",false);
// Additional corrections for Postgres
try{ setTransactionBookmark(); $oDB->createCommand()->createIndex('questions_idx3','{{questions}}','gid');} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand()->createIndex('conditions_idx3','{{conditions}}','cqid');} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand()->createIndex('questions_idx4','{{questions}}','type');} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand()->dropIndex('user_in_groups_idx1','{{user_in_groups}}');} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand()->dropIndex('{{user_name_key}}','{{users}}');} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand()->createIndex('users_name','{{users}}','users_name',true);} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); addPrimaryKey('user_in_groups', array('ugid','uid'));} catch(Exception $e) { rollBackToTransactionBookmark(); };
alterColumn('{{participant_attribute}}','value',"{$sVarchar}(50)", false);
try{ setTransactionBookmark(); alterColumn('{{participant_attribute_names}}','attribute_type',"{$sVarchar}(4)", false);} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); dropColumn('{{participant_attribute_names_lang}}','id');} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); addPrimaryKey('participant_attribute_names_lang',array('attribute_id','lang'));} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand()->renameColumn('{{participant_shares}}','shared_uid','share_uid');} catch(Exception $e) { rollBackToTransactionBookmark(); };
alterColumn('{{participant_shares}}','date_added',"datetime", false);
alterColumn('{{participants}}','firstname',"{$sVarchar}(40)");
alterColumn('{{participants}}','lastname',"{$sVarchar}(40)");
alterColumn('{{participants}}','email',"{$sVarchar}(80)");
alterColumn('{{participants}}','language',"{$sVarchar}(40)");
alterColumn('{{quota_languagesettings}}','quotals_name',"string");
try{ setTransactionBookmark(); alterColumn('{{survey_permissions}}','sid','integer',false); } catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); alterColumn('{{survey_permissions}}','uid','integer',false); } catch(Exception $e) { rollBackToTransactionBookmark(); };
alterColumn('{{users}}','htmleditormode',"{$sVarchar}(7)",true,'default');
// Sometimes the survey_links table was deleted before this step, if so
// we recreate it (copied from line 663)
if (!tableExists('{survey_links}')) {
createTable('{{survey_links}}',array(
'participant_id' => $sVarchar.'(50) NOT NULL',
'token_id' => 'integer NOT NULL',
'survey_id' => 'integer NOT NULL',
'date_created' => 'datetime NOT NULL'
));
addPrimaryKey('survey_links', array('participant_id','token_id','survey_id'));
}
alterColumn('{{survey_links}}','date_created',"datetime",true);
alterColumn('{{saved_control}}','identifier',"text",false);
alterColumn('{{saved_control}}','email',"{$sVarchar}(320)");
alterColumn('{{surveys}}','adminemail',"{$sVarchar}(320)");
alterColumn('{{surveys}}','bounce_email',"{$sVarchar}(320)");
alterColumn('{{users}}','email',"{$sVarchar}(320)");
try{ setTransactionBookmark(); $oDB->createCommand()->dropIndex('assessments_idx','{{assessments}}');} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand()->createIndex('assessments_idx3','{{assessments}}','gid');} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand()->dropIndex('ixcode','{{labels}}');} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand()->dropIndex('{{labels_ixcode_idx}}','{{labels}}');} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand()->createIndex('labels_code_idx','{{labels}}','code');} catch(Exception $e) { rollBackToTransactionBookmark(); };
if ($sDBDriverName=='pgsql')
{
try{ setTransactionBookmark(); $oDB->createCommand("ALTER TABLE ONLY {{user_groups}} ADD PRIMARY KEY (ugid); ")->execute;} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand("ALTER TABLE ONLY {{users}} ADD PRIMARY KEY (uid); ")->execute;} catch(Exception $e) { rollBackToTransactionBookmark(); };
}
// Additional corrections for MSSQL
alterColumn('{{answers}}','answer',"text",false);
alterColumn('{{assessments}}','name',"text",false);
alterColumn('{{assessments}}','message',"text",false);
alterColumn('{{defaultvalues}}','defaultvalue',"text");
alterColumn('{{expression_errors}}','eqn',"text");
alterColumn('{{expression_errors}}','prettyprint',"text");
alterColumn('{{groups}}','description',"text");
alterColumn('{{groups}}','grelevance',"text");
alterColumn('{{labels}}','title',"text");
alterColumn('{{question_attributes}}','value',"text");
alterColumn('{{questions}}','preg',"text");
alterColumn('{{questions}}','help',"text");
alterColumn('{{questions}}','relevance',"text");
alterColumn('{{questions}}','question',"text",false);
alterColumn('{{quota_languagesettings}}','quotals_quota_id',"integer",false);
alterColumn('{{quota_languagesettings}}','quotals_message',"text",false);
alterColumn('{{saved_control}}','refurl',"text");
alterColumn('{{saved_control}}','access_code',"text",false);
alterColumn('{{saved_control}}','ip',"text",false);
alterColumn('{{saved_control}}','saved_thisstep',"text",false);
alterColumn('{{saved_control}}','saved_date',"datetime",false);
alterColumn('{{surveys}}','attributedescriptions',"text");
alterColumn('{{surveys}}','emailresponseto',"text");
alterColumn('{{surveys}}','emailnotificationto',"text");
alterColumn('{{surveys_languagesettings}}','surveyls_description',"text");
alterColumn('{{surveys_languagesettings}}','surveyls_welcometext',"text");
alterColumn('{{surveys_languagesettings}}','surveyls_email_invite',"text");
alterColumn('{{surveys_languagesettings}}','surveyls_email_remind',"text");
alterColumn('{{surveys_languagesettings}}','surveyls_email_register',"text");
alterColumn('{{surveys_languagesettings}}','surveyls_email_confirm',"text");
alterColumn('{{surveys_languagesettings}}','surveyls_attributecaptions',"text");
alterColumn('{{surveys_languagesettings}}','email_admin_notification',"text");
alterColumn('{{surveys_languagesettings}}','email_admin_responses',"text");
alterColumn('{{surveys_languagesettings}}','surveyls_endtext',"text");
alterColumn('{{user_groups}}','description',"text",false);
alterColumn('{{conditions}}','value','string',false,'');
alterColumn('{{participant_shares}}','can_edit',"{$sVarchar}(5)",false);
alterColumn('{{users}}','password',"binary",false);
dropColumn('{{users}}','one_time_pw');
addColumn('{{users}}','one_time_pw','binary');
$oDB->createCommand()->update('{{question_attributes}}',array('value'=>'1'),"attribute = 'random_order' and value = '2'");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>157),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 158)
{
LimeExpressionManager::UpgradeConditionsToRelevance();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>158),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 159)
{
alterColumn('{{failed_login_attempts}}', 'ip', "{$sVarchar}(40)",false);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>159),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 160)
{
alterLanguageCode('it','it-informal');
alterLanguageCode('it-formal','it');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>160),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 161)
{
addColumn('{{survey_links}}','date_invited','datetime NULL default NULL');
addColumn('{{survey_links}}','date_completed','datetime NULL default NULL');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>161),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 162)
{
/* Fix participant db types */
alterColumn('{{participant_attribute}}', 'value', "text", false);
alterColumn('{{participant_attribute_names_lang}}', 'attribute_name', "{$sVarchar}(255)", false);
alterColumn('{{participant_attribute_values}}', 'value', "text", false);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>162),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 163)
{
//Replace by by {TEMPLATEJS}
$replacedTemplate=replaceTemplateJS();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>163),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 164)
{
upgradeTokens148(); // this should have bee done in 148 - that's why it is named this way
// fix survey tables for missing or incorrect token field
upgradeSurveyTables164();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>164),"stg_name='DBVersion'");
// Not updating settings table as upgrade process takes care of that step now
}
if ($iOldDBVersion < 165)
{
$oDB->createCommand()->createTable('{{plugins}}', array(
'id' => 'pk',
'name' => 'string NOT NULL',
'active' => 'boolean'
));
$oDB->createCommand()->createTable('{{plugin_settings}}', array(
'id' => 'pk',
'plugin_id' => 'integer NOT NULL',
'model' => 'string',
'model_id' => 'integer',
'key' => 'string',
'value' => 'text'
));
alterColumn('{{surveys_languagesettings}}','surveyls_url',"text");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>165),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 166)
{
$oDB->createCommand()->renameTable('{{survey_permissions}}', '{{permissions}}');
dropPrimaryKey('permissions');
alterColumn('{{permissions}}', 'permission', "{$sVarchar}(100)", false);
$oDB->createCommand()->renameColumn('{{permissions}}','sid','entity_id');
alterColumn('{{permissions}}', 'entity_id', "{$sVarchar}(100)", false);
addColumn('{{permissions}}','entity',"{$sVarchar}(50)");
$oDB->createCommand("update {{permissions}} set entity='survey'")->query();
addColumn('{{permissions}}','id','pk');
$oDB->createCommand()->createIndex('idxPermissions','{{permissions}}','entity_id,entity,permission,uid',true);
upgradePermissions166();
dropColumn('{{users}}','create_survey');
dropColumn('{{users}}','create_user');
dropColumn('{{users}}','delete_user');
dropColumn('{{users}}','superadmin');
dropColumn('{{users}}','configurator');
dropColumn('{{users}}','manage_template');
dropColumn('{{users}}','manage_label');
dropColumn('{{users}}','participant_panel');
$oDB->createCommand()->dropTable('{{templates_rights}}');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>166),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 167)
{
addColumn('{{surveys_languagesettings}}', 'attachments', 'text');
addColumn('{{users}}', 'created', 'datetime');
addColumn('{{users}}', 'modified', 'datetime');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>167),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 168)
{
addColumn('{{participants}}', 'created', 'datetime');
addColumn('{{participants}}', 'modified', 'datetime');
addColumn('{{participants}}', 'created_by', 'integer');
$oDB->createCommand('update {{participants}} set created_by=owner_uid')->query();
alterColumn('{{participants}}', 'created_by', "integer", false);
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>168),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 169)
{
// Add new column for question index options.
addColumn('{{surveys}}', 'questionindex', 'integer not null default 0');
// Set values for existing surveys.
$oDB->createCommand("update {{surveys}} set questionindex = 0 where allowjumps <> 'Y'")->query();
$oDB->createCommand("update {{surveys}} set questionindex = 1 where allowjumps = 'Y'")->query();
// Remove old column.
dropColumn('{{surveys}}', 'allowjumps');
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>169),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 170)
{
// renamed advanced attributes fields dropdown_dates_year_min/max
$oDB->createCommand()->update('{{question_attributes}}',array('attribute'=>'date_min'),"attribute='dropdown_dates_year_min'");
$oDB->createCommand()->update('{{question_attributes}}',array('attribute'=>'date_max'),"attribute='dropdown_dates_year_max'");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>170),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 171)
{
dropColumn('{{sessions}}','data');
switch ($sDBDriverName){
case 'mysql':
case 'mysqli':
addColumn('{{sessions}}', 'data', 'LONGBLOB');
break;
case 'sqlsrv':
case 'dblib':
case 'mssql':
addColumn('{{sessions}}', 'data', 'VARBINARY(MAX)');
break;
case 'pgsql':
addColumn('{{sessions}}', 'data', 'BYTEA');
break;
default: die('Unkown database type');
}
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>171),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 172)
{
switch ($sDBDriverName){
case 'pgsql':
// Special treatment for Postgres as it is too dumb to convert a string to a number without explicit being told to do so ... seriously?
alterColumn('{{permissions}}', 'entity_id', "INTEGER USING (entity_id::integer)", false);
break;
case 'sqlsrv':
case 'dblib':
case 'mssql':
try{ setTransactionBookmark(); $oDB->createCommand()->dropIndex('permissions_idx2','{{permissions}}');} catch(Exception $e) { rollBackToTransactionBookmark(); };
try{ setTransactionBookmark(); $oDB->createCommand()->dropIndex('idxPermissions','{{permissions}}');} catch(Exception $e) { rollBackToTransactionBookmark(); };
alterColumn('{{permissions}}', 'entity_id', "INTEGER", false);
$oDB->createCommand()->createIndex('permissions_idx2','{{permissions}}','entity_id,entity,permission,uid',true);
break;
default:
alterColumn('{{permissions}}', 'entity_id', "INTEGER", false);
}
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>172),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 173)
{
addColumn('{{participant_attribute_names}}','defaultname',"{$sVarchar}(50) NOT NULL default ''");
upgradeCPDBAttributeDefaultNames173();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>173),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 174)
{
alterColumn('{{participants}}', 'email', "{$sVarchar}(254)");
alterColumn('{{saved_control}}', 'email', "{$sVarchar}(254)");
alterColumn('{{surveys}}', 'adminemail', "{$sVarchar}(254)");
alterColumn('{{surveys}}', 'bounce_email', "{$sVarchar}(254)");
switch ($sDBDriverName){
case 'sqlsrv':
case 'dblib':
case 'mssql': dropUniqueKeyMSSQL('email','{{users}}');
}
alterColumn('{{users}}', 'email', "{$sVarchar}(254)");
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>174),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 175)
{
switch ($sDBDriverName){
case 'pgsql':
// Special treatment for Postgres as it is too dumb to convert a boolean to a number without explicit being told to do so
alterColumn('{{plugins}}', 'active', "INTEGER USING (active::integer)", false);
break;
default:
alterColumn('{{plugins}}', 'active', "integer",false,'0');
}
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>175),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 176)
{
upgradeTokens176();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>176),"stg_name='DBVersion'");
}
if ($iOldDBVersion < 177)
{
if ( Yii::app()->getConfig('auth_webserver') === true ) {
// using auth webserver, now activate the plugin with default settings.
if (!class_exists('Authwebserver', false)) {
$plugin = Plugin::model()->findByAttributes(array('name'=>'Authwebserver'));
if (!$plugin) {
$plugin = new Plugin();
$plugin->name = 'Authwebserver';
$plugin->active = 1;
$plugin->save();
$plugin = App()->getPluginManager()->loadPlugin('Authwebserver', $plugin->id);
$aPluginSettings = $plugin->getPluginSettings(true);
$aDefaultSettings = array();
foreach ($aPluginSettings as $key => $settings) {
if (is_array($settings) && array_key_exists('current', $settings) ) {
$aDefaultSettings[$key] = $settings['current'];
}
}
$plugin->saveSettings($aDefaultSettings);
} else {
$plugin->active = 1;
$plugin->save();
}
}
}
upgradeSurveys177();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>177),"stg_name='DBVersion'");
}
$oTransaction->commit();
// Activate schema caching
$oDB->schemaCachingDuration=3600;
// Load all tables of the application in the schema
Yii::app()->db->schema->getTables();
// clear the cache of all loaded tables
Yii::app()->db->schema->refresh();
}
catch(Exception $e)
{
$oTransaction->rollback();
// Activate schema caching
$oDB->schemaCachingDuration=3600;
// Load all tables of the application in the schema
Yii::app()->db->schema->getTables();
// clear the cache of all loaded tables
Yii::app()->db->schema->refresh();
echo '
'.$oLang->gT('An non-recoverable error happened during the update. Error details:')."".htmlspecialchars($e->getMessage()).'
';
return false;
}
fixLanguageConsistencyAllSurveys();
echo '
'.sprintf($oLang->gT('Database update finished (%s)'),date('Y-m-d H:i:s')).'
';
return true;
}
function upgradeSurveys177()
{
$sSurveyQuery = "SELECT * FROM {{surveys_languagesettings}}";
$oSurveyResult = Yii::app()->db->createCommand($sSurveyQuery)->queryAll();
foreach ( $oSurveyResult as $aSurveyRow )
{
$aAttributeDescriptions=@unserialize($aSurveyRow['surveyls_attributecaptions']);
if ($aAttributeDescriptions==NULL) $aAttributeDescriptions=array();
$sSurveyLSUpdateQuery= "update {{surveys_languagesettings}} set surveyls_attributecaptions=:attributecaptions where surveyls_survey_id=".$aSurveyRow['surveyls_survey_id'].' and surveyls_language=:language';
Yii::app()->db->createCommand($sSurveyLSUpdateQuery)->execute(array(':language'=>$aSurveyRow['surveyls_language'],':attributecaptions'=>json_encode($aAttributeDescriptions)));
}
$sSurveyQuery = "SELECT * FROM {{surveys}}";
$oSurveyResult = Yii::app()->db->createCommand($sSurveyQuery)->queryAll();
foreach ( $oSurveyResult as $aSurveyRow )
{
$aAttributeDescriptions=@unserialize($aSurveyRow['attributedescriptions']);
if ($aAttributeDescriptions==NULL) $aAttributeDescriptions=array();
$sSurveyUpdateQuery= "update {{surveys}} set attributedescriptions=:attributedescriptions where sid=".$aSurveyRow['sid'];
Yii::app()->db->createCommand($sSurveyUpdateQuery)->execute(array(':attributedescriptions'=>json_encode($aAttributeDescriptions)));
}
}
/**
* This function removes the old CPDB fields in token tables
* replaces them with standard attribute fields
* and records the mapping information in the attributedescription field in the survey table instead
*/
function upgradeTokens176()
{
$arSurveys = Survey::model()->findAll();
// Fix any active token tables
foreach ( $arSurveys as $arSurvey )
{
$sTokenTableName='tokens_'.$arSurvey->sid;
if (tableExists($sTokenTableName))
{
$aColumnNames=$aColumnNamesIterator=Yii::app()->db->schema->getTable('{{'.$sTokenTableName.'}}')->columnNames;
$aAttributes = $arSurvey->tokenAttributes;
foreach($aColumnNamesIterator as $sColumnName)
{
// Check if an old atttribute_cpdb column exists in that token table
if (strpos($sColumnName,'attribute_cpdb')!==false)
{
$i=1;
// Look for a an attribute ID that is available
while (in_array('attribute_'.$i,$aColumnNames)) $i++;
$sNewName='attribute_'.$i;
$aColumnNames[]=$sNewName;
Yii::app()->db->createCommand()->renameColumn('{{'.$sTokenTableName.'}}',$sColumnName,$sNewName);
// Update attribute descriptions with the new mapping
if (isset($aAttributes[$sColumnName]))
{
$aAttributes[$sNewName]['cpdbmap']=substr($sColumnName,15);
unset($aAttributes[$sColumnName]);
}
}
}
Survey::model()->updateByPk($arSurvey->sid, array('attributedescriptions' => serialize($aAttributes)));
}
}
// Now fix all 'old' token tables
$aTables = dbGetTablesLike("%old_tokens%");
foreach ( $aTables as $sTable )
{
$aColumnNames=$aColumnNamesIterator=Yii::app()->db->schema->getTable($sTable)->columnNames;
foreach($aColumnNamesIterator as $sColumnName)
{
// Check if an old atttribute_cpdb column exists in that token table
if (strpos($sColumnName,'attribute_cpdb')!==false)
{
$i=1;
// Look for a an attribute ID that is available
while (in_array('attribute_'.$i,$aColumnNames)) $i++;
$sNewName='attribute_'.$i;
$aColumnNames[]=$sNewName;
Yii::app()->db->createCommand()->renameColumn($sTable,$sColumnName,$sNewName);
}
}
}
}
function upgradeCPDBAttributeDefaultNames173()
{
$sQuery = "SELECT attribute_id,attribute_name,COALESCE(lang,NULL)
FROM {{participant_attribute_names_lang}}
group by attribute_id, attribute_name, lang
order by attribute_id";
$oResult = Yii::app()->db->createCommand($sQuery)->queryAll();
foreach ( $oResult as $aAttribute )
{
Yii::app()->db->createCommand()->update('{{participant_attribute_names}}',array('defaultname'=>substr($aAttribute['attribute_name'],0,50)),"attribute_id={$aAttribute['attribute_id']}");
}
}
/**
* Converts global permissions from users table to the new permission system,
* and converts template permissions from template_rights to new permission table
*/
function upgradePermissions166()
{
Permission::model()->refreshMetaData(); // Needed because otherwise Yii tries to use the outdate permission schema for the permission table
$oUsers=User::model()->findAll();
foreach($oUsers as $oUser)
{
if ($oUser->create_survey==1)
{
$oPermission=new Permission;
$oPermission->entity_id=0;
$oPermission->entity='global';
$oPermission->uid=$oUser->uid;
$oPermission->permission='surveys';
$oPermission->create_p=1;
$oPermission->save();
}
if ($oUser->create_user==1 || $oUser->delete_user==1)
{
$oPermission=new Permission;
$oPermission->entity_id=0;
$oPermission->entity='global';
$oPermission->uid=$oUser->uid;
$oPermission->permission='users';
$oPermission->create_p=$oUser->create_user;
$oPermission->delete_p=$oUser->delete_user;
$oPermission->update_p=1;
$oPermission->read_p=1;
$oPermission->save();
}
if ($oUser->superadmin==1)
{
$oPermission=new Permission;
$oPermission->entity_id=0;
$oPermission->entity='global';
$oPermission->uid=$oUser->uid;
$oPermission->permission='superadmin';
$oPermission->read_p=1;
$oPermission->save();
}
if ($oUser->configurator==1)
{
$oPermission=new Permission;
$oPermission->entity_id=0;
$oPermission->entity='global';
$oPermission->uid=$oUser->uid;
$oPermission->permission='settings';
$oPermission->update_p=1;
$oPermission->read_p=1;
$oPermission->save();
}
if ($oUser->manage_template==1)
{
$oPermission=new Permission;
$oPermission->entity_id=0;
$oPermission->entity='global';
$oPermission->uid=$oUser->uid;
$oPermission->permission='templates';
$oPermission->create_p=1;
$oPermission->read_p=1;
$oPermission->update_p=1;
$oPermission->delete_p=1;
$oPermission->import_p=1;
$oPermission->export_p=1;
$oPermission->save();
}
if ($oUser->manage_label==1)
{
$oPermission=new Permission;
$oPermission->entity_id=0;
$oPermission->entity='global';
$oPermission->uid=$oUser->uid;
$oPermission->permission='labelsets';
$oPermission->create_p=1;
$oPermission->read_p=1;
$oPermission->update_p=1;
$oPermission->delete_p=1;
$oPermission->import_p=1;
$oPermission->export_p=1;
$oPermission->save();
}
if ($oUser->participant_panel==1)
{
$oPermission=new Permission;
$oPermission->entity_id=0;
$oPermission->entity='global';
$oPermission->uid=$oUser->uid;
$oPermission->permission='participantpanel';
$oPermission->create_p=1;
$oPermission->save();
}
}
$sQuery = "SELECT * FROM {{templates_rights}}";
$oResult = Yii::app()->db->createCommand($sQuery)->queryAll();
foreach ( $oResult as $aRow )
{
$oPermission=new Permission;
$oPermission->entity_id=0;
$oPermission->entity='template';
$oPermission->uid=$aRow['uid'];
$oPermission->permission=$aRow['folder'];
$oPermission->read_p=1;
$oPermission->save();
}
}
function upgradeSurveys156()
{
global $modifyoutput;
$sSurveyQuery = "SELECT * FROM {{surveys_languagesettings}}";
$oSurveyResult = Yii::app()->db->createCommand($sSurveyQuery)->queryAll();
foreach ( $oSurveyResult as $aSurveyRow )
{
Yii::app()->loadLibrary('Limesurvey_lang',array("langcode"=>$aSurveyRow['surveyls_language']));
$oLanguage = Yii::app()->lang;
$aDefaultTexts=templateDefaultTexts($oLanguage,'unescaped');
unset($oLanguage);
if (trim(strip_tags($aSurveyRow['surveyls_email_confirm'])) == '')
{
$sSurveyUpdateQuery= "update {{surveys}} set sendconfirmation='N' where sid=".$aSurveyRow['surveyls_survey_id'];
Yii::app()->db->createCommand($sSurveyUpdateQuery)->execute();
$aValues=array('surveyls_email_confirm_subj'=>$aDefaultTexts['confirmation_subject'],
'surveyls_email_confirm'=>$aDefaultTexts['confirmation']);
SurveyLanguageSetting::model()->updateAll($aValues,'surveyls_survey_id=:sid',array(':sid'=>$aSurveyRow['surveyls_survey_id']));
}
}
}
// Add the usesleft field to all existing token tables
function upgradeTokens148()
{
$aTables = dbGetTablesLike("tokens%");
$sVarchar=Yii::app()->getConfig('varchar');
foreach ( $aTables as $sTable )
{
addColumn($sTable, 'participant_id', "{$sVarchar}(50)");
addColumn($sTable, 'blacklisted', "{$sVarchar}(17)");
}
}
function upgradeQuestionAttributes148()
{
global $modifyoutput;
$sSurveyQuery = "SELECT sid FROM {{surveys}}";
$oSurveyResult = dbExecuteAssoc($sSurveyQuery);
foreach ( $oSurveyResult->readAll() as $aSurveyRow)
{
$iSurveyID=$aSurveyRow['sid'];
$aLanguages=array_merge(array(Survey::model()->findByPk($iSurveyID)->language), Survey::model()->findByPk($iSurveyID)->additionalLanguages);
$sAttributeQuery = "select q.qid,attribute,value from {{question_attributes}} qa , {{questions}} q where q.qid=qa.qid and sid={$iSurveyID}";
$oAttributeResult = dbExecuteAssoc($sAttributeQuery);
$aAllAttributes=questionAttributes(true);
foreach ( $oAttributeResult->readAll() as $aAttributeRow)
{
if (isset($aAllAttributes[$aAttributeRow['attribute']]['i18n']) && $aAllAttributes[$aAttributeRow['attribute']]['i18n'])
{
Yii::app()->db->createCommand("delete from {{question_attributes}} where qid={$aAttributeRow['qid']} and attribute='{$aAttributeRow['attribute']}'")->execute();
foreach ($aLanguages as $sLanguage)
{
$sAttributeInsertQuery="insert into {{question_attributes}} (qid,attribute,value,language) VALUES({$aAttributeRow['qid']},'{$aAttributeRow['attribute']}','{$aAttributeRow['value']}','{$sLanguage}' )";
modifyDatabase("",$sAttributeInsertQuery); echo $modifyoutput; flush();@ob_flush();
}
}
}
}
}
function upgradeSurveyTimings146()
{
$aTables = dbGetTablesLike("%timings");
foreach ($aTables as $sTable) {
Yii::app()->db->createCommand()->renameColumn($sTable,'interviewTime','interviewtime');
}
}
// Add the usesleft field to all existing token tables
function upgradeTokens145()
{
$aTables = dbGetTablesLike("tokens%");
foreach ( $aTables as $sTable )
{
addColumn($sTable,'usesleft',"integer NOT NULL default 1");
Yii::app()->db->createCommand()->update($sTable,array('usesleft'=>'0'),"completed<>'N'");
}
}
function upgradeSurveys145()
{
global $modifyoutputt;
$sSurveyQuery = "SELECT * FROM {{surveys}} where notification<>'0'";
$oSurveyResult = dbExecuteAssoc($sSurveyQuery);
foreach ( $oSurveyResult->readAll() as $aSurveyRow )
{
if ($aSurveyRow['notification']=='1' && trim($aSurveyRow['adminemail'])!='')
{
$aEmailAddresses=explode(';',$aSurveyRow['adminemail']);
$sAdminEmailAddress=$aEmailAddresses[0];
$sEmailnNotificationAddresses=implode(';',$aEmailAddresses);
$sSurveyUpdateQuery= "update {{surveys}} set adminemail='{$sAdminEmailAddress}', emailnotificationto='{$sEmailnNotificationAddresses}' where sid=".$aSurveyRow['sid'];
Yii::app()->db->createCommand($sSurveyUpdateQuery)->execute();
}
else
{
$aEmailAddresses=explode(';',$aSurveyRow['adminemail']);
$sAdminEmailAddress=$aEmailAddresses[0];
$sEmailDetailedNotificationAddresses=implode(';',$aEmailAddresses);
if (trim($aSurveyRow['emailresponseto'])!='')
{
$sEmailDetailedNotificationAddresses=$sEmailDetailedNotificationAddresses.';'.trim($aSurveyRow['emailresponseto']);
}
$sSurveyUpdateQuery= "update {{surveys}} set adminemail='{$sAdminEmailAddress}', emailnotificationto='{$sEmailDetailedNotificationAddresses}' where sid=".$aSurveyRow['sid'];
Yii::app()->db->createCommand($sSurveyUpdateQuery)->execute();
}
}
$sSurveyQuery = "SELECT * FROM {{surveys_languagesettings}}";
$oSurveyResult = Yii::app()->db->createCommand($sSurveyQuery)->queryAll();
foreach ( $oSurveyResult as $aSurveyRow )
{
$oLanguage = new Limesurvey_lang($aSurveyRow['surveyls_language']);
$oLanguage = Yii::app()->lang;
$aDefaultTexts=templateDefaultTexts($oLanguage,'unescaped');
unset($oLanguage);
$aDefaultTexts['admin_detailed_notification']=$aDefaultTexts['admin_detailed_notification'].$aDefaultTexts['admin_detailed_notification_css'];
$sSurveyUpdateQuery = "update {{surveys_languagesettings}} set
email_admin_responses_subj=".$aDefaultTexts['admin_detailed_notification_subject'].",
email_admin_responses=".$aDefaultTexts['admin_detailed_notification'].",
email_admin_notification_subj=".$aDefaultTexts['admin_notification_subject'].",
email_admin_notification=".$aDefaultTexts['admin_notification']."
where surveyls_survey_id=".$aSurveyRow['surveyls_survey_id'];
Yii::app()->db->createCommand()->update('{{surveys_languagesettings}}',array('email_admin_responses_subj'=>$aDefaultTexts['admin_detailed_notification_subject'],
'email_admin_responses'=>$aDefaultTexts['admin_detailed_notification'],
'email_admin_notification_subj'=>$aDefaultTexts['admin_notification_subject'],
'email_admin_notification'=>$aDefaultTexts['admin_notification']
),"surveyls_survey_id={$aSurveyRow['surveyls_survey_id']}");
}
}
function upgradeSurveyPermissions145()
{
$sPermissionQuery = "SELECT * FROM {{surveys_rights}}";
$oPermissionResult = Yii::app()->db->createCommand($sPermissionQuery)->queryAll();
if (empty($oPermissionResult)) {return "Database Error";}
else
{
$sTableName = '{{survey_permissions}}';
foreach ( $oPermissionResult as $aPermissionRow )
{
$sPermissionInsertQuery=Yii::app()->db->createCommand()->insert($sTableName, array('permission'=>'assessments',
'create_p'=>$aPermissionRow['define_questions'],
'read_p'=>$aPermissionRow['define_questions'],
'update_p'=>$aPermissionRow['define_questions'],
'delete_p'=>$aPermissionRow['define_questions'],
'sid'=>$aPermissionRow['sid'],
'uid'=>$aPermissionRow['uid']));
$sPermissionInsertQuery=Yii::app()->db->createCommand()->insert($sTableName,array('permission'=>'quotas',
'create_p'=>$aPermissionRow['define_questions'],
'read_p'=>$aPermissionRow['define_questions'],
'update_p'=>$aPermissionRow['define_questions'],
'delete_p'=>$aPermissionRow['define_questions'],
'sid'=>$aPermissionRow['sid'],
'uid'=>$aPermissionRow['uid']));
$sPermissionInsertQuery=Yii::app()->db->createCommand()->insert($sTableName,array('permission'=>'responses',
'create_p'=>$aPermissionRow['browse_response'],
'read_p'=>$aPermissionRow['browse_response'],
'update_p'=>$aPermissionRow['browse_response'],
'delete_p'=>$aPermissionRow['delete_survey'],
'export_p'=>$aPermissionRow['export'],
'import_p'=>$aPermissionRow['browse_response'],
'sid'=>$aPermissionRow['sid'],
'uid'=>$aPermissionRow['uid']));
$sPermissionInsertQuery=Yii::app()->db->createCommand()->insert($sTableName,array('permission'=>'statistics',
'read_p'=>$aPermissionRow['browse_response'],
'sid'=>$aPermissionRow['sid'],
'uid'=>$aPermissionRow['uid']));
$sPermissionInsertQuery=Yii::app()->db->createCommand()->insert($sTableName,array('permission'=>'survey',
'read_p'=>1,
'delete_p'=>$aPermissionRow['delete_survey'],
'sid'=>$aPermissionRow['sid'],
'uid'=>$aPermissionRow['uid']));
$sPermissionInsertQuery=Yii::app()->db->createCommand()->insert($sTableName,array('permission'=>'surveyactivation',
'update_p'=>$aPermissionRow['activate_survey'],
'sid'=>$aPermissionRow['sid'],
'uid'=>$aPermissionRow['uid']));
$sPermissionInsertQuery=Yii::app()->db->createCommand()->insert($sTableName,array('permission'=>'surveycontent',
'create_p'=>$aPermissionRow['define_questions'],
'read_p'=>$aPermissionRow['define_questions'],
'update_p'=>$aPermissionRow['define_questions'],
'delete_p'=>$aPermissionRow['define_questions'],
'export_p'=>$aPermissionRow['export'],
'import_p'=>$aPermissionRow['define_questions'],
'sid'=>$aPermissionRow['sid'],
'uid'=>$aPermissionRow['uid']));
$sPermissionInsertQuery=Yii::app()->db->createCommand()->insert($sTableName,array('permission'=>'surveylocale',
'read_p'=>$aPermissionRow['edit_survey_property'],
'update_p'=>$aPermissionRow['edit_survey_property'],
'sid'=>$aPermissionRow['sid'],
'uid'=>$aPermissionRow['uid']));
$sPermissionInsertQuery=Yii::app()->db->createCommand()->insert($sTableName,array('permission'=>'surveysettings',
'read_p'=>$aPermissionRow['edit_survey_property'],
'update_p'=>$aPermissionRow['edit_survey_property'],
'sid'=>$aPermissionRow['sid'],
'uid'=>$aPermissionRow['uid']));
$sPermissionInsertQuery=Yii::app()->db->createCommand()->insert($sTableName,array('permission'=>'tokens',
'create_p'=>$aPermissionRow['activate_survey'],
'read_p'=>$aPermissionRow['activate_survey'],
'update_p'=>$aPermissionRow['activate_survey'],
'delete_p'=>$aPermissionRow['activate_survey'],
'export_p'=>$aPermissionRow['export'],
'import_p'=>$aPermissionRow['activate_survey'],
'sid'=>$aPermissionRow['sid'],
'uid'=>$aPermissionRow['uid']));
}
}
}
function upgradeTables143()
{
global $modifyoutput;
$aQIDReplacements=array();
$answerquery = "select a.*, q.sid, q.gid from {{answers}} a,{{questions}} q where a.qid=q.qid and q.type in ('L','O','!') and a.default_value='Y'";
$answerresult = Yii::app()->db->createCommand($answerquery)->queryAll();
foreach ( $answerresult as $row )
{
modifyDatabase("","INSERT INTO {{defaultvalues}} (qid, scale_id,language,specialtype,defaultvalue) VALUES ({$row['qid']},0,".dbQuoteAll($row['language']).",'',".dbQuoteAll($row['code']).")"); echo $modifyoutput; flush();@ob_flush();
}
// Convert answers to subquestions
$answerquery = "select a.*, q.sid, q.gid, q.type from {{answers}} a,{{questions}} q where a.qid=q.qid and a.language=q.language and q.type in ('1','A','B','C','E','F','H','K',';',':','M','P','Q')";
$answerresult = Yii::app()->db->createCommand($answerquery)->queryAll();
foreach ( $answerresult as $row )
{
$aInsert=array();
if (isset($aQIDReplacements[$row['qid'].'_'.$row['code']]))
{
$aInsert['qid']=$aQIDReplacements[$row['qid'].'_'.$row['code']];
}
$aInsert['sid']=$row['sid'];
$aInsert['gid']=$row['gid'];
$aInsert['parent_qid']=$row['qid'];
$aInsert['type']=$row['type'];
$aInsert['title']=$row['code'];
$aInsert['question']=$row['answer'];
$aInsert['question_order']=$row['sortorder'];
$aInsert['language']=$row['language'];
$iLastInsertID=Question::model()->insertRecords($aInsert);
if (!isset($aInsert['qid']))
{
$aQIDReplacements[$row['qid'].'_'.$row['code']]=$iLastInsertID;
$iSaveSQID=$aQIDReplacements[$row['qid'].'_'.$row['code']];
}
else
{
$iSaveSQID=$aInsert['qid'];
}
if (($row['type']=='M' || $row['type']=='P') && $row['default_value']=='Y')
{
modifyDatabase("","INSERT INTO {{defaultvalues}} (qid, sqid, scale_id,language,specialtype,defaultvalue) VALUES ({$row['qid']},{$iSaveSQID},0,".dbQuoteAll($row['language']).",'','Y')"); echo $modifyoutput; flush();@ob_flush();
}
}
// Sanitize data
$sDBDriverName=Yii::app()->db->getDriverName();
if ($sDBDriverName=='pgsql')
{
modifyDatabase("","delete from {{answers}} USING {{questions}} WHERE {{answers}}.qid={{questions}}.qid AND {{questions}}.type in ('1','F','H','M','P','W','Z')"); echo $modifyoutput; flush();@ob_flush();
}
else
{
modifyDatabase("","delete {{answers}} from {{answers}} LEFT join {{questions}} ON {{answers}}.qid={{questions}}.qid where {{questions}}.type in ('1','F','H','M','P','W','Z')"); echo $modifyoutput; flush();@ob_flush();
}
// Convert labels to answers
$answerquery = "select qid ,type ,lid ,lid1, language from {{questions}} where parent_qid=0 and type in ('1','F','H','M','P','W','Z')";
$answerresult = Yii::app()->db->createCommand($answerquery)->queryAll();
foreach ( $answerresult as $row )
{
$labelquery="Select * from {{labels}} where lid={$row['lid']} and language=".dbQuoteAll($row['language']);
$labelresult = Yii::app()->db->createCommand($labelquery)->queryAll();
foreach ( $labelresult as $lrow )
{
modifyDatabase("","INSERT INTO {{answers}} (qid, code, answer, sortorder, language, assessment_value) VALUES ({$row['qid']},".dbQuoteAll($lrow['code']).",".dbQuoteAll($lrow['title']).",{$lrow['sortorder']},".dbQuoteAll($lrow['language']).",{$lrow['assessment_value']})"); echo $modifyoutput; flush();@ob_flush();
//$labelids[]
}
if ($row['type']=='1')
{
$labelquery="Select * from {{labels}} where lid={$row['lid1']} and language=".dbQuoteAll($row['language']);
$labelresult = Yii::app()->db->createCommand($labelquery)->queryAll();
foreach ( $labelresult as $lrow )
{
modifyDatabase("","INSERT INTO {{answers}} (qid, code, answer, sortorder, language, scale_id, assessment_value) VALUES ({$row['qid']},".dbQuoteAll($lrow['code']).",".dbQuoteAll($lrow['title']).",{$lrow['sortorder']},".dbQuoteAll($lrow['language']).",1,{$lrow['assessment_value']})"); echo $modifyoutput; flush();@ob_flush();
}
}
}
// Convert labels to subquestions
$answerquery = "select * from {{questions}} where parent_qid=0 and type in (';',':')";
$answerresult = Yii::app()->db->createCommand($answerquery)->queryAll();
foreach ( $answerresult as $row )
{
$labelquery="Select * from {{labels}} where lid={$row['lid']} and language=".dbQuoteAll($row['language']);
$labelresult = Yii::app()->db->createCommand($labelquery)->queryAll();
foreach ( $labelresult as $lrow )
{
$aInsert=array();
if (isset($aQIDReplacements[$row['qid'].'_'.$lrow['code'].'_1']))
{
$aInsert['qid']=$aQIDReplacements[$row['qid'].'_'.$lrow['code'].'_1'];
}
$aInsert['sid']=$row['sid'];
$aInsert['gid']=$row['gid'];
$aInsert['parent_qid']=$row['qid'];
$aInsert['type']=$row['type'];
$aInsert['title']=$lrow['code'];
$aInsert['question']=$lrow['title'];
$aInsert['question_order']=$lrow['sortorder'];
$aInsert['language']=$lrow['language'];
$aInsert['scale_id']=1;
$iLastInsertID=Question::model()->insertRecords($aInsert);
if (isset($aInsert['qid']))
{
$aQIDReplacements[$row['qid'].'_'.$lrow['code'].'_1']=$iLastInsertID;
}
}
}
$updatequery = "update {{questions}} set type='!' where type='W'";
modifyDatabase("",$updatequery); echo $modifyoutput; flush();@ob_flush();
$updatequery = "update {{questions}} set type='L' where type='Z'";
modifyDatabase("",$updatequery); echo $modifyoutput; flush();@ob_flush();
// Now move all non-standard templates to the /upload dir
$usertemplaterootdir=Yii::app()->getConfig("usertemplaterootdir");
$standardtemplaterootdir = Yii::app()->getConfig('standardtemplaterootdir');
if (!$usertemplaterootdir) {die("getTemplateList() no template directory");}
if ($handle = opendir($standardtemplaterootdir))
{
while (false !== ($file = readdir($handle)))
{
if (!is_file("$standardtemplaterootdir/$file") && $file != "." && $file != ".." && $file!=".svn" && !isStandardTemplate($file))
{
if (!rename($standardtemplaterootdir.DIRECTORY_SEPARATOR.$file,$usertemplaterootdir.DIRECTORY_SEPARATOR.$file))
{
echo "There was a problem moving directory '".$standardtemplaterootdir.DIRECTORY_SEPARATOR.$file."' to '".$usertemplaterootdir.DIRECTORY_SEPARATOR.$file."' due to missing permissions. Please do this manually.
";
};
}
}
closedir($handle);
}
}
function upgradeQuestionAttributes142()
{
global $modifyoutput;
$attributequery="Select qid from {{question_attributes}} where attribute='exclude_all_other' group by qid having count(qid)>1 ";
$questionids = Yii::app()->db->createCommand($attributequery)->queryRow();
if(!is_array($questionids)) { return "Database Error"; }
else
{
foreach ($questionids as $questionid)
{
//Select all affected question attributes
$attributevalues=Yii::app()->db->createCommand("SELECT value from {{question_attributes}} where attribute='exclude_all_other' and qid=".$questionid)->queryColumn();
modifyDatabase("","delete from {{question_attributes}} where attribute='exclude_all_other' and qid=".$questionid); echo $modifyoutput; flush();@ob_flush();
$record['value']=implode(';',$attributevalues);
$record['attribute']='exclude_all_other';
$record['qid']=$questionid;
Yii::app()->db->createCommand()->insert('{{question_attributes}}', $record)->execute();
}
}
}
function upgradeSurveyTables139()
{
global $modifyoutput;
$dbprefix = Yii::app()->db->tablePrefix;
$aTables = dbGetTablesLike("survey\_%");
foreach ( $aTables as $sTable )
{
addColumn($sTable,'lastpage','integer');
}
}
// Add the reminders tracking fields
function upgradeTokenTables134()
{
global $modifyoutput;
$aTables = dbGetTablesLike("tokens%");
foreach ( $aTables as $sTable )
{
addColumn($sTable,'validfrom',"datetime");
addColumn($sTable,'validuntil',"datetime");
}
}
// Add the reminders tracking fields
function upgradeTokens128()
{
global $modifyoutput;
$sVarchar=Yii::app()->getConfig('varchar');
$aTables = dbGetTablesLike("tokens%");
foreach ( $aTables as $sTable )
{
addColumn($sTable,'remindersent',"{$sVarchar}(17) DEFAULT 'N'");
addColumn($sTable,'remindercount',"integer DEFAULT '0'");
}
}
function fixMySQLCollations()
{
global $modifyoutput;
$sql = 'SHOW TABLE STATUS';
$dbprefix = Yii::app()->db->tablePrefix;
$result = Yii::app()->db->createCommand($sql)->queryAll();
foreach ( $result as $tables ) {
// Loop through all tables in this database
$table = $tables['Name'];
$tablecollation=$tables['Collation'];
if (strpos($table,'old_')===false && ($dbprefix=='' || ($dbprefix!='' && strpos($table,$dbprefix)!==false)))
{
if ($tablecollation!='utf8_unicode_ci')
{
modifyDatabase("","ALTER TABLE $table COLLATE utf8_unicode_ci");
echo $modifyoutput; flush();@ob_flush();
}
# Now loop through all the fields within this table
$result2 = Yii::app()->db->createCommand("SHOW FULL COLUMNS FROM ".$table)->queryAll();
foreach ( $result2 as $column )
{
if ($column['Collation']!= 'utf8_unicode_ci' )
{
$field_name = $column['Field'];
$field_type = $column['Type'];
$field_default = $column['Default'];
if ($field_default!='NULL') {$field_default="'".$field_default."'";}
# Change text based fields
$skipped_field_types = array('char', 'text', 'enum', 'set');
foreach ( $skipped_field_types as $type )
{
if ( strpos($field_type, $type) !== false )
{
$modstatement="ALTER TABLE $table CHANGE `$field_name` `$field_name` $field_type CHARACTER SET utf8 COLLATE utf8_unicode_ci";
if ($type!='text') {$modstatement.=" DEFAULT $field_default";}
modifyDatabase("",$modstatement);
echo $modifyoutput; flush();@ob_flush();
}
}
}
}
}
}
}
function upgradeSurveyTables126()
{
$surveyidquery = "SELECT sid FROM {{surveys}} WHERE active='Y' and datestamp='Y'";
$surveyidresult = Yii::app()->db->createCommand($surveyidquery)->queryAll();
if (!$surveyidresult) {return "Database Error";}
else
{
foreach ( $surveyidresult as $sv )
{
addColumn('{{survey_'.$sv['sid'].'}}','startdate','datetime');
}
}
}
function upgradeTokenTables126()
{
global $modifyoutput;
$sVarchar=Yii::app()->getConfig('varchar');
$aTables = dbGetTablesLike("tokens%");
foreach ( $aTables as $sTable )
{
Yii::app()->db->createCommand()->alterColumn($sTable,'token',"{$sVarchar}(15)");
addColumn($sTable,'emailstatus',"{$sVarchar}(300) NOT NULL DEFAULT 'OK'");
}
}
function alterLanguageCode($sOldLanguageCode,$sNewLanguageCode)
{
Yii::app()->db->createCommand()->update('{{answers}}',array('language'=>$sNewLanguageCode),'language=:lang',array(':lang'=>$sOldLanguageCode));
Yii::app()->db->createCommand()->update('{{questions}}',array('language'=>$sNewLanguageCode),'language=:lang',array(':lang'=>$sOldLanguageCode));
Yii::app()->db->createCommand()->update('{{groups}}',array('language'=>$sNewLanguageCode),'language=:lang',array(':lang'=>$sOldLanguageCode));
Yii::app()->db->createCommand()->update('{{labels}}',array('language'=>$sNewLanguageCode),'language=:lang',array(':lang'=>$sOldLanguageCode));
Yii::app()->db->createCommand()->update('{{surveys}}',array('language'=>$sNewLanguageCode),'language=:lang',array(':lang'=>$sOldLanguageCode));
Yii::app()->db->createCommand()->update('{{surveys_languagesettings}}',array('surveyls_language'=>$sNewLanguageCode),'surveyls_language=:lang',array(':lang'=>$sOldLanguageCode));
Yii::app()->db->createCommand()->update('{{users}}',array('lang'=>$sNewLanguageCode),'lang=:language',array(':language'=>$sOldLanguageCode));
$resultdata=Yii::app()->db->createCommand("select * from {{labelsets}}");
foreach ($resultdata->queryAll() as $datarow){
$aLanguages=explode(' ',$datarow['languages']);
foreach ($aLanguages as &$sLanguage)
{
if ($sLanguage==$sOldLanguageCode) $sLanguage=$sNewLanguageCode;
}
$toreplace=implode(' ',$aLanguages);
Yii::app()->db->createCommand()->update('{{labelsets}}',array('languages'=>$toreplace),'lid=:lid',array(':lid'=>$datarow['lid']));
}
$resultdata=Yii::app()->db->createCommand("select * from {{surveys}}");
foreach ($resultdata->queryAll() as $datarow){
$aLanguages=explode(' ',$datarow['additional_languages']);
foreach ($aLanguages as &$sLanguage)
{
if ($sLanguage==$sOldLanguageCode) $sLanguage=$sNewLanguageCode;
}
$toreplace=implode(' ',$aLanguages);
Yii::app()->db->createCommand()->update('{{surveys}}',array('additional_languages'=>$toreplace),'sid=:sid',array(':sid'=>$datarow['sid']));
}
}
function addPrimaryKey($sTablename, $aColumns)
{
Yii::app()->db->createCommand("ALTER TABLE {{".$sTablename."}} ADD PRIMARY KEY (".implode(',',$aColumns).")")->execute();
}
function dropPrimaryKey($sTablename)
{
$sDBDriverName=Yii::app()->db->getDriverName();
if ($sDBDriverName=='mysqli') $sDBDriverName='mysql';
if ($sDBDriverName=='sqlsrv' || $sDBDriverName=='dblib') $sDBDriverName='mssql';
global $modifyoutput;
switch ($sDBDriverName){
case 'mysql':
$sQuery="ALTER TABLE {{".$sTablename."}} DROP PRIMARY KEY";
Yii::app()->db->createCommand($sQuery)->execute();
break;
case 'pgsql':
case 'mssql':
$pkquery = "SELECT CONSTRAINT_NAME "
."FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS "
."WHERE (TABLE_NAME = '{{{$sTablename}}}') AND (CONSTRAINT_TYPE = 'PRIMARY KEY')";
$primarykey = Yii::app()->db->createCommand($pkquery)->queryRow(false);
if ($primarykey!==false)
{
$sQuery="ALTER TABLE {{".$sTablename."}} DROP CONSTRAINT ".$primarykey[0];
Yii::app()->db->createCommand($sQuery)->execute();
}
break;
default: die('Unkown database type');
}
// find out the constraint name of the old primary key
}
function fixLanguageConsistencyAllSurveys()
{
$surveyidquery = "SELECT sid,additional_languages FROM ".dbQuoteID('{{surveys}}');
$surveyidresult = Yii::app()->db->createCommand($surveyidquery)->queryAll();
foreach ( $surveyidresult as $sv )
{
fixLanguageConsistency($sv['sid'],$sv['additional_languages']);
}
}
function alterColumn($sTable, $sColumn, $sFieldType, $bAllowNull=true, $sDefault='NULL')
{
$sDBDriverName=Yii::app()->db->getDriverName();
if ($sDBDriverName=='mysqli') $sDBDriverName='mysql';
if ($sDBDriverName=='sqlsrv' || $sDBDriverName=='dblib') $sDBDriverName='mssql';
switch ($sDBDriverName){
case 'mysql':
$sType=$sFieldType;
if ($bAllowNull!=true)
{
$sType.=' NOT NULL';
}
if ($sDefault!='NULL')
{
$sType.=" DEFAULT '{$sDefault}'";
}
Yii::app()->db->createCommand()->alterColumn($sTable,$sColumn,$sType);
break;
case 'mssql':
dropDefaultValueMSSQL($sColumn,$sTable);
$sType=$sFieldType;
if ($sType=='text') {
$sType='varchar(max)';
}
if ($sType=='binary') {
$sType='text';
}
if ($bAllowNull!=true)
{
$sType.=' NOT NULL';
if ($sDefault!='NULL')
{
Yii::app()->db->createCommand("UPDATE {$sTable} SET [{$sColumn}]='{$sDefault}' where [{$sColumn}] is NULL;")->execute();
}
}
Yii::app()->db->createCommand()->alterColumn($sTable,$sColumn,$sType);
if ($sDefault!='NULL')
{
Yii::app()->db->createCommand("ALTER TABLE {$sTable} ADD default '{$sDefault}' FOR [{$sColumn}];")->execute();
}
break;
case 'pgsql':
$sType=$sFieldType;
Yii::app()->db->createCommand()->alterColumn($sTable,$sColumn,$sType);
try{ Yii::app()->db->createCommand("ALTER TABLE {$sTable} ALTER COLUMN {$sColumn} DROP DEFAULT")->execute();} catch(Exception $e) {};
try{ Yii::app()->db->createCommand("ALTER TABLE {$sTable} ALTER COLUMN {$sColumn} DROP NOT NULL")->execute();} catch(Exception $e) {};
if ($bAllowNull!=true)
{
Yii::app()->db->createCommand("ALTER TABLE {$sTable} ALTER COLUMN {$sColumn} SET NOT NULL")->execute();
}
if ($sDefault!='NULL')
{
Yii::app()->db->createCommand("ALTER TABLE {$sTable} ALTER COLUMN {$sColumn} SET DEFAULT '{$sDefault}'")->execute();
}
Yii::app()->db->createCommand()->alterColumn($sTable,$sColumn,$sType);
break;
default: die('Unkown database type');
}
}
function dropColumn($sTableName, $sColumnName)
{
$sDBDriverName=Yii::app()->db->getDriverName();
if ($sDBDriverName=='mysqli') $sDBDriverName='mysql';
if ($sDBDriverName=='sqlsrv' || $sDBDriverName=='dblib') $sDBDriverName='mssql';
if ($sDBDriverName=='mssql')
{
dropDefaultValueMSSQL($sColumnName,$sTableName);
}
Yii::app()->db->createCommand()->dropColumn($sTableName,$sColumnName);
}
function addColumn($sTableName, $sColumn, $sType)
{
$sDBDriverName=Yii::app()->db->getDriverName();
if ($sDBDriverName=='mysqli') $sDBDriverName='mysql';
if ($sDBDriverName=='sqlsrv' || $sDBDriverName=='dblib') $sDBDriverName='mssql';
if ($sDBDriverName=='mssql')
{
$sType=str_replace('text','varchar(max)',$sType);
$sType=str_replace('binary','text',$sType);
}
Yii::app()->db->createCommand()->addColumn($sTableName,$sColumn,$sType);
}
function setTransactionBookmark($sBookmark='limesurvey')
{
$sDBDriverName=Yii::app()->db->getDriverName();
if ($sDBDriverName=='pgsql')
{
Yii::app()->db->createCommand("SAVEPOINT {$sBookmark};")->execute();
}
}
function rollBackToTransactionBookmark($sBookmark='limesurvey')
{
$sDBDriverName=Yii::app()->db->getDriverName();
if ($sDBDriverName=='pgsql')
{
Yii::app()->db->createCommand("ROLLBACK TO SAVEPOINT {$sBookmark};")->execute();
}
}
function dropDefaultValueMSSQL($fieldname, $tablename)
{
// find out the name of the default constraint
// Did I already mention that this is the most suckiest thing I have ever seen in MSSQL database?
$dfquery ="SELECT c_obj.name AS constraint_name
FROM sys.sysobjects AS c_obj INNER JOIN
sys.sysobjects AS t_obj ON c_obj.parent_obj = t_obj.id INNER JOIN
sys.sysconstraints AS con ON c_obj.id = con.constid INNER JOIN
sys.syscolumns AS col ON t_obj.id = col.id AND con.colid = col.colid
WHERE (c_obj.xtype = 'D') AND (col.name = '$fieldname') AND (t_obj.name='{$tablename}')";
$defaultname = Yii::app()->db->createCommand($dfquery)->queryRow();
if ($defaultname!=false)
{
Yii::app()->db->createCommand("ALTER TABLE {$tablename} DROP CONSTRAINT {$defaultname['constraint_name']}")->execute();
}
}
/**
* This function drops a unique Key of an MSSQL database field by using the name of the field it lies upon and the table name
*
* @param mixed $sFieldName
* @param mixed $sTableName
*/
function dropUniqueKeyMSSQL($sFieldName, $sTableName)
{
$sQuery ="select TC.Constraint_Name, CC.Column_Name from information_schema.table_constraints TC
inner join information_schema.constraint_column_usage CC on TC.Constraint_Name = CC.Constraint_Name
where TC.constraint_type = 'Unique' and Column_name='{$sFieldName}' and TC.TABLE_NAME='{$sTableName}'";
$aUniqueKeyName = Yii::app()->db->createCommand($sQuery)->queryRow();
if ($aUniqueKeyName!=false)
{
Yii::app()->db->createCommand("ALTER TABLE {$sTableName} DROP CONSTRAINT {$aUniqueKeyName['Constraint_Name']}")->execute();
}
}
/**
* Returns the name of the DB Driver - used for other functions that make db specific calls
*
*/
function setsDBDriverName() {
$sDBDriverName=Yii::app()->db->getDriverName();
if ($sDBDriverName=='mysqli') $sDBDriverName='mysql';
if ($sDBDriverName=='sqlsrv' || $sDBDriverName=='dblib') $sDBDriverName='mssql';
return $sDBDriverName;
}
/**
* Special customisation because Yii is limited in its ability to handle varchar fields of lenghts other than 255 in a cross-db
* compatible way. see http://www.yiiframework.com/forum/index.php/topic/32289-cross-db-compatible-varchar-field-length-definitions/
* and http://github.com/yiisoft/yii/issues/765
*
* Note that it sets values for the config files for use later, and does not return any values.
* Access the set values using Yii::app()->getConfig('varchar') or Yii::app()->getConfigu('autoincrement');
*
* @param mixed $sDBDriverName The name of the db driver being used. If the parameter is forgotten, the
* function is capable of retrieving it itself.
*/
function setVarchar($sDBDriverName=null) {
if(!$sDBDriverName) {
$sDBDriverName=setsDBDriverName();
}
if ($sDBDriverName=='pgsql')
{
Yii::app()->setConfig('varchar',$sVarchar='character varying');
Yii::app()->setConfig('autoincrement', $sAutoIncrement='serial');
}
elseif ($sDBDriverName=='mssql')
{
Yii::app()->setConfig('varchar',$sVarchar='varchar');
Yii::app()->setConfig('autoincrement', $sAutoIncrement='integer NOT NULL IDENTITY (1,1)');
}
else
{
Yii::app()->setConfig('varchar',$sVarchar='varchar');
Yii::app()->setConfig('autoincrement', $sAutoIncrement='int(11) NOT NULL AUTO_INCREMENT');
}
}
function replaceTemplateJS(){
$usertemplaterootdir=Yii::app()->getConfig("usertemplaterootdir");
$clang = Yii::app()->lang;
if (!$usertemplaterootdir) {return false;}
$countstartpage=0;
$counterror=0;
$errortemplate=array();
if ($handle = opendir($usertemplaterootdir))
{
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != ".." && is_dir("{$usertemplaterootdir}/{$file}")) {
$fname = "$usertemplaterootdir/$file/startpage.pstpl";
if (is_file($fname))
{
if(is_writable($fname)){
$fhandle = fopen($fname,"r");
$content = fread($fhandle,filesize($fname));
$content = str_replace("", "{TEMPLATEJS}", $content);
$fhandle = fopen($fname,"w");
fwrite($fhandle,$content);
fclose($fhandle);
if(strpos($content, "{TEMPLATEJS}")===false)
{
$counterror++;
$errortemplate[]=$file;
}
}else{
$counterror++;
}
$countstartpage++;
}
}
}
closedir($handle);
}
if($counterror)
{
echo $clang->gT("Some user templates can not be updated, please add the placeholder {TEMPLATEJS} in your startpage.pstpl manually.");
echo "
";
echo $clang->gT("Template(s) to be verified :");
echo implode(",",$errortemplate);
}
else
{
if($countstartpage){
echo sprintf($clang->gT("All %s user templates updated."),$countstartpage);
}
}
if($counterror){
return false;
}else{
return $countstartpage;
}
}
/**
* Make sure all active tables have the right sized token field
*
* During a small period in the 2.0 cycle some survey tables got no
* token field or a token field that was too small. This patch makes
* sure all surveys that are not anonymous have a token field with the
* right size
*
* @return void
*/
function upgradeSurveyTables164()
{
$sQuery = "SELECT sid FROM {{surveys}} WHERE active='Y' and anonymized='N'";
$aResult = Yii::app()->db->createCommand($sQuery)->queryAll();
if (!$aResult) {
return "Database Error";
} else {
foreach ( $aResult as $sv )
{
$token = SurveyDynamic::model($sv['sid'])->getTableSchema()->getColumn('token');
if (is_null($token)) {
addColumn('{{survey_'.$sv['sid'].'}}','token','varchar(36)');
} elseif ($token->size < 36) {
alterColumn('{{survey_'.$sv['sid'].'}}','token','varchar(36)');
}
}
}
}