Permalink
Browse files

course/index: move orphan fixups to an optimised fix_coursecategory_o…

…rphans()

Move the fixups for orphan courses to the newly minted
fix_coursecategory_orphans() -- and optimise it to take only 1 dbquery for
the common case.

If we do find lots of orphans, we issue 2 updates per orphan.

This cuts down dbqueries drastically - we used to have 2x the number of
courses in the site.
  • Loading branch information...
1 parent 50a79cf commit f6297ede8e5b7704b4c923a7236da6bef478eed5 martinlanghoff committed Sep 12, 2007
Showing with 46 additions and 17 deletions.
  1. +3 −17 course/index.php
  2. +43 −0 lib/datalib.php
View
@@ -264,24 +264,10 @@
}
}
-/// Find the default category (the one with the lowest ID)
- $categories = get_categories();
- $default = 99999;
- foreach ($categories as $category) {
- if ($category->id < $default) {
- $default = $category->id;
- }
- }
-
/// Find any orphan courses that don't yet have a valid category and set to default
- if ($courses = get_courses(NULL,NULL,'c.id, c.category, c.sortorder, c.visible')) {
- foreach ($courses as $course) {
- if ($course->category and !isset($categories[$course->category])) {
- set_field('course', 'category', $default, 'id', $course->id);
- }
- }
- }
-
+ fix_coursecategory_orphans();
+
+/// Should be a no-op 99% of the cases
fix_course_sortorder();
/// Print form for creating new categories
View
@@ -1106,6 +1106,49 @@ function fix_course_sortorder($categoryid=0, $n=0, $safe=0, $depth=0, $path='')
return $n+1;
}
+/**
+ * Ensure all courses have a valid course category
+ * useful if a category has been removed manually
+ **/
+function fix_coursecategory_orphans() {
+
+ global $CFG;
+
+ // Note: the handling of sortorder here is arguably
+ // open to race conditions. Hard to fix here, unlikely
+ // to hit anyone in production.
+
+ $sql = "SELECT c.id, c.category, c.shortname
+ FROM {$CFG->prefix}course c
+ LEFT OUTER JOIN {$CFG->prefix}course_categories cc ON c.category=cc.id
+ WHERE cc.id IS NULL AND c.id != " . SITEID;
+
+ $rs = get_recordset_sql($sql);
+
+ if ($rs->RecordCount()){ // we have some orphans
+
+ // the "default" category is the lowest numbered...
+ $default = get_field_sql("SELECT MIN(id)
+ FROM {$CFG->prefix}course_categories");
+ $sortorder = get_field_sql("SELECT MAX(sortorder)
+ FROM {$CFG->prefix}course
+ WHERE category=$default");
+
+
+ begin_sql();
+ $tx = true;
+ while ($tx && $course = rs_fetch_next_record($rs)) {
+ $tx = $tx && set_field('course', 'category', $default, 'id', $course->id);
+ $tx = $tx && set_field('course', 'sortorder', ++$sortorder, 'id', $course->id);
+ }
+ if ($tx) {
+ commit_sql();
+ } else {
+ rollback_sql();
+ }
+ }
+}
+
/**
* List of remote courses that a user has access to via MNET.
* Works only on the IDP

0 comments on commit f6297ed

Please sign in to comment.