Загрузка данных
-- DROP FUNCTION smev.f_smev_file_import(text);
CREATE OR REPLACE FUNCTION smev.f_smev_file_import(sid text)
RETURNS integer
LANGUAGE plpgsql
AS $function$
declare
smev_file record;
file_get_code int;
begin
/* Функция сравнивает то что загружено в robot.input_files с каталогами, описанными в robot.service_description поле input_folder_name
* Файлы ищутся по пути "Базовый путь" + "путь из input_folder_name". Желательно доделать кэширование считывания списка фалов по папкам,
* что бы не читать ее для каждой строки джойна
* Дальнейшая обработка файла делается в зависимости от сервиса. Либо обработчик отбирает файлы сразу по типу сервиса,
* либо уточняя тип по сигнатурам содержимого.
* '\.([^.]+)$' - regexp выделяет расширение файла
* */
if trim(sid) = '' then
sid := uuid_nil()::text;
end if;
for smev_file in
select f.id, sd.input_folder_name, d.name file_name, sd.name service
from robot.service_description sd
inner join lateral (select name from utils.get_dir_list(sd.input_folder_name)) d on true
left join robot.input_files f on sd.name = f.service and f.file_name = d.name and f.from_trustgate = false
where f.file_name is null
and sd.input_folder_name is not null
-- для сервиса 'XML VERIFICATION' исключаем log.txt и PPtoHTML_POPD.xsl
-- в каталоге \\mloricabacktest\nspn\SMEV\UPP
and (case when sd.name = 'XML VERIFICATION' then (d.name = 'log.txt') else false end = false)
loop
insert into robot.input_files (service, file_name, extention, content, session_id, processing, transliter_file_name, processing_count, processing_text, from_trustgate)
values (smev_file.service,
smev_file.file_name,
coalesce(substring(smev_file.file_name, '\.([^.]+)$'), ''),
utils.get_file_content(smev_file.input_folder_name || '/' || smev_file.file_name),
UUID(sid),
false,
-- Транслитерированное имя файла (замена русских букв)
robot.f_russian_transliteration_code(smev_file.file_name),
0,
'',
false
);
end loop;
return 0;
END;
$function$
;
-- DROP FUNCTION robot.f_sfr_pgpro_scheduler();
CREATE OR REPLACE FUNCTION robot.f_sfr_pgpro_scheduler()
RETURNS integer
LANGUAGE plpgsql
AS $function$
declare
smev_file_uploaded record;
sid text;
files_count int;
begin
set idle_session_timeout = '0';
files_count := 0;
sid := uuid_generate_v4()::text;
-- Мы начали процесс, отметим этот факт в логе:
--RAISE NOTICE 'Запуск:';
perform robot.log_message('запуск', '*', sid);
-- загрузка файлов в таблицу robot.input_files
perform smev.f_smev_file_import(sid);
-- логируем результат загрузки:
for smev_file_uploaded in
select fup.file_name as file_name, fup.status as status
from robot.input_files fup
where fup.session_id = uuid(sid)
loop
files_count:= files_count + 1;
perform robot.log_message('работа', smev_file_uploaded.file_name || ' статус: ' || smev_file_uploaded.status, sid);
-- Пост обработка загруженного файла ( модель-> один файл загрузили и тут ж его разбираем и пишем в таблицу)
-- perform smev.f3_load_sfr_register(sid);
end loop;
--RAISE NOTICE 'После цикла:';
-- first check: nothing to process within current sid
if files_count = 0 then
-- try to get files from robot.input_files where sid is different and status is loaded (remained unprocessed)
select Count(*) into files_count
from robot.input_files fup
where fup.status = 'loaded';
end if;
-- second file check (nothing to do)
--RAISE NOTICE 'Перед вызовом:';
if files_count = 0 then
-- сообщение о том что ни один файл не загружен
perform robot.log_message('работа', 'Удалённый каталог пустой, либо файлы с такими именами были загружены в систему ранее', sid);
else
-- Пост обработка загруженных файлов ( модель-> все файлы загрузили, разбираем их и пишем в таблицу)
--RAISE NOTICE 'Вызов';
perform smev.f3_load_sfr_register(sid);
--RAISE NOTICE 'После вызова';
end if;
-- заканчиваем работу:
perform robot.log_message('финиш', '**', sid);
return 0;
END;
$function$
;