static function execute_script($queries) { @ini_set('max_execution_time', '0'); $queries = DBP_Sql::split_script($queries); switch (count($queries)) { case 0: return array(); case 1: $query = new DBP_Sql($queries[0]); $records = $query->execute(); return $records; default: $status = 'highlight'; if (DB::getConn()->supportsTransactions()) { DB::getConn()->startTransaction(); } foreach ($queries as $query) { $query = new DBP_Sql($query); $result = $query->execute(); if ($result['Message']['type'] == 'error') { $msg[] = $result['Query'] . '<br />' . $result['Message']['text']; $status = 'error'; break; } $msg[] = $query->type() . ' ' . ($result['Message']['text'] ? $result['Message']['text'] : 'no error'); } if (DB::getConn()->supportsTransactions()) { if ($status == 'error') { DB::getConn()->transactionRollback(); $msg[] = 'Transaction rolled back'; } else { DB::getConn()->endTransaction(); } } $result = array('Query' => implode("\r\n", $queries), 'Message' => array('text' => implode("<br />\n", $msg), 'type' => $status)); return $result; } }
function testSplitScript() { $script = "SELECT * FROM \"SiteTree\""; $commands = DBP_Sql::split_script($script); $this->assertType('array', $commands, 'Result is array'); $script = " \n SELECT * FROM \"SiteTree\"\r\n ; "; $commands = DBP_Sql::split_script($script); $this->assertEquals(1, count($commands), 'Return only one command'); $this->assertEquals(trim($script), $commands[0], 'Return correct command'); $script = "SELECT * FROM \"SiteTree\"\r\n WHERE \"ID\" > 15;\nUPDATE \"File\" SET \"Name\" = 'somename' WHERE \"ID\" = 79; insert into ErrorPage (ID) values ('79')"; $commands = DBP_Sql::split_script($script); $this->assertEquals(3, count($commands), 'Return all 3 commands'); $this->assertEquals("insert into ErrorPage (ID) values ('79');", $commands[2], 'Split commands corrctly'); $script = "SELECT * FROM \"SiteTree\"\r\n WHERE \"Content\" LIKE '%;%'; INSERT INTO \"SiteTree\" (\"Content\") values ('\nUPDATE \"File\" SET \"Name\" = 'somename' WHERE \"ID\" = 79;\n')"; $commands = DBP_Sql::split_script($script); $this->assertEquals(2, count($commands), 'Return only 2 commands'); $this->assertEquals("SELECT", substr($commands[0], 0, 6), 'Don\'t split on ; when inside quotes'); $this->assertEquals("INSERT", substr($commands[1], 0, 6), 'Don\'t split if command is inside quotes'); $specialcharacters = DBP_SQLDialect::get()->escape("\\';"); $script = "SELECT * FROM \"SiteTree\" WHERE \"Content\" LIKE 'Some text {$specialcharacters} and some more'"; $commands = DBP_Sql::split_script($script); $this->assertEquals(1, count($commands), 'Return only 1 commands'); }