Skip to content

Commit

Permalink
Fixed issue #9470: Problems with case-sensitive token
Browse files Browse the repository at this point in the history
Dev Adjusted collation of response table token field too to prevent JOIN problems
  • Loading branch information
c-schmitz committed May 12, 2015
1 parent 086dfa7 commit 2e22fe5
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 9 deletions.
10 changes: 9 additions & 1 deletion application/helpers/admin/activate_helper.php
Expand Up @@ -337,7 +337,15 @@ function activateSurvey($iSurveyID, $simulate = false)
$createsurvey[$arow['fieldname']] = "string";
break;
case "token":
$createsurvey[$arow['fieldname']] = "string(36)";
// Specify case sensitive collations for the token
$sCollation='';
if (Yii::app()->db->driverName=='mysqli' | Yii::app()->db->driverName=='mysqli'){
$sCollation=" COLLATE 'utf8_bin'";
}
if (Yii::app()->db->driverName=='sqlsrv' | Yii::app()->db->driverName=='dblib' | Yii::app()->db->driverName=='mssql'){
$sCollation=" COLLATE SQL_Latin1_General_CP1_CS_AS";
}
$createsurvey[$arow['fieldname']] = 'string(35)'.$sCollation;
break;
case '*': // Equation
$createsurvey[$arow['fieldname']] = "text";
Expand Down
45 changes: 37 additions & 8 deletions application/helpers/update/updatedb_helper.php
Expand Up @@ -1301,6 +1301,7 @@ function db_upgrade_all($iOldDBVersion) {
if ($iOldDBVersion < 181)
{
upgradeTokenTables181();
upgradeSurveyTables181();
$oDB->createCommand()->update('{{settings_global}}',array('stg_value'=>181),"stg_name='DBVersion'");
}
$oTransaction->commit();
Expand Down Expand Up @@ -1329,30 +1330,60 @@ function db_upgrade_all($iOldDBVersion) {
}


function upgradeTokenTables181()
function upgradeSurveyTables181()
{
$oDB = Yii::app()->db;
$oSchema = Yii::app()->db->schema;
if(Yii::app()->db->driverName!='pgsql')
{
$surveyidresult = dbGetTablesLike("tokens%");
if ($surveyidresult)
$aTables = dbGetTablesLike("survey\_%");
if ($aTables)
{
foreach ( $surveyidresult as $sTableName )
foreach ( $aTables as $sTableName )
{
$oTableSchema=$oSchema->getTable($sTableName);
if (!in_array('token',$oTableSchema->columnNames)) continue; // No token field in this table
switch (Yii::app()->db->driverName){
case 'sqlsrv':
case 'dblib':
case 'mssql': dropSecondaryKeyMSSQL('token',$sTableName);
alterColumn($sTableName, 'token', "string(35)"); //COLLATE SQL_Latin1_General_CP1_CS_AS
alterColumn($sTableName, 'token', "string(35) COLLATE SQL_Latin1_General_CP1_CS_AS");
$oDB->createCommand()->createIndex("idx_{$sTableName}_".rand(1,50000), $sTableName,'token');
break;
case 'mysql':
case 'mysqli':
alterColumn($sTableName, 'token', "string(35) COLLATE 'utf8_bin'");
break;
default: die('Something went horribly wrong.');
default: die('Unknown database driver');

This comment has been minimized.

Copy link
@Shnoulle

Shnoulle May 12, 2015

Collaborator

case pgsql : break ;)
Sorry ... 2e22fe5#diff-fb32bdf0b19fecbe2d24aa8be88536e4R1337

}
}
}
}
}

function upgradeTokenTables181()
{
$oDB = Yii::app()->db;
$oSchema = Yii::app()->db->schema;
if(Yii::app()->db->driverName!='pgsql')
{
$aTables = dbGetTablesLike("tokens%");
if ($aTables)
{
foreach ( $aTables as $sTableName )
{
switch (Yii::app()->db->driverName){
case 'sqlsrv':
case 'dblib':
case 'mssql': dropSecondaryKeyMSSQL('token',$sTableName);
alterColumn($sTableName, 'token', "string(35) COLLATE SQL_Latin1_General_CP1_CS_AS");
$oDB->createCommand()->createIndex("idx_{$sTableName}_".rand(1,50000), $sTableName,'token');
break;
case 'mysql':
case 'mysqli':
alterColumn($sTableName, 'token', "string(35) COLLATE 'utf8_bin'");
break;
default: die('Unknown database driver');

This comment has been minimized.

Copy link
@Shnoulle

Shnoulle May 12, 2015

Collaborator

Same : case pgsql : break

}
}
}
Expand Down Expand Up @@ -1993,8 +2024,6 @@ function upgradeQuestionAttributes142()

function upgradeSurveyTables139()
{
global $modifyoutput;
$dbprefix = Yii::app()->getDb()->tablePrefix;
$aTables = dbGetTablesLike("survey\_%");
foreach ( $aTables as $sTable )
{
Expand Down

0 comments on commit 2e22fe5

Please sign in to comment.