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.