* This function will execute an array of SQL commands.
*
* @param string[] $sqlarr Array of sql statements to execute.
+ * @param array|null $tablenames an array of xmldb table names affected by this request.
* @throws ddl_change_structure_exception This exception is thrown if any error is found.
*/
- protected function execute_sql_arr(array $sqlarr) {
- $this->mdb->change_database_structure($sqlarr);
+ protected function execute_sql_arr(array $sqlarr, $tablenames = null) {
+ $this->mdb->change_database_structure($sqlarr, $tablenames);
}
/**
public function reset_sequence($table) {
if (!is_string($table) and !($table instanceof xmldb_table)) {
throw new ddl_exception('ddlunknownerror', NULL, 'incorrect table parameter!');
+ } else {
+ if ($table instanceof xmldb_table) {
+ $tablename = $table->getName();
+ } else {
+ $tablename = $table;
+ }
}
// Do not test if table exists because it is slow
throw new ddl_exception('ddlunknownerror', null, 'table reset sequence sql not generated');
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($tablename));
}
/**
if (!$sqlarr = $this->generator->getDropTableSQL($xmldb_table)) {
throw new ddl_exception('ddlunknownerror', null, 'table drop sql not generated');
}
-
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
if (!$sqlarr = $this->generator->getCreateStructureSQL($xmldb_structure)) {
return; // nothing to do
}
- $this->execute_sql_arr($sqlarr);
+
+ $tablenames = array();
+ foreach ($xmldb_structure as $xmldb_table) {
+ if ($xmldb_table instanceof xmldb_table) {
+ $tablenames[] = $xmldb_table->getName();
+ }
+ }
+ $this->execute_sql_arr($sqlarr, $tablenames);
}
/**
if (!$sqlarr = $this->generator->getCreateTableSQL($xmldb_table)) {
throw new ddl_exception('ddlunknownerror', null, 'table create sql not generated');
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
if (!$sqlarr = $this->generator->getCreateTempTableSQL($xmldb_table)) {
throw new ddl_exception('ddlunknownerror', null, 'temp table create sql not generated');
}
-
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
if (!$sqlarr = $this->generator->getAddFieldSQL($xmldb_table, $xmldb_field)) {
throw new ddl_exception('ddlunknownerror', null, 'addfield sql not generated');
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
throw new ddl_exception('ddlunknownerror', null, 'drop_field sql not generated');
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
return; // probably nothing to do
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
return; //Empty array = nothing to do = no error
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
return; //Empty array = nothing to do = no error
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
return; //Empty array = nothing to do = no error
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
return; //Empty array = nothing to do = no error
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
throw new ddl_exception('ddlunknownerror', null, 'Some DBs do not support key renaming (MySQL, PostgreSQL, MsSQL). Rename skipped');
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
throw new ddl_exception('ddlunknownerror', null, 'add_index sql not generated');
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
throw new ddl_exception('ddlunknownerror', null, 'drop_index sql not generated');
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
throw new ddl_exception('ddlunknownerror', null, 'Some DBs do not support index renaming (MySQL). Rename skipped');
}
- $this->execute_sql_arr($sqlarr);
+ $this->execute_sql_arr($sqlarr, array($xmldb_table->getName()));
}
/**
$tablename = $table->getName();
}
+ if ($this->temptables->is_temptable($tablename)) {
+ return true;
+ }
+
// Get all tables in moodle database.
$tables = $this->mdb->get_tables();
-
return isset($tables[$tablename]);
}
/**
* 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;
+ }
}
/**
/**
* 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.
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;
+ }
}
}
$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;
/**
* 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;
$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;
}
* @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;
+ }
}
}
}
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;
/**
* 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);
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;
}
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;
+ }
}
}
}
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;
/**
* 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;
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;
}
/**
* 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;
$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;
}
*/
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;
+ }
}
}
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;
/**
* 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);
$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;
}
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;
+ }
}
}
}
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;
*/
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;
+ }
}
}
$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;
/**
* 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;
$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;
}
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) {}