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. Метаданные администрирования выборки

В дисковый кеш заносятся только метаданные выборки без “наложения” метаданных администрирования. При открытии выборки метаданные берутся из дискового кеша, а настройки администрирования запрашиваются с сервера. Таким образом обеспечивается “актуальность” настроек администрирования.

В кеш приложения(в памяти) записываются уже измененные метаданные с примененными настройками администрирования.

../../../_images/MetaDataAdmin.jpg