107 lines
2.8 KiB
Ruby
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
|