From 401793a36d2d6d9b8233da54b91870fe0d837852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20=C5=A0koda?= Date: Sun, 1 Jul 2012 13:30:59 +0200 Subject: [PATCH 1/6] MDL-34130 fix data inserts in recordset tests --- lib/dml/tests/dml_test.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/dml/tests/dml_test.php b/lib/dml/tests/dml_test.php index e431b91e09f..fcbffcefd3e 100644 --- a/lib/dml/tests/dml_test.php +++ b/lib/dml/tests/dml_test.php @@ -921,12 +921,12 @@ class dml_testcase extends database_driver_testcase { $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); $dbman->create_table($table); - $data = array(array('id' => 1, 'course' => 3, 'name' => 'record1', 'onetext'=>'abc'), - array('id' => 2, 'course' => 3, 'name' => 'record2', 'onetext'=>'abcd'), - array('id' => 3, 'course' => 5, 'name' => 'record3', 'onetext'=>'abcde')); + $data = array(array('course' => 3, 'name' => 'record1', 'onetext'=>'abc'), + array('course' => 3, 'name' => 'record2', 'onetext'=>'abcd'), + array('course' => 5, 'name' => 'record3', 'onetext'=>'abcde')); - foreach ($data as $record) { - $DB->insert_record($tablename, $record); + foreach ($data as $key=>$record) { + $data[$key]['id'] = $DB->insert_record($tablename, $record); } // standard recordset iteration @@ -1009,11 +1009,11 @@ class dml_testcase extends database_driver_testcase { $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); $dbman->create_table($table); - $data = array(array('id'=> 1, 'course' => 3, 'name' => 'record1'), - array('id'=> 2, 'course' => 3, 'name' => 'record2'), - array('id'=> 3, 'course' => 5, 'name' => 'record3')); - foreach ($data as $record) { - $DB->insert_record($tablename, $record); + $data = array(array('course' => 3, 'name' => 'record1'), + array('course' => 3, 'name' => 'record2'), + array('course' => 5, 'name' => 'record3')); + foreach ($data as $key=>$record) { + $data[$key]['id'] = $DB->insert_record($tablename, $record); } // Test repeated numeric keys are returned ok From 541ca062f146b22cf667bd9629fd33bedccfa062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20=C5=A0koda?= Date: Sun, 1 Jul 2012 13:34:22 +0200 Subject: [PATCH 2/6] MDL-34130 test nested recordset iteration --- lib/dml/tests/dml_test.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/dml/tests/dml_test.php b/lib/dml/tests/dml_test.php index fcbffcefd3e..acecb7b27c0 100644 --- a/lib/dml/tests/dml_test.php +++ b/lib/dml/tests/dml_test.php @@ -990,6 +990,22 @@ class dml_testcase extends database_driver_testcase { $this->assertEquals($e->errorcode, 'textconditionsnotallowed'); } + // Test nested iteration. + $rs1 = $DB->get_recordset($tablename); + $i = 0; + foreach($rs1 as $record1) { + $rs2 = $DB->get_recordset($tablename); + $i++; + $j = 0; + foreach($rs2 as $record2) { + $j++; + } + $rs2->close(); + $this->assertEquals($j, count($data)); + } + $rs1->close(); + $this->assertEquals($i, count($data)); + // notes: // * limits are tested in test_get_recordset_sql() // * where_clause() is used internally and is tested in test_get_records() From e1defa2ed564b05daa4853dd77dc7f1f1e0c1f08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20=C5=A0koda?= Date: Sun, 1 Jul 2012 13:43:55 +0200 Subject: [PATCH 3/6] MDL-34130 test interaction of recordsets and transactions --- lib/dml/tests/dml_test.php | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/lib/dml/tests/dml_test.php b/lib/dml/tests/dml_test.php index acecb7b27c0..15b52f24633 100644 --- a/lib/dml/tests/dml_test.php +++ b/lib/dml/tests/dml_test.php @@ -4144,6 +4144,42 @@ class dml_testcase extends database_driver_testcase { $this->assertEquals(0, $DB->count_records($tablename)); // finally rolled back $DB->delete_records($tablename); + + // Test interactions of recordset and transactions - this causes problems in SQL Server. + $table2 = $this->get_test_table('2'); + $tablename2 = $table2->getName(); + + $table2->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); + $table2->add_field('course', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0'); + $table2->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); + $dbman->create_table($table2); + + $DB->insert_record($tablename, array('course'=>1)); + $DB->insert_record($tablename, array('course'=>2)); + $DB->insert_record($tablename, array('course'=>3)); + + $DB->insert_record($tablename2, array('course'=>5)); + $DB->insert_record($tablename2, array('course'=>6)); + $DB->insert_record($tablename2, array('course'=>7)); + $DB->insert_record($tablename2, array('course'=>8)); + + $rs1 = $DB->get_recordset($tablename); + $i = 0; + foreach ($rs1 as $record1) { + $i++; + $rs2 = $DB->get_recordset($tablename2); + $j = 0; + foreach ($rs2 as $record2) { + $t = $DB->start_delegated_transaction(); + $DB->set_field($tablename, 'course', $record1->course+1, array('id'=>$record1->id)); + $DB->set_field($tablename2, 'course', $record2->course+1, array('id'=>$record2->id)); + $t->allow_commit(); + $j++; + } + $this->assertEquals(4, $j); + } + $rs1->close(); + $this->assertEquals(3, $i); } function test_transactions_forbidden() { From 4993d5fe00cfc0e4dd59d2ec7249898b1f8cc917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20=C5=A0koda?= Date: Sun, 1 Jul 2012 21:00:16 +0200 Subject: [PATCH 4/6] MDL-34130 add missing rs close Thanks Eloy! --- lib/dml/tests/dml_test.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/dml/tests/dml_test.php b/lib/dml/tests/dml_test.php index 15b52f24633..652d0222b44 100644 --- a/lib/dml/tests/dml_test.php +++ b/lib/dml/tests/dml_test.php @@ -4176,6 +4176,7 @@ class dml_testcase extends database_driver_testcase { $t->allow_commit(); $j++; } + $rs2->close(); $this->assertEquals(4, $j); } $rs1->close(); From 3b5f6e6c2aa770e9183d1069fef5f4e06a10563a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20=C5=A0koda?= Date: Sun, 1 Jul 2012 21:35:37 +0200 Subject: [PATCH 5/6] MDL-34130 test recordset data is static We do not want recordset results to be affected by subsequent update or delete queries. --- lib/dml/tests/dml_test.php | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/lib/dml/tests/dml_test.php b/lib/dml/tests/dml_test.php index 652d0222b44..90994452396 100644 --- a/lib/dml/tests/dml_test.php +++ b/lib/dml/tests/dml_test.php @@ -1011,6 +1011,58 @@ class dml_testcase extends database_driver_testcase { // * where_clause() is used internally and is tested in test_get_records() } + public function test_get_recordset_static() { + $DB = $this->tdb; + $dbman = $DB->get_manager(); + + $table = $this->get_test_table(); + $tablename = $table->getName(); + + $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')); + $dbman->create_table($table); + + $DB->insert_record($tablename, array('course' => 1)); + $DB->insert_record($tablename, array('course' => 2)); + $DB->insert_record($tablename, array('course' => 3)); + $DB->insert_record($tablename, array('course' => 4)); + + $rs = $DB->get_recordset($tablename, array(), 'id'); + + $DB->set_field($tablename, 'course', 666, array('course'=>1)); + $DB->delete_records($tablename, array('course'=>2)); + + $i = 0; + foreach($rs as $record) { + $i++; + $this->assertEquals($i, $record->course); + } + $rs->close(); + $this->assertEquals(4, $i); + + // Now repeat with limits because it may use different code. + $DB->delete_records($tablename, array()); + + $DB->insert_record($tablename, array('course' => 1)); + $DB->insert_record($tablename, array('course' => 2)); + $DB->insert_record($tablename, array('course' => 3)); + $DB->insert_record($tablename, array('course' => 4)); + + $rs = $DB->get_recordset($tablename, array(), 'id', '*', 0, 3); + + $DB->set_field($tablename, 'course', 666, array('course'=>1)); + $DB->delete_records($tablename, array('course'=>2)); + + $i = 0; + foreach($rs as $record) { + $i++; + $this->assertEquals($i, $record->course); + } + $rs->close(); + $this->assertEquals(3, $i); + } + public function test_get_recordset_iterator_keys() { $DB = $this->tdb; $dbman = $DB->get_manager(); From c56cdae977e67068d65478f5cb7ebc42190307c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20=C5=A0koda?= Date: Sun, 1 Jul 2012 21:50:36 +0200 Subject: [PATCH 6/6] MDL-34130 prevent some warning in PHPStorm --- lib/dml/tests/dml_test.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/dml/tests/dml_test.php b/lib/dml/tests/dml_test.php index 90994452396..a5ad8c25010 100644 --- a/lib/dml/tests/dml_test.php +++ b/lib/dml/tests/dml_test.php @@ -308,6 +308,7 @@ class dml_testcase extends database_driver_testcase { function test_fix_sql_params() { $DB = $this->tdb; + $prefix = $DB->get_prefix(); $table = $this->get_test_table(); $tablename = $table->getName(); @@ -315,13 +316,13 @@ class dml_testcase extends database_driver_testcase { // Correct table placeholder substitution $sql = "SELECT * FROM {{$tablename}}"; $sqlarray = $DB->fix_sql_params($sql); - $this->assertEquals("SELECT * FROM {$DB->get_prefix()}".$tablename, $sqlarray[0]); + $this->assertEquals("SELECT * FROM {$prefix}".$tablename, $sqlarray[0]); // Conversions of all param types $sql = array(); - $sql[SQL_PARAMS_NAMED] = "SELECT * FROM {$DB->get_prefix()}testtable WHERE name = :param1, course = :param2"; - $sql[SQL_PARAMS_QM] = "SELECT * FROM {$DB->get_prefix()}testtable WHERE name = ?, course = ?"; - $sql[SQL_PARAMS_DOLLAR] = "SELECT * FROM {$DB->get_prefix()}testtable WHERE name = \$1, course = \$2"; + $sql[SQL_PARAMS_NAMED] = "SELECT * FROM {$prefix}testtable WHERE name = :param1, course = :param2"; + $sql[SQL_PARAMS_QM] = "SELECT * FROM {$prefix}testtable WHERE name = ?, course = ?"; + $sql[SQL_PARAMS_DOLLAR] = "SELECT * FROM {$prefix}testtable WHERE name = \$1, course = \$2"; $params = array(); $params[SQL_PARAMS_NAMED] = array('param1'=>'first record', 'param2'=>1);