require "cgi" class Result < ApplicationRecord belongs_to :snippet belongs_to :compiler enum result: [:success, :failed, :errored, :timedout, :running] def finished? !running? end def parse_output orig = output.b ret = [] while orig.bytesize > 0 fd, len = orig.slice!(0, 8).unpack("ii") p [fd, len] if !truncated? && (!len || orig.bytesize < len) p orig p output.b raise "output is too short" end ret << [fd, orig.slice!(0, len)] end ret end def formatted_output s = "".b last_c = nil parse_output.each { |fd, c| if fd == 1 s << CGI.escapeHTML(c) else s << "" << CGI.escapeHTML(c) << "" end last_c = c } if truncated? s << "#truncated#" elsif last_c && last_c[-1] != "\n" s << "%" end if error.present? s << "" << CGI.escapeHTML(error) << "" end s.html_safe end def self.prepare_execution(compiler, snippet) # kuso r = Result.find_by(snippet: snippet, compiler: compiler) if r r.update(output: "", status: -1, result: :running) else r = Result.create!(snippet: snippet, compiler: compiler, output: "", status: -1, result: :running) end r end end