メタデータの格納の概要

通常はメタデータを保存できないレプリカについても、Metadata Storage Service を使用すれば、そのプロバイダーの同期メタデータを格納できます。Metadata Storage Service では、メモリおよびディスクのフットプリントが小さく、プロバイダーと一緒に再配布できる、信頼性が高い軽量のデータベースを使用します。

Metadata Storage Service API では、メタデータ ストアと、メタデータ ストアにアクセスするためのインターフェイスおよびメソッドが明確に切り離されています。したがって、プロバイダーを少し変更するだけで、別のストアを実装し、使用することができます。

注意

Metadata Storage Service のインターフェイスはシングル スレッドです。呼び出しは、任意のスレッドで行うことができます。ただし、マルチスレッド アプリケーションでは、これらのインターフェイスを使用するときに適切なスレッド同期を提供する必要があります。

メタデータ ストアの作成

Metadata Storage Service は、軽量データベースを使用してメタデータをファイルに格納する API の実装を提供します。

マネージ コード : メタデータ ストアは、SqlMetadataStore オブジェクトによって表されます。このオブジェクトは、MetadataStore 抽象クラスを拡張します。レプリカ メタデータおよびトランザクションを処理するための基本クラス メソッドに加え、SqlMetadataStore は、メタデータ ストア自体を作成したり開いたりするメソッドを提供します。新しいストアを作成するには、CreateStore を呼び出します。既存のストアを開くには、OpenStore を呼び出します。

アンマネージ コード : メタデータ ストアは、ISqlSyncMetadataStore インターフェイス オブジェクトによって表されます。このオブジェクトは、ISyncMetadataStore インターフェイスを拡張します。レプリカ メタデータおよびトランザクションを処理するための基本インターフェイス メソッドに加え、ISqlSyncMetadataStore は、メタデータ ストア自体を作成したり開いたりするメソッドを提供します。ISqlSyncMetadataStore オブジェクトを作成するには、CLSID_SyncMetadataStoreIID_ISqlSyncMetadataStoreCoCreateInstance に渡します。新しいストアを作成するには、ISqlSyncMetadataStore::CreateStore を呼び出します。既存のストアを開くには、ISqlSyncMetadataStore::OpenStore を呼び出します。

Security noteセキュリティメモ :

メタデータ ファイルは、承認されていないアクセスに対してセキュリティで保護されません。メタデータ ファイルを保護するには、メタデータ ファイルを格納しているフォルダーを、随意アクセス制御リスト (DACL) などを使用して適切にセキュリティで保護する必要があります。メタデータ ファイルがリモートの場所に格納されている場合は、Metadata Storage Service とリモート フォルダー間の通信チャネルを適切にセキュリティで保護する必要があります。ユーザーがメタデータ ファイルを削除できるようにするには、メタデータ ファイルを作成するプロバイダーが、ユーザーがアクセスできる場所にファイルを配置する必要があります。メタデータ ファイルを作成するプロバイダーは、プロバイダーのアンインストール時にメタデータ ファイルを削除する必要があります。

Security noteセキュリティメモ :

Sync Framework が UNC パスなどのリモート メカニズムによってメタデータ ファイルを開いたときには、コンピューター上の他のアプリケーション (メタデータ ファイルが保存されているコンピューター上のアプリケーションを含む) によってこのメタデータ ファイルに同時にアクセスすることはできません。

レプリカ メタデータ

レプリカ メタデータは、使用する前に初期化する必要があります。レプリカ メタデータは、各メタデータ ストアに対して 1 回だけ初期化できます。カスタム フィールドまたはインデックスが必要な場合は、レプリカ メタデータの初期化の前にこれらを定義する必要があります。

マネージ コード : InitializeReplicaMetadata を呼び出して、レプリカ メタデータを初期化します。

アンマネージ コード : ISyncMetadataStore::InitializeReplicaMetadata を呼び出して、レプリカ メタデータを初期化します。

既存のストア内のレプリカ メタデータにアクセスするには、レプリカ メタデータ オブジェクトを取得する必要があります。レプリカ ID ごとに異なるレプリカ メタデータ オブジェクトが存在します。ただし、Metadata Storage Service ではメタデータ ストアが同時更新から保護されるため、各レプリカ ID に対して同時に存在するレプリカ メタデータ オブジェクトは 1 つです。レプリカ メタデータ オブジェクトを開こうとするプロセスにおいて、指定したレプリカ ID に対するレプリカ メタデータ オブジェクトのインスタンスが既に存在する場合、既存のオブジェクトへの参照が返されます。レプリカ メタデータ オブジェクトを開こうとするプロセスとは異なるプロセスにおいて、指定したレプリカ ID に対するレプリカ メタデータ オブジェクトのインスタンスが既に存在する場合、その試みは失敗します。

マネージ コード : 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 を使用してプロパティを保存します。

注意

このトランザクション サービスは、メタデータ ストアに格納されているメタデータにのみ適用されます。レプリカの項目ストアに保存される項目データは、このトランザクションに含まれません。

参照

リファレンス

ISqlSyncMetadataStore インターフェイス
CUSTOM_FIELD_DEFINITION 構造体
IReplicaMetadata インターフェイス
IItemMetadata インターフェイス
CUSTOM_FIELDS_INDEX 構造体
SqlMetadataStore
FieldSchema
ReplicaMetadata
ItemMetadata
IndexSchema

その他のリソース

Sync Framework Metadata Storage Service