コード例 #1
0
 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;
     }
 }
コード例 #2
0
 function import($request)
 {
     $result = false;
     $file = $request->postVar('importfile');
     if (!empty($file['tmp_name'])) {
         $importtype = $request->postVar('importtype');
         if ($importtype == 'auto') {
             $importtype = strtolower(substr($file['name'], -3) == '.gz') ? 'compressedsql' : 'rawsql';
         }
         switch ($importtype) {
             case 'rawsql':
                 $result = new ArrayData(DBP_Sql::execute_script(file($file['tmp_name'])));
                 break;
             case 'compressedsql':
                 $result = new ArrayData(DBP_Sql::execute_script(gzfile($file['tmp_name'])));
                 break;
         }
     }
     return $result ? $result->renderWith('DBP_Database_sql') : $this->instance->customise(array('Message' => array('type' => 'error', 'text' => 'Your file could not be imported. You might want to check if the file size exceeds ' . $this->instance->MaxFileSize() . ' which is the limit set in post_max_size and upload_max_filesize in your php.ini.')))->renderWith('DBP_Database_sql');
 }
コード例 #3
0
 function testExecuteScriptWithRollback()
 {
     // skip if adapter doesn't support transactions
     if (!DB::getConn()->supportsTransactions()) {
         return;
     }
     // mixed commands, with errors and rollback
     $script = "\r\n\t\t\tINSERT INTO \"SiteTree\" (\"Title\", \"Content\") VALUES ('DBPRollbackTest', '<p>This should be gone after rollback.</p>');\r\n\t\t\tforce error;\r\n\t\t\tUPDATE \"SiteTree\" SET \"URLSegment\" = 'rollback-1' WHERE \"Title\" = 'DBPRollbackTest';\r\n\t\t";
     $result = DBP_Sql::execute_script($script);
     $this->assertType('array', $result, 'Result is array');
     $this->assertEquals('INSERT', substr($result['Query'], 0, 6), 'Return command');
     $this->assertEquals('error', $result['Message']['type'], 'Return message with error');
     $this->assertStringEndsWith('Transaction rolled back', $result['Message']['text'], 'Message states transaction state');
     $this->assertEquals(0, DB::query("SELECT COUNT(*) FROM \"SiteTree\" WHERE \"Title\" = 'DBPRollbackTest'")->Value(), 'Make sure the transaction really got rolled back');
 }