From: stronk7 Date: Mon, 31 Aug 2009 14:23:40 +0000 (+0000) Subject: SQL generators must not execute changes in DB. Just provide the needed SQL X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=b1ca138716dc6f801cccf32ac4e7be6563e6b42d;p=moodle.git SQL generators must not execute changes in DB. Just provide the needed SQL in order to make database_manager to execute it. reset_sequence reimplemented. --- diff --git a/lib/ddl/database_manager.php b/lib/ddl/database_manager.php index 3015cf1f41..9a10dfdf23 100644 --- a/lib/ddl/database_manager.php +++ b/lib/ddl/database_manager.php @@ -109,11 +109,8 @@ class database_manager { * @return success */ public function reset_sequence($table) { - /// Calculate the name of the table - if (is_string($table)) { - $tablename = $table; - } else { - $tablename = $table->getName(); + if (!is_string($table) and !($table instanceof xmldb_table)) { + throw new ddl_exception('ddlunknownerror', NULL, 'incorrect table parameter!'); } /// Check the table exists @@ -121,7 +118,11 @@ class database_manager { throw new ddl_table_missing_exception($tablename); } - return $this->generator->reset_sequence($table); + if (!$sqlarr = $this->generator->getResetSequenceSQL($table)) { + throw new ddl_exception('ddlunknownerror', null, 'table reset sequence sql not generated'); + } + + $this->execute_sql_arr($sqlarr); } /** diff --git a/lib/ddl/mssql_sql_generator.php b/lib/ddl/mssql_sql_generator.php index ac18a7f225..ecafb15bd4 100644 --- a/lib/ddl/mssql_sql_generator.php +++ b/lib/ddl/mssql_sql_generator.php @@ -84,22 +84,21 @@ class mssql_sql_generator extends sql_generator { /** * Reset a sequence to the id field of a table. - * @param string $table name of table - * @return bool true - * @throws dml_exception if error + * @param string $table name of table or xmldb_table object + * @return array sql commands to execute */ - public function reset_sequence($table) { + public function getResetSequenceSQL($table) { + if (is_string($table)) { - $tablename = $table; - } else { - $tablename = $table->getName(); + $table = new xmldb_table($table); } + // From http://msdn.microsoft.com/en-us/library/ms176057.aspx - $value = (int)$this->mdb->get_field_sql('SELECT MAX(id) FROM {'.$tablename.'}'); + $value = (int)$this->mdb->get_field_sql('SELECT MAX(id) FROM {'. $table->getName() . '}'); if ($value == 0) { $value = 1; } - return $this->mdb->change_database_structure("DBCC CHECKIDENT ('$this->prefix$tablename', RESEED, $value)"); + return array("DBCC CHECKIDENT ('" . $this->getTableName($table) . "', RESEED, $value)"); } /** @@ -517,7 +516,7 @@ class mssql_sql_generator extends sql_generator { * TODO: Moodle 2.1 - drop in Moodle 2.1 */ public function getCheckConstraintsFromDB($xmldb_table, $xmldb_field = null) { - + $results = array(); diff --git a/lib/ddl/mysql_sql_generator.php b/lib/ddl/mysql_sql_generator.php index add0173728..8c74293dca 100644 --- a/lib/ddl/mysql_sql_generator.php +++ b/lib/ddl/mysql_sql_generator.php @@ -84,19 +84,21 @@ class mysql_sql_generator extends sql_generator { /** * Reset a sequence to the id field of a table. - * @param string $table name of table - * @return bool success + * @param string $table name of table or xmldb_table object + * @return array sql commands to execute */ - public function reset_sequence($table) { - if (is_string($table)) { - $tablename = $table; - } else { + public function getResetSequenceSQL($table) { + + if ($table instanceof xmldb_table) { $tablename = $table->getName(); + } else { + $tablename = $table; } + // From http://dev.mysql.com/doc/refman/5.0/en/alter-table.html $value = (int)$this->mdb->get_field_sql('SELECT MAX(id) FROM {'.$tablename.'}'); $value++; - return $this->mdb->change_database_structure("ALTER TABLE $this->prefix$tablename AUTO_INCREMENT = $value"); + return array("ALTER TABLE $this->prefix$tablename AUTO_INCREMENT = $value"); } diff --git a/lib/ddl/oracle_sql_generator.php b/lib/ddl/oracle_sql_generator.php index 207d0d7497..5ead21d8bc 100644 --- a/lib/ddl/oracle_sql_generator.php +++ b/lib/ddl/oracle_sql_generator.php @@ -66,11 +66,11 @@ class oracle_sql_generator extends sql_generator { /** * Reset a sequence to the id field of a table. - * @param string $table name of table - * @return bool true - * @throws dml_exception if error + * @param string $table name of table or xmldb_table object + * @return array sql commands to execute */ - public function reset_sequence($table) { + public function getResetSequenceSQL($table) { + if (is_string($table)) { $tablename = $table; $xmldb_table = new xmldb_table($tablename); @@ -89,8 +89,8 @@ class oracle_sql_generator extends sql_generator { $seqname = $this->getNameForObject($table, 'id', 'seq'); } - $this->mdb->change_database_structure("DROP SEQUENCE $seqname"); - return $this->mdb->change_database_structure("CREATE SEQUENCE $seqname START WITH $value INCREMENT BY 1 NOMAXVALUE"); + return array ("DROP SEQUENCE $seqname", + "CREATE SEQUENCE $seqname START WITH $value INCREMENT BY 1 NOMAXVALUE"); } diff --git a/lib/ddl/postgres_sql_generator.php b/lib/ddl/postgres_sql_generator.php index 74f238fda8..19c83d1d86 100644 --- a/lib/ddl/postgres_sql_generator.php +++ b/lib/ddl/postgres_sql_generator.php @@ -63,20 +63,21 @@ class postgres_sql_generator extends sql_generator { /** * Reset a sequence to the id field of a table. - * @param string $table name of table - * @return bool true - * @throws dml_exception if error + * @param string $table name of table or xmldb_table object + * @return array sql commands to execute */ - public function reset_sequence($table) { - if (is_string($table)) { - $tablename = $table; - } else { + public function getResetSequenceSQL($table) { + + if ($table instanceof xmldb_table) { $tablename = $table->getName(); + } else { + $tablename = $table; } + // From http://www.postgresql.org/docs/7.4/static/sql-altersequence.html $value = (int)$this->mdb->get_field_sql('SELECT MAX(id) FROM {'.$tablename.'}'); $value++; - return $this->mdb->change_database_structure("ALTER SEQUENCE $this->prefix{$tablename}_id_seq RESTART WITH $value"); + return array("ALTER SEQUENCE $this->prefix{$tablename}_id_seq RESTART WITH $value"); } /** diff --git a/lib/ddl/simpletest/testddl.php b/lib/ddl/simpletest/testddl.php index 94393e2959..b0e5069ad7 100755 --- a/lib/ddl/simpletest/testddl.php +++ b/lib/ddl/simpletest/testddl.php @@ -1299,18 +1299,24 @@ class ddl_test extends UnitTestCase { $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); $table->add_field('course', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0'); $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); + + // Drop if exists + if ($dbman->table_exists($table)) { + $dbman->drop_table($table); + } $dbman->create_table($table); - $this->tables[$table->getName()] = $table; + $tablename = $table->getName(); + $this->tables[$tablename] = $table; $record = (object)array('id'=>666, 'course'=>10); $DB->import_record('testtable', $record); $DB->delete_records('testtable'); - $this->assertTrue($dbman->reset_sequence('testtable')); + $dbman->reset_sequence($table); // using xmldb object $this->assertEqual(1, $DB->insert_record('testtable', (object)array('course'=>13))); $DB->import_record('testtable', $record); - $this->assertTrue($dbman->reset_sequence('testtable')); + $dbman->reset_sequence($tablename); // using string $this->assertEqual(667, $DB->insert_record('testtable', (object)array('course'=>13))); $dbman->drop_table($table); diff --git a/lib/ddl/sql_generator.php b/lib/ddl/sql_generator.php index 4b6dc5471b..4e5ec8959a 100644 --- a/lib/ddl/sql_generator.php +++ b/lib/ddl/sql_generator.php @@ -185,7 +185,7 @@ abstract class sql_generator { * @param string $table name of table * @return success */ - public abstract function reset_sequence($tablename); + public abstract function getResetSequenceSQL($tablename); /** * This function will return the SQL code needed to create db tables and statements diff --git a/lib/ddl/sqlite_sql_generator.php b/lib/ddl/sqlite_sql_generator.php index 8850c1f0c6..31b0eb7969 100644 --- a/lib/ddl/sqlite_sql_generator.php +++ b/lib/ddl/sqlite_sql_generator.php @@ -74,18 +74,18 @@ class sqlite_sql_generator extends sql_generator { /** * Reset a sequence to the id field of a table. - * @param string $table name of table + * @param string $table name of table or xmldb_object * @return bool success */ - public function reset_sequence($table) { - if (is_string($table)) { - $tablename = $table; - } else { - $tablename = $table->getName(); + public function getResetSequenceSQL($table) { + + if ($table instanceof xmldb_table) { + $table = $table->getName(); } + // From http://sqlite.org/autoinc.html $value = (int)$this->mdb->get_field_sql('SELECT MAX(id) FROM {'.$tablename.'}'); - return $this->mdb->change_database_structure("UPDATE sqlite_sequence SET seq=$value WHERE name='$this->prefix$tablename'"); + return array("UPDATE sqlite_sequence SET seq=$value WHERE name='$this->prefix$tablename'"); } /**