Lang:postgres

From EjudgeWiki
Revision as of 16:59, 31 December 2023 by Cher (talk | contribs) (...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Навигация: Главная страница/Система 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.