Запись о посылке в таблице

From EjudgeWiki

Навигация: Главная страница/Система ejudge/Использование/Внутренние файлы/Запись о посылке в таблице

Формат одной записи описывается следующей структурой данных на языке Си. Как было сказано выше, размер такой структуры на архитектуре Linux-ix86 равен 64 байтам.

struct run_entry
{
 int            submission;
 time_t         timestamp;
 size_t         size;
 unsigned long  ip;
unsigned long  sha1[5];
 int            team;
 int            problem;
 int            score;
 signed char    locale_id;
 unsigned char  language;
 unsigned char  status;
 signed char    test;
 unsigned char  is_imported;
 unsigned char  variant;
 unsigned char  is_hidden;
 unsigned char  is_readonly;
 unsigned char  pages;
 unsigned char  pad[3];
 long           nsec;
};

Здесь используются предположения о размере и размещении целых типов, справедливые для архитектуры Linux-ix86. Далее даётся подробное описание назначения каждого из полей структуры.

Поле submission хранит номер посылки. Каждая посылка нумеруется от 0 и до некоторого максимального значения. Дисциплина хранения файлов с исходным текстом программы и протоколов тестирования посылки в настоящее время такова, что максимальный номер посылки не может превышать 100000. Номер посылки должен быть проставлен для всех записей в базе посылок, даже для записей со статусом EMPTY, при этом номер посылки должен совпадать с расположением структуры соответствующей посылки в файле. Так, непосредственно за заголовком файла должна идти посылка с номером 0, затем посылка с номером 1 и т. д. Пропуски в последовательной нумерации посылок не допускаются. Посылки должны размещаться в файле посылок в строго возрастающем порядке.

Поле timestamp содержит время приёма данной посылки сервером турнира serve. Время хранится во внутреннем формате Unix-систем, то есть как число секунд, прошедших с 1 января 1970 года. Все посылки в файле посылок должны быть упорядочены в порядке неубывания их времени приёма за исключением записи со статусом EMPTY. Время приёма посылки может быть меньше времени начала турнира или больше времени конца турнира только для посылок, у которых поле is_hidden установлено в true. Для записи в базе посылок со статусом EMPTY значение данного поля должно быть равным 0.

Поле nsec содержит наносекундную компоненту времени приёма данной посылки сервером турнира. Данное поле может принимать значения в интервале от 0 до 999999999. Для каждой посылки в турнире полное время её приёма (то есть время, включающее как секундную, так и наносекундную компоненты) уникально. Посылки в базе посылок всегда упорядочиваются по полному времени приёма посылки. Данное поле введено в ejudge версии 2.1.27, для турниров, обслуживаемых предыдущей версией системы, наносекундная компонента времени всегда равна нулю. Формат журнала посылки совместим снизу вверх и сверху вниз, то есть для ejudge младших версий поле nsec будет проигнорировано, а для ejudge старших версий значение поля nsec по умолчанию будет установлено в 0.

Поле size содержит размер исходного файла программы в байтах. Протокол взаимодействия CGI-программы и сервера турнира накладывает ограничения на максимальный размер программы. Кроме того, CGI-программы master, judge, team не принимают данные от веб-браузера по методу POST, если размер данных превышает ? кб. Кроме того, максимальный размер принимаемых на проверку программ может быть установлен в глобальной конфигурационной переменной max_run_size конфигурационного файла сервера турнира serve.cfg. Значение этой переменной по умолчанию устанавливается в 65535 байтов, но не может превышать ограничения на приём данных по методу POST и ограничения протокола. Для записей в базе посылок со статусом EMPTY, VSTART или VSTOP поле size должно содержать 0.

Обратите внимание, что текущая версия системы ejudge передаёт программу как одну си-строку, то есть как последовательность байт, в которой нулевой байт означает конец строки. Поэтому в настоящее время не поддерживаются нулевые символы в тексте программы, а также сдача программ в каком-либо бинарном (или архивном) формате.

Поле ip содержит IP-адрес (IPV4) хоста, с которого с помощью веб-браузера было отослано решение. Старший байт поля IP-адреса в данной структуре содержит первый октет IP-адреса в точечной нотации. Таким образом IP-адрес хранится в локальном (а не сетевом) порядке байт в слове. Для записи в базе посылок со статусом EMPTY данное поле должно содержать значение 0.

Поле sha1 содержит контрольную сумму исходного текста программы, вычисляемую по алгоритму SHA1. Этот алгоритм любой последовательности байт ставит в соответствие 160-битное число, при этом вероятность коллизии крайне мала. Если два файла имеют одинаковую контрольную сумму SHA1, они с вероятностью близкой к единице идентичны. Для записей в базе посылок со статусом EMPTY, VSTART или VSTOP данное поле должно содержать нулевую контрольную сумму.

Контрольная сумма используется для того, чтобы автоматически выявлять дубликаты посылок. Таковыми считаются посылки, у которых совпадают IP-адрес, размер, контрольная сумма, идентификатор участника, идентификатор задачи и идентификатор языка программирования. Дубликаты посылок не проверяются и им немедленно присваивается статус “Ignored”. Дубликаты посылок могут возникать, если пользователь после посылки решения на проверку, не дождавшись подтверждения о её получении, нажимает кнопку браузера “Refresh”.

Поле team хранит идентификатор пользователя, от имени которого выполнена данная посылка. Идентификатор пользователя представляет собой положительное целое число (идентификатор пользователя 0 является недопустимым). Текущая версия системы ejudge накладывает верхнее ограничение на идентификатор пользователя, равное 100000. Для записи в базе посылок со статусом EMPTY данное поле должно содержать значение 0.

Поле problem хранит идентификатор задачи. Идентификатор задачи представляет собой целое число, большее нуля (0 как идентификатор задачи недопустим). Система ejudge накладывает верхнее ограничение на идентификатор задачи, равное максимальному числу задач, которые могут быть определены в одном турнире. В настоящее время это число равно 100 задачам. Идентификатор задачи в записи базы посылок должен соответствовать идентификатору какой-либо задачи в конфигурационном файле турнира serve.cfg. Идентификатор задачи можно установить явно с помощью конфигурационной переменной id раздела описания задачи этого файла.

Поле score хранит количество баллов, полученное при тестировании данной посылки, без учёта штрафов за повторные посылки. Это поле используется только в режимах турнира KIROV и OLYMPIAD. Количество баллов представляет собой неотрицательное целое число. Значение −1 данного поля задаёт неопределённое значение, которое отображается в журнале посылок как N/A. Максимальное число баллов в текущей версии установлено в 100000.

Поле locale_id хранит идентификатор языкового окружения, установленный в клиенте team в момент отправки посылки. Идентификатор языкового окружения представляет собой неотрицательное целое число от 0 до 127. Значение −1 поля locale_id задаёт «неопределённое» значение. В этом случае программы serve и run используют значения по умолчанию (в настоящее время 0). Идентификатор языкового окружения используется программой run при генерации пользовательского протокола тестирования.

В настоящее время система ejudge поддерживает два языковых окружения: английское (идентификатор 0) и русское (идентификатор 1). В обоих случаях используется кодировка koi8-r.

Поле language хранит идентификатор языка программирования, на котором написана посылаемая программа. Идентификатор языка программирования представляет собой целое число в интервале от 0 до 255. Идентификатор языка программирования в записи базы посылок должен соответствовать идентификатору какого-либо языка программирования в конфигурационном файле турнира serve.cfg. Идентификатор языка программирования для некоторого языка можно установить явно с помощью конфигурационной переменной id раздела описания языка программирования этого файла.

Поле status хранит статус посылки. Статус посылки подробно рассматривается в таблице Допустимые статусы посылок.

Поле test хранит либо минимальный номер теста, на котором программа дала неверный ответ (для турниров по системе ACM), либо количество тестов, на которых программа дала правильный ответ (для турниров по системе KIROV или OLYMPIAD).

Для турниров по системе ACM если значение данного поля ≤ 0, то минимальный номер теста не определён (в случаях, когда статус посылки допускает это, например, при статусе “Compilation error”). Для турниров по системам KIROV или OLYMPIAD значение данного поля, не большее 0 также означает, что количество тестов, на которых программа дала правильный ответ, не определено. Если для турниров по этим системам поле test хранит положительное значение, то оно на 1 больше количества успешно пройденных тестов. Например, если решение дало правильный ответ на 3 тестах, в базе посылок в поле test хранится значение 4.

Поле is_imported хранит признак проимпортированной посылки. Поле может принимать два значения: 0 и 1, соответствующие булевским значениям false и true. У посылки устанавливается этот флаг при импорте в базу посылок внешнего XML-файла с посылками, если импортируемой посылке не соответствует никакая локальная посылка. В текущей версии системы ejudge при импорте базы посылок не импортируется исходный код программы посылки, а также протоколы тестирования. Поэтому при работе с посылкой, у которой поле is_imported установлено в true предполагается, что ни исходного файла, ни файлов протоколов тестирования в архивах турнира не существует. Как следствие, такие посылки не могут быть пересужены с помощью кнопок “Rejudge” интерфейса администратора турнира. При необходимости нужный статус посылки должен быть выставлен вручную. Обратите внимание, что результаты редактирования проимпортированной посылки могут потеряться при очередном импорте, если эта посылка в импортируемом XML-файле помечена как «авторитетная».

Поле variant хранит номер варианта задачи. Для невариантных задач данное поле не используется. Для вариантных задач данное поле может иметь значение 0, что означает, что должен использоваться вариант согласно таблице вариантов (см. глобальную конфигурационную переменную variant_map_file), либо данное поле может хранить номер варианта явно. Явный номер варианта задачи может выставляться только администратором турнира при редактировании записи, либо выбираться при отправке посылки из-под привилегированной CGI-программы master или judge пользователем с соответствующими привилегиями.

Поле is_hidden хранит флаг скрытой посылки. Поле может принимать два значения: 0 и 1, соответствующие булевским значениям false и true. Флаг скрытой посылки ставится всегда при отправке посылки из-под привилегированных CGI-программ master или judge. Кроме этого флаг скрытой посылки может быть установлен вручную администратором турнира.

Когда флаг скрытой посылки установлен в true, такая посылка:

  • Не учитывается при вычислении штрафов за попытки, текущих результатов турнира и не отображается в таблице текущих результатов и публичном журнале посылок (если таковой ведётся).
  • Не экспортируется в XML-формате.
  • Может иметь время получения до момента начала турнира и после момента окончания турнира.

Поле is_readonly хранит флаг нередактируемой посылки. Поле может принимать два значения: 0 и 1, соответствующие булевским значениям false и true. Флаг нередактируемой посылки может быть установлен вручную администратором турнира.

Если флаг нередактируемой посылки установлен в true, данная посылка никогда не пересуживается с помощью кнопок “Rejudge” интерфейса администратора турнира. Администратор турнира не может изменить ни одно поле посылки, за исключением поля is_readonly.

Назначение данного флага — предотвратить случайное изменение полей посылки (например, с помощью кнопки “Rejudge”, если статус посылки был установлен вручную), а не запретить каким-либо пользователям редактировать поля базы посылок. Поле pages хранит количество страниц бумаги, использованных при распечатке программы непривилегированным пользователем. Если значение поля равно 0, программа не была распечатана. Значение поля устанавливается после распечатки исходного кода программы в данной посылке. Счётчик страниц включает в себя обязательную титульную страницу, поэтому даже самая маленькая программа потребует две страницы.

По умолчанию распечатка программ непривилегированными пользователями запрещена. Чтобы разрешить распечатку необходимо установить в true глобальную конфигурационную переменную enable_printing конфигурационного файла описания турнира serve.cfg.