Возможность выбора и работа со свойствами компонента

Для работы с неявно выбранными компонентами требуется доступ к документам компонентов резервного копирования и документам метаданных модуля записи.

Для этого имеются две причины:

  • Данные компонента, хранящиеся в документе компонентов резервного копирования (представленном интерфейсом IVssComponent ), не имеют доступа к сведениям о наборе файлов компонентов— спецификации файла, пути и флагу рекурсии. (См. статью Работа с компонентами резервного копирования.)
  • Сведения только о компонентах, которые явно включены в документ компонентов резервного копирования во время резервного копирования, хранятся непосредственно в документе Компоненты резервного копирования. Инициаторы запроса и записи должны использовать сведения, доступные через интерфейс IVssComponent , в сочетании со сведениями о логических путях и документами метаданных модуля записи, чтобы получить сведения о неявно включенных компонентах и задать их свойства.

Случай MyWriter, рассматриваемый в разделе Логический путь компонентов , можно использовать для демонстрации возможности выбора для резервного копирования.

Имя компонента Логический путь Можно выбрать для резервного копирования Можно выбрать для восстановления Явно включены
"Исполняемые файлы" "" N Нет Да
"ConfigFiles" "Исполняемые файлы" N Нет Да
LicenseInfo "" Да N Да
Security "" Да N Да
UserInfo Security Нет N Нет
"Сертификаты" Security Нет Нет Нет
"writerData" "" Да Да Да
"Set1" "writerData" N Да N
"Ян" "writerData\Set1" Нет Нет Нет
"Дек" "writerData\Set1" Нет Нет Нет
"Set2" "writerData" N Да N
"Ян" "writerData\Set2" N N N
"Дек" "writerData\Set2" N N N
"Запрос" "writerData\QueryLogs" Нет N Нет
"Использование" "writerData" Да Да N
"Ян" "writerData\Usage" N N N
"Дек" "writerData\Usage" N N N

 

Неявно включенные компоненты в резервный набор данных

При проверке документа метаданных модуля записи (см. раздел IVssBackupComponents::GetWriterMetadata) во время резервного копирования инициатор запроса должен хранить список всех компонентов, их логические пути и сведения о наборе файлов.

Сведения о наборе файлов и исключенных файлах потребуются для определения списка файлов для любого (явно или неявно) включенного компонента.

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

Для явно включенных компонентов резервного копирования, которые определяют набор компонентов, необходимо использовать наборы файлов и исключить сведения о файлах как для определяющего компонента, так и для всех подкомпонентов , которые необходимо использовать для выбора файлов для резервного копирования.

Это означает, что резервные наборы данных для компонентов "Исполняемые файлы", "ConfigFiles" и "LicenseInfo" можно найти только путем проверки метаданных модуля записи только для этих компонентов с помощью их экземпляров интерфейса IVssWMComponent .

Тем не менее, если параметр writerData явно включен в резервную копию, необходимо проверить его экземпляр интерфейса IVssWMComponent и его для set1. "Jan" (с логическим путем "writerData\Set1"), "Dec" (с логическим путем "writerData\Set1"), "Set2", "Jan" (с логическим путем "writerData\Set2"), "Dec" (с логическим путем "writerData\Set2"), "Query", "Usage", "Jan" (с логическим путем "writerData\Usage") и "Dec" (с логическим путем "writerData\Usage").

Для этого инициатору запроса необходимо сначала определить, что компонент writerData (логический путь )можно выбрать. Затем ему придется сканировать все остальные компоненты, управляемые модулем записи, чтобы определить, является ли первый элемент в их логическом пути "writerData". Компоненты, которые имеют "writerData" в качестве ведущих элементов логического пути, определяются как подкомпоненты "writerData" и неявно выбираются при явном выборе.

На самом деле необходимо выполнить аналогичную проверку, чтобы определить, что ни один компонент не имеет "LicenseInfo" в качестве ведущего элемента логического пути и, следовательно, что у "LicenseInfo" нет подкомпонентов.

Из-за сложности этого механизма в VSS многие инициаторы запроса могут оказаться полезными создать собственные структуры для хранения сведений о компонентах и резервных наборах как для явно, так и для неявно добавленных компонентов.

Свойства неявно включенных компонентов

Во время операций восстановления и резервного копирования экземпляры интерфейсов IVssComponent и IVssBackupComponents используются как для получения сведений о компонентах, так и для задания или изменения свойств компонента. Однако только компоненты, явно включенные, будут иметь экземпляры интерфейса IVssComponent или будут доступны для интерфейса IVssBackupComponents .

Некоторые свойства в область используются на уровне набора компонентов. К этим свойствам относятся следующие:

  • Состояние резервного копирования и восстановления.

IVssBackupComponents::SetBackupSucceededed
IVssComponent::GetBackupSucceeded
IVssBackupComponents::SetFileRestoreStatus
IVssComponent::GetFileRestoreStatus

  • Параметры резервного копирования и восстановления:

IVssBackupComponents::SetBackupOptions
IVssComponent::GetBackupOptions
IVssBackupComponents::SetRestoreOptions
IVssComponent::GetRestoreOptions

  • Сообщения о сбоях:

IVssComponent::SetPostRestoreFailureMsg
IVssComponent::SetPreRestoreFailureMsg
IVssComponent::SetPostRestoreFailureMsg
IVssComponent::SetPreRestoreFailureMsg

  • Целевые объекты восстановления:

IVssComponent::SetRestoreTarget
IVssComponent::GetRestoreTarget

  • Метки резервного копирования:

IVssComponent::SetBackupStamp
IVssComponent::GetBackupStamp

  • Дополнительные метаданные:

IVssComponent::SetRestoreMetadata
IVssComponent::GetRestoreMetadata
IVssComponent::SetBackupMetadata
IVssComponent::GetBackupMetadata

Таким образом, вы используете экземпляр интерфейса IVssComponent определяющего элемента набора компонентов или используете имя, тип и логический путь определяющего элемента с методом IVssBackupComponents , чтобы задать или извлечь свойства для всех элементов набора компонентов.

По этой причине наборы компонентов обрабатываются как единицы. Например, резервное копирование набора компонентов выполняется успешно, только если резервное копирование всех наборов файлов всех его компонентов выполнено успешно.

В предыдущем примере предположим, что один файл в компоненте Jan (с логическим путем writerData\Set2) является членом набора компонентов, определенного свойством writerData. Если не удалось выполнить резервное копирование одного из файлов "Jan", инициатор запроса будет использовать сведения "writerData" (его имя "writerData", путь "" и тип компонента) в качестве аргументов при задании IVssBackupComponents::SetBackupSucceeded с значением false , чтобы указать на сбой набора компонентов.

Аналогичным образом, состояние, возвращаемое IVssComponent::GetBackupSucceeded для экземпляра "writerData" интерфейса IVssComponent , применяется не только к "writerData", но и ко всем его подкомпонентам.

Кроме того, если модуль записи решил изменить целевой объект восстановления с помощью IVssComponent::SetRestoreTarget экземпляра "writerData" IVssComponent, это приведет к изменению целевого объекта восстановления для всех наборов файлов всех подкомпонентов writerData.

Следующие свойства применяются не к компонентам, а к определенным файлам или наборам файлов:

  • Сопоставления альтернативных расположений:

IVssBackupComponents::AddAlternativeLocationMapping
IVssComponent::GetAlternateLocationMapping
IVssComponent::GetAlternateLocationMappingCount

  • Разностные файлы:

IVssComponent::AddDifferencedFilesByLastModifyTime
IVssComponent::GetDifferencedFile
IVssComponent::GetDifferencedFilesCount

  • Частичные файлы:

IVssComponent::AddPartialFile
IVssComponent::GetPartialFile
IVssComponent::GetPartialFileCount

  • Целевые объекты:

IVssComponent::AddDirectedTarget
IVssComponent::GetDirectedTarget
IVssComponent::GetDirectedTargetCount

  • Новые целевые объекты:

IVssBackupComponents::AddNewTarget
IVssComponent::GetNewTarget
IVssComponent::GetNewTargetCount

Когда запрашивающий объект получает доступ к этим функциям для подкомпонента с помощью интерфейса IVssBackupComponents , он использует сведения о компоненте для определяющего компонента набора компонентов, но сведения о файле или наборе файлов для подкомпонента.

Аналогичным образом, если свойство доступно через интерфейс IVssComponent , используется экземпляр, соответствующий определяющему подкомпоненту, но аргументы файла или набора файлов берутся из подкомпонента.

Например, предположим, что в подкомпоненте "Jan" (с логическим путем "writerData\Set2") был задан файл с путем "c:\fred", спецификацией файла "*.dat", а рекурсивный флаг true может потребоваться восстановить в альтернативном расположении.

В этом случае инициатор запроса вызовет IVssBackupComponents::AddAlternativeLocationMapping, используя сведения "writerData" (тип компонента, имя компонента "writeData" и логический путь " ") вместе с информацией о наборе файлов "Jan" (путь "c:\fred", спецификация файла "*.dat" и рекурсия равна true).

Обратите внимание, что в этом случае сведения о наборе файлов должны точно соответствовать сведениям набора файлов, используемым IVssCreateWriterMetadata::AddFilesToFileGroup, IVssCreateWriterMetadata::AddDatabaseFiles или IVssCreateWriterMetadata::AddDatabaseLogFiles для добавления файлов в январь.

Аналогичным образом, если модуль записи хочет добавить направленный целевой объект в файл с путем "c:\ethel" и именем lucy.dat, управляемым "Jan" (с логическим путем "writerData\Set2"), он будет использовать экземпляр IVssComponent , соответствующий "writerData", но сведения о файле "Jan".

Неявно включенные компоненты в набор восстановления

Компоненты, которые были неявно включены в резервную копию, можно явно включить в восстановление, если их можно выбрать для восстановления. Как указано в разделе Работа с возможностью выбора для восстановления и вложенных компонентов, такие компоненты добавляются в документ компонентов резервного копирования с помощью метода IVssBackupComponents::AddRestoreSubcomponent .

Однако при этом не создается новый экземпляр интерфейса IVssComponent и компонент не доступен напрямую через интерфейс IVssBackupComponents .

Вместо этого к компоненту, явно включенного для восстановления, но неявно включенного для резервного копирования, следует обращаться через экземпляр интерфейса IVssComponent , соответствующий компоненту, который определил набор компонентов, членом которого он был при резервном копировании.

Например, чтобы явно включить для восстановления "Set1", подкомпонент выбранного компонента резервного копирования "writerData", необходимо получить сведения о нем, вызвав метод IVssComponent::GetRestoreSubcomponent экземпляра "writerData" интерфейса IVssComponent .