Skip to content
This repository has been archived by the owner on Jan 2, 2024. It is now read-only.

cynovg/tjfgpb

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Test job for GPB

Тестовое задание Выполнить разбор файла почтового лога, залить данные в БД и организовать поиск по адресу получателя. Исходные данные:

  1. Файл лога maillog
  2. Схема таблиц в БД (допускается использовать postgresql или mysql):
CREATE TABLE message (
	`created` TIMESTAMP NOT NULL,
	`id` VARCHAR(16) NOT NULL,
	`int_id` CHAR(16) NOT NULL,
	`str` VARCHAR(256) NOT NULL,
	`status` BOOL, CONSTRAINT message_id_pk PRIMARY KEY(id)
);
CREATE INDEX message_created_idx ON message (`created`);
CREATE INDEX message_int_id_idx ON message (`int_id`);
CREATE TABLE log (
	`created` TIMESTAMP NOT NULL,
	`int_id` CHAR(16) NOT NULL,
	`str` VARCHAR(256),
	`address` VARCHAR(256)
);
CREATE INDEX log_address_idx USING hash ON `log` (`address`);

Пояснения: В качестве разделителя в файле лога используется символ пробела. Значения первых полей:

  • дата
  • время
  • внутренний id сообщения
  • флаг
  • адрес получателя (либо отправителя)
  • другая информация

В качестве флагов используются следующие обозначения:

  • <= прибытие сообщения (в этом случае за флагом следует адрес отправителя)
  • => нормальная доставка сообщения
  • -> дополнительный адрес в той же доставке
  • ** доставка не удалась
  • == доставка задержана (временная проблема)

В случаях, когда в лог пишется общая информация, флаг и адрес получателя не указываются.

Задачи:

1.

Выполнить разбор предлагаемого файла лога с заполнением таблиц БД: В таблицу message должны попасть только строки прибытия сообщения (с флагом <=). Поля таблицы должны содержать следующую информацию:

  • created - timestamp строки лога
  • id - значение поля id=xxxx из строки лога
  • int_id - внутренний id сообщения
  • str - строка лога (без временной метки)

В таблицу log записываются все остальные строки:

  • created - timestamp строки лога
  • int_id - внутренний id сообщения
  • str - строка лога (без временной метки)
  • address - адрес получателя

2.

Создать html-страницу с поисковой формой, содержащей одно поле (type="text") для ввода адреса получателя.

Результатом отправки формы должен являться список найденных записей ' <строка лога>' из двух таблиц, отсортированных по идентификаторам сообщений (int_id) и времени их появления в логе.

Отображаемый результат необходимо ограничить сотней записей, если количество найденных строк превышает указанный лимит, должно выдаваться соответствующее сообщение.

Решение

Данные для подключения к базе зашиты в пакете TJFGPB::Utils. Зависимости перечислены в cpanfile.

Задание №1

Ожидается, что лог-файл с исходными данными находится в корне проекта и называется out. Для выполнения разбора необходимо запустить скрипт parse_log.pl из директории bin:

perl ./bin/parse_log.pl

В результате работы будут добавлены записи в базу.

Задание №2

Адрес скрипта: /cgi-bin/search.pl.

Меня немного сбивает с толку формулирование задачи: указано что поиск необходимо проводить по адресу получателя, но при этом указано что искать надо в двух таблицах. Насколько понял из описания, отправитель может быть только в таблице log. Обычно, условия можно уточнить у заказчика, но... Так или иначе, сделал поиск по двум таблицам. Если это не верно, то я бы переписал запрос без части union, только по таблице log.

About

Test job for GPB

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages