From: skodak Date: Sat, 7 Jun 2008 14:57:47 +0000 (+0000) Subject: MDL-15181 temp table support in ddl/dml X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=21a7e260fc9535055f6595c618f5aef66ab4ab56;p=moodle.git MDL-15181 temp table support in ddl/dml --- diff --git a/lib/ddl/mysql_sql_generator.php b/lib/ddl/mysql_sql_generator.php index 608e2c6db1..df6cd7d818 100644 --- a/lib/ddl/mysql_sql_generator.php +++ b/lib/ddl/mysql_sql_generator.php @@ -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) diff --git a/lib/ddl/oracle_sql_generator.php b/lib/ddl/oracle_sql_generator.php index a7287d84bc..7579579901 100644 --- a/lib/ddl/oracle_sql_generator.php +++ b/lib/ddl/oracle_sql_generator.php @@ -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; } diff --git a/lib/ddl/sql_generator.php b/lib/ddl/sql_generator.php index bef24fda11..958e583406 100644 --- a/lib/ddl/sql_generator.php +++ b/lib/ddl/sql_generator.php @@ -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);