libdir.'/dml/moodle_database.php');
/**
* DML exception class, use instead of error() in dml code.
*/
class dml_exception extends moodle_exception {
function __construct($errorcode, $a=NULL, $debuginfo=null) {
parent::__construct($errorcode, '', '', $a, $debuginfo);
}
}
/**
* DML db connection exception - triggered if database not accessible.
*/
class dml_connection_exception extends dml_exception {
function __construct($error) {
$errorinfo = ''.s($error).'';
parent::__construct('dbconnectionfailed', NULL, $errorinfo);
}
}
/**
* DML read exception - triggered by SQL syntax errors, missing tables, etc.
*/
class dml_read_exception extends dml_exception {
public $error;
public $sql;
public $params;
function __construct($error, $sql=null, array $params=null) {
$this->error = $error;
$this->sql = $sql;
$this->params = $params;
$errorinfo = s($error).'
'.s($sql).'
['.s(var_export($params, true)).']';
parent::__construct('dmlreadexception', NULL, $errorinfo);
}
}
/**
* DML read exception - triggered by SQL syntax errors, missing tables, etc.
*/
class dml_write_exception extends dml_exception {
public $error;
public $sql;
public $params;
function __construct($error, $sql=null, array $params=null) {
$this->error = $error;
$this->sql = $sql;
$this->params = $params;
$errorinfo = s($error).'
'.s($sql).'
['.s(var_export($params, true)).']';
parent::__construct('dmlwriteexception', NULL, $errorinfo);
}
}
/**
* Sets up global $DB moodle_database instance
* @return void
*/
function setup_DB() {
global $CFG, $DB;
if (isset($DB)) {
return;
}
if (!isset($CFG->dbuser)) {
$CFG->dbuser = '';
}
if (!isset($CFG->dbpass)) {
$CFG->dbpass = '';
}
if (!isset($CFG->dbname)) {
$CFG->dbname = '';
}
if (!isset($CFG->dblibrary)) {
switch ($CFG->dbtype) {
case 'postgres7' :
$CFG->dbtype = 'pgsql';
// continue, no break here
case 'pgsql' :
$CFG->dblibrary = 'native';
break;
case 'mysql' :
if (!extension_loaded('mysqli')) {
$CFG->dblibrary = 'adodb';
break;
}
$CFG->dbtype = 'mysqli';
// continue, no break here
case 'mysqli' :
$CFG->dblibrary = 'native';
break;
default:
// the rest of drivers is not converted yet - keep adodb for now
$CFG->dblibrary = 'adodb';
}
}
if (!isset($CFG->dboptions)) {
$CFG->dboptions = array();
}
if (isset($CFG->dbpersist)) {
$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");
}
try {
$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);
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());
}
} else {
@mail($CFG->emailconnectionerrorsto,
'WARNING: Database connection error: '.$CFG->wwwroot,
'Connection error: '.$CFG->wwwroot);
$fp = @fopen($CFG->dataroot.'/emailcount', 'w');
@fwrite($fp, time());
}
}
// rethrow the exception
throw $e;
}
$CFG->dbfamily = $DB->get_dbfamily(); // TODO: BC only for now
return true;
}