Загрузка данных
-- DROP FUNCTION dev.put_into_gateway2(int4, int4, int4, bool, bool);
CREATE OR REPLACE FUNCTION dev.put_into_gateway2(record_id integer, fmode integer, userid integer, blog boolean, historyarchive boolean DEFAULT false)
RETURNS integer
LANGUAGE plpgsql
AS $function$
declare
/* ВХОДНАЯ ТОЧКА:
* Функция выгружает файл из таблицы dev.model_to_verification
* по пути out_folder_name (таблица robot. service_description)
* record_id записи из dev.model_to_verification
* fmode - при выгрузке файла во внешнюю папку, если файл с таким именем есть,
* то 1 - ошибка: файл с таким имененм существует; 0 - новое имя файла (x)+имя_файла, где х-число от 1 до max int
* userid - id пользователя, кто инициировал выгрузку
* blog - логирование работы {true, false}
* historyArchive - архивировать содержимое файла (dev.model_to_verification.fbytes) или нет {true, false}
* */
result integer;
current_file record;
file_save_code int;
gateway_folder text;
new_count int;
archive_mode text;
need_to_update_register boolean;
compressed_ok boolean;
v_items integer;
v_start integer;
v_end integer;
v_zip_name text;
v_register_type text;
v_current_record integer;
v_current_name text;
v_gz_result integer;
v_register_id integer;
v_compressed bytea;
v_lob_id integer;
v_record_id integer;
v_ban boolean;
-- try catch vars:
err_code text;
msg_text text;
exc_context text;
begin
begin
if(blog)then
perform mtrustgate.log_message(null::character varying, 'Выгрузка файлов', 'Начинаем: dev.put_into_gateway2');
end if;
result :=0;
need_to_update_register := false;
--How many files must be uploaded to SMEV - one or larger
select Count(1) items, min(mv.id) id_start,
max(mv.id) id_end, max(mv.register_id) register_id,
max(sr.smev_register_type_code) register_type, mv.zip_name
into v_items, v_start,
v_end, v_register_id,
v_register_type, v_zip_name
from dev.model_file_to_verification mv
inner join dev.model_file_to_verification mf on mv.register_id = mf.register_id
inner join report.smev_register sr on sr.id = mf.register_id
where mf.id = record_id group by mv.zip_name order by min(mv.id) desc limit 1;
-- Last validation before working:
if v_items is null then
perform mtrustgate.log_message(null::character varying, 'Выгрузка файлов', 'Выгружать нечего: dev.put_into_gateway2');
result := 10;
return result;
end if;
-- *********************
-- main part is starting
-- *********************
v_current_record := 0;
for i in 1..v_items loop
v_current_record := v_start + (i-1);
new_count:= 0;
compressed_ok:= false;
select dv.name, dv.fbytes, dv.id, dv.compressed, dv.service_name
into current_file
from dev.model_file_to_verification dv
where dv.id = v_current_record;
select out_folder_name into gateway_folder from robot.service_description where name = current_file.service_name; --'SMEF PFR';
--raise notice 'Имя архива перед:% %', v_current_record::text, concat(current_file."name", '.gz');
v_current_name:= utils.get_file_name(fmode, gateway_folder, concat(current_file."name", '.gz'));
raise notice 'Имя архива после: %', v_current_name;
if(blog)then
perform mtrustgate.log_message(null::character varying, 'Выгрузка файлов', concat('Выгружаем: ', current_file."name", '.gz'));
end if;
if v_current_name <> '0' OR v_current_name <> '-1' then
--if(v_current_name <> concat(current_file."name", '.gz'))then
-- file exists and we make next name
--end if;
v_gz_result := utils.save_file_pure_gzip(gateway_folder, v_current_name, v_current_record);
raise notice 'После: %', v_gz_result;
if v_gz_result = 0 then
-- Success:
new_count:= 5;
need_to_update_register:= true;
if(blog)then
perform mtrustgate.log_message(null::character varying, 'Выгрузка файлов', concat('Файл выгружен: ', v_current_name));
end if;
-- make record to trustgate out journal (for futher sending into SFR) - mtrustage.moutlist
if current_file.compressed then
v_compressed := current_file.fbytes;
else
v_compressed := utils.compress_data_gzip(current_file.fbytes);
end if;
if(octet_length(v_compressed) > octet_length((convert_from('error', 'UTF8')))) then
compressed_ok:= true;
v_lob_id = lo_from_bytea(0, v_compressed);
INSERT INTO mtrustgate.moutlist(token_id,
mftv_id,
mtype_doc,
userid,
filename,
file_id,
attempt,
ban,
record_status,
delay_count, scheduled, "version")
VALUES(-1, -- real value will be recorded after send session
v_current_record,
v_register_type,
userid,
v_current_name,
v_lob_id,
0,
true,
0,
0, null::timestamp without time zone, now())
RETURNING id, ban INTO v_record_id, v_ban;
if not v_ban and v_register_type in ('НРД', 'НРД-ДСВ') then
perform mtrustgate.nrd_send_documents(v_record_id, true);
perform mtrustgate.log_message(null::character varying, 'Отправка отчетов НРД', 'Все успешно: dev.put_into_gateway2');
end if;
else
-- fail to compress
if(blog)then
perform mtrustgate.log_message(null::character varying, 'Выгрузка файлов', 'Ошибка преобразования файла');
end if;
end if;
else
new_count:= (-1)* v_gz_result;
if(blog)then
perform mtrustgate.log_message(null::character varying, 'Выгрузка файлов', concat('Ошибка Файла: ', v_current_name));
end if;
end if;
else
-- skip file ??
-- make notice about it
new_count:= -37;
raise notice 'Файл с таким именем уже существует во внешней папке %', concat(current_file."name", '.gz');
if(blog)then
perform mtrustgate.log_message(null::character varying, 'Выгрузка файлов', concat('Файл существует: ', v_current_name));
end if;
end if;
-- **********************************
-- update model_file_to verification:
-- **********************************
if historyArchive and compressed_ok and not current_file.compressed then
-- update status and change fbytes to compressed content of file with compressed flag as true:
update dev.model_file_to_verification mf set count = new_count, actual_name = v_current_name,
fbytes = v_compressed, compressed= true
where mf.id = v_current_record;
else
-- set status of the uploaded record (status for processed files must be updated):
update dev.model_file_to_verification mf set count = new_count, actual_name = v_current_name where mf.id = v_current_record;
end if;
end loop;
-- setup report.smev_register.sent field:
if need_to_update_register then
update report.smev_register set sent=now() where id = v_register_id;
end if;
-- *****************
-- main part is done
-- *****************
if(blog)then
perform mtrustgate.log_message(null::character varying, 'Выгрузка файлов', 'Всё хорошо: dev.put_into_gateway2');
end if;
exception when others
then
perform mtrustgate.log_message(null::character varying, 'Аварийная ситуация', 'Выгрузка файлов: dev.put_into_gateway2');
GET STACKED DIAGNOSTICS
err_code = RETURNED_SQLSTATE,
msg_text = MESSAGE_TEXT,
exc_context = PG_CONTEXT;
RAISE NOTICE 'ERROR CODE: % MESSAGE TEXT: % CONTEXT: %',
err_code, msg_text, exc_context;
result:= -1;
end;
--
return result;
END;
$function$
;