Загрузка данных


-- 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$
;