Guia de introdução ao repositório de metadados
O serviço de armazenamento de metadados ajuda a armazenar metadados de sincronização para um provedor que representa uma réplica que não pode armazenar metadados. O serviço de armazenamento de metadados usa um banco de dados leve que tem uma memória e um volume de disco pequenos, pode ser redistribuído com o provedor e é confiável.
A API do serviço de armazenamento de metadados separa claramente o repositório de metadados das interfaces e dos métodos usados para acessar o repositório de metadados, de forma que os repositórios alternativos possam ser implementados e usados com o mínimo de alteração no provedor.
Dica
As interfaces do serviço de armazenamento de metadados são de thread único. É possível fazer chamadas em qualquer thread. Porém, um aplicativo multithreaded deverá fornecer sincronização de thread apropriada quando estiver usando essas interfaces.
Criando o repositório de metadados
O serviço de armazenamento de metadados fornece uma implementação da API que usa um banco de dados leve para armazenar os metadados em um arquivo.
Código gerenciado Um repositório de metadados é representado por um objeto SqlMetadataStore. Este objeto estende a classe abstrata MetadataStore. Além de fornecer os métodos de classe base para tratar metadados de réplica e transações, SqlMetadataStore fornece métodos para criar ou abrir o próprio repositório de metadados. Para criar um novo repositório, chame CreateStore. Para abrir um repositório existente, chame OpenStore.
Código não gerenciado Um repositório de metadados é representado por um objeto de interface ISqlSyncMetadataStore. Esse objeto estende a interface ISyncMetadataStore. Além de fornecer os métodos de interface base para tratar metadados de réplica e transações, ISqlSyncMetadataStore fornece métodos para criar ou abrir o próprio repositório de metadados. Para criar um objeto ISqlSyncMetadataStore, passe CLSID_SyncMetadataStore e IID_ISqlSyncMetadataStore para CoCreateInstance. Para criar um novo repositório, chame ISqlSyncMetadataStore::CreateStore. Para abrir um repositório existente, chame ISqlSyncMetadataStore::OpenStore.
Segurança Observação: |
---|
O arquivo de metadados não é protegido contra acesso não autorizado. Para proteger o arquivo de metadados, a pasta que o contém deve ser protegida de maneira apropriada, por exemplo, usando uma DACL (lista de controle de acesso discricionário). Quando o arquivo de metadados é armazenado em um local remoto, o canal de comunicação entre o serviço de armazenamento de metadados e a pasta remota deve ser protegido adequadamente. Para permitir que o usuário exclua o arquivo de metadados, o provedor que o cria deve colocá-lo em algum lugar que o usuário possa acessar. O provedor que cria o arquivo de metadados deve excluí-lo ao ser desinstalado. |
Segurança Observação: |
---|
Quando o Sync Framework abre o arquivo de metadados por um mecanismo remoto, como um caminho UNC, o arquivo de metadados não pode ser acessado simultaneamente por nenhum outro aplicativo em nenhum computador, incluindo um aplicativo na máquina na qual o arquivo de metadados está armazenado. |
Metadados de réplica
Os metadados de réplica devem ser inicializados para que seja possível usá-los. Os metadados de réplica podem ser inicializados somente uma vez para cada repositório de metadados. Se forem necessários campos personalizados ou índices, eles deverão ser definidos quando os metadados de réplica são inicializados.
Código gerenciado Inicialize os metadados de réplica chamando InitializeReplicaMetadata.
Código não gerenciado Inicialize os metadados de réplica chamando ISyncMetadataStore::InitializeReplicaMetadata.
Para acessar os metadados de réplica em um repositório existente, um objeto de metadados de réplica deve ser obtido. Há um objeto de metadados de réplica diferente para cada ID de réplica. Lembre-se, no entanto, de que o serviço de armazenamento de metadados protege contra atualizações simultâneas no repositório de metadados, permitindo que apenas um objeto de metadados de réplica exista por vez para cada ID de réplica. Se já existir uma instância do objeto de metadados de réplica, para uma ID de réplica especificada, no processo que esteja tentando abri-lo, será retornada uma referência ao objeto existente. Se já existir uma instância dos metadados de réplica, para uma ID de réplica especificada, em um processo diferente que esteja tentando abri-lo, a tentativa resultará em falha.
Código gerenciado Obtenha um objeto de metadados de réplica chamando GetReplicaMetadata.
Código não gerenciado Obtenha um objeto de metadados de réplica chamando ISyncMetadataStore::GetReplicaMetadata.
O objeto de metadados de réplica fornece métodos para acessar os metadados para uma réplica e para os itens nela contidos. Para obter mais informações, consulte Acessando metadados de réplica.
Campos de item personalizados
Um conjunto de campos personalizados pode ser definido para metadados do item. Cada campo consiste em um nome da cadeia de caracteres exclusivo e um valor. Esses campos podem ser usados para armazenar quaisquer metadados adicionais sobre um item que não é aceito de outra forma pelo conjunto padrão de metadados do item. Os campos podem ser acessados por vários métodos em ItemMetadata (para código gerenciado) ou IItemMetadata (para código não gerenciado). Esses campos e seus formatos, incluindo o tamanho e o tipo de dados, são definidos quando a réplica de metadados é inicializada.
Código gerenciado Especifique campos personalizados passando um objeto FieldSchema para InitializeReplicaMetadata.
Código não gerenciado Especifique campos personalizados passando uma matriz de objetos CUSTOM_FIELD_DEFINITION para ISyncMetadataStore::InitializeReplicaMetadata.
Esquemas de índice
Um conjunto de esquemas de índice pode ser definido de forma que conjuntos de campos personalizados possam ser usados como índices para a localização eficiente de itens no repositório de metadados. Um esquema de índice pode ser definido como exclusivo para assegurar que o índice define um item único. Cada campo contido em um esquema de índice também deve existir no esquema de campo definido para a réplica.
Código gerenciado Especifique esquemas de índice passando um objeto IndexSchema para InitializeReplicaMetadata.
Código não gerenciado Especifique esquemas de índice passando uma matriz de objetos CUSTOM_FIELDS_INDEX para ISyncMetadataStore::InitializeReplicaMetadata.
Transações
As transações existem implícita ou explicitamente. O suporte para transações implícitas é somente para ler dados do repositório de metadados. Uma tentativa de gravar no repositório de metadados sem primeiro iniciar uma transação explícita lançará ExplicitTransactionRequiredException (para código gerenciado) ou retornará SYNC_E_METADATA_ACTIVE_TRANSACTION_REQUIRED (para código não gerenciado).
Para definir metadados usando código gerenciado
Inicie uma transação explícita chamando BeginTransaction. Para confirmar as alterações feitas durante a transação, chame CommitTransaction. Para descartar as alterações feitas durante a transação, chame RollbackTransaction.
Defina as propriedades em um objeto ReplicaMetadata ou ItemMetadata.
Salve as propriedades usando SaveReplicaMetadata ou SaveItemMetadata.
Para definir metadados usando código não gerenciado
Inicie uma transação explícita chamando ISyncMetadataStore::BeginTransaction. Para confirmar as alterações feitas durante a transação, chame ISyncMetadataStore::CommitTransaction. Para descartar as alterações feitas durante a transação, chame ISyncMetadataStore::RollbackTransaction.
Defina as propriedades em um objeto IReplicaMetadata ou IItemMetadata.
Salve as propriedades usando IReplicaMetadata::SaveReplicaMetadata ou IReplicaMetadata::SaveItemMetadata.
Dica
Esse serviço de transação só se aplica aos metadados armazenados no repositório de metadados. Os dados de item salvos no repositório de itens na réplica não são incluídos nessa transação.
Consulte também
Referência
Interface ISqlSyncMetadataStore
Estrutura CUSTOM_FIELD_DEFINITION
Interface IReplicaMetadata
Interface IItemMetadata
Estrutura CUSTOM_FIELDS_INDEX
SqlMetadataStore
FieldSchema
ReplicaMetadata
ItemMetadata
IndexSchema