MDL-29295 do not use strtok in dml and ddl layers

This prevents clobbering of internal pointer when code calling DML
uses strtok too. Unit test added to prevent future uses.
This commit is contained in:
Petr Skoda
2011-09-14 00:21:50 +02:00
committed by Eloy Lafuente (stronk7)
parent f3f329d1be
commit 2d1e165183
5 changed files with 32 additions and 8 deletions
+1 -1
View File
@@ -298,7 +298,7 @@ class mssql_sql_generator extends sql_generator {
$oldlength = $metac->max_length;
$olddecimals = empty($metac->scale) ? null : $metac->scale;
$oldnotnull = empty($metac->not_null) ? false : $metac->not_null;
$olddefault = empty($metac->has_default) ? null : strtok($metac->default_value, ':');
//$olddefault = empty($metac->has_default) ? null : strtok($metac->default_value, ':');
$typechanged = true; //By default, assume that the column type has changed
$lengthchanged = true; //By default, assume that the column length has changed
+3 -2
View File
@@ -615,7 +615,8 @@ class mssql_native_moodle_database extends moodle_database {
return $sql;
}
/// ok, we have verified sql statement with ? and correct number of params
$return = strtok($sql, '?');
$parts = explode('?', $sql);
$return = array_shift($parts);
foreach ($params as $param) {
if (is_bool($param)) {
$return .= (int)$param;
@@ -640,7 +641,7 @@ class mssql_native_moodle_database extends moodle_database {
$return .= "N'$param'";
}
$return .= strtok('?');
$return .= array_shift($parts);
}
return $return;
}
+3 -2
View File
@@ -666,7 +666,8 @@ class mysqli_native_moodle_database extends moodle_database {
return $sql;
}
/// ok, we have verified sql statement with ? and correct number of params
$return = strtok($sql, '?');
$parts = explode('?', $sql);
$return = array_shift($parts);
foreach ($params as $param) {
if (is_bool($param)) {
$return .= (int)$param;
@@ -680,7 +681,7 @@ class mysqli_native_moodle_database extends moodle_database {
$param = $this->mysqli->real_escape_string($param);
$return .= "'$param'";
}
$return .= strtok('?');
$return .= array_shift($parts);
}
return $return;
}
+22
View File
@@ -423,6 +423,28 @@ class dml_test extends UnitTestCase {
$this->assertIdentical(array_values($params), array_values($inparams));
}
public function test_strtok() {
// strtok was previously used by bound emulation, make sure it is not used any more
$DB = $this->tdb;
$dbman = $this->tdb->get_manager();
$table = $this->get_test_table();
$tablename = $table->getName();
$table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
$table->add_field('course', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
$table->add_field('name', XMLDB_TYPE_CHAR, '255', null, null, null, 'lala');
$table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
$dbman->create_table($table);
$str = 'a?b?c?d';
$this->assertIdentical(strtok($str, '?'), 'a');
$DB->get_records($tablename, array('id'=>1));
$this->assertIdentical(strtok('?'), 'b');
}
public function test_tweak_param_names() {
// Note the tweak_param_names() method is only available in the oracle driver,
// hence we look for expected results indirectly, by testing various DML methods
+3 -3
View File
@@ -696,8 +696,8 @@ class sqlsrv_native_moodle_database extends moodle_database {
return $sql;
}
/// ok, we have verified sql statement with ? and correct number of params
$return = strtok($sql, '?');
$parts = explode('?', $sql);
$return = array_shift($parts);
foreach ($params as $param) {
if (is_bool($param)) {
$return .= (int)$param;
@@ -717,7 +717,7 @@ class sqlsrv_native_moodle_database extends moodle_database {
$return .= "N'$param'";
}
$return .= strtok('?');
$return .= array_shift($parts);
}
return $return;
}