1.1. Метаданные¶
Метаданными являются данные, содержащие описание и свойства выборок, классов фильтров, выборок операций и их текст, атрибутов классов и фильтров. Метаданные хранятся на сервере и загружаются на клиент по требованию при открытие выборки. Метаданные могут загружаться для каждой сущности отдельным запросом или одним архивом.
1.1.1. Управление режимом загрузки метаданных¶
Режим загрузки метаданных может быть отдельными запросами или архивом. Значение по умолчанию для всех пользователей базы задается в константах
Главное меню Настройки -> Константы. Константа bArchiveMetaLoadMode.
Пользователь может перекрыть для себя это значение: Конфигуратор ->
меню Файл-> Загрузка метаданных архивом. Значение будет
сохранено в ветке
реестра USER_DATA/%username%/APPLIATION_DATA/LOAD_META_FROM_ARCHIVE
.
1.1.2. Загрузка метаданных отдельным запросом¶
Для проверки какие метаданные поступают на клиент можно воспользоваться скриптом. ClassName нужно присвоить наименование класса для которого грузятся метаданные и раскоментировать строчку с нужным типом метаданных для этого класса.
declare
ClassName Varchar2(255);
begin
SYS.DBMS_SESSION.SET_CONTEXT('BTKApplicationContext','Language','1049');
/*Флаг указывает источник метаданных: 1-стандартная(плоская) структура; 0-расширенная структура*/
SYS.DBMS_SESSION.SET_CONTEXT('BTKApplicationContext','FlatTable', 1);
ClassName := 'SEL_GlobalSelectionCard';
/*Загрузка свойств выборки*/
-- :Result := btk.BTK_ClientGate.BTK_SelClassProperties(ClassName);
/*Загрузка операций выборки*/
-- :Result := BTK_ClientGate.BTK_SelOperProperties(ClassName);
/*Загрузка операций выборки*/
-- :Result := btk.BTK_ClientGate.BTK_SelOperPropertiesCLOB(ClassName);
/*Загрузка сохраненных настроек выборки*/
-- :Result := btk.BTK_ClientGate.BTK_SelPresetObj(ClassName);
/*Загрузка атрибутов выборки*/
-- :Result := btk.BTK_ClientGate.BTK_SelAttrProperties(ClassName);
/*Загрузка фильтров выборки*/
-- :Result := btk.BTK_ClientGate.BTK_SelFilterUnits(ClassName);
/*Загрузка параметров активного фильтра выборки*/
-- :Result := btk.BTK_ClientGate.BTK_SelFltParamProperties(ClassName);
end;
При загрузке метаданных отдельными запросами происходит загрузка сразу всех отображений. Механизм наследования и перекрытия текста операции выполняется непосредственно на клиенте.
1.1.3. Загрузка метаданных архивом¶
При загрузке метаданных на клиент приходит архив, файл с запакованными XML файлами. Каждый XML файл содержит метаданные для отдельной сущности:
idpLang это язык в системе, можно указывать 1047-Русский, из btk_language.
При загрузке архивом возвращаются метаданные для запрошенного отображения, в отличие от режима загрузки отдельными запросами. При этом механизм наследования для pascal операций работает исключительно на сервере. В поле SRep возвращается то, откуда был унаследован текст операции. Для SQL операций алгоритм немного более сложный, на клиенте выполняется автоматическая проверка решеточных операций (системные, автогенеренные операции с # перед именем операции):
if Operation [Current Representation].Text <> '' then
return Operation [Current Representation]
else
if #Operation [Current Representation].Text <> '' then
return #Operation [Current Representation]
else
if Operation [Default Representation].Text <> '' then
return Operation [Default Representation]
else
return #Operation [Default Representation];
Вызов решеточных паскаль операций выполняется только явно из скрипта. Автоматически текст не подтягивается для них, как в случае SQL операций.
1.1.3.1. API Загрузки¶
Запрос возвращающий архив:
begin
-- nploadmode = 0; Загрузка только метаданных выборки
-- nploadmode = 1; Загрузка метаданных выборки и настроек администрирования
-- nploadmode = 2; Загрузка только настроек администрирования
:result := btk_clientgate.btk_getrepresentationmeta(spclass => 'SEL_PROPERTYVALUES',
sprepresentation => 'SELATTR',
spmode => 'win',
nploadmode => 1);
end;
Запрос возвращает курсор в одну строку из четырёх полей:
- BlobMeta - zip-архив c XML описанием структуры выборки.
- nMetaVersion - актуальная версия метаданных.
- BlobAdm - zip-архив c XML описанием настроек безопасности для данного пользователя.
- nAdmRevision - актуальная версия настроек безопасности. Аналогично версии метаданных. Если к данной выборке не применяются настройки администрирования, то версия равна 1.
Также можно получить только настройки администрирования в виде архива запросом:
Deprecated since version 4.30.
begin
:result := btk_classmetadataapi.GetSelectionAdmArchive('SEL_PROPERTYVALUES');
end;
1.1.3.2. Версия метаданных¶
С каждым изменением настроек меняется и версия метаданных, версия уникальна для каждого изменения. Используется для поддержания кешированных на стороне клиента настроек в актуальном состоянии. Версия возвращается при запросе метаданных-версия возвращённых метаданных, либо же её можно получить отдельным запросом, чтобы принять решение о необходимости загрузки оных; сравнить версию кеша и метаданных на сервере.
begin
:admVer := btk_clientGate.GetSelectionAdmRevision(
spSelection => 'SEL_PROPERTYVALUES');
:MetaVer := btk_ClientGate.GetRepresentVersionMeta(
spSelName => 'SEL_PROPERTYVALUES',
spRepName => 'SELATTR');
end;
1.1.3.3. Метаданные самой выборки¶
- ClassProps.xml - свойства класса
- AttrProps.xml - атрибуты и их свойства
- OperProps.xml - свойства операций
- OperTexts.xml - операции и текст операций
- Filters.xml - фильтры и их описание
- FilterParams.xml - параметры фильтров
Метаданные администрирования выборки
- InactOper.xml - неактивные операции
- InvisAttr.xml - список невидимых атрибутов
- RoAttr.xml - список ReadOnly атрибутов
- AccessDenied.xml - свидетельствует о том, что у пользователя нет прав на открытие выборки.
Получить XML файл для каждого типа метаданных можно следующими запросами:
- InactOper.xml - неактивные операции
select xmlelement("ROWDATA"
,xmlagg(XMLELEMENT("ROW"
,XMLATTRIBUTES(v.oName)))).extract('//ROWDATA').getclobval()
from ((select dsa.idOperation_MC as oName
from ac_roledisseloper dsa
, ac_roleselection rs
, ac_userroletree_mv aur
where rs.id = dsa.idRoleSelection
and aur.idRole = rs.idRole
and upper(aur.NM) = upper(svUser)
and upper(rs.idSelection_MC) = upper(spClass)
union
select uso.idOperation_MC
from ac_userseloper uso, Ac_userSelection us
where us.idUser = idvUser
and uso.idUserSelection = us.id
and uso.bActive = 0
and upper(us.idSelection_MC) = upper(spClass)
)
minus
select uso.idOperation_MC
from ac_userseloper uso, Ac_userSelection us
where us.idUser = idvUser
and uso.idUserSelection = us.id
and uso.bActive = 1
and upper(us.idSelection_MC) = upper(spClass)) v
- InvisAttr.xml - список невидимых атрибутов
select xmlelement("ROWDATA"
,xmlagg(XMLELEMENT("ROW"
,XMLATTRIBUTES(v.aName)))).extract('//ROWDATA').getclobval()
into ClobRowData
from ((select upper(dsa.idAttribute_MC) as aName
from ac_userroletree_mv ar
, ac_roleselection rs
, ac_roledisselattr dsa
where ar.idRole = rs.idRole
and upper(ar.NM) = upper(svUser)
and upper(rs.idSelection_MC) = upper(spClass)
and dsa.idRoleSelection = rs.id
and dsa.bCanSelect = 0
union
select upper(usa.idAttribute_MC)
from Ac_Userselection us,
Ac_Userselattr usa
where us.idSelection_MC = upper(spClass)
and us.idUser = idvUser
and usa.idUserSelection = us.id
and usa.bCanSelect = 0
) minus
select upper(usa.idAttribute_MC)
from Ac_Userselection us,
Ac_Userselattr usa
where us.idSelection_MC = upper(spClass)
and us.idUser = idvUser
and usa.idUserSelection = us.id
and usa.bCanSelect = 1) v
- RoAttr.xml - список ReadOnly атрибутов
select xmlelement("ROWDATA"
,xmlagg(XMLELEMENT("ROW"
,XMLATTRIBUTES(v.aName)))).extract('//ROWDATA').getclobval()
into ClobRowData
from(( select upper(dsa.idAttribute_MC) as aName
from ac_userroletree_mv ar
, ac_roleselection rs
, ac_roledisselattr dsa
where ar.idRole = rs.idRole
and upper(ar.NM) = upper(svUser)
and upper(rs.idSelection_MC) = upper(spClass)
and dsa.idRoleSelection = rs.id
and dsa.bCanEdit = 0
union
select upper(usa.idAttribute_MC)
from Ac_Userselection us,
Ac_Userselattr usa
where us.idSelection_MC = upper(spClass)
and us.idUser = idvUser
and usa.idUserSelection = us.id
and usa.bCanEdit = 0
) minus
select upper(usa.idAttribute_MC)
from Ac_Userselection us,
Ac_Userselattr usa
where us.idSelection_MC = upper(spClass)
and us.idUser = idvUser
and usa.idUserSelection = us.id
and usa.bCanEdit = 1) v
1.1.3.4. Метаданные администрирования выборки¶
В дисковый кеш заносятся только метаданные выборки без “наложения” метаданных администрирования. При открытии выборки метаданные берутся из дискового кеша, а настройки администрирования запрашиваются с сервера. Таким образом обеспечивается “актуальность” настроек администрирования.
В кеш приложения(в памяти) записываются уже измененные метаданные с примененными настройками администрирования.