Поделиться через


Приступая к работе с хранилищем метаданных

Служба хранилища метаданных обеспечивает хранение метаданных синхронизации для поставщика, представляющего реплику, которая не имеет возможности хранить метаданные иным образом. В службе хранилища метаданных используется облегченная база данных, которая занимает небольшой объем оперативной памяти и пространства на диске и может распространяться вместе с поставщиком.

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

Примечание

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

Создание хранилища метаданных

Служба хранилища метаданных предоставляет реализацию API-интерфейса, в которой используется упрощенная база данных для хранения метаданных в файле.

Управляемый код Хранилище метаданных представлено объектом SqlMetadataStore. Этот объект расширяет абстрактный класс MetadataStore. Кроме предоставления методов базового класса для обработки метаданных реплики и транзакций, в SqlMetadataStore предусмотрены методы создания или открытия самого хранилища метаданных. Чтобы создать новое хранилище, вызовите метод CreateStore. Чтобы открыть существующее хранилище, вызовите метод OpenStore.

Неуправляемый код Хранилище метаданных представлено объектом интерфейса ISqlSyncMetadataStore. Этот объект расширяет интерфейс ISyncMetadataStore. Кроме предоставления основных методов интерфейса для обработки метаданных реплики и транзакций, в ISqlSyncMetadataStore предусмотрены методы создания или открытия самого хранилища метаданных. Чтобы создать объект ISqlSyncMetadataStore, передайте CLSID_SyncMetadataStore и IID_ISqlSyncMetadataStore в CoCreateInstance. Чтобы создать новое хранилище, вызовите метод ISqlSyncMetadataStore::CreateStore. Чтобы открыть существующее хранилище, вызовите метод ISqlSyncMetadataStore::OpenStore.

Примечание по безопасностиПримечание по безопасности

Файл метаданных не защищен от несанкционированного доступа. Чтобы защитить файл метаданных, необходимо обеспечить должным образом защиту содержащей его папки, например, с помощью списка управления доступом на уровне пользователей (DACL). Если файл метаданных хранится в удаленном месте, канал коммуникации между службой хранилища метаданных и удаленной папкой должен быть защищен надлежащим образом. Чтобы пользователь мог удалить файл метаданных, поставщик должен при создании файла разместить его в месте, куда пользователь имеет доступ. Поставщик, создавший файл метаданных, должен удалить его при собственном удалении.

Примечание по безопасностиПримечание по безопасности

Если Sync Framework открывает файл метаданных с помощью удаленного механизма, такого как путь в формате UNC, невозможен одновременный доступ к нему из другого приложения ни на одном компьютере, включая приложение на компьютере, где хранится файл метаданных.

Метаданные реплики

Метаданные реплики должны быть инициализированы, прежде чем появится возможность их использовать. Метаданные реплики могут быть инициализированы только по одному разу для каждого хранилища метаданных. Если требуются пользовательские поля или индексы, они должны быть определены во время инициализации метаданных реплики.

Управляемый код Инициализирует метаданные реплики путем вызова InitializeReplicaMetadata.

Неуправляемый код Инициализирует метаданные реплики путем вызова ISyncMetadataStore::InitializeReplicaMetadata.

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

Управляемый код Возвращает объект метаданных реплики путем вызова GetReplicaMetadata.

Неуправляемый код Возвращает объект метаданных реплики путем вызова ISyncMetadataStore::GetReplicaMetadata.

Объект метаданных реплики предоставляет методы, обеспечивающие получение доступа к метаданным реплики и к элементам, содержащимся в реплике. Дополнительные сведения см. в разделе Доступ к метаданным реплики.

Пользовательские поля элемента

В метаданных для элемента может быть определен набор настраиваемых полей. Каждое поле состоит из уникального строкового имени и значения. Эти поля можно использовать для хранения любых дополнительных метаданных об элементе, которые не поддерживаются в стандартном наборе метаданных для элемента. Доступ к этим полям может быть получен с помощью различных методов объекта ItemMetadata (для управляемого кода) или объекта IItemMetadata (для неуправляемого кода). Эти поля и их формат, включая размер и тип данных, определяются при инициализации метаданных реплики.

Управляемый код Задает пользовательские поля путем передачи объекта FieldSchema в InitializeReplicaMetadata.

Неуправляемый код Задает пользовательские поля путем передачи массива объектов CUSTOM_FIELD_DEFINITION в ISyncMetadataStore::InitializeReplicaMetadata.

Схемы индексов

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

Управляемый код Задает индексные схемы, передавая объект IndexSchema в InitializeReplicaMetadata.

Неуправляемый код Задает индексные схемы, передавая массив объектов CUSTOM_FIELDS_INDEX в ISyncMetadataStore::InitializeReplicaMetadata.

Транзакции

Транзакции подразделяются на две разновидности: неявные и явные. Неявные транзакции поддерживаются только для чтения данных из хранилища метаданных. Попытка записать в хранилище метаданных без первого запуска явной транзакции будет активизировать ExplicitTransactionRequiredException (для управляемого кода) или возвращать SYNC_E_METADATA_ACTIVE_TRANSACTION_REQUIRED (для неуправляемого кода).

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

  1. Запустите явную транзакцию путем вызова BeginTransaction. Зафиксируйте изменения, внесенные во время транзакции, путем вызова CommitTransaction. Отвергните изменения, которые были внесены во время транзакции, путем вызова RollbackTransaction.

  2. Задайте свойства объекта ReplicaMetadata или ItemMetadata.

  3. Сохраните свойства с помощью SaveReplicaMetadata или SaveItemMetadata.

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

  1. Запустите явную транзакцию путем вызова ISyncMetadataStore::BeginTransaction. Зафиксируйте изменения, внесенные во время транзакции, путем вызова ISyncMetadataStore::CommitTransaction. Отвергните изменения, которые были внесены во время транзакции, путем вызова ISyncMetadataStore::RollbackTransaction.

  2. Задайте свойства объекта IReplicaMetadata или IItemMetadata.

  3. Сохраните свойства с помощью IReplicaMetadata::SaveReplicaMetadata или IReplicaMetadata::SaveItemMetadata.

Примечание

Эта служба транзакций применяется только к метаданным, которые хранятся в хранилище метаданных. Любые данные элемента, хранящиеся в хранилище элементов в реплике, не включаются в эту транзакцию.

См. также

Справочник

SqlMetadataStore

FieldSchema

ReplicaMetadata

ItemMetadata

IndexSchema

Другие ресурсы

Служба хранилища метаданных платформы Sync Framework

Интерфейс ISqlSyncMetadataStore

Структура CUSTOM_FIELD_DEFINITION

Интерфейс IReplicaMetadata

Интерфейс IItemMetadata

Структура CUSTOM_FIELDS_INDEX