]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-7309 Add error checking to the Quiz DB upgrade script. This should prevent the...
authortjhunt <tjhunt>
Wed, 15 Nov 2006 12:59:49 +0000 (12:59 +0000)
committertjhunt <tjhunt>
Wed, 15 Nov 2006 12:59:49 +0000 (12:59 +0000)
mod/quiz/db/mysql.php
mod/quiz/db/postgres7.php

index ffacb719973f5175f0352da561c81171adbe5fbe..d29eaa6bd7ca948138f20d78fd988b0ccce5aa3a 100644 (file)
@@ -11,46 +11,46 @@ function quiz_upgrade($oldversion) {
 
     global $CFG, $QTYPES, $db;
     $success = true;
-    
+
     require_once("$CFG->dirroot/mod/quiz/locallib.php");
 
-    if ($oldversion < 2002101800) {
-        execute_sql(" ALTER TABLE `quiz_attempts` ".
+    if ($success && $oldversion < 2002101800) {
+        $success = $success && execute_sql(" ALTER TABLE `quiz_attempts` ".
                     " ADD `timestart` INT(10) UNSIGNED DEFAULT '0' NOT NULL AFTER `sumgrades` , ".
                     " ADD `timefinish` INT(10) UNSIGNED DEFAULT '0' NOT NULL AFTER `timestart` ");
-        execute_sql(" UPDATE `quiz_attempts` SET timestart = timemodified ");
-        execute_sql(" UPDATE `quiz_attempts` SET timefinish = timemodified ");
+        $success = $success && execute_sql(" UPDATE `quiz_attempts` SET timestart = timemodified ");
+        $success = $success && execute_sql(" UPDATE `quiz_attempts` SET timefinish = timemodified ");
     }
-    if ($oldversion < 2002102101) {
-        execute_sql(" DELETE FROM log_display WHERE module = 'quiz' ");
-        execute_sql(" INSERT INTO log_display (module, action, mtable, field) VALUES ('quiz', 'view', 'quiz', 'name') ");
-        execute_sql(" INSERT INTO log_display (module, action, mtable, field) VALUES ('quiz', 'report', 'quiz', 'name') ");
-        execute_sql(" INSERT INTO log_display (module, action, mtable, field) VALUES ('quiz', 'attempt', 'quiz', 'name') ");
-        execute_sql(" INSERT INTO log_display (module, action, mtable, field) VALUES ('quiz', 'submit', 'quiz', 'name') ");
+    if ($success && $oldversion < 2002102101) {
+        $success = $success && execute_sql(" DELETE FROM log_display WHERE module = 'quiz' ");
+        $success = $success && execute_sql(" INSERT INTO log_display (module, action, mtable, field) VALUES ('quiz', 'view', 'quiz', 'name') ");
+        $success = $success && execute_sql(" INSERT INTO log_display (module, action, mtable, field) VALUES ('quiz', 'report', 'quiz', 'name') ");
+        $success = $success && execute_sql(" INSERT INTO log_display (module, action, mtable, field) VALUES ('quiz', 'attempt', 'quiz', 'name') ");
+        $success = $success && execute_sql(" INSERT INTO log_display (module, action, mtable, field) VALUES ('quiz', 'submit', 'quiz', 'name') ");
     }
-    if ($oldversion < 2002102600) {
-        execute_sql(" ALTER TABLE `quiz_answers` CHANGE `feedback` `feedback` TEXT NOT NULL ");
+    if ($success && $oldversion < 2002102600) {
+        $success = $success && execute_sql(" ALTER TABLE `quiz_answers` CHANGE `feedback` `feedback` TEXT NOT NULL ");
     }
 
-    if ($oldversion < 2002122300) {
-        execute_sql("ALTER TABLE `quiz_grades` CHANGE `user` `userid` INT(10) UNSIGNED DEFAULT '0' NOT NULL ");
-        execute_sql("ALTER TABLE `quiz_attempts` CHANGE `user` `userid` INT(10) UNSIGNED DEFAULT '0' NOT NULL ");
+    if ($success && $oldversion < 2002122300) {
+        $success = $success && execute_sql("ALTER TABLE `quiz_grades` CHANGE `user` `userid` INT(10) UNSIGNED DEFAULT '0' NOT NULL ");
+        $success = $success && execute_sql("ALTER TABLE `quiz_attempts` CHANGE `user` `userid` INT(10) UNSIGNED DEFAULT '0' NOT NULL ");
     }
 
     // prefixes required from here on, or use table_column()
 
-    if ($oldversion < 2003010100) {
-        execute_sql(" ALTER TABLE {$CFG->prefix}quiz ADD review TINYINT(4) UNSIGNED DEFAULT '0' NOT NULL AFTER `grademethod` ");
+    if ($success && $oldversion < 2003010100) {
+        $success = $success && execute_sql(" ALTER TABLE {$CFG->prefix}quiz ADD review TINYINT(4) UNSIGNED DEFAULT '0' NOT NULL AFTER `grademethod` ");
     }
 
-    if ($oldversion < 2003010301) {
-        table_column("quiz_truefalse", "true", "trueanswer", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
-        table_column("quiz_truefalse", "false", "falseanswer", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
-        table_column("quiz_questions", "type", "qtype", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
+    if ($success && $oldversion < 2003010301) {
+        $success = $success && table_column("quiz_truefalse", "true", "trueanswer", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
+        $success = $success && table_column("quiz_truefalse", "false", "falseanswer", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
+        $success = $success && table_column("quiz_questions", "type", "qtype", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
     }
 
-    if ($oldversion < 2003022303) {
-        modify_database ("", "CREATE TABLE `prefix_quiz_randommatch` (
+    if ($success && $oldversion < 2003022303) {
+        $success = $success && modify_database ("", "CREATE TABLE `prefix_quiz_randommatch` (
                              `id` int(10) unsigned NOT NULL auto_increment,
                              `question` int(10) unsigned NOT NULL default '0',
                              `choose` INT UNSIGNED DEFAULT '4' NOT NULL,
@@ -58,26 +58,26 @@ function quiz_upgrade($oldversion) {
                           );");
     }
 
-    if ($oldversion < 2003030303) {
-        table_column("quiz_questions", "", "defaultgrade", "INTEGER", "6", "UNSIGNED", "1", "NOT NULL", "image");
+    if ($success && $oldversion < 2003030303) {
+        $success = $success && table_column("quiz_questions", "", "defaultgrade", "INTEGER", "6", "UNSIGNED", "1", "NOT NULL", "image");
     }
 
-    if ($oldversion < 2003032601) {
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_answers` ADD INDEX(question) ");
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_attempts` ADD INDEX(quiz) ");
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_attempts` ADD INDEX(userid) ");
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_grades` ADD INDEX(quiz) ");
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_grades` ADD INDEX(userid) ");
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_question_grades` ADD INDEX(quiz) ");
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_question_grades` ADD INDEX(question) ");
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_randommatch` ADD INDEX(question) ");
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_responses` ADD INDEX(attempt) ");
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_responses` ADD INDEX(question) ");
+    if ($success && $oldversion < 2003032601) {
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_answers` ADD INDEX(question) ");
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_attempts` ADD INDEX(quiz) ");
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_attempts` ADD INDEX(userid) ");
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_grades` ADD INDEX(quiz) ");
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_grades` ADD INDEX(userid) ");
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_question_grades` ADD INDEX(quiz) ");
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_question_grades` ADD INDEX(question) ");
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_randommatch` ADD INDEX(question) ");
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_responses` ADD INDEX(attempt) ");
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz_responses` ADD INDEX(question) ");
     }
 
-    if ($oldversion < 2003033100) {
-        modify_database ("", "ALTER TABLE prefix_quiz_randommatch RENAME prefix_quiz_randomsamatch ");
-        modify_database ("", "CREATE TABLE `prefix_quiz_match` (
+    if ($success && $oldversion < 2003033100) {
+        $success = $success && modify_database ("", "ALTER TABLE prefix_quiz_randommatch RENAME prefix_quiz_randomsamatch ");
+        $success = $success && modify_database ("", "CREATE TABLE `prefix_quiz_match` (
                              `id` int(10) unsigned NOT NULL auto_increment,
                              `question` int(10) unsigned NOT NULL default '0',
                              `subquestions` varchar(255) NOT NULL default '',
@@ -85,7 +85,7 @@ function quiz_upgrade($oldversion) {
                              KEY `question` (`question`)
                            );");
 
-        modify_database ("", "CREATE TABLE `prefix_quiz_match_sub` (
+        $success = $success && modify_database ("", "CREATE TABLE `prefix_quiz_match_sub` (
                              `id` int(10) unsigned NOT NULL auto_increment,
                              `question` int(10) unsigned NOT NULL default '0',
                              `questiontext` text NOT NULL,
@@ -95,14 +95,14 @@ function quiz_upgrade($oldversion) {
                            );");
     }
 
-    if ($oldversion < 2003040901) {
-        table_column("quiz", "", "shufflequestions", "INTEGER", "4", "UNSIGNED", "0", "NOT NULL", "review");
-        table_column("quiz", "", "shuffleanswers", "INTEGER", "4", "UNSIGNED", "0", "NOT NULL", "shufflequestions");
+    if ($success && $oldversion < 2003040901) {
+        $success = $success && table_column("quiz", "", "shufflequestions", "INTEGER", "4", "UNSIGNED", "0", "NOT NULL", "review");
+        $success = $success && table_column("quiz", "", "shuffleanswers", "INTEGER", "4", "UNSIGNED", "0", "NOT NULL", "shufflequestions");
     }
 
-    if ($oldversion < 2003071001) {
+    if ($success && $oldversion < 2003071001) {
 
-        modify_database ("", " CREATE TABLE `prefix_quiz_numerical` (
+        $success = $success && modify_database ("", " CREATE TABLE `prefix_quiz_numerical` (
                                `id` int(10) unsigned NOT NULL auto_increment,
                                `question` int(10) unsigned NOT NULL default '0',
                                `answer` int(10) unsigned NOT NULL default '0',
@@ -113,12 +113,12 @@ function quiz_upgrade($oldversion) {
                              ) TYPE=MyISAM COMMENT='Options for numerical questions'; ");
     }
 
-    if ($oldversion < 2003072400) {
-        execute_sql(" INSERT INTO {$CFG->prefix}log_display (module, action, mtable, field) VALUES ('quiz', 'review', 'quiz', 'name') ");
+    if ($success && $oldversion < 2003072400) {
+        $success = $success && execute_sql(" INSERT INTO {$CFG->prefix}log_display (module, action, mtable, field) VALUES ('quiz', 'review', 'quiz', 'name') ");
     }
 
-    if ($oldversion < 2003072901) {
-        modify_database ("", " CREATE TABLE `prefix_quiz_multianswers` (
+    if ($success && $oldversion < 2003072901) {
+        $success = $success && modify_database ("", " CREATE TABLE `prefix_quiz_multianswers` (
                                `id` int(10) unsigned NOT NULL auto_increment,
                                 `question` int(10) unsigned NOT NULL default '0',
                                 `answers` varchar(255) NOT NULL default '',
@@ -130,44 +130,46 @@ function quiz_upgrade($oldversion) {
                               ) TYPE=MyISAM COMMENT='Options for multianswer questions'; ");
     }
 
-    if ($oldversion < 2003080301) {
-        execute_sql(" ALTER TABLE {$CFG->prefix}quiz ADD eachattemptbuildsonthelast TINYINT(4) DEFAULT '0' NOT NULL AFTER `attempts` ");
+    if ($success && $oldversion < 2003080301) {
+        $success = $success && execute_sql(" ALTER TABLE {$CFG->prefix}quiz ADD eachattemptbuildsonthelast TINYINT(4) DEFAULT '0' NOT NULL AFTER `attempts` ");
     }
 
-    if ($oldversion < 2003080400) {
-        table_column("quiz", "eachattemptbuildsonthelast", "attemptonlast", "TINYINT", "4", "UNSIGNED", "0", "NOT NULL", "");
+    if ($success && $oldversion < 2003080400) {
+        $success = $success && table_column("quiz", "eachattemptbuildsonthelast", "attemptonlast", "TINYINT", "4", "UNSIGNED", "0", "NOT NULL", "");
     }
 
-    if ($oldversion < 2003082300) {
-        table_column("quiz_questions", "", "stamp", "varchar", "255", "", "", "not null", "qtype");
+    if ($success && $oldversion < 2003082300) {
+        $success = $success && table_column("quiz_questions", "", "stamp", "varchar", "255", "", "", "not null", "qtype");
     }
 
-    if ($oldversion < 2003082301) {
-        table_column("quiz_questions", "stamp", "stamp", "varchar", "255", "", "", "not null");
-        table_column("quiz_questions", "", "version", "integer", "10", "", "1", "not null", "stamp");
+    if ($success && $oldversion < 2003082301) {
+        $success = $success && table_column("quiz_questions", "stamp", "stamp", "varchar", "255", "", "", "not null");
+        $success = $success && table_column("quiz_questions", "", "version", "integer", "10", "", "1", "not null", "stamp");
         if ($questions = get_records("quiz_questions")) {
             foreach ($questions as $question) {
                 $stamp = make_unique_id_code();
-                if (!set_field("quiz_questions", "stamp", $stamp, "id", $question->id)) {
+                if (!($success = $success && set_field("quiz_questions", "stamp", $stamp, "id", $question->id))) {
                     notify("Error while adding stamp to question id = $question->id");
+                    break;
                 }
             }
         }
     }
 
-    if ($oldversion < 2003082700) {
-        table_column("quiz_categories", "", "stamp", "varchar", "255", "", "", "not null");
+    if ($success && $oldversion < 2003082700) {
+        $success = $success && table_column("quiz_categories", "", "stamp", "varchar", "255", "", "", "not null");
         if ($categories = get_records("quiz_categories")) {
             foreach ($categories as $category) {
                 $stamp = make_unique_id_code();
-                if (!set_field("quiz_categories", "stamp", $stamp, "id", $category->id)) {
+                if (!($success = $success && set_field("quiz_categories", "stamp", $stamp, "id", $category->id))) {
                     notify("Error while adding stamp to category id = $category->id");
+                    break;
                 }
             }
         }
     }
 
-    if ($oldversion < 2003111100) {
+    if ($success && $oldversion < 2003111100) {
         $duplicates = get_records_sql("SELECT stamp as id,count(*) as cuenta
                                        FROM {$CFG->prefix}quiz_questions
                                        GROUP BY stamp
@@ -180,7 +182,7 @@ function quiz_upgrade($oldversion) {
                 $add = 1;
                 foreach ($questions as $question) {
                     echo "Changing question id $question->id stamp to ".$duplicate->id.$add."<br />";
-                    set_field("quiz_questions","stamp",$duplicate->id.$add,"id",$question->id);
+                    $success = $success && set_field("quiz_questions","stamp",$duplicate->id.$add,"id",$question->id);
                     $add++;
                 }
             }
@@ -189,34 +191,34 @@ function quiz_upgrade($oldversion) {
         }
     }
 
-    if ($oldversion < 2004021300) {
-        table_column("quiz_questions", "", "questiontextformat", "integer", "2", "", "0", "not null", "questiontext");
+    if ($success && $oldversion < 2004021300) {
+        $success = $success && table_column("quiz_questions", "", "questiontextformat", "integer", "2", "", "0", "not null", "questiontext");
     }
 
-    if ($oldversion < 2004021900) {
-        modify_database("","INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'add', 'quiz', 'name');");
-        modify_database("","INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'update', 'quiz', 'name');");
+    if ($success && $oldversion < 2004021900) {
+        $success = $success && modify_database("","INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'add', 'quiz', 'name');");
+        $success = $success && modify_database("","INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'update', 'quiz', 'name');");
     }
 
-    if ($oldversion < 2004051700) {
+    if ($success && $oldversion < 2004051700) {
         include_once("$CFG->dirroot/mod/quiz/lib.php");
-        quiz_refresh_events();
+        $success = $success && quiz_refresh_events();
     }
 
-    if ($oldversion < 2004060200) {
-        execute_sql(" ALTER TABLE {$CFG->prefix}quiz ADD timelimit INT(2) UNSIGNED DEFAULT '0' NOT NULL ");
+    if ($success && $oldversion < 2004060200) {
+        $success = $success && execute_sql(" ALTER TABLE {$CFG->prefix}quiz ADD timelimit INT(2) UNSIGNED DEFAULT '0' NOT NULL ");
     }
 
-    if ($oldversion < 2004070700) {
-        table_column("quiz", "", "password", "varchar", "255", "", "", "not null", "");
-        table_column("quiz", "", "subnet", "varchar", "255", "", "", "not null", "");
+    if ($success && $oldversion < 2004070700) {
+        $success = $success && table_column("quiz", "", "password", "varchar", "255", "", "", "not null", "");
+        $success = $success && table_column("quiz", "", "subnet", "varchar", "255", "", "", "not null", "");
     }
 
-    if ($oldversion < 2004073001) {
+    if ($success && $oldversion < 2004073001) {
         // Six new tables:
 
         // One table for handling units for numerical questions
-        modify_database ("", " CREATE TABLE `prefix_quiz_numerical_units` (
+        $success = $success && modify_database ("", " CREATE TABLE `prefix_quiz_numerical_units` (
                                `id` int(10) unsigned NOT NULL auto_increment,
                                `question` int(10) unsigned NOT NULL default '0',
                                `multiplier` decimal(40,20) NOT NULL default '1.00000000000000000000',
@@ -226,7 +228,7 @@ function quiz_upgrade($oldversion) {
 
         // Four tables for handling distribution and storage of
         // individual data for dataset dependent question types
-        modify_database ("", " CREATE TABLE `prefix_quiz_attemptonlast_datasets` (
+        $success = $success && modify_database ("", " CREATE TABLE `prefix_quiz_attemptonlast_datasets` (
                                `id` int(10) unsigned NOT NULL auto_increment,
                                `category` int(10) unsigned NOT NULL default '0',
                                `userid` int(10) unsigned NOT NULL default '0',
@@ -234,7 +236,7 @@ function quiz_upgrade($oldversion) {
                                PRIMARY KEY  (`id`),
                                UNIQUE KEY `category` (`category`,`userid`)
             ) TYPE=MyISAM COMMENT='Dataset number for attemptonlast attempts per user'; ");
-        modify_database ("", " CREATE TABLE `prefix_quiz_dataset_definitions` (
+        $success = $success && modify_database ("", " CREATE TABLE `prefix_quiz_dataset_definitions` (
                                `id` int(10) unsigned NOT NULL auto_increment,
                                `category` int(10) unsigned NOT NULL default '0',
                                `name` varchar(255) NOT NULL default '',
@@ -243,7 +245,7 @@ function quiz_upgrade($oldversion) {
                                `itemcount` int(10) unsigned NOT NULL default '0',
                                PRIMARY KEY  (`id`)
             ) TYPE=MyISAM COMMENT='Organises and stores properties for dataset items'; ");
-        modify_database ("", " CREATE TABLE `prefix_quiz_dataset_items` (
+        $success = $success && modify_database ("", " CREATE TABLE `prefix_quiz_dataset_items` (
                                `id` int(10) unsigned NOT NULL auto_increment,
                                `definition` int(10) unsigned NOT NULL default '0',
                                `number` int(10) unsigned NOT NULL default '0',
@@ -251,7 +253,7 @@ function quiz_upgrade($oldversion) {
                                PRIMARY KEY  (`id`),
                                KEY `definition` (`definition`)
                              ) TYPE=MyISAM COMMENT='Individual dataset items'; ");
-        modify_database ("", " CREATE TABLE `prefix_quiz_question_datasets` (
+        $success = $success && modify_database ("", " CREATE TABLE `prefix_quiz_question_datasets` (
                                `id` int(10) unsigned NOT NULL auto_increment,
                                `question` int(10) unsigned NOT NULL default '0',
                                `datasetdefinition` int(10) unsigned NOT NULL default '0',
@@ -261,7 +263,7 @@ function quiz_upgrade($oldversion) {
 
         // One table for new question type calculated
         //  - the first dataset dependent question type
-        modify_database ("", " CREATE TABLE `prefix_quiz_calculated` (
+        $success = $success && modify_database ("", " CREATE TABLE `prefix_quiz_calculated` (
                                `id` int(10) unsigned NOT NULL auto_increment,
                                `question` int(10) unsigned NOT NULL default '0',
                                `answer` int(10) unsigned NOT NULL default '0',
@@ -273,57 +275,57 @@ function quiz_upgrade($oldversion) {
                 ) TYPE=MyISAM COMMENT='Options for questions of type calculated'; ");
     }
 
-    if ($oldversion < 2004111400) {
-        table_column("quiz_responses", "answer", "answer", "text", "", "", "", "not null");
+    if ($success && $oldversion < 2004111400) {
+        $success = $success && table_column("quiz_responses", "answer", "answer", "text", "", "", "", "not null");
     }
 
-    if ($oldversion < 2004111700) {
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz DROP INDEX course;",false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_calculated DROP INDEX answer;",false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_categories DROP INDEX course;",false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_dataset_definitions DROP INDEX category;",false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical DROP INDEX question;",false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical_units DROP INDEX question;",false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_questions DROP INDEX category;",false);
+    if ($success && $oldversion < 2004111700) {
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz DROP INDEX course;",false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_calculated DROP INDEX answer;",false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_categories DROP INDEX course;",false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_dataset_definitions DROP INDEX category;",false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical DROP INDEX question;",false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical_units DROP INDEX question;",false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_questions DROP INDEX category;",false);
 
-        modify_database('','ALTER TABLE prefix_quiz ADD INDEX course (course);');
-        modify_database('','ALTER TABLE prefix_quiz_calculated ADD INDEX answer (answer);');
-        modify_database('','ALTER TABLE prefix_quiz_categories ADD INDEX course (course);');
-        modify_database('','ALTER TABLE prefix_quiz_dataset_definitions ADD INDEX category (category);');
-        modify_database('','ALTER TABLE prefix_quiz_numerical ADD INDEX question (question);');
-        modify_database('','ALTER TABLE prefix_quiz_numerical_units ADD INDEX question (question);');
-        modify_database('','ALTER TABLE prefix_quiz_questions ADD INDEX category (category);');
+        $success = $success && modify_database('','ALTER TABLE prefix_quiz ADD INDEX course (course);');
+        $success = $success && modify_database('','ALTER TABLE prefix_quiz_calculated ADD INDEX answer (answer);');
+        $success = $success && modify_database('','ALTER TABLE prefix_quiz_categories ADD INDEX course (course);');
+        $success = $success && modify_database('','ALTER TABLE prefix_quiz_dataset_definitions ADD INDEX category (category);');
+        $success = $success && modify_database('','ALTER TABLE prefix_quiz_numerical ADD INDEX question (question);');
+        $success = $success && modify_database('','ALTER TABLE prefix_quiz_numerical_units ADD INDEX question (question);');
+        $success = $success && modify_database('','ALTER TABLE prefix_quiz_questions ADD INDEX category (category);');
     }
 
-    if ($oldversion < 2004120501) {
-        table_column("quiz_calculated", "", "correctanswerformat", "integer", "10", "", "2", "not null", "correctanswerlength");
+    if ($success && $oldversion < 2004120501) {
+        $success = $success && table_column("quiz_calculated", "", "correctanswerformat", "integer", "10", "", "2", "not null", "correctanswerlength");
     }
 
-    if ($oldversion < 2004121400) {  // New field to determine popup window behaviour
-        table_column("quiz", "", "popup", "integer", "4", "", "0", "not null", "subnet");
+    if ($success && $oldversion < 2004121400) {  // New field to determine popup window behaviour
+        $success = $success && table_column("quiz", "", "popup", "integer", "4", "", "0", "not null", "subnet");
     }
 
-    if ($oldversion < 2005010201) {
-        table_column('quiz_categories', '', 'parent');
-        table_column('quiz_categories', '', 'sortorder', 'integer', '10', '', '999');
+    if ($success && $oldversion < 2005010201) {
+        $success = $success && table_column('quiz_categories', '', 'parent');
+        $success = $success && table_column('quiz_categories', '', 'sortorder', 'integer', '10', '', '999');
     }
 
-    if ($oldversion < 2005010300) {
-        table_column("quiz", "", "questionsperpage", "integer", "10", "", "0", "not null", "review");
+    if ($success && $oldversion < 2005010300) {
+        $success = $success && table_column("quiz", "", "questionsperpage", "integer", "10", "", "0", "not null", "review");
     }
 
-    if ($oldversion < 2005012700) {
-        table_column('quiz_grades', 'grade', 'grade', 'real', 2, '');
+    if ($success && $oldversion < 2005012700) {
+        $success = $success && table_column('quiz_grades', 'grade', 'grade', 'real', 2, '');
     }
 
-    if ($oldversion < 2005021400) {
-        table_column("quiz", "", "decimalpoints", "integer", "4", "", "2", "not null", "grademethod");
+    if ($success && $oldversion < 2005021400) {
+        $success = $success && table_column("quiz", "", "decimalpoints", "integer", "4", "", "2", "not null", "grademethod");
     }
 
-    if($oldversion < 2005022800) {
-        table_column('quiz_questions', '', 'hidden', 'integer', '1', 'unsigned', '0', 'not null', 'version');
-        table_column('quiz_responses', '', 'originalquestion', 'integer', '10', 'unsigned', '0', 'not null', 'question');
-        modify_database ('', "CREATE TABLE `prefix_quiz_question_version` (
+    if($success && $oldversion < 2005022800) {
+        $success = $success && table_column('quiz_questions', '', 'hidden', 'integer', '1', 'unsigned', '0', 'not null', 'version');
+        $success = $success && table_column('quiz_responses', '', 'originalquestion', 'integer', '10', 'unsigned', '0', 'not null', 'question');
+        $success = $success && modify_database ('', "CREATE TABLE `prefix_quiz_question_version` (
                               `id` int(10) unsigned NOT NULL auto_increment,
                               `quiz` int(10) unsigned NOT NULL default '0',
                               `oldquestion` int(10) unsigned NOT NULL default '0',
@@ -334,15 +336,15 @@ function quiz_upgrade($oldversion) {
                             ) TYPE=MyISAM COMMENT='The mapping between old and new versions of a question';");
     }
 
-    if ($oldversion < 2005032000) {
-        execute_sql(" INSERT INTO {$CFG->prefix}log_display (module, action, mtable, field) VALUES ('quiz', 'editquestions', 'quiz', 'name') ");
+    if ($success && $oldversion < 2005032000) {
+        $success = $success && execute_sql(" INSERT INTO {$CFG->prefix}log_display (module, action, mtable, field) VALUES ('quiz', 'editquestions', 'quiz', 'name') ");
     }
 
-    if ($oldversion < 2005032300) {
-        modify_database ('', 'ALTER TABLE prefix_quiz_question_version RENAME prefix_quiz_question_versions;');
+    if ($success && $oldversion < 2005032300) {
+        $success = $success && modify_database ('', 'ALTER TABLE prefix_quiz_question_version RENAME prefix_quiz_question_versions;');
     }
 
-    if ($oldversion < 2005041200) { // replace wiki-like with markdown
+    if ($success && $oldversion < 2005041200) { // replace wiki-like with markdown
         include_once( "$CFG->dirroot/lib/wiki_to_markdown.php" );
         $wtm = new WikiToMarkdown();
         $sql = "select course from {$CFG->prefix}quiz_categories c, {$CFG->prefix}quiz_questions q ";
@@ -351,35 +353,35 @@ function quiz_upgrade($oldversion) {
         $wtm->update( 'quiz_questions', 'questiontext', 'questiontextformat', $sql );
     }
 
-    if ($oldversion < 2005041304) {
+    if ($success && $oldversion < 2005041304) {
         // make random questions hidden
-        modify_database('', "UPDATE prefix_quiz_questions SET hidden = '1' WHERE qtype ='".RANDOM."';");
+        $success = $success && modify_database('', "UPDATE prefix_quiz_questions SET hidden = '1' WHERE qtype ='".RANDOM."';");
     }
 
-    if ($oldversion < 2005042002) {
-        table_column('quiz_answers', 'answer', 'answer', 'text', '', '', '', 'not null', '');
+    if ($success && $oldversion < 2005042002) {
+        $success = $success && table_column('quiz_answers', 'answer', 'answer', 'text', '', '', '', 'not null', '');
     }
 
-    if ($oldversion < 2005042400) {
+    if ($success && $oldversion < 2005042400) {
 
     // Changes to quiz table
 
         // The bits of the optionflags field will hold various option flags
-        table_column('quiz', '', 'optionflags', 'integer', '10', 'unsigned', '0', 'not null', 'timeclose');
+        $success = $success && table_column('quiz', '', 'optionflags', 'integer', '10', 'unsigned', '0', 'not null', 'timeclose');
 
         // The penalty scheme
-        table_column('quiz', '', 'penaltyscheme', 'integer', '4', 'unsigned', '0', 'not null', 'optionflags');
+        $success = $success && table_column('quiz', '', 'penaltyscheme', 'integer', '4', 'unsigned', '0', 'not null', 'optionflags');
 
         // The review options are now all stored in the bits of the review field
-        table_column('quiz', 'review', 'review', 'integer', 10, 'unsigned', 0, 'not null', '');
+        $success = $success && table_column('quiz', 'review', 'review', 'integer', 10, 'unsigned', 0, 'not null', '');
 
     /// Changes to quiz_attempts table
 
         // The preview flag marks teacher previews
-        table_column('quiz_attempts', '', 'preview', 'tinyint', '2', 'unsigned', '0', 'not null', 'timemodified');
+        $success = $success && table_column('quiz_attempts', '', 'preview', 'tinyint', '2', 'unsigned', '0', 'not null', 'timemodified');
 
         // The layout is the list of questions with inserted page breaks.
-        table_column('quiz_attempts', '', 'layout', 'text', '', '', '', 'not null', 'timemodified');
+        $success = $success && table_column('quiz_attempts', '', 'layout', 'text', '', '', '', 'not null', 'timemodified');
         // For old quiz attempts we will set this to the repaginated question list from $quiz->questions
 
     /// The following updates of field values require a loop through all quizzes
@@ -395,14 +397,14 @@ function quiz_upgrade($oldversion) {
                 // repaginate
                 if ($quiz->questionsperpage) {
                     $quiz->questions = quiz_repaginate($quiz->questions, $quiz->questionsperpage);
-                    set_field('quiz', 'questions', $quiz->questions, 'id', $quiz->id);
+                    $success = $success && set_field('quiz', 'questions', $quiz->questions, 'id', $quiz->id);
                 }
-                set_field('quiz_attempts', 'layout', $quiz->questions, 'quiz', $quiz->id);
+                $success = $success && set_field('quiz_attempts', 'layout', $quiz->questions, 'quiz', $quiz->id);
 
                 // set preview flag
                 if ($teachers = get_course_teachers($quiz->course)) {
                     $teacherids = implode(',', array_keys($teachers));
-                    execute_sql("UPDATE {$CFG->prefix}quiz_attempts SET preview = 1 WHERE userid IN ($teacherids)");
+                    $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_attempts SET preview = 1 WHERE userid IN ($teacherids)");
                 }
 
                 // set review flags in quiz table
@@ -419,48 +421,48 @@ function quiz_upgrade($oldversion) {
                 if ($quiz->review & 2) {
                     $review += QUIZ_REVIEW_OPEN;
                 }
-                set_field('quiz', 'review', $review, 'id', $quiz->id);
+                $success = $success && set_field('quiz', 'review', $review, 'id', $quiz->id);
             }
             $db->debug = $olddebug;
         }
 
         // We can now drop the fields whose data has been moved to the review field
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz` DROP feedback");
-        execute_sql(" ALTER TABLE `{$CFG->prefix}quiz` DROP correctanswers");
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz` DROP feedback");
+        $success = $success && execute_sql(" ALTER TABLE `{$CFG->prefix}quiz` DROP correctanswers");
 
     /// Renaming tables
 
         // rename the quiz_question_grades table to quiz_question_instances
-        modify_database ('', 'ALTER TABLE prefix_quiz_question_grades RENAME prefix_quiz_question_instances;');
+        $success = $success && modify_database ('', 'ALTER TABLE prefix_quiz_question_grades RENAME prefix_quiz_question_instances;');
 
         // rename the quiz_responses table quiz_states
-        modify_database ('', 'ALTER TABLE prefix_quiz_responses RENAME prefix_quiz_states;');
+        $success = $success && modify_database ('', 'ALTER TABLE prefix_quiz_responses RENAME prefix_quiz_states;');
 
     /// add columns to quiz_states table
 
         // The sequence number of the state.
-        table_column('quiz_states', '', 'seq_number', 'integer', '6', 'unsigned', '0', 'not null', 'originalquestion');
+        $success = $success && table_column('quiz_states', '', 'seq_number', 'integer', '6', 'unsigned', '0', 'not null', 'originalquestion');
         // For existing states we leave this at 0 because in the old quiz code there was only one response allowed
 
         // The time the state was created.
-        table_column('quiz_states', '', 'timestamp', 'integer', '10', 'unsigned', '0', 'not null', 'answer');
+        $success = $success && table_column('quiz_states', '', 'timestamp', 'integer', '10', 'unsigned', '0', 'not null', 'answer');
         // For existing states we will below set this to the timemodified field of the attempt
 
         // The type of event that led to the creation of the state
-        table_column('quiz_states', '', 'event', 'integer', '4', 'unsigned', '0', 'not null', 'timestamp');
+        $success = $success && table_column('quiz_states', '', 'event', 'integer', '4', 'unsigned', '0', 'not null', 'timestamp');
 
         // The raw grade
-        table_column('quiz_states', '', 'raw_grade', 'varchar', '10', '', '', 'not null', 'grade');
+        $success = $success && table_column('quiz_states', '', 'raw_grade', 'varchar', '10', '', '', 'not null', 'grade');
         // For existing states (no penalties) this is equal to the grade
-        execute_sql("UPDATE {$CFG->prefix}quiz_states SET raw_grade = grade");
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_states SET raw_grade = grade");
 
         // The penalty that the response attracted
-        table_column('quiz_states', '', 'penalty', 'varchar', '10', '', '0.0', 'not null', 'raw_grade');
+        $success = $success && table_column('quiz_states', '', 'penalty', 'varchar', '10', '', '0.0', 'not null', 'raw_grade');
         // For existing states this can stay at 0 because penalties did not exist previously.
 
     /// New table for pointers to newest and newest graded states
 
-        modify_database('', "CREATE TABLE `prefix_quiz_newest_states` (
+        $success = $success && modify_database('', "CREATE TABLE `prefix_quiz_newest_states` (
                              `id` int(10) unsigned NOT NULL auto_increment,
                              `attemptid` int(10) unsigned NOT NULL default '0',
                              `questionid` int(10) unsigned NOT NULL default '0',
@@ -486,9 +488,9 @@ function quiz_upgrade($oldversion) {
 
     /// Entries for the log_display table
 
-        modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'preview', 'quiz', 'name');");
-        modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'start attempt', 'quiz', 'name');");
-        modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'close attempt', 'quiz', 'name');");
+        $success = $success && modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'preview', 'quiz', 'name');");
+        $success = $success && modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'start attempt', 'quiz', 'name');");
+        $success = $success && modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'close attempt', 'quiz', 'name');");
 
     /// update the default settings in $CFG
         $review = (QUIZ_REVIEW_IMMEDIATELY & (QUIZ_REVIEW_RESPONSES + QUIZ_REVIEW_SCORES));
@@ -504,16 +506,16 @@ function quiz_upgrade($oldversion) {
         if (isset($CFG->quiz_review) and ($CFG->quiz_review & 2)) {
             $review += QUIZ_REVIEW_OPEN;
         }
-        set_config('quiz_review', $review);
+        $success = $success && set_config('quiz_review', $review);
 
     /// Use tolerance instead of min and max in numerical question type
-        table_column('quiz_numerical', '', 'tolerance', 'varchar', '255', '', '0.0', 'not null', 'answer');
-        execute_sql("UPDATE {$CFG->prefix}quiz_numerical SET tolerance = (max-min)/2");
-        modify_database('', 'ALTER TABLE `prefix_quiz_numerical` DROP `min`'); // Replaced by tolerance
-        modify_database('', 'ALTER TABLE `prefix_quiz_numerical` DROP `max`'); // Replaced by tolerance
+        $success = $success && table_column('quiz_numerical', '', 'tolerance', 'varchar', '255', '', '0.0', 'not null', 'answer');
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_numerical SET tolerance = (max-min)/2");
+        $success = $success && modify_database('', 'ALTER TABLE `prefix_quiz_numerical` DROP `min`'); // Replaced by tolerance
+        $success = $success && modify_database('', 'ALTER TABLE `prefix_quiz_numerical` DROP `max`'); // Replaced by tolerance
 
     /// Tables for Remote Questions
-        modify_database ('', "CREATE TABLE `prefix_quiz_rqp` (
+        $success = $success && modify_database ('', "CREATE TABLE `prefix_quiz_rqp` (
                               `id` int(10) unsigned NOT NULL auto_increment,
                               `question` int(10) unsigned NOT NULL default '0',
                               `type` int(10) unsigned NOT NULL default '0',
@@ -525,7 +527,7 @@ function quiz_upgrade($oldversion) {
                               KEY `question` (`question`)
                               ) TYPE=MyISAM COMMENT='Options for RQP questions';");
 
-        modify_database ('', "CREATE TABLE `prefix_quiz_rqp_type` (
+        $success = $success && modify_database ('', "CREATE TABLE `prefix_quiz_rqp_type` (
                               `id` int(10) unsigned NOT NULL auto_increment,
                               `name` varchar(255) NOT NULL default '',
                               `rendering_server` varchar(255) NOT NULL default '',
@@ -535,7 +537,7 @@ function quiz_upgrade($oldversion) {
                               UNIQUE KEY `name` (`name`)
                               ) TYPE=MyISAM COMMENT='RQP question types and the servers to be used to process them';");
 
-        modify_database ('', "CREATE TABLE `prefix_quiz_rqp_states` (
+        $success = $success && modify_database ('', "CREATE TABLE `prefix_quiz_rqp_states` (
                               `id` int(10) unsigned NOT NULL auto_increment,
                               `stateid` int(10) unsigned NOT NULL default '0',
                               `responses` text NOT NULL default '',
@@ -545,21 +547,21 @@ function quiz_upgrade($oldversion) {
                               ) TYPE=MyISAM COMMENT='RQP question type specific state information';");
     }
 
-    if ($oldversion < 2005050300) {
+    if ($success && $oldversion < 2005050300) {
         // length of question determines question numbering. Currently all questions require one
         // question number except for DESCRIPTION questions.
-        table_column('quiz_questions', '', 'length', 'integer', '10', 'unsigned', '1', 'not null', 'qtype');
-        execute_sql("UPDATE {$CFG->prefix}quiz_questions SET length = 0 WHERE qtype = ".DESCRIPTION);
+        $success = $success && table_column('quiz_questions', '', 'length', 'integer', '10', 'unsigned', '1', 'not null', 'qtype');
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_questions SET length = 0 WHERE qtype = ".DESCRIPTION);
     }
 
-    if ($oldversion < 2005050408) {
-        table_column('quiz_questions', '', 'penalty', 'float', '', '', '0.1', 'not null', 'defaultgrade');
-        table_column('quiz_newest_states', 'new', 'newest', 'integer', '10', 'unsigned', '0', 'not null');
+    if ($success && $oldversion < 2005050408) {
+        $success = $success && table_column('quiz_questions', '', 'penalty', 'float', '', '', '0.1', 'not null', 'defaultgrade');
+        $success = $success && table_column('quiz_newest_states', 'new', 'newest', 'integer', '10', 'unsigned', '0', 'not null');
     }
 
-    if ($oldversion < 2005051400) {
-        modify_database('', 'ALTER TABLE prefix_quiz_rqp_type RENAME prefix_quiz_rqp_types;');
-        modify_database('', "CREATE TABLE `prefix_quiz_rqp_servers` (
+    if ($success && $oldversion < 2005051400) {
+        $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_rqp_type RENAME prefix_quiz_rqp_types;');
+        $success = $success && modify_database('', "CREATE TABLE `prefix_quiz_rqp_servers` (
                       id int(10) unsigned NOT NULL auto_increment,
                       typeid int(10) unsigned NOT NULL default '0',
                       url varchar(255) NOT NULL default '',
@@ -569,22 +571,23 @@ function quiz_upgrade($oldversion) {
                     ) TYPE=MyISAM COMMENT='Information about RQP servers';");
         if ($types = get_records('quiz_rqp_types')) {
             foreach($types as $type) {
+                $server = new stdClass;
                 $server->typeid = $type->id;
                 $server->url = $type->rendering_server;
                 $server->can_render = 1;
-                insert_record('quiz_rqp_servers', $server);
+                $success = $success && insert_record('quiz_rqp_servers', $server);
             }
         }
-        modify_database('', 'ALTER TABLE prefix_quiz_rqp_types DROP rendering_server');
-        modify_database('', 'ALTER TABLE prefix_quiz_rqp_types DROP cloning_server');
-        modify_database('', 'ALTER TABLE prefix_quiz_rqp_types DROP flags');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_rqp_types DROP rendering_server');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_rqp_types DROP cloning_server');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_rqp_types DROP flags');
     }
 
-    if ($oldversion < 2005051401) {
+    if ($success && $oldversion < 2005051401) {
         // Some earlier changes are undone here, so we need another condition
         if ($oldversion >= 2005042900) {
             // Restore the answer field
-            table_column('quiz_numerical', '', 'answer', 'integer', '10', 'unsigned', '0', 'not null', 'answers');
+            $success = $success && table_column('quiz_numerical', '', 'answer', 'integer', '10', 'unsigned', '0', 'not null', 'answers');
             $singleanswer = array();
             if ($numericals = get_records('quiz_numerical')) {
                 $numericals = array_values($numericals);
@@ -599,10 +602,10 @@ function quiz_upgrade($oldversion) {
                         $answers = explode(',', $numerical->answers);
                         foreach ($answers as $answer) {
                             $numerical->answer = $answer;
-                            insert_record('quiz_numerical', $numerical);
+                            $success = $success && insert_record('quiz_numerical', $numerical);
                         }
                         // ... and get rid of the old record
-                        delete_records('quiz_numerical', 'id', $id);
+                        $success = $success && delete_records('quiz_numerical', 'id', $id);
                     } else {
                         $singleanswer[] = $numerical->id;
                     }
@@ -612,21 +615,21 @@ function quiz_upgrade($oldversion) {
             // Do all of these at once
             if (!empty($singleanswer)) {
                 $singleanswer = implode(',', $singleanswer);
-                modify_database('', "UPDATE prefix_quiz_numerical SET answer = answers WHERE id IN ($singleanswer);");
+                $success = $success && modify_database('', "UPDATE prefix_quiz_numerical SET answer = answers WHERE id IN ($singleanswer);");
             }
 
             // All answer fields are set, so we can delete the answers field
-            modify_database('', 'ALTER TABLE `prefix_quiz_numerical` DROP `answers`');
+            $success = $success && modify_database('', 'ALTER TABLE `prefix_quiz_numerical` DROP `answers`');
 
         // If the earlier changes weren't made we can safely do only the
         // bits here.
         } else {
             // Comma separated questionids will be stored as sequence
-            table_column('quiz_multianswers', '', 'sequence',  'varchar', '255', '', '', 'not null', 'question');
+            $success = $success && table_column('quiz_multianswers', '', 'sequence',  'varchar', '255', '', '', 'not null', 'question');
             // Change the type of positionkey to int, so that the sorting works!
-            table_column('quiz_multianswers', 'positionkey', 'positionkey',  'integer', '10', 'unsigned', '0', 'not null', '');
-            table_column('quiz_questions', '', 'parent', 'integer', '10', 'unsigned', '0', 'not null', 'category');
-            modify_database('', "UPDATE prefix_quiz_questions SET parent = id WHERE qtype ='".RANDOM."';");
+            $success = $success && table_column('quiz_multianswers', 'positionkey', 'positionkey',  'integer', '10', 'unsigned', '0', 'not null', '');
+            $success = $success && table_column('quiz_questions', '', 'parent', 'integer', '10', 'unsigned', '0', 'not null', 'category');
+            $success = $success && modify_database('', "UPDATE prefix_quiz_questions SET parent = id WHERE qtype ='".RANDOM."';");
 
             // Each multianswer record is converted to a question object and then
             // inserted as a new question into the quiz_questions table.
@@ -678,18 +681,19 @@ function quiz_upgrade($oldversion) {
                     // $multianswers[$i]->defaultgrade is set in the query
                     // $multianswers[$i]->qtype is set in the query
                     $id = insert_record('quiz_questions', $multianswers[$i]);
+                    $success = $success && $id;
                     $sequence[$pos] = $id;
 
                 // Update the quiz_answers table to point to these new questions
-                execute_sql("UPDATE {$CFG->prefix}quiz_answers SET question = '$id' WHERE id IN ($answers)", false);
+                $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_answers SET question = '$id' WHERE id IN ($answers)", false);
                 // Update the questiontype tables to point to these new questions
 
                     if (SHORTANSWER == $multianswers[$i]->qtype) {
-                        execute_sql("UPDATE {$CFG->prefix}quiz_shortanswer SET question = '$id' WHERE answers = '$answers'", false);
+                        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_shortanswer SET question = '$id' WHERE answers = '$answers'", false);
                     } else if (MULTICHOICE == $multianswers[$i]->qtype) {
-                        execute_sql("UPDATE {$CFG->prefix}quiz_multichoice SET question = '$id' WHERE answers = '$answers'", false);
+                        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_multichoice SET question = '$id' WHERE answers = '$answers'", false);
                     } else if (NUMERICAL == $multianswers[$i]->qtype) {
-                        execute_sql("UPDATE {$CFG->prefix}quiz_numerical SET question = '$id' WHERE answer IN ($answers)", false);
+                        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_numerical SET question = '$id' WHERE answer IN ($answers)", false);
                     }
 
                     // Whenever we're through with the subquestions of one multianswer
@@ -714,15 +718,15 @@ function quiz_upgrade($oldversion) {
                                     }
                                 }
                                 $state->answer = rtrim($state->answer, ','); // strip trailing comma
-                                update_record('quiz_states', $state);
+                                $success = $success && update_record('quiz_states', $state);
                             }
                         }
 
-                        delete_records('quiz_multianswers', 'question', $parent);
+                        $success = $success && delete_records('quiz_multianswers', 'question', $parent);
                         $multi = new stdClass;
                         $multi->question = $parent;
                         $multi->sequence = implode(',', $sequence);
-                        insert_record('quiz_multianswers', $multi);
+                        $success = $success && insert_record('quiz_multianswers', $multi);
 
                         if (isset($multianswers[$i+1])) {
                             $parent    = $multianswers[$i+1]->parent;
@@ -735,14 +739,14 @@ function quiz_upgrade($oldversion) {
             }
 
             // Remove redundant fields from quiz_multianswers
-            modify_database('', 'ALTER TABLE `prefix_quiz_multianswers` DROP `answers`');
-            modify_database('', 'ALTER TABLE `prefix_quiz_multianswers` DROP `positionkey`');
-            modify_database('', 'ALTER TABLE `prefix_quiz_multianswers` DROP `answertype`');
-            modify_database('', 'ALTER TABLE `prefix_quiz_multianswers` DROP `norm`');
+            $success = $success && modify_database('', 'ALTER TABLE `prefix_quiz_multianswers` DROP `answers`');
+            $success = $success && modify_database('', 'ALTER TABLE `prefix_quiz_multianswers` DROP `positionkey`');
+            $success = $success && modify_database('', 'ALTER TABLE `prefix_quiz_multianswers` DROP `answertype`');
+            $success = $success && modify_database('', 'ALTER TABLE `prefix_quiz_multianswers` DROP `norm`');
         }
     }
 
-    if ($oldversion < 2005052004) {
+    if ($success && $oldversion < 2005052004) {
         // We need to remove some duplicate entries that may be present in some databases
         // due to a faulty restore script
 
@@ -765,7 +769,7 @@ function quiz_upgrade($oldversion) {
                     if ($skip) {
                         $skip = false;
                     } else {
-                        delete_records('quiz_numerical','id', $id->id);
+                        $success = $success && delete_records('quiz_numerical','id', $id->id);
                     }
                 }
             }
@@ -790,7 +794,7 @@ function quiz_upgrade($oldversion) {
                     if ($skip) {
                         $skip = false;
                     } else {
-                        delete_records('quiz_shortanswer','id', $id->id);
+                        $success = $success && delete_records('quiz_shortanswer','id', $id->id);
                     }
                 }
             }
@@ -815,14 +819,14 @@ function quiz_upgrade($oldversion) {
                     if ($skip) {
                         $skip = false;
                     } else {
-                        delete_records('quiz_multichoice','id', $id->id);
+                        $success = $success && delete_records('quiz_multichoice','id', $id->id);
                     }
                 }
             }
         }
     }
 
-    if ($oldversion < 2005060300) {
+    if ($success && $oldversion < 2005060300) {
         //Search all the orphan categories (those whose course doesn't exist)
         //and process them, deleting or moving them to site course - Bug 2459
 
@@ -839,7 +843,7 @@ function quiz_upgrade($oldversion) {
                 //Process it with question_delete_course(). It will do all the hard work.
                 if (!record_exists('course', 'id', $course->id)) {
                     require_once("$CFG->libdir/questionlib.php ");
-                    question_delete_course($course);
+                    $success = $success && question_delete_course($course);
                 }
             }
         }
@@ -847,8 +851,8 @@ function quiz_upgrade($oldversion) {
         $db->debug = $olddebug;
     }
 
-    if ($oldversion < 2005062600) {
-        modify_database ('', "
+    if ($success && $oldversion < 2005062600) {
+        $success = $success && modify_database ('', "
             CREATE TABLE `prefix_quiz_essay` (
                 `id` int(10) unsigned NOT NULL auto_increment,
                 `question` int(10) unsigned NOT NULL default '0',
@@ -857,7 +861,7 @@ function quiz_upgrade($oldversion) {
                 KEY `question` (`question`)
            ) TYPE=MyISAM COMMENT='Options for essay questions'");
     
-        modify_database ('', "
+        $success = $success && modify_database ('', "
             CREATE TABLE `prefix_quiz_essay_states` (
               `id` int(10) unsigned NOT NULL auto_increment,
               `stateid` int(10) unsigned NOT NULL default '0',
@@ -868,175 +872,175 @@ function quiz_upgrade($oldversion) {
             ) TYPE=MyISAM COMMENT='essay question type specific state information'");
     }
 
-    if ($oldversion < 2005070202) {
+    if ($success && $oldversion < 2005070202) {
         // add new unique id to prepare the way for lesson module to have its own attempts table
-        table_column('quiz_attempts', '', 'uniqueid', 'integer', '10', 'unsigned', '0', 'not null', 'id');
+        $success = $success && table_column('quiz_attempts', '', 'uniqueid', 'integer', '10', 'unsigned', '0', 'not null', 'id');
         // initially we can use the id as the unique id because no other modules use attempts yet.
-        execute_sql("UPDATE {$CFG->prefix}quiz_attempts SET uniqueid = id", false);
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_attempts SET uniqueid = id", false);
         // we set $CFG->attemptuniqueid to the next available id
         $record = get_record_sql("SELECT max(id)+1 AS nextid FROM {$CFG->prefix}quiz_attempts");
-        set_config('attemptuniqueid', empty($record->nextid) ? 1 : $record->nextid);
+        $success = $success && set_config('attemptuniqueid', empty($record->nextid) ? 1 : $record->nextid);
     }
     
-    if ($oldversion < 2006020801) {
+    if ($success && $oldversion < 2006020801) {
         // add new field to store time delay between the first and second quiz attempt
-        table_column('quiz', '', 'delay1', 'integer', '10', 'unsigned', '0', 'not null', 'popup');
+        $success = $success && table_column('quiz', '', 'delay1', 'integer', '10', 'unsigned', '0', 'not null', 'popup');
         // add new field to store time delay between the second and any additional quizes
-        table_column('quiz', '', 'delay2', 'integer', '10', 'unsigned', '0', 'not null', 'delay1');
+        $success = $success && table_column('quiz', '', 'delay2', 'integer', '10', 'unsigned', '0', 'not null', 'delay1');
     }
 
-    if ($oldversion < 2006021101) {
+    if ($success && $oldversion < 2006021101) {
         // set defaultgrade field properly (probably not necessary, but better make sure)
-        execute_sql("UPDATE {$CFG->prefix}quiz_questions SET defaultgrade = '1' WHERE defaultgrade = '0'", false);
-        execute_sql("UPDATE {$CFG->prefix}quiz_questions SET defaultgrade = '0' WHERE qtype = '".DESCRIPTION."'", false);
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_questions SET defaultgrade = '1' WHERE defaultgrade = '0'", false);
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_questions SET defaultgrade = '0' WHERE qtype = '".DESCRIPTION."'", false);
     }
 
-    if ($oldversion < 2006021103) {
+    if ($success && $oldversion < 2006021103) {
         // add new field to store the question-level shuffleanswers option
-        table_column('quiz_match', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'subquestions');
-        table_column('quiz_multichoice', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'single');
-        table_column('quiz_randomsamatch', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'choose');
+        $success = $success && table_column('quiz_match', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'subquestions');
+        $success = $success && table_column('quiz_multichoice', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'single');
+        $success = $success && table_column('quiz_randomsamatch', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'choose');
     }
 
-    if ($oldversion < 2006021104) {
+    if ($success && $oldversion < 2006021104) {
         // add originalversion field for the new versioning mechanism
-        table_column('quiz_question_versions', '', 'originalquestion', 'int', '10', 'unsigned', '0', 'not null', 'newquestion');
+        $success = $success && table_column('quiz_question_versions', '', 'originalquestion', 'int', '10', 'unsigned', '0', 'not null', 'newquestion');
     }
 
-    if ($oldversion < 2006021301) {
-        modify_database('','ALTER TABLE prefix_quiz_attempts ADD UNIQUE INDEX uniqueid (uniqueid);');
+    if ($success && $oldversion < 2006021301) {
+        $success = $success && modify_database('','ALTER TABLE prefix_quiz_attempts ADD UNIQUE INDEX uniqueid (uniqueid);');
     }
 
-    if ($oldversion < 2006021302) {
-        table_column('quiz_match_sub', '', 'code', 'int', '10', 'unsigned', '0', 'not null', 'id');
-        execute_sql("UPDATE {$CFG->prefix}quiz_match_sub SET code = id", false);
+    if ($success && $oldversion < 2006021302) {
+        $success = $success && table_column('quiz_match_sub', '', 'code', 'int', '10', 'unsigned', '0', 'not null', 'id');
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_match_sub SET code = id", false);
     }
-    if ($oldversion < 2006021304) {
+    if ($success && $oldversion < 2006021304) {
         // convert sequence field to text to accomodate very long sequences, see bug 4257
-        table_column('quiz_multianswers', 'sequence', 'sequence',  'text', '', '', '', 'not null', 'question');
+        $success = $success && table_column('quiz_multianswers', 'sequence', 'sequence',  'text', '', '', '', 'not null', 'question');
     }
 
-    if ($oldversion < 2006021501) {
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_newest_states RENAME {$CFG->prefix}question_sessions", false);
+    if ($success && $oldversion < 2006021501) {
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_newest_states RENAME {$CFG->prefix}question_sessions", false);
     }
 
-    if ($oldversion < 2006022200) {
+    if ($success && $oldversion < 2006022200) {
         // convert grade fields to float
-        set_field('quiz_attempts', 'sumgrades', 0, 'sumgrades', '');
-        table_column('quiz_attempts', 'sumgrades', 'sumgrades',  'float', '', '', '0', 'not null');
+        $success = $success && set_field('quiz_attempts', 'sumgrades', 0, 'sumgrades', '');
+        $success = $success && table_column('quiz_attempts', 'sumgrades', 'sumgrades',  'float', '', '', '0', 'not null');
 
-        set_field('quiz_answers', 'fraction', 0, 'fraction', '');
-        table_column('quiz_answers', 'fraction', 'fraction',  'float', '', '', '0', 'not null');
+        $success = $success && set_field('quiz_answers', 'fraction', 0, 'fraction', '');
+        $success = $success && table_column('quiz_answers', 'fraction', 'fraction',  'float', '', '', '0', 'not null');
 
-        set_field('quiz_essay_states', 'fraction', 0, 'fraction', '');
-        table_column('quiz_essay_states', 'fraction', 'fraction',  'float', '', '', '0', 'not null');
+        $success = $success && set_field('quiz_essay_states', 'fraction', 0, 'fraction', '');
+        $success = $success && table_column('quiz_essay_states', 'fraction', 'fraction',  'float', '', '', '0', 'not null');
 
-        set_field('quiz_states', 'grade', 0, 'grade', '');
-        table_column('quiz_states', 'grade', 'grade',  'float', '', '', '0', 'not null');
+        $success = $success && set_field('quiz_states', 'grade', 0, 'grade', '');
+        $success = $success && table_column('quiz_states', 'grade', 'grade',  'float', '', '', '0', 'not null');
 
-        set_field('quiz_states', 'raw_grade', 0, 'raw_grade', '');
-        table_column('quiz_states', 'raw_grade', 'raw_grade',  'float', '', '', '0', 'not null');
+        $success = $success && set_field('quiz_states', 'raw_grade', 0, 'raw_grade', '');
+        $success = $success && table_column('quiz_states', 'raw_grade', 'raw_grade',  'float', '', '', '0', 'not null');
 
-        set_field('quiz_states', 'penalty', 0, 'penalty', '');
-        table_column('quiz_states', 'penalty', 'penalty',  'float', '', '', '0', 'not null');
+        $success = $success && set_field('quiz_states', 'penalty', 0, 'penalty', '');
+        $success = $success && table_column('quiz_states', 'penalty', 'penalty',  'float', '', '', '0', 'not null');
 
-        set_field('question_sessions', 'sumpenalty', 0, 'sumpenalty', '');
-        table_column('question_sessions', 'sumpenalty', 'sumpenalty',  'float', '', '', '0', 'not null');
+        $success = $success && set_field('question_sessions', 'sumpenalty', 0, 'sumpenalty', '');
+        $success = $success && table_column('question_sessions', 'sumpenalty', 'sumpenalty',  'float', '', '', '0', 'not null');
     }
 
-    if ($oldversion < 2006022400) {
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_questions RENAME {$CFG->prefix}question", false);
+    if ($success && $oldversion < 2006022400) {
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_questions RENAME {$CFG->prefix}question", false);
     }
 
-    if ($oldversion < 2006022402) {
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_states RENAME {$CFG->prefix}question_states", false);
+    if ($success && $oldversion < 2006022402) {
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_states RENAME {$CFG->prefix}question_states", false);
     }
 
-    if ($oldversion < 2006022800) {
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_answers RENAME {$CFG->prefix}question_answers", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_categories RENAME {$CFG->prefix}question_categories", false);
+    if ($success && $oldversion < 2006022800) {
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_answers RENAME {$CFG->prefix}question_answers", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_categories RENAME {$CFG->prefix}question_categories", false);
     }
 
-    if ($oldversion < 2006031202) {
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_truefalse RENAME {$CFG->prefix}question_truefalse", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_shortanswer RENAME {$CFG->prefix}question_shortanswer", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_multianswers RENAME {$CFG->prefix}question_multianswer", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_multichoice RENAME {$CFG->prefix}question_multichoice", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical RENAME {$CFG->prefix}question_numerical", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical_units RENAME {$CFG->prefix}question_numerical_units", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_randomsamatch RENAME {$CFG->prefix}question_randomsamatch", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_match RENAME {$CFG->prefix}question_match", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_match_sub RENAME {$CFG->prefix}question_match_sub", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_calculated RENAME {$CFG->prefix}question_calculated", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_dataset_definitions RENAME {$CFG->prefix}question_dataset_definitions", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_dataset_items RENAME {$CFG->prefix}question_dataset_items", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_question_datasets RENAME {$CFG->prefix}question_datasets", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp RENAME {$CFG->prefix}question_rqp", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp_servers RENAME {$CFG->prefix}question_rqp_servers", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp_states RENAME {$CFG->prefix}question_rqp_states", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp_types RENAME {$CFG->prefix}question_rqp_types", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_essay RENAME {$CFG->prefix}question_essay", false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_essay_states RENAME {$CFG->prefix}question_essay_states", false);
+    if ($success && $oldversion < 2006031202) {
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_truefalse RENAME {$CFG->prefix}question_truefalse", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_shortanswer RENAME {$CFG->prefix}question_shortanswer", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_multianswers RENAME {$CFG->prefix}question_multianswer", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_multichoice RENAME {$CFG->prefix}question_multichoice", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical RENAME {$CFG->prefix}question_numerical", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical_units RENAME {$CFG->prefix}question_numerical_units", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_randomsamatch RENAME {$CFG->prefix}question_randomsamatch", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_match RENAME {$CFG->prefix}question_match", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_match_sub RENAME {$CFG->prefix}question_match_sub", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_calculated RENAME {$CFG->prefix}question_calculated", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_dataset_definitions RENAME {$CFG->prefix}question_dataset_definitions", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_dataset_items RENAME {$CFG->prefix}question_dataset_items", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_question_datasets RENAME {$CFG->prefix}question_datasets", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp RENAME {$CFG->prefix}question_rqp", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp_servers RENAME {$CFG->prefix}question_rqp_servers", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp_states RENAME {$CFG->prefix}question_rqp_states", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp_types RENAME {$CFG->prefix}question_rqp_types", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_essay RENAME {$CFG->prefix}question_essay", false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_essay_states RENAME {$CFG->prefix}question_essay_states", false);
     }
 
-    if ($oldversion < 2006032100) {
+    if ($success && $oldversion < 2006032100) {
         // change from the old questiontype numbers to using the questiontype names
-        table_column('question', 'qtype', 'qtype',  'varchar', 20, '', '', 'not null');
-        set_field('question', 'qtype', 'shortanswer', 'qtype', 1);
-        set_field('question', 'qtype', 'truefalse', 'qtype', 2);
-        set_field('question', 'qtype', 'multichoice', 'qtype', 3);
-        set_field('question', 'qtype', 'random', 'qtype', 4);
-        set_field('question', 'qtype', 'match', 'qtype', 5);
-        set_field('question', 'qtype', 'randomsamatch', 'qtype', 6);
-        set_field('question', 'qtype', 'description', 'qtype', 7);
-        set_field('question', 'qtype', 'numerical', 'qtype', 8);
-        set_field('question', 'qtype', 'multianswer', 'qtype', 9);
-        set_field('question', 'qtype', 'calculated', 'qtype', 10);
-        set_field('question', 'qtype', 'rqp', 'qtype', 11);
-        set_field('question', 'qtype', 'essay', 'qtype', 12);
-    }
-
-    if ($oldversion < 2006032200) {
+        $success = $success && table_column('question', 'qtype', 'qtype',  'varchar', 20, '', '', 'not null');
+        $success = $success && set_field('question', 'qtype', 'shortanswer', 'qtype', 1);
+        $success = $success && set_field('question', 'qtype', 'truefalse', 'qtype', 2);
+        $success = $success && set_field('question', 'qtype', 'multichoice', 'qtype', 3);
+        $success = $success && set_field('question', 'qtype', 'random', 'qtype', 4);
+        $success = $success && set_field('question', 'qtype', 'match', 'qtype', 5);
+        $success = $success && set_field('question', 'qtype', 'randomsamatch', 'qtype', 6);
+        $success = $success && set_field('question', 'qtype', 'description', 'qtype', 7);
+        $success = $success && set_field('question', 'qtype', 'numerical', 'qtype', 8);
+        $success = $success && set_field('question', 'qtype', 'multianswer', 'qtype', 9);
+        $success = $success && set_field('question', 'qtype', 'calculated', 'qtype', 10);
+        $success = $success && set_field('question', 'qtype', 'rqp', 'qtype', 11);
+        $success = $success && set_field('question', 'qtype', 'essay', 'qtype', 12);
+    }
+
+    if ($success && $oldversion < 2006032200) {
         // set version for all questiontypes that already have their tables installed
-        set_config('qtype_calculated_version', 2006032100);
-        set_config('qtype_essay_version', 2006032100);
-        set_config('qtype_match_version', 2006032100);
-        set_config('qtype_multianswer_version', 2006032100);
-        set_config('qtype_multichoice_version', 2006032100);
-        set_config('qtype_numerical_version', 2006032100);
-        set_config('qtype_randomsamatch_version', 2006032100);
-        set_config('qtype_rqp_version', 2006032100);
-        set_config('qtype_shortanswer_version', 2006032100);
-        set_config('qtype_truefalse_version', 2006032100);
+        $success = $success && set_config('qtype_calculated_version', 2006032100);
+        $success = $success && set_config('qtype_essay_version', 2006032100);
+        $success = $success && set_config('qtype_match_version', 2006032100);
+        $success = $success && set_config('qtype_multianswer_version', 2006032100);
+        $success = $success && set_config('qtype_multichoice_version', 2006032100);
+        $success = $success && set_config('qtype_numerical_version', 2006032100);
+        $success = $success && set_config('qtype_randomsamatch_version', 2006032100);
+        $success = $success && set_config('qtype_rqp_version', 2006032100);
+        $success = $success && set_config('qtype_shortanswer_version', 2006032100);
+        $success = $success && set_config('qtype_truefalse_version', 2006032100);
     }
 
-    if ($oldversion < 2006040600) {
-        table_column('question_sessions', '', 'comment', 'text', '', '', '', 'not null', 'sumpenalty');
+    if ($success && $oldversion < 2006040600) {
+        $success = $success && table_column('question_sessions', '', 'comment', 'text', '', '', '', 'not null', 'sumpenalty');
     }
 
-    if ($oldversion < 2006040900) {
-        modify_database('', "UPDATE prefix_question SET parent = id WHERE qtype ='random';");
+    if ($success && $oldversion < 2006040900) {
+        $success = $success && modify_database('', "UPDATE prefix_question SET parent = id WHERE qtype ='random';");
     }
 
-    if ($oldversion < 2006041000) {
-        modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'continue attempt', 'quiz', 'name');");
+    if ($success && $oldversion < 2006041000) {
+        $success = $success && modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'continue attempt', 'quiz', 'name');");
     }
 
-    if ($oldversion < 2006041001) {
-        table_column('question', 'version', 'version', 'varchar', 255);
+    if ($success && $oldversion < 2006041001) {
+        $success = $success && table_column('question', 'version', 'version', 'varchar', 255);
     }
 
-    if ($oldversion < 2006042800) {
+    if ($success && $oldversion < 2006042800) {
         // Check we have some un-renamed tables (verified in some servers)
         if ($tables = $db->MetaTables('TABLES')) {
             if (in_array($CFG->prefix.'quiz_randommatch', $tables) &&
                 !in_array($CFG->prefix.'question_randomsamatch', $tables)) {
-                modify_database ("", "ALTER TABLE prefix_quiz_randommatch RENAME prefix_question_randomsamatch ");
+                $success = $success && modify_database ("", "ALTER TABLE prefix_quiz_randommatch RENAME prefix_question_randomsamatch ");
             }
             // Check for one possible missing field in one table
             if ($columns = $db->MetaColumnNames($CFG->prefix.'question_randomsamatch')) {
                 if (!in_array('shuffleanswers', $columns)) {
-                    table_column('question_randomsamatch', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'choose');
+                    $success = $success && table_column('question_randomsamatch', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'choose');
                 }
             }
         }
@@ -1044,25 +1048,25 @@ function quiz_upgrade($oldversion) {
 
     if ($oldversion < 2006051300) {
         // The newgraded field must always point to a valid state
-        modify_database("","UPDATE prefix_question_sessions SET newgraded = newest where newgraded = '0'");
+        $success = $success && modify_database("","UPDATE prefix_question_sessions SET newgraded = newest where newgraded = '0'");
 
         // Only perform this if hasn't been performed before (in MOODLE_16_STABLE branch - bug 5717)
         $tables = $db->MetaTables('TABLES');
         if (!in_array($CFG->prefix . 'question_attempts', $tables)) {
             // The following table is discussed in bug 5468
-            modify_database ("", "CREATE TABLE prefix_question_attempts (
+            $success = $success && modify_database ("", "CREATE TABLE prefix_question_attempts (
                                       id int(10) unsigned NOT NULL auto_increment,
                                       modulename varchar(20) NOT NULL default 'quiz',
                                       PRIMARY KEY  (id)
                                     ) TYPE=MyISAM COMMENT='Student attempts. This table gets extended by the modules';");
             // create one entry for all the existing quiz attempts
-            modify_database ("", "INSERT INTO prefix_question_attempts (id)
+            $success = $success && modify_database ("", "INSERT INTO prefix_question_attempts (id)
                                        SELECT uniqueid
                                        FROM prefix_quiz_attempts;");
         }
     }
 
-    if ($oldversion < 2006060700) { // fix for 5720
+    if ($success && $oldversion < 2006060700) { // fix for 5720
 
         // Copy the teacher comments from the question_essay_states table to the new
         // question_sessions table.
@@ -1082,8 +1086,9 @@ function quiz_upgrade($oldversion) {
 
                 if ($result->isgraded) {
                     // Graded - save comment to the sessions and change state event to QUESTION_EVENTMANUALGRADE
-                    if (!set_field('question_sessions', 'comment', $result->essaycomment, 'attemptid', $result->uniqueid, 'questionid', $result->questionid)) {
+                    if (!($success = $success && set_field('question_sessions', 'comment', $result->essaycomment, 'attemptid', $result->uniqueid, 'questionid', $result->questionid))) {
                         notify("Essay Table Migration: Cannot save comment");
+                        break;
                     }
                     $state->event = 9; //QUESTION_EVENTMANUALGRADE;
                 } else {
@@ -1092,16 +1097,17 @@ function quiz_upgrade($oldversion) {
                 }
 
                 // Save the event
-                if (!update_record('question_states', $state)) {
+                if (!($success = $success && update_record('question_states', $state))) {
                     notify("Essay Table Migration: Cannot update state");
+                    break;
                 }
             }
         }
         
         // dropping unused tables
-        execute_sql('DROP TABLE '.$CFG->prefix.'question_essay_states');
-        execute_sql('DROP TABLE '.$CFG->prefix.'question_essay');
-        execute_sql('DROP TABLE '.$CFG->prefix.'quiz_attemptonlast_datasets', false);
+        $success = $success && execute_sql('DROP TABLE '.$CFG->prefix.'question_essay_states');
+        $success = $success && execute_sql('DROP TABLE '.$CFG->prefix.'question_essay');
+        $success = $success && execute_sql('DROP TABLE '.$CFG->prefix.'quiz_attemptonlast_datasets', false);
     }
 
     if ($oldversion < 2006081000) {
index 74436e3e6a91f28c262bff1bbc313b5b8d5c8a05..fb999d4bd464ef4ce014a65773d2468a15414eda 100644 (file)
@@ -11,79 +11,79 @@ function quiz_upgrade($oldversion) {
 
     global $CFG, $db;
     $success = true;
-    
+
     include_once("$CFG->dirroot/mod/quiz/locallib.php");
 
-    if ($oldversion < 2003010100) {
-        execute_sql(" ALTER TABLE {$CFG->prefix}quiz ADD review integer DEFAULT '0' NOT NULL AFTER `grademethod` ");
+    if ($success && $oldversion < 2003010100) {
+        $success = $success && execute_sql(" ALTER TABLE {$CFG->prefix}quiz ADD review integer DEFAULT '0' NOT NULL AFTER `grademethod` ");
     }
 
-    if ($oldversion < 2003010301) {
-        table_column("quiz_truefalse", "true", "trueanswer", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
-        table_column("quiz_truefalse", "false", "falseanswer", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
-        table_column("quiz_questions", "type", "qtype", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
+    if ($success && $oldversion < 2003010301) {
+        $success = $success && table_column("quiz_truefalse", "true", "trueanswer", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
+        $success = $success && table_column("quiz_truefalse", "false", "falseanswer", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
+        $success = $success && table_column("quiz_questions", "type", "qtype", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "");
     }
 
-    if ($oldversion < 2003022303) {
-        modify_database ("", "CREATE TABLE prefix_quiz_randommatch (
+    if ($success && $oldversion < 2003022303) {
+        $success = $success && modify_database ("", "CREATE TABLE prefix_quiz_randommatch (
                                   id SERIAL PRIMARY KEY,
                                   question integer NOT NULL default '0',
                                   choose integer NOT NULL default '4'
                               );");
     }
-    if ($oldversion < 2003030303) {
-        table_column("quiz_questions", "", "defaultgrade", "INTEGER", "6", "UNSIGNED", "1", "NOT NULL", "image");
+    if ($success && $oldversion < 2003030303) {
+        $success = $success && table_column("quiz_questions", "", "defaultgrade", "INTEGER", "6", "UNSIGNED", "1", "NOT NULL", "image");
     }
 
-    if ($oldversion < 2003033100) {
-        modify_database ("", "ALTER TABLE prefix_quiz_randommatch RENAME prefix_quiz_randomsamatch ");
-        modify_database ("", "CREATE TABLE prefix_quiz_match_sub (
+    if ($success && $oldversion < 2003033100) {
+        $success = $success && modify_database ("", "ALTER TABLE prefix_quiz_randommatch RENAME prefix_quiz_randomsamatch ");
+        $success = $success && modify_database ("", "CREATE TABLE prefix_quiz_match_sub (
                                  id SERIAL PRIMARY KEY,
                                  question integer NOT NULL default '0',
                                  questiontext text NOT NULL default '',
                                  answertext varchar(255) NOT NULL default ''
                               );");
-        modify_database ("", "CREATE INDEX prefix_quiz_match_sub_question_idx ON prefix_quiz_match_sub (question);");
+        $success = $success && modify_database ("", "CREATE INDEX prefix_quiz_match_sub_question_idx ON prefix_quiz_match_sub (question);");
 
-        modify_database ("", "CREATE TABLE prefix_quiz_multichoice (
+        $success = $success && modify_database ("", "CREATE TABLE prefix_quiz_multichoice (
                                  id SERIAL PRIMARY KEY,
                                  question integer NOT NULL default '0',
                                  layout integer NOT NULL default '0',
                                  answers varchar(255) NOT NULL default '',
                                  single integer NOT NULL default '0'
                                );");
-        modify_database ("", "CREATE INDEX prefix_quiz_multichoice_question_idx ON prefix_quiz_multichoice (question);");
+        $success = $success && modify_database ("", "CREATE INDEX prefix_quiz_multichoice_question_idx ON prefix_quiz_multichoice (question);");
     }
 
-    if ($oldversion < 2003040901) {
-        table_column("quiz", "", "shufflequestions", "INTEGER", "5", "UNSIGNED", "0", "NOT NULL", "review");
-        table_column("quiz", "", "shuffleanswers", "INTEGER", "4", "UNSIGNED", "0", "NOT NULL", "shufflequestions");
+    if ($success && $oldversion < 2003040901) {
+        $success = $success && table_column("quiz", "", "shufflequestions", "INTEGER", "5", "UNSIGNED", "0", "NOT NULL", "review");
+        $success = $success && table_column("quiz", "", "shuffleanswers", "INTEGER", "4", "UNSIGNED", "0", "NOT NULL", "shufflequestions");
     }
-    if ($oldversion < 2003042702) {
-        modify_database ("", "CREATE TABLE prefix_quiz_match (
+    if ($success && $oldversion < 2003042702) {
+        $success = $success && modify_database ("", "CREATE TABLE prefix_quiz_match (
                                  id SERIAL PRIMARY KEY,
                                  question integer NOT NULL default '0',
                                  subquestions varchar(255) NOT NULL default ''
                                );");
-        modify_database ("", "CREATE INDEX prefix_quiz_match_question_idx ON prefix_quiz_match (question);");
+        $success = $success && modify_database ("", "CREATE INDEX prefix_quiz_match_question_idx ON prefix_quiz_match (question);");
     }
-    if ($oldversion < 2003071001) {
-        modify_database ("", " CREATE TABLE prefix_quiz_numerical (
+    if ($success && $oldversion < 2003071001) {
+        $success = $success && modify_database ("", " CREATE TABLE prefix_quiz_numerical (
                                id SERIAL PRIMARY KEY,
                                question integer NOT NULL default '0',
                                answer integer NOT NULL default '0',
                                min varchar(255) NOT NULL default '',
                                max varchar(255) NOT NULL default ''
                                ); ");
-        modify_database ("", "CREATE INDEX prefix_quiz_numerical_answer_idx ON prefix_quiz_numerical (answer);");
+        $success = $success && modify_database ("", "CREATE INDEX prefix_quiz_numerical_answer_idx ON prefix_quiz_numerical (answer);");
     }
 
-    if ($oldversion < 2003072400) {
-        execute_sql(" INSERT INTO {$CFG->prefix}log_display (module, action, mtable, field) VALUES ('quiz', 'review', 'quiz', 'name') ");
+    if ($success && $oldversion < 2003072400) {
+        $success = $success && execute_sql(" INSERT INTO {$CFG->prefix}log_display (module, action, mtable, field) VALUES ('quiz', 'review', 'quiz', 'name') ");
     }
 
-    if ($oldversion < 2003082300) {
-        modify_database ("", " CREATE TABLE prefix_quiz_multianswers (
+    if ($success && $oldversion < 2003082300) {
+        $success = $success && modify_database ("", " CREATE TABLE prefix_quiz_multianswers (
                                id SERIAL PRIMARY KEY,
                                question integer NOT NULL default '0',
                                answers varchar(255) NOT NULL default '',
@@ -91,38 +91,40 @@ function quiz_upgrade($oldversion) {
                                answertype integer NOT NULL default '0',
                                norm integer NOT NULL default '1'
                               ); ");
-        modify_database ("", "CREATE INDEX prefix_quiz_multianswers_question_idx ON prefix_quiz_multianswers (question);");
+        $success = $success && modify_database ("", "CREATE INDEX prefix_quiz_multianswers_question_idx ON prefix_quiz_multianswers (question);");
 
-        table_column("quiz", "", "attemptonlast", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "attempts");
+        $success = $success && table_column("quiz", "", "attemptonlast", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "attempts");
 
-        table_column("quiz_questions", "", "stamp", "varchar", "255", "", "qtype");
+        $success = $success && table_column("quiz_questions", "", "stamp", "varchar", "255", "", "qtype");
     }
 
-    if ($oldversion < 2003082301) {
-        table_column("quiz_questions", "", "version", "integer", "10", "", "1", "not null", "stamp");
+    if ($success && $oldversion < 2003082301) {
+        $success = $success && table_column("quiz_questions", "", "version", "integer", "10", "", "1", "not null", "stamp");
         if ($questions = get_records("quiz_questions")) {
             foreach ($questions as $question) {
                 $stamp = make_unique_id_code();
-                if (!set_field("quiz_questions", "stamp", $stamp, "id", $question->id)) {
+                if (!($success = $success && set_field("quiz_questions", "stamp", $stamp, "id", $question->id))) {
                     notify("Error while adding stamp to question id = $question->id");
+                    break;
                 }
             }
         }
     }
 
-    if ($oldversion < 2003082700) {
+    if ($success && $oldversion < 2003082700) {
         table_column("quiz_categories", "", "stamp", "varchar", "255", "", "", "not null");
         if ($categories = get_records("quiz_categories")) {
             foreach ($categories as $category) {
                 $stamp = make_unique_id_code();
-                if (!set_field("quiz_categories", "stamp", $stamp, "id", $category->id)) {
+                if (!($success = $success && set_field("quiz_categories", "stamp", $stamp, "id", $category->id))) {
                     notify("Error while adding stamp to category id = $category->id");
+                    break;
                 }
             }
         }
     }
 
-    if ($oldversion < 2003111100) {
+    if ($success && $oldversion < 2003111100) {
         $duplicates = get_records_sql("SELECT stamp as id,count(*) as cuenta
                                        FROM {$CFG->prefix}quiz_questions
                                        GROUP BY stamp
@@ -135,7 +137,7 @@ function quiz_upgrade($oldversion) {
                 $add = 1;
                 foreach ($questions as $question) {
                     echo "Changing question id $question->id stamp to ".$duplicate->id.$add."<br />";
-                    set_field("quiz_questions","stamp",$duplicate->id.$add,"id",$question->id);
+                    $success = $success && set_field("quiz_questions","stamp",$duplicate->id.$add,"id",$question->id);
                     $add++;
                 }
             }
@@ -144,36 +146,36 @@ function quiz_upgrade($oldversion) {
         }
     }
 
-    if ($oldversion < 2004021300) {
-        table_column("quiz_questions", "", "questiontextformat", "integer", "2", "", "0", "not null", "questiontext");
+    if ($success && $oldversion < 2004021300) {
+        $success = $success && table_column("quiz_questions", "", "questiontextformat", "integer", "2", "", "0", "not null", "questiontext");
     }
 
-    if ($oldversion < 2004021900) {
-        modify_database("","INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'add', 'quiz', 'name');");
-        modify_database("","INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'update', 'quiz', 'name');");
+    if ($success && $oldversion < 2004021900) {
+        $success = $success && modify_database("","INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'add', 'quiz', 'name');");
+        $success = $success && modify_database("","INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'update', 'quiz', 'name');");
     }
 
-    if ($oldversion < 2004051700) {
+    if ($success && $oldversion < 2004051700) {
         include_once("$CFG->dirroot/mod/quiz/lib.php");
-        quiz_refresh_events();
+        $success = $success && quiz_refresh_events();
     }
-    if ($oldversion < 2004060200) {
-        table_column("quiz", "", "timelimit", "integer", "", "", "0", "NOT NULL", "");
+    if ($success && $oldversion < 2004060200) {
+        $success = $success && table_column("quiz", "", "timelimit", "integer", "", "", "0", "NOT NULL", "");
     }
 
-    if ($oldversion < 2004070700) {
-        table_column("quiz", "", "password", "varchar", "255", "", "", "not null", "");
-        table_column("quiz", "", "subnet", "varchar", "255", "", "", "not null", "");
+    if ($success && $oldversion < 2004070700) {
+        $success = $success && table_column("quiz", "", "password", "varchar", "255", "", "", "not null", "");
+        $success = $success && table_column("quiz", "", "subnet", "varchar", "255", "", "", "not null", "");
     }
 
-    if ($oldversion < 2004073001) {
+    if ($success && $oldversion < 2004073001) {
         // Six new tables:
 
 
-        modify_database ( "", "BEGIN;");
+        $success = $success && modify_database ( "", "BEGIN;");
 
         // One table for handling units for numerical questions
-        modify_database ("", " CREATE TABLE prefix_quiz_numerical_units (
+        $success = $success && modify_database ("", " CREATE TABLE prefix_quiz_numerical_units (
                                id SERIAL8 PRIMARY KEY,
                                question INT8  NOT NULL default '0',
                                multiplier decimal(40,20) NOT NULL default '1.00000000000000000000',
@@ -183,7 +185,7 @@ function quiz_upgrade($oldversion) {
 
         // Four tables for handling distribution and storage of
         // individual data for dataset dependent question types
-        modify_database ("", " CREATE TABLE prefix_quiz_attemptonlast_datasets (
+        $success = $success && modify_database ("", " CREATE TABLE prefix_quiz_attemptonlast_datasets (
                                id SERIAL8 PRIMARY KEY,
                                category INT8  NOT NULL default '0',
                                userid INT8  NOT NULL default '0',
@@ -191,7 +193,7 @@ function quiz_upgrade($oldversion) {
                                CONSTRAINT prefix_quiz_attemptonlast_datasets_category_userid UNIQUE (category,userid)
             ) ;");
 
-        modify_database ("", " CREATE TABLE prefix_quiz_dataset_definitions (
+        $success = $success && modify_database ("", " CREATE TABLE prefix_quiz_dataset_definitions (
                                id SERIAL8 PRIMARY KEY,
                                category INT8  NOT NULL default '0',
                                name varchar(255) NOT NULL default '',
@@ -200,26 +202,26 @@ function quiz_upgrade($oldversion) {
                                itemcount INT8  NOT NULL default '0'
             ) ; ");
 
-        modify_database ("", " CREATE TABLE prefix_quiz_dataset_items (
+        $success = $success && modify_database ("", " CREATE TABLE prefix_quiz_dataset_items (
                                id SERIAL8 PRIMARY KEY,
                                definition INT8  NOT NULL default '0',
                                number INT8  NOT NULL default '0',
                                value varchar(255) NOT NULL default ''
                              ) ; ");
 
-        modify_database ("", "CREATE INDEX prefix_quiz_dataset_items_definition_idx ON prefix_quiz_dataset_items (definition);");
+        $success = $success && modify_database ("", "CREATE INDEX prefix_quiz_dataset_items_definition_idx ON prefix_quiz_dataset_items (definition);");
 
-        modify_database ("", " CREATE TABLE prefix_quiz_question_datasets (
+        $success = $success && modify_database ("", " CREATE TABLE prefix_quiz_question_datasets (
                                id SERIAL8 PRIMARY KEY,
                                question INT8  NOT NULL default '0',
                                datasetdefinition INT8  NOT NULL default '0'
             ) ; ");
 
-        modify_database ("", "CREATE INDEX prefix_quiz_question_datasets_question_datasetdefinition_idx ON prefix_quiz_question_datasets (question,datasetdefinition);");
+        $success = $success && modify_database ("", "CREATE INDEX prefix_quiz_question_datasets_question_datasetdefinition_idx ON prefix_quiz_question_datasets (question,datasetdefinition);");
 
         // One table for new question type calculated
         //  - the first dataset dependent question type
-        modify_database ("", " CREATE TABLE prefix_quiz_calculated (
+        $success = $success && modify_database ("", " CREATE TABLE prefix_quiz_calculated (
                                id SERIAL8 PRIMARY KEY,
                                question INT8  NOT NULL default '0',
                                answer INT8  NOT NULL default '0',
@@ -228,89 +230,89 @@ function quiz_upgrade($oldversion) {
                                correctanswerlength INT8 NOT NULL default '2'
                 ) ; ");
 
-        modify_database ("", "CREATE INDEX prefix_quiz_calculated_question_idx ON  prefix_quiz_calculated (question);");
+        $success = $success && modify_database ("", "CREATE INDEX prefix_quiz_calculated_question_idx ON  prefix_quiz_calculated (question);");
 
-        modify_database ( "", "COMMIT;");
+        $success = $success && modify_database ( "", "COMMIT;");
     }
 
-    if ($oldversion < 2004111400) {
-        table_column("quiz_responses", "answer", "answer", "text", "", "", "", "not null");
+    if ($success && $oldversion < 2004111400) {
+        $success = $success && table_column("quiz_responses", "answer", "answer", "text", "", "", "", "not null");
     }
 
-    if ($oldversion < 2004111700) {
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_course_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_answers_question_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_attempts_quiz_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_attempts_userid_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_calculated_answer_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_categories_course_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_dataset_definitions_category_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_grades_quiz_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_grades_userid_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_numerical_question_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_numerical_units_question_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_question_grades_quiz_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_question_grades_question_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_questions_category_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_randomsamatch_question_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_responses_attempt_idx;",false);
-        execute_sql("DROP INDEX {$CFG->prefix}quiz_responses_question_idx;",false);
+    if ($success && $oldversion < 2004111700) {
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_course_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_answers_question_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_attempts_quiz_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_attempts_userid_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_calculated_answer_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_categories_course_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_dataset_definitions_category_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_grades_quiz_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_grades_userid_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_numerical_question_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_numerical_units_question_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_question_grades_quiz_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_question_grades_question_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_questions_category_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_randomsamatch_question_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_responses_attempt_idx;",false);
+        $success = $success && execute_sql("DROP INDEX {$CFG->prefix}quiz_responses_question_idx;",false);
 
-        modify_database('','CREATE INDEX prefix_quiz_course_idx ON prefix_quiz (course);');
-        modify_database('','CREATE INDEX prefix_quiz_answers_question_idx ON prefix_quiz_answers (question);');
-        modify_database('','CREATE INDEX prefix_quiz_attempts_quiz_idx ON prefix_quiz_attempts (quiz);');
-        modify_database('','CREATE INDEX prefix_quiz_attempts_userid_idx ON prefix_quiz_attempts (userid);');
-        modify_database('','CREATE INDEX prefix_quiz_calculated_answer_idx ON prefix_quiz_calculated (answer);');
-        modify_database('','CREATE INDEX prefix_quiz_categories_course_idx ON prefix_quiz_categories (course);');
-        modify_database('','CREATE INDEX prefix_quiz_dataset_definitions_category_idx ON prefix_quiz_dataset_definitions (category);');
-        modify_database('','CREATE INDEX prefix_quiz_grades_quiz_idx ON prefix_quiz_grades (quiz);');
-        modify_database('','CREATE INDEX prefix_quiz_grades_userid_idx ON prefix_quiz_grades (userid);');
-        modify_database('','CREATE INDEX prefix_quiz_numerical_question_idx ON prefix_quiz_numerical (question);');
-        modify_database('','CREATE INDEX prefix_quiz_numerical_units_question_idx ON prefix_quiz_numerical_units (question);');
-        modify_database('','CREATE INDEX prefix_quiz_question_grades_quiz_idx ON prefix_quiz_question_grades (quiz);');
-        modify_database('','CREATE INDEX prefix_quiz_question_grades_question_idx ON prefix_quiz_question_grades (question);');
-        modify_database('','CREATE INDEX prefix_quiz_questions_category_idx ON prefix_quiz_questions (category);');
-        modify_database('','CREATE INDEX prefix_quiz_randomsamatch_question_idx ON prefix_quiz_randomsamatch (question);');
-        modify_database('','CREATE INDEX prefix_quiz_responses_attempt_idx ON prefix_quiz_responses (attempt);');
-        modify_database('','CREATE INDEX prefix_quiz_responses_question_idx ON prefix_quiz_responses (question);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_course_idx ON prefix_quiz (course);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_answers_question_idx ON prefix_quiz_answers (question);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_attempts_quiz_idx ON prefix_quiz_attempts (quiz);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_attempts_userid_idx ON prefix_quiz_attempts (userid);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_calculated_answer_idx ON prefix_quiz_calculated (answer);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_categories_course_idx ON prefix_quiz_categories (course);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_dataset_definitions_category_idx ON prefix_quiz_dataset_definitions (category);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_grades_quiz_idx ON prefix_quiz_grades (quiz);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_grades_userid_idx ON prefix_quiz_grades (userid);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_numerical_question_idx ON prefix_quiz_numerical (question);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_numerical_units_question_idx ON prefix_quiz_numerical_units (question);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_question_grades_quiz_idx ON prefix_quiz_question_grades (quiz);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_question_grades_question_idx ON prefix_quiz_question_grades (question);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_questions_category_idx ON prefix_quiz_questions (category);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_randomsamatch_question_idx ON prefix_quiz_randomsamatch (question);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_responses_attempt_idx ON prefix_quiz_responses (attempt);');
+        $success = $success && modify_database('','CREATE INDEX prefix_quiz_responses_question_idx ON prefix_quiz_responses (question);');
     }
 
-    if ($oldversion < 2004112300) { //try and clean up an old mistake - try and bring us up to what is in postgres7.sql today.
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT category;",false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT {$CFG->prefix}quiz_attemptonlast_datasets_category_userid;",false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT {$CFG->prefix}quiz_category_userid_unique;",false);
-        modify_database('','ALTER TABLE prefix_quiz_attemptonlast_datasets ADD CONSTRAINT prefix_quiz_category_userid_unique UNIQUE (category,userid);');
+    if ($success && $oldversion < 2004112300) { //try and clean up an old mistake - try and bring us up to what is in postgres7.sql today.
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT category;",false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT {$CFG->prefix}quiz_attemptonlast_datasets_category_userid;",false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT {$CFG->prefix}quiz_category_userid_unique;",false);
+        $success = $success && modify_database('','ALTER TABLE prefix_quiz_attemptonlast_datasets ADD CONSTRAINT prefix_quiz_category_userid_unique UNIQUE (category,userid);');
     }
 
-    if ($oldversion < 2004120501) {
-        table_column("quiz_calculated", "", "correctanswerformat", "integer", "10", "", "0", "not null", "correctanswerlength");
+    if ($success && $oldversion < 2004120501) {
+        $success = $success && table_column("quiz_calculated", "", "correctanswerformat", "integer", "10", "", "0", "not null", "correctanswerlength");
     }
 
-    if ($oldversion < 2004121400) {  // New field to determine popup window behaviour
-        table_column("quiz", "", "popup", "integer", "4", "", "0", "not null", "subnet");
+    if ($success && $oldversion < 2004121400) {  // New field to determine popup window behaviour
+        $success = $success && table_column("quiz", "", "popup", "integer", "4", "", "0", "not null", "subnet");
     }
 
-    if ($oldversion < 2005010201) {
-        table_column('quiz_categories', '', 'parent');
-        table_column('quiz_categories', '', 'sortorder', 'integer', '10', '', '999');
+    if ($success && $oldversion < 2005010201) {
+        $success = $success && table_column('quiz_categories', '', 'parent');
+        $success = $success && table_column('quiz_categories', '', 'sortorder', 'integer', '10', '', '999');
     }
 
-    if ($oldversion < 2005010300) {
-        table_column("quiz", "", "questionsperpage", "integer", "10", "", "0", "not null", "review");
+    if ($success && $oldversion < 2005010300) {
+        $success = $success && table_column("quiz", "", "questionsperpage", "integer", "10", "", "0", "not null", "review");
     }
 
-    if ($oldversion < 2005012700) {
-        table_column('quiz_grades', 'grade', 'grade', 'real', 2, '');
+    if ($success && $oldversion < 2005012700) {
+        $success = $success && table_column('quiz_grades', 'grade', 'grade', 'real', 2, '');
     }
 
-    if ($oldversion < 2005021400) {
-        table_column("quiz", "", "decimalpoints", "integer", "4", "", "2", "not null", "grademethod");
+    if ($success && $oldversion < 2005021400) {
+        $success = $success && table_column("quiz", "", "decimalpoints", "integer", "4", "", "2", "not null", "grademethod");
     }
 
-    if($oldversion < 2005022800) {
-        table_column('quiz_questions', '', 'hidden', 'integer', '1', 'unsigned', '0', 'not null', 'version');
-        table_column('quiz_responses', '', 'originalquestion', 'integer', '10', 'unsigned', '0', 'not null', 'question');
-        modify_database ('', "CREATE TABLE prefix_quiz_question_version (
+    if($success && $oldversion < 2005022800) {
+        $success = $success && table_column('quiz_questions', '', 'hidden', 'integer', '1', 'unsigned', '0', 'not null', 'version');
+        $success = $success && table_column('quiz_responses', '', 'originalquestion', 'integer', '10', 'unsigned', '0', 'not null', 'question');
+        $success = $success && modify_database ('', "CREATE TABLE prefix_quiz_question_version (
                               id SERIAL PRIMARY KEY,
                               quiz integer NOT NULL default '0',
                               oldquestion integer NOT NULL default '0',
@@ -319,15 +321,15 @@ function quiz_upgrade($oldversion) {
                               timestamp integer NOT NULL default '0');");
     }
 
-    if ($oldversion < 2005032000) {
-        execute_sql(" INSERT INTO {$CFG->prefix}log_display (module, action, mtable, field) VALUES ('quiz', 'editquestions', 'quiz', 'name') ");
+    if ($success && $oldversion < 2005032000) {
+        $success = $success && execute_sql(" INSERT INTO {$CFG->prefix}log_display (module, action, mtable, field) VALUES ('quiz', 'editquestions', 'quiz', 'name') ");
     }
 
-    if ($oldversion < 2005032300) {
-        modify_database ('', 'ALTER TABLE prefix_quiz_question_version RENAME TO prefix_quiz_question_versions;');
+    if ($success && $oldversion < 2005032300) {
+        $success = $success && modify_database ('', 'ALTER TABLE prefix_quiz_question_version RENAME TO prefix_quiz_question_versions;');
     }
 
-    if ($oldversion < 2005041200) { // replace wiki-like with markdown
+    if ($success && $oldversion < 2005041200) { // replace wiki-like with markdown
         include_once( "$CFG->dirroot/lib/wiki_to_markdown.php" );
         $wtm = new WikiToMarkdown();
         $sql = "select course from {$CFG->prefix}quiz_categories, {$CFG->prefix}quiz_questions ";
@@ -336,36 +338,36 @@ function quiz_upgrade($oldversion) {
         $wtm->update( 'quiz_questions', 'questiontext', 'questiontextformat', $sql );
     }
 
-    if ($oldversion < 2005041300) {
-        modify_database('', "UPDATE prefix_quiz_questions SET hidden = '1' WHERE qtype ='".RANDOM."';");
+    if ($success && $oldversion < 2005041300) {
+        $success = $success && modify_database('', "UPDATE prefix_quiz_questions SET hidden = '1' WHERE qtype ='".RANDOM."';");
     }
 
-    if ($oldversion < 2005042002) {
-        table_column('quiz_answers', 'answer', 'answer', 'text', '', '', '', 'not null', '');
+    if ($success && $oldversion < 2005042002) {
+        $success = $success && table_column('quiz_answers', 'answer', 'answer', 'text', '', '', '', 'not null', '');
     }
 
 
-    if ($oldversion < 2005042400) {
+    if ($success && $oldversion < 2005042400) {
         begin_sql();
 
         // Changes to quiz table
 
         // The bits of the optionflags field will hold various option flags
-        table_column('quiz', '', 'optionflags', 'integer', '10', 'unsigned', '0', 'not null', 'timeclose');
+        $success = $success && table_column('quiz', '', 'optionflags', 'integer', '10', 'unsigned', '0', 'not null', 'timeclose');
 
         // The penalty scheme
-        table_column('quiz', '', 'penaltyscheme', 'integer', '4', 'unsigned', '0', 'not null', 'optionflags');
+        $success = $success && table_column('quiz', '', 'penaltyscheme', 'integer', '4', 'unsigned', '0', 'not null', 'optionflags');
 
         // The review options are now all stored in the bits of the review field
-        table_column('quiz', 'review', 'review', 'integer', 10, 'unsigned', 0, 'not null', '');
+        $success = $success && table_column('quiz', 'review', 'review', 'integer', 10, 'unsigned', 0, 'not null', '');
 
         /// Changes to quiz_attempts table
 
         // The preview flag marks teacher previews
-        table_column('quiz_attempts', '', 'preview', 'tinyint', '2', 'unsigned', '0', 'not null', 'timemodified');
+        $success = $success && table_column('quiz_attempts', '', 'preview', 'tinyint', '2', 'unsigned', '0', 'not null', 'timemodified');
 
         // The layout is the list of questions with inserted page breaks.
-        table_column('quiz_attempts', '', 'layout', 'text', '', '', '', 'not null', 'timemodified');
+        $success = $success && table_column('quiz_attempts', '', 'layout', 'text', '', '', '', 'not null', 'timemodified');
         // For old quiz attempts we will set this to the repaginated question list from $quiz->questions
 
         /// The following updates of field values require a loop through all quizzes
@@ -381,14 +383,14 @@ function quiz_upgrade($oldversion) {
                 $quiz->questions = ($quiz->questionsperpage) ? quiz_repaginate($quiz->questions, $quiz->questionsperpage) : $quiz->questions;
                 if ($quiz->questionsperpage) {
                     $quiz->questions = quiz_repaginate($quiz->questions, $quiz->questionsperpage);
-                    set_field('quiz', 'questions', $quiz->questions, 'id', $quiz->id);
+                    $success = $success && set_field('quiz', 'questions', $quiz->questions, 'id', $quiz->id);
                 }
                 set_field('quiz_attempts', 'layout', $quiz->questions, 'quiz', $quiz->id);
 
                 // set preview flag
                 if ($teachers = get_course_teachers($quiz->course)) {
                     $teacherids = implode(',', array_keys($teachers));
-                    execute_sql("UPDATE {$CFG->prefix}quiz_attempts SET preview = 1 WHERE userid IN ($teacherids)");
+                    $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_attempts SET preview = 1 WHERE userid IN ($teacherids)");
                 }
 
                 // set review flags in quiz table
@@ -405,61 +407,61 @@ function quiz_upgrade($oldversion) {
                 if ($quiz->review & 2) {
                     $review += QUIZ_REVIEW_OPEN;
                 }
-                set_field('quiz', 'review', $review, 'id', $quiz->id);
+                $success = $success && set_field('quiz', 'review', $review, 'id', $quiz->id);
             }
             $db->debug = $olddebug;
         }
 
         // We can now drop the fields whose data has been moved to the review field
-        execute_sql(" ALTER TABLE {$CFG->prefix}quiz DROP COLUMN feedback");
-        execute_sql(" ALTER TABLE {$CFG->prefix}quiz DROP COLUMN correctanswers");
+        $success = $success && execute_sql(" ALTER TABLE {$CFG->prefix}quiz DROP COLUMN feedback");
+        $success = $success && execute_sql(" ALTER TABLE {$CFG->prefix}quiz DROP COLUMN correctanswers");
 
         /// Renaming tables
 
         // rename the quiz_question_grades table to quiz_question_instances
-        modify_database ('', 'ALTER TABLE prefix_quiz_question_grades RENAME TO prefix_quiz_question_instances;');
-        modify_database ('', 'ALTER TABLE prefix_quiz_question_grades_id_seq RENAME TO prefix_quiz_question_instances_id_seq;');
-        modify_database ('', 'ALTER TABLE prefix_quiz_question_instances ALTER COLUMN id SET DEFAULT nextval(\'prefix_quiz_question_instances_id_seq\');');
-        modify_database ('', 'DROP INDEX prefix_quiz_question_grades_quiz_idx');
-        modify_database ('', 'DROP INDEX prefix_quiz_question_grades_question_idx;');
-        modify_database ('', 'CREATE INDEX prefix_quiz_question_instances_quiz_idx ON prefix_quiz_question_instances (quiz);');
-        modify_database ('', 'CREATE INDEX prefix_quiz_question_instances_question_idx ON prefix_quiz_question_instances (question);');
+        $success = $success && modify_database ('', 'ALTER TABLE prefix_quiz_question_grades RENAME TO prefix_quiz_question_instances;');
+        $success = $success && modify_database ('', 'ALTER TABLE prefix_quiz_question_grades_id_seq RENAME TO prefix_quiz_question_instances_id_seq;');
+        $success = $success && modify_database ('', 'ALTER TABLE prefix_quiz_question_instances ALTER COLUMN id SET DEFAULT nextval(\'prefix_quiz_question_instances_id_seq\');');
+        $success = $success && modify_database ('', 'DROP INDEX prefix_quiz_question_grades_quiz_idx');
+        $success = $success && modify_database ('', 'DROP INDEX prefix_quiz_question_grades_question_idx;');
+        $success = $success && modify_database ('', 'CREATE INDEX prefix_quiz_question_instances_quiz_idx ON prefix_quiz_question_instances (quiz);');
+        $success = $success && modify_database ('', 'CREATE INDEX prefix_quiz_question_instances_question_idx ON prefix_quiz_question_instances (question);');
 
         // rename the quiz_responses table quiz_states
-        modify_database ('', 'ALTER TABLE prefix_quiz_responses RENAME TO prefix_quiz_states;');
-        modify_database ('', 'ALTER TABLE prefix_quiz_responses_id_seq RENAME TO prefix_quiz_states_id_seq;');
-        modify_database ('', 'ALTER TABLE prefix_quiz_states ALTER COLUMN id SET DEFAULT nextval(\'prefix_quiz_states_id_seq\');');
-        modify_database ('', 'DROP INDEX prefix_quiz_responses_attempt_idx;');
-        modify_database ('', 'DROP INDEX prefix_quiz_responses_question_idx;');
-        modify_database ('', 'CREATE INDEX prefix_quiz_states_attempt_idx ON prefix_quiz_states (attempt);');
-        modify_database ('', 'CREATE INDEX prefix_quiz_states_question_idx ON prefix_quiz_states (question);');
+        $success = $success && modify_database ('', 'ALTER TABLE prefix_quiz_responses RENAME TO prefix_quiz_states;');
+        $success = $success && modify_database ('', 'ALTER TABLE prefix_quiz_responses_id_seq RENAME TO prefix_quiz_states_id_seq;');
+        $success = $success && modify_database ('', 'ALTER TABLE prefix_quiz_states ALTER COLUMN id SET DEFAULT nextval(\'prefix_quiz_states_id_seq\');');
+        $success = $success && modify_database ('', 'DROP INDEX prefix_quiz_responses_attempt_idx;');
+        $success = $success && modify_database ('', 'DROP INDEX prefix_quiz_responses_question_idx;');
+        $success = $success && modify_database ('', 'CREATE INDEX prefix_quiz_states_attempt_idx ON prefix_quiz_states (attempt);');
+        $success = $success && modify_database ('', 'CREATE INDEX prefix_quiz_states_question_idx ON prefix_quiz_states (question);');
 
 
         /// add columns to quiz_states table
 
         // The sequence number of the state.
-        table_column('quiz_states', '', 'seq_number', 'integer', '6', 'unsigned', '0', 'not null', 'originalquestion');
+        $success = $success && table_column('quiz_states', '', 'seq_number', 'integer', '6', 'unsigned', '0', 'not null', 'originalquestion');
         // For existing states we leave this at 0 because in the old quiz code there was only one response allowed
 
         // The time the state was created.
-        table_column('quiz_states', '', 'timestamp', 'integer', '10', 'unsigned', '0', 'not null', 'answer');
+        $success = $success && table_column('quiz_states', '', 'timestamp', 'integer', '10', 'unsigned', '0', 'not null', 'answer');
         // For existing states we will below set this to the timemodified field of the attempt
 
         // The type of event that led to the creation of the state
-        table_column('quiz_states', '', 'event', 'integer', '4', 'unsigned', '0', 'not null', 'timestamp');
+        $success = $success && table_column('quiz_states', '', 'event', 'integer', '4', 'unsigned', '0', 'not null', 'timestamp');
 
         // The raw grade
-        table_column('quiz_states', '', 'raw_grade', 'varchar', '10', '', '', 'not null', 'grade');
+        $success = $success && table_column('quiz_states', '', 'raw_grade', 'varchar', '10', '', '', 'not null', 'grade');
         // For existing states (no penalties) this is equal to the grade
-        execute_sql("UPDATE {$CFG->prefix}quiz_states SET raw_grade = grade");
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_states SET raw_grade = grade");
 
         // The penalty that the response attracted
-        table_column('quiz_states', '', 'penalty', 'varchar', '10', '', '0.0', 'not null', 'raw_grade');
+        $success = $success && table_column('quiz_states', '', 'penalty', 'varchar', '10', '', '0.0', 'not null', 'raw_grade');
         // For existing states this can stay at 0 because penalties did not exist previously.
 
         /// New table for pointers to newest and newest graded states
 
-        modify_database('', "CREATE TABLE prefix_quiz_newest_states (
+        $success = $success && modify_database('', "CREATE TABLE prefix_quiz_newest_states (
                                id SERIAL PRIMARY KEY,
                                attemptid integer NOT NULL default '0',
                                questionid integer NOT NULL default '0',
@@ -467,7 +469,7 @@ function quiz_upgrade($oldversion) {
                                newgraded integer NOT NULL default '0',
                                sumpenalty varchar(10) NOT NULL default '0.0'
                              );");
-        modify_database('CREATE UNIQUE INDEX prefix_quiz_newest_states_attempt_idx ON prefix_quiz_newest_states (attemptid,questionid);');
+        $success = $success && modify_database('CREATE UNIQUE INDEX prefix_quiz_newest_states_attempt_idx ON prefix_quiz_newest_states (attemptid,questionid);');
 
         /// Now upgrade some fields in states and newest_states tables where necessary
         // to save time on large sites only do this for attempts that have not yet been finished.
@@ -483,9 +485,9 @@ function quiz_upgrade($oldversion) {
 
         /// Entries for the log_display table
 
-        modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'preview', 'quiz', 'name');");
-        modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'start attempt', 'quiz', 'name');");
-        modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'close attempt', 'quiz', 'name');");
+        $success = $success && modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'preview', 'quiz', 'name');");
+        $success = $success && modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'start attempt', 'quiz', 'name');");
+        $success = $success && modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'close attempt', 'quiz', 'name');");
 
         /// update the default settings in $CFG
         $review = (QUIZ_REVIEW_IMMEDIATELY & (QUIZ_REVIEW_RESPONSES + QUIZ_REVIEW_SCORES));
@@ -501,16 +503,16 @@ function quiz_upgrade($oldversion) {
         if (isset($CFG->quiz_review) and ($CFG->quiz_review & 2)) {
             $review += QUIZ_REVIEW_OPEN;
         }
-        set_config('quiz_review', $review);
+        $success = $success && set_config('quiz_review', $review);
 
         /// Use tolerance instead of min and max in numerical question type
-        table_column('quiz_numerical', '', 'tolerance', 'varchar', '255', '', '0.0', 'not null', 'question');
-        execute_sql("UPDATE {$CFG->prefix}quiz_numerical SET tolerance = (max::text::real-min::text::real)/2");
-        modify_database('', 'ALTER TABLE prefix_quiz_numerical DROP COLUMN min'); // Replaced by tolerance
-        modify_database('', 'ALTER TABLE prefix_quiz_numerical DROP COLUMN max'); // Replaced by tolerance
+        $success = $success && table_column('quiz_numerical', '', 'tolerance', 'varchar', '255', '', '0.0', 'not null', 'question');
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_numerical SET tolerance = (max::text::real-min::text::real)/2");
+        $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_numerical DROP COLUMN min'); // Replaced by tolerance
+        $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_numerical DROP COLUMN max'); // Replaced by tolerance
 
         /// Tables for Remote Questions
-        modify_database ('', "CREATE TABLE prefix_quiz_rqp (
+        $success = $success && modify_database ('', "CREATE TABLE prefix_quiz_rqp (
                                  id SERIAL PRIMARY KEY,
                                  question integer NOT NULL default '0',
                                  type integer NOT NULL default '0',
@@ -520,9 +522,9 @@ function quiz_upgrade($oldversion) {
                                  maxscore integer NOT NULL default '1'
                                );");
 
-        modify_database ('', "CREATE INDEX prefix_quiz_rqp_question_idx ON prefix_quiz_rqp (question);");
+        $success = $success && modify_database ('', "CREATE INDEX prefix_quiz_rqp_question_idx ON prefix_quiz_rqp (question);");
 
-        modify_database ('', "CREATE TABLE prefix_quiz_rqp_states (
+        $success = $success && modify_database ('', "CREATE TABLE prefix_quiz_rqp_states (
                                  id SERIAL PRIMARY KEY,
                                  stateid integer NOT NULL default '0',
                                  responses text NOT NULL,
@@ -530,7 +532,7 @@ function quiz_upgrade($oldversion) {
                                  template_vars text NOT NULL
                                );");
 
-        modify_database ('', "CREATE TABLE prefix_quiz_rqp_types (
+        $success = $success && modify_database ('', "CREATE TABLE prefix_quiz_rqp_types (
                                 id SERIAL PRIMARY KEY,
                                 name varchar(255) NOT NULL default '',
                                 rendering_server varchar(255) NOT NULL default '',
@@ -538,20 +540,24 @@ function quiz_upgrade($oldversion) {
                                 flags integer NOT NULL default '0'
                               );");
 
-        modify_database ('', "CREATE UNIQUE INDEX prefix_quiz_rqp_types_name_uk ON prefix_quiz_rqp_types (name);");
+        $success = $success && modify_database ('', "CREATE UNIQUE INDEX prefix_quiz_rqp_types_name_uk ON prefix_quiz_rqp_types (name);");
 
-        commit_sql();
+        if ($success) {
+            $success = $success && commit_sql();
+        } else {
+            rollback_sql();
+        }
     }
 
-    if ($oldversion < 2005042900 && false) { // We don't want this to be executed any more!!!
+    if ($success && $oldversion < 2005042900 && false) { // We don't want this to be executed any more!!!
 
         begin_sql();
 
-        table_column('quiz_multianswers', '', 'sequence',  'varchar', '255', '', '', 'not null', 'question');
-        table_column('quiz_numerical', '', 'answers', 'varchar', '255', '', '', 'not null', 'answer');
-        modify_database('', 'UPDATE prefix_quiz_numerical SET answers = answer');
-        table_column('quiz_questions', '', 'parent', 'integer', '10', 'unsigned', '0', 'not null', 'category');
-        modify_database('', "UPDATE prefix_quiz_questions SET parent = id WHERE qtype ='".RANDOM."';");
+        $success = $success && table_column('quiz_multianswers', '', 'sequence',  'varchar', '255', '', '', 'not null', 'question');
+        $success = $success && table_column('quiz_numerical', '', 'answers', 'varchar', '255', '', '', 'not null', 'answer');
+        $success = $success && modify_database('', 'UPDATE prefix_quiz_numerical SET answers = answer');
+        $success = $success && table_column('quiz_questions', '', 'parent', 'integer', '10', 'unsigned', '0', 'not null', 'category');
+        $success = $success && modify_database('', "UPDATE prefix_quiz_questions SET parent = id WHERE qtype ='".RANDOM."';");
 
         // convert multianswer questions to the new model
         if ($multianswers = get_records_sql("SELECT m.id, q.category, q.id AS parent,
@@ -582,13 +588,14 @@ function quiz_upgrade($oldversion) {
                 $multianswers[$i]->questiontext = '';
                 $multianswers[$i]->stamp = make_unique_id_code();
                 $id = insert_record('quiz_questions', $multianswers[$i]);
+                $success = $success && $id;
                 $sequence[$pos] = $id;
 
                 // update the answers table to point to these new questions
-                modify_database('', "UPDATE prefix_quiz_answers SET question = '$id' WHERE id IN ($answers);");
+                $success = $success && modify_database('', "UPDATE prefix_quiz_answers SET question = '$id' WHERE id IN ($answers);");
                 // update the questiontype tables to point to these new questions
                 if (SHORTANSWER == $multianswers[$i]->qtype) {
-                    modify_database('', "UPDATE prefix_quiz_shortanswer SET question = '$id' WHERE answers = '$answers';");
+                    $success = $success && modify_database('', "UPDATE prefix_quiz_shortanswer SET question = '$id' WHERE answers = '$answers';");
                 } else if (NUMERICAL == $multianswers[$i]->qtype) {
                     if (strpos($answers, ',')) {
                         $numerical = get_records_list('quiz_numerical', 'answer', $answers);
@@ -597,26 +604,26 @@ function quiz_upgrade($oldversion) {
                         foreach ($numerical as $num) {
                             $tolerance = ($tolerance < $num->tolerance ? $num->tolerance : $tolerance);
                         }
-                        delete_records_select('quiz_numerical', "answer IN ($answers)");
+                        $success = $success && delete_records_select('quiz_numerical', "answer IN ($answers)");
                         $new = new stdClass;
                         $new->question  = $id;
                         $new->tolerance = $tolerance;
                         $new->answers   = $answers;
-                        insert_record('quiz_numerical', $new);
+                        $success = $success && insert_record('quiz_numerical', $new);
                         unset($numerical, $new, $tolerance);
                     } else {
-                        modify_database('', "UPDATE prefix_quiz_numerical SET question = '$id', answers = '$answers' WHERE answer IN ($answers);");
+                        $success = $success && modify_database('', "UPDATE prefix_quiz_numerical SET question = '$id', answers = '$answers' WHERE answer IN ($answers);");
                     }
                 } else if (MULTICHOICE == $multianswers[$i]->qtype) {
-                    modify_database('', "UPDATE prefix_quiz_multichoice SET question = '$id' WHERE answers = '$answers';");
+                    $success = $success && modify_database('', "UPDATE prefix_quiz_multichoice SET question = '$id' WHERE answers = '$answers';");
                 }
 
                 if (!isset($multianswers[$i+1]) || $parent != $multianswers[$i+1]->parent) {
-                    delete_records('quiz_multianswers', 'question', $parent);
+                    $success = $success && delete_records('quiz_multianswers', 'question', $parent);
                     $multi = new stdClass;
                     $multi->question = $parent;
                     $multi->sequence = implode(',', $sequence);
-                    insert_record('quiz_multianswers', $multi);
+                    $success = $success && insert_record('quiz_multianswers', $multi);
                     if (isset($multianswers[$i+1])) {
                         $parent   = $multianswers[$i+1]->parent;
                         $sequence = array();
@@ -627,33 +634,37 @@ function quiz_upgrade($oldversion) {
         }
 
         // Remove redundant fields from quiz_multianswers
-        modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP COLUMN answers');
-        modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP COLUMN positionkey');
-        modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP COLUMN answertype');
-        modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP COLUMN norm');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP COLUMN answers');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP COLUMN positionkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP COLUMN answertype');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP COLUMN norm');
 
         // Change numerical from answer to answers
-        modify_database('', 'ALTER TABLE prefix_quiz_numerical DROP COLUMN answer');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_numerical DROP COLUMN answer');
 
-        commit_sql();
+        if ($success) {
+            $success = $success && commit_sql();
+        } else {
+            rollback_sql();
+        }
     }
 
-    if ($oldversion < 2005050300) {
+    if ($success && $oldversion < 2005050300) {
         // length of question determines question numbering. Currently all questions require one
         // question number except for DESCRIPTION questions.
-        table_column('quiz_questions', '', 'length', 'integer', '10', 'unsigned', '1', 'not null', 'qtype');
-        execute_sql("UPDATE {$CFG->prefix}quiz_questions SET length = 0 WHERE qtype = ".DESCRIPTION);
+        $success = $success && table_column('quiz_questions', '', 'length', 'integer', '10', 'unsigned', '1', 'not null', 'qtype');
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_questions SET length = 0 WHERE qtype = ".DESCRIPTION);
     }
 
-    if ($oldversion < 2005050408) {
-        table_column('quiz_questions', '', 'penalty', 'float', '', '', '0.1', 'not null', 'defaultgrade');
+    if ($success && $oldversion < 2005050408) {
+        $success = $success && table_column('quiz_questions', '', 'penalty', 'float', '', '', '0.1', 'not null', 'defaultgrade');
     }
 
-    if ($oldversion < 2005051401) {
+    if ($success && $oldversion < 2005051401) {
         // Some earlier changes are undone here, so we need another condition
         if ($oldversion >= 2005042900) {
             // Restore the answer field
-            table_column('quiz_numerical', '', 'answer', 'integer', '10', 'unsigned', '0', 'not null', 'answers');
+            $success = $success && table_column('quiz_numerical', '', 'answer', 'integer', '10', 'unsigned', '0', 'not null', 'answers');
             $singleanswer = array();
             if ($numericals = get_records('quiz_numerical')) {
                 $numericals = array_values($numericals);
@@ -668,10 +679,10 @@ function quiz_upgrade($oldversion) {
                         $answers = explode(',', $numerical->answers);
                         foreach ($answers as $answer) {
                             $numerical->answer = $answer;
-                            insert_record('quiz_numerical', $numerical);
+                            $success = $success && insert_record('quiz_numerical', $numerical);
                         }
                         // ... and get rid of the old record
-                        delete_records('quiz_numerical', 'id', $id);
+                        $success = $success && delete_records('quiz_numerical', 'id', $id);
                     } else {
                         $singleanswer[] = $numerical->id;
                     }
@@ -681,21 +692,21 @@ function quiz_upgrade($oldversion) {
             // Do all of these at once
             if (!empty($singleanswer)) {
                 $singleanswer = implode(',', $singleanswer);
-                modify_database('', "UPDATE prefix_quiz_numerical SET answer = answers WHERE id IN ($singleanswer);");
+                $success = $success && modify_database('', "UPDATE prefix_quiz_numerical SET answer = answers WHERE id IN ($singleanswer);");
             }
 
             // All answer fields are set, so we can delete the answers field
-            modify_database('', 'ALTER TABLE prefix_quiz_numerical DROP answers');
+            $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_numerical DROP answers');
 
         // If the earlier changes weren't made we can safely do only the
         // bits here.
         } else {
             // Comma separated questionids will be stored as sequence
-            table_column('quiz_multianswers', '', 'sequence',  'varchar', '255', '', '', 'not null', 'question');
+            $success = $success && table_column('quiz_multianswers', '', 'sequence',  'varchar', '255', '', '', 'not null', 'question');
             // Change the type of positionkey to int, so that the sorting works!
-            table_column('quiz_multianswers', 'positionkey', 'positionkey',  'integer', '10', 'unsigned', '0', 'not null', '');
-            table_column('quiz_questions', '', 'parent', 'integer', '10', 'unsigned', '0', 'not null', 'category');
-            modify_database('', "UPDATE prefix_quiz_questions SET parent = id WHERE qtype ='".RANDOM."';");
+            $success = $success && table_column('quiz_multianswers', 'positionkey', 'positionkey',  'integer', '10', 'unsigned', '0', 'not null', '');
+            $success = $success && table_column('quiz_questions', '', 'parent', 'integer', '10', 'unsigned', '0', 'not null', 'category');
+            $success = $success && modify_database('', "UPDATE prefix_quiz_questions SET parent = id WHERE qtype ='".RANDOM."';");
 
             // Each multianswer record is converted to a question object and then
             // inserted as a new question into the quiz_questions table.
@@ -745,18 +756,19 @@ function quiz_upgrade($oldversion) {
                     // $multianswers[$i]->defaultgrade is set in the query
                     // $multianswers[$i]->qtype is set in the query
                     $id = insert_record('quiz_questions', $multianswers[$i]);
+                    $success = $success && $id;
                     $sequence[$pos] = $id;
 
                 // Update the quiz_answers table to point to these new questions
-                    modify_database('', "UPDATE prefix_quiz_answers SET question = '$id' WHERE id IN ($answers);");
+                    $success = $success && modify_database('', "UPDATE prefix_quiz_answers SET question = '$id' WHERE id IN ($answers);");
                 // Update the questiontype tables to point to these new questions
 
                     if (SHORTANSWER == $multianswers[$i]->qtype) {
-                        modify_database('', "UPDATE prefix_quiz_shortanswer SET question = '$id' WHERE answers = '$answers';");
+                        $success = $success && modify_database('', "UPDATE prefix_quiz_shortanswer SET question = '$id' WHERE answers = '$answers';");
                     } else if (MULTICHOICE == $multianswers[$i]->qtype) {
-                        modify_database('', "UPDATE prefix_quiz_multichoice SET question = '$id' WHERE answers = '$answers';");
+                        $success = $success && modify_database('', "UPDATE prefix_quiz_multichoice SET question = '$id' WHERE answers = '$answers';");
                     } else if (NUMERICAL == $multianswers[$i]->qtype) {
-                        modify_database('', "UPDATE prefix_quiz_numerical SET question = '$id' WHERE answer IN ($answers);");
+                        $success = $success && modify_database('', "UPDATE prefix_quiz_numerical SET question = '$id' WHERE answer IN ($answers);");
                     }
 
                     // Whenever we're through with the subquestions of one multianswer
@@ -781,15 +793,15 @@ function quiz_upgrade($oldversion) {
                                     }
                                 }
                                 $state->answer = rtrim($state->answer, ','); // strip trailing comma
-                                update_record('quiz_states', $state);
+                                $success = $success && update_record('quiz_states', $state);
                             }
                         }
 
-                        delete_records('quiz_multianswers', 'question', $parent);
+                        $success = $success && delete_records('quiz_multianswers', 'question', $parent);
                         $multi = new stdClass;
                         $multi->question = $parent;
                         $multi->sequence = implode(',', $sequence);
-                        insert_record('quiz_multianswers', $multi);
+                        $success = $success && insert_record('quiz_multianswers', $multi);
 
                         if (isset($multianswers[$i+1])) {
                             $parent    = $multianswers[$i+1]->parent;
@@ -802,21 +814,21 @@ function quiz_upgrade($oldversion) {
             }
 
             // Remove redundant fields from quiz_multianswers
-            modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP answers');
-            modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP positionkey');
-            modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP answertype');
-            modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP norm');
+            $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP answers');
+            $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP positionkey');
+            $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP answertype');
+            $success = $success && modify_database('', 'ALTER TABLE prefix_quiz_multianswers DROP norm');
         }
     }
 
-    if ($oldversion < 2005051402) {
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT category;",false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT {$CFG->prefix}attemptonlast_datasets_category_userid;",false);
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT {$CFG->prefix}quiz_category_userid_unique;",false);
-        modify_database('','ALTER TABLE prefix_quiz_attemptonlast_datasets ADD CONSTRAINT prefix_quiz_category_userid_unique UNIQUE (category,userid);');
+    if ($success && $oldversion < 2005051402) {
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT category;",false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT {$CFG->prefix}attemptonlast_datasets_category_userid;",false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_attemptonlast_datasets DROP CONSTRAINT {$CFG->prefix}quiz_category_userid_unique;",false);
+        $success = $success && modify_database('','ALTER TABLE prefix_quiz_attemptonlast_datasets ADD CONSTRAINT prefix_quiz_category_userid_unique UNIQUE (category,userid);');
     }
 
-    if ($oldversion < 2005060300) {
+    if ($success && $oldversion < 2005060300) {
         // We need to remove some duplicate entries that may be present in some databases
         // due to a faulty restore script
 
@@ -839,7 +851,7 @@ function quiz_upgrade($oldversion) {
                     if ($skip) {
                         $skip = false;
                     } else {
-                        delete_records('quiz_numerical','id', $id->id);
+                        $success = $success && delete_records('quiz_numerical','id', $id->id);
                     }
                 }
             }
@@ -864,7 +876,7 @@ function quiz_upgrade($oldversion) {
                     if ($skip) {
                         $skip = false;
                     } else {
-                        delete_records('quiz_shortanswer','id', $id->id);
+                        $success = $success && delete_records('quiz_shortanswer','id', $id->id);
                     }
                 }
             }
@@ -889,7 +901,7 @@ function quiz_upgrade($oldversion) {
                     if ($skip) {
                         $skip = false;
                     } else {
-                        delete_records('quiz_multichoice','id', $id->id);
+                        $success = $success && delete_records('quiz_multichoice','id', $id->id);
                     }
                 }
             }
@@ -911,7 +923,7 @@ function quiz_upgrade($oldversion) {
                 //Process it with question_delete_course(). It will do all the hard work.
                 if (!record_exists('course', 'id', $course->id)) {
                     require_once("$CFG->libdir/questionlib.php ");
-                    question_delete_course($course);
+                    $success = $success && question_delete_course($course);
                 }
             }
         }
@@ -919,114 +931,113 @@ function quiz_upgrade($oldversion) {
         $db->debug = $olddebug;
     }
 
-    if ($oldversion < 2005060301) {
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_type RENAME TO '.$CFG->prefix.'quiz_rqp_types');
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_type_id_seq RENAME TO '.$CFG->prefix.'rqp_types_id_seq');
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_types ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'quiz_rqp_types_id_seq\')');
-        execute_sql('DROP INDEX '.$CFG->prefix.'quiz_rqp_type_name_uk');
-        execute_sql('CREATE UNIQUE INDEX '.$CFG->prefix.'quiz_rqp_types_name_uk ON '.$CFG->prefix.'quiz_rqp_types (name);');
-
+    if ($success && $oldversion < 2005060301) {
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_type RENAME TO '.$CFG->prefix.'quiz_rqp_types');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_type_id_seq RENAME TO '.$CFG->prefix.'rqp_types_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_types ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'quiz_rqp_types_id_seq\')');
+        $success = $success && execute_sql('DROP INDEX '.$CFG->prefix.'quiz_rqp_type_name_uk');
+        $success = $success && execute_sql('CREATE UNIQUE INDEX '.$CFG->prefix.'quiz_rqp_types_name_uk ON '.$CFG->prefix.'quiz_rqp_types (name);');
     }
     
-    if ($oldversion < 2005060302) { // Mass cleanup of bad postgres upgrade scripts
-        execute_sql('CREATE UNIQUE INDEX '.$CFG->prefix.'quiz_newest_states_attempt_idx ON '.$CFG->prefix.'quiz_newest_states (attemptid, questionid)',false);
-        execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_attemptonlast_datasets DROP CONSTRAINT '.$CFG->prefix.'quiz_category_userid_unique',false);
-        execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_attemptonlast_datasets ADD CONSTRAINT '.$CFG->prefix.'quiz_attemptonlast_datasets_category_userid UNIQUE (category, userid)',false);
-        execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_question_instances DROP CONSTRAINT '.$CFG->prefix.'quiz_question_grades_pkey',false);
-        execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_question_instances ADD CONSTRAINT '.$CFG->prefix.'quiz_question_instances_pkey PRIMARY KEY (id)',false);
-        execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_question_versions DROP CONSTRAINT '.$CFG->prefix.'quiz_question_version_pkey',false);
-        execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_question_versions ADD CONSTRAINT '.$CFG->prefix.'quiz_question_versions_pkey PRIMARY KEY (id)',false);
-        execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_states DROP CONSTRAINT '.$CFG->prefix.'quiz_responses_pkey',false);
-        execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_states ADD CONSTRAINT '.$CFG->prefix.'quiz_states_pkey PRIMARY KEY (id)',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER decimalpoints SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER optionflags SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER penaltyscheme SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER popup SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER questionsperpage SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER review SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_answers ALTER answer SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_attempts ALTER layout SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_attempts ALTER preview SET NOT NULL',false);
-
-        table_column('quiz_calculated','correctanswerformat','correctanswerformat','integer','16','unsigned','2');
-
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_categories ALTER parent SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_categories ALTER sortorder SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_grades ALTER grade SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_multianswers ALTER sequence SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_numerical ALTER tolerance SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_questions ALTER hidden SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_questions ALTER length SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_questions ALTER parent SET NOT NULL',false);
-
-        table_column('quiz_questions','penalty','penalty','real','','UNSIGNED','0.1');
-
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER answer SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER event SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER originalquestion SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER penalty SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER raw_grade SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER seq_number SET NOT NULL',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER timestamp SET NOT NULL',false);
-    }
-
-    if ($oldversion < 2005100500) {
-        // clean up an old mistake.
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_question_version_id_seq RENAME TO '.$CFG->prefix.'quiz_question_versions_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_question_versions ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'quiz_question_versions_id_seq\')',false);
-    }
-    if ($oldversion < 2006020801) {
-         table_column("quiz", "", "delay1", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "popup");
-         table_column("quiz", "", "delay2", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "delay1");
-    }
-
-    if ($oldversion < 2006021101) {
+    if ($success && $oldversion < 2005060302) { // Mass cleanup of bad postgres upgrade scripts
+        $success = $success && execute_sql('CREATE UNIQUE INDEX '.$CFG->prefix.'quiz_newest_states_attempt_idx ON '.$CFG->prefix.'quiz_newest_states (attemptid, questionid)',false);
+        $success = $success && execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_attemptonlast_datasets DROP CONSTRAINT '.$CFG->prefix.'quiz_category_userid_unique',false);
+        $success = $success && execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_attemptonlast_datasets ADD CONSTRAINT '.$CFG->prefix.'quiz_attemptonlast_datasets_category_userid UNIQUE (category, userid)',false);
+        $success = $success && execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_question_instances DROP CONSTRAINT '.$CFG->prefix.'quiz_question_grades_pkey',false);
+        $success = $success && execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_question_instances ADD CONSTRAINT '.$CFG->prefix.'quiz_question_instances_pkey PRIMARY KEY (id)',false);
+        $success = $success && execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_question_versions DROP CONSTRAINT '.$CFG->prefix.'quiz_question_version_pkey',false);
+        $success = $success && execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_question_versions ADD CONSTRAINT '.$CFG->prefix.'quiz_question_versions_pkey PRIMARY KEY (id)',false);
+        $success = $success && execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_states DROP CONSTRAINT '.$CFG->prefix.'quiz_responses_pkey',false);
+        $success = $success && execute_sql('ALTER TABLE ONLY '.$CFG->prefix.'quiz_states ADD CONSTRAINT '.$CFG->prefix.'quiz_states_pkey PRIMARY KEY (id)',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER decimalpoints SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER optionflags SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER penaltyscheme SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER popup SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER questionsperpage SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz ALTER review SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_answers ALTER answer SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_attempts ALTER layout SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_attempts ALTER preview SET NOT NULL',false);
+
+        $success = $success && table_column('quiz_calculated','correctanswerformat','correctanswerformat','integer','16','unsigned','2');
+
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_categories ALTER parent SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_categories ALTER sortorder SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_grades ALTER grade SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_multianswers ALTER sequence SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_numerical ALTER tolerance SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_questions ALTER hidden SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_questions ALTER length SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_questions ALTER parent SET NOT NULL',false);
+
+        $success = $success && table_column('quiz_questions','penalty','penalty','real','','UNSIGNED','0.1');
+
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER answer SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER event SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER originalquestion SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER penalty SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER raw_grade SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER seq_number SET NOT NULL',false);
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states ALTER timestamp SET NOT NULL',false);
+    }
+
+    if ($success && $oldversion < 2005100500) {
+        // clean up an old mistake. This mistake may not have been made, so don't worry about failures.
+        $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_question_version_id_seq RENAME TO '.$CFG->prefix.'quiz_question_versions_id_seq',false);
+        $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_question_versions ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'quiz_question_versions_id_seq\')',false);
+    }
+    if ($success && $oldversion < 2006020801) {
+        $success = $success && table_column("quiz", "", "delay1", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "popup");
+        $success = $success && table_column("quiz", "", "delay2", "INTEGER", "10", "UNSIGNED", "0", "NOT NULL", "delay1");
+    }
+
+    if ($success && $oldversion < 2006021101) {
         // set defaultgrade field properly (probably not necessary, but better make sure)
-        execute_sql("UPDATE {$CFG->prefix}quiz_questions SET defaultgrade = '1' WHERE defaultgrade = '0'", false);
-        execute_sql("UPDATE {$CFG->prefix}quiz_questions SET defaultgrade = '0' WHERE qtype = '".DESCRIPTION."'", false);
+        $success && execute_sql("UPDATE {$CFG->prefix}quiz_questions SET defaultgrade = '1' WHERE defaultgrade = '0'", false);
+        $success && execute_sql("UPDATE {$CFG->prefix}quiz_questions SET defaultgrade = '0' WHERE qtype = '".DESCRIPTION."'", false);
     }
 
-    if ($oldversion < 2006021103) {
+    if ($success && $oldversion < 2006021103) {
         // add new field to store the question-level shuffleanswers option
-        table_column('quiz_match', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'subquestions');
-        table_column('quiz_multichoice', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'single');
-        table_column('quiz_randomsamatch', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'choose');
+        $success = $success && table_column('quiz_match', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'subquestions');
+        $success = $success && table_column('quiz_multichoice', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'single');
+        $success = $success && table_column('quiz_randomsamatch', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'choose');
     }
 
-    if ($oldversion < 2006021104) {
+    if ($success && $oldversion < 2006021104) {
         // add originalversion field for the new versioning mechanism
-        table_column('quiz_question_versions', '', 'originalquestion', 'int', '10', 'unsigned', '0', 'not null', 'newquestion');
+        $success = $success && table_column('quiz_question_versions', '', 'originalquestion', 'int', '10', 'unsigned', '0', 'not null', 'newquestion');
     }
 
-    if ($oldversion < 2006021302) {
-        table_column('quiz_match_sub', '', 'code', 'int', '10', 'unsigned', '0', 'not null', 'id');
-        execute_sql("UPDATE {$CFG->prefix}quiz_match_sub SET code = id", false);
+    if ($success && $oldversion < 2006021302) {
+        $success = $success && table_column('quiz_match_sub', '', 'code', 'int', '10', 'unsigned', '0', 'not null', 'id');
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_match_sub SET code = id", false);
     }
 
-    if ($oldversion < 2006021304) {
+    if ($success && $oldversion < 2006021304) {
         // convert sequence field to text to accomodate very long sequences, see bug 4257
-        table_column('quiz_multianswers', 'sequence', 'sequence',  'text', '', '', '', 'not null', 'question');
+        $success = $success && table_column('quiz_multianswers', 'sequence', 'sequence',  'text', '', '', '', 'not null', 'question');
     }
 
-    if ($oldversion < 2006021400) {
+    if ($success && $oldversion < 2006021400) {
         // modify_database('','CREATE UNIQUE INDEX prefix_quiz_attempts_uniqueid_uk ON prefix_quiz_attempts (uniqueid);');
         // this index will not be created since uniqueid was not added, proper upgrade will be on 2006042801
     }
 
-    if ($oldversion < 2006021501) {
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_newest_states RENAME TO {$CFG->prefix}question_sessions", false);
+    if ($success && $oldversion < 2006021501) {
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_newest_states RENAME TO {$CFG->prefix}question_sessions", false);
     }
 
-    if ($oldversion < 2006021900) {
+    if ($success && $oldversion < 2006021900) {
         
-        modify_database ('', "
+        $success = $success && modify_database ('', "
             CREATE TABLE prefix_quiz_essay (
                 id SERIAL PRIMARY KEY,
                 question integer NOT NULL default '0',
                 answer varchar(255) NOT NULL default ''
             ) ");
 
-        modify_database ('', "
+        $success = $success && modify_database ('', "
             CREATE TABLE prefix_quiz_essay_states (
                 id SERIAL PRIMARY KEY,
                 stateid integer NOT NULL default '0',
@@ -1036,204 +1047,199 @@ function quiz_upgrade($oldversion) {
             );");
 
         // convert grade fields to real
-        table_column('quiz_attempts', 'sumgrades', 'sumgrades',  'real', '', '', '0', 'not null');
-        table_column('quiz_answers', 'fraction', 'fraction',  'real', '', '', '0', 'not null');
-        table_column('quiz_essay_states', 'fraction', 'fraction',  'real', '', '', '0', 'not null');
-        table_column('quiz_states', 'grade', 'grade',  'real', '', '', '0', 'not null');
-        table_column('quiz_states', 'raw_grade', 'raw_grade',  'real', '', '', '0', 'not null');
-        table_column('quiz_states', 'penalty', 'penalty',  'real', '', '', '0', 'not null');
-        table_column('question_sessions', 'sumpenalty', 'sumpenalty',  'real', '', '', '0', 'not null');
-    }
-
-    if ($oldversion < 2006030100) {
+        $success = $success && table_column('quiz_attempts', 'sumgrades', 'sumgrades',  'real', '', '', '0', 'not null');
+        $success = $success && table_column('quiz_answers', 'fraction', 'fraction',  'real', '', '', '0', 'not null');
+        $success = $success && table_column('quiz_essay_states', 'fraction', 'fraction',  'real', '', '', '0', 'not null');
+        $success = $success && set_field('quiz_states', 'grade', 0, 'grade', ''); // Some values may be wrong, which caused errors in the following table_column calls.
+        $success = $success && set_field('quiz_states', 'raw_grade', 0, 'raw_grade', '');
+        $success = $success && set_field('quiz_states', 'penalty', 0, 'penalty', '');
+        $success = $success && table_column('quiz_states', 'grade', 'grade',  'real', '', '', '0', 'not null');
+        $success = $success && table_column('quiz_states', 'raw_grade', 'raw_grade',  'real', '', '', '0', 'not null');
+        $success = $success && table_column('quiz_states', 'penalty', 'penalty',  'real', '', '', '0', 'not null');
+        $success = $success && table_column('question_sessions', 'sumpenalty', 'sumpenalty',  'real', '', '', '0', 'not null');
+    }
+
+    if ($success && $oldversion < 2006030100) {
         // Fix up another table rename :(
         // THIS caused the mistake: execute_sql("ALTER TABLE {$CFG->prefix}quiz_newest_states RENAME TO {$CFG->prefix}question_sessions", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_newest_states_id_seq RENAME TO '.$CFG->prefix.'question_sessions_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_sessions ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_sessions_id_seq\')',false);
+        $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_newest_states_id_seq RENAME TO '.$CFG->prefix.'question_sessions_id_seq',false);
+        $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_sessions ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_sessions_id_seq\')',false);
     }
 
-    if ($oldversion < 2006030101) {
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_questions RENAME TO {$CFG->prefix}question", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_questions_id_seq RENAME TO '.$CFG->prefix.'question_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_id_seq\')',false);
+    if ($success && $oldversion < 2006030101) {
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_questions RENAME TO {$CFG->prefix}question");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_questions_id_seq RENAME TO '.$CFG->prefix.'question_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_states RENAME TO {$CFG->prefix}question_states", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states_id_seq RENAME TO '.$CFG->prefix.'question_states_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_states ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_states_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_states RENAME TO {$CFG->prefix}question_states");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_states_id_seq RENAME TO '.$CFG->prefix.'question_states_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_states ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_states_id_seq\')');
     
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_answers RENAME TO {$CFG->prefix}question_answers", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_answers_id_seq RENAME TO '.$CFG->prefix.'question_answers_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_answers ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_answers_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_answers RENAME TO {$CFG->prefix}question_answers");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_answers_id_seq RENAME TO '.$CFG->prefix.'question_answers_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_answers ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_answers_id_seq\')');
     
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_categories RENAME TO {$CFG->prefix}question_categories", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_categories_id_seq RENAME TO '.$CFG->prefix.'question_categories_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_categories ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_categories_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_categories RENAME TO {$CFG->prefix}question_categories");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_categories_id_seq RENAME TO '.$CFG->prefix.'question_categories_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_categories ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_categories_id_seq\')');
     }
 
-    if ($oldversion < 2006031202) {
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_truefalse RENAME TO {$CFG->prefix}question_truefalse", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_truefalse_id_seq RENAME TO '.$CFG->prefix.'question_truefalse_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_truefalse ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_truefalse_id_seq\')',false);
-
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_shortanswer RENAME TO {$CFG->prefix}question_shortanswer", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_shortanswer_id_seq RENAME TO '.$CFG->prefix.'question_shortanswer_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_shortanswer ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_shortanswer_id_seq\')',false);
+    if ($success && $oldversion < 2006031202) {
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_truefalse RENAME TO {$CFG->prefix}question_truefalse");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_truefalse_id_seq RENAME TO '.$CFG->prefix.'question_truefalse_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_truefalse ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_truefalse_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_multianswers RENAME TO {$CFG->prefix}question_multianswer", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_multianswers_id_seq RENAME TO '.$CFG->prefix.'question_multianswer_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_multianswer ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_multianswer_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_shortanswer RENAME TO {$CFG->prefix}question_shortanswer");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_shortanswer_id_seq RENAME TO '.$CFG->prefix.'question_shortanswer_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_shortanswer ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_shortanswer_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_multichoice RENAME TO {$CFG->prefix}question_multichoice", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_multichoice_id_seq RENAME TO '.$CFG->prefix.'question_multichoice_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_multichoice ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_multichoice_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_multianswers RENAME TO {$CFG->prefix}question_multianswer");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_multianswers_id_seq RENAME TO '.$CFG->prefix.'question_multianswer_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_multianswer ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_multianswer_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical RENAME TO {$CFG->prefix}question_numerical", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_numerical_id_seq RENAME TO '.$CFG->prefix.'question_numerical_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_numerical ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_numerical_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_multichoice RENAME TO {$CFG->prefix}question_multichoice");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_multichoice_id_seq RENAME TO '.$CFG->prefix.'question_multichoice_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_multichoice ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_multichoice_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical_units RENAME TO {$CFG->prefix}question_numerical_units", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_numerical_units_id_seq RENAME TO '.$CFG->prefix.'question_numerical_units_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_numerical_units ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_numerical_units_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical RENAME TO {$CFG->prefix}question_numerical");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_numerical_id_seq RENAME TO '.$CFG->prefix.'question_numerical_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_numerical ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_numerical_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_randomsamatch RENAME TO {$CFG->prefix}question_randomsamatch", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_randomsamatch_id_seq RENAME TO '.$CFG->prefix.'question_randomsamatch_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_randomsamatch ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_randomsamatch_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_numerical_units RENAME TO {$CFG->prefix}question_numerical_units");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_numerical_units_id_seq RENAME TO '.$CFG->prefix.'question_numerical_units_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_numerical_units ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_numerical_units_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_match RENAME TO {$CFG->prefix}question_match", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_match_id_seq RENAME TO '.$CFG->prefix.'question_match_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_match ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_match_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_randomsamatch RENAME TO {$CFG->prefix}question_randomsamatch");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_randomsamatch_id_seq RENAME TO '.$CFG->prefix.'question_randomsamatch_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_randomsamatch ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_randomsamatch_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_match_sub RENAME TO {$CFG->prefix}question_match_sub", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_match_sub_id_seq RENAME TO '.$CFG->prefix.'question_match_sub_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_match_sub ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_match_sub_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_match RENAME TO {$CFG->prefix}question_match");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_match_id_seq RENAME TO '.$CFG->prefix.'question_match_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_match ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_match_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_calculated RENAME TO {$CFG->prefix}question_calculated", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_calculated_id_seq RENAME TO '.$CFG->prefix.'question_calculated_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_calculated ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_calculated_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_match_sub RENAME TO {$CFG->prefix}question_match_sub");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_match_sub_id_seq RENAME TO '.$CFG->prefix.'question_match_sub_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_match_sub ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_match_sub_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_dataset_definitions RENAME TO {$CFG->prefix}question_dataset_definitions", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_dataset_definitions_id_seq RENAME TO '.$CFG->prefix.'question_dataset_definitions_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_dataset_definitions ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_dataset_definitions_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_calculated RENAME TO {$CFG->prefix}question_calculated");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_calculated_id_seq RENAME TO '.$CFG->prefix.'question_calculated_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_calculated ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_calculated_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_dataset_items RENAME TO {$CFG->prefix}question_dataset_items", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_dataset_items_id_seq RENAME TO '.$CFG->prefix.'question_dataset_items_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_dataset_items ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_dataset_items_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_dataset_definitions RENAME TO {$CFG->prefix}question_dataset_definitions");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_dataset_definitions_id_seq RENAME TO '.$CFG->prefix.'question_dataset_definitions_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_dataset_definitions ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_dataset_definitions_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_question_datasets RENAME TO {$CFG->prefix}question_datasets", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_question_datasets_id_seq RENAME TO '.$CFG->prefix.'question_datasets_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_datasets ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_datasets_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_dataset_items RENAME TO {$CFG->prefix}question_dataset_items");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_dataset_items_id_seq RENAME TO '.$CFG->prefix.'question_dataset_items_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_dataset_items ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_dataset_items_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp RENAME TO {$CFG->prefix}question_rqp", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_id_seq RENAME TO '.$CFG->prefix.'question_rqp_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_rqp ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_rqp_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_question_datasets RENAME TO {$CFG->prefix}question_datasets");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_question_datasets_id_seq RENAME TO '.$CFG->prefix.'question_datasets_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_datasets ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_datasets_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp_servers RENAME TO {$CFG->prefix}question_rqp_servers", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_servers_id_seq RENAME TO '.$CFG->prefix.'question_rqp_servers_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_rqp_servers ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_rqp_servers_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp RENAME TO {$CFG->prefix}question_rqp");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_id_seq RENAME TO '.$CFG->prefix.'question_rqp_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_rqp ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_rqp_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp_states RENAME TO {$CFG->prefix}question_rqp_states", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_states_id_seq RENAME TO '.$CFG->prefix.'question_rqp_states_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_rqp_states ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_rqp_states_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp_states RENAME TO {$CFG->prefix}question_rqp_states");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_states_id_seq RENAME TO '.$CFG->prefix.'question_rqp_states_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_rqp_states ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_rqp_states_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp_types RENAME TO {$CFG->prefix}question_rqp_types", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_types_id_seq RENAME TO '.$CFG->prefix.'question_rqp_types_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_rqp_types ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_rqp_types_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_rqp_types RENAME TO {$CFG->prefix}question_rqp_types");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_rqp_types_id_seq RENAME TO '.$CFG->prefix.'question_rqp_types_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_rqp_types ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_rqp_types_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_essay RENAME TO {$CFG->prefix}question_essay", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_essay_id_seq RENAME TO '.$CFG->prefix.'question_essay_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_essay ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_essay_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_essay RENAME TO {$CFG->prefix}question_essay");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_essay_id_seq RENAME TO '.$CFG->prefix.'question_essay_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_essay ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_essay_id_seq\')');
 
-        execute_sql("ALTER TABLE {$CFG->prefix}quiz_essay_states RENAME TO {$CFG->prefix}question_essay_states", false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_essay_states_id_seq RENAME TO '.$CFG->prefix.'question_essay_states_id_seq',false);
-        execute_sql('ALTER TABLE '.$CFG->prefix.'question_essay_states ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_essay_states_id_seq\')',false);
+        $success = $success && execute_sql("ALTER TABLE {$CFG->prefix}quiz_essay_states RENAME TO {$CFG->prefix}question_essay_states");
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'quiz_essay_states_id_seq RENAME TO '.$CFG->prefix.'question_essay_states_id_seq');
+        $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_essay_states ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_essay_states_id_seq\')');
 
     }
 
-    if ($oldversion < 2006032100) {
+    if ($success && $oldversion < 2006032100) {
         // change from the old questiontype numbers to using the questiontype names
-        table_column('question', 'qtype', 'qtype',  'varchar', 20, '', '', 'not null');
-        set_field('question', 'qtype', 'shortanswer', 'qtype', 1);
-        set_field('question', 'qtype', 'truefalse', 'qtype', 2);
-        set_field('question', 'qtype', 'multichoice', 'qtype', 3);
-        set_field('question', 'qtype', 'random', 'qtype', 4);
-        set_field('question', 'qtype', 'match', 'qtype', 5);
-        set_field('question', 'qtype', 'randomsamatch', 'qtype', 6);
-        set_field('question', 'qtype', 'description', 'qtype', 7);
-        set_field('question', 'qtype', 'numerical', 'qtype', 8);
-        set_field('question', 'qtype', 'multianswer', 'qtype', 9);
-        set_field('question', 'qtype', 'calculated', 'qtype', 10);
-        set_field('question', 'qtype', 'rqp', 'qtype', 11);
-        set_field('question', 'qtype', 'essay', 'qtype', 12);
-    }
-
-    if ($oldversion < 2006032200) {
+        $success = $success && table_column('question', 'qtype', 'qtype',  'varchar', 20, '', '', 'not null');
+        $success = $success && set_field('question', 'qtype', 'shortanswer', 'qtype', 1);
+        $success = $success && set_field('question', 'qtype', 'truefalse', 'qtype', 2);
+        $success = $success && set_field('question', 'qtype', 'multichoice', 'qtype', 3);
+        $success = $success && set_field('question', 'qtype', 'random', 'qtype', 4);
+        $success = $success && set_field('question', 'qtype', 'match', 'qtype', 5);
+        $success = $success && set_field('question', 'qtype', 'randomsamatch', 'qtype', 6);
+        $success = $success && set_field('question', 'qtype', 'description', 'qtype', 7);
+        $success = $success && set_field('question', 'qtype', 'numerical', 'qtype', 8);
+        $success = $success && set_field('question', 'qtype', 'multianswer', 'qtype', 9);
+        $success = $success && set_field('question', 'qtype', 'calculated', 'qtype', 10);
+        $success = $success && set_field('question', 'qtype', 'rqp', 'qtype', 11);
+        $success = $success && set_field('question', 'qtype', 'essay', 'qtype', 12);
+    }
+
+    if ($success && $oldversion < 2006032200) {
         // set version for all questiontypes that already have their tables installed
-        set_config('qtype_calculated_version', 2006032100);
-        set_config('qtype_essay_version', 2006032100);
-        set_config('qtype_match_version', 2006032100);
-        set_config('qtype_multianswer_version', 2006032100);
-        set_config('qtype_multichoice_version', 2006032100);
-        set_config('qtype_numerical_version', 2006032100);
-        set_config('qtype_randomsamatch_version', 2006032100);
-        set_config('qtype_rqp_version', 2006032100);
-        set_config('qtype_shortanswer_version', 2006032100);
-        set_config('qtype_truefalse_version', 2006032100);
+        $success = $success && set_config('qtype_calculated_version', 2006032100);
+        $success = $success && set_config('qtype_essay_version', 2006032100);
+        $success = $success && set_config('qtype_match_version', 2006032100);
+        $success = $success && set_config('qtype_multianswer_version', 2006032100);
+        $success = $success && set_config('qtype_multichoice_version', 2006032100);
+        $success = $success && set_config('qtype_numerical_version', 2006032100);
+        $success = $success && set_config('qtype_randomsamatch_version', 2006032100);
+        $success = $success && set_config('qtype_rqp_version', 2006032100);
+        $success = $success && set_config('qtype_shortanswer_version', 2006032100);
+        $success = $success && set_config('qtype_truefalse_version', 2006032100);
     }
 
-    if ($oldversion < 2006040600) {
-        table_column('question_sessions', '', 'comment', 'text', '', '', '', 'not null', 'sumpenalty');
+    if ($success && $oldversion < 2006040600) {
+        $success = $success && table_column('question_sessions', '', 'comment', 'text', '', '', '', 'not null', 'sumpenalty');
     }
 
-    if ($oldversion < 2006040900) {
-        modify_database('', "UPDATE prefix_question SET parent = id WHERE qtype ='random';");
+    if ($success && $oldversion < 2006040900) {
+        $success = $success && modify_database('', "UPDATE prefix_question SET parent = id WHERE qtype ='random';");
     }
 
-    if ($oldversion < 2006041000) {
-        modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'continue attempt', 'quiz', 'name');");
+    if ($success && $oldversion < 2006041000) {
+        $success = $success && modify_database('', " INSERT INTO prefix_log_display (module, action, mtable, field) VALUES ('quiz', 'continue attempt', 'quiz', 'name');");
     }
 
-    if ($oldversion < 2006041001) {
-        table_column('question', 'version', 'version', 'varchar', 255);
+    if ($success && $oldversion < 2006041001) {
+        $success = $success && table_column('question', 'version', 'version', 'varchar', 255);
     }
 
-    if ($oldversion < 2006042800) {
+    if ($success && $oldversion < 2006042800) {
         // Check we have some un-renamed tables (verified in some servers)
         if ($tables = $db->MetaTables('TABLES')) {
             if (in_array($CFG->prefix.'quiz_randommatch', $tables) &&
                 !in_array($CFG->prefix.'question_randomsamatch', $tables)) {
-                modify_database ("", "ALTER TABLE prefix_quiz_randommatch RENAME prefix_question_randomsamatch ");
-                modify_database ("", "ALTER TABLE prefix_quiz_randommatch_id_seq RENAME prefix_question_randomsamatch_id_seq ");
-                execute_sql('ALTER TABLE '.$CFG->prefix.'question_randomsamatch ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_randomsamatch_id_seq\')',false);
+                $success = $success && modify_database ("", "ALTER TABLE prefix_quiz_randommatch RENAME prefix_question_randomsamatch ");
+                $success = $success && modify_database ("", "ALTER TABLE prefix_quiz_randommatch_id_seq RENAME prefix_question_randomsamatch_id_seq ");
+                $success = $success && execute_sql('ALTER TABLE '.$CFG->prefix.'question_randomsamatch ALTER COLUMN id SET DEFAULT nextval(\''.$CFG->prefix.'question_randomsamatch_id_seq\')');
             }
             // Check for one possible missing field in one table
             if ($columns = $db->MetaColumnNames($CFG->prefix.'question_randomsamatch')) {
                 if (!in_array('shuffleanswers', $columns)) {
-                    table_column('question_randomsamatch', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'choose');
+                    $success = $success && table_column('question_randomsamatch', '', 'shuffleanswers', 'tinyint', '4', 'unsigned', '1', 'not null', 'choose');
                 }
             }
         }
     }
 
-    if ($oldversion < 2006051300) {  // this block also exec'ed by 2006042801 on MOODLE_16_STABLE
+    if ($success && $oldversion < 2006051300) {  // this block also exec'ed by 2006042801 on MOODLE_16_STABLE
         // The newgraded field must always point to a valid state
-        modify_database("","UPDATE prefix_question_sessions SET newgraded = newest where newgraded = '0'");
+        $success = $success && modify_database("","UPDATE prefix_question_sessions SET newgraded = newest where newgraded = '0'");
 
         // Only perform this if hasn't been performed before (in MOODLE_16_STABLE branch - bug 5717)
         $tables = $db->MetaTables('TABLES');
         if (!in_array($CFG->prefix . 'question_attempts', $tables)) {
             // The following table is discussed in bug 5468
-            modify_database ("", "CREATE TABLE prefix_question_attempts (
+            $success = $success && modify_database ("", "CREATE TABLE prefix_question_attempts (
                                      id SERIAL PRIMARY KEY,
                                      modulename varchar(20) NOT NULL default 'quiz'
                                   );");
-            // create one entry for all the existing quiz attempts
-            modify_database ("", "INSERT INTO prefix_question_attempts (id)
-                                       SELECT uniqueid
-                                       FROM prefix_quiz_attempts;");
         }
     }
 
-    if ($oldversion < 2006051700) { // this block also exec'd by 2006042802 on MOODLE_16_STABLE
+    if ($success && $oldversion < 2006051700) { // this block also exec'd by 2006042802 on MOODLE_16_STABLE
 
         notify("The next set of upgrade operations may report an 
                 error if you are upgrading from v1.6. 
@@ -1241,15 +1247,24 @@ function quiz_upgrade($oldversion) {
         // this block is taken from mysql.php 2005070202
         // add new unique id to prepare the way for lesson module to have its own attempts table
         table_column('quiz_attempts', '', 'uniqueid', 'integer', '10', 'unsigned', '0', 'not null', 'id');
+        // create one entry for all the existing quiz attempts
         // initially we can use the id as the unique id because no other modules use attempts yet.
-        execute_sql("UPDATE {$CFG->prefix}quiz_attempts SET uniqueid = id", false);
+        $success = $success && execute_sql("UPDATE {$CFG->prefix}quiz_attempts SET uniqueid = id");
         // we set $CFG->attemptuniqueid to the next available id
         $record = get_record_sql("SELECT nextval('{$CFG->prefix}quiz_attempts_id_seq')");
-        set_config('attemptuniqueid', empty($record->nextid) ? 1 : $record->nextid);
+        $success = $success && set_config('attemptuniqueid', empty($record->nextid) ? 1 : $record->nextid);
         // the above will be a race condition, see bug 5468
 
         modify_database('','CREATE UNIQUE INDEX prefix_quiz_attempts_uniqueid_uk ON prefix_quiz_attempts (uniqueid);');
 
+        // create one entry for all the existing quiz attempts
+        $success = $success && modify_database ("", "INSERT INTO prefix_question_attempts (id)
+                                   SELECT uniqueid
+                                   FROM prefix_quiz_attempts;");
+    }
+
+    if ($success && $oldversion < 2006042802) {
+
         // Copy the teacher comments from the question_essay_states table to the new
         // question_sessions table.
 
@@ -1268,8 +1283,9 @@ function quiz_upgrade($oldversion) {
 
                 if ($result->isgraded) {
                     // Graded - save comment to the sessions and change state event to QUESTION_EVENTMANUALGRADE
-                    if (!set_field('question_sessions', 'comment', $result->essaycomment, 'attemptid', $result->uniqueid, 'questionid', $result->questionid)) {
+                    if (!($success = $success && set_field('question_sessions', 'comment', $result->essaycomment, 'attemptid', $result->uniqueid, 'questionid', $result->questionid))) {
                         notify("Essay Table Migration: Cannot save comment");
+                        break;
                     }
                     $state->event = 9; //QUESTION_EVENTMANUALGRADE;
                 } else {
@@ -1278,151 +1294,153 @@ function quiz_upgrade($oldversion) {
                 }
 
                 // Save the event
-                if (!update_record('question_states', $state)) {
+                if (!($success = $success && update_record('question_states', $state))) {
                     notify("Essay Table Migration: Cannot update state");
+                    break;
                 }
             }
         }
     
         // dropping unused tables
-        execute_sql('DROP TABLE '.$CFG->prefix.'question_essay_states');
-        execute_sql('DROP TABLE '.$CFG->prefix.'question_essay');
-        execute_sql('DROP TABLE '.$CFG->prefix.'quiz_attemptonlast_datasets');
+        $success = $success && execute_sql('DROP TABLE '.$CFG->prefix.'question_essay_states');
+        $success = $success && execute_sql('DROP TABLE '.$CFG->prefix.'question_essay');
+        $success = $success && execute_sql('DROP TABLE '.$CFG->prefix.'quiz_attemptonlast_datasets');
 
-        modify_database('', 'ALTER TABLE prefix_question
-            ALTER COLUMN qtype SET DEFAULT \'0\',
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question
+            ALTER COLUMN qtype SET DEFAULT \'0\'');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question
             ALTER COLUMN version SET DEFAULT \'\'');
 
         // recreate the indexes that was not moved while quiz was transitioning to question lib
-        notify('Errors on indexes not being able to drop or already exists can be ignored as they may have been properly upgraded previously');
-        modify_database('','DROP INDEX prefix_quiz_numerical_answer_idx');
-        modify_database('','DROP INDEX prefix_quiz_numerical_question_idx');
-        modify_database('','CREATE INDEX prefix_question_numerical_question_idx ON prefix_question_numerical (question)');
-        modify_database('','CREATE INDEX prefix_question_numerical_answer_idx ON prefix_question_numerical (answer)');
-        modify_database('','DROP INDEX prefix_quiz_question_datasets_question_datasetdefinition_idx');
-        modify_database('','CREATE INDEX prefix_question_datasets_question_datasetdefinition_idx ON prefix_question_datasets (question, datasetdefinition)');
+        $success && notify('Errors on indexes not being able to drop or already exists can be ignored as they may have been properly upgraded previously');
+        $success && modify_database('','DROP INDEX prefix_quiz_numerical_answer_idx');
+        $success && modify_database('','DROP INDEX prefix_quiz_numerical_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_numerical_question_idx ON prefix_question_numerical (question)');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_numerical_answer_idx ON prefix_question_numerical (answer)');
+        $success && modify_database('','DROP INDEX prefix_quiz_question_datasets_question_datasetdefinition_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_datasets_question_datasetdefinition_idx ON prefix_question_datasets (question, datasetdefinition)');
 
-        modify_database('','DROP INDEX prefix_quiz_multichoice_question_idx');
-        modify_database('','CREATE INDEX prefix_question_multichoice_question_idx ON prefix_question_multichoice (question)');
+        $success && modify_database('','DROP INDEX prefix_quiz_multichoice_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_multichoice_question_idx ON prefix_question_multichoice (question)');
 
-        modify_database('','DROP INDEX prefix_quiz_categories_course_idx');
-        modify_database('','CREATE INDEX prefix_question_categories_course_idx ON prefix_question_categories (course)');
+        $success && modify_database('','DROP INDEX prefix_quiz_categories_course_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_categories_course_idx ON prefix_question_categories (course)');
 
-        modify_database('','DROP INDEX prefix_quiz_shortanswer_question_idx');
-        modify_database('','CREATE INDEX prefix_question_shortanswer_question_idx ON prefix_question_shortanswer (question)');
+        $success && modify_database('','DROP INDEX prefix_quiz_shortanswer_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_shortanswer_question_idx ON prefix_question_shortanswer (question)');
 
-        modify_database('','DROP INDEX prefix_quiz_questions_category_idx');
-        modify_database('','CREATE INDEX prefix_question_category_idx ON prefix_question (category)');
+        $success && modify_database('','DROP INDEX prefix_quiz_questions_category_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_category_idx ON prefix_question (category)');
 
-        modify_database('','DROP INDEX prefix_quiz_calculated_answer_idx');
-        modify_database('','DROP INDEX prefix_quiz_calculated_question_idx');
-        modify_database('','CREATE INDEX prefix_question_calculated_question_idx ON prefix_question_calculated (question)');
-        modify_database('','CREATE INDEX prefix_question_calculated_answer_idx ON prefix_question_calculated (answer)');
+        $success && modify_database('','DROP INDEX prefix_quiz_calculated_answer_idx');
+        $success && modify_database('','DROP INDEX prefix_quiz_calculated_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_calculated_question_idx ON prefix_question_calculated (question)');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_calculated_answer_idx ON prefix_question_calculated (answer)');
 
-        modify_database('','DROP INDEX prefix_quiz_answers_question_idx');
-        modify_database('','CREATE INDEX prefix_question_answers_question_idx ON prefix_question_answers (question)');
+        $success && modify_database('','DROP INDEX prefix_quiz_answers_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_answers_question_idx ON prefix_question_answers (question)');
 
-        modify_database('','DROP INDEX prefix_quiz_dataset_items_definition_idx');
-        modify_database('','CREATE INDEX prefix_question_dataset_items_definition_idx ON prefix_question_dataset_items (definition)');
+        $success && modify_database('','DROP INDEX prefix_quiz_dataset_items_definition_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_dataset_items_definition_idx ON prefix_question_dataset_items (definition)');
 
-        modify_database('','DROP INDEX prefix_quiz_numerical_units_question_idx');
-        modify_database('','CREATE INDEX prefix_question_numerical_units_question_idx ON prefix_question_numerical_units (question)');
+        $success && modify_database('','DROP INDEX prefix_quiz_numerical_units_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_numerical_units_question_idx ON prefix_question_numerical_units (question)');
 
-        modify_database('','DROP INDEX prefix_quiz_randomsamatch_question_idx');
-        modify_database('','CREATE INDEX prefix_question_randomsamatch_question_idx ON prefix_question_randomsamatch (question)');
+        $success && modify_database('','DROP INDEX prefix_quiz_randomsamatch_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_randomsamatch_question_idx ON prefix_question_randomsamatch (question)');
 
-        modify_database('','DROP INDEX prefix_quiz_states_question_idx');
-        modify_database('','DROP INDEX prefix_quiz_states_attempt_idx');
-        modify_database('','CREATE INDEX prefix_question_states_question_idx ON prefix_question_states (question)');
-        modify_database('','CREATE INDEX prefix_question_states_attempt_idx ON prefix_question_states (attempt)');
+        $success && modify_database('','DROP INDEX prefix_quiz_states_question_idx');
+        $success && modify_database('','DROP INDEX prefix_quiz_states_attempt_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_states_question_idx ON prefix_question_states (question)');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_states_attempt_idx ON prefix_question_states (attempt)');
 
-        modify_database('','DROP INDEX prefix_quiz_match_question_idx');
-        modify_database('','CREATE INDEX prefix_question_match_question_idx ON prefix_question_match (question)');
+        $success && modify_database('','DROP INDEX prefix_quiz_match_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_match_question_idx ON prefix_question_match (question)');
 
-        modify_database('','DROP INDEX prefix_quiz_match_sub_question_idx');
-        modify_database('','CREATE INDEX prefix_question_match_sub_question_idx ON prefix_question_match_sub (question)');
+        $success && modify_database('','DROP INDEX prefix_quiz_match_sub_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_match_sub_question_idx ON prefix_question_match_sub (question)');
 
-        modify_database('','DROP INDEX prefix_quiz_multianswers_question_idx');
-        modify_database('','CREATE INDEX prefix_question_multianswer_question_idx ON prefix_question_multianswer (question)');
+        $success && modify_database('','DROP INDEX prefix_quiz_multianswers_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_multianswer_question_idx ON prefix_question_multianswer (question)');
 
-        modify_database('','DROP INDEX prefix_quiz_dataset_definitions_category_idx');
-        modify_database('','CREATE INDEX prefix_question_dataset_definitions_category_idx ON prefix_question_dataset_definitions (category)');
+        $success && modify_database('','DROP INDEX prefix_quiz_dataset_definitions_category_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_dataset_definitions_category_idx ON prefix_question_dataset_definitions (category)');
 
-        modify_database('','CREATE INDEX prefix_log_timecoursemoduleaction_idx ON prefix_log ("time", course, module, "action")');
-        modify_database('','CREATE INDEX prefix_log_coursemoduleaction_idx ON prefix_log (course, module, "action")');
+        $success = $success && modify_database('','CREATE INDEX prefix_log_timecoursemoduleaction_idx ON prefix_log ("time", course, module, "action")');
+        $success = $success && modify_database('','CREATE INDEX prefix_log_coursemoduleaction_idx ON prefix_log (course, module, "action")');
 
-        modify_database('','DROP INDEX prefix_quiz_rqp_question_idx');
-        modify_database('','CREATE INDEX prefix_question_rqp_question_idx ON prefix_question_rqp (question)');
+        $success && modify_database('','DROP INDEX prefix_quiz_rqp_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_rqp_question_idx ON prefix_question_rqp (question)');
 
-        modify_database('','DROP INDEX prefix_quiz_truefalse_question_idx');
-        modify_database('','CREATE INDEX prefix_question_truefalse_question_idx ON prefix_question_truefalse (question)');
-        notify('End of upgrading of indexes');
+        $success && modify_database('','DROP INDEX prefix_quiz_truefalse_question_idx');
+        $success = $success && modify_database('','CREATE INDEX prefix_question_truefalse_question_idx ON prefix_question_truefalse (question)');
+        $success && notify('End of upgrading of indexes');
 
 
-        notify('Renaming primary key names');
-        modify_database('', 'ALTER TABLE prefix_question_numerical DROP CONSTRAINT prefix_quiz_numerical_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_numerical ADD CONSTRAINT prefix_question_numerical_pkey PRIMARY KEY (id)');
+        $success && notify('Renaming primary key names');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_numerical DROP CONSTRAINT prefix_quiz_numerical_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_numerical ADD CONSTRAINT prefix_question_numerical_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_datasets DROP CONSTRAINT prefix_quiz_question_datasets_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_datasets ADD CONSTRAINT prefix_question_datasets_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_datasets DROP CONSTRAINT prefix_quiz_question_datasets_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_datasets ADD CONSTRAINT prefix_question_datasets_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_multichoice DROP CONSTRAINT prefix_quiz_multichoice_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_multichoice ADD CONSTRAINT prefix_question_multichoice_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_multichoice DROP CONSTRAINT prefix_quiz_multichoice_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_multichoice ADD CONSTRAINT prefix_question_multichoice_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_rqp_states DROP CONSTRAINT prefix_quiz_rqp_states_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_rqp_states ADD CONSTRAINT prefix_question_rqp_states_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_rqp_states DROP CONSTRAINT prefix_quiz_rqp_states_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_rqp_states ADD CONSTRAINT prefix_question_rqp_states_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_categories DROP CONSTRAINT prefix_quiz_categories_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_categories ADD CONSTRAINT prefix_question_categories_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_categories DROP CONSTRAINT prefix_quiz_categories_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_categories ADD CONSTRAINT prefix_question_categories_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_shortanswer DROP CONSTRAINT prefix_quiz_shortanswer_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_shortanswer ADD CONSTRAINT prefix_question_shortanswer_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_shortanswer DROP CONSTRAINT prefix_quiz_shortanswer_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_shortanswer ADD CONSTRAINT prefix_question_shortanswer_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question DROP CONSTRAINT prefix_quiz_questions_pkey');
-        modify_database('', 'ALTER TABLE prefix_question ADD CONSTRAINT prefix_question_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question DROP CONSTRAINT prefix_quiz_questions_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question ADD CONSTRAINT prefix_question_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_sessions DROP CONSTRAINT prefix_quiz_newest_states_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_sessions ADD CONSTRAINT prefix_question_sessions_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_sessions DROP CONSTRAINT prefix_quiz_newest_states_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_sessions ADD CONSTRAINT prefix_question_sessions_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_calculated DROP CONSTRAINT prefix_quiz_calculated_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_calculated ADD CONSTRAINT prefix_question_calculated_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_calculated DROP CONSTRAINT prefix_quiz_calculated_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_calculated ADD CONSTRAINT prefix_question_calculated_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_answers DROP CONSTRAINT prefix_quiz_answers_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_answers ADD CONSTRAINT prefix_question_answers_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_answers DROP CONSTRAINT prefix_quiz_answers_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_answers ADD CONSTRAINT prefix_question_answers_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_dataset_items DROP CONSTRAINT prefix_quiz_dataset_items_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_dataset_items ADD CONSTRAINT prefix_question_dataset_items_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_dataset_items DROP CONSTRAINT prefix_quiz_dataset_items_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_dataset_items ADD CONSTRAINT prefix_question_dataset_items_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_numerical_units DROP CONSTRAINT prefix_quiz_numerical_units_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_numerical_units ADD CONSTRAINT prefix_question_numerical_units_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_numerical_units DROP CONSTRAINT prefix_quiz_numerical_units_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_numerical_units ADD CONSTRAINT prefix_question_numerical_units_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_randomsamatch DROP CONSTRAINT prefix_quiz_randomsamatch_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_randomsamatch ADD CONSTRAINT prefix_question_randomsamatch_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_randomsamatch DROP CONSTRAINT prefix_quiz_randomsamatch_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_randomsamatch ADD CONSTRAINT prefix_question_randomsamatch_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_rqp_types DROP CONSTRAINT prefix_quiz_rqp_types_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_rqp_types ADD CONSTRAINT prefix_question_rqp_types_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_rqp_types DROP CONSTRAINT prefix_quiz_rqp_types_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_rqp_types ADD CONSTRAINT prefix_question_rqp_types_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_states DROP CONSTRAINT prefix_quiz_states_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_states ADD CONSTRAINT prefix_question_states_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_states DROP CONSTRAINT prefix_quiz_states_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_states ADD CONSTRAINT prefix_question_states_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_match DROP CONSTRAINT prefix_quiz_match_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_match ADD CONSTRAINT prefix_question_match_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_match DROP CONSTRAINT prefix_quiz_match_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_match ADD CONSTRAINT prefix_question_match_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_match_sub DROP CONSTRAINT prefix_quiz_match_sub_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_match_sub ADD CONSTRAINT prefix_question_match_sub_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_match_sub DROP CONSTRAINT prefix_quiz_match_sub_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_match_sub ADD CONSTRAINT prefix_question_match_sub_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_multianswer DROP CONSTRAINT prefix_quiz_multianswers_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_multianswer ADD CONSTRAINT prefix_question_multianswer_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_multianswer DROP CONSTRAINT prefix_quiz_multianswers_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_multianswer ADD CONSTRAINT prefix_question_multianswer_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_dataset_definitions DROP CONSTRAINT prefix_quiz_dataset_definitions_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_dataset_definitions ADD CONSTRAINT prefix_question_dataset_definitions_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_dataset_definitions DROP CONSTRAINT prefix_quiz_dataset_definitions_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_dataset_definitions ADD CONSTRAINT prefix_question_dataset_definitions_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_rqp DROP CONSTRAINT prefix_quiz_rqp_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_rqp ADD CONSTRAINT prefix_question_rqp_pkey PRIMARY KEY (id)');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_rqp DROP CONSTRAINT prefix_quiz_rqp_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_rqp ADD CONSTRAINT prefix_question_rqp_pkey PRIMARY KEY (id)');
 
-        modify_database('', 'ALTER TABLE prefix_question_truefalse DROP CONSTRAINT prefix_quiz_truefalse_pkey');
-        modify_database('', 'ALTER TABLE prefix_question_truefalse ADD CONSTRAINT prefix_question_truefalse_pkey PRIMARY KEY (id)');
-        notify('End of renaming primary keys');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_truefalse DROP CONSTRAINT prefix_quiz_truefalse_pkey');
+        $success = $success && modify_database('', 'ALTER TABLE prefix_question_truefalse ADD CONSTRAINT prefix_question_truefalse_pkey PRIMARY KEY (id)');
+        $success && notify('End of renaming primary keys');
 
     }