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


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