Difference between revisions of "Lang:postgres"

From EjudgeWiki
(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. Это &mdash;
 +
стандартные переменные окружения для 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.