Difference between revisions of "Lang:postgres"
(Created page with "Навигация: Главная страница/Система ejudge/Использование/Поддерживаемые языки прогр...") |
(...) |
||
Line 1: | Line 1: | ||
Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Поддерживаемые языки программирования]]/<code>[[Lang:postgres|PostgresQL]]</code> | Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Поддерживаемые языки программирования]]/<code>[[Lang:postgres|PostgresQL]]</code> | ||
+ | |||
+ | {| class="wikitable" style="margin:auto" | ||
+ | |- | ||
+ | | ID языка || 79 | ||
+ | |- | ||
+ | | Короткое имя || postgres | ||
+ | |- | ||
+ | | Название языка || PostgreSQL | ||
+ | |- | ||
+ | | Сайт || https://www.postgresql.org/ | ||
+ | |- | ||
+ | | Способ установки || Менеджером пакетов ОС (dnf, apt-get) | ||
+ | |} | ||
+ | |||
+ | Этот язык программирования предназначен для тестирования | ||
+ | SQL-запросов к базе данных Postgres. Поддерживается | ||
+ | как [[запуск на пользовательских данных]], так и | ||
+ | запуск на наборе тестов. | ||
+ | |||
+ | Для доступа к серверу Postgres используется утилита командной | ||
+ | строки <code>psql</code>, которая должна быть доступна | ||
+ | на тестирующих хостах. Сервер Postgres должен быть уже запущенным | ||
+ | и может находиться как на том же самом хосте, так и на другом хосте. | ||
+ | В частности, сервер Postgres может быть развернуть в docker. | ||
+ | |||
+ | Для тестирования SQL-запросов потребуется и административный доступ | ||
+ | к серверу БД, и неадминистративный доступ, под которым | ||
+ | исполняется тестируемый запрос. | ||
+ | При запуске на тестирование SQL-запроса на каждом тесте сначала | ||
+ | создается новая база данных со случайным именем | ||
+ | с помощью запроса <code>CREATE DATABASE</code>, который выполняется | ||
+ | административным пользователем. На созданную базу выдаются права | ||
+ | для обычного пользователя. | ||
+ | |||
+ | Затем из-под обычного пользователя выполняются запросы из файла | ||
+ | с тестовыми данными текущего теста. Файл с тестовыми данными | ||
+ | таким образом играет роль файла с SQL-командами, заполняюего | ||
+ | базу данных нужными значениями. Затем выполняются SQL-запросы | ||
+ | пользователя, сданные на тестирование. | ||
+ | |||
+ | В конце выполняется команда уничтожения созданной базы данных. | ||
+ | Таким образом, каждый раз SQL-запрос выполняется во временном | ||
+ | изолированном окружении. | ||
+ | |||
+ | Для корректной работы postgres требуются особенные настройки языка | ||
+ | программирования. Пример настроек приведен ниже: | ||
+ | |||
+ | [language] | ||
+ | id = 79 | ||
+ | short_name = "postgres" | ||
+ | long_name = "PostgreSQL 15.4" | ||
+ | arch = "linux-shared" | ||
+ | src_sfx = ".sql" | ||
+ | [[serve.cfg:language:enable_ejudge_env|enable_ejudge_env]] | ||
+ | [[serve.cfg:language:preserve_line_numbers|preserve_line_numbers]] | ||
+ | [[serve.cfg:language:clean_up_cmd|clean_up_cmd]] = "/opt/ejudge/libexec/ejudge/bin/ej-postgres-cleanup" | ||
+ | [[serve.cfg:language:run_env_file|run_env_file]] = "/home/judges/data/postgres.env" | ||
+ | [[serve.cfg:language:clean_up_env_file|clean_up_env_file]] = "/home/judges/data/postgres.env" | ||
+ | |||
+ | Параметр <code>[[serve.cfg:language:enable_ejudge_env|enable_ejudge_env]]</code> включает передачу переменных окружения <code>EJUDGE_SUPER_RUN_SERIAL</code> и <code>EJUDGE_TEST_RANDOM_VALUE</code> при тестировании. | ||
+ | |||
+ | Параметр <code>[[serve.cfg:language:preserve_line_numbers|preserve_line_numbers]]</code> удаляет из пользовательских SQL-запросов специальный комментарий | ||
+ | <code>#! /opt/ejudge/libexec/ejudge/bin/ej-postgres-exec</code>, добавленный | ||
+ | компонентом компиляции [[ej-compile]]. | ||
+ | |||
+ | Параметр <code>[[serve.cfg:language:clean_up_cmd|clean_up_cmd]]</code> задаёт имя программы | ||
+ | очистки состояния базы данных после выполнения запроса. | ||
+ | |||
+ | Параметр <code>[[serve.cfg:language:run_env_file|run_env_file]]</code> задаёт файл с переменными | ||
+ | окружения с параметрами доступа к базе данных, которые используются | ||
+ | при выполнении запросов. | ||
+ | |||
+ | Параметр <code>[[serve.cfg:language:clean_up_env_file|clean_up_env_file]]</code> задаёт файл с переменными окружения с параметрами доступа к базе данных, | ||
+ | которые используются при очистке базы данных после выполнения запроса. | ||
+ | |||
+ | Файл с переменными окружения <code>/home/judges/data/postgres.env</code> | ||
+ | должен иметь следующую структуру. | ||
+ | |||
+ | PGHOST=127.0.0.1 | ||
+ | PGPORT=15432 | ||
+ | PG_BASE_PREFIX=testdb | ||
+ | PG_ROOT_USER=postgres | ||
+ | PG_ROOT_PASSWORD=rootpassword | ||
+ | PG_USER_PREFIX=ejexec | ||
+ | PG_PASSWORDS=password0:password1:password2:password3 | ||
+ | |||
+ | Переменная окружения <code>PGHOST</code> задаёт имя хоста, на котором | ||
+ | работает сервер Postgres. Переменная окружения <code>PGPORT</code> | ||
+ | задаёт номер порта, на котором работает сервер Postgres. Это — | ||
+ | стандартные переменные окружения для Postgres-клиента <code>psql</code>. | ||
+ | |||
+ | Переменная окружения <code>PG_BASE_PREFIX</code> задаёт префикс имени | ||
+ | для базы данных для тестирования. При тестировании к нему будет добавлен | ||
+ | случайный суффикс. | ||
+ | |||
+ | Переменная окружения <code>PG_ROOT_USER</code> задаёт имя административного | ||
+ | пользователя сервера Postgres. Переменная окружения <code>PG_ROOT_PASSWORD</code> | ||
+ | задаёт пароль административного пользователя сервера Postgres. | ||
+ | |||
+ | Переменная окружения <code>PG_USER_PREFIX</code> задаёт имя пользователя | ||
+ | или префикс имен пользователей, под которым будут выполняться запросы. | ||
+ | |||
+ | Переменная окружения <code>PG_PASSWORDS</code> задаёт один пароль или | ||
+ | несколько паролей для пользователей, под которыми выполняются запросы. | ||
+ | |||
+ | На примере файла выше, если тестирование выполняется в один поток, | ||
+ | то для выполнения запросов будет использоваться пользователь | ||
+ | <code>ejexec</code> c паролем <code>password0</code>. | ||
+ | Если тестирование выполняется в 2, 3, 4 потока, будут использоваться | ||
+ | пользователи <code>ejexec</code>, <code>ejexec1</code>, <code>ejexec2</code>, | ||
+ | <code>ejexec3</code> с паролями <code>password0</code>, <code>password1</code>, | ||
+ | <code>password2</code>, <code>password3</code> соответственно. | ||
+ | |||
+ | Обратите внимание, что под административными и обычными пользователями | ||
+ | здесь понимаются пользователи Postgres, а не пользователи Linux хост-системы. | ||
+ | |||
+ | Дополнительно при выполнении запросов поддерживаются следующие | ||
+ | переменые окружения, которые можно устанавливать с помощью | ||
+ | параметров задачи | ||
+ | <code>[[serve.cfg:problem:start_env|start_env]]</code>. | ||
+ | |||
+ | Переменная окружения <code>EJUDGE_HTML_OUTPUT</code> включает опцию | ||
+ | <code>--html</code> утилиты psql, то есть результат запроса будет | ||
+ | выведен в формате HTML. | ||
+ | |||
+ | Переменная окружения <code>EJUDGE_TUPLES_ONLY</code> включает опцию | ||
+ | <code>-t</code> утилиты psql, то есть в результате запроса | ||
+ | будет отсутствовать строка заголовка таблицы. | ||
+ | |||
+ | Поддерживается начиная с версии [[изменения в версии 3.12.0|3.12.0]]. |
Latest revision as of 16:59, 31 December 2023
Навигация: Главная страница/Система ejudge/Использование/Поддерживаемые языки программирования/PostgresQL
ID языка | 79 |
Короткое имя | postgres |
Название языка | PostgreSQL |
Сайт | https://www.postgresql.org/ |
Способ установки | Менеджером пакетов ОС (dnf, apt-get) |
Этот язык программирования предназначен для тестирования SQL-запросов к базе данных Postgres. Поддерживается как запуск на пользовательских данных, так и запуск на наборе тестов.
Для доступа к серверу Postgres используется утилита командной
строки psql
, которая должна быть доступна
на тестирующих хостах. Сервер Postgres должен быть уже запущенным
и может находиться как на том же самом хосте, так и на другом хосте.
В частности, сервер Postgres может быть развернуть в docker.
Для тестирования SQL-запросов потребуется и административный доступ
к серверу БД, и неадминистративный доступ, под которым
исполняется тестируемый запрос.
При запуске на тестирование SQL-запроса на каждом тесте сначала
создается новая база данных со случайным именем
с помощью запроса CREATE DATABASE
, который выполняется
административным пользователем. На созданную базу выдаются права
для обычного пользователя.
Затем из-под обычного пользователя выполняются запросы из файла с тестовыми данными текущего теста. Файл с тестовыми данными таким образом играет роль файла с SQL-командами, заполняюего базу данных нужными значениями. Затем выполняются SQL-запросы пользователя, сданные на тестирование.
В конце выполняется команда уничтожения созданной базы данных. Таким образом, каждый раз SQL-запрос выполняется во временном изолированном окружении.
Для корректной работы postgres требуются особенные настройки языка программирования. Пример настроек приведен ниже:
[language] id = 79 short_name = "postgres" long_name = "PostgreSQL 15.4" arch = "linux-shared" src_sfx = ".sql" enable_ejudge_env preserve_line_numbers clean_up_cmd = "/opt/ejudge/libexec/ejudge/bin/ej-postgres-cleanup" run_env_file = "/home/judges/data/postgres.env" clean_up_env_file = "/home/judges/data/postgres.env"
Параметр enable_ejudge_env
включает передачу переменных окружения EJUDGE_SUPER_RUN_SERIAL
и EJUDGE_TEST_RANDOM_VALUE
при тестировании.
Параметр preserve_line_numbers
удаляет из пользовательских SQL-запросов специальный комментарий
#! /opt/ejudge/libexec/ejudge/bin/ej-postgres-exec
, добавленный
компонентом компиляции ej-compile.
Параметр clean_up_cmd
задаёт имя программы
очистки состояния базы данных после выполнения запроса.
Параметр run_env_file
задаёт файл с переменными
окружения с параметрами доступа к базе данных, которые используются
при выполнении запросов.
Параметр clean_up_env_file
задаёт файл с переменными окружения с параметрами доступа к базе данных,
которые используются при очистке базы данных после выполнения запроса.
Файл с переменными окружения /home/judges/data/postgres.env
должен иметь следующую структуру.
PGHOST=127.0.0.1 PGPORT=15432 PG_BASE_PREFIX=testdb PG_ROOT_USER=postgres PG_ROOT_PASSWORD=rootpassword PG_USER_PREFIX=ejexec PG_PASSWORDS=password0:password1:password2:password3
Переменная окружения PGHOST
задаёт имя хоста, на котором
работает сервер Postgres. Переменная окружения PGPORT
задаёт номер порта, на котором работает сервер Postgres. Это —
стандартные переменные окружения для Postgres-клиента psql
.
Переменная окружения PG_BASE_PREFIX
задаёт префикс имени
для базы данных для тестирования. При тестировании к нему будет добавлен
случайный суффикс.
Переменная окружения PG_ROOT_USER
задаёт имя административного
пользователя сервера Postgres. Переменная окружения PG_ROOT_PASSWORD
задаёт пароль административного пользователя сервера Postgres.
Переменная окружения PG_USER_PREFIX
задаёт имя пользователя
или префикс имен пользователей, под которым будут выполняться запросы.
Переменная окружения PG_PASSWORDS
задаёт один пароль или
несколько паролей для пользователей, под которыми выполняются запросы.
На примере файла выше, если тестирование выполняется в один поток,
то для выполнения запросов будет использоваться пользователь
ejexec
c паролем password0
.
Если тестирование выполняется в 2, 3, 4 потока, будут использоваться
пользователи ejexec
, ejexec1
, ejexec2
,
ejexec3
с паролями password0
, password1
,
password2
, password3
соответственно.
Обратите внимание, что под административными и обычными пользователями здесь понимаются пользователи Postgres, а не пользователи Linux хост-системы.
Дополнительно при выполнении запросов поддерживаются следующие
переменые окружения, которые можно устанавливать с помощью
параметров задачи
start_env
.
Переменная окружения EJUDGE_HTML_OUTPUT
включает опцию
--html
утилиты psql, то есть результат запроса будет
выведен в формате HTML.
Переменная окружения EJUDGE_TUPLES_ONLY
включает опцию
-t
утилиты psql, то есть в результате запроса
будет отсутствовать строка заголовка таблицы.
Поддерживается начиная с версии 3.12.0.