IMetabaseUpdate.LoadFromStreamNF

Синтаксис

LoadFromStreamNF(Reader: IIOStream; Mode: UpdateLoadMode);

Параметры

Reader. Поток, из которого загружается обновление;

Mode. Метод загрузки объектов в обновление.

Описание

Метод LoadFromStreamNF загружает обновление из потока.

Пример

Для выполнения примера в репозитории предполагается наличие трёх различных репозиториев. В них имеются какие-либо объекты.

Добавьте ссылки на системные сборки: IO, Metabase.

Sub UserProc;
Var
    Mb1, Mb2, Mb3: IMetabase;
    Upd: WorkingWithUpdate;
    Stream: IIOStream;
Begin
    // ...
    // Подключение к трём различным репозиториям, инициализация переменных Mb1, Mb2, Mb3
    // ...
    // Создание обновления в первом репозитории
    Upd.Initialize(Mb1, UpdSourceType._New);
    Upd.AddObjectInUpdate(Mb1.ItemById("Obj1"));
    // Сохранение обновления в файл
    Upd.SaveToFile("D:\Upd1.pefx");
    Upd.Flush;
    //...
    // Создание обновления во втором репозитории и восстановление его из файла
    Upd.Initialize(Mb2, UpdSourceType.File, "D:\Upd1.pefx");
    Upd.AddObjectInUpdate(Mb2.ItemById("Obj2"));
    // Сохранение полученного обновления в поток
    Stream := Upd.AsStream;
    Upd.Flush;
    // ...
    // Создание обновления в третьем репозитории и восстановление его из потока
    Upd.Initialize(Mb3, UpdSourceType.Stream, Stream);
    Upd.AddObjectInUpdate(Mb3.ItemById("Obj3"));
    // ...
    // Какие-либо дальнейшие действия с обновлением
    //...
    Upd.Flush;
End Sub UserProc;

Enum UpdSourceType
    _New = 1,
    File = 2,
    Stream = 3
End Enum UpdSourceType;

Class WorkingWithUpdate: Object
    Shared _upd: IMetabaseUpdate;

    Public Shared Sub Initialize(Mb: IMetabase; SourceType: UpdSourceType; UpdSource: Variant = Null);
    Begin
        // Инициализация обновления в зависимости от выбранного способа его получения
        _upd := Mb.CreateUpdate;
        // Загрузка из файла или потока, если выбран такой тип инициализации
        If (SourceType <> UpdSourceType._New) And Not IsNull(UpdSource) Then
            Select Case SourceType
                Case UpdSourceType.File:
                    _upd.LoadFromFileNF(UpdSource);
                Case UpdSourceType.Stream:
                    _upd.LoadFromStreamNF(UpdSource, UpdateLoadMode.Insert);
            End Select;
        End If;
    End Sub Initialize;

    Public Shared Sub AddObjectInUpdate(RepoObject: IMetabaseObjectDescriptor);
    Var
        UFN: IMetabaseUpdateFolderNode;
        UON: IMetabaseUpdateObjectNode;
    Begin
        UFN := _Upd.RootFolder;
        UON := UFN.Add(MetabaseUpdateNodeType.Object) As IMetabaseUpdateObjectNode;
        UON.Object := RepoObject;
        UON.BoundType := MetabaseObjectUpdateBoundType.ById;
    End Sub AddObjectInUpdate;

    Public Shared Sub SaveToFile(FileName: String);
    Begin
        // Сохранение обновления в файл
        _upd.SaveToFileNF(FileName);
    End Sub SaveToFile;

    Public Shared Function AsStream: IIOStream;
    Var
        Result: IIOStream;
    Begin
        Result := New MemoryStream.Create;
        // Сохранение обновления в поток
        _upd.SaveToStreamNF(Result, Null);
        Return Result;
    End Function AsStream;

    Public Shared Sub Flush;
    Begin
        // Очистка обновления
        _upd := Null;
    End Sub Flush;
End Class WorkingWithUpdate;

Указанный пример в общем виде демонстрирует каким образом один общий класс может последовательно использоваться для работы с обновлением в трёх разных репозиториях. В первом репозитории создаётся новое обновление, во втором обновление открывается из файла, в третьем обновление загружается из потока. На каждом этапе в обновление добавляется по одному объекту из каждого из репозиториев.

См. также:

IMetabaseUpdate