* in such a large SELECT
*
* @param type description
- *
+ * @return array of courses
*/
function get_courses($categoryid="all", $sort="c.sortorder ASC", $fields="c.*") {
- global $USER, $CFG;
+ global $USER, $CFG, $DB;
- if ($categoryid != "all" && is_numeric($categoryid)) {
- $categoryselect = "WHERE c.category = '$categoryid'";
+ $params = array();
+
+ if ($categoryid !== "all" && is_numeric($categoryid)) {
+ $categoryselect = "WHERE c.category = :catid";
+ $params['catid'] = $categoryid;
} else {
$categoryselect = "";
}
$visiblecourses = array();
+ $sql = "SELECT $fields,
+ ctx.id AS ctxid, ctx.path AS ctxpath,
+ ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel
+ FROM {course} c
+ JOIN {context} ctx
+ ON (c.id = ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSE.")
+ $categoryselect
+ $sortstatement";
+
// pull out all course matching the cat
- if ($courses = get_records_sql("SELECT $fields,
- ctx.id AS ctxid, ctx.path AS ctxpath,
- ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel
- FROM {$CFG->prefix}course c
- JOIN {$CFG->prefix}context ctx
- ON (c.id = ctx.instanceid
- AND ctx.contextlevel=".CONTEXT_COURSE.")
- $categoryselect
- $sortstatement")) {
+ if ($courses = $DB->get_records_sql($sql, $params)) {
// loop throught them
foreach ($courses as $course) {
if (isset($course->visible) && $course->visible <= 0) {
// for hidden courses, require visibility check
if (has_capability('moodle/course:viewhiddencourses', $course->context)) {
- $visiblecourses [] = $course;
+ $visiblecourses [$course->id] = $course;
}
} else {
- $visiblecourses [] = $course;
+ $visiblecourses [$course->id] = $course;
}
}
}
* in such a large SELECT
*
* @param type description
- *
+ * @return array of courses
*/
function get_courses_page($categoryid="all", $sort="c.sortorder ASC", $fields="c.*",
&$totalcount, $limitfrom="", $limitnum="") {
+ global $USER, $CFG, $DB;
- global $USER, $CFG;
+ $params = array();
$categoryselect = "";
if ($categoryid != "all" && is_numeric($categoryid)) {
- $categoryselect = "WHERE c.category = '$categoryid'";
+ $categoryselect = "WHERE c.category = :catid";
+ $params['catid'] = $categoryid;
} else {
$categoryselect = "";
}
+ $sql = "SELECT $fields,
+ ctx.id AS ctxid, ctx.path AS ctxpath,
+ ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel
+ FROM {course} c
+ JOIN {context} ctx
+ ON (c.id = ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSE.")
+ $categoryselect
+ ORDER BY $sort";
+
// pull out all course matching the cat
- $visiblecourses = array();
- if (!($rs = get_recordset_sql("SELECT $fields,
- ctx.id AS ctxid, ctx.path AS ctxpath,
- ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel
- FROM {$CFG->prefix}course c
- JOIN {$CFG->prefix}context ctx
- ON (c.id = ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSE.")
- $categoryselect
- ORDER BY $sort"))) {
- return $visiblecourses;
+ if (!$rs = $DB->get_recordset_sql($sql, $params)) {
+ return array();
}
$totalcount = 0;
}
// iteration will have to be done inside loop to keep track of the limitfrom and limitnum
- while ($course = rs_fetch_next_record($rs)) {
+ $visiblecourses = array();
+ foreach($rs as $course) {
$course = make_context_subobj($course);
if ($course->visible <= 0) {
// for hidden courses, require visibility check
if (has_capability('moodle/course:viewhiddencourses', $course->context)) {
$totalcount++;
if ($totalcount > $limitfrom && (!$limitnum or count($visiblecourses) < $limitnum)) {
- $visiblecourses [] = $course;
+ $visiblecourses [$course->id] = $course;
}
}
} else {
$totalcount++;
if ($totalcount > $limitfrom && (!$limitnum or count($visiblecourses) < $limitnum)) {
- $visiblecourses [] = $course;
+ $visiblecourses [$course->id] = $course;
}
}
}
- rs_close($rs);
+ $rs->close();
return $visiblecourses;
}
* So this should _never_ get called with 'all' on a large site.
*
*/
- global $USER, $CFG;
+ global $USER, $CFG, $DB;
+ $params = array();
$allcats = false; // bool flag
if ($categoryid === 'all') {
$categoryclause = '';
$allcats = true;
} elseif (is_numeric($categoryid)) {
- $categoryclause = "c.category = $categoryid";
+ $categoryclause = "c.category = :catid";
+ $params['catid'] = $categoryid;
} else {
debugging("Could not recognise categoryid = $categoryid");
$categoryclause = '';
$sql = "SELECT $coursefields,
ctx.id AS ctxid, ctx.path AS ctxpath,
ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel
- FROM {$CFG->prefix}course c
- JOIN {$CFG->prefix}context ctx
- ON (c.id=ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSE.")
- $where
- $sortstatement";
+ FROM {course} c
+ JOIN {context} ctx
+ ON (c.id=ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSE.")
+ $where
+ $sortstatement";
$catpaths = array();
$catpath = NULL;
- if ($courses = get_records_sql($sql)) {
+ if ($courses = $DB->get_records_sql($sql, $params)) {
// loop on courses materialising
// the context, and prepping data to fetch the
// managers efficiently later...
ra.hidden,
r.id AS roleid, r.name as rolename,
u.id AS userid, u.firstname, u.lastname
- FROM {$CFG->prefix}role_assignments ra
- JOIN {$CFG->prefix}context ctx
- ON ra.contextid = ctx.id
- JOIN {$CFG->prefix}user u
- ON ra.userid = u.id
- JOIN {$CFG->prefix}role r
- ON ra.roleid = r.id
- LEFT OUTER JOIN {$CFG->prefix}course c
- ON (ctx.instanceid=c.id AND ctx.contextlevel=".CONTEXT_COURSE.")
+ FROM {role_assignments} ra
+ JOIN {context} ctx ON ra.contextid = ctx.id
+ JOIN {user} u ON ra.userid = u.id
+ JOIN {role} r ON ra.roleid = r.id
+ LEFT OUTER JOIN {course} c
+ ON (ctx.instanceid=c.id AND ctx.contextlevel=".CONTEXT_COURSE.")
WHERE ( c.id IS NOT NULL";
// under certain conditions, $catctxids is NULL
if($catctxids == NULL){
$sql .= "AND ra.roleid IN ({$CFG->coursemanager})
$categoryclause
ORDER BY r.sortorder ASC, ctx.contextlevel ASC, ra.sortorder ASC";
- $rs = get_recordset_sql($sql);
+ $rs = $DB->get_recordset_sql($sql, $params);
// This loop is fairly stupid as it stands - might get better
// results doing an initial pass clustering RAs by path.
- while ($ra = rs_fetch_next_record($rs)) {
+ foreach($rs as $ra) {
$user = new StdClass;
$user->id = $ra->userid; unset($ra->userid);
$user->firstname = $ra->firstname; unset($ra->firstname);
$courses[$ra->instanceid]->managers[] = $ra;
}
}
- rs_close($rs);
+ $rs->close();
}
return $courses;
* @return array {@link $COURSE} of course objects
*/
function get_my_courses($userid, $sort='visible DESC,sortorder ASC', $fields=NULL, $doanything=false,$limit=0) {
-
- global $CFG,$USER;
+ global $CFG, $USER, $DB;
// Guest's do not have any courses
$sitecontext = get_context_instance(CONTEXT_SYSTEM);
- if (has_capability('moodle/legacy:guest',$sitecontext,$userid,false)) {
+ if (has_capability('moodle/legacy:guest', $sitecontext, $userid, false)) {
return(array());
}
ctx.id AS ctxid, ctx.path AS ctxpath,
ctx.depth as ctxdepth, ctx.contextlevel AS ctxlevel,
cc.path AS categorypath
- FROM {$CFG->prefix}course c
- JOIN {$CFG->prefix}course_categories cc
- ON c.category=cc.id
- JOIN {$CFG->prefix}context ctx
- ON (c.id=ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSE.")
- WHERE c.id IN ($courseids)
- $orderby";
- $rs = get_recordset_sql($sql);
+ FROM {course} c
+ JOIN {course_categories} cc ON c.category=cc.id
+ JOIN {context} ctx
+ ON (c.id=ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSE.")
+ WHERE c.id IN ($courseids)
+ $orderby";
+ $rs = $DB->get_recordset_sql($sql);
$courses = array();
$cc = 0; // keep count
- while ($c = rs_fetch_next_record($rs)) {
+ foreach ($rs as $c) {
// build the context obj
$c = make_context_subobj($c);
break;
}
}
- rs_close($rs);
+ $rs->close();
return $courses;
}
}
$sql = "SELECT cc.id, cc.path, cc.visible,
ctx.id AS ctxid, ctx.path AS ctxpath,
ctx.depth as ctxdepth, ctx.contextlevel AS ctxlevel
- FROM {$CFG->prefix}course_categories cc
- JOIN {$CFG->prefix}context ctx ON (cc.id = ctx.instanceid)
- WHERE ctx.contextlevel = ".CONTEXT_COURSECAT."
- ORDER BY cc.id";
- $rs = get_recordset_sql($sql);
+ FROM {course_categories} cc
+ JOIN {context} ctx ON (cc.id = ctx.instanceid)
+ WHERE ctx.contextlevel = ".CONTEXT_COURSECAT."
+ ORDER BY cc.id";
+ $rs = $DB->get_recordset_sql($sql);
// Using a temporary array instead of $cats here, to avoid a "true" result when isnull($cats) further down
$categories = array();
- while ($course_cat = rs_fetch_next_record($rs)) {
+ foreach($rs as $course_cat) {
// build the context obj
$course_cat = make_context_subobj($course_cat);
$categories[$course_cat->id] = $course_cat;
}
- rs_close($rs);
+ $rs->close();
if (!empty($categories)) {
$cats = $categories;
* @return object {@link $COURSE} records
*/
function get_courses_search($searchterms, $sort='fullname ASC', $page=0, $recordsperpage=50, &$totalcount) {
+ global $CFG, $DB;
- global $CFG;
-
- //to allow case-insensitive search for postgesql
if ($CFG->dbfamily == 'postgres') {
- $LIKE = 'ILIKE';
- $NOTLIKE = 'NOT ILIKE'; // case-insensitive
- $REGEXP = '~*';
+ $REGEXP = '~*';
$NOTREGEXP = '!~*';
} else {
- $LIKE = 'LIKE';
- $NOTLIKE = 'NOT LIKE';
- $REGEXP = 'REGEXP';
+ $REGEXP = 'REGEXP';
$NOTREGEXP = 'NOT REGEXP';
}
+ $LIKE = $DB->sql_ilike(); // case-insensitive
$fullnamesearch = '';
$summarysearch = '';
+ $params = array();
+
foreach ($searchterms as $searchterm) {
$NOT = ''; /// Initially we aren't going to perform NOT LIKE searches, only MSSQL and Oracle
$summarysearch .= ' AND ';
}
+ // TODO: the "-" here does not work much because it may be cancelled by OR condition "( $fullnamesearch ) OR ( $summarysearch )"
+
if (substr($searchterm,0,1) == '+') {
$searchterm = substr($searchterm,1);
- $summarysearch .= " c.summary $REGEXP '(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)' ";
- $fullnamesearch .= " c.fullname $REGEXP '(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)' ";
+ $searchterm = preg_quote($searchterm, '|');
+ $summarysearch .= " c.summary $REGEXP :ss ";
+ $params['ss'] = "(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)";
+ $fullnamesearch .= " c.fullname $REGEXP :fs ";
+ $params['fs'] = "(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)";
} else if (substr($searchterm,0,1) == "-") {
$searchterm = substr($searchterm,1);
- $summarysearch .= " c.summary $NOTREGEXP '(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)' ";
- $fullnamesearch .= " c.fullname $NOTREGEXP '(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)' ";
+ $searchterm = preg_quote($searchterm, '|');
+ $summarysearch .= " c.summary $NOTREGEXP :ss ";
+ $params['ss'] = "(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)";
+ $fullnamesearch .= " c.fullname $NOTREGEXP :fs ";
+ $params['fs'] = "(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)";
} else {
- $summarysearch .= ' summary '. $NOT . $LIKE .' \'%'. $searchterm .'%\' ';
- $fullnamesearch .= ' fullname '. $NOT . $LIKE .' \'%'. $searchterm .'%\' ';
+ $summarysearch .= " summary $NOT $LIKE :ss ";
+ $fullnamesearch .= " fullname $NOT $LIKE :fs ";
+ $params['ss'] = "%$searchterm%";
+ $params['fs'] = "%$searchterm%";
}
-
}
$sql = "SELECT c.*,
ctx.id AS ctxid, ctx.path AS ctxpath,
ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel
- FROM {$CFG->prefix}course c
- JOIN {$CFG->prefix}context ctx
- ON (c.id = ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSE.")
+ FROM {course} c
+ JOIN {context} ctx
+ ON (c.id = ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSE.")
WHERE (( $fullnamesearch ) OR ( $summarysearch ))
AND category > 0
- ORDER BY " . $sort;
-
+ ORDER BY $sort";
$courses = array();
+ $c = 0; // counts how many visible courses we've seen
- if ($rs = get_recordset_sql($sql)) {
-
-
+ if ($rs = $DB->get_recordset_sql($sql, $params)) {
// Tiki pagination
$limitfrom = $page * $recordsperpage;
$limitto = $limitfrom + $recordsperpage;
- $c = 0; // counts how many visible courses we've seen
- while ($course = rs_fetch_next_record($rs)) {
+ foreach($rs as $course) {
$course = make_context_subobj($course);
if ($course->visible || has_capability('moodle/course:viewhiddencourses', $course->context)) {
// Don't exit this loop till the end
// we need to count all the visible courses
// to update $totalcount
if ($c >= $limitfrom && $c < $limitto) {
- $courses[] = $course;
+ $courses[$course->id] = $course;
}
$c++;
}
}
+ $rs->close();
}
// our caller expects 2 bits of data - our return
* @return array of categories
*/
function get_categories($parent='none', $sort=NULL, $shallow=true) {
- global $CFG;
+ global $DB;
if ($sort === NULL) {
$sort = 'ORDER BY cc.sortorder ASC';
if ($parent === 'none') {
$sql = "SELECT cc.*,
- ctx.id AS ctxid, ctx.path AS ctxpath,
- ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel
- FROM {$CFG->prefix}course_categories cc
- JOIN {$CFG->prefix}context ctx
- ON cc.id=ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSECAT."
+ ctx.id AS ctxid, ctx.path AS ctxpath,
+ ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel
+ FROM {course_categories} cc
+ JOIN {context} ctx
+ ON cc.id=ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSECAT."
$sort";
+ $params = array();
+
} elseif ($shallow) {
- $parent = (int)$parent;
$sql = "SELECT cc.*,
ctx.id AS ctxid, ctx.path AS ctxpath,
ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel
- FROM {$CFG->prefix}course_categories cc
- JOIN {$CFG->prefix}context ctx
- ON cc.id=ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSECAT."
- WHERE cc.parent=$parent
+ FROM {course_categories} cc
+ JOIN {context} ctx
+ ON cc.id=ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSECAT."
+ WHERE cc.parent=?
$sort";
+ $params = array($parent);
+
} else {
- $parent = (int)$parent;
$sql = "SELECT cc.*,
ctx.id AS ctxid, ctx.path AS ctxpath,
ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel
- FROM {$CFG->prefix}course_categories cc
- JOIN {$CFG->prefix}context ctx
- ON cc.id=ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSECAT."
- JOIN {$CFG->prefix}course_categories ccp
- ON (cc.path LIKE ".sql_concat('ccp.path',"'%'").")
- WHERE ccp.id=$parent
+ FROM {course_categories} cc
+ JOIN {context} ctx
+ ON cc.id=ctx.instanceid AND ctx.contextlevel=".CONTEXT_COURSECAT."
+ JOIN {course_categories} ccp
+ ON (cc.path LIKE ".$DB->sql_concat('ccp.path',"'%'").")
+ WHERE ccp.id=?
$sort";
+ $params = array($parent);
}
$categories = array();
- if( $rs = get_recordset_sql($sql) ){
- while ($cat = rs_fetch_next_record($rs)) {
+ if( $rs = $DB->get_recordset_sql($sql, $params) ){
+ foreach($rs as $cat) {
$cat = make_context_subobj($cat);
- if ($cat->visible || has_capability('moodle/course:create',$cat->context)) {
+ if ($cat->visible || has_capability('moodle/course:create', $cat->context)) {
$categories[$cat->id] = $cat;
}
}
+ $rs->close();
}
return $categories;
}
* @return array of category ids.
*/
function get_all_subcategories($catid) {
+ global $DB;
$subcats = array();
- if ($categories = get_records('course_categories', 'parent', $catid)) {
+ if ($categories = $DB->get_records('course_categories', array('parent'=>$catid))) {
foreach ($categories as $cat) {
array_push($subcats, $cat->id);
$subcats = array_merge($subcats, get_all_subcategories($cat->id));