ICubeCacheSaver.GetGlobalWriteLock

Fore Syntax

GetGlobalWriteLock(

DestKey: Integer;

ParamValues: IMetabaseObjectParamValues;

Selections: IDimSelectionSet): ILock;

Fore.NET Syntax

GetGlobalWriteLock(

DestKey: UInteger;

ParamValues: Prognoz.Platform.Interop.Metabase.IMetabaseObjectParamValues;

Selections: Prognoz.Platform.Interop.Dimensions.IDimSelectionSet): Prognoz.Platform.Interop.ForeSystem.ILock;

Parameters

DestKey. The key of the required cube display version.

ParamValues. The set of parameter values, for which caching object is saved.

Selections. The collection of selections in the specified cube display version.

Description

The GetGlobalWriteLock method returns the object that controls write lock of cached data for the specified cube parameters.

Comments

Write lock is required to prevent a situation when several users modify same data simultaneously. Такая вероятность существует, если работа с кэшем куба происходит в коде, выполнение которого осуществляться через веб-сервисы BI-сервера Prognoz Platform 9.

Пример Fore

Для выполнения примера предполагается наличие в репозитории куба с идентификатором «STD_CUBE». Для куба включена возможность кэширования данных.

Sub UserProc;
Var
    MB: IMetabase;
    MDesc, CacheDesc: IMetabaseObjectDescriptor;
    Cache: ICubeCacheSaver;
    CubeInst: ICubeInstance;
    Dest: ICubeInstanceDestination;
    Sels: IDimSelectionSet;
    Sel: IDimSelection;
    Matr: IMatrix;
    Lock: ILock;
Begin
    MB := MetabaseClass.Active;
    MDesc := MB.ItemById("STD_CUBE");
    CacheDesc := GetCache(MDesc);
    If CacheDesc <> Null Then
        Cache := CacheDesc.Edit As ICubeCacheSaver;
        CubeInst := MDesc.Open(NullAs ICubeInstance;
        Dest := CubeInst.Destinations.DefaultDestination;
        Sels := Dest.CreateDimSelectionSet;
        For Each Sel In Sels Do
            Sel.SelectAll;
        End For;
        //Получение кэшированной матрицы с данными
        Matr := Cache.GetGlobalCache(Dest.Key, Null, Sels);
        If Matr <> Null Then
            Lock := Cache.GetGlobalWriteLock(Dest.Key, Null, Sels);
            //...
            //Дальнейшая работа с матрицей данных
            //...
            //Сохранение обновленной матрицы в кэш
            Cache.SaveCache(Dest.Key, Null, Sels, Matr);
            Lock.Unlock;
            Lock := Null;
        End If;
    End If;
End Sub UserProc;

Function GetCache(MObj: IMetabaseObjectDescriptor): IMetabaseObjectDescriptor;
Var
    Desc: IMetabaseObjectDescriptor;
Begin
    For Each Desc In MObj.Children Do
        If Desc.ClassId = MetabaseObjectClass.KE_CLASS_CUBE_CACHE_SAVER Then
            Return Desc;
        End If;
    End For;
    Return Null;
End Function GetCache;

При выполнении примера для указанных параметров куба будет получена матрица кэшированных данных. Для изменения данных осуществляется их блокировка. После обновления данных в кэше блокировка будет снята.

Пример Fore.NET

Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.

Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Matrix;
Imports Prognoz.Platform.Interop.Metabase;

Public Shared Sub Main(Params: StartParams);
Var
    MB: IMetabase;
    MDesc, CacheDesc: IMetabaseObjectDescriptor;
    Cache: ICubeCacheSaver;
    CubeInst: ICubeInstance;
    Dest: ICubeInstanceDestination;
    Sels: IDimSelectionSet;
    Sel: IDimSelection;
    Matr: IMatrix;
    Lock: ILock;
Begin
    MB := Params.Metabase;
    MDesc := MB.ItemById["STD_CUBE"];
    CacheDesc := GetCache(MDesc);
    If CacheDesc <> Null Then
        Cache := CacheDesc.Edit() As ICubeCacheSaver;
        CubeInst := MDesc.Open(NullAs ICubeInstance;
        Dest := CubeInst.Destinations.DefaultDestination;
        Sels := Dest.CreateDimSelectionSet();
        For Each Sel In Sels Do
            Sel.SelectAll();
        End For;
        //Получение кэшированной матрицы с данными
        Matr := Cache.GetGlobalCache(Dest.Key, Null, Sels);
        If Matr <> Null Then
            Lock := Cache.GetGlobalWriteLock(Dest.Key, Null, Sels);
            //...
            //Дальнейшая работа с матрицей данных
            //...
            //Сохранение обновленной матрицы в кэш
            Cache.SaveCache(Dest.Key, Null, Sels, Matr);
            Lock.Unlock();
            Lock := Null;
        End If;
    End If;
End Sub;

Public Shared Function GetCache(MObj: IMetabaseObjectDescriptor): IMetabaseObjectDescriptor;
Var
    Desc: IMetabaseObjectDescriptor;
Begin
    For Each Desc In MObj.Children Do
        If Desc.ClassId = MetabaseObjectClass.KE_CLASS_CUBE_CACHE_SAVER As integer Then
            Return Desc;
        End If;
    End For;
    Return Null;
End Function;

См. также:

ICubeCacheSaver