Тестовое задание Выполнить разбор файла почтового лога, залить данные в БД и организовать поиск по адресу получателя. Исходные данные:
- Файл лога maillog
- Схема таблиц в БД (допускается использовать 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 сообщения
- флаг
- адрес получателя (либо отправителя)
- другая информация
В качестве флагов используются следующие обозначения:
- <= прибытие сообщения (в этом случае за флагом следует адрес отправителя)
- => нормальная доставка сообщения
- -> дополнительный адрес в той же доставке
- ** доставка не удалась
- == доставка задержана (временная проблема)
В случаях, когда в лог пишется общая информация, флаг и адрес получателя не указываются.
Выполнить разбор предлагаемого файла лога с заполнением таблиц БД: В таблицу message должны попасть только строки прибытия сообщения (с флагом <=). Поля таблицы должны содержать следующую информацию:
- created - timestamp строки лога
- id - значение поля id=xxxx из строки лога
- int_id - внутренний id сообщения
- str - строка лога (без временной метки)
В таблицу log записываются все остальные строки:
- created - timestamp строки лога
- int_id - внутренний id сообщения
- str - строка лога (без временной метки)
- address - адрес получателя
Создать html-страницу с поисковой формой, содержащей одно поле (type="text") для ввода адреса получателя.
Результатом отправки формы должен являться список найденных записей ' <строка лога>' из двух таблиц, отсортированных по идентификаторам сообщений (int_id) и времени их появления в логе.
Отображаемый результат необходимо ограничить сотней записей, если количество найденных строк превышает указанный лимит, должно выдаваться соответствующее сообщение.
Данные для подключения к базе зашиты в пакете TJFGPB::Utils
. Зависимости перечислены в cpanfile
.
Ожидается, что лог-файл с исходными данными находится в корне проекта и называется out
.
Для выполнения разбора необходимо запустить скрипт parse_log.pl
из директории bin
:
perl ./bin/parse_log.pl
В результате работы будут добавлены записи в базу.
Адрес скрипта: /cgi-bin/search.pl
.
Меня немного сбивает с толку формулирование задачи: указано что поиск необходимо проводить
по адресу получателя, но при этом указано что искать надо в двух таблицах. Насколько
понял из описания, отправитель может быть только в таблице log
. Обычно, условия можно
уточнить у заказчика, но... Так или иначе, сделал поиск по двум таблицам. Если это не верно,
то я бы переписал запрос без части union
, только по таблице log
.