From: skodak Date: Fri, 13 Jun 2008 17:51:34 +0000 (+0000) Subject: MDL-14956 basic exception support in Moodle + other minor related refactoring X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=251387d087b50925e29df27426a795a74c0028c4;p=moodle.git MDL-14956 basic exception support in Moodle + other minor related refactoring --- diff --git a/install.php b/install.php index eb3413a0a0..ce69050fa1 100644 --- a/install.php +++ b/install.php @@ -145,12 +145,12 @@ $COURSE->id = 0; /// Include some moodle libraries -require_once($CFG->libdir.'/adminlib.php'); require_once($CFG->libdir.'/setuplib.php'); -require_once($CFG->libdir.'/moodlelib.php'); require_once($CFG->libdir.'/weblib.php'); -require_once($CFG->libdir.'/deprecatedlib.php'); require_once($CFG->libdir.'/dmllib.php'); +require_once($CFG->libdir.'/deprecatedlib.php'); +require_once($CFG->libdir.'/moodlelib.php'); +require_once($CFG->libdir.'/adminlib.php'); require_once($CFG->libdir.'/environmentlib.php'); require_once($CFG->libdir.'/xmlize.php'); require_once($CFG->libdir.'/componentlib.class.php'); diff --git a/lang/en_utf8/error.php b/lang/en_utf8/error.php index 4a6b3e03b8..4ec18d45d8 100644 --- a/lang/en_utf8/error.php +++ b/lang/en_utf8/error.php @@ -180,6 +180,7 @@ $string['filemismatch'] = 'Non-core filename mismatch. The file \"$a[0]\" should $string['filternotinstalled'] = 'Filter $a is not currently installed'; $string['filternotactive'] = 'Filter $a is not currently active'; $string['forumblockingtoomanyposts'] = 'You have exceeded the posting threshold set for this forum.'; +$string['generalexceptionmessage'] = 'Exception - $a'; $string['gradepubdisable'] = 'Grade publishing disabled'; $string['groupalready'] = 'User already belongs to group $a'; $string['groupexistforcourse'] = 'Group \"$a\" already exists for this course'; @@ -282,6 +283,7 @@ $string['noinstances'] = 'There are no instances of $a in this course!'; $string['noguest'] = 'No guests here!'; $string['nologinas'] = 'You are not allowed to login as that user'; $string['noadmins'] = 'No administrators!'; +$string['notlocalisederrormessage'] = '$a'; $string['nousers'] = 'No such user!'; $string['nonmeaningfulcontent'] = 'Non meaningful content'; $string['noparticipatorycms'] = 'Sorry, but you have no participatory course modules to report on.'; diff --git a/lib/ddl/simpletest/testddllib.php b/lib/ddl/simpletest/testddllib.php index f56f21077b..65035f72ba 100755 --- a/lib/ddl/simpletest/testddllib.php +++ b/lib/ddl/simpletest/testddllib.php @@ -13,20 +13,20 @@ require_once($CFG->libdir . '/ddllib.php'); class ddllib_test extends UnitTestCase { private $tables = array(); - private $db; + private $tdb; public function setUp() { global $CFG, $DB, $UNITTEST; if (isset($UNITTEST->func_test_db)) { - $this->db = $UNITTEST->func_test_db; + $this->tdb = $UNITTEST->func_test_db; } else { - $this->db = $DB; + $this->tdb = $DB; } unset($CFG->xmldbreconstructprevnext); // remove this unhack ;-) - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = new xmldb_table('test_table0'); $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null); @@ -78,26 +78,26 @@ class ddllib_test extends UnitTestCase { } public function tearDown() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); // drop custom test tables for ($i=0; $i<3; $i++) { $table = new xmldb_table('test_table_cust'.$i); - if ($dbmanager->table_exists($table)) { - $dbmanager->drop_table($table, true, false); + if ($dbman->table_exists($table)) { + $dbman->drop_table($table, true, false); } } // drop default tables foreach ($this->tables as $table) { - if ($dbmanager->table_exists($table)) { - $dbmanager->drop_table($table, true, false); + if ($dbman->table_exists($table)) { + $dbman->drop_table($table, true, false); } } } private function create_deftable($tablename) { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); if (!isset($this->tables[$tablename])) { return null; @@ -105,17 +105,17 @@ class ddllib_test extends UnitTestCase { $table = $this->tables[$tablename]; - if ($dbmanager->table_exists($table)) { - $dbmanager->drop_table($table, true, false); + if ($dbman->table_exists($table)) { + $dbman->drop_table($table, true, false); } - $dbmanager->create_table($table, true, false); + $dbman->create_table($table, true, false); return $table; } public function testTableExists() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); // first make sure it returns false if table does not exist $table = $this->tables['test_table0']; @@ -124,36 +124,36 @@ class ddllib_test extends UnitTestCase { ob_end_clean(); $this->assertFalse($result); - $this->assertFalse($dbmanager->table_exists('test_table0')); - $this->assertFalse($dbmanager->table_exists($table)); + $this->assertFalse($dbman->table_exists('test_table0')); + $this->assertFalse($dbman->table_exists($table)); // create table and test again - $this->assertTrue($dbmanager->create_table($table, true, false)); + $this->assertTrue($dbman->create_table($table, true, false)); $this->assertTrue($DB->get_records('test_table0') !== false); - $this->assertTrue($dbmanager->table_exists('test_table0')); - $this->assertTrue($dbmanager->table_exists($table)); + $this->assertTrue($dbman->table_exists('test_table0')); + $this->assertTrue($dbman->table_exists($table)); // Test giving a string - $this->assertFalse($dbmanager->table_exists('nonexistenttable')); - $this->assertTrue($dbmanager->table_exists('test_table0')); + $this->assertFalse($dbman->table_exists('nonexistenttable')); + $this->assertTrue($dbman->table_exists('test_table0')); } public function testCreateTable() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); // Give a wrong table param (expect a debugging message) $table = 'string'; ob_start(); // hide debug warning - $result = $dbmanager->create_table($table); + $result = $dbman->create_table($table); ob_end_clean(); $this->assertFalse($result); // create table and do basic column tests $table = $this->tables['test_table1']; - $this->assertTrue($dbmanager->create_table($table)); - $this->assertTrue($dbmanager->table_exists($table)); + $this->assertTrue($dbman->create_table($table)); + $this->assertTrue($dbman->table_exists($table)); $columns = $DB->get_columns('test_table1'); @@ -168,51 +168,51 @@ class ddllib_test extends UnitTestCase { } public function testDropTable() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table0'); - $this->assertTrue($dbmanager->drop_table($table, true, false)); - $this->assertFalse($dbmanager->table_exists('test_table0')); + $this->assertTrue($dbman->drop_table($table, true, false)); + $this->assertFalse($dbman->table_exists('test_table0')); // Try dropping non-existent table $table = new xmldb_table('nonexistenttable'); ob_start(); // hide debug warning - $result = $dbmanager->drop_table($table, true, false); + $result = $dbman->drop_table($table, true, false); ob_end_clean(); $this->assertTrue($result); // Give a wrong table param $table = 'string'; ob_start(); // hide debug warning - $result = $dbmanager->drop_table($table, true, false); + $result = $dbman->drop_table($table, true, false); ob_end_clean(); $this->assertFalse($result); } public function testAddEnumField() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); $table = new xmldb_table('test_table_cust0'); $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null); $table->add_field('course', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0'); $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); - $dbmanager->create_table($table, true, false); + $dbman->create_table($table, true, false); $enums = array('single', 'news', 'general'); /// Create a new field with complex specs (enums are good candidates) $field = new xmldb_field('type1'); $field->set_attributes(XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, XMLDB_ENUM, $enums, 'general', 'course'); - $this->assertTrue($dbmanager->add_field($table, $field)); - $this->assertTrue($dbmanager->field_exists($table, 'type1')); + $this->assertTrue($dbman->add_field($table, $field)); + $this->assertTrue($dbman->field_exists($table, 'type1')); $field = new xmldb_field('type2'); $field->set_attributes(XMLDB_TYPE_CHAR, '20', null, null, null, XMLDB_ENUM, $enums, 'general', 'course'); - $this->assertTrue($dbmanager->add_field($table, $field)); - $this->assertTrue($dbmanager->field_exists($table, 'type2')); + $this->assertTrue($dbman->add_field($table, $field)); + $this->assertTrue($dbman->field_exists($table, 'type2')); /// try inserting a good record $record = new object(); @@ -251,50 +251,50 @@ class ddllib_test extends UnitTestCase { } /// cleanup - $dbmanager->drop_field($table, $field); - $dbmanager->drop_table($table); + $dbman->drop_field($table, $field); + $dbman->drop_table($table); } public function testAddNumericField() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table0'); /// Create a new field with complex specs (enums are good candidates) $field = new xmldb_field('onenumber'); $field->set_attributes(XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, 0, 'type'); - $this->assertTrue($dbmanager->add_field($table, $field)); - $this->assertTrue($dbmanager->field_exists($table, 'onenumber')); + $this->assertTrue($dbman->add_field($table, $field)); + $this->assertTrue($dbman->field_exists($table, 'onenumber')); $columns = $DB->get_columns('test_table0'); $this->assertEqual($columns['onenumber']->meta_type, 'I'); - $dbmanager->drop_field($table, $field); + $dbman->drop_field($table, $field); } public function testDropField() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table0'); $field = $table->getField('type'); - $this->assertTrue($dbmanager->field_exists($table, $field)); - $this->assertTrue($dbmanager->field_exists($table, 'type')); + $this->assertTrue($dbman->field_exists($table, $field)); + $this->assertTrue($dbman->field_exists($table, 'type')); - $this->assertTrue($dbmanager->drop_field($table, $field)); + $this->assertTrue($dbman->drop_field($table, $field)); - $this->assertFalse($dbmanager->field_exists($table, 'type')); + $this->assertFalse($dbman->field_exists($table, 'type')); } public function testChangeFieldType() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); $table = new xmldb_table('test_table_cust0'); $table->add_field('id', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null); $table->add_field('onenumber', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0'); $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); - $dbmanager->create_table($table, true, false); + $dbman->create_table($table, true, false); $record = new object(); $recorf->course = 2; @@ -302,95 +302,95 @@ class ddllib_test extends UnitTestCase { $field = new xmldb_field('onenumber'); $field->set_attributes(XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, null, null, '0'); - $this->assertTrue($dbmanager->change_field_type($table, $field)); + $this->assertTrue($dbman->change_field_type($table, $field)); $columns = $DB->get_columns('test_table_cust0'); $this->assertEqual($columns['onenumber']->meta_type, 'C'); $field = new xmldb_field('onenumber'); $field->set_attributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0'); - $this->assertTrue($dbmanager->change_field_type($table, $field)); + $this->assertTrue($dbman->change_field_type($table, $field)); $columns = $DB->get_columns('test_table_cust0'); $this->assertEqual($columns['onenumber']->meta_type, 'I'); $field = new xmldb_field('onenumber'); $field->set_attributes(XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, null, "test'n drop"); - $this->assertTrue($dbmanager->change_field_type($table, $field)); + $this->assertTrue($dbman->change_field_type($table, $field)); $columns = $DB->get_columns('test_table_cust0'); $this->assertEqual($columns['onenumber']->meta_type, 'C'); $field = new xmldb_field('onenumber'); $field->set_attributes(XMLDB_TYPE_FLOAT, '20,10', XMLDB_UNSIGNED, null, null, null, null, null); - $this->assertTrue($dbmanager->change_field_type($table, $field)); + $this->assertTrue($dbman->change_field_type($table, $field)); $columns = $DB->get_columns('test_table_cust0'); $this->assertEqual($columns['onenumber']->meta_type, 'N'); $field = new xmldb_field('onenumber'); $field->set_attributes(XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, null, 'test'); - $this->assertTrue($dbmanager->change_field_type($table, $field)); + $this->assertTrue($dbman->change_field_type($table, $field)); $columns = $DB->get_columns('test_table_cust0'); $this->assertEqual($columns['onenumber']->meta_type, 'C'); $field = new xmldb_field('onenumber'); $field->set_attributes(XMLDB_TYPE_NUMBER, '20,10', XMLDB_UNSIGNED, null, null, null, null, null); - $this->assertTrue($dbmanager->change_field_type($table, $field)); + $this->assertTrue($dbman->change_field_type($table, $field)); $columns = $DB->get_columns('test_table_cust0'); $this->assertEqual($columns['onenumber']->meta_type, 'N'); - $dbmanager->drop_table($table, true, false); + $dbman->drop_table($table, true, false); } public function testChangeFieldPrecision() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); // TODO: verify the precision is changed in db $table = $this->create_deftable('test_table1'); $field = new xmldb_field('intro'); $field->set_attributes(XMLDB_TYPE_TEXT, 'big', null, XMLDB_NOTNULL, null, null, null, null); - $this->assertTrue($dbmanager->change_field_precision($table, $field)); + $this->assertTrue($dbman->change_field_precision($table, $field)); $field = new xmldb_field('secondname'); $field->set_attributes(XMLDB_TYPE_CHAR, '10', null, XMLDB_NOTNULL, null, null, null, null); - $this->assertTrue($dbmanager->change_field_precision($table, $field)); + $this->assertTrue($dbman->change_field_precision($table, $field)); $field = new xmldb_field('grade'); $field->set_attributes(XMLDB_TYPE_NUMBER, '10,2', null, null, null, null, null, null); - $this->assertTrue($dbmanager->change_field_precision($table, $field)); + $this->assertTrue($dbman->change_field_precision($table, $field)); $field = new xmldb_field('course'); $field->set_attributes(XMLDB_TYPE_INTEGER, '5', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0'); - $this->assertTrue($dbmanager->change_field_precision($table, $field)); + $this->assertTrue($dbman->change_field_precision($table, $field)); } public function testChangeFieldSign() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); // TODO: verify the signed is changed in db $table = $this->create_deftable('test_table1'); $field = new xmldb_field('grade'); $field->set_attributes(XMLDB_TYPE_NUMBER, '10,2', XMLDB_UNSIGNED, null, null, null, null, null); - $this->assertTrue($dbmanager->change_field_unsigned($table, $field)); + $this->assertTrue($dbman->change_field_unsigned($table, $field)); $field = new xmldb_field('grade'); $field->set_attributes(XMLDB_TYPE_NUMBER, '10,2', null, null, null, null, null, null); - $this->assertTrue($dbmanager->change_field_unsigned($table, $field)); + $this->assertTrue($dbman->change_field_unsigned($table, $field)); } public function testChangeFieldNullability() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); $table = new xmldb_table('test_table_cust0'); $table->add_field('id', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null); $table->add_field('name', XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, null, null, null); $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); - $dbmanager->create_table($table, true, false); + $dbman->create_table($table, true, false); $record = new object(); $record->name = NULL; @@ -402,7 +402,7 @@ class ddllib_test extends UnitTestCase { $field = new xmldb_field('name'); $field->set_attributes(XMLDB_TYPE_CHAR, '30', null, null, null, null, null, null); - $this->assertTrue($dbmanager->change_field_notnull($table, $field)); + $this->assertTrue($dbman->change_field_notnull($table, $field)); $this->assertTrue($DB->insert_record('test_table_cust0', $record, false)); @@ -411,30 +411,30 @@ class ddllib_test extends UnitTestCase { $field = new xmldb_field('name'); $field->set_attributes(XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, null, null, null); - $this->assertTrue($dbmanager->change_field_notnull($table, $field)); + $this->assertTrue($dbman->change_field_notnull($table, $field)); ob_start(); // hide debug warning $result = $DB->insert_record('test_table_cust0', $record, false); ob_end_clean(); $this->assertFalse($result); - $dbmanager->drop_table($table, true, false); + $dbman->drop_table($table, true, false); } public function testChangeFieldDefault() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); $table = new xmldb_table('test_table_cust0'); $table->add_field('id', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null); $table->add_field('number', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0'); $table->add_field('name', XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, null, null, 'Moodle'); $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); - $dbmanager->create_table($table, true, false); + $dbman->create_table($table, true, false); $field = new xmldb_field('name'); $field->set_attributes(XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, null, null, 'Moodle2'); - $this->assertTrue($dbmanager->change_field_default($table, $field)); + $this->assertTrue($dbman->change_field_default($table, $field)); $record = new object(); $record->number = 666; @@ -446,7 +446,7 @@ class ddllib_test extends UnitTestCase { $field = new xmldb_field('number'); $field->set_attributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, 666); - $this->assertTrue($dbmanager->change_field_default($table, $field)); + $this->assertTrue($dbman->change_field_default($table, $field)); $record = new object(); $record->name = 'something'; @@ -455,19 +455,19 @@ class ddllib_test extends UnitTestCase { $record = $DB->get_record('test_table_cust0', array('id'=>$id)); $this->assertEqual($record->number, '666'); - $dbmanager->drop_table($table, true, false); + $dbman->drop_table($table, true, false); } public function testAddUniqueIndex() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); $table = new xmldb_table('test_table_cust0'); $table->add_field('id', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null); $table->add_field('number', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0'); $table->add_field('name', XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, null, null, 'Moodle'); $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); - $dbmanager->create_table($table, true, false); + $dbman->create_table($table, true, false); $record = new object(); $record->number = 666; @@ -476,126 +476,126 @@ class ddllib_test extends UnitTestCase { $index = new xmldb_index('number-name'); $index->set_attributes(XMLDB_INDEX_UNIQUE, array('number', 'name')); - $this->assertTrue($dbmanager->add_index($table, $index)); + $this->assertTrue($dbman->add_index($table, $index)); ob_start(); // hide debug warning $result = $DB->insert_record('test_table_cust0', $record, false); ob_end_clean(); $this->assertFalse($result); - $dbmanager->drop_table($table, true, false); + $dbman->drop_table($table, true, false); } public function testAddNonUniqueIndex() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table1'); $index = new xmldb_index('secondname'); $index->set_attributes(XMLDB_INDEX_NOTUNIQUE, array('course', 'name')); - $this->assertTrue($dbmanager->add_index($table, $index)); + $this->assertTrue($dbman->add_index($table, $index)); } public function testFindIndexName() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table1'); $index = new xmldb_index('secondname'); $index->set_attributes(XMLDB_INDEX_NOTUNIQUE, array('course', 'name')); - $dbmanager->add_index($table, $index); + $dbman->add_index($table, $index); //DBM Systems name their indices differently - do not test the actual index name - $result = $dbmanager->find_index_name($table, $index); + $result = $dbman->find_index_name($table, $index); $this->assertTrue(!empty($result)); $nonexistentindex = new xmldb_index('nonexistentindex'); $nonexistentindex->set_attributes(XMLDB_INDEX_NOTUNIQUE, array('name')); - $this->assertFalse($dbmanager->find_index_name($table, $nonexistentindex)); + $this->assertFalse($dbman->find_index_name($table, $nonexistentindex)); } public function testDropIndex() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table1'); $index = new xmldb_index('secondname'); $index->set_attributes(XMLDB_INDEX_NOTUNIQUE, array('course', 'name')); - $dbmanager->add_index($table, $index); + $dbman->add_index($table, $index); - $this->assertTrue($dbmanager->drop_index($table, $index)); - $this->assertFalse($dbmanager->find_index_name($table, $index)); + $this->assertTrue($dbman->drop_index($table, $index)); + $this->assertFalse($dbman->find_index_name($table, $index)); } public function testAddUniqueKey() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table1'); $key = new xmldb_key('id-course-grade'); $key->set_attributes(XMLDB_KEY_UNIQUE, array('id', 'course', 'grade')); - $this->assertTrue($dbmanager->add_key($table, $key)); + $this->assertTrue($dbman->add_key($table, $key)); } public function testAddForeignUniqueKey() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table1'); $this->create_deftable('test_table0'); $key = new xmldb_key('course'); $key->set_attributes(XMLDB_KEY_FOREIGN_UNIQUE, array('course'), 'test_table0', array('id')); - $this->assertTrue($dbmanager->add_key($table, $key)); + $this->assertTrue($dbman->add_key($table, $key)); } public function testDropKey() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table1'); $this->create_deftable('test_table0'); $key = new xmldb_key('course'); $key->set_attributes(XMLDB_KEY_FOREIGN_UNIQUE, array('course'), 'test_table0', array('id')); - $dbmanager->add_key($table, $key); + $dbman->add_key($table, $key); - $this->assertTrue($dbmanager->drop_key($table, $key)); + $this->assertTrue($dbman->drop_key($table, $key)); } public function testAddForeignKey() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table1'); $this->create_deftable('test_table0'); $key = new xmldb_key('course'); $key->set_attributes(XMLDB_KEY_FOREIGN, array('course'), 'test_table0', array('id')); - $this->assertTrue($dbmanager->add_key($table, $key)); + $this->assertTrue($dbman->add_key($table, $key)); } public function testDropForeignKey() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table1'); $this->create_deftable('test_table0'); $key = new xmldb_key('course'); $key->set_attributes(XMLDB_KEY_FOREIGN, array('course'), 'test_table0', array('id')); - $dbmanager->add_key($table, $key); + $dbman->add_key($table, $key); - $this->assertTrue($dbmanager->drop_key($table, $key)); + $this->assertTrue($dbman->drop_key($table, $key)); } public function testChangeFieldEnum() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); $table = new xmldb_table('test_table_cust0'); $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null); $table->add_field('course', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0'); $table->add_field('type', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, XMLDB_ENUM, array('single', 'news', 'general'), 'general'); $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); - $dbmanager->create_table($table, true, false); + $dbman->create_table($table, true, false); // Removing an enum value $field = new xmldb_field('type'); $field->set_attributes(XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, null); - $this->assertTrue($dbmanager->change_field_enum($table, $field)); + $this->assertTrue($dbman->change_field_enum($table, $field)); $record = new object(); $record->course = 666; @@ -605,7 +605,7 @@ class ddllib_test extends UnitTestCase { // Adding an enum value $field = new xmldb_field('type'); $field->set_attributes(XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, XMLDB_ENUM, array('single', 'news', 'general', 'social', 'eachuser', 'teacher', 'qanda'), 'general', 'course'); - $this->assertTrue($dbmanager->change_field_enum($table, $field)); + $this->assertTrue($dbman->change_field_enum($table, $field)); $record = new object(); $record->course = 666; @@ -616,19 +616,19 @@ class ddllib_test extends UnitTestCase { ob_end_clean(); $this->assertFalse($result); - $dbmanager->drop_table($table, true, false); + $dbman->drop_table($table, true, false); } public function testRenameField() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table0'); $field = new xmldb_field('type'); $field->set_attributes(XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, XMLDB_ENUM, array('single', 'news', 'general', 'social', 'eachuser', 'teacher', 'qanda'), 'general', 'course'); - $this->assertTrue($dbmanager->rename_field($table, $field, 'newfieldname')); + $this->assertTrue($dbman->rename_field($table, $field, 'newfieldname')); $columns = $DB->get_columns('test_table0'); @@ -637,45 +637,45 @@ class ddllib_test extends UnitTestCase { } public function testRenameTable() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table0'); - $this->assertFalse($dbmanager->table_exists('test_table_cust0')); - $this->assertTrue($dbmanager->rename_table($table, 'test_table_cust0')); - $this->assertTrue($dbmanager->table_exists('test_table_cust0')); + $this->assertFalse($dbman->table_exists('test_table_cust0')); + $this->assertTrue($dbman->rename_table($table, 'test_table_cust0')); + $this->assertTrue($dbman->table_exists('test_table_cust0')); $table->setName('test_table_cust0'); - $dbmanager->drop_table($table); + $dbman->drop_table($table); } public function testFieldExists() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table0'); // String params // Give a nonexistent table as first param - $this->assertFalse($dbmanager->field_exists('nonexistenttable', 'id')); + $this->assertFalse($dbman->field_exists('nonexistenttable', 'id')); // Give a nonexistent field as second param - $this->assertFalse($dbmanager->field_exists('test_table0', 'nonexistentfield')); + $this->assertFalse($dbman->field_exists('test_table0', 'nonexistentfield')); // Correct string params - $this->assertTrue($dbmanager->field_exists('test_table0', 'id')); + $this->assertTrue($dbman->field_exists('test_table0', 'id')); // Object params $realfield = $table->getField('id'); // Give a nonexistent table as first param $nonexistenttable = new xmldb_table('nonexistenttable'); - $this->assertFalse($dbmanager->field_exists($nonexistenttable, $realfield)); + $this->assertFalse($dbman->field_exists($nonexistenttable, $realfield)); // Give a nonexistent field as second param $nonexistentfield = new xmldb_field('nonexistentfield'); - $this->assertFalse($dbmanager->field_exists($table, $nonexistentfield)); + $this->assertFalse($dbman->field_exists($table, $nonexistentfield)); // Correct string params - $this->assertTrue($dbmanager->field_exists($table, $realfield)); + $this->assertTrue($dbman->field_exists($table, $realfield)); } public function testIndexExists() { @@ -683,135 +683,135 @@ class ddllib_test extends UnitTestCase { } public function testFindCheckConstraintName() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table0'); $field = $table->getField('type'); - $result = $dbmanager->find_check_constraint_name($table, $field); + $result = $dbman->find_check_constraint_name($table, $field); $this->assertTrue(!empty($result)); } public function testCheckConstraintExists() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table0'); $field = $table->getField('type'); - $this->assertTrue($dbmanager->check_constraint_exists($table, $field), 'type'); + $this->assertTrue($dbman->check_constraint_exists($table, $field), 'type'); } public function testFindKeyName() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table0'); $key = $table->getKey('primary'); $invalid_key = 'invalid_key'; ob_start(); // hide debug warning - $result = $dbmanager->find_key_name($table, $invalid_key); + $result = $dbman->find_key_name($table, $invalid_key); ob_end_clean(); $this->assertFalse($result); // With Mysql, the return value is actually "mdl_test_id_pk" - $result = $dbmanager->find_key_name($table, $key); + $result = $dbman->find_key_name($table, $key); $this->assertTrue(!empty($result)); } public function testFindSequenceName() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); // give invalid table param $table = 'invalid_table'; ob_start(); // hide debug warning - $result = $dbmanager->find_sequence_name($table); + $result = $dbman->find_sequence_name($table); ob_end_clean(); $this->assertFalse($result); // give nonexistent table param $table = new xmldb_table("nonexistenttable"); ob_start(); // hide debug warning - $result = $dbmanager->find_sequence_name($table); + $result = $dbman->find_sequence_name($table); ob_end_clean(); $this->assertFalse($result); // Give existing and valid table param $table = $this->create_deftable('test_table0'); //TODO: this returns stuff depending on db internals - // $this->assertEqual(false, $dbmanager->find_sequence_name($table)); + // $this->assertEqual(false, $dbman->find_sequence_name($table)); } public function testDeleteTablesFromXmldbFile() { global $CFG; - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $this->create_deftable('test_table1'); - $this->assertTrue($dbmanager->table_exists('test_table1')); + $this->assertTrue($dbman->table_exists('test_table1')); // feed nonexistent file ob_start(); // hide debug warning - $result = $dbmanager->delete_tables_from_xmldb_file('fpsoiudfposui', false); + $result = $dbman->delete_tables_from_xmldb_file('fpsoiudfposui', false); ob_end_clean(); $this->assertFalse($result); // Real file but invalid xml file ob_start(); // hide debug warning - $result = $dbmanager->delete_tables_from_xmldb_file($CFG->libdir . '/ddl/simpletest/fixtures/invalid.xml', false); + $result = $dbman->delete_tables_from_xmldb_file($CFG->libdir . '/ddl/simpletest/fixtures/invalid.xml', false); ob_end_clean(); $this->assertFalse($result); // Check that the table has not been deleted from DB - $this->assertTrue($dbmanager->table_exists('test_table1')); + $this->assertTrue($dbman->table_exists('test_table1')); // Real and valid xml file - $this->assertTrue($dbmanager->delete_tables_from_xmldb_file($CFG->libdir . '/ddl/simpletest/fixtures/xmldb_table.xml', false)); + $this->assertTrue($dbman->delete_tables_from_xmldb_file($CFG->libdir . '/ddl/simpletest/fixtures/xmldb_table.xml', false)); // Check that the table has been deleted from DB - $this->assertFalse($dbmanager->table_exists('test_table1')); + $this->assertFalse($dbman->table_exists('test_table1')); } public function testInstallFromXmldbFile() { global $CFG; - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); // feed nonexistent file ob_start(); // hide debug warning - $result = $dbmanager->install_from_xmldb_file('fpsoiudfposui', false); + $result = $dbman->install_from_xmldb_file('fpsoiudfposui', false); ob_end_clean(); $this->assertFalse($result); // Real but invalid xml file ob_start(); // hide debug warning - $result = $dbmanager->install_from_xmldb_file($CFG->libdir.'/ddl/simpletest/fixtures/invalid.xml', false); + $result = $dbman->install_from_xmldb_file($CFG->libdir.'/ddl/simpletest/fixtures/invalid.xml', false); ob_end_clean(); $this->assertFalse($result); // Check that the table has not yet been created in DB - $this->assertFalse($dbmanager->table_exists('test_table1')); + $this->assertFalse($dbman->table_exists('test_table1')); // Real and valid xml file - $this->assertTrue($dbmanager->install_from_xmldb_file($CFG->libdir.'/ddl/simpletest/fixtures/xmldb_table.xml', false)); - $this->assertTrue($dbmanager->table_exists('test_table1')); + $this->assertTrue($dbman->install_from_xmldb_file($CFG->libdir.'/ddl/simpletest/fixtures/xmldb_table.xml', false)); + $this->assertTrue($dbman->table_exists('test_table1')); } public function testCreateTempTable() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); // Feed incorrect table param ob_start(); // hide debug warning - $result = $dbmanager->create_temp_table('test_table1'); + $result = $dbman->create_temp_table('test_table1'); ob_end_clean(); $this->assertFalse($result); $table = $this->tables['test_table1']; // New table - $this->assertTrue($dbmanager->create_temp_table($table)); - $this->assertTrue($dbmanager->table_exists('test_table1', true)); + $this->assertTrue($dbman->create_temp_table($table)); + $this->assertTrue($dbman->table_exists('test_table1', true)); // Delete - $this->assertTrue($dbmanager->drop_temp_table($table)); - $this->assertFalse($dbmanager->table_exists('test_table1', true)); + $this->assertTrue($dbman->drop_temp_table($table)); + $this->assertFalse($dbman->table_exists('test_table1', true)); } @@ -819,24 +819,24 @@ class ddllib_test extends UnitTestCase { /* public function testRenameIndex() { // unsupported! - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table0'); $index = new xmldb_index('course'); $index->set_attributes(XMLDB_INDEX_UNIQUE, array('course')); - $this->assertTrue($dbmanager->rename_index($table, $index, 'newindexname')); + $this->assertTrue($dbman->rename_index($table, $index, 'newindexname')); } public function testRenameKey() { //unsupported - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = $this->create_deftable('test_table0'); $key = new xmldb_key('course'); $key->set_attributes(XMLDB_KEY_UNIQUE, array('course')); - $this->assertTrue($dbmanager->rename_key($table, $key, 'newkeyname')); + $this->assertTrue($dbman->rename_key($table, $key, 'newkeyname')); } */ diff --git a/lib/deprecatedlib.php b/lib/deprecatedlib.php index d5294b8f04..eeb36b281d 100644 --- a/lib/deprecatedlib.php +++ b/lib/deprecatedlib.php @@ -424,81 +424,33 @@ function get_current_group($courseid, $full = false) { } - - /** * Print an error page displaying an error message. * Old method, don't call directly in new code - use print_error instead. * - * - * @uses $SESSION - * @uses $CFG * @param string $message The message to display to the user about the error. * @param string $link The url where the user will be prompted to continue. If no url is provided the user will be directed to the site index page. + * @return terminates script, does not return! */ function error($message, $link='') { - global $CFG, $SESSION, $THEME, $UNITTEST; - - $message = clean_text($message); // In case nasties are in here + global $UNITTEST; - /** - * TODO VERY DIRTY HACK USED FOR UNIT TESTING UNTIL PROPER EXCEPTION HANDLING IS IMPLEMENTED - */ + // If unittest running, throw exception instead if (!empty($UNITTEST->running)) { // Errors in unit test become exceptions, so you can unit test // code that might call error(). - throw new Exception('error() call: '. $message.($link!=='' ? ' ['.$link.']' : '')); - } - - debugging('error() is a deprecated function, please call print_error() instead of error()', DEBUG_DEVELOPER); - - if (defined('FULLME') && FULLME == 'cron') { - // Errors in cron should be mtrace'd. - mtrace($message); - die; - } - - if (! defined('HEADER_PRINTED')) { - //header not yet printed - @header('HTTP/1.0 404 Not Found'); - print_header(get_string('error')); - } else { - print_container_end_all(false, $THEME->open_header_containers); + throw new moodle_exception('notlocalisederrormessage', 'error', $link, $message); } - echo '
'; - print_simple_box($message, '', '', '', '', 'errorbox'); - - debugging('Stack trace:', DEBUG_DEVELOPER); - - // in case we are logging upgrade in admin/index.php stop it - if (function_exists('upgrade_log_finish')) { - upgrade_log_finish(); - } - - if (empty($link) and !defined('ADMIN_EXT_HEADER_PRINTED')) { - if ( !empty($SESSION->fromurl) ) { - $link = $SESSION->fromurl; - unset($SESSION->fromurl); - } else { - $link = $CFG->wwwroot .'/'; - } - } - - if (!empty($link)) { - print_continue($link); - } + _print_normal_error('notlocalisederrormessage', 'error', $message, $link, debug_backtrace(), true); // show debug warning +} - print_footer(); - for ($i=0;$i<512;$i++) { // Padding to help IE work with 404 - echo ' '; - } - die; -} +////////////////////////// +/// removed functions //// +////////////////////////// -/// removed functions function addslashes_object($dataobject) { error('addslashes() not available anymore'); } diff --git a/lib/dml/simpletest/testdmllib.php b/lib/dml/simpletest/testdmllib.php index d94f571c27..2f1d4099b6 100755 --- a/lib/dml/simpletest/testdmllib.php +++ b/lib/dml/simpletest/testdmllib.php @@ -10,18 +10,18 @@ if (!defined('MOODLE_INTERNAL')) { class dmllib_test extends UnitTestCase { private $tables = array(); - private $db; + private $tdb; function setUp() { global $CFG, $DB, $UNITTEST; if (isset($UNITTEST->func_test_db)) { - $this->db = $UNITTEST->func_test_db; + $this->tdb = $UNITTEST->func_test_db; } else { - $this->db = $DB; + $this->tdb = $DB; } - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); $table = new xmldb_table("testtable"); $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null); @@ -50,28 +50,28 @@ class dmllib_test extends UnitTestCase { $table->add_index('course', XMLDB_INDEX_NOTUNIQUE, array('course')); $table->setComment("This is a test'n drop table. You can drop it safely"); - if ($dbmanager->table_exists($table)) { - $dbmanager->drop_table($table, true, false); + if ($dbman->table_exists($table)) { + $dbman->drop_table($table, true, false); } - $dbmanager->create_table($table); + $dbman->create_table($table); $this->tables[$table->getName()] = $table; } function tearDown() { - $dbmanager = $this->db->get_manager(); + $dbman = $this->tdb->get_manager(); foreach ($this->tables as $table) { - if ($dbmanager->table_exists($table)) { - $dbmanager->drop_table($table, true, false); + if ($dbman->table_exists($table)) { + $dbman->drop_table($table, true, false); } } $this->tables = array(); } function test_fix_sql_params() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); // Malformed table placeholder $sql = "SELECT * FROM [testtable]"; @@ -94,78 +94,73 @@ class dmllib_test extends UnitTestCase { $params = array('param1' => 'first record', 'param2' => 1); try { $sqlarray = $DB->fix_sql_params($sql, $params); + $this->assertTrue(false); } catch (Exception $e) { - $this->assertEqual('error() call: ERROR: Mixed types of sql query parameters!!', $e->getMessage()); + $this->assertTrue($e instanceof moodle_exception); } // Mixed param types (question and dollar) $sql = "SELECT * FROM {testtable} WHERE name = ?, rsstype = \$1"; $params = array('param1' => 'first record', 'param2' => 1); - $exception_caught = false; try { $sqlarray = $DB->fix_sql_params($sql, $params); + $this->assertTrue(false); } catch (Exception $e) { - $exception_caught = true; + $this->assertTrue($e instanceof moodle_exception); } - $this->assertTrue($exception_caught); // Too many params in sql $sql = "SELECT * FROM {testtable} WHERE name = ?, rsstype = ?, course = ?"; $params = array('first record', 1); - $exception_caught = false; try { $sqlarray = $DB->fix_sql_params($sql, $params); + $this->assertTrue(false); } catch (Exception $e) { - $exception_caught = true; + $this->assertTrue($e instanceof moodle_exception); } - $this->assertTrue($exception_caught); // Too many params in array: no error $params[] = 1; $params[] = time(); - $exception_caught = false; $sqlarray = null; try { $sqlarray = $DB->fix_sql_params($sql, $params); + $this->assertTrue(true); } catch (Exception $e) { - $exception_caught = true; + $this->assertTrue(false); } - $this->assertFalse($exception_caught); $this->assertTrue($sqlarray[0]); // Named params missing from array $sql = "SELECT * FROM {testtable} WHERE name = :name, rsstype = :rsstype"; $params = array('wrongname' => 'first record', 'rsstype' => 1); - $exception_caught = false; try { $sqlarray = $DB->fix_sql_params($sql, $params); + $this->assertTrue(false); } catch (Exception $e) { - $exception_caught = true; + $this->assertTrue($e instanceof moodle_exception); } - $this->assertTrue($exception_caught); // Duplicate named param in query $sql = "SELECT * FROM {testtable} WHERE name = :name, rsstype = :name"; $params = array('name' => 'first record', 'rsstype' => 1); - $exception_caught = false; try { $sqlarray = $DB->fix_sql_params($sql, $params); + $this->assertTrue(false); } catch (Exception $e) { - $exception_caught = true; + $this->assertTrue($e instanceof moodle_exception); } - $this->assertTrue($exception_caught); // Unsupported Bound params $sql = "SELECT * FROM {testtable} WHERE name = $1, rsstype = $2"; $params = array('first record', 1); - $exception_caught = false; try { $sqlarray = $DB->fix_sql_params($sql, $params); + $this->assertTrue(false); } catch (Exception $e) { - $exception_caught = true; + $this->assertTrue($e instanceof moodle_exception); } - $this->assertTrue($exception_caught); // Correct named param placeholders $sql = "SELECT * FROM {testtable} WHERE name = :name, rsstype = :rsstype"; @@ -184,16 +179,16 @@ class dmllib_test extends UnitTestCase { } public function testGetTables() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); // Need to test with multiple DBs $this->assertTrue($DB->get_tables() > 2); } public function testGetIndexes() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); $this->assertTrue($indices = $DB->get_indexes('testtable')); $this->assertTrue(count($indices) == 1); @@ -215,8 +210,8 @@ class dmllib_test extends UnitTestCase { } public function testGetColumns() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); $this->assertTrue($columns = $DB->get_columns('testtable')); $fields = $this->tables['testtable']->getFields(); @@ -236,8 +231,8 @@ class dmllib_test extends UnitTestCase { } public function testExecute() { - $DB = $this->db; // do not use global $DB! - $dbmanager = $this->db->get_manager(); + $DB = $this->tdb; // do not use global $DB! + $dbman = $this->tdb->get_manager(); $sql = "SELECT * FROM {testtable}"; $this->assertTrue($DB->execute($sql)); diff --git a/lib/setup.php b/lib/setup.php index 07c20fa687..a330d57083 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -139,6 +139,9 @@ global $HTTPSPAGEREQUIRED; //the problem is that we need specific version of quickforms and hacked excel files :-( ini_set('include_path', $CFG->libdir.'/pear' . PATH_SEPARATOR . ini_get('include_path')); +/// set handler for uncought exceptions - equivalent to print_error() call + set_exception_handler('default_exception_handler'); + /// Connect to the database setup_DB(); diff --git a/lib/setuplib.php b/lib/setuplib.php index ecbf8d8681..014bf64e89 100644 --- a/lib/setuplib.php +++ b/lib/setuplib.php @@ -1,6 +1,6 @@ -errorcode = $errorcode; + $this->module = $module; + $this->link = $link; + $this->a = $a; + + $message = get_string($errorcode, $module, $a); + + parent::__construct($message, 0); + } +} + +/** + * Default exception handler, uncought exceptions are equivalent to using print_error() + */ +function default_exception_handler($ex) { + $backtrace = $ex->getTrace(); + $place = array('file'=>$ex->getFile(), 'line'=>$ex->getLine(), 'exception'=>get_class($ex)); + array_unshift($backtrace, $place); + + if ($ex instanceof moodle_exception) { + _print_normal_error($ex->errorcode, $ex->module, $ex->a, $ex->link, $backtrace); + } else { + _print_normal_error('generalexceptionmessage', 'error', $ex->getMessage(), '', $backtrace); + } +} /** * Initializes our performance info early. * * Pairs up with get_performance_info() which is actually - * in moodlelib.php. This function is here so that we can - * call it before all the libs are pulled in. + * in moodlelib.php. This function is here so that we can + * call it before all the libs are pulled in. * * @uses $PERF */ function init_performance_info() { global $PERF, $CFG, $USER; - + $PERF = new Object; - $PERF->dbqueries = 0; + $PERF->dbqueries = 0; $PERF->logwrites = 0; if (function_exists('microtime')) { $PERF->starttime = microtime(); @@ -33,12 +79,12 @@ function init_performance_info() { $PERF->startmemory = memory_get_usage(); } if (function_exists('posix_times')) { - $PERF->startposixtimes = posix_times(); + $PERF->startposixtimes = posix_times(); } if (function_exists('apd_set_pprof_trace')) { // APD profiling if ($USER->id > 0 && $CFG->perfdebug >= 15) { - $tempdir = $CFG->dataroot . '/temp/profile/' . $USER->id; + $tempdir = $CFG->dataroot . '/temp/profile/' . $USER->id; mkdir($tempdir); apd_set_pprof_trace($tempdir); $PERF->profiling = true; @@ -130,7 +176,7 @@ function make_upload_directory($directory, $shownotices=true) { if (!file_exists($currdir)) { if (! mkdir($currdir, $CFG->directorypermissions)) { if ($shownotices) { - echo '
ERROR: You need to create the directory '. + echo '
ERROR: You need to create the directory '. $currdir .' with web server write access
'."
\n"; } return false; @@ -152,7 +198,7 @@ function make_upload_directory($directory, $shownotices=true) { if (! file_exists($currdir)) { if (! mkdir($currdir, $CFG->directorypermissions)) { if ($shownotices) { - echo '
ERROR: Could not find or create a directory ('. + echo '
ERROR: Could not find or create a directory ('. $currdir .')
'."
\n"; } return false; @@ -171,9 +217,9 @@ function init_memcached() { $MCACHE = new memcached; if ($MCACHE->status()) { return true; - } + } unset($MCACHE); - return false; + return false; } function init_eaccelerator() { @@ -183,7 +229,7 @@ function init_eaccelerator() { $MCACHE = new eaccelerator; if ($MCACHE->status()) { return true; - } + } unset($MCACHE); return false; } diff --git a/lib/weblib.php b/lib/weblib.php index 4d905eb187..cc221753f9 100644 --- a/lib/weblib.php +++ b/lib/weblib.php @@ -5593,18 +5593,41 @@ function print_scale_menu_helpbutton($courseid, $scale, $return=false) { /** * Print an error page displaying an error message. New method - use this for new code. * - * @uses $SESSION - * @uses $CFG * @param string $errorcode The name of the string from error.php to print + * @param string $module name of module * @param string $link The url where the user will be prompted to continue. If no url is provided the user will be directed to the site index page. * @param object $a Extra words and phrases that might be required in the error string * @return terminates script, does not return! */ -function print_error ($errorcode, $module='', $link='', $a=NULL) { - global $CFG, $SESSION, $THEME, $UNITTEST; +function print_error($errorcode, $module='', $link='', $a=NULL) { + global $CFG, $UNITTEST; + + // If unittest running, throw exception instead + if (!empty($UNITTEST->running)) { + // Errors in unit test become exceptions, so you can unit test + // code that might call error(). + throw new moodle_exception($errorcode, $module, $link, $a); + } if (empty($module) || $module == 'moodle' || $module == 'core') { $module = 'error'; + } + + if (!isset($CFG->theme)) { + // error found before setup.php finished + _print_early_error($errorcode, $module, $a); + } else { + _print_normal_error($errorcode, $module, $a, $link, debug_backtrace()); + } +} + +/** + * Internal function - do not use directly!! + */ +function _print_normal_error($errorcode, $module, $a, $link, $backtrace, $showerrordebugwarning=false) { + global $CFG, $SESSION, $THEME; + + if ($module == 'error') { $modulelink = 'moodle'; } else { $modulelink = $module; @@ -5612,19 +5635,10 @@ function print_error ($errorcode, $module='', $link='', $a=NULL) { $message = get_string($errorcode, $module, $a); - - /** - * TODO VERY DIRTY HACK USED FOR UNIT TESTING UNTIL PROPER EXCEPTION HANDLING IS IMPLEMENTED - */ - if (!empty($UNITTEST->running)) { - // Errors in unit test become exceptions, so you can unit test - // code that might call error(). - throw new Exception('error() call: '. $message.($link!=='' ? ' ['.$link.']' : '')); - } - - if (!isset($CFG->theme)) { - // error found before setup.php finished - print_early_error($message); + if (defined('FULLME') && FULLME == 'cron') { + // Errors in cron should be mtrace'd. + mtrace($message); + die; } if (empty($link) and !defined('ADMIN_EXT_HEADER_PRINTED')) { @@ -5644,17 +5658,6 @@ function print_error ($errorcode, $module='', $link='', $a=NULL) { $errordocroot = 'http://docs.moodle.org'; } - if (defined('FULLME') && FULLME == 'cron') { - // Errors in cron should be mtrace'd. - mtrace($message); - die; - } - - $message = clean_text('

'.$message.'

'. - '

'. - ''. - get_string('moreinformation').'

'); - if (! defined('HEADER_PRINTED')) { //header not yet printed @header('HTTP/1.0 404 Not Found'); @@ -5665,9 +5668,21 @@ function print_error ($errorcode, $module='', $link='', $a=NULL) { echo '
'; + $message = clean_text('

'.$message.'

'. + '

'. + ''. + get_string('moreinformation').'

'); + print_simple_box($message, '', '', '', '', 'errorbox'); - debugging('Stack trace:', DEBUG_DEVELOPER); + if ($showerrordebugwarning) { + debugging('error() is a deprecated function, please call print_error() instead of error()', DEBUG_DEVELOPER); + + } else { + if (debugging('', DEBUG_DEVELOPER)) { + notify('Stack trace:'.print_backtrace($backtrace, true), 'notifytiny'); + } + } // in case we are logging upgrade in admin/index.php stop it if (function_exists('upgrade_log_finish')) { @@ -5687,14 +5702,12 @@ function print_error ($errorcode, $module='', $link='', $a=NULL) { } /** - * Internal function - do not use directly + * Internal function - do not use directly!! * This function is used if fatal error occures before the themes are fully initialised (eg. in lib/setup.php) - * @param string $errorcode The name of the string from error.php to print - * @param string $link The url where the user will be prompted to continue. If no url is provided the user will be directed to the site index page. - * @param object $a Extra words and phrases that might be required in the error string - * @return terminates script, does not return! */ -function print_early_error($message) { +function _print_early_error($errorcode, $module, $a) { + $message = clean_text(get_string($errorcode, $module, $a)); + // In the name of protocol correctness, monitoring and performance // profiling, set the appropriate error headers for machine comsumption if (isset($_SERVER['SERVER_PROTOCOL'])) { @@ -5719,7 +5732,7 @@ function print_early_error($message) {
-'.clean_text($message, FORMAT_HTML).' +'.$message.'
'; die; @@ -6853,25 +6866,7 @@ function debugging($message='', $level=DEBUG_NORMAL) { if ($CFG->debug >= $level) { if ($message) { $callers = debug_backtrace(); - $from = '
    '; - foreach ($callers as $caller) { - if (!isset($caller['line'])) { - $caller['line'] = '?'; // probably call_user_func() - } - if (!isset($caller['file'])) { - $caller['file'] = $CFG->dirroot.'/unknownfile'; // probably call_user_func() - } - $from .= '
  • line ' . $caller['line'] . ' of ' . substr($caller['file'], strlen($CFG->dirroot) + 1); - if (isset($caller['function'])) { - $from .= ': call to '; - if (isset($caller['class'])) { - $from .= $caller['class'] . $caller['type']; - } - $from .= $caller['function'] . '()'; - } - $from .= '
  • '; - } - $from .= '
'; + $from = print_backtrace($callers, true); if (!isset($CFG->debugdisplay)) { $CFG->debugdisplay = ini_get('display_errors'); } @@ -6889,6 +6884,44 @@ function debugging($message='', $level=DEBUG_NORMAL) { return false; } +/** + * Prints formatted backtrace + * @param backtrace array + * @param return return as string or print + * @return mixed + */ +function print_backtrace($callers, $return=false) { + global $CFG; + + $from = '
    '; + foreach ($callers as $caller) { + if (!isset($caller['line'])) { + $caller['line'] = '?'; // probably call_user_func() + } + if (!isset($caller['file'])) { + $caller['file'] = $CFG->dirroot.'/unknownfile'; // probably call_user_func() + } + $from .= '
  • line ' . $caller['line'] . ' of ' . substr($caller['file'], strlen($CFG->dirroot) + 1); + if (isset($caller['function'])) { + $from .= ': call to '; + if (isset($caller['class'])) { + $from .= $caller['class'] . $caller['type']; + } + $from .= $caller['function'] . '()'; + } else if (isset($caller['exception'])) { + $from .= ': '.$caller['exception'].' thrown'; + } + $from .= '
  • '; + } + $from .= '
'; + + if ($return) { + return $from; + } else { + echo $from; + } +} + /** * Disable debug messages from debugging(), while keeping PHP error reporting level as is. */