MDL-15181 temp table support in ddl/dml

This commit is contained in:
skodak
2008-06-07 14:57:47 +00:00
parent b922e86b7a
commit 21a7e260fc
3 changed files with 26 additions and 1 deletions
+24
View File
@@ -88,6 +88,8 @@ class mysql_sql_generator extends sql_generator {
* @return boolean true/false
*/
public function table_exists($table, $temptable=false) {
global $CFG;
if (!$temptable) {
return parent::table_exists($table, $temptable);
}
@@ -99,16 +101,38 @@ class mysql_sql_generator extends sql_generator {
$tablename = $table->getName();
}
/// Do this function silenty (to avoid output in install/upgrade process)
$olddbdebug = $this->mdb->get_debug();
$this->mdb->set_debug(false);
$oldcfgdebug = $CFG->debug;
$CFG->debug = 0;
// ugly hack - mysql does not list temporary tables :-(
// this polutes the db log with errors :-(
// TODO: is there a better way?
if ($this->mdb->execute("DESCRIBE {".$tablename."}") === false) {
$exists = false;
} else {
$exists = true;
}
/// Re-set original debug
$this->mdb->set_debug($olddbdebug);
$CFG->debug = $oldcfgdebug;
return $exists;
}
/**
* Given one correct xmldb_table, returns the SQL statements
* to create temporary table (inside one array)
*/
public function getCreateTempTableSQL($xmldb_table) {
$sqlarr = $this->getCreateTableSQL($xmldb_table);
$sqlarr = preg_replace('/^CREATE TABLE (.*)/s', 'CREATE TEMPORARY TABLE $1 TYPE=MyISAM', $sqlarr);
return $sqlarr;
}
/**
* Given one correct xmldb_table and the new name, returns the SQL statements
* to drop it (inside one array)
+1 -1
View File
@@ -68,7 +68,7 @@ class oracle_sql_generator extends sql_generator {
*/
public function getCreateTempTableSQL($xmldb_table) {
$sqlarr = $this->getCreateTableSQL($xmldb_table);
$sqlarr = preg_replace('/^CREATE TABLE/', "CREATE GLOBAL TEMPORARY TABLE", $sqlarr);
$sqlarr = preg_replace('/^CREATE TABLE (.*)/s', 'CREATE GLOBAL TEMPORARY TABLE $1 ON COMMIT PRESERVE ROWS', $sqlarr);
return $sqlarr;
}
+1
View File
@@ -180,6 +180,7 @@ abstract class sql_generator {
/// get all tables in moodle database
$tables = $this->mdb->get_tables();
$exists = in_array($tablename, $tables);
/// Re-set original debug
$this->mdb->set_debug($olddbdebug);