Oracle DB, Oracle APEX, Linux etc.

Показаны сообщения с ярлыком hack. Показать все сообщения
Показаны сообщения с ярлыком hack. Показать все сообщения

пятница, 8 июля 2011 г.

Oracle APEX: Убить Билла

Как удалить вручную сессию APEX, если известен её ID? Всё довольно просто.

Для начала подумаем, где должна использоваться возможность удаления сессии. Правильно, там где пользователь завершает сеанс в приложении - смотрим на ссылку LOGOUT_URL:

http://localhost:8888/apex/wwv_flow_custom_auth_std.logout?p_this_flow=4000&p_next_flow_page_sess=4550:8:8297564516445573

Нужное нам находится в wwv_flow_custom_auth_std.logout. Давайте глянем ещё на процесс, который выполняется при принудительном удалении сессий администратором экземпляра APEX. Заходим в Administration->Application Express Internal Administration, переходим на Manage Instance->Session State->Purge Session, by age. Это страница 66 приложения 4050. Посмотрим, что за процессы выполняются при обработке этой страницы:

set long 5000
select process_source 
  from apex_application_page_proc 
 where application_id = 4050 and page_id = 66;

PROCESS_SOURCE
--------------------------------------------------------------------------------
wwv_flow_cache.purge_oldest_sessions (
p_num_sessions_to_purge     => :P66_MAX_SESSIONS,
p_purge_sess_older_then_hrs => :P66_AGE * 24);

Ещё одна наводка - пакет wwv_flow_cache с множеством процедур purge_%.

Произведя ритуал Unwrap над этими пакетами, можно увидеть, что удаляется сессия APEX с идентификатором :p_id довольно просто:

delete apex_040000.wwv_flow_sessions$ where id = :p_id;

Всё, остальные изыски из этих процедур вроде подсчёта удалённых сессий, переноса их в wwv_flow_purged_sessions$ и изменения значения в печеньке на -1 нам не нужны.

Убить Билла сессию APEX - проще простого. Была бы лицензия на убийство в виде соответствующей привилегии на таблицу apex_040000.wwv_flow_sessions$...
Читать далее

вторник, 8 июня 2010 г.

APEX: Неочевидное сообщение об ошибке при импорте страницы

This page was exported from a different application or from an application in different workspace. Page cannot be installed in this application.

Такое вот сообщение, знакомое тем, кто разрабатывает приложение одновременно в двух разных рабочих пространствах / БД. APEX показывает его при импорте страницы из приложения рабочего пространства W1 в приложение рабочего пространства W2, таким образом заботясь о целостности приложения. Мало ли, что там на этой странице есть, чего - ещё, уже или вообще - нет в приложении.

Если разработчик уверен, что всё будет в порядке, то достаточно изменить рабочее пространство в файле экспорта:
begin
 
  -- Assumes you are running the script connected to SQL*Plus as the Oracle user APEX_030200 or as the owner (parsing schema) of the application.
  wwv_flow_api.set_security_group_id(p_security_group_id=>2694915948162823);
 
end;
/
В выделенной строке укажите id целевого рабочего пространства, который можно получить следующим запросом (W2 - целевое рабочее пространство):
select workspace_id from apex_workspaces where workspace = 'W2';
Но это всё ещё не гарантирует, что Вы не получите вышеупомянутое сообщение. Почему? Потому что, как было в моём случае, могут не совпасть по формату версии приложений, или версия целевого приложения может быть меньше необходимой для импорта страницы. Глянуть версию в файле экспорта можно здесь:
begin
 
-- This date identifies the minimum version required to import this file.
wwv_flow_api.set_version(p_version_yyyy_mm_dd=>'2009.01.12');
 
end;
/
А вот как её менять - зависит от приложения. Проще всего передать в качестве параметра NULL (страницу можно будет устанавливать в любую версию приложения).
Читать далее

пятница, 4 сентября 2009 г.

ApEx и автоматическое добавление в HEAD страницы скриптов и стилей

На sql.ru я уже задал этот вопрос, но решил написать и здесь.

Чего хочется: чтобы Апекс, генерируя страницу, автоматом дописывал в <HEAD> нужные либы и таблицы стилей.

Где-то тут:

<head>
<title>Edit Page Template</title>
<link type="image/x-icon" href="/i/favicon.ico" rel="icon"/>
<link type="image/x-icon" href="/i/favicon.ico" rel="shortcut icon"/>
<script type="text/javascript" src="/i/javascript/apex_ns_3_1.js"></script>
<script type="text/javascript" src="/i/javascript/apex_3_1.js"></script>
<script type="text/javascript" src="/i/javascript/apex_get_3_1.js"></script>
<script type="text/javascript" src="/i/javascript/apex_builder.js"></script>
<script type="text/javascript"></script>
<link type="text/css" href="/i/css/apex_3_1.css" rel="stylesheet"></link>
<script type="text/javascript"></script>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link type="text/css" href="/i/css/apex_builder_3_1.css" rel="stylesheet"></link>
<!-- То, что хочу подключить -->
</head>


Знаю, что дока говорит: подключайте скрипты и CSS через шаблоны страниц либо через атрибут HTML Header. Используя строки подстановки, можно всё это поддерживать в актуальном состоянии при изменениях. Знаю, что ещё можно создать страницу #0, на ней создать HTML-регион, в него вписать нужное.

Но хочется простого инсёрта или вызова процедуры, куда передать "jquery-1.3.2.js" и путь в XML DB. :) Откуда-то же тянет Апекс всё это дело в заголовок каждой страницы...

После поисков в таблицах и пакетах наткнулся в заврапированном теле WWV_FLOW_UTILITIES на такое:

1G_PAGE_HTML_HEAD:
1<link rel="stylesheet" href=":
1css/apex_3_1.css" type="text/css" /><!--[if IE]><link rel="stylesheet" href=":
1css/apex_ie_3_1.css" type="text/css" /><![endif]--><script src=":
1javascript/apex_ns_3_1.js" type="text/javascript"></script><script src=":
1javascript/apex_3_1.js" type="text/javascript"></script><script src=":
1javascript/apex_get_3_1.js" type="text/javascript"></script>:


Хардкод налицо. :( Тем не менее, есть ма-а-аленькая надежда, что на дело влияет не он. Вечерком попробую скопировать и анврапнуть flowu.plb, поменять этот хардкод, добавив к нему jQuery UI, и установить заново. Если получится, и Апекс будет возвращать страницы с нужным мне хэдером - плохо. Править пакеты на тесте и продакшнах, понятное дело, мне никто не даст, потому такой способ подойдёт только на девелоперской или домашней базе побаловаться.

Читать далее