MDL-17317 DML: more exceptions - now in connect too

This commit is contained in:
skodak
2008-11-22 01:16:52 +00:00
parent 2dccc890a2
commit ce1526061c
7 changed files with 87 additions and 63 deletions
+20 -6
View File
@@ -38,6 +38,14 @@ abstract class adodb_moodle_database extends moodle_database {
public function connect($dbhost, $dbuser, $dbpass, $dbname, $prefix, array $dboptions=null) {
global $CFG;
$driverstatus = $this->driver_installed();
if ($driverstatus !== true) {
throw new dml_exception('dbdriverproblem', $driverstatus);
}
ob_start();
$this->store_settings($dbhost, $dbuser, $dbpass, $dbname, $prefix, $dboptions);
$this->preconfigure_dbconnection();
@@ -50,16 +58,22 @@ abstract class adodb_moodle_database extends moodle_database {
// we probably want to change this value to ''.
$this->adodb->null2null = 'A long random string that will never, ever match something we want to insert into the database, I hope. \'';
if (!empty($this->dboptions['dbpersist'])) { // Use persistent connection
if (!$this->adodb->PConnect($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname)) {
return false;
}
$connected = $this->adodb->PConnect($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname);
} else { // Use single connection
if (!$this->adodb->Connect($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname)) {
return false;
}
$connected = $this->adodb->Connect($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname);
}
$dberr = ob_get_contents();
ob_end_clean();
if (!$connected) {
throw new dml_connection_exception($dberr);
}
$this->configure_dbconnection();
return true;
}
+2 -1
View File
@@ -198,7 +198,8 @@ abstract class moodle_database {
* @param string $dbname
* @param mixed $prefix string means moodle db prefix, false used for external databases where prefix not used
* @param array $dboptions driver specific options
* @return bool success
* @return bool true
* @throws dml_connection_exception if error
*/
public abstract function connect($dbhost, $dbuser, $dbpass, $dbname, $prefix, array $dboptions=null);
+14 -2
View File
@@ -82,12 +82,24 @@ class mysqli_native_moodle_database extends moodle_database {
public function connect($dbhost, $dbuser, $dbpass, $dbname, $prefix, array $dboptions=null) {
global $CFG;
$driverstatus = $this->driver_installed();
if ($driverstatus !== true) {
throw new dml_exception('dbdriverproblem', $driverstatus);
}
$this->store_settings($dbhost, $dbuser, $dbpass, $dbname, $prefix, $dboptions);
ob_start();
$this->mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($this->mysqli->connect_error) {
return false;
$dberr = ob_get_contents();
ob_end_clean();
$errorno = @$this->mysqli->connect_errno;
if ($errorno !== 0) {
throw new dml_connection_exception($dberr);
}
$this->query_start("--set_charset()", null, SQL_QUERY_AUX);
$this->mysqli->set_charset('utf8');
$this->query_end(true);
+16 -7
View File
@@ -80,11 +80,18 @@ class pgsql_native_moodle_database extends moodle_database {
* @param string $dbname
* @param mixed $prefix string means moodle db prefix, false used for external databases where prefix not used
* @param array $dboptions driver specific options
* @return bool success
* @return bool true
* @throws dml_connection_exception if error
*/
public function connect($dbhost, $dbuser, $dbpass, $dbname, $prefix, array $dboptions=null) {
global $CFG;
$driverstatus = $this->driver_installed();
if ($driverstatus !== true) {
throw new dml_exception('dbdriverproblem', $driverstatus);
}
$this->store_settings($dbhost, $dbuser, $dbpass, $dbname, $prefix, $dboptions);
$pass = addcslashes($this->dbpass, "'\\");
@@ -101,17 +108,20 @@ class pgsql_native_moodle_database extends moodle_database {
$connection = "host='$this->dbhost' port='$port' user='$this->dbuser' password='$pass' dbname='$this->dbname'";
}
ob_start();
if (empty($this->dboptions['dbpersit'])) {
$this->pgsql = pg_connect($connection, PGSQL_CONNECT_FORCE_NEW);
} else {
$this->pgsql = pg_pconnect($connection, PGSQL_CONNECT_FORCE_NEW);
}
$dberr = ob_get_contents();
ob_end_clean();
$status = pg_connection_status($this->pgsql);
if ($status === false or $status === PGSQL_CONNECTION_BAD) {
$this->pgsql = null;
return false;
throw new dml_connection_exception($dberr);
}
$this->query_start("--pg_set_client_encoding()", null, SQL_QUERY_AUX);
@@ -123,13 +133,12 @@ class pgsql_native_moodle_database extends moodle_database {
$this->query_start($sql, null, SQL_QUERY_AUX);
$result = pg_query($this->pgsql, $sql);
$this->query_end($result);
if ($result === false) {
return false;
}
$this->bytea_oid = pg_fetch_result($result, 0);
pg_free_result($result);
if ($this->bytea_oid === false) {
return false;
$this->pgsql = null;
throw new dml_connection_exception('Can not read bytea type.');
}
return true;
+23 -43
View File
@@ -46,6 +46,16 @@ class dml_exception extends moodle_exception {
}
}
/**
* DML db connection exception - triggered if database not accessible.
*/
class dml_connection_exception extends dml_exception {
function __construct($error) {
$errorinfo = '<em>'.s($error).'</em>';
parent::__construct('dbconnectionfailed', NULL, $errorinfo);
}
}
/**
* DML read exception - triggered by SQL syntax errors, missing tables, etc.
*/
@@ -133,68 +143,38 @@ function setup_DB() {
$CFG->dboptions['dbpersist'] = $CFG->dbpersist;
}
if (!$DB = moodle_database::get_driver_instance($CFG->dbtype, $CFG->dblibrary)) {
throw new dml_exception('dbdriverproblem', "Unknown driver $CFG->dblibrary/$CFG->dbtype");
}
$CFG->dbfamily = $DB->get_dbfamily(); // TODO: BC only for now
$driverstatus = $DB->driver_installed();
if ($driverstatus !== true) {
throw new dml_exception('dbdriverproblem', $driverstatus);
}
if (debugging('', DEBUG_ALL)) {
// catch errors
ob_start();
} else {
$prevdebug = error_reporting(0);
}
$connected = false;
try {
$connected = $DB->connect($CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, $CFG->dboptions);
} Catch (Exception $e) {
$connected = false;
}
if (!$connected) {
$dberr = '';
if (debugging('', DEBUG_ALL)) {
if ($dberr = ob_get_contents()) {
$dberr = '<p><em>'.$dberr.'</em></p>';
}
ob_end_clean();
}
$DB->connect($CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, $CFG->dboptions);
} catch (moodle_exception $e) {
if (empty($CFG->noemailever) and !empty($CFG->emailconnectionerrorsto)) {
if (file_exists($CFG->dataroot.'/emailcount')){
$fp = fopen($CFG->dataroot.'/emailcount', 'r');
$content = fread($fp, 24);
fclose($fp);
$fp = @fopen($CFG->dataroot.'/emailcount', 'r');
$content = @fread($fp, 24);
@fclose($fp);
if((time() - (int)$content) > 600){
@mail($CFG->emailconnectionerrorsto,
'WARNING: Database connection error: '.$CFG->wwwroot,
'Connection error: '.$CFG->wwwroot);
$fp = fopen($CFG->dataroot.'/emailcount', 'w');
fwrite($fp, time());
$fp = @fopen($CFG->dataroot.'/emailcount', 'w');
@fwrite($fp, time());
}
} else {
@mail($CFG->emailconnectionerrorsto,
'WARNING: Database connection error: '.$CFG->wwwroot,
'Connection error: '.$CFG->wwwroot);
$fp = fopen($CFG->dataroot.'/emailcount', 'w');
fwrite($fp, time());
$fp = @fopen($CFG->dataroot.'/emailcount', 'w');
@fwrite($fp, time());
}
}
throw new dml_exception('dbconnectionfailed', $dberr);
}
if (debugging('', DEBUG_ALL)) {
ob_end_clean();
} else {
error_reporting($prevdebug);
// rethrow the exception
throw $e;
}
$CFG->dbfamily = $DB->get_dbfamily(); // TODO: BC only for now
return true;
}
+1 -1
View File
@@ -71,7 +71,7 @@ function default_exception_handler($ex) {
if ($ex instanceof moodle_exception) {
if (!isset($CFG->theme) or !isset($CFG->stylesheets)) {
_print_early_error($ex->errorcode, $ex->module, $ex->a);
_print_early_error($ex->errorcode, $ex->module, $ex->a, $backtrace, $ex->debuginfo);
} else {
_print_normal_error($ex->errorcode, $ex->module, $ex->a, $ex->link, $backtrace, $ex->debuginfo);
}
+11 -3
View File
@@ -5925,7 +5925,7 @@ function _print_normal_error($errorcode, $module, $a, $link, $backtrace, $debugi
* 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)
*/
function _print_early_error($errorcode, $module, $a) {
function _print_early_error($errorcode, $module, $a, $backtrace=null, $debuginfo=null) {
$message = get_string($errorcode, $module, $a);
if ($module === 'error' and strpos($message, '[[') === 0) {
//search in moodle file if error specified - needed for backwards compatibility
@@ -5958,8 +5958,16 @@ function _print_early_error($errorcode, $module, $a) {
border-color:black; background-color:#ffffee; border-style:solid; border-radius: 20px; border-collapse: collapse;
width: 80%; -moz-border-radius: 20px; padding: 15px">
'.$message.'
</div>
</body></html>';
</div>';
if (debugging('', DEBUG_DEVELOPER)) {
if ($debuginfo) {
debugging($debuginfo, DEBUG_DEVELOPER, $backtrace);
} else {
notify('Stack trace:'.print_backtrace($backtrace, true), 'notifytiny');
}
}
echo '</body></html>';
die;
}