compare-code/app/models/solution.rb

107 lines
2.8 KiB
Ruby

#coding=utf-8
#
require 'json'
require "net/http"
require 'base64'
class Solution < ActiveRecord::Base
include Judge::Helper
attr_accessible :errmsg, :memory_used, :question, :result, :src, :status, :time_used, :student_work_id, :language
belongs_to :question
validates :src, :student_work_id, presence: true
def status_to_s
case status
when -1
'编译出错'
when -2
'答题错误'
when -3
'答案错误'
when 1
'运行出错'
when 2
'超时'
when 3
'内存超出'
when 4
'输出超出'
when 5
'禁用函数'
when 6
'其他错误'
when 0
'成功'
else
'未知错误'
end
end
def work()
@solution = self
i = 0
src = Base64.decode64(@solution.src)
src = src.force_encoding('UTF-8')
compile_result = compile(src, @solution.language)
body = {student_work_id: @solution.student_work_id, results: []}
unless compile_result
body[:compile_error_msg] = @compiler.errmsg
end
@solution.question.input.each do |input|
output = @solution.question.output[i]
if compile_result
rs,option,time_used,memory_used = run(input)
logger.debug "rs #{rs}, option #{option} time_used #{time_used} memory_used #{memory_used}"
@solution.memory_used = memory_used
@solution.time_used = time_used
@solution.result = rs
@solution.output = @executor.result
logger.debug "result #{@solution.output} output #{output} input #{input}"
if rs==0
@solution.status = -2
else
@solution.status = rs
end
if rs==0 && cmp(@solution.output, output)
@solution.status = 0
end
else
@solution.errmsg = @compiler.errmsg
@solution.status = -1
end
i += 1
body[:results] << {input: input,
output: output,
memory_used: @solution.memory_used,
time_used: @solution.time_used,
result: @solution.output,
status: @solution.status}
end
@solution.save!
puts body
post_result(body.to_json)
end
### handle_asynchronously :work, :queue => 'compile'
private
def post_result(body)
#uri = URI('http://192.168.80.76:8080/student_work/set_program_score.json')
#uri = URI('http://192.168.80.11:8080/student_work/set_program_score.json')
uri = URI('http://192.168.80.168:8080/student_work/set_program_score.json')
res = Net::HTTP.new(uri.host, uri.port).start do |client|
request = Net::HTTP::Post.new(uri.path)
request.body = body
request["Content-Type"] = "application/json"
client.request(request)
end
logger.info res.body
end
end