Merge branch 'w16_MDL-27148_m21_stringinc' of git://github.com/skodak/moodle

This commit is contained in:
Eloy Lafuente (stronk7) 2011-04-18 01:15:56 +02:00
commit 97fefd2386
32 changed files with 173 additions and 135 deletions

View file

@ -2540,7 +2540,7 @@ function get_roles_with_capability($capability, $permission = null, $context = n
if ($context) {
$contexts = get_parent_contexts($context, true);
list($insql, $params) = $DB->get_in_or_equal($contexts, SQL_PARAMS_NAMED, 'ctx000');
list($insql, $params) = $DB->get_in_or_equal($contexts, SQL_PARAMS_NAMED, 'ctx');
$contextsql = "AND rc.contextid $insql";
} else {
$params = array();
@ -3097,7 +3097,7 @@ function get_enrolled_sql($context, $withcapability = '', $groupid = 0, $onlyact
// get all relevant capability info for all roles
if ($withcapability) {
list($incontexts, $cparams) = $DB->get_in_or_equal($contextids, SQL_PARAMS_NAMED, 'ctx00');
list($incontexts, $cparams) = $DB->get_in_or_equal($contextids, SQL_PARAMS_NAMED, 'ctx');
$cparams['cap'] = $withcapability;
$defs = array();
@ -3741,7 +3741,7 @@ function fetch_context_capabilities($context) {
case CONTEXT_USER:
$extracaps = array('moodle/grade:viewall');
list($extra, $params) = $DB->get_in_or_equal($extracaps, SQL_PARAMS_NAMED, 'cap0');
list($extra, $params) = $DB->get_in_or_equal($extracaps, SQL_PARAMS_NAMED, 'cap');
$SQL = "SELECT *
FROM {capabilities}
WHERE contextlevel = ".CONTEXT_USER."
@ -3814,7 +3814,7 @@ function fetch_context_capabilities($context) {
$extra = '';
$extracaps = block_method_result($bi->blockname, 'get_extra_capabilities');
if ($extracaps) {
list($extra, $params) = $DB->get_in_or_equal($extracaps, SQL_PARAMS_NAMED, 'cap0');
list($extra, $params) = $DB->get_in_or_equal($extracaps, SQL_PARAMS_NAMED, 'cap');
$extra = "OR name $extra";
}
@ -4876,8 +4876,8 @@ function get_users_by_capability($context, $capability, $fields = '', $sort = ''
// we need to find out all roles that have these capabilities either in definition or in overrides
$defs = array();
list($incontexts, $params) = $DB->get_in_or_equal($contextids, SQL_PARAMS_NAMED, 'con000');
list($incaps, $params2) = $DB->get_in_or_equal($caps, SQL_PARAMS_NAMED, 'cap000');
list($incontexts, $params) = $DB->get_in_or_equal($contextids, SQL_PARAMS_NAMED, 'con');
list($incaps, $params2) = $DB->get_in_or_equal($caps, SQL_PARAMS_NAMED, 'cap');
$params = array_merge($params, $params2);
$sql = "SELECT rc.id, rc.roleid, rc.permission, rc.capability, ctx.path
FROM {role_capabilities} rc
@ -5001,7 +5001,7 @@ function get_users_by_capability($context, $capability, $fields = '', $sort = ''
/// Groups
if ($groups) {
$groups = (array)$groups;
list($grouptest, $grpparams) = $DB->get_in_or_equal($groups, SQL_PARAMS_NAMED, 'grp000');
list($grouptest, $grpparams) = $DB->get_in_or_equal($groups, SQL_PARAMS_NAMED, 'grp');
$grouptest = "u.id IN (SELECT userid FROM {groups_members} gm WHERE gm.groupid $grouptest)";
$params = array_merge($params, $grpparams);
@ -5016,7 +5016,7 @@ function get_users_by_capability($context, $capability, $fields = '', $sort = ''
/// User exceptions
if (!empty($exceptions)) {
$exceptions = (array)$exceptions;
list($exsql, $exparams) = $DB->get_in_or_equal($exceptions, SQL_PARAMS_NAMED, 'exc000', false);
list($exsql, $exparams) = $DB->get_in_or_equal($exceptions, SQL_PARAMS_NAMED, 'exc', false);
$params = array_merge($params, $exparams);
$wherecond[] = "u.id $exsql";
}
@ -5538,7 +5538,7 @@ function user_has_role_assignment($userid, $roleid, $contextid = 0) {
return false;
}
$parents = get_parent_contexts($context, true);
list($contexts, $params) = $DB->get_in_or_equal($parents, SQL_PARAMS_NAMED, 'r0000');
list($contexts, $params) = $DB->get_in_or_equal($parents, SQL_PARAMS_NAMED, 'r');
$params['userid'] = $userid;
$params['roleid'] = $roleid;

View file

@ -533,13 +533,13 @@ class block_manager {
$parentcontextids = get_parent_contexts($context);
if ($parentcontextids) {
list($parentcontexttest, $parentcontextparams) =
$DB->get_in_or_equal($parentcontextids, SQL_PARAMS_NAMED, 'parentcontext0000');
$DB->get_in_or_equal($parentcontextids, SQL_PARAMS_NAMED, 'parentcontext');
$contexttest = "($contexttest OR (bi.showinsubcontexts = 1 AND bi.parentcontextid $parentcontexttest))";
}
$pagetypepatterns = matching_page_type_patterns($this->page->pagetype);
list($pagetypepatterntest, $pagetypepatternparams) =
$DB->get_in_or_equal($pagetypepatterns, SQL_PARAMS_NAMED, 'pagetypepatterntest0000');
$DB->get_in_or_equal($pagetypepatterns, SQL_PARAMS_NAMED, 'pagetypepatterntest');
list($ccselect, $ccjoin) = context_instance_preload_sql('b.id', CONTEXT_BLOCK, 'ctx');

View file

@ -111,7 +111,7 @@ function search_users($courseid, $groupid, $searchtext, $sort='', array $excepti
$fullname = $DB->sql_fullname('u.firstname', 'u.lastname');
if (!empty($exceptions)) {
list($exceptions, $params) = $DB->get_in_or_equal($exceptions, SQL_PARAMS_NAMED, 'ex0000', false);
list($exceptions, $params) = $DB->get_in_or_equal($exceptions, SQL_PARAMS_NAMED, 'ex', false);
$except = "AND u.id $exceptions";
} else {
$except = "";
@ -210,7 +210,7 @@ function get_users($get=true, $search='', $confirmed=false, array $exceptions=nu
}
if ($exceptions) {
list($exceptions, $eparams) = $DB->get_in_or_equal($exceptions, SQL_PARAMS_NAMED, 'ex0000', false);
list($exceptions, $eparams) = $DB->get_in_or_equal($exceptions, SQL_PARAMS_NAMED, 'ex', false);
$params = $params + $eparams;
$except = " AND id $exceptions";
}

View file

@ -3037,7 +3037,7 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
}
// add roles without archetypes, it may contain weird things, but we can not fix them
list($narsql, $params) = $DB->get_in_or_equal(array_keys($defaults), SQL_PARAMS_NAMED, 'ar000', false);
list($narsql, $params) = $DB->get_in_or_equal(array_keys($defaults), SQL_PARAMS_NAMED, 'ar', false);
$sql = "SELECT DISTINCT ra.roleid, con.contextlevel
FROM {role_assignments} ra
JOIN {context} con ON ra.contextid = con.id
@ -4030,7 +4030,7 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
// enabled
$enabledplugins = explode(',', $CFG->enrol_plugins_enabled);
list($sqlenabled, $params) = $DB->get_in_or_equal($enabledplugins, SQL_PARAMS_NAMED, 'ena00');
list($sqlenabled, $params) = $DB->get_in_or_equal($enabledplugins, SQL_PARAMS_NAMED, 'ena');
$params['siteid'] = SITEID;
$sql = "INSERT INTO {enrol} (enrol, status, courseid, sortorder, enrolperiod, enrolstartdate, enrolenddate, expirynotify, expirythreshold,
notifyall, password, cost, currency, roleid, timecreated, timemodified)
@ -4042,7 +4042,7 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
WHERE c.id <> :siteid AND ra.enrol $sqlenabled";
$processed = $DB->get_fieldset_sql("SELECT DISTINCT enrol FROM {enrol}");
if ($processed) {
list($sqlnotprocessed, $params2) = $DB->get_in_or_equal($processed, SQL_PARAMS_NAMED, 'np00', false);
list($sqlnotprocessed, $params2) = $DB->get_in_or_equal($processed, SQL_PARAMS_NAMED, 'np', false);
$params = array_merge($params, $params2);
$sql = "$sql AND ra.enrol $sqlnotprocessed";
}
@ -4060,7 +4060,7 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
WHERE c.id <> :siteid";
$processed = $DB->get_fieldset_sql("SELECT DISTINCT enrol FROM {enrol}");
if ($processed) {
list($sqlnotprocessed, $params2) = $DB->get_in_or_equal($processed, SQL_PARAMS_NAMED, 'np00', false);
list($sqlnotprocessed, $params2) = $DB->get_in_or_equal($processed, SQL_PARAMS_NAMED, 'np', false);
$params = array_merge($params, $params2);
$sql = "$sql AND ra.enrol $sqlnotprocessed";
}
@ -4310,7 +4310,7 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
$params = array('syscontext'=>$syscontext->id, 'participate'=>'moodle/course:participate');
$roles = $DB->get_fieldset_sql("SELECT DISTINCT roleid FROM {role_capabilities} WHERE contextid = :syscontext AND capability = :participate AND permission = 1", $params);
if ($roles) {
list($sqlroles, $params) = $DB->get_in_or_equal($roles, SQL_PARAMS_NAMED, 'r00');
list($sqlroles, $params) = $DB->get_in_or_equal($roles, SQL_PARAMS_NAMED, 'r');
$sql = "INSERT INTO {user_enrolments} (status, enrolid, userid, timestart, timeend, modifierid, timecreated, timemodified)

View file

@ -567,13 +567,15 @@ abstract class moodle_database {
* Constructs IN() or = sql fragment
* @param mixed $items single or array of values
* @param int $type bound param type SQL_PARAMS_QM or SQL_PARAMS_NAMED
* @param string named param placeholder start
* @param bool true means equal, false not equal
* @param string $prefix named parameter placeholder prefix (unique counter value is appended to each parameter name)
* @param bool $equal true means equal, false not equal
* @param mixed $onemptyitems defines the behavior when the array of items is empty. Defaults to false,
* meaning throw exceptions. Other values will become part of the returned SQL fragment.
* @return array - $sql and $params
*/
public function get_in_or_equal($items, $type=SQL_PARAMS_QM, $start='param0000', $equal=true, $onemptyitems=false) {
public function get_in_or_equal($items, $type=SQL_PARAMS_QM, $prefix='param', $equal=true, $onemptyitems=false) {
static $counter = 1; // guarantees unique parameters in each request
// default behavior, throw exception on empty array
if (is_array($items) and empty($items) and $onemptyitems === false) {
throw new coding_exception('moodle_database::get_in_or_equal() does not accept empty arrays');
@ -603,19 +605,26 @@ abstract class moodle_database {
}
} else if ($type == SQL_PARAMS_NAMED) {
if (empty($prefix)) {
$prefix = 'param';
}
if (!is_array($items)){
$sql = $equal ? "= :$start" : "<> :$start";
$params = array($start=>$items);
$param = $prefix.$counter++;
$sql = $equal ? "= :$param" : "<> :$param";
$params = array($param=>$items);
} else if (count($items) == 1) {
$sql = $equal ? "= :$start" : "<> :$start";
$param = $prefix.$counter++;
$sql = $equal ? "= :$param" : "<> :$param";
$item = reset($items);
$params = array($start=>$item);
$params = array($param=>$item);
} else {
$params = array();
$sql = array();
foreach ($items as $item) {
$params[$start] = $item;
$sql[] = ':'.$start++;
$param = $prefix.$counter++;
$params[$param] = $item;
$sql[] = ':'.$param;
}
if ($equal) {
$sql = 'IN ('.implode(',', $sql).')';

View file

@ -178,62 +178,82 @@ class dml_test extends UnitTestCase {
// Correct usage of multiple values
$in_values = array('value1', 'value2', 'value3', 'value4');
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param01', true);
$this->assertEqual("IN (:param01,:param02,:param03,:param04)", $usql);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param', true);
$this->assertEqual(4, count($params));
reset($in_values);
$ps = array();
foreach ($params as $key => $value) {
$this->assertEqual(current($in_values), $value);
next($in_values);
$ps[] = ':'.$key;
}
$this->assertEqual("IN (".implode(',', $ps).")", $usql);
// Correct usage of single values (in array)
$in_values = array('value1');
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param01', true);
$this->assertEqual("= :param01", $usql);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param', true);
$this->assertEqual(1, count($params));
$this->assertEqual($in_values[0], $params['param01']);
$value = reset($params);
$key = key($params);
$this->assertEqual("= :$key", $usql);
$this->assertEqual($in_value, $value);
// Correct usage of single value
$in_value = 'value1';
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param01', true);
$this->assertEqual("= :param01", $usql);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param', true);
$this->assertEqual(1, count($params));
$this->assertEqual($in_value, $params['param01']);
$value = reset($params);
$key = key($params);
$this->assertEqual("= :$key", $usql);
$this->assertEqual($in_value, $value);
// SQL_PARAMS_NAMED - NOT IN or <>
// Correct usage of multiple values
$in_values = array('value1', 'value2', 'value3', 'value4');
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param01', false);
$this->assertEqual("NOT IN (:param01,:param02,:param03,:param04)", $usql);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param', false);
$this->assertEqual(4, count($params));
reset($in_values);
$ps = array();
foreach ($params as $key => $value) {
$this->assertEqual(current($in_values), $value);
next($in_values);
$ps[] = ':'.$key;
}
$this->assertEqual("NOT IN (".implode(',', $ps).")", $usql);
// Correct usage of single values (in array)
$in_values = array('value1');
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param01', false);
$this->assertEqual("<> :param01", $usql);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param', false);
$this->assertEqual(1, count($params));
$this->assertEqual($in_values[0], $params['param01']);
$value = reset($params);
$key = key($params);
$this->assertEqual("<> :$key", $usql);
$this->assertEqual($in_value, $value);
// Correct usage of single value
$in_value = 'value1';
list($usql, $params) = $DB->get_in_or_equal($in_value, SQL_PARAMS_NAMED, 'param01', false);
$this->assertEqual("<> :param01", $usql);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param', false);
$this->assertEqual(1, count($params));
$this->assertEqual($in_value, $params['param01']);
$value = reset($params);
$key = key($params);
$this->assertEqual("<> :$key", $usql);
$this->assertEqual($in_value, $value);
// make sure the param names are unique
list($usql1, $params1) = $DB->get_in_or_equal(array(1,2,3), SQL_PARAMS_NAMED, 'param');
list($usql2, $params2) = $DB->get_in_or_equal(array(1,2,3), SQL_PARAMS_NAMED, 'param');
$params1 = array_keys($params1);
$params2 = array_keys($params2);
$common = array_intersect($params1, $params2);
$this->assertEqual(count($common), 0);
// Some incorrect tests
// Incorrect usage passing not-allowed params type
$in_values = array(1, 2, 3);
try {
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_DOLLAR, 'param01', false);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_DOLLAR, 'param', false);
$this->fail('An Exception is missing, expected due to not supported SQL_PARAMS_DOLLAR');
} catch (exception $e) {
$this->assertTrue($e instanceof dml_exception);
@ -243,7 +263,7 @@ class dml_test extends UnitTestCase {
// Incorrect usage passing empty array
$in_values = array();
try {
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param01', false);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param', false);
$this->fail('An Exception is missing, expected due to empty array of items');
} catch (exception $e) {
$this->assertTrue($e instanceof coding_exception);
@ -253,51 +273,60 @@ class dml_test extends UnitTestCase {
// Correct usage passing empty array and $onemptyitems = NULL (equal = true, QM)
$in_values = array();
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_QM, 'param01', true, NULL);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_QM, 'param', true, NULL);
$this->assertEqual(' IS NULL', $usql);
$this->assertIdentical(array(), $params);
// Correct usage passing empty array and $onemptyitems = NULL (equal = false, NAMED)
$in_values = array();
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param01', false, NULL);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param', false, NULL);
$this->assertEqual(' IS NOT NULL', $usql);
$this->assertIdentical(array(), $params);
// Correct usage passing empty array and $onemptyitems = true (equal = true, QM)
$in_values = array();
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_QM, 'param01', true, true);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_QM, 'param', true, true);
$this->assertEqual('= ?', $usql);
$this->assertIdentical(array(true), $params);
// Correct usage passing empty array and $onemptyitems = true (equal = false, NAMED)
$in_values = array();
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param01', false, true);
$this->assertEqual('<> :param01', $usql);
$this->assertIdentical(array('param01' => true), $params);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param', false, true);
$this->assertEqual(1, count($params));
$value = reset($params);
$key = key($params);
$this->assertEqual('<> :'.$key, $usql);
$this->assertIdentical($value, true);
// Correct usage passing empty array and $onemptyitems = -1 (equal = true, QM)
$in_values = array();
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_QM, 'param01', true, -1);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_QM, 'param', true, -1);
$this->assertEqual('= ?', $usql);
$this->assertIdentical(array(-1), $params);
// Correct usage passing empty array and $onemptyitems = -1 (equal = false, NAMED)
$in_values = array();
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param01', false, -1);
$this->assertEqual('<> :param01', $usql);
$this->assertIdentical(array('param01' => -1), $params);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param', false, -1);
$this->assertEqual(1, count($params));
$value = reset($params);
$key = key($params);
$this->assertEqual('<> :'.$key, $usql);
$this->assertIdentical($value, -1);
// Correct usage passing empty array and $onemptyitems = 'onevalue' (equal = true, QM)
$in_values = array();
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_QM, 'param01', true, 'onevalue');
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_QM, 'param', true, 'onevalue');
$this->assertEqual('= ?', $usql);
$this->assertIdentical(array('onevalue'), $params);
// Correct usage passing empty array and $onemptyitems = 'onevalue' (equal = false, NAMED)
$in_values = array();
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param01', false, 'onevalue');
$this->assertEqual('<> :param01', $usql);
$this->assertIdentical(array('param01' => 'onevalue'), $params);
list($usql, $params) = $DB->get_in_or_equal($in_values, SQL_PARAMS_NAMED, 'param', false, 'onevalue');
$this->assertEqual(1, count($params));
$value = reset($params);
$key = key($params);
$this->assertEqual('<> :'.$key, $usql);
$this->assertIdentical($value, 'onevalue');
}
public function test_fix_table_names() {

View file

@ -244,7 +244,7 @@ function enrol_sharing_course($user1, $user2) {
return false;
}
list($plugins, $params) = $DB->get_in_or_equal($plugins, SQL_PARAMS_NAMED, 'ee00');
list($plugins, $params) = $DB->get_in_or_equal($plugins, SQL_PARAMS_NAMED, 'ee');
$params['enabled'] = ENROL_INSTANCE_ENABLED;
$params['active1'] = ENROL_USER_ACTIVE;
$params['active2'] = ENROL_USER_ACTIVE;

View file

@ -208,7 +208,7 @@ function grade_update($source, $courseid, $itemtype, $itemmodule, $iteminstance,
$count = count($grades);
if ($count > 0 and $count < 200) {
list($uids, $params) = $DB->get_in_or_equal(array_keys($grades), SQL_PARAMS_NAMED, $start='uid0');
list($uids, $params) = $DB->get_in_or_equal(array_keys($grades), SQL_PARAMS_NAMED, $start='uid');
$params['gid'] = $grade_item->id;
$sql = "SELECT * FROM {grade_grades} WHERE itemid = :gid AND userid $uids";

View file

@ -378,8 +378,8 @@ function stats_cron_daily($maxdays=1) {
/// individual user stats (including not-logged-in) in each course, this is slow - reuse this data if possible
list($viewactionssql, $params1) = $DB->get_in_or_equal($viewactions, SQL_PARAMS_NAMED, 'view000');
list($postactionssql, $params2) = $DB->get_in_or_equal($postactions, SQL_PARAMS_NAMED, 'post000');
list($viewactionssql, $params1) = $DB->get_in_or_equal($viewactions, SQL_PARAMS_NAMED, 'view');
list($postactionssql, $params2) = $DB->get_in_or_equal($postactions, SQL_PARAMS_NAMED, 'post');
$sql = "INSERT INTO {stats_user_daily} (stattype, timeend, courseid, userid, statsreads, statswrites)
SELECT 'activity' AS stattype, $nextmidnight AS timeend, d.courseid, d.userid,