# @copyright (c) 2010 Nicolo John Davis
# @license http://opensource.org/licenses/gpl-license.php GNU Public License
# This file polls the database, extracts all the 'new' submissions
# and offloads them to the worker to process one by one
from django.core.management import setup_environ
import settings
setup_environ(settings)
from djangojudge.onj.models import Submission
import time, sys, shutil, os, os.path
from datetime import datetime
WORKER_DIRECTORY = os.path.abspath('worker')
verdict = ['accepted', 'compile', 'wrong', 'time', 'invalid']
def process_submisson(submission):
shutil.copy(submission.sourcefile.path, os.path.join(WORKER_DIRECTORY, 'src'))
shutil.copy(submission.sourcefile.path, os.path.join(WORKER_DIRECTORY, 'exec'))
shutil.copy(submission.problem.inputfile.path, os.path.join(WORKER_DIRECTORY, 'io/in'))
shutil.copy(submission.problem.outputfile.path, os.path.join(WORKER_DIRECTORY, 'io/out'))
id = submission.pk
time_limit = submission.problem.time_limit
str = '({0}, Problem {1})'.format(submission.user.username, submission.problem.problem_id)
print '[ %s ] #%d Processing %s' % (datetime.now(), id, str)
cwd = os.getcwd()
os.chdir(WORKER_DIRECTORY)
try:
v = os.system('./worker.py %s %d' % (os.path.basename(submission.sourcefile.name), time_limit))
# ATTENTION: This needs to be done in a cleaner way
v = v / (2**8)
print '[ %s ] #%d Verdict (%s)' % (datetime.now(), id, verdict[v])
submission.status = verdict[v]
submission.save()
except Exception, err:
print 'JUDGE: %s' % err
time.sleep(1)
os.chdir(cwd)
def poll_database():
new_submissions = Submission.objects.filter(status='new').order_by('time')
for submission in new_submissions:
process_submisson(submission)
if __name__ == '__main__':
while True:
try:
poll_database()
time.sleep(1)
except (KeyboardInterrupt, SystemExit):
print 'Exitting'
sys.exit(0)
except Exception, err:
print 'ERROR: %s' % err
time.sleep(1)