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


DO $check14$
DECLARE
    v_base varchar(255);
    v_cookies text;
    v_step record;
    v_metadata text[];
    v_params json;
    v_response bytea;
    v_text text;
    v_json json;
    v_stack json[];
    v_sid text := uuid_generate_v4()::text;
BEGIN
    SELECT web_base INTO v_base
    FROM tools.settings
    LIMIT 1;

    v_cookies := robot.login_ex2(v_base, 'bb_robot');

    IF coalesce(v_cookies, '') = '' THEN
        RAISE EXCEPTION 'Не удалось авторизовать bb_robot';
    END IF;

    BEGIN
        FOR v_step IN
            SELECT id_process, load_post_process, load_id_var
            FROM smev.smev_report_create_register_processes
            WHERE id_etl = 14
              AND operation_type = 0
              AND active_task = true
              AND id_process IN (1, 2, 3)
            ORDER BY id_process
        LOOP
            v_metadata := NULL;
            v_params := '{}'::json;

            IF v_step.load_id_var IS NOT NULL THEN
                v_metadata := smev.f_smev_data_json_build2(
                    v_step.load_id_var, v_stack, 0, v_sid
                );

                IF cardinality(v_metadata) > 0 THEN
                    v_params := json_object(v_metadata);
                END IF;
            END IF;

            RAISE NOTICE 'DIAG14: начинаем шаг %, модель %',
                v_step.id_process, v_step.load_post_process;

            v_response := robot.get_page_data(
                v_base,
                'queryModel?queryModelCode='
                    || v_step.load_post_process,
                v_cookies,
                v_params
            );

            v_text := convert_from(v_response, 'UTF8');

            RAISE NOTICE 'DIAG14: ответ шага %: %',
                v_step.id_process, left(v_text, 1000);

            BEGIN
                v_json := v_text::json;
            EXCEPTION WHEN invalid_text_representation THEN
                RAISE NOTICE 'DIAG14: шаг % вернул некорректный JSON',
                    v_step.id_process;
                EXIT;
            END;

            v_stack[v_step.id_process] := v_json;

            IF v_step.id_process = 1
               AND v_json->>'status' <> 'true' THEN
                RAISE NOTICE 'DIAG14: проверка первого шага не пройдена';
                EXIT;
            END IF;
        END LOOP;
    EXCEPTION WHEN OTHERS THEN
        PERFORM robot.logout_ex(v_base, v_cookies);
        RAISE;
    END;

    PERFORM robot.logout_ex(v_base, v_cookies);
END;
$check14$;