MDL-51374 core_dml: change database layer to pass table name as parameter

This commit is contained in:
Simey Lameze 2016-03-15 14:41:48 +08:00
parent 26e7eceefc
commit 87a3e50192
11 changed files with 165 additions and 65 deletions

View file

@ -1049,13 +1049,32 @@ abstract class moodle_database {
/**
* Resets the internal column details cache
*
* @param array|null $tablenames an array of xmldb table names affected by this request.
* @return void
*/
public function reset_caches() {
$this->tables = null;
// Purge MUC as well.
$this->get_metacache()->purge();
$this->metacache = null;
public function reset_caches($tablenames = null) {
if (!empty($tablenames)) {
$temptablepurged = false;
$dbmetapurged = false;
foreach ($tablenames as $tablename) {
if ($temptablepurged === false && $this->temptables->is_temptable($tablename)) {
$this->get_temp_tables_cache()->purge();
$temptablepurged = true;
} else if ($dbmetapurged === false) {
$this->tables = null;
$this->get_metacache()->purge();
$this->metacache = null;
$dbmetapurged = true;
}
}
} else {
$this->get_temp_tables_cache()->purge();
$this->tables = null;
// Purge MUC as well.
$this->get_metacache()->purge();
$this->metacache = null;
}
}
/**
@ -1124,10 +1143,11 @@ abstract class moodle_database {
/**
* Do NOT use in code, this is for use by database_manager only!
* @param string|array $sql query or array of queries
* @param array|null $tablenames an array of xmldb table names affected by this request.
* @return bool true
* @throws ddl_change_structure_exception A DDL specific exception is thrown for any errors.
*/
public abstract function change_database_structure($sql);
public abstract function change_database_structure($sql, $tablenames = null);
/**
* Executes a general sql query. Should be used only when no other method suitable.

View file

@ -438,8 +438,14 @@ class mssql_native_moodle_database extends moodle_database {
public function get_columns($table, $usecache=true) {
if ($usecache) {
if ($data = $this->get_metacache()->get($table)) {
return $data;
if ($this->temptables->is_temptable($table)) {
if ($data = $this->get_temp_tables_cache()->get($table)) {
return $data;
}
} else {
if ($data = $this->get_metacache()->get($table)) {
return $data;
}
}
}
@ -534,7 +540,11 @@ class mssql_native_moodle_database extends moodle_database {
$this->free_result($result);
if ($usecache) {
$this->get_metacache()->set($table, $structure);
if ($this->temptables->is_temptable($table)) {
$this->get_temp_tables_cache()->set($table, $structure);
} else {
$this->get_metacache()->set($table, $structure);
}
}
return $structure;
@ -634,10 +644,11 @@ class mssql_native_moodle_database extends moodle_database {
/**
* Do NOT use in code, to be used by database_manager only!
* @param string|array $sql query
* @param array|null $tablenames an array of xmldb table names affected by this request.
* @return bool true
* @throws ddl_change_structure_exception A DDL specific exception is thrown for any errors.
*/
public function change_database_structure($sql) {
public function change_database_structure($sql, $tablenames = null) {
$this->get_manager(); // Includes DDL exceptions classes ;-)
$sqls = (array)$sql;
@ -648,11 +659,11 @@ class mssql_native_moodle_database extends moodle_database {
$this->query_end($result);
}
} catch (ddl_change_structure_exception $e) {
$this->reset_caches();
$this->reset_caches($tablenames);
throw $e;
}
$this->reset_caches();
$this->reset_caches($tablenames);
return true;
}

View file

@ -576,10 +576,15 @@ class mysqli_native_moodle_database extends moodle_database {
* @return database_column_info[] array of database_column_info objects indexed with column names
*/
public function get_columns($table, $usecache=true) {
if ($usecache) {
if ($data = $this->get_metacache()->get($table)) {
return $data;
if ($this->temptables->is_temptable($table)) {
if ($data = $this->get_temp_tables_cache()->get($table)) {
return $data;
}
} else {
if ($data = $this->get_metacache()->get($table)) {
return $data;
}
}
}
@ -684,7 +689,11 @@ class mysqli_native_moodle_database extends moodle_database {
}
if ($usecache) {
$this->get_metacache()->set($table, $structure);
if ($this->temptables->is_temptable($table)) {
$this->get_temp_tables_cache()->set($table, $structure);
} else {
$this->get_metacache()->set($table, $structure);
}
}
return $structure;
@ -887,10 +896,11 @@ class mysqli_native_moodle_database extends moodle_database {
/**
* Do NOT use in code, to be used by database_manager only!
* @param string|array $sql query
* @param array|null $tablenames an array of xmldb table names affected by this request.
* @return bool true
* @throws ddl_change_structure_exception A DDL specific exception is thrown for any errors.
*/
public function change_database_structure($sql) {
public function change_database_structure($sql, $tablenames = null) {
$this->get_manager(); // Includes DDL exceptions classes ;-)
if (is_array($sql)) {
$sql = implode("\n;\n", $sql);
@ -913,11 +923,11 @@ class mysqli_native_moodle_database extends moodle_database {
while (@$this->mysqli->more_results()) {
@$this->mysqli->next_result();
}
$this->reset_caches();
$this->reset_caches($tablenames);
throw $e;
}
$this->reset_caches();
$this->reset_caches($tablenames);
return true;
}

View file

@ -470,8 +470,14 @@ class oci_native_moodle_database extends moodle_database {
public function get_columns($table, $usecache=true) {
if ($usecache) {
if ($data = $this->get_metacache()->get($table)) {
return $data;
if ($this->temptables->is_temptable($table)) {
if ($data = $this->get_temp_tables_cache()->get($table)) {
return $data;
}
} else {
if ($data = $this->get_metacache()->get($table)) {
return $data;
}
}
}
@ -662,7 +668,11 @@ class oci_native_moodle_database extends moodle_database {
}
if ($usecache) {
$this->get_metacache()->set($table, $structure);
if ($this->temptables->is_temptable($table)) {
$this->get_temp_tables_cache()->set($table, $structure);
} else {
$this->get_metacache()->set($table, $structure);
}
}
return $structure;
@ -887,10 +897,11 @@ class oci_native_moodle_database extends moodle_database {
/**
* Do NOT use in code, to be used by database_manager only!
* @param string|array $sql query
* @param array|null $tablenames an array of xmldb table names affected by this request.
* @return bool true
* @throws ddl_change_structure_exception A DDL specific exception is thrown for any errors.
*/
public function change_database_structure($sql) {
public function change_database_structure($sql, $tablenames = null) {
$this->get_manager(); // Includes DDL exceptions classes ;-)
$sqls = (array)$sql;
@ -903,11 +914,11 @@ class oci_native_moodle_database extends moodle_database {
oci_free_statement($stmt);
}
} catch (ddl_change_structure_exception $e) {
$this->reset_caches();
$this->reset_caches($tablenames);
throw $e;
}
$this->reset_caches();
$this->reset_caches($tablenames);
return true;
}

View file

@ -175,10 +175,11 @@ abstract class pdo_moodle_database extends moodle_database {
/**
* Do NOT use in code, to be used by database_manager only!
* @param string|array $sql query
* @param array|null $tablenames an array of xmldb table names affected by this request.
* @return bool true
* @throws ddl_change_structure_exception A DDL specific exception is thrown for any errors.
*/
public function change_database_structure($sql) {
public function change_database_structure($sql, $tablenames = null) {
$this->get_manager(); // Includes DDL exceptions classes ;-)
$sqls = (array)$sql;
@ -196,11 +197,11 @@ abstract class pdo_moodle_database extends moodle_database {
$this->query_end($result);
}
} catch (ddl_change_structure_exception $e) {
$this->reset_caches();
$this->reset_caches($tablenames);
throw $e;
}
$this->reset_caches();
$this->reset_caches($tablenames);
return true;
}

View file

@ -390,8 +390,14 @@ class pgsql_native_moodle_database extends moodle_database {
*/
public function get_columns($table, $usecache=true) {
if ($usecache) {
if ($data = $this->get_metacache()->get($table)) {
return $data;
if ($this->temptables->is_temptable($table)) {
if ($data = $this->get_temp_tables_cache()->get($table)) {
return $data;
}
} else {
if ($data = $this->get_metacache()->get($table)) {
return $data;
}
}
}
@ -594,7 +600,11 @@ class pgsql_native_moodle_database extends moodle_database {
pg_free_result($result);
if ($usecache) {
$this->get_metacache()->set($table, $structure);
if ($this->temptables->is_temptable($table)) {
$this->get_temp_tables_cache()->set($table, $structure);
} else {
$this->get_metacache()->set($table, $structure);
}
}
return $structure;
@ -650,10 +660,11 @@ class pgsql_native_moodle_database extends moodle_database {
/**
* Do NOT use in code, to be used by database_manager only!
* @param string|array $sql query
* @param array|null $tablenames an array of xmldb table names affected by this request.
* @return bool true
* @throws ddl_change_structure_exception A DDL specific exception is thrown for any errors.
*/
public function change_database_structure($sql) {
public function change_database_structure($sql, $tablenames = null) {
$this->get_manager(); // Includes DDL exceptions classes ;-)
if (is_array($sql)) {
$sql = implode("\n;\n", $sql);
@ -673,11 +684,11 @@ class pgsql_native_moodle_database extends moodle_database {
$result = @pg_query($this->pgsql, "ROLLBACK");
@pg_free_result($result);
}
$this->reset_caches();
$this->reset_caches($tablenames);
throw $e;
}
$this->reset_caches();
$this->reset_caches($tablenames);
return true;
}

View file

@ -201,8 +201,14 @@ class sqlite3_pdo_moodle_database extends pdo_moodle_database {
public function get_columns($table, $usecache=true) {
if ($usecache) {
if ($data = $this->get_metacache()->get($table)) {
return $data;
if ($this->temptables->is_temptable($table)) {
if ($data = $this->get_temp_tables_cache()->get($table)) {
return $data;
}
} else {
if ($data = $this->get_metacache()->get($table)) {
return $data;
}
}
}
@ -298,7 +304,11 @@ class sqlite3_pdo_moodle_database extends pdo_moodle_database {
}
if ($usecache) {
$this->get_metacache()->set($table, $structure);
if ($this->temptables->is_temptable($table)) {
$this->get_temp_tables_cache()->set($table, $structure);
} else {
$this->get_metacache()->set($table, $structure);
}
}
return $structure;

View file

@ -508,8 +508,14 @@ class sqlsrv_native_moodle_database extends moodle_database {
*/
public function get_columns($table, $usecache = true) {
if ($usecache) {
if ($data = $this->get_metacache()->get($table)) {
return $data;
if ($this->temptables->is_temptable($table)) {
if ($data = $this->get_temp_tables_cache()->get($table)) {
return $data;
}
} else {
if ($data = $this->get_metacache()->get($table)) {
return $data;
}
}
}
@ -604,7 +610,11 @@ class sqlsrv_native_moodle_database extends moodle_database {
$this->free_result($result);
if ($usecache) {
$this->get_metacache()->set($table, $structure);
if ($this->temptables->is_temptable($table)) {
$this->get_temp_tables_cache()->set($table, $structure);
} else {
$this->get_metacache()->set($table, $structure);
}
}
return $structure;
@ -714,10 +724,11 @@ class sqlsrv_native_moodle_database extends moodle_database {
/**
* Do NOT use in code, to be used by database_manager only!
* @param string|array $sql query
* @param array|null $tablenames an array of xmldb table names affected by this request.
* @return bool true
* @throws ddl_change_structure_exception A DDL specific exception is thrown for any errors.
*/
public function change_database_structure($sql) {
public function change_database_structure($sql, $tablenames = null) {
$this->get_manager(); // Includes DDL exceptions classes ;-)
$sqls = (array)$sql;
@ -728,11 +739,11 @@ class sqlsrv_native_moodle_database extends moodle_database {
$this->query_end($result);
}
} catch (ddl_change_structure_exception $e) {
$this->reset_caches();
$this->reset_caches($tablenames);
throw $e;
}
$this->reset_caches();
$this->reset_caches($tablenames);
return true;
}

View file

@ -5510,7 +5510,7 @@ class moodle_database_for_testing extends moodle_database {
protected function normalise_value($column, $value) {}
public function set_debug($state) {}
public function get_debug() {}
public function change_database_structure($sql) {}
public function change_database_structure($sql, $tablenames = null) {}
public function execute($sql, array $params=null) {}
public function get_recordset_sql($sql, array $params=null, $limitfrom=0, $limitnum=0) {}
public function get_records_sql($sql, array $params=null, $limitfrom=0, $limitnum=0) {}