MDL-14974 improved columns caching implementation

This commit is contained in:
skodak 2008-05-25 09:31:38 +00:00
parent aa07a81368
commit a7544e377a
11 changed files with 36 additions and 44 deletions

View file

@ -84,8 +84,6 @@ class database_manager {
notify('<strong>' . get_string('error') . '</strong>'); notify('<strong>' . get_string('error') . '</strong>');
} }
$this->mdb->reset_columns(); // Clear out the cache, just in case changes were made to table structures
return $result; return $result;
} }
@ -150,8 +148,7 @@ class database_manager {
} }
/// Get list of fields in table /// Get list of fields in table
$this->mdb->reset_columns($tablename); // better reset before testing $columns = $this->mdb->get_columns($tablename, false);
$columns = $this->mdb->get_columns($tablename);
$exists = array_key_exists($fieldname, $columns); $exists = array_key_exists($fieldname, $columns);

View file

@ -325,9 +325,7 @@ class mssql_sql_generator extends sql_generator {
$fieldname = $xmldb_field->getName(); $fieldname = $xmldb_field->getName();
/// Take a look to field metadata /// Take a look to field metadata
$this->mdb->reset_columns($tablename); $meta = $this->mdb->get_columns($tablename, false);
$meta = $this->mdb->get_columns($tablename);
$metac = $meta[$fieldname]; $metac = $meta[$fieldname];
$oldmetatype = $metac->meta_type; $oldmetatype = $metac->meta_type;

View file

@ -255,14 +255,10 @@ class mysql_sql_generator extends sql_generator {
*/ */
public function getCheckConstraintsFromDB($xmldb_table, $xmldb_field = null) { public function getCheckConstraintsFromDB($xmldb_table, $xmldb_field = null) {
global $db;
$tablename = $xmldb_table->getName($xmldb_table); $tablename = $xmldb_table->getName($xmldb_table);
$this->mdb->reset_columns($tablename);
/// Fetch all the columns in the table /// Fetch all the columns in the table
if (!$columns = $this->mdb->get_columns($tablename)) { if (!$columns = $this->mdb->get_columns($tablename, false)) {
return array(); return array();
} }

View file

@ -338,7 +338,7 @@ class oracle_sql_generator extends sql_generator {
$fieldname = $xmldb_field->getName(); $fieldname = $xmldb_field->getName();
/// Take a look to field metadata /// Take a look to field metadata
$meta = $this->mdb->get_columns($xmldb_table->getName()); $meta = $this->mdb->get_columns($tablename, false);
$metac = $meta[$fieldname]; $metac = $meta[$fieldname];
$oldmetatype = $metac->meta_type; $oldmetatype = $metac->meta_type;

View file

@ -246,7 +246,7 @@ class postgres_sql_generator extends sql_generator {
$fieldname = $xmldb_field->getName(); $fieldname = $xmldb_field->getName();
/// Take a look to field metadata /// Take a look to field metadata
$meta = $this->mdb->get_columns($xmldb_table->getName()); $meta = $this->mdb->get_columns($tablename, false);
$metac = $meta[$xmldb_field->getName()]; $metac = $meta[$xmldb_field->getName()];
$oldmetatype = $metac->meta_type; $oldmetatype = $metac->meta_type;
$oldlength = $metac->max_length; $oldlength = $metac->max_length;

View file

@ -480,6 +480,20 @@ function get_course_users($courseid, $sort='ul.timeaccess DESC', $exceptions='',
} }
/**
* Returns a list of all site users
* Obsolete, just calls get_course_users(SITEID)
*
* @uses SITEID
* @deprecated Use {@link get_course_users()} instead.
* @param string $fields A comma separated list of fields to be returned from the chosen table.
* @return object|false {@link $USER} records or false if error.
*/
function get_site_users($sort='u.lastaccess DESC', $fields='*', $exceptions='') {
return get_course_users(SITEID, $sort, $exceptions, $fields);
}
/** /**
* Returns an array of user objects * Returns an array of user objects
* *

View file

@ -10,7 +10,6 @@ require_once($CFG->libdir.'/dml/adodb_moodle_recordset.php');
abstract class adodb_moodle_database extends moodle_database { abstract class adodb_moodle_database extends moodle_database {
protected $db; protected $db;
protected $columns = array(); // I wish we had a shared memory cache for this :-(
/** /**
* Returns localised database type name * Returns localised database type name
@ -137,8 +136,8 @@ abstract class adodb_moodle_database extends moodle_database {
return $indexes; return $indexes;
} }
public function get_columns($table) { public function get_columns($table, $usecache=true) {
if (isset($this->columns[$table])) { if ($usecache and isset($this->columns[$table])) {
return $this->columns[$table]; return $this->columns[$table];
} }
@ -157,14 +156,6 @@ abstract class adodb_moodle_database extends moodle_database {
return $this->columns[$table]; return $this->columns[$table];
} }
public function reset_columns($table=null) {
if ($table) {
unset($this->columns[$table]);
} else {
$this->columns[$table] = array();
}
}
public function get_last_error() { public function get_last_error() {
return $this->db->ErrorMsg(); return $this->db->ErrorMsg();
} }
@ -206,6 +197,8 @@ abstract class adodb_moodle_database extends moodle_database {
$result = false; $result = false;
$this->report_error($sql); $this->report_error($sql);
} }
// structure changed, reset columns cache
$this->reset_columns();
return $result; return $result;
} }

View file

@ -9,6 +9,8 @@ abstract class moodle_database {
// manipulates the db structure // manipulates the db structure
protected $database_manager; protected $database_manager;
protected $columns = array(); // I wish we had a shared memory cache for this :-(
// db connection options // db connection options
protected $dbhost; protected $dbhost;
protected $dbuser; protected $dbuser;
@ -319,16 +321,19 @@ abstract class moodle_database {
/** /**
* Returns datailed information about columns in table. This information is cached internally. * Returns datailed information about columns in table. This information is cached internally.
* @param string $table name * @param string $table name
* @param bool $usecache
* @return array array of database_column_info objects indexed with column names * @return array array of database_column_info objects indexed with column names
*/ */
public abstract function get_columns($table); public abstract function get_columns($table, $usecache=true);
/** /**
* Reset internal column details cache * Reset internal column details cache
* @param string $table - empty means all, or one if name of table given * @param string $table - empty means all, or one if name of table given
* @return void * @return void
*/ */
public abstract function reset_columns($table=null); public function reset_columns() {
$this->columns[] = array();
}
/** /**
* Returns sql generator used for db manipulation. * Returns sql generator used for db manipulation.

View file

@ -10,7 +10,6 @@ require_once($CFG->libdir.'/dml/pdo_moodle_recordset.php');
abstract class pdo_moodle_database extends moodle_database { abstract class pdo_moodle_database extends moodle_database {
protected $pdb; protected $pdb;
protected $columns = array(); // I wish we had a shared memory cache for this :-(
//TODO: This looks incorrect now IMO. Construct should have only external and connect get all the rest of params //TODO: This looks incorrect now IMO. Construct should have only external and connect get all the rest of params
public function __construct($dbhost, $dbuser, $dbpass, $dbname, $dbpersist, $prefix, array $dboptions=null, $external=false) { public function __construct($dbhost, $dbuser, $dbpass, $dbname, $dbpersist, $prefix, array $dboptions=null, $external=false) {
@ -31,8 +30,8 @@ abstract class pdo_moodle_database extends moodle_database {
protected function configure_dbconnection() { protected function configure_dbconnection() {
} }
public function get_columns($table) { public function get_columns($table, $usecache=true) {
if (isset($this->columns[$table])) { if ($usecache and isset($this->columns[$table])) {
return $this->columns[$table]; return $this->columns[$table];
} }
@ -43,15 +42,6 @@ abstract class pdo_moodle_database extends moodle_database {
return $this->columns[$table]; return $this->columns[$table];
} }
public function reset_columns($table=null) {
if ($table) {
unset($this->columns[$table]);
} else {
$this->columns[$table] = array();
}
}
protected function report_error($sql, $params, $obj) { protected function report_error($sql, $params, $obj) {
debugging($e->getMessage() .'<br /><br />'. s($sql)); debugging($e->getMessage() .'<br /><br />'. s($sql));
} }
@ -66,7 +56,6 @@ abstract class pdo_moodle_database extends moodle_database {
public function execute($sql, array $params=null) { public function execute($sql, array $params=null) {
try { try {
//$this->reset_columns(); // TODO: do we need to clean the cache here??
list($sql, $params, $type) = $this->fix_sql_params($sql, $params); list($sql, $params, $type) = $this->fix_sql_params($sql, $params);
$sth = $this->dbh->prepare($sql); $sth = $this->dbh->prepare($sql);
return $sth->execute($params); return $sth->execute($params);

View file

@ -100,8 +100,8 @@ class postgres7_adodb_moodle_database extends adodb_moodle_database {
return SQL_PARAMS_QM; return SQL_PARAMS_QM;
} }
public function get_columns($table) { public function get_columns($table, $usecache=true) {
if (isset($this->columns[$table])) { if ($usecache and isset($this->columns[$table])) {
return $this->columns[$table]; return $this->columns[$table];
} }

View file

@ -39,12 +39,12 @@ function execute_sql($command, $feedback=true) {
} }
} }
$DB->reset_columns(); // Clear out the cache, just in case changes were made to table structures
if (defined('MDL_PERFDB')) { global $PERF ; $PERF->dbqueries++; }; if (defined('MDL_PERFDB')) { global $PERF ; $PERF->dbqueries++; };
$rs = $db->Execute($command); $rs = $db->Execute($command);
$DB->reset_columns(); // Clear out the cache, just in case changes were made to table structures
$db->debug = $olddebug; $db->debug = $olddebug;
if ($rs) { if ($rs) {